Merge "Removed DPM.factoryReset() method used by ManagedProvisioning app."
diff --git a/apex/Android.bp b/apex/Android.bp
index 4e80acb..77ff6db 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -12,6 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+package {
+    default_visibility: [":__subpackages__"],
+}
+
 mainline_stubs_args =
     "--error UnhiddenSystemApi " +
     "--hide BroadcastBehavior " +
@@ -136,6 +140,13 @@
         enabled: true,
         sdk_version: "module_current",
     },
+    defaults_visibility: [
+        ":__subpackages__",
+        "//frameworks/base/libs/hwui",
+        "//frameworks/base/wifi",
+        "//packages/modules:__subpackages__",
+        "//packages/providers/MediaProvider:__subpackages__",
+    ],
 }
 
 // Defaults for mainline module system server provided java_sdk_library instances.
@@ -147,6 +158,10 @@
         enabled: true,
         sdk_version: "module_current",
     },
+    defaults_visibility: [
+        ":__subpackages__",
+        "//packages/modules:__subpackages__",
+    ],
 }
 
 stubs_defaults {
diff --git a/apex/appsearch/framework/Android.bp b/apex/appsearch/framework/Android.bp
index 12afde4..b3eb911 100644
--- a/apex/appsearch/framework/Android.bp
+++ b/apex/appsearch/framework/Android.bp
@@ -19,6 +19,7 @@
         "java/**/*.aidl",
     ],
     path: "java",
+    visibility: ["//frameworks/base"],
 }
 
 java_sdk_library {
diff --git a/apex/appsearch/service/Android.bp b/apex/appsearch/service/Android.bp
index fc1d707..2fd5c73 100644
--- a/apex/appsearch/service/Android.bp
+++ b/apex/appsearch/service/Android.bp
@@ -28,5 +28,11 @@
         "libicing",
     ],
     jarjar_rules: "jarjar-rules.txt",
+    visibility: [
+        "//frameworks/base/apex/appsearch:__subpackages__",
+        // These are required until appsearch is properly unbundled.
+        "//frameworks/base/services/tests/mockingservicestests",
+        "//frameworks/base/services/tests/servicestests",
+    ],
     apex_available: ["com.android.appsearch"],
 }
diff --git a/apex/appsearch/testing/Android.bp b/apex/appsearch/testing/Android.bp
new file mode 100644
index 0000000..54d5039
--- /dev/null
+++ b/apex/appsearch/testing/Android.bp
@@ -0,0 +1,25 @@
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+java_library {
+    name: "AppSearchTestUtils",
+    srcs: ["java/**/*.java"],
+    libs: [
+        "androidx.test.ext.junit",
+        "framework",
+        "framework-appsearch",
+        "guava",
+        "truth-prebuilt",
+    ],
+    visibility: ["//cts/tests/appsearch"],
+}
diff --git a/apex/appsearch/testing/java/com/android/server/appsearch/testing/AppSearchSessionShim.java b/apex/appsearch/testing/java/com/android/server/appsearch/testing/AppSearchSessionShim.java
new file mode 100644
index 0000000..b1e760a
--- /dev/null
+++ b/apex/appsearch/testing/java/com/android/server/appsearch/testing/AppSearchSessionShim.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.appsearch.testing;
+
+import android.annotation.NonNull;
+import android.app.appsearch.AppSearchBatchResult;
+import android.app.appsearch.AppSearchManager;
+import android.app.appsearch.AppSearchResult;
+import android.app.appsearch.AppSearchSession;
+import android.app.appsearch.BatchResultCallback;
+import android.app.appsearch.GenericDocument;
+import android.app.appsearch.GetByUriRequest;
+import android.app.appsearch.PutDocumentsRequest;
+import android.app.appsearch.RemoveByUriRequest;
+import android.app.appsearch.SearchResults;
+import android.app.appsearch.SearchSpec;
+import android.app.appsearch.SetSchemaRequest;
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * This test class adapts the AppSearch Framework API to ListenableFuture, so it can be tested via
+ * a consistent interface.
+ * @hide
+ */
+public class AppSearchSessionShim {
+    private final AppSearchSession mAppSearchSession;
+    private final ExecutorService mExecutor;
+
+    @NonNull
+    public static ListenableFuture<AppSearchResult<AppSearchSessionShim>> createSearchSession(
+            @NonNull AppSearchManager.SearchContext searchContext) {
+        Context context = ApplicationProvider.getApplicationContext();
+        AppSearchManager appSearchManager = context.getSystemService(AppSearchManager.class);
+        SettableFuture<AppSearchResult<AppSearchSession>> future = SettableFuture.create();
+        ExecutorService executor = Executors.newCachedThreadPool();
+        appSearchManager.createSearchSession(searchContext, executor, future::set);
+        return Futures.transform(future, (instance) -> {
+            if (!instance.isSuccess()) {
+                return AppSearchResult.newFailedResult(
+                        instance.getResultCode(), instance.getErrorMessage());
+            }
+            AppSearchSession searchSession = instance.getResultValue();
+            AppSearchSessionShim shim = new AppSearchSessionShim(searchSession, executor);
+            return AppSearchResult.newSuccessfulResult(shim);
+        }, executor);
+    }
+
+    private AppSearchSessionShim(
+            @NonNull AppSearchSession session, @NonNull ExecutorService executor) {
+        mAppSearchSession = Preconditions.checkNotNull(session);
+        mExecutor = Preconditions.checkNotNull(executor);
+    }
+
+    @NonNull
+    public ListenableFuture<AppSearchResult<Void>> setSchema(@NonNull SetSchemaRequest request) {
+        SettableFuture<AppSearchResult<Void>> future = SettableFuture.create();
+        mAppSearchSession.setSchema(request, mExecutor, future::set);
+        return future;
+    }
+
+    @NonNull
+    public ListenableFuture<AppSearchBatchResult<String, Void>> putDocuments(
+            @NonNull PutDocumentsRequest request) {
+        SettableFuture<AppSearchBatchResult<String, Void>> future = SettableFuture.create();
+        mAppSearchSession.putDocuments(
+                request, mExecutor, new BatchResultCallbackAdapter<>(future));
+        return future;
+    }
+
+    @NonNull
+    public ListenableFuture<AppSearchBatchResult<String, GenericDocument>> getByUri(
+            @NonNull GetByUriRequest request) {
+        SettableFuture<AppSearchBatchResult<String, GenericDocument>> future =
+                SettableFuture.create();
+        mAppSearchSession.getByUri(request, mExecutor, new BatchResultCallbackAdapter<>(future));
+        return future;
+    }
+
+    @NonNull
+    public SearchResultsShim query(
+            @NonNull String queryExpression, @NonNull SearchSpec searchSpec) {
+        SearchResults searchResults =
+                mAppSearchSession.query(queryExpression, searchSpec, mExecutor);
+        return new SearchResultsShim(searchResults);
+    }
+
+    @NonNull
+    public ListenableFuture<AppSearchBatchResult<String, Void>> removeByUri(
+            @NonNull RemoveByUriRequest request) {
+        SettableFuture<AppSearchBatchResult<String, Void>> future = SettableFuture.create();
+        mAppSearchSession.removeByUri(request, mExecutor, new BatchResultCallbackAdapter<>(future));
+        return future;
+    }
+
+    @NonNull
+    public ListenableFuture<AppSearchResult<Void>> removeByQuery(
+            @NonNull String queryExpression, @NonNull SearchSpec searchSpec) {
+        SettableFuture<AppSearchResult<Void>> future = SettableFuture.create();
+        mAppSearchSession.removeByQuery(queryExpression, searchSpec, mExecutor, future::set);
+        return future;
+    }
+
+    private static final class BatchResultCallbackAdapter<K, V>
+            implements BatchResultCallback<K, V> {
+        private final SettableFuture<AppSearchBatchResult<K, V>> mFuture;
+
+        BatchResultCallbackAdapter(SettableFuture<AppSearchBatchResult<K, V>> future) {
+            mFuture = future;
+        }
+
+        @Override
+        public void onResult(AppSearchBatchResult<K, V> result) {
+            mFuture.set(result);
+        }
+
+        @Override
+        public void onSystemError(Throwable t) {
+            mFuture.setException(t);
+        }
+    }
+}
diff --git a/apex/appsearch/testing/java/com/android/server/appsearch/testing/GlobalSearchSessionShim.java b/apex/appsearch/testing/java/com/android/server/appsearch/testing/GlobalSearchSessionShim.java
new file mode 100644
index 0000000..5146426
--- /dev/null
+++ b/apex/appsearch/testing/java/com/android/server/appsearch/testing/GlobalSearchSessionShim.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.appsearch.testing;
+
+import android.annotation.NonNull;
+import android.app.appsearch.AppSearchManager;
+import android.app.appsearch.AppSearchResult;
+import android.app.appsearch.GlobalSearchSession;
+import android.app.appsearch.SearchResults;
+import android.app.appsearch.SearchSpec;
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * This test class adapts the AppSearch Framework API to ListenableFuture, so it can be tested via
+ * a consistent interface.
+ * @hide
+ */
+public class GlobalSearchSessionShim {
+    private final GlobalSearchSession mGlobalSearchSession;
+    private final ExecutorService mExecutor;
+
+    @NonNull
+    public static ListenableFuture<AppSearchResult<GlobalSearchSessionShim>>
+            createGlobalSearchSession() {
+        Context context = ApplicationProvider.getApplicationContext();
+        AppSearchManager appSearchManager = context.getSystemService(AppSearchManager.class);
+        SettableFuture<AppSearchResult<GlobalSearchSession>> future = SettableFuture.create();
+        ExecutorService executor = Executors.newCachedThreadPool();
+        appSearchManager.createGlobalSearchSession(executor, future::set);
+        return Futures.transform(future, (instance) -> {
+            if (!instance.isSuccess()) {
+                return AppSearchResult.newFailedResult(
+                        instance.getResultCode(), instance.getErrorMessage());
+            }
+            GlobalSearchSession searchSession = instance.getResultValue();
+            GlobalSearchSessionShim shim = new GlobalSearchSessionShim(searchSession, executor);
+            return AppSearchResult.newSuccessfulResult(shim);
+        }, executor);
+    }
+
+    private GlobalSearchSessionShim(
+            @NonNull GlobalSearchSession session, @NonNull ExecutorService executor) {
+        mGlobalSearchSession = Preconditions.checkNotNull(session);
+        mExecutor = Preconditions.checkNotNull(executor);
+    }
+
+    @NonNull
+    public SearchResultsShim query(
+            @NonNull String queryExpression, @NonNull SearchSpec searchSpec) {
+        SearchResults searchResults =
+                mGlobalSearchSession.query(queryExpression, searchSpec, mExecutor);
+        return new SearchResultsShim(searchResults);
+    }
+}
diff --git a/apex/appsearch/testing/java/com/android/server/appsearch/testing/SearchResultsShim.java b/apex/appsearch/testing/java/com/android/server/appsearch/testing/SearchResultsShim.java
new file mode 100644
index 0000000..cf43401
--- /dev/null
+++ b/apex/appsearch/testing/java/com/android/server/appsearch/testing/SearchResultsShim.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.appsearch.testing;
+
+import android.annotation.NonNull;
+import android.app.appsearch.AppSearchResult;
+import android.app.appsearch.SearchResult;
+import android.app.appsearch.SearchResults;
+
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+
+import java.io.Closeable;
+import java.util.List;
+
+/**
+ * This test class adapts the AppSearch Framework API to ListenableFuture, so it can be tested via
+ * a consistent interface.
+ * @hide
+ */
+public class SearchResultsShim implements Closeable {
+    private final SearchResults mSearchResults;
+
+    SearchResultsShim(@NonNull SearchResults searchResults) {
+        mSearchResults = Preconditions.checkNotNull(searchResults);
+    }
+
+    @NonNull
+    public ListenableFuture<AppSearchResult<List<SearchResult>>> getNextPage() {
+        SettableFuture<AppSearchResult<List<SearchResult>>> future = SettableFuture.create();
+        mSearchResults.getNextPage(future::set);
+        return future;
+    }
+
+    @Override
+    public void close() {
+        mSearchResults.close();
+    }
+}
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
new file mode 100644
index 0000000..907509c
--- /dev/null
+++ b/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/AppSearchTestUtils.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.appsearch.testing;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.appsearch.AppSearchBatchResult;
+import android.app.appsearch.AppSearchManager;
+import android.app.appsearch.AppSearchResult;
+import android.app.appsearch.GenericDocument;
+import android.app.appsearch.GetByUriRequest;
+import android.app.appsearch.SearchResult;
+import android.app.appsearch.SetSchemaRequest;
+import android.content.Context;
+
+import com.google.common.collect.ImmutableList;
+
+import junit.framework.AssertionFailedError;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Future;
+
+public class AppSearchTestUtils {
+
+    // List of databases that may be used in tests. Keeping them in a centralized location helps
+    // #cleanup know which databases to clear.
+    public static final String DEFAULT_DATABASE = AppSearchManager.DEFAULT_DATABASE_NAME;
+    public static final String DB_1 = "testDb1";
+    public static final String DB_2 = "testDb2";
+
+    public static void cleanup(Context context) throws Exception {
+        List<String> databases = ImmutableList.of(DEFAULT_DATABASE, DB_1, DB_2);
+        for (String database : databases) {
+            AppSearchSessionShim session = checkIsResultSuccess(
+                    AppSearchSessionShim.createSearchSession(
+                            new AppSearchManager.SearchContext.Builder()
+                                    .setDatabaseName(database).build()));
+            checkIsResultSuccess(session.setSchema(
+                    new SetSchemaRequest.Builder().setForceOverride(true).build()));
+        }
+    }
+
+    public static <V> V checkIsResultSuccess(Future<AppSearchResult<V>> future) throws Exception {
+        AppSearchResult<V> result = future.get();
+        if (!result.isSuccess()) {
+            throw new AssertionFailedError("AppSearchResult not successful: " + result);
+        }
+        return result.getResultValue();
+    }
+
+    public static <K, V> AppSearchBatchResult<K, V> checkIsBatchResultSuccess(
+            Future<AppSearchBatchResult<K, V>> future) throws Exception {
+        AppSearchBatchResult<K, V> result = future.get();
+        if (!result.isSuccess()) {
+            throw new AssertionFailedError("AppSearchBatchResult not successful: " + result);
+        }
+        return result;
+    }
+
+    public static List<GenericDocument> doGet(
+            AppSearchSessionShim session, String namespace, String... uris) throws Exception {
+        AppSearchBatchResult<String, GenericDocument> result = checkIsBatchResultSuccess(
+                session.getByUri(
+                        new GetByUriRequest.Builder()
+                                .setNamespace(namespace).addUri(uris).build()));
+        assertThat(result.getSuccesses()).hasSize(uris.length);
+        assertThat(result.getFailures()).isEmpty();
+        List<GenericDocument> list = new ArrayList<>(uris.length);
+        for (String uri : uris) {
+            list.add(result.getSuccesses().get(uri));
+        }
+        return list;
+    }
+
+    public static List<GenericDocument> convertSearchResultsToDocuments(
+            SearchResultsShim searchResults) throws Exception {
+        List<SearchResult> results = checkIsResultSuccess(searchResults.getNextPage());
+        List<GenericDocument> documents = new ArrayList<>();
+        while (results.size() > 0) {
+            for (SearchResult result : results) {
+                documents.add(result.getDocument());
+            }
+            results = checkIsResultSuccess(searchResults.getNextPage());
+        }
+        return documents;
+    }
+}
diff --git a/apex/appsearch/testing/java/com/android/server/appsearch/testing/package-info.java b/apex/appsearch/testing/java/com/android/server/appsearch/testing/package-info.java
new file mode 100644
index 0000000..5c919b4
--- /dev/null
+++ b/apex/appsearch/testing/java/com/android/server/appsearch/testing/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * @hide
+ */
+package com.android.server.appsearch.testing;
diff --git a/apex/blobstore/framework/Android.bp b/apex/blobstore/framework/Android.bp
index 2469351..3499553 100644
--- a/apex/blobstore/framework/Android.bp
+++ b/apex/blobstore/framework/Android.bp
@@ -19,6 +19,7 @@
         "java/**/*.aidl"
     ],
     path: "java",
+    visibility: ["//frameworks/base"],
 }
 
 java_library {
diff --git a/apex/blobstore/service/Android.bp b/apex/blobstore/service/Android.bp
index 22b0cbe..f6cbac1 100644
--- a/apex/blobstore/service/Android.bp
+++ b/apex/blobstore/service/Android.bp
@@ -25,4 +25,9 @@
         "services.core",
         "services.usage",
     ],
+    visibility: [
+        // These are required until blobstore is properly unbundled.
+        "//frameworks/base/services",
+        "//frameworks/base/services/tests/mockingservicestests",
+    ],
 }
diff --git a/apex/jobscheduler/OWNERS b/apex/jobscheduler/OWNERS
index d004eed..c77ea33 100644
--- a/apex/jobscheduler/OWNERS
+++ b/apex/jobscheduler/OWNERS
@@ -1,6 +1,7 @@
-yamasani@google.com
-omakoto@google.com
 ctate@android.com
 ctate@google.com
+dplotnikov@google.com
 kwekua@google.com
-suprabh@google.com
\ No newline at end of file
+omakoto@google.com
+suprabh@google.com
+yamasani@google.com
diff --git a/apex/jobscheduler/framework/Android.bp b/apex/jobscheduler/framework/Android.bp
index dab295b..6650e67 100644
--- a/apex/jobscheduler/framework/Android.bp
+++ b/apex/jobscheduler/framework/Android.bp
@@ -5,6 +5,7 @@
         "java/**/*.aidl",
     ],
     path: "java",
+    visibility: ["//frameworks/base"],
 }
 
 java_library {
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
index 5c4cb3b..31f05ba 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
@@ -1666,9 +1666,6 @@
             if (isPeriodic) {
                 throw new IllegalArgumentException("An expedited job cannot be periodic");
             }
-            if (isPersisted) {
-                throw new IllegalArgumentException("An expedited job cannot be persisted");
-            }
             if (constraintFlags != 0 || (flags & ~FLAG_EXPEDITED) != 0) {
                 throw new IllegalArgumentException(
                         "An expedited job can only have network constraints");
diff --git a/apex/jobscheduler/service/Android.bp b/apex/jobscheduler/service/Android.bp
index 8aa88c2..35bd317 100644
--- a/apex/jobscheduler/service/Android.bp
+++ b/apex/jobscheduler/service/Android.bp
@@ -23,4 +23,12 @@
     required: [
         "libalarm_jni",
     ],
+    visibility: [
+        "//frameworks/base/apex/jobscheduler:__subpackages__",
+        // These are required until jobscheduler is properly unbundled.
+        "//frameworks/base/services",
+        "//frameworks/base/services/tests/mockingservicestests",
+        "//frameworks/base/services/tests/servicestests",
+        "//frameworks/base/tests/JobSchedulerPerfTests",
+    ],
 }
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
index 655fd80..7b87dfb 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
@@ -1563,11 +1563,11 @@
                 standbyBucket);
         final long remainingEJQuota = getRemainingEJExecutionTimeLocked(userId, packageName);
 
-        if (stats.executionTimeInWindowMs < mAllowedTimePerPeriodMs
+        final boolean inRegularQuota = stats.executionTimeInWindowMs < mAllowedTimePerPeriodMs
                 && stats.executionTimeInMaxPeriodMs < mMaxExecutionTimeMs
                 && isUnderJobCountQuota
-                && isUnderTimingSessionCountQuota
-                && remainingEJQuota > 0) {
+                && isUnderTimingSessionCountQuota;
+        if (inRegularQuota && remainingEJQuota > 0) {
             // Already in quota. Why was this method called?
             if (DEBUG) {
                 Slog.e(TAG, "maybeScheduleStartAlarmLocked called for " + pkgString
@@ -1582,10 +1582,7 @@
 
         long inRegularQuotaTimeElapsed = Long.MAX_VALUE;
         long inEJQuotaTimeElapsed = Long.MAX_VALUE;
-        if (!(stats.executionTimeInWindowMs < mAllowedTimePerPeriodMs
-                && stats.executionTimeInMaxPeriodMs < mMaxExecutionTimeMs
-                && isUnderJobCountQuota
-                && isUnderTimingSessionCountQuota)) {
+        if (!inRegularQuota) {
             // The time this app will have quota again.
             long inQuotaTimeElapsed = stats.inQuotaTimeElapsed;
             if (!isUnderJobCountQuota && stats.bgJobCountInWindow < stats.jobCountLimit) {
@@ -1603,18 +1600,35 @@
         }
         if (remainingEJQuota <= 0) {
             final long limitMs = mEJLimitsMs[standbyBucket] - mQuotaBufferMs;
-            List<TimingSession> timingSessions = mEJTimingSessions.get(userId, packageName);
             long sumMs = 0;
-            for (int i = timingSessions.size() - 1; i >= 0; --i) {
-                TimingSession ts = timingSessions.get(i);
-                final long durationMs = ts.endTimeElapsed - ts.startTimeElapsed;
-                sumMs += durationMs;
+            final Timer ejTimer = mEJPkgTimers.get(userId, packageName);
+            if (ejTimer != null && ejTimer.isActive()) {
+                final long nowElapsed = sElapsedRealtimeClock.millis();
+                sumMs += ejTimer.getCurrentDuration(nowElapsed);
                 if (sumMs >= limitMs) {
-                    inEJQuotaTimeElapsed =
-                            ts.startTimeElapsed + (sumMs - limitMs) + mEJLimitWindowSizeMs;
-                    break;
+                    inEJQuotaTimeElapsed = (nowElapsed - limitMs) + mEJLimitWindowSizeMs;
                 }
             }
+            List<TimingSession> timingSessions = mEJTimingSessions.get(userId, packageName);
+            if (timingSessions != null) {
+                for (int i = timingSessions.size() - 1; i >= 0; --i) {
+                    TimingSession ts = timingSessions.get(i);
+                    final long durationMs = ts.endTimeElapsed - ts.startTimeElapsed;
+                    sumMs += durationMs;
+                    if (sumMs >= limitMs) {
+                        inEJQuotaTimeElapsed =
+                                ts.startTimeElapsed + (sumMs - limitMs) + mEJLimitWindowSizeMs;
+                        break;
+                    }
+                }
+            } else if ((ejTimer == null || !ejTimer.isActive()) && inRegularQuota) {
+                // In some strange cases, an app may end be in the NEVER bucket but could have run
+                // some regular jobs. This results in no EJ timing sessions and QC having a bad
+                // time.
+                Slog.wtf(TAG,
+                        string(userId, packageName) + " has 0 EJ quota without running anything");
+                return;
+            }
         }
         long inQuotaTimeElapsed = Math.min(inRegularQuotaTimeElapsed, inEJQuotaTimeElapsed);
 
diff --git a/apex/jobscheduler/service/jni/Android.bp b/apex/jobscheduler/service/jni/Android.bp
index c502867..4bcc165 100644
--- a/apex/jobscheduler/service/jni/Android.bp
+++ b/apex/jobscheduler/service/jni/Android.bp
@@ -29,8 +29,7 @@
                 ":arctimersrcs",
             ],
         }
-    }
-
+    },
 }
 
 filegroup {
@@ -38,4 +37,8 @@
     srcs: [
         "com_android_server_alarm_AlarmManagerService.cpp",
     ],
+    visibility: [
+        // TODO: remove this
+        "//vendor:__subpackages__",
+    ],
 }
diff --git a/apex/media/Android.bp b/apex/media/Android.bp
new file mode 100644
index 0000000..5f1bd37
--- /dev/null
+++ b/apex/media/Android.bp
@@ -0,0 +1,20 @@
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package {
+    default_visibility: [
+        ":__subpackages__",
+        "//frameworks/av/apex",
+        "//frameworks/av/apex/testing",
+    ],
+}
diff --git a/apex/media/framework/Android.bp b/apex/media/framework/Android.bp
index b3c9a9a..811a700 100644
--- a/apex/media/framework/Android.bp
+++ b/apex/media/framework/Android.bp
@@ -48,6 +48,10 @@
         "test_com.android.media",
     ],
     min_sdk_version: "29",
+    visibility: [
+        "//frameworks/av/apex:__subpackages__",
+        "//frameworks/base", // For framework-all
+    ],
 }
 
 filegroup {
@@ -58,6 +62,7 @@
         ":mediaparser-srcs",
         ":mediasession2-java-srcs",
     ],
+    visibility: ["//frameworks/base"],
 }
 
 filegroup {
diff --git a/apex/permission/framework/Android.bp b/apex/permission/framework/Android.bp
index c0560f6..36b5dec 100644
--- a/apex/permission/framework/Android.bp
+++ b/apex/permission/framework/Android.bp
@@ -19,6 +19,7 @@
         "java/**/*.aidl",
     ],
     path: "java",
+    visibility: ["//frameworks/base"],
 }
 
 java_sdk_library {
diff --git a/apex/permission/service/Android.bp b/apex/permission/service/Android.bp
index b7d8433..f6c3156 100644
--- a/apex/permission/service/Android.bp
+++ b/apex/permission/service/Android.bp
@@ -18,6 +18,7 @@
         "java/**/*.java",
     ],
     path: "java",
+    visibility: ["//frameworks/base/services"],
 }
 
 java_sdk_library {
diff --git a/config/preloaded-classes b/config/preloaded-classes
index 8d2f143..6f818a9 100644
--- a/config/preloaded-classes
+++ b/config/preloaded-classes
@@ -14027,7 +14027,6 @@
 libcore.util.SneakyThrow
 libcore.util.XmlObjectFactory
 libcore.util.ZoneInfo
-org.apache.harmony.dalvik.NativeTestTarget
 org.apache.harmony.dalvik.ddmc.Chunk
 org.apache.harmony.dalvik.ddmc.ChunkHandler
 org.apache.harmony.dalvik.ddmc.DdmServer
diff --git a/core/api/current.txt b/core/api/current.txt
index 779cb44..c2f88d7 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -1149,6 +1149,7 @@
     field public static final int reqNavigation = 16843306; // 0x101022a
     field public static final int reqTouchScreen = 16843303; // 0x1010227
     field public static final int requestLegacyExternalStorage = 16844291; // 0x1010603
+    field public static final int requireDeviceScreenOn = 16844315; // 0x101061b
     field public static final int requireDeviceUnlock = 16843756; // 0x10103ec
     field public static final int required = 16843406; // 0x101028e
     field public static final int requiredAccountType = 16843734; // 0x10103d6
@@ -19906,6 +19907,7 @@
   public final class AudioPlaybackConfiguration implements android.os.Parcelable {
     method public int describeContents();
     method public android.media.AudioAttributes getAudioAttributes();
+    method @Nullable public android.media.AudioDeviceInfo getAudioDevice();
     method public void writeToParcel(android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.media.AudioPlaybackConfiguration> CREATOR;
   }
@@ -40660,6 +40662,7 @@
     field public static final String KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL = "treat_downgraded_video_calls_as_video_calls_bool";
     field public static final String KEY_TTY_SUPPORTED_BOOL = "tty_supported_bool";
     field public static final String KEY_UNLOGGABLE_NUMBERS_STRING_ARRAY = "unloggable_numbers_string_array";
+    field public static final String KEY_USE_ACS_FOR_RCS_BOOL = "use_acs_for_rcs_bool";
     field public static final String KEY_USE_HFA_FOR_PROVISIONING_BOOL = "use_hfa_for_provisioning_bool";
     field public static final String KEY_USE_OTASP_FOR_PROVISIONING_BOOL = "use_otasp_for_provisioning_bool";
     field public static final String KEY_USE_RCS_PRESENCE_BOOL = "use_rcs_presence_bool";
@@ -40708,6 +40711,70 @@
     field public static final String KEY_WIFI_OFF_DEFERRING_TIME_MILLIS_INT = "ims.wifi_off_deferring_time_millis_int";
   }
 
+  public static final class CarrierConfigManager.Iwlan {
+    field public static final int AUTHENTICATION_METHOD_CERT = 1; // 0x1
+    field public static final int AUTHENTICATION_METHOD_EAP_ONLY = 0; // 0x0
+    field public static final int DH_GROUP_1024_BIT_MODP = 2; // 0x2
+    field public static final int DH_GROUP_1536_BIT_MODP = 5; // 0x5
+    field public static final int DH_GROUP_2048_BIT_MODP = 14; // 0xe
+    field public static final int DH_GROUP_3072_BIT_MODP = 15; // 0xf
+    field public static final int DH_GROUP_4096_BIT_MODP = 16; // 0x10
+    field public static final int DH_GROUP_NONE = 0; // 0x0
+    field public static final int ENCRYPTION_ALGORITHM_AES_CBC = 12; // 0xc
+    field public static final int ENCRYPTION_ALGORITHM_AES_CTR = 13; // 0xd
+    field public static final int EPDG_ADDRESS_CELLULAR_LOC = 3; // 0x3
+    field public static final int EPDG_ADDRESS_PCO = 2; // 0x2
+    field public static final int EPDG_ADDRESS_PLMN = 1; // 0x1
+    field public static final int EPDG_ADDRESS_STATIC = 0; // 0x0
+    field public static final int ID_TYPE_FQDN = 2; // 0x2
+    field public static final int ID_TYPE_KEY_ID = 11; // 0xb
+    field public static final int ID_TYPE_RFC822_ADDR = 3; // 0x3
+    field public static final int INTEGRITY_ALGORITHM_AES_XCBC_96 = 5; // 0x5
+    field public static final int INTEGRITY_ALGORITHM_HMAC_SHA1_96 = 2; // 0x2
+    field public static final int INTEGRITY_ALGORITHM_HMAC_SHA2_256_128 = 12; // 0xc
+    field public static final int INTEGRITY_ALGORITHM_HMAC_SHA2_384_192 = 13; // 0xd
+    field public static final int INTEGRITY_ALGORITHM_HMAC_SHA2_512_256 = 14; // 0xe
+    field public static final int INTEGRITY_ALGORITHM_NONE = 0; // 0x0
+    field public static final String KEY_ADD_KE_TO_CHILD_SESSION_REKEY_BOOL = "iwlan.add_ke_to_child_session_rekey_bool";
+    field public static final String KEY_ADD_WIFI_MAC_ADDR_TO_NAI_BOOL = "iwlan.add_wifi_mac_addr_to_nai_bool";
+    field public static final String KEY_CHILD_SA_REKEY_HARD_TIMER_SEC_INT = "iwlan.child_sa_rekey_hard_timer_sec_int";
+    field public static final String KEY_CHILD_SA_REKEY_SOFT_TIMER_SEC_INT = "iwlan.child_sa_rekey_soft_timer_sec_int";
+    field public static final String KEY_CHILD_SESSION_AES_CBC_KEY_SIZE_INT_ARRAY = "iwlan.child_session_aes_cbc_key_size_int_array";
+    field public static final String KEY_CHILD_SESSION_AES_CTR_KEY_SIZE_INT_ARRAY = "iwlan.child_session_aes_ctr_key_size_int_array";
+    field public static final String KEY_DIFFIE_HELLMAN_GROUPS_INT_ARRAY = "iwlan.diffie_hellman_groups_int_array";
+    field public static final String KEY_DPD_TIMER_SEC_INT = "iwlan.dpd_timer_sec_int";
+    field public static final String KEY_EPDG_ADDRESS_PRIORITY_INT_ARRAY = "iwlan.epdg_address_priority_int_array";
+    field public static final String KEY_EPDG_AUTHENTICATION_METHOD_INT = "iwlan.epdg_authentication_method_int";
+    field public static final String KEY_EPDG_PCO_ID_IPV4_INT = "iwlan.epdg_pco_id_ipv4_int";
+    field public static final String KEY_EPDG_PCO_ID_IPV6_INT = "iwlan.epdg_pco_id_ipv6_int";
+    field public static final String KEY_EPDG_STATIC_ADDRESS_ROAMING_STRING = "iwlan.epdg_static_address_roaming_string";
+    field public static final String KEY_EPDG_STATIC_ADDRESS_STRING = "iwlan.epdg_static_address_string";
+    field public static final String KEY_IKE_LOCAL_ID_TYPE_INT = "iwlan.ike_local_id_type_int";
+    field public static final String KEY_IKE_REKEY_HARD_TIMER_SEC_INT = "iwlan.ike_rekey_hard_timer_in_sec";
+    field public static final String KEY_IKE_REKEY_SOFT_TIMER_SEC_INT = "iwlan.ike_rekey_soft_timer_sec_int";
+    field public static final String KEY_IKE_REMOTE_ID_TYPE_INT = "iwlan.ike_remote_id_type_int";
+    field public static final String KEY_IKE_SESSION_AES_CBC_KEY_SIZE_INT_ARRAY = "iwlan.ike_session_encryption_aes_cbc_key_size_int_array";
+    field public static final String KEY_IKE_SESSION_AES_CTR_KEY_SIZE_INT_ARRAY = "iwlan.ike_session_encryption_aes_ctr_key_size_int_array";
+    field public static final int KEY_LEN_AES_128 = 128; // 0x80
+    field public static final int KEY_LEN_AES_192 = 192; // 0xc0
+    field public static final int KEY_LEN_AES_256 = 256; // 0x100
+    field public static final int KEY_LEN_UNUSED = 0; // 0x0
+    field public static final String KEY_MAX_RETRIES_INT = "iwlan.max_retries_int";
+    field public static final String KEY_MCC_MNCS_STRING_ARRAY = "iwlan.mcc_mncs_string_array";
+    field public static final String KEY_NATT_KEEP_ALIVE_TIMER_SEC_INT = "iwlan.natt_keep_alive_timer_sec_int";
+    field public static final String KEY_PREFIX = "iwlan.";
+    field public static final String KEY_RETRANSMIT_TIMER_MSEC_INT_ARRAY = "iwlan.retransmit_timer_sec_int_array";
+    field public static final String KEY_SUPPORTED_CHILD_SESSION_ENCRYPTION_ALGORITHMS_INT_ARRAY = "iwlan.supported_child_session_encryption_algorithms_int_array";
+    field public static final String KEY_SUPPORTED_IKE_SESSION_ENCRYPTION_ALGORITHMS_INT_ARRAY = "iwlan.supported_ike_session_encryption_algorithms_int_array";
+    field public static final String KEY_SUPPORTED_INTEGRITY_ALGORITHMS_INT_ARRAY = "iwlan.supported_integrity_algorithms_int_array";
+    field public static final String KEY_SUPPORTED_PRF_ALGORITHMS_INT_ARRAY = "iwlan.supported_prf_algorithms_int_array";
+    field public static final int PSEUDORANDOM_FUNCTION_AES128_XCBC = 4; // 0x4
+    field public static final int PSEUDORANDOM_FUNCTION_HMAC_SHA1 = 2; // 0x2
+    field public static final int PSEUDORANDOM_FUNCTION_SHA2_256 = 5; // 0x5
+    field public static final int PSEUDORANDOM_FUNCTION_SHA2_384 = 6; // 0x6
+    field public static final int PSEUDORANDOM_FUNCTION_SHA2_512 = 7; // 0x7
+  }
+
   public abstract class CellIdentity implements android.os.Parcelable {
     method public int describeContents();
     method @Nullable public CharSequence getOperatorAlphaLong();
@@ -40912,7 +40979,8 @@
   public final class CellSignalStrengthLte extends android.telephony.CellSignalStrength implements android.os.Parcelable {
     method public int describeContents();
     method public int getAsuLevel();
-    method public int getCqi();
+    method @IntRange(from=0, to=15) public int getCqi();
+    method @IntRange(from=1, to=6) public int getCqiTableIndex();
     method public int getDbm();
     method @IntRange(from=android.telephony.CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, to=android.telephony.CellSignalStrength.SIGNAL_STRENGTH_GREAT) public int getLevel();
     method public int getRsrp();
@@ -40927,6 +40995,8 @@
   public final class CellSignalStrengthNr extends android.telephony.CellSignalStrength implements android.os.Parcelable {
     method public int describeContents();
     method public int getAsuLevel();
+    method @IntRange(from=0, to=15) @NonNull public java.util.List<java.lang.Integer> getCsiCqiReport();
+    method @IntRange(from=1, to=3) public int getCsiCqiTableIndex();
     method public int getCsiRsrp();
     method public int getCsiRsrq();
     method public int getCsiSinr();
@@ -46295,7 +46365,6 @@
     method public int getFlags();
     method @Nullable public android.net.Uri getLinkUri();
     method public int getSource();
-    method @NonNull public android.util.Pair<android.view.ContentInfo,android.view.ContentInfo> partition(@NonNull java.util.function.Predicate<android.content.ClipData.Item>);
     field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
     field public static final int SOURCE_APP = 0; // 0x0
     field public static final int SOURCE_AUTOFILL = 4; // 0x4
@@ -51196,6 +51265,7 @@
     method public boolean performContextMenuAction(int);
     method public boolean performEditorAction(int);
     method public boolean performPrivateCommand(String, android.os.Bundle);
+    method public default boolean performSpellCheck();
     method public boolean reportFullscreenMode(boolean);
     method public boolean requestCursorUpdates(int);
     method public boolean sendKeyEvent(android.view.KeyEvent);
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 58606d2..0f1adc0 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -60,6 +60,7 @@
     field public static final String CAMERA_OPEN_CLOSE_LISTENER = "android.permission.CAMERA_OPEN_CLOSE_LISTENER";
     field public static final String CAPTURE_AUDIO_HOTWORD = "android.permission.CAPTURE_AUDIO_HOTWORD";
     field public static final String CAPTURE_MEDIA_OUTPUT = "android.permission.CAPTURE_MEDIA_OUTPUT";
+    field public static final String CAPTURE_TUNER_AUDIO_INPUT = "android.permission.CAPTURE_TUNER_AUDIO_INPUT";
     field public static final String CAPTURE_TV_INPUT = "android.permission.CAPTURE_TV_INPUT";
     field public static final String CAPTURE_VOICE_COMMUNICATION_OUTPUT = "android.permission.CAPTURE_VOICE_COMMUNICATION_OUTPUT";
     field public static final String CHANGE_APP_IDLE_STATE = "android.permission.CHANGE_APP_IDLE_STATE";
@@ -1932,6 +1933,7 @@
     field public static final String EUICC_CARD_SERVICE = "euicc_card";
     field public static final String HDMI_CONTROL_SERVICE = "hdmi_control";
     field public static final String MEDIA_TRANSCODING_SERVICE = "media_transcoding";
+    field public static final String MUSIC_RECOGNITION_SERVICE = "music_recognition";
     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";
@@ -2120,6 +2122,9 @@
   public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
     method public boolean isEncryptionAware();
     method public boolean isInstantApp();
+    method public boolean isOem();
+    method public boolean isProduct();
+    method public boolean isVendor();
     field public String credentialProtectedDataDir;
     field public int targetSandboxVersion;
   }
@@ -8051,12 +8056,14 @@
 
   public class RecoverySystem {
     method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void cancelScheduledUpdate(android.content.Context) throws java.io.IOException;
-    method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void clearPrepareForUnattendedUpdate(@NonNull android.content.Context) throws java.io.IOException;
+    method @RequiresPermission(anyOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static void clearPrepareForUnattendedUpdate(@NonNull android.content.Context) throws java.io.IOException;
     method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void installPackage(android.content.Context, java.io.File, boolean) throws java.io.IOException;
-    method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void prepareForUnattendedUpdate(@NonNull android.content.Context, @NonNull String, @Nullable android.content.IntentSender) throws java.io.IOException;
+    method @RequiresPermission(anyOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static boolean isPreparedForUnattendedUpdate(@NonNull android.content.Context) throws java.io.IOException;
+    method @RequiresPermission(anyOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static void prepareForUnattendedUpdate(@NonNull android.content.Context, @NonNull String, @Nullable android.content.IntentSender) throws java.io.IOException;
     method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void processPackage(android.content.Context, java.io.File, android.os.RecoverySystem.ProgressListener, android.os.Handler) throws java.io.IOException;
     method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void processPackage(android.content.Context, java.io.File, android.os.RecoverySystem.ProgressListener) throws java.io.IOException;
-    method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void rebootAndApply(@NonNull android.content.Context, @NonNull String, @NonNull String) throws java.io.IOException;
+    method @RequiresPermission(anyOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static void rebootAndApply(@NonNull android.content.Context, @NonNull String, @NonNull String) throws java.io.IOException;
+    method @RequiresPermission(anyOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static void rebootAndApply(@NonNull android.content.Context, @NonNull String, boolean) throws java.io.IOException;
     method @RequiresPermission(allOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static void rebootWipeAb(android.content.Context, java.io.File, String) throws java.io.IOException;
     method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void scheduleUpdateOnBoot(android.content.Context, java.io.File) throws java.io.IOException;
     method public static boolean verifyPackageCompatibility(java.io.File) throws java.io.IOException;
@@ -9777,6 +9784,7 @@
     ctor public ExternalStorageService();
     method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent);
     method public abstract void onEndSession(@NonNull String) throws java.io.IOException;
+    method public void onFreeCacheRequested(@NonNull java.util.UUID, long);
     method public abstract void onStartSession(@NonNull String, int, @NonNull android.os.ParcelFileDescriptor, @NonNull java.io.File, @NonNull java.io.File) throws java.io.IOException;
     method public abstract void onVolumeStateChanged(@NonNull android.os.storage.StorageVolume) throws java.io.IOException;
     field public static final int FLAG_SESSION_ATTRIBUTE_INDEXABLE = 2; // 0x2
@@ -9814,6 +9822,38 @@
 
 }
 
+package android.service.timezone {
+
+  public abstract class TimeZoneProviderService extends android.app.Service {
+    ctor public TimeZoneProviderService();
+    method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent);
+    method public abstract void onStartUpdates(long);
+    method public abstract void onStopUpdates();
+    method public final void reportPermanentFailure(@NonNull Throwable);
+    method public final void reportSuggestion(@NonNull android.service.timezone.TimeZoneProviderSuggestion);
+    method public final void reportUncertain();
+    field public static final String BIND_PERMISSION = "android.permission.INSTALL_LOCATION_TIME_ZONE_PROVIDER";
+    field public static final String PRIMARY_LOCATION_TIME_ZONE_PROVIDER_SERVICE_INTERFACE = "android.service.timezone.PrimaryLocationTimeZoneProviderService";
+    field public static final String SECONDARY_LOCATION_TIME_ZONE_PROVIDER_SERVICE_INTERFACE = "android.service.timezone.SecondaryLocationTimeZoneProviderService";
+  }
+
+  public final class TimeZoneProviderSuggestion implements android.os.Parcelable {
+    method public int describeContents();
+    method public long getElapsedRealtimeMillis();
+    method @NonNull public java.util.List<java.lang.String> getTimeZoneIds();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.service.timezone.TimeZoneProviderSuggestion> CREATOR;
+  }
+
+  public static final class TimeZoneProviderSuggestion.Builder {
+    ctor public TimeZoneProviderSuggestion.Builder();
+    method @NonNull public android.service.timezone.TimeZoneProviderSuggestion build();
+    method @NonNull public android.service.timezone.TimeZoneProviderSuggestion.Builder setElapsedRealtimeMillis(long);
+    method @NonNull public android.service.timezone.TimeZoneProviderSuggestion.Builder setTimeZoneIds(@NonNull java.util.List<java.lang.String>);
+  }
+
+}
+
 package android.service.trust {
 
   public class TrustAgentService extends android.app.Service {
@@ -11006,6 +11046,7 @@
     method public boolean disableCellBroadcastRange(int, int, int);
     method public boolean enableCellBroadcastRange(int, int, int);
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getPremiumSmsConsent(@NonNull String);
+    method @RequiresPermission(android.Manifest.permission.MODIFY_CELL_BROADCASTS) public void resetAllCellBroadcastRanges();
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void sendMultipartTextMessageWithoutPersisting(String, String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setPremiumSmsConsent(@NonNull String, int);
     field public static final int PREMIUM_SMS_CONSENT_ALWAYS_ALLOW = 3; // 0x3
@@ -12457,18 +12498,29 @@
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getProvisioningStatusForCapability(int, int);
     method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public String getProvisioningStringValue(int);
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getRcsProvisioningStatusForCapability(int);
+    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isRcsVolteSingleRegistrationCapable() throws android.telephony.ims.ImsException;
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyRcsAutoConfigurationReceived(@NonNull byte[], boolean);
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerProvisioningChangedCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.Callback) throws android.telephony.ims.ImsException;
+    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerRcsProvisioningChangedCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.RcsProvisioningCallback) throws android.telephony.ims.ImsException;
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningIntValue(int, int);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setProvisioningStatusForCapability(int, int, boolean);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningStringValue(int, @NonNull String);
+    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRcsClientConfiguration(@NonNull android.telephony.ims.RcsClientConfiguration) throws android.telephony.ims.ImsException;
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setRcsProvisioningStatusForCapability(int, boolean);
+    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void triggerRcsReconfiguration();
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.Callback);
+    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterRcsProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.RcsProvisioningCallback);
+    field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final String ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE = "android.telephony.ims.action.RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE";
+    field public static final String EXTRA_STATUS = "android.telephony.ims.extra.STATUS";
+    field public static final String EXTRA_SUBSCRIPTION_ID = "android.telephony.ims.extra.SUBSCRIPTION_ID";
     field public static final int KEY_VOICE_OVER_WIFI_ENTITLEMENT_ID = 67; // 0x43
     field public static final int KEY_VOICE_OVER_WIFI_MODE_OVERRIDE = 27; // 0x1b
     field public static final int KEY_VOICE_OVER_WIFI_ROAMING_ENABLED_OVERRIDE = 26; // 0x1a
     field public static final int PROVISIONING_VALUE_DISABLED = 0; // 0x0
     field public static final int PROVISIONING_VALUE_ENABLED = 1; // 0x1
+    field public static final int STATUS_CAPABLE = 0; // 0x0
+    field public static final int STATUS_CARRIER_NOT_CAPABLE = 2; // 0x2
+    field public static final int STATUS_DEVICE_NOT_CAPABLE = 1; // 0x1
     field public static final String STRING_QUERY_RESULT_ERROR_GENERIC = "STRING_QUERY_RESULT_ERROR_GENERIC";
     field public static final String STRING_QUERY_RESULT_ERROR_NOT_READY = "STRING_QUERY_RESULT_ERROR_NOT_READY";
   }
@@ -12479,6 +12531,27 @@
     method public void onProvisioningStringChanged(int, @NonNull String);
   }
 
+  public static class ProvisioningManager.RcsProvisioningCallback {
+    ctor public ProvisioningManager.RcsProvisioningCallback();
+    method public void onAutoConfigurationErrorReceived(int, @NonNull String);
+    method public void onConfigurationChanged(@NonNull byte[]);
+    method public void onConfigurationReset();
+    method public void onRemoved();
+  }
+
+  public final class RcsClientConfiguration implements android.os.Parcelable {
+    ctor public RcsClientConfiguration(@NonNull String, @NonNull String, @NonNull String, @NonNull String);
+    method public int describeContents();
+    method @NonNull public String getClientVendor();
+    method @NonNull public String getClientVersion();
+    method @NonNull public String getRcsProfile();
+    method @NonNull public String getRcsVersion();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.RcsClientConfiguration> CREATOR;
+    field public static final String RCS_PROFILE_1_0 = "UP_1.0";
+    field public static final String RCS_PROFILE_2_3 = "UP_2.3";
+  }
+
   public class RcsUceAdapter {
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException;
   }
@@ -12571,6 +12644,7 @@
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void createSipDelegate(@NonNull android.telephony.ims.DelegateRequest, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.stub.DelegateConnectionStateCallback, @NonNull android.telephony.ims.stub.DelegateConnectionMessageCallback) throws android.telephony.ims.ImsException;
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void destroySipDelegate(@NonNull android.telephony.ims.SipDelegateConnection, int);
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSupported() throws android.telephony.ims.ImsException;
+    method public void triggerFullNetworkRegistration(@NonNull android.telephony.ims.SipDelegateConnection, @IntRange(from=100, to=699) int, @Nullable String);
     field public static final int DENIED_REASON_INVALID = 4; // 0x4
     field public static final int DENIED_REASON_IN_USE_BY_ANOTHER_DELEGATE = 1; // 0x1
     field public static final int DENIED_REASON_NOT_ALLOWED = 2; // 0x2
@@ -12766,11 +12840,15 @@
     ctor public ImsConfigImplBase();
     method public int getConfigInt(int);
     method public String getConfigString(int);
+    method public final void notifyAutoConfigurationErrorReceived(int, @NonNull String);
     method public final void notifyProvisionedValueChanged(int, int);
     method public final void notifyProvisionedValueChanged(int, String);
     method public void notifyRcsAutoConfigurationReceived(@NonNull byte[], boolean);
+    method public void notifyRcsAutoConfigurationRemoved();
     method public int setConfig(int, int);
     method public int setConfig(int, String);
+    method public void setRcsClientConfiguration(@NonNull android.telephony.ims.RcsClientConfiguration);
+    method public void triggerAutoConfiguration();
     field public static final int CONFIG_RESULT_FAILED = 1; // 0x1
     field public static final int CONFIG_RESULT_SUCCESS = 0; // 0x0
     field public static final int CONFIG_RESULT_UNKNOWN = -1; // 0xffffffff
@@ -12815,6 +12893,9 @@
     method public final void onRegistering(int);
     method public final void onSubscriberAssociatedUriChanged(android.net.Uri[]);
     method public final void onTechnologyChangeFailed(int, android.telephony.ims.ImsReasonInfo);
+    method public void triggerFullNetworkRegistration(@IntRange(from=100, to=699) int, @Nullable String);
+    method public void triggerSipDelegateDeregistration();
+    method public void updateSipDelegateRegistration();
     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
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 1998563..f51bb95 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -141,7 +141,6 @@
     method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public boolean moveTopActivityToPinnedRootTask(int, @NonNull android.graphics.Rect);
     method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void removeRootTasksInWindowingModes(@NonNull int[]);
     method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void removeRootTasksWithActivityTypes(@NonNull int[]);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void requestPictureInPictureMode(@NonNull android.os.IBinder);
     method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void resizePrimarySplitScreen(@NonNull android.graphics.Rect, @NonNull android.graphics.Rect);
     method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void resizeTask(int, android.graphics.Rect);
     method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public boolean setTaskWindowingMode(int, int, boolean) throws java.lang.SecurityException;
@@ -2017,6 +2016,10 @@
     field public static final int CALLBACK_ANIMATION = 1; // 0x1
   }
 
+  public final class ContentInfo {
+    method @NonNull public android.util.Pair<android.view.ContentInfo,android.view.ContentInfo> partition(@NonNull java.util.function.Predicate<android.content.ClipData.Item>);
+  }
+
   public final class Display {
     method @NonNull public android.graphics.ColorSpace[] getSupportedWideColorGamut();
     method public int getType();
diff --git a/core/java/android/accounts/AbstractAccountAuthenticator.java b/core/java/android/accounts/AbstractAccountAuthenticator.java
index 6470a04..7b57442f 100644
--- a/core/java/android/accounts/AbstractAccountAuthenticator.java
+++ b/core/java/android/accounts/AbstractAccountAuthenticator.java
@@ -93,7 +93,8 @@
  * {@link AccountAuthenticatorResponse#onError} when it is complete.
  * <li> If the authenticator cannot synchronously process the request and return a result then it
  * may choose to return null and then use the AccountManagerResponse to send the result
- * when it has completed the request.
+ * when it has completed the request. This asynchronous option is not available for the
+ * {@link #addAccount} method, which must complete synchronously.
  * </ul>
  * <p>
  * The following descriptions of each of the abstract authenticator methods will not describe the
@@ -101,7 +102,7 @@
  * parameters and the expected result.
  * <p>
  * When writing an activity to satisfy these requests one must pass in the AccountManagerResponse
- * and return the result via that response when the activity finishes (or whenever else  the
+ * and return the result via that response when the activity finishes (or whenever else the
  * activity author deems it is the correct time to respond).
  */
 public abstract class AbstractAccountAuthenticator {
diff --git a/core/java/android/app/ActivityTaskManager.java b/core/java/android/app/ActivityTaskManager.java
index 03c1a01..2060252 100644
--- a/core/java/android/app/ActivityTaskManager.java
+++ b/core/java/android/app/ActivityTaskManager.java
@@ -419,20 +419,6 @@
     }
 
     /**
-     * Requests that an activity should enter picture-in-picture mode if possible.
-     * @hide
-     */
-    @TestApi
-    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
-    public void requestPictureInPictureMode(@NonNull IBinder token) {
-        try {
-            getService().requestPictureInPictureMode(token);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
      * @return whether the UI mode of the given config supports error dialogs (ANR, crash, etc).
      * @hide
      */
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl
index a3be28f..1ac0a65 100644
--- a/core/java/android/app/IActivityTaskManager.aidl
+++ b/core/java/android/app/IActivityTaskManager.aidl
@@ -258,7 +258,6 @@
 
     void suppressResizeConfigChanges(boolean suppress);
     boolean moveTopActivityToPinnedRootTask(int rootTaskId, in Rect bounds);
-    void requestPictureInPictureMode(in IBinder token);
 
     /**
      * Resizes the docked stack, and all other stacks as the result of the dock stack bounds change.
diff --git a/core/java/android/app/admin/DevicePolicyManagerInternal.java b/core/java/android/app/admin/DevicePolicyManagerInternal.java
index b046014..a0d2977 100644
--- a/core/java/android/app/admin/DevicePolicyManagerInternal.java
+++ b/core/java/android/app/admin/DevicePolicyManagerInternal.java
@@ -243,4 +243,16 @@
      * Returns whether the given package is a device owner or a profile owner in the calling user.
      */
     public abstract boolean isDeviceOrProfileOwnerInCallingUser(String packageName);
+
+    /**
+     * Returns whether this class supports being deferred the responsibility for resetting the given
+     * op.
+     */
+    public abstract boolean supportsResetOp(int op);
+
+    /**
+     * Resets the given op across the profile group of the given user for the given package. Assumes
+     * {@link #supportsResetOp(int)} is true.
+     */
+    public abstract void resetOp(int op, String packageName, @UserIdInt int userId);
 }
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 62ba2b2..ac576a8 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -4564,6 +4564,7 @@
      * @hide
      * @see #getSystemService(String)
      */
+    @SystemApi
     public static final String MUSIC_RECOGNITION_SERVICE = "music_recognition";
 
     /**
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 81d9b11..e32068f 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -2101,7 +2101,7 @@
     }
 
     /** @hide */
-    @SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+    @SystemApi
     public boolean isOem() {
         return (privateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0;
     }
@@ -2149,13 +2149,13 @@
     }
 
     /** @hide */
-    @SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+    @SystemApi
     public boolean isVendor() {
         return (privateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR) != 0;
     }
 
     /** @hide */
-    @SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+    @SystemApi
     public boolean isProduct() {
         return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PRODUCT) != 0;
     }
diff --git a/core/java/android/content/pm/CrossProfileAppsInternal.java b/core/java/android/content/pm/CrossProfileAppsInternal.java
index 16a749f..255aeac 100644
--- a/core/java/android/content/pm/CrossProfileAppsInternal.java
+++ b/core/java/android/content/pm/CrossProfileAppsInternal.java
@@ -17,6 +17,7 @@
 package android.content.pm;
 
 import android.annotation.UserIdInt;
+import android.app.AppOpsManager.Mode;
 import android.os.UserHandle;
 
 import java.util.List;
@@ -62,4 +63,14 @@
      */
     public abstract List<UserHandle> getTargetUserProfiles(
             String packageName, @UserIdInt int userId);
+
+    /**
+     * Sets the app-op for {@link android.Manifest.permission#INTERACT_ACROSS_PROFILES} that is
+     * configurable by users in Settings. This configures it for the profile group of the given
+     * user.
+     *
+     * @see CrossProfileApps#setInteractAcrossProfilesAppOp(String, int)
+     */
+    public abstract void setInteractAcrossProfilesAppOp(
+            String packageName, @Mode int newMode, @UserIdInt int userId);
 }
diff --git a/core/java/android/content/pm/LimitedLengthInputStream.java b/core/java/android/content/pm/LimitedLengthInputStream.java
index 19b681e..05089f6 100644
--- a/core/java/android/content/pm/LimitedLengthInputStream.java
+++ b/core/java/android/content/pm/LimitedLengthInputStream.java
@@ -1,6 +1,6 @@
 package android.content.pm;
 
-import libcore.util.ArrayUtils;
+import com.android.internal.util.ArrayUtils;
 
 import java.io.FilterInputStream;
 import java.io.IOException;
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index 78cea15..cbcdb37 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -534,7 +534,24 @@
             remainder = languageTag.substring(separator);
         }
 
-        return Locale.adjustLanguageCode(language) + remainder;
+        // No need to convert to lower cases because the language in the return value of
+        // Locale.toLanguageTag has been lower-cased.
+        final String adjustedLanguage;
+        switch(language) {
+            case "id":
+                adjustedLanguage = "in";
+                break;
+            case "yi":
+                adjustedLanguage = "ji";
+                break;
+            case "he":
+                adjustedLanguage = "iw";
+                break;
+            default:
+                adjustedLanguage = language;
+                break;
+        }
+        return adjustedLanguage + remainder;
     }
 
     /**
diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java
index 3a73de6..43f04cd 100644
--- a/core/java/android/hardware/hdmi/HdmiControlManager.java
+++ b/core/java/android/hardware/hdmi/HdmiControlManager.java
@@ -848,6 +848,20 @@
     }
 
     /**
+     * Determines whether the HDMI CEC stack should handle KEYCODE_TV_POWER.
+     *
+     * @hide
+     */
+    @RequiresPermission(android.Manifest.permission.HDMI_CEC)
+    public boolean shouldHandleTvPowerKey() {
+        try {
+            return mService.shouldHandleTvPowerKey();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * Controls whether volume control commands via HDMI CEC are enabled.
      *
      * <p>When disabled:
diff --git a/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java b/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java
index 202e090..3b61911f 100644
--- a/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java
+++ b/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java
@@ -72,6 +72,11 @@
         }
 
         @Override
+        public boolean shouldHandleTvPowerKey() {
+            return HdmiControlServiceWrapper.this.shouldHandleTvPowerKey();
+        }
+
+        @Override
         public void queryDisplayStatus(IHdmiControlCallback callback) {
             HdmiControlServiceWrapper.this.queryDisplayStatus(callback);
         }
@@ -368,6 +373,11 @@
     public void toggleAndFollowTvPower() {}
 
     /** @hide */
+    public boolean shouldHandleTvPowerKey() {
+        return true;
+    }
+
+    /** @hide */
     public void queryDisplayStatus(IHdmiControlCallback callback) {}
 
     /** @hide */
diff --git a/core/java/android/hardware/hdmi/IHdmiControlService.aidl b/core/java/android/hardware/hdmi/IHdmiControlService.aidl
index 6d0c688..65bd856 100644
--- a/core/java/android/hardware/hdmi/IHdmiControlService.aidl
+++ b/core/java/android/hardware/hdmi/IHdmiControlService.aidl
@@ -43,6 +43,7 @@
     HdmiDeviceInfo getActiveSource();
     void oneTouchPlay(IHdmiControlCallback callback);
     void toggleAndFollowTvPower();
+    boolean shouldHandleTvPowerKey();
     void queryDisplayStatus(IHdmiControlCallback callback);
     void addHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener);
     void removeHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener);
diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl
index 57c0398..3f3c3bf 100644
--- a/core/java/android/hardware/input/IInputManager.aidl
+++ b/core/java/android/hardware/input/IInputManager.aidl
@@ -94,7 +94,7 @@
     void setPointerIconType(int typeId);
     void setCustomPointerIcon(in PointerIcon icon);
 
-    void requestPointerCapture(IBinder windowToken, boolean enabled);
+    oneway void requestPointerCapture(IBinder inputChannelToken, boolean enabled);
 
     /** Create an input monitor for gestures. */
     InputMonitor monitorGestureInput(String name, int displayId);
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index 40c7e9a..dd71cce 100644
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -193,7 +193,7 @@
      */
     @BlockUntrustedTouchesMode
     public static final int DEFAULT_BLOCK_UNTRUSTED_TOUCHES_MODE =
-            BlockUntrustedTouchesMode.PERMISSIVE;
+            BlockUntrustedTouchesMode.BLOCK;
 
     /**
      * Prevent touches from being consumed by apps if these touches passed through a non-trusted
diff --git a/core/java/android/nfc/cardemulation/ApduServiceInfo.java b/core/java/android/nfc/cardemulation/ApduServiceInfo.java
index e3f996b..0af322e 100644
--- a/core/java/android/nfc/cardemulation/ApduServiceInfo.java
+++ b/core/java/android/nfc/cardemulation/ApduServiceInfo.java
@@ -98,6 +98,11 @@
     final boolean mRequiresDeviceUnlock;
 
     /**
+     * Whether this service should only be started when the device is screen on.
+     */
+    final boolean mRequiresDeviceScreenOn;
+
+    /**
      * The id of the service banner specified in XML.
      */
     final int mBannerResourceId;
@@ -120,6 +125,18 @@
             ArrayList<AidGroup> staticAidGroups, ArrayList<AidGroup> dynamicAidGroups,
             boolean requiresUnlock, int bannerResource, int uid,
             String settingsActivityName, String offHost, String staticOffHost) {
+        this(info, onHost, description, staticAidGroups, dynamicAidGroups,
+                requiresUnlock, onHost ? true : false, bannerResource, uid,
+                settingsActivityName, offHost, staticOffHost);
+    }
+
+    /**
+     * @hide
+     */
+    public ApduServiceInfo(ResolveInfo info, boolean onHost, String description,
+            ArrayList<AidGroup> staticAidGroups, ArrayList<AidGroup> dynamicAidGroups,
+            boolean requiresUnlock, boolean requiresScreenOn, int bannerResource, int uid,
+            String settingsActivityName, String offHost, String staticOffHost) {
         this.mService = info;
         this.mDescription = description;
         this.mStaticAidGroups = new HashMap<String, AidGroup>();
@@ -128,6 +145,7 @@
         this.mStaticOffHostName = staticOffHost;
         this.mOnHost = onHost;
         this.mRequiresDeviceUnlock = requiresUnlock;
+        this.mRequiresDeviceScreenOn = requiresScreenOn;
         for (AidGroup aidGroup : staticAidGroups) {
             this.mStaticAidGroups.put(aidGroup.category, aidGroup);
         }
@@ -184,6 +202,9 @@
                 mRequiresDeviceUnlock = sa.getBoolean(
                         com.android.internal.R.styleable.HostApduService_requireDeviceUnlock,
                         false);
+                mRequiresDeviceScreenOn = sa.getBoolean(
+                        com.android.internal.R.styleable.HostApduService_requireDeviceScreenOn,
+                        true);
                 mBannerResourceId = sa.getResourceId(
                         com.android.internal.R.styleable.HostApduService_apduServiceBanner, -1);
                 mSettingsActivityName = sa.getString(
@@ -197,7 +218,12 @@
                 mService = info;
                 mDescription = sa.getString(
                         com.android.internal.R.styleable.OffHostApduService_description);
-                mRequiresDeviceUnlock = false;
+                mRequiresDeviceUnlock = sa.getBoolean(
+                        com.android.internal.R.styleable.OffHostApduService_requireDeviceUnlock,
+                        false);
+                mRequiresDeviceScreenOn = sa.getBoolean(
+                        com.android.internal.R.styleable.OffHostApduService_requireDeviceScreenOn,
+                        false);
                 mBannerResourceId = sa.getResourceId(
                         com.android.internal.R.styleable.OffHostApduService_apduServiceBanner, -1);
                 mSettingsActivityName = sa.getString(
@@ -420,6 +446,13 @@
         return mRequiresDeviceUnlock;
     }
 
+    /**
+     * Returns whether this service should only be started when the device is screen on.
+     */
+    public boolean requiresScreenOn() {
+        return mRequiresDeviceScreenOn;
+    }
+
     @UnsupportedAppUsage
     public String getDescription() {
         return mDescription;
@@ -543,6 +576,7 @@
             dest.writeTypedList(new ArrayList<AidGroup>(mDynamicAidGroups.values()));
         }
         dest.writeInt(mRequiresDeviceUnlock ? 1 : 0);
+        dest.writeInt(mRequiresDeviceScreenOn ? 1 : 0);
         dest.writeInt(mBannerResourceId);
         dest.writeInt(mUid);
         dest.writeString(mSettingsActivityName);
@@ -569,11 +603,12 @@
                 source.readTypedList(dynamicAidGroups, AidGroup.CREATOR);
             }
             boolean requiresUnlock = source.readInt() != 0;
+            boolean requiresScreenOn = source.readInt() != 0;
             int bannerResource = source.readInt();
             int uid = source.readInt();
             String settingsActivityName = source.readString();
             return new ApduServiceInfo(info, onHost, description, staticAidGroups,
-                    dynamicAidGroups, requiresUnlock, bannerResource, uid,
+                    dynamicAidGroups, requiresUnlock, requiresScreenOn, bannerResource, uid,
                     settingsActivityName, offHostName, staticOffHostName);
         }
 
@@ -608,6 +643,8 @@
             }
         }
         pw.println("    Settings Activity: " + mSettingsActivityName);
+        pw.println("    Requires Device Unlock: " + mRequiresDeviceUnlock);
+        pw.println("    Requires Device ScreenOn: " + mRequiresDeviceScreenOn);
     }
 
     /**
diff --git a/core/java/android/os/BatteryConsumer.java b/core/java/android/os/BatteryConsumer.java
index 3956ef9..c476a59 100644
--- a/core/java/android/os/BatteryConsumer.java
+++ b/core/java/android/os/BatteryConsumer.java
@@ -51,6 +51,17 @@
     public static final int LAST_CUSTOM_POWER_COMPONENT_ID = 9999;
 
     /**
+     * Modeled power components are used for testing only.  They are returned if the
+     * {@link BatteryUsageStatsQuery#FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED} is set.
+     * The modeled power components are retrieved with {@link #getConsumedPowerForCustomComponent}.
+     * The ID of a modeled power component is calculated as
+     * (FIRST_MODELED_POWER_COMPONENT_ID + powerComponentId), e.g.
+     * FIRST_MODELED_POWER_COMPONENT_ID + POWER_COMPONENT_CPU.
+     */
+    public static final int FIRST_MODELED_POWER_COMPONENT_ID = 10000;
+    public static final int LAST_MODELED_POWER_COMPONENT_ID = 19999;
+
+    /**
      * Time usage component, describing the particular part of the system
      * that was used for the corresponding amount of time.
      *
@@ -137,9 +148,10 @@
     protected abstract static class BaseBuilder<T extends BaseBuilder<?>> {
         final PowerComponents.Builder mPowerComponentsBuilder;
 
-        public BaseBuilder(int customPowerComponentCount, int customTimeComponentCount) {
+        public BaseBuilder(int customPowerComponentCount, int customTimeComponentCount,
+                boolean includeModeledComponents) {
             mPowerComponentsBuilder = new PowerComponents.Builder(customPowerComponentCount,
-                    customTimeComponentCount);
+                    customTimeComponentCount, includeModeledComponents);
         }
 
         /**
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 9c2ae4e..a89de01 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -27,6 +27,7 @@
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
+import android.location.GnssSignalQuality;
 import android.os.BatteryStatsManager.WifiState;
 import android.os.BatteryStatsManager.WifiSupplState;
 import android.server.ServerProtoEnums;
@@ -47,7 +48,6 @@
 import android.view.Display;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.location.gnssmetrics.GnssMetrics;
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatteryStatsHelper;
 
@@ -5087,8 +5087,9 @@
         final String[] gpsSignalQualityDescription = new String[]{
             "poor (less than 20 dBHz): ",
             "good (greater than 20 dBHz): "};
-        final int numGpsSignalQualityBins = Math.min(GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS,
-            gpsSignalQualityDescription.length);
+        final int numGpsSignalQualityBins = Math.min(
+                GnssSignalQuality.NUM_GNSS_SIGNAL_QUALITY_LEVELS,
+                gpsSignalQualityDescription.length);
         for (int i=0; i<numGpsSignalQualityBins; i++) {
             final long time = getGpsSignalQualityTime(i, rawRealtime, which);
             sb.append("\n    ");
diff --git a/core/java/android/os/BatteryStatsManager.java b/core/java/android/os/BatteryStatsManager.java
index d9e01cd..3191eda 100644
--- a/core/java/android/os/BatteryStatsManager.java
+++ b/core/java/android/os/BatteryStatsManager.java
@@ -160,6 +160,7 @@
         mBatteryStats = batteryStats;
     }
 
+
     /**
      * Returns BatteryUsageStats, which contains power attribution data on a per-subsystem
      * and per-UID basis.
@@ -169,8 +170,20 @@
     @RequiresPermission(android.Manifest.permission.BATTERY_STATS)
     @NonNull
     public BatteryUsageStats getBatteryUsageStats() {
+        return getBatteryUsageStats(BatteryUsageStatsQuery.DEFAULT);
+    }
+
+    /**
+     * Returns BatteryUsageStats, which contains power attribution data on a per-subsystem
+     * and per-UID basis.
+     *
+     * @hide
+     */
+    @RequiresPermission(android.Manifest.permission.BATTERY_STATS)
+    @NonNull
+    public BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
         try {
-            return mBatteryStats.getBatteryUsageStats();
+            return mBatteryStats.getBatteryUsageStats(query);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java
index af8e8de..a6df87d 100644
--- a/core/java/android/os/BatteryUsageStats.java
+++ b/core/java/android/os/BatteryUsageStats.java
@@ -114,6 +114,7 @@
     public static final class Builder {
         private final int mCustomPowerComponentCount;
         private final int mCustomTimeComponentCount;
+        private final boolean mIncludeModeledComponents;
         private double mConsumedPower;
         private int mDischargePercentage;
         private final SparseArray<UidBatteryConsumer.Builder> mUidBatteryConsumerBuilders =
@@ -121,9 +122,11 @@
         private final SparseArray<SystemBatteryConsumer.Builder> mSystemBatteryConsumerBuilders =
                 new SparseArray<>();
 
-        public Builder(int customPowerComponentCount, int customTimeComponentCount) {
+        public Builder(int customPowerComponentCount, int customTimeComponentCount,
+                boolean includeModeledComponents) {
             mCustomPowerComponentCount = customPowerComponentCount;
             mCustomTimeComponentCount = customTimeComponentCount;
+            mIncludeModeledComponents = includeModeledComponents;
         }
 
         /**
@@ -166,7 +169,7 @@
             UidBatteryConsumer.Builder builder = mUidBatteryConsumerBuilders.get(uid);
             if (builder == null) {
                 builder = new UidBatteryConsumer.Builder(mCustomPowerComponentCount,
-                        mCustomTimeComponentCount, batteryStatsUid);
+                        mCustomTimeComponentCount, mIncludeModeledComponents, batteryStatsUid);
                 mUidBatteryConsumerBuilders.put(uid, builder);
             }
             return builder;
@@ -182,7 +185,7 @@
             SystemBatteryConsumer.Builder builder = mSystemBatteryConsumerBuilders.get(drainType);
             if (builder == null) {
                 builder = new SystemBatteryConsumer.Builder(mCustomPowerComponentCount,
-                        mCustomTimeComponentCount, drainType);
+                        mCustomTimeComponentCount, mIncludeModeledComponents, drainType);
                 mSystemBatteryConsumerBuilders.put(drainType, builder);
             }
             return builder;
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java b/core/java/android/os/BatteryUsageStatsQuery.aidl
similarity index 62%
copy from media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java
copy to core/java/android/os/BatteryUsageStatsQuery.aidl
index 52f2787..207396c 100644
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java
+++ b/core/java/android/os/BatteryUsageStatsQuery.aidl
@@ -14,19 +14,6 @@
  * limitations under the License.
  */
 
-package com.android.mediatranscodingtest;
+package android.os;
 
-/**
- *
- * This class has the names of the all the activity name and variables in the
- * instrumentation test.
- *
- */
-public class MediaConstants {
-    /*
-     * Source test files.
-     */
-    public static final String[] SOURCE_HEVC_VIDEO_ONLY_TEST_FILES = {
-        "/sdcard/media_api/video/VideoOnlyHEVC.mp4",
-    };
-}
+parcelable BatteryUsageStatsQuery;
diff --git a/core/java/android/os/BatteryUsageStatsQuery.java b/core/java/android/os/BatteryUsageStatsQuery.java
new file mode 100644
index 0000000..9a00679
--- /dev/null
+++ b/core/java/android/os/BatteryUsageStatsQuery.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Query parameters for the {@link BatteryStatsManager#getBatteryUsageStats()} call.
+ *
+ * @hide
+ */
+public final class BatteryUsageStatsQuery implements Parcelable {
+
+    @NonNull
+    public static final BatteryUsageStatsQuery DEFAULT =
+            new BatteryUsageStatsQuery.Builder().build();
+
+    /**
+     * Flags for the {@link BatteryStatsManager#getBatteryUsageStats()} method.
+     * @hide
+     */
+    @IntDef(flag = true, prefix = { "FLAG_BATTERY_USAGE_STATS_" }, value = {
+            FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface BatteryUsageStatsFlags {}
+
+    /**
+     * Indicates that modeled battery usage stats should be returned along with
+     * measured ones.
+     *
+     * @hide
+     */
+    public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED = 1;
+
+    private final int mFlags;
+
+    private BatteryUsageStatsQuery(@NonNull Builder builder) {
+        mFlags = builder.mFlags;
+    }
+
+    @BatteryUsageStatsFlags
+    public int getFlags() {
+        return mFlags;
+    }
+
+    private BatteryUsageStatsQuery(Parcel in) {
+        mFlags = in.readInt();
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(mFlags);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @NonNull
+    public static final Creator<BatteryUsageStatsQuery> CREATOR =
+            new Creator<BatteryUsageStatsQuery>() {
+                @Override
+                public BatteryUsageStatsQuery createFromParcel(Parcel in) {
+                    return new BatteryUsageStatsQuery(in);
+                }
+
+                @Override
+                public BatteryUsageStatsQuery[] newArray(int size) {
+                    return new BatteryUsageStatsQuery[size];
+                }
+            };
+
+    /**
+     * Builder for BatteryUsageStatsQuery.
+     */
+    public static final class Builder {
+        private int mFlags;
+
+        /**
+         * Builds a read-only BatteryUsageStatsQuery object.
+         */
+        public BatteryUsageStatsQuery build() {
+            return new BatteryUsageStatsQuery(this);
+        }
+
+        /**
+         * Sets flags to modify the behavior of {@link BatteryStatsManager#getBatteryUsageStats}.
+         */
+        public Builder setFlags(@BatteryUsageStatsFlags int flags) {
+            mFlags = flags;
+            return this;
+        }
+
+        /**
+         * Requests to include modeled battery usage stats along with measured ones.
+         * Should only be used for testing and debugging.
+         */
+        public Builder includeModeled() {
+            mFlags |= BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED;
+            return this;
+        }
+    }
+}
diff --git a/core/java/android/os/FileBridge.java b/core/java/android/os/FileBridge.java
index ab5637c..7b84575 100644
--- a/core/java/android/os/FileBridge.java
+++ b/core/java/android/os/FileBridge.java
@@ -22,11 +22,12 @@
 import android.system.Os;
 import android.util.Log;
 
+import com.android.internal.util.ArrayUtils;
+
 import libcore.io.IoBridge;
 import libcore.io.IoUtils;
 import libcore.io.Memory;
 import libcore.io.Streams;
-import libcore.util.ArrayUtils;
 
 import java.io.FileDescriptor;
 import java.io.IOException;
diff --git a/core/java/android/os/IRecoverySystem.aidl b/core/java/android/os/IRecoverySystem.aidl
index 2561e1e..5f8b932 100644
--- a/core/java/android/os/IRecoverySystem.aidl
+++ b/core/java/android/os/IRecoverySystem.aidl
@@ -27,7 +27,8 @@
     boolean setupBcb(in String command);
     boolean clearBcb();
     void rebootRecoveryWithCommand(in String command);
-    boolean requestLskf(in String updateToken, in IntentSender sender);
-    boolean clearLskf();
-    boolean rebootWithLskf(in String updateToken, in String reason);
+    boolean requestLskf(in String packageName, in IntentSender sender);
+    boolean clearLskf(in String packageName);
+    boolean isLskfCaptured(in String packageName);
+    boolean rebootWithLskf(in String packageName, in String reason, in boolean slotSwitch);
 }
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 5242750..fc65090 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -34,11 +34,11 @@
 import android.util.SparseIntArray;
 
 import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.ArrayUtils;
 
 import dalvik.annotation.optimization.CriticalNative;
 import dalvik.annotation.optimization.FastNative;
 
-import libcore.util.ArrayUtils;
 import libcore.util.SneakyThrow;
 
 import java.io.ByteArrayInputStream;
diff --git a/core/java/android/os/PowerComponents.java b/core/java/android/os/PowerComponents.java
index c18fff6..4a73b24 100644
--- a/core/java/android/os/PowerComponents.java
+++ b/core/java/android/os/PowerComponents.java
@@ -13,10 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package android.os;
 
-
 import android.annotation.NonNull;
 
 /**
@@ -26,19 +24,31 @@
  * @hide
  */
 class PowerComponents {
+    private static final int CUSTOM_POWER_COMPONENT_OFFSET = BatteryConsumer.POWER_COMPONENT_COUNT
+            - BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID;
+    public static final int CUSTOM_TIME_COMPONENT_OFFSET = BatteryConsumer.TIME_COMPONENT_COUNT
+            - BatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID;
 
     private final double mTotalPowerConsumed;
     private final double[] mPowerComponents;
     private final long[] mTimeComponents;
+    private final int mCustomPowerComponentCount;
+    private final int mModeledPowerComponentOffset;
 
     PowerComponents(@NonNull Builder builder) {
         mTotalPowerConsumed = builder.mTotalPowerConsumed;
+        mCustomPowerComponentCount = builder.mCustomPowerComponentCount;
+        mModeledPowerComponentOffset = builder.mModeledPowerComponentOffset;
         mPowerComponents = builder.mPowerComponents;
         mTimeComponents = builder.mTimeComponents;
     }
 
     PowerComponents(@NonNull Parcel source) {
         mTotalPowerConsumed = source.readDouble();
+        mCustomPowerComponentCount = source.readInt();
+        mModeledPowerComponentOffset =
+                BatteryConsumer.POWER_COMPONENT_COUNT + mCustomPowerComponentCount
+                        - BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID;
         mPowerComponents = source.createDoubleArray();
         mTimeComponents = source.createLongArray();
     }
@@ -46,6 +56,7 @@
     /** Writes contents to Parcel */
     void writeToParcel(@NonNull Parcel dest, int flags) {
         dest.writeDouble(mTotalPowerConsumed);
+        dest.writeInt(mCustomPowerComponentCount);
         dest.writeDoubleArray(mPowerComponents);
         dest.writeLongArray(mTimeComponents);
     }
@@ -64,7 +75,7 @@
      *                    {@link BatteryConsumer#POWER_COMPONENT_CPU}.
      * @return Amount of consumed power in mAh.
      */
-    public double getConsumedPower(@UidBatteryConsumer.PowerComponent int componentId) {
+    public double getConsumedPower(@BatteryConsumer.PowerComponent int componentId) {
         if (componentId >= BatteryConsumer.POWER_COMPONENT_COUNT) {
             throw new IllegalArgumentException(
                     "Unsupported power component ID: " + componentId);
@@ -83,15 +94,23 @@
      * @return Amount of consumed power in mAh.
      */
     public double getConsumedPowerForCustomComponent(int componentId) {
-        if (componentId < BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID) {
-            throw new IllegalArgumentException(
-                    "Unsupported custom power component ID: " + componentId);
-        }
-        try {
-            return mPowerComponents[
-                    BatteryConsumer.POWER_COMPONENT_COUNT + componentId
-                            - BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID];
-        } catch (ArrayIndexOutOfBoundsException e) {
+        if (componentId >= BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID
+                && componentId < BatteryConsumer.LAST_CUSTOM_POWER_COMPONENT_ID) {
+            try {
+                return mPowerComponents[CUSTOM_POWER_COMPONENT_OFFSET + componentId];
+            } catch (ArrayIndexOutOfBoundsException e) {
+                throw new IllegalArgumentException(
+                        "Unsupported custom power component ID: " + componentId);
+            }
+        } else if (componentId >= BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
+                && componentId < BatteryConsumer.LAST_MODELED_POWER_COMPONENT_ID) {
+            try {
+                return mPowerComponents[mModeledPowerComponentOffset + componentId];
+            } catch (ArrayIndexOutOfBoundsException e) {
+                throw new IllegalArgumentException(
+                        "Unsupported modeled power component ID: " + componentId);
+            }
+        } else {
             throw new IllegalArgumentException(
                     "Unsupported custom power component ID: " + componentId);
         }
@@ -101,11 +120,11 @@
      * 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 UidBatteryConsumer#TIME_COMPONENT_CPU}.
+     *                    {@link BatteryConsumer#TIME_COMPONENT_CPU}.
      * @return Amount of time in milliseconds.
      */
-    public long getUsageDurationMillis(@UidBatteryConsumer.TimeComponent int componentId) {
-        if (componentId >= UidBatteryConsumer.TIME_COMPONENT_COUNT) {
+    public long getUsageDurationMillis(@BatteryConsumer.TimeComponent int componentId) {
+        if (componentId >= BatteryConsumer.TIME_COMPONENT_COUNT) {
             throw new IllegalArgumentException(
                     "Unsupported time component ID: " + componentId);
         }
@@ -123,14 +142,12 @@
      * @return Amount of time in milliseconds.
      */
     public long getUsageDurationForCustomComponentMillis(int componentId) {
-        if (componentId < UidBatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID) {
+        if (componentId < BatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID) {
             throw new IllegalArgumentException(
                     "Unsupported custom time component ID: " + componentId);
         }
         try {
-            return mTimeComponents[
-                    UidBatteryConsumer.TIME_COMPONENT_COUNT + componentId
-                            - UidBatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID];
+            return mTimeComponents[CUSTOM_TIME_COMPONENT_OFFSET + componentId];
         } catch (ArrayIndexOutOfBoundsException e) {
             throw new IllegalArgumentException(
                     "Unsupported custom time component ID: " + componentId);
@@ -143,13 +160,24 @@
     static final class Builder {
         private double mTotalPowerConsumed;
         private final double[] mPowerComponents;
+        private final int mCustomPowerComponentCount;
         private final long[] mTimeComponents;
+        private final int mModeledPowerComponentOffset;
 
-        Builder(int customPowerComponentCount, int customTimeComponentCount) {
-            mPowerComponents = new double[UidBatteryConsumer.POWER_COMPONENT_COUNT
-                    + customPowerComponentCount];
-            mTimeComponents = new long[UidBatteryConsumer.TIME_COMPONENT_COUNT
-                    + customTimeComponentCount];
+        Builder(int customPowerComponentCount, int customTimeComponentCount,
+                boolean includeModeledPowerComponents) {
+            mCustomPowerComponentCount = customPowerComponentCount;
+            int powerComponentCount =
+                    BatteryConsumer.POWER_COMPONENT_COUNT + customPowerComponentCount;
+            if (includeModeledPowerComponents) {
+                powerComponentCount += BatteryConsumer.POWER_COMPONENT_COUNT;
+            }
+            mPowerComponents = new double[powerComponentCount];
+            mModeledPowerComponentOffset =
+                    BatteryConsumer.POWER_COMPONENT_COUNT + mCustomPowerComponentCount
+                            - BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID;
+            mTimeComponents =
+                    new long[BatteryConsumer.TIME_COMPONENT_COUNT + customTimeComponentCount];
         }
 
         /**
@@ -169,7 +197,7 @@
          * @param componentPower Amount of consumed power in mAh.
          */
         @NonNull
-        public Builder setConsumedPower(@UidBatteryConsumer.PowerComponent int componentId,
+        public Builder setConsumedPower(@BatteryConsumer.PowerComponent int componentId,
                 double componentPower) {
             if (componentId >= BatteryConsumer.POWER_COMPONENT_COUNT) {
                 throw new IllegalArgumentException(
@@ -192,14 +220,23 @@
          */
         @NonNull
         public Builder setConsumedPowerForCustomComponent(int componentId, double componentPower) {
-            if (componentId < BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID) {
-                throw new IllegalArgumentException(
-                        "Unsupported custom power component ID: " + componentId);
-            }
-            try {
-                mPowerComponents[BatteryConsumer.POWER_COMPONENT_COUNT + componentId
-                        - BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID] = componentPower;
-            } catch (ArrayIndexOutOfBoundsException e) {
+            if (componentId >= BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID
+                    && componentId < BatteryConsumer.LAST_CUSTOM_POWER_COMPONENT_ID) {
+                try {
+                    mPowerComponents[CUSTOM_POWER_COMPONENT_OFFSET + componentId] = componentPower;
+                } catch (ArrayIndexOutOfBoundsException e) {
+                    throw new IllegalArgumentException(
+                            "Unsupported custom power component ID: " + componentId);
+                }
+            } else if (componentId >= BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
+                    && componentId < BatteryConsumer.LAST_MODELED_POWER_COMPONENT_ID) {
+                try {
+                    mPowerComponents[mModeledPowerComponentOffset + componentId] = componentPower;
+                } catch (ArrayIndexOutOfBoundsException e) {
+                    throw new IllegalArgumentException(
+                            "Unsupported modeled power component ID: " + componentId);
+                }
+            } else {
                 throw new IllegalArgumentException(
                         "Unsupported custom power component ID: " + componentId);
             }
@@ -210,13 +247,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}.
+         *                                     {@link BatteryConsumer#TIME_COMPONENT_CPU}.
          * @param componentUsageDurationMillis Amount of time in milliseconds.
          */
         @NonNull
-        public Builder setUsageDurationMillis(@UidBatteryConsumer.TimeComponent int componentId,
+        public Builder setUsageDurationMillis(@BatteryConsumer.TimeComponent int componentId,
                 long componentUsageDurationMillis) {
-            if (componentId >= UidBatteryConsumer.TIME_COMPONENT_COUNT) {
+            if (componentId >= BatteryConsumer.TIME_COMPONENT_COUNT) {
                 throw new IllegalArgumentException(
                         "Unsupported time component ID: " + componentId);
             }
@@ -238,13 +275,12 @@
         @NonNull
         public Builder setUsageDurationForCustomComponentMillis(int componentId,
                 long componentUsageDurationMillis) {
-            if (componentId < UidBatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID) {
+            if (componentId < BatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID) {
                 throw new IllegalArgumentException(
                         "Unsupported custom time component ID: " + componentId);
             }
             try {
-                mTimeComponents[UidBatteryConsumer.TIME_COMPONENT_COUNT + componentId
-                        - UidBatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID] =
+                mTimeComponents[CUSTOM_TIME_COMPONENT_OFFSET + componentId] =
                         componentUsageDurationMillis;
             } catch (ArrayIndexOutOfBoundsException e) {
                 throw new IllegalArgumentException(
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 72cd8ba..5f3cfa3 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -631,31 +631,35 @@
     /**
      * Prepare to apply an unattended update by asking the user for their Lock Screen Knowledge
      * Factor (LSKF). If supplied, the {@code intentSender} will be called when the system is setup
-     * and ready to apply the OTA.
-     * <p>
-     * When the system is already prepared for update and this API is called again with the same
-     * {@code updateToken}, it will not call the intent sender nor request the user enter their Lock
-     * Screen Knowledge Factor.
-     * <p>
-     * When this API is called again with a different {@code updateToken}, the prepared-for-update
-     * status is reset and process repeats as though it's the initial call to this method as
-     * described in the first paragraph.
+     * and ready to apply the OTA. This API is expected to handle requests from multiple clients
+     * simultaneously, e.g. from ota and mainline.
+     *
+     * <p> The behavior of multi-client Resume on Reboot works as follows
+     * <li> Each client should call this function to prepare for Resume on Reboot before calling
+     *      {@link #rebootAndApply(Context, String, boolean)} </li>
+     * <li> One client cannot clear the Resume on Reboot preparation of another client. </li>
+     * <li> If multiple clients have prepared for Resume on Reboot, the subsequent reboot will be
+     *      first come, first served. </li>
      *
      * @param context the Context to use.
-     * @param updateToken token used to indicate which update was prepared
+     * @param updateToken this parameter is deprecated and won't be used. Callers can supply with
+     *                    an empty string. See details in
+     *                    <a href="http://go/multi-client-ror">http://go/multi-client-ror</a>
+     *                    TODO(xunchang) update the link of document with the public doc.
      * @param intentSender the intent to call when the update is prepared; may be {@code null}
      * @throws IOException if there were any errors setting up unattended update
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.RECOVERY)
+    @RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
+            android.Manifest.permission.REBOOT})
     public static void prepareForUnattendedUpdate(@NonNull Context context,
             @NonNull String updateToken, @Nullable IntentSender intentSender) throws IOException {
         if (updateToken == null) {
             throw new NullPointerException("updateToken == null");
         }
         RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE);
-        if (!rs.requestLskf(updateToken, intentSender)) {
+        if (!rs.requestLskf(context.getPackageName(), intentSender)) {
             throw new IOException("preparation for update failed");
         }
     }
@@ -664,27 +668,32 @@
      * Request that any previously requested Lock Screen Knowledge Factor (LSKF) is cleared and
      * the preparation for unattended update is reset.
      *
+     * <p> Note that the API won't clear the underlying Resume on Reboot preparation state if
+     * another client has requested. So the reboot call from the other client can still succeed.
+     *
      * @param context the Context to use.
      * @throws IOException if there were any errors clearing the unattended update state
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.RECOVERY)
+    @RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
+            android.Manifest.permission.REBOOT})
     public static void clearPrepareForUnattendedUpdate(@NonNull Context context)
             throws IOException {
         RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE);
-        if (!rs.clearLskf()) {
+        if (!rs.clearLskf(context.getPackageName())) {
             throw new IOException("could not reset unattended update state");
         }
     }
 
     /**
-     * Request that the device reboot and apply the update that has been prepared. The
-     * {@code updateToken} must match what was given for {@link #prepareForUnattendedUpdate} or
-     * this will return {@code false}.
+     * Request that the device reboot and apply the update that has been prepared. Callers are
+     * recommended to use {@link #rebootAndApply(Context, String, boolean)} instead.
      *
      * @param context the Context to use.
-     * @param updateToken the token used to call {@link #prepareForUnattendedUpdate} before
+     * @param updateToken this parameter is deprecated and won't be used. See details in
+     *                    <a href="http://go/multi-client-ror">http://go/multi-client-ror</a>
+     *                    TODO(xunchang) update the link of document with the public doc.
      * @param reason the reboot reason to give to the {@link PowerManager}
      * @throws IOException if the reboot couldn't proceed because the device wasn't ready for an
      *               unattended reboot or if the {@code updateToken} did not match the previously
@@ -692,14 +701,55 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.RECOVERY)
+    @RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
+            android.Manifest.permission.REBOOT})
     public static void rebootAndApply(@NonNull Context context, @NonNull String updateToken,
             @NonNull String reason) throws IOException {
         if (updateToken == null) {
             throw new NullPointerException("updateToken == null");
         }
         RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE);
-        if (!rs.rebootWithLskf(updateToken, reason)) {
+        // OTA is the sole user before S, and a slot switch is required for ota update.
+        if (!rs.rebootWithLskf(context.getPackageName(), reason, true)) {
+            throw new IOException("system not prepared to apply update");
+        }
+    }
+
+    /**
+     * Query if Resume on Reboot has been prepared for a given caller.
+     *
+     * @param context the Context to use.
+     * @throws IOException if there were any errors connecting to the service or querying the state.
+     * @hide
+     */
+    @SystemApi
+    @RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
+            android.Manifest.permission.REBOOT})
+    public static boolean isPreparedForUnattendedUpdate(@NonNull Context context)
+            throws IOException {
+        RecoverySystem rs = context.getSystemService(RecoverySystem.class);
+        return rs.isLskfCaptured(context.getPackageName());
+    }
+
+    /**
+     * Request that the device reboot and apply the update that has been prepared.
+     * {@link #prepareForUnattendedUpdate} must be called before for the given client,
+     * otherwise the function call will fail.
+     *
+     * @param context the Context to use.
+     * @param reason the reboot reason to give to the {@link PowerManager}
+     * @param slotSwitch true if the caller intends to switch the slot on an A/B device.
+     * @throws IOException if the reboot couldn't proceed because the device wasn't ready for an
+     *               unattended reboot.
+     * @hide
+     */
+    @SystemApi
+    @RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
+            android.Manifest.permission.REBOOT})
+    public static void rebootAndApply(@NonNull Context context,
+            @NonNull String reason, boolean slotSwitch) throws IOException {
+        RecoverySystem rs = context.getSystemService(RecoverySystem.class);
+        if (!rs.rebootWithLskf(context.getPackageName(), reason, slotSwitch)) {
             throw new IOException("system not prepared to apply update");
         }
     }
@@ -1291,16 +1341,15 @@
     /**
      * Begins the process of asking the user for the Lock Screen Knowledge Factor.
      *
-     * @param updateToken token that will be used in calls to {@link #rebootAndApply} to ensure
-     *                    that the preparation was for the correct update
+     * @param packageName the package name of the caller who requests Resume on Reboot
      * @return true if the request was correct
      * @throws IOException if the recovery system service could not be contacted
      */
-    private boolean requestLskf(String updateToken, IntentSender sender) throws IOException {
+    private boolean requestLskf(String packageName, IntentSender sender) throws IOException {
         try {
-            return mService.requestLskf(updateToken, sender);
+            return mService.requestLskf(packageName, sender);
         } catch (RemoteException e) {
-            throw new IOException("could request update");
+            throw new IOException("could request LSKF capture");
         }
     }
 
@@ -1310,22 +1359,37 @@
      * @return true if the setup for OTA was cleared
      * @throws IOException if the recovery system service could not be contacted
      */
-    private boolean clearLskf() throws IOException {
+    private boolean clearLskf(String packageName) throws IOException {
         try {
-            return mService.clearLskf();
+            return mService.clearLskf(packageName);
         } catch (RemoteException e) {
             throw new IOException("could not clear LSKF");
         }
     }
 
     /**
+     * Queries if the Resume on Reboot has been prepared for a given caller.
+     *
+     * @param packageName the identifier of the caller who requests Resume on Reboot
+     * @return true if Resume on Reboot is prepared.
+     * @throws IOException if the recovery system service could not be contacted
+     */
+    private boolean isLskfCaptured(String packageName) throws IOException {
+        try {
+            return mService.isLskfCaptured(packageName);
+        } catch (RemoteException e) {
+            throw new IOException("could not get LSKF capture state");
+        }
+    }
+
+    /**
      * Calls the recovery system service to reboot and apply update.
      *
-     * @param updateToken the update token for which the update was prepared
      */
-    private boolean rebootWithLskf(String updateToken, String reason) throws IOException {
+    private boolean rebootWithLskf(String packageName, String reason, boolean slotSwitch)
+            throws IOException {
         try {
-            return mService.rebootWithLskf(updateToken, reason);
+            return mService.rebootWithLskf(packageName, reason, slotSwitch);
         } catch (RemoteException e) {
             throw new IOException("could not reboot for update");
         }
diff --git a/core/java/android/os/SystemBatteryConsumer.java b/core/java/android/os/SystemBatteryConsumer.java
index 570a2dc..bda2f23 100644
--- a/core/java/android/os/SystemBatteryConsumer.java
+++ b/core/java/android/os/SystemBatteryConsumer.java
@@ -120,8 +120,8 @@
         private final int mDrainType;
 
         Builder(int customPowerComponentCount, int customTimeComponentCount,
-                @DrainType int drainType) {
-            super(customPowerComponentCount, customTimeComponentCount);
+                boolean includeModeledComponents, @DrainType int drainType) {
+            super(customPowerComponentCount, customTimeComponentCount, includeModeledComponents);
             mDrainType = drainType;
         }
 
diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java
index 06cf4a6..c5da22b 100644
--- a/core/java/android/os/UidBatteryConsumer.java
+++ b/core/java/android/os/UidBatteryConsumer.java
@@ -86,8 +86,8 @@
         private String mPackageWithHighestDrain;
 
         public Builder(int customPowerComponentCount, int customTimeComponentCount,
-                BatteryStats.Uid batteryStatsUid) {
-            super(customPowerComponentCount, customTimeComponentCount);
+                boolean includeModeledComponents, BatteryStats.Uid batteryStatsUid) {
+            super(customPowerComponentCount, customTimeComponentCount, includeModeledComponents);
             mBatteryStatsUid = batteryStatsUid;
             mUid = batteryStatsUid.getUid();
         }
diff --git a/core/java/android/os/connectivity/GpsBatteryStats.java b/core/java/android/os/connectivity/GpsBatteryStats.java
index ef03caa..5e21bd3 100644
--- a/core/java/android/os/connectivity/GpsBatteryStats.java
+++ b/core/java/android/os/connectivity/GpsBatteryStats.java
@@ -15,11 +15,10 @@
  */
 package android.os.connectivity;
 
+import android.location.GnssSignalQuality;
 import android.os.Parcel;
 import android.os.Parcelable;
 
-import com.android.internal.location.gnssmetrics.GnssMetrics;
-
 import java.util.Arrays;
 
 /**
@@ -85,7 +84,7 @@
 
   public void setTimeInGpsSignalQualityLevel(long[] t) {
     mTimeInGpsSignalQualityLevel = Arrays.copyOfRange(t, 0,
-        Math.min(t.length, GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS));
+        Math.min(t.length, GnssSignalQuality.NUM_GNSS_SIGNAL_QUALITY_LEVELS));
     return;
   }
 
@@ -102,7 +101,7 @@
   private void initialize() {
     mLoggingDurationMs = 0;
     mEnergyConsumedMaMs = 0;
-    mTimeInGpsSignalQualityLevel = new long[GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS];
+    mTimeInGpsSignalQualityLevel = new long[GnssSignalQuality.NUM_GNSS_SIGNAL_QUALITY_LEVELS];
     return;
   }
 }
\ No newline at end of file
diff --git a/core/java/android/os/storage/StorageManagerInternal.java b/core/java/android/os/storage/StorageManagerInternal.java
index 55ba15a..b12bb2e 100644
--- a/core/java/android/os/storage/StorageManagerInternal.java
+++ b/core/java/android/os/storage/StorageManagerInternal.java
@@ -101,4 +101,15 @@
      * Return true if uid is external storage service.
      */
     public abstract boolean isExternalStorageService(int uid);
+
+    /**
+     * Frees cache held by ExternalStorageService.
+     *
+     * <p> Blocks until the service frees the cache or fails in doing so.
+     *
+     * @param volumeUuid uuid of the {@link StorageVolume} from which cache needs to be freed,
+     *                   null value indicates private internal volume.
+     * @param bytes number of bytes which need to be freed
+     */
+    public abstract void freeCache(@Nullable String volumeUuid, long bytes);
 }
diff --git a/core/java/android/provider/OWNERS b/core/java/android/provider/OWNERS
index 792ff20..b02102b 100644
--- a/core/java/android/provider/OWNERS
+++ b/core/java/android/provider/OWNERS
@@ -1,9 +1,17 @@
-per-file DeviceConfig.java = svetoslavganov@google.com
-per-file DeviceConfig.java = hackbod@google.com
-per-file DeviceConfig.java = schfan@google.com
+per-file *BlockedNumber* = file:/telephony/OWNERS
+per-file *Telephony* = file:/telephony/OWNERS
 
-per-file CallLog.java = file:/telephony/OWNERS
-per-file DocumentsContract.java = file:/core/java/android/os/storage/OWNERS
-per-file DocumentsProvider.java = file:/core/java/android/os/storage/OWNERS
-per-file MediaStore.java = file:/core/java/android/os/storage/OWNERS
-per-file Telephony.java = file:/telephony/OWNERS
+per-file *CallLog* = file:platform/packages/providers/ContactsProvider:/OWNERS
+per-file *Contacts* = file:platform/packages/providers/ContactsProvider:/OWNERS
+per-file *Voicemail* = file:platform/packages/providers/ContactsProvider:/OWNERS
+
+per-file *Calendar* = file:platform/packages/providers/CalendarProvider:/OWNERS
+
+per-file *Downloads* = file:platform/packages/providers/DownloadProvider:/OWNERS
+
+per-file *DeviceConfig* = file:/packages/SettingsProvider/OWNERS
+
+per-file *Documents* = file:/core/java/android/os/storage/OWNERS
+per-file *Documents* = file:platform/packages/apps/DocumentsUI:/OWNERS
+
+per-file *Slices* = file:/core/java/android/app/slice/OWNERS
diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java
index 83cab0a..d4c86e8 100644
--- a/core/java/android/provider/Telephony.java
+++ b/core/java/android/provider/Telephony.java
@@ -5280,5 +5280,13 @@
          * @hide
          */
         public static final String COLUMN_ALLOWED_NETWORK_TYPES = "allowed_network_types";
+
+        /**
+         * TelephonyProvider column name for RCS configuration.
+         * <p>TYPE: BLOB
+         *
+         * @hide
+         */
+        public static final String COLUMN_RCS_CONFIG = "rcs_config";
     }
 }
diff --git a/core/java/android/security/OWNERS b/core/java/android/security/OWNERS
index 3f8d75e..7140ff1 100644
--- a/core/java/android/security/OWNERS
+++ b/core/java/android/security/OWNERS
@@ -7,3 +7,5 @@
 per-file NetworkSecurityPolicy.java = klyubin@google.com
 per-file FrameworkNetworkSecurityPolicy.java = cbrubaker@google.com
 per-file FrameworkNetworkSecurityPolicy.java = klyubin@google.com
+per-file Confirmation*.java = jdanis@google.com
+per-file Confirmation*.java = swillden@google.com
diff --git a/core/java/android/service/storage/ExternalStorageService.java b/core/java/android/service/storage/ExternalStorageService.java
index 3b4d84a..0123c36 100644
--- a/core/java/android/service/storage/ExternalStorageService.java
+++ b/core/java/android/service/storage/ExternalStorageService.java
@@ -16,6 +16,7 @@
 
 package android.service.storage;
 
+import android.annotation.BytesLong;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.SdkConstant;
@@ -29,6 +30,7 @@
 import android.os.ParcelableException;
 import android.os.RemoteCallback;
 import android.os.RemoteException;
+import android.os.storage.StorageManager;
 import android.os.storage.StorageVolume;
 
 import com.android.internal.os.BackgroundThread;
@@ -37,6 +39,7 @@
 import java.io.IOException;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.UUID;
 
 /**
  * A service to handle filesystem I/O from other apps.
@@ -147,6 +150,18 @@
      */
     public abstract void onVolumeStateChanged(@NonNull StorageVolume vol) throws IOException;
 
+    /**
+     * Called when any cache held by the ExternalStorageService needs to be freed.
+     *
+     * <p> Blocks until the service frees the cache or fails in doing so.
+     *
+     * @param volumeUuid uuid of the {@link StorageVolume} from which cache needs to be freed
+     * @param bytes number of bytes which need to be freed
+     */
+    public void onFreeCacheRequested(@NonNull UUID volumeUuid, @BytesLong long bytes) {
+        throw new UnsupportedOperationException("onFreeCacheRequested not implemented");
+    }
+
     @Override
     @NonNull
     public final IBinder onBind(@NonNull Intent intent) {
@@ -183,6 +198,19 @@
         }
 
         @Override
+        public void freeCache(String sessionId, String volumeUuid, long bytes,
+                RemoteCallback callback) {
+            mHandler.post(() -> {
+                try {
+                    onFreeCacheRequested(StorageManager.convert(volumeUuid), bytes);
+                    sendResult(sessionId, null /* throwable */, callback);
+                } catch (Throwable t) {
+                    sendResult(sessionId, t, callback);
+                }
+            });
+        }
+
+        @Override
         public void endSession(String sessionId, RemoteCallback callback) throws RemoteException {
             mHandler.post(() -> {
                 try {
diff --git a/core/java/android/service/storage/IExternalStorageService.aidl b/core/java/android/service/storage/IExternalStorageService.aidl
index 30fefd3..d06671b 100644
--- a/core/java/android/service/storage/IExternalStorageService.aidl
+++ b/core/java/android/service/storage/IExternalStorageService.aidl
@@ -30,4 +30,6 @@
     void endSession(@utf8InCpp String sessionId, in RemoteCallback callback);
     void notifyVolumeStateChanged(@utf8InCpp String sessionId, in StorageVolume vol,
         in RemoteCallback callback);
+    void freeCache(@utf8InCpp String sessionId, in String volumeUuid, long bytes,
+        in RemoteCallback callback);
 }
\ No newline at end of file
diff --git a/core/java/android/service/storage/OWNERS b/core/java/android/service/storage/OWNERS
new file mode 100644
index 0000000..6f9dbea
--- /dev/null
+++ b/core/java/android/service/storage/OWNERS
@@ -0,0 +1 @@
+include /core/java/android/os/storage/OWNERS
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java b/core/java/android/service/timezone/ITimeZoneProvider.aidl
similarity index 63%
rename from media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java
rename to core/java/android/service/timezone/ITimeZoneProvider.aidl
index 52f2787..62fa157 100644
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java
+++ b/core/java/android/service/timezone/ITimeZoneProvider.aidl
@@ -14,19 +14,15 @@
  * limitations under the License.
  */
 
-package com.android.mediatranscodingtest;
+package android.service.timezone;
+
+import android.service.timezone.ITimeZoneProviderManager;
 
 /**
- *
- * This class has the names of the all the activity name and variables in the
- * instrumentation test.
- *
+ * @hide
  */
-public class MediaConstants {
-    /*
-     * Source test files.
-     */
-    public static final String[] SOURCE_HEVC_VIDEO_ONLY_TEST_FILES = {
-        "/sdcard/media_api/video/VideoOnlyHEVC.mp4",
-    };
+oneway interface ITimeZoneProvider {
+    void setTimeZoneProviderManager(in @nullable ITimeZoneProviderManager manager);
+    void startUpdates(in long initializationTimeoutMillis);
+    void stopUpdates();
 }
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java b/core/java/android/service/timezone/ITimeZoneProviderManager.aidl
similarity index 63%
copy from media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java
copy to core/java/android/service/timezone/ITimeZoneProviderManager.aidl
index 52f2787..bf4fe0a 100644
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java
+++ b/core/java/android/service/timezone/ITimeZoneProviderManager.aidl
@@ -14,19 +14,15 @@
  * limitations under the License.
  */
 
-package com.android.mediatranscodingtest;
+package android.service.timezone;
+
+import android.service.timezone.TimeZoneProviderSuggestion;
 
 /**
- *
- * This class has the names of the all the activity name and variables in the
- * instrumentation test.
- *
+ * @hide
  */
-public class MediaConstants {
-    /*
-     * Source test files.
-     */
-    public static final String[] SOURCE_HEVC_VIDEO_ONLY_TEST_FILES = {
-        "/sdcard/media_api/video/VideoOnlyHEVC.mp4",
-    };
+oneway interface ITimeZoneProviderManager {
+    void onTimeZoneProviderSuggestion(in TimeZoneProviderSuggestion timeZoneProviderSuggestion);
+    void onTimeZoneProviderUncertain();
+    void onTimeZoneProviderPermanentFailure(in String failureReason);
 }
diff --git a/core/java/android/service/timezone/TimeZoneProviderService.java b/core/java/android/service/timezone/TimeZoneProviderService.java
new file mode 100644
index 0000000..9533a8f
--- /dev/null
+++ b/core/java/android/service/timezone/TimeZoneProviderService.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.service.timezone;
+
+import android.annotation.DurationMillisLong;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
+import android.app.Service;
+import android.content.Intent;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Log;
+
+import com.android.internal.os.BackgroundThread;
+
+import java.util.Objects;
+
+/**
+ * A service to generate time zone callbacks to the platform. Developers must extend this class.
+ *
+ * <p>Provider implementations are started via a call to {@link #onStartUpdates(long)} and stopped
+ * via a call to {@link #onStopUpdates()}.
+ *
+ * <p>Once started, providers are expected to detect the time zone if possible, and report the
+ * result via {@link #reportSuggestion(TimeZoneProviderSuggestion)} or {@link
+ * #reportUncertain()}. Providers may also report that they have permanently failed
+ * by calling {@link #reportPermanentFailure(Throwable)}. See the javadocs for each
+ * method for details.
+ *
+ * <p>After starting, providers are expected to issue their first callback within the timeout
+ * duration specified in {@link #onStartUpdates(long)}, or they will be implicitly considered to be
+ * uncertain.
+ *
+ * <p>Once stopped or failed, providers are required to stop generating callbacks.
+ *
+ * <p>Provider discovery:
+ *
+ * <p>You must declare the service in your manifest file with the
+ * {@link android.Manifest.permission#INSTALL_LOCATION_TIME_ZONE_PROVIDER} permission,
+ * and include an intent filter with the necessary action indicating what type of provider it is.
+ *
+ * <p>Device configuration can influence how {@link TimeZoneProviderService}s are discovered.
+ * In one mode, there can be multiple {@link TimeZoneProviderService}s configured with the same
+ * action, and the one with the highest "serviceVersion" metadata will be used.
+ *
+ * <p>{@link TimeZoneProviderService}s may be deployed into processes that run once-per-user
+ * or once-per-device (i.e. they service multiple users). The "serviceIsMultiuser" metadata must
+ * be set accordingly.
+ *
+ * <p>Provider types:
+ *
+ * <p>Android currently supports up to two location-derived time zone providers. These are called
+ * the "primary" and "secondary" location time zone provider, configured using {@link
+ * #PRIMARY_LOCATION_TIME_ZONE_PROVIDER_SERVICE_INTERFACE} and {@link
+ * #SECONDARY_LOCATION_TIME_ZONE_PROVIDER_SERVICE_INTERFACE} respectively. The primary location time
+ * zone provider is started first and will be used until becomes uncertain or fails, at which point
+ * the secondary provider will be started.
+ *
+ * For example:
+ * <pre>
+ *     &lt;service android:name=".FooTimeZoneProviderService"
+ *             android:exported="true"
+ *             android:permission="android.permission.INSTALL_LOCATION_TIME_ZONE_PROVIDER"&gt;
+ *         &lt;intent-filter&gt;
+ *             &lt;action
+ *             android:name="android.service.timezone.SecondaryLocationTimeZoneProviderService"
+ *             /&gt;
+ *         &lt;/intent-filter&gt;
+ *         &lt;meta-data android:name="serviceVersion" android:value="1" /&gt;
+ *         &lt;meta-data android:name="serviceIsMultiuser" android:value="true" /&gt;
+ *     &lt;/service&gt;
+ * </pre>
+ *
+ *
+ * <p>Threading:
+ *
+ * <p>Calls to {@code report} methods can be made on on any thread and will be passed asynchronously
+ * to the system server. Calls to {@link #onStartUpdates(long)} and {@link #onStopUpdates()} will
+ * occur on a single thread.
+ *
+ * @hide
+ */
+@SystemApi
+public abstract class TimeZoneProviderService extends Service {
+
+    private static final String TAG = "TimeZoneProviderService";
+
+    private final Handler mHandler = BackgroundThread.getHandler();
+
+    /**
+     * The Intent action that the primary location-derived time zone provider service must respond
+     * to. Add it to the intent filter of the service in its manifest.
+     */
+    @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
+    public static final String PRIMARY_LOCATION_TIME_ZONE_PROVIDER_SERVICE_INTERFACE =
+            "android.service.timezone.PrimaryLocationTimeZoneProviderService";
+
+    /**
+     * The Intent action that the secondary location-based time zone provider service must respond
+     * to. Add it to the intent filter of the service in its manifest.
+     */
+    @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
+    public static final String SECONDARY_LOCATION_TIME_ZONE_PROVIDER_SERVICE_INTERFACE =
+            "android.service.timezone.SecondaryLocationTimeZoneProviderService";
+
+    /**
+     * The permission that a service must require to ensure that only Android system can bind to it.
+     * If this permission is not enforced in the AndroidManifest of the service, the system will
+     * skip that service.
+     */
+    public static final String BIND_PERMISSION =
+            "android.permission.INSTALL_LOCATION_TIME_ZONE_PROVIDER";
+
+    private final TimeZoneProviderServiceWrapper mWrapper = new TimeZoneProviderServiceWrapper();
+
+    /** Set by {@link #mHandler} thread. */
+    @Nullable
+    private ITimeZoneProviderManager mManager;
+
+    @Override
+    @NonNull
+    public final IBinder onBind(@NonNull Intent intent) {
+        return mWrapper;
+    }
+
+    /**
+     * Indicates a successful time zone detection. See {@link TimeZoneProviderSuggestion} for
+     * details.
+     */
+    public final void reportSuggestion(@NonNull TimeZoneProviderSuggestion suggestion) {
+        Objects.requireNonNull(suggestion);
+
+        mHandler.post(() -> {
+            ITimeZoneProviderManager manager = mManager;
+            if (manager != null) {
+                try {
+                    manager.onTimeZoneProviderSuggestion(suggestion);
+                } catch (RemoteException | RuntimeException e) {
+                    Log.w(TAG, e);
+                }
+            }
+        });
+    }
+
+    /**
+     * Indicates the time zone is not known because of an expected runtime state or error, e.g. when
+     * the provider is unable to detect location, or there was a problem when resolving the location
+     * to a time zone.
+     */
+    public final void reportUncertain() {
+        mHandler.post(() -> {
+            ITimeZoneProviderManager manager = mManager;
+            if (manager != null) {
+                try {
+                    manager.onTimeZoneProviderUncertain();
+                } catch (RemoteException | RuntimeException e) {
+                    Log.w(TAG, e);
+                }
+            }
+        });
+    }
+
+    /**
+     * Indicates there was a permanent failure. This is not generally expected, and probably means a
+     * required backend service has been turned down, or the client is unreasonably old.
+     */
+    public final void reportPermanentFailure(@NonNull Throwable cause) {
+        Objects.requireNonNull(cause);
+
+        mHandler.post(() -> {
+            ITimeZoneProviderManager manager = mManager;
+            if (manager != null) {
+                try {
+                    manager.onTimeZoneProviderPermanentFailure(cause.getMessage());
+                } catch (RemoteException | RuntimeException e) {
+                    Log.w(TAG, e);
+                }
+            }
+        });
+    }
+
+    /**
+     * Starts the provider sending updates.
+     */
+    public abstract void onStartUpdates(@DurationMillisLong long initializationTimeoutMillis);
+
+    /**
+     * Stops the provider sending updates.
+     */
+    public abstract void onStopUpdates();
+
+    private class TimeZoneProviderServiceWrapper extends ITimeZoneProvider.Stub {
+
+        @Override
+        public void setTimeZoneProviderManager(ITimeZoneProviderManager manager) {
+            Objects.requireNonNull(manager);
+            mHandler.post(() -> TimeZoneProviderService.this.mManager = manager);
+        }
+
+        public void startUpdates(@DurationMillisLong long initializationTimeoutMillis) {
+            mHandler.post(() -> onStartUpdates(initializationTimeoutMillis));
+        }
+
+        public void stopUpdates() {
+            mHandler.post(TimeZoneProviderService.this::onStopUpdates);
+        }
+    }
+}
diff --git a/core/java/android/service/timezone/TimeZoneProviderSuggestion.aidl b/core/java/android/service/timezone/TimeZoneProviderSuggestion.aidl
new file mode 100644
index 0000000..d0cb73b
--- /dev/null
+++ b/core/java/android/service/timezone/TimeZoneProviderSuggestion.aidl
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.service.timezone;
+
+/**
+ * @hide
+ */
+parcelable TimeZoneProviderSuggestion;
diff --git a/core/java/android/service/timezone/TimeZoneProviderSuggestion.java b/core/java/android/service/timezone/TimeZoneProviderSuggestion.java
new file mode 100644
index 0000000..cf299a7
--- /dev/null
+++ b/core/java/android/service/timezone/TimeZoneProviderSuggestion.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.timezone;
+
+import android.annotation.ElapsedRealtimeLong;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.SystemClock;
+
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * A suggestion from a {@link TimeZoneProviderService} containing zero or more time zones.
+ *
+ * @hide
+ */
+@SystemApi
+public final class TimeZoneProviderSuggestion implements Parcelable {
+
+    @NonNull
+    private final List<String> mTimeZoneIds;
+
+    @ElapsedRealtimeLong
+    private final long mElapsedRealtimeMillis;
+
+    private TimeZoneProviderSuggestion(@NonNull List<String> timeZoneIds,
+            @ElapsedRealtimeLong long elapsedRealtimeMillis) {
+        mTimeZoneIds = immutableList(timeZoneIds);
+        mElapsedRealtimeMillis = elapsedRealtimeMillis;
+    }
+
+    /**
+     * Returns the time of the suggestion in elapsed real-time since system boot. Where possible,
+     * the time should be based on the time of the data used when determining time zone. For
+     * example, if it was based on a {@link android.location.Location} then it should be the time
+     * associated with that location.
+     *
+     * <p>This value is compared to {@link
+     * android.os.SystemClock#elapsedRealtime()}, to calculate the age of a fix and to compare
+     * {@link TimeZoneProviderSuggestion} instances.
+     *
+     * @return elapsed real-time of fix, in milliseconds
+     */
+    @ElapsedRealtimeLong
+    public long getElapsedRealtimeMillis() {
+        return mElapsedRealtimeMillis;
+    }
+
+    /**
+     * Returns the zero or more time zone IDs for this suggestion.
+     *
+     * <p>Time zone IDs are TZDB IDs like "America/Los_Angeles" that would be accepted by {@link
+     * java.util.TimeZone#getTimeZone(String)}.
+     *
+     * <p>Most often a suggestion will contain a single time zone ID but other possibilities are
+     * valid. A suggestion with zero time zone IDs means the provider is certain there are no time
+     * zones for the current location, e.g. for oceans, boundaries or disputed areas. A suggestion
+     * with multiple IDs can occur on boundaries or disputed areas. The ordering should be in order
+     * of likelihood if possible, but the time zone detection service may choose from any of the
+     * zones suggested if it has other supporting information available.
+     */
+    @NonNull
+    public List<String> getTimeZoneIds() {
+        return mTimeZoneIds;
+    }
+
+    @Override
+    public String toString() {
+        return "TimeZoneProviderSuggestion{"
+                + "mTimeZoneIds=" + mTimeZoneIds
+                + ", mElapsedRealtimeMillis=" + mElapsedRealtimeMillis
+                + "(" + Duration.ofMillis(mElapsedRealtimeMillis) + ")"
+                + '}';
+    }
+
+    public static final @NonNull Creator<TimeZoneProviderSuggestion> CREATOR =
+            new Creator<TimeZoneProviderSuggestion>() {
+                @Override
+                public TimeZoneProviderSuggestion createFromParcel(Parcel in) {
+                    @SuppressWarnings("unchecked")
+                    ArrayList<String> timeZoneIds =
+                            (ArrayList<String>) in.readArrayList(null /* classLoader */);
+                    long elapsedRealtimeMillis = in.readLong();
+                    return new TimeZoneProviderSuggestion(timeZoneIds, elapsedRealtimeMillis);
+                }
+
+                @Override
+                public TimeZoneProviderSuggestion[] newArray(int size) {
+                    return new TimeZoneProviderSuggestion[size];
+                }
+            };
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel parcel, int flags) {
+        parcel.writeList(mTimeZoneIds);
+        parcel.writeLong(mElapsedRealtimeMillis);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        TimeZoneProviderSuggestion that = (TimeZoneProviderSuggestion) o;
+        return mElapsedRealtimeMillis == that.mElapsedRealtimeMillis
+                && mTimeZoneIds.equals(that.mTimeZoneIds);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mTimeZoneIds, mElapsedRealtimeMillis);
+    }
+
+    /** A builder for {@link TimeZoneProviderSuggestion}. */
+    public static final class Builder {
+
+        private @NonNull List<String> mTimeZoneIds = Collections.emptyList();
+        @ElapsedRealtimeLong
+        private long mElapsedRealtimeMillis = SystemClock.elapsedRealtime();
+
+        /**
+         * Sets the time zone IDs of this suggestion.
+         */
+        @NonNull
+        public Builder setTimeZoneIds(@NonNull List<String> timeZoneIds) {
+            mTimeZoneIds = Objects.requireNonNull(timeZoneIds);
+            return this;
+        }
+
+        /**
+         * Sets the time of this suggestion, in elapsed real-time since system boot.
+         */
+        @NonNull
+        public Builder setElapsedRealtimeMillis(@ElapsedRealtimeLong long time) {
+            mElapsedRealtimeMillis = time;
+            return this;
+        }
+
+        /**
+         * Builds a {@link TimeZoneProviderSuggestion} instance.
+         */
+        @NonNull
+        public TimeZoneProviderSuggestion build() {
+            return new TimeZoneProviderSuggestion(mTimeZoneIds, mElapsedRealtimeMillis);
+        }
+    }
+
+    @NonNull
+    private static List<String> immutableList(@NonNull List<String> list) {
+        Objects.requireNonNull(list);
+        if (list.isEmpty()) {
+            return Collections.emptyList();
+        } else {
+            return Collections.unmodifiableList(new ArrayList<>(list));
+        }
+    }
+}
diff --git a/core/java/android/util/imetracing/ImeTracingClientImpl.java b/core/java/android/util/imetracing/ImeTracingClientImpl.java
index 6cc652d..2c27639 100644
--- a/core/java/android/util/imetracing/ImeTracingClientImpl.java
+++ b/core/java/android/util/imetracing/ImeTracingClientImpl.java
@@ -25,6 +25,9 @@
 import android.util.proto.ProtoOutputStream;
 import android.view.inputmethod.InputMethodManager;
 
+import com.android.internal.inputmethod.Completable;
+import com.android.internal.inputmethod.ResultCallbacks;
+
 import java.io.PrintWriter;
 
 /**
@@ -32,7 +35,9 @@
  */
 class ImeTracingClientImpl extends ImeTracing {
     ImeTracingClientImpl() throws ServiceNotFoundException, RemoteException {
-        sEnabled = mService.isImeTraceEnabled();
+        final Completable.Boolean value = Completable.createBoolean();
+        mService.isImeTraceEnabled(ResultCallbacks.of(value));
+        sEnabled = Completable.getResult(value);
     }
 
     @Override
diff --git a/core/java/android/uwb/RangingManager.java b/core/java/android/uwb/RangingManager.java
new file mode 100644
index 0000000..a9bf4ab
--- /dev/null
+++ b/core/java/android/uwb/RangingManager.java
@@ -0,0 +1,178 @@
+/*
+ * 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.uwb;
+
+import android.annotation.NonNull;
+import android.os.PersistableBundle;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.util.Hashtable;
+import java.util.concurrent.Executor;
+
+/**
+ * @hide
+ */
+public class RangingManager extends android.uwb.IUwbRangingCallbacks.Stub {
+    private static final String TAG = "Uwb.RangingManager";
+
+    private final IUwbAdapter mAdapter;
+    private final Hashtable<SessionHandle, RangingSession> mRangingSessionTable = new Hashtable<>();
+
+    public RangingManager(IUwbAdapter adapter) {
+        mAdapter = adapter;
+    }
+
+    /**
+     * Open a new ranging session
+     *
+     * @param params the parameters that define the ranging session
+     * @param executor {@link Executor} to run callbacks
+     * @param callbacks {@link RangingSession.Callback} to associate with the {@link RangingSession}
+     *                  that is being opened.
+     * @return a new {@link RangingSession}
+     */
+    public RangingSession openSession(@NonNull PersistableBundle params, @NonNull Executor executor,
+            @NonNull RangingSession.Callback callbacks) {
+        SessionHandle sessionHandle;
+        try {
+            sessionHandle = mAdapter.startRanging(this, params);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+
+        synchronized (this) {
+            if (hasSession(sessionHandle)) {
+                Log.w(TAG, "Newly created session unexpectedly reuses an active SessionHandle");
+                executor.execute(() -> callbacks.onClosed(
+                        RangingSession.Callback.CLOSE_REASON_LOCAL_GENERIC_ERROR,
+                        new PersistableBundle()));
+            }
+
+            RangingSession session =
+                    new RangingSession(executor, callbacks, mAdapter, sessionHandle);
+            mRangingSessionTable.put(sessionHandle, session);
+            return session;
+        }
+    }
+
+    private boolean hasSession(SessionHandle sessionHandle) {
+        return mRangingSessionTable.containsKey(sessionHandle);
+    }
+
+    @Override
+    public void onRangingStarted(SessionHandle sessionHandle, PersistableBundle parameters) {
+        synchronized (this) {
+            if (!hasSession(sessionHandle)) {
+                Log.w(TAG,
+                        "onRangingStarted - received unexpected SessionHandle: " + sessionHandle);
+                return;
+            }
+
+            RangingSession session = mRangingSessionTable.get(sessionHandle);
+            session.onRangingStarted(parameters);
+        }
+    }
+
+    @Override
+    public void onRangingStartFailed(SessionHandle sessionHandle, int reason,
+            PersistableBundle params) {
+        synchronized (this) {
+            if (!hasSession(sessionHandle)) {
+                Log.w(TAG, "onRangingStartFailed - received unexpected SessionHandle: "
+                        + sessionHandle);
+                return;
+            }
+
+            RangingSession session = mRangingSessionTable.get(sessionHandle);
+            session.onRangingClosed(convertStartFailureToCloseReason(reason), params);
+            mRangingSessionTable.remove(sessionHandle);
+        }
+    }
+
+    @Override
+    public void onRangingClosed(SessionHandle sessionHandle, int reason, PersistableBundle params) {
+        synchronized (this) {
+            if (!hasSession(sessionHandle)) {
+                Log.w(TAG, "onRangingClosed - received unexpected SessionHandle: " + sessionHandle);
+                return;
+            }
+
+            RangingSession session = mRangingSessionTable.get(sessionHandle);
+            session.onRangingClosed(convertToCloseReason(reason), params);
+            mRangingSessionTable.remove(sessionHandle);
+        }
+    }
+
+    @Override
+    public void onRangingResult(SessionHandle sessionHandle, RangingReport result) {
+        synchronized (this) {
+            if (!hasSession(sessionHandle)) {
+                Log.w(TAG, "onRangingResult - received unexpected SessionHandle: " + sessionHandle);
+                return;
+            }
+
+            RangingSession session = mRangingSessionTable.get(sessionHandle);
+            session.onRangingResult(result);
+        }
+    }
+
+    @RangingSession.Callback.CloseReason
+    private static int convertToCloseReason(@CloseReason int reason) {
+        switch (reason) {
+            case CloseReason.LOCAL_API:
+                return RangingSession.Callback.CLOSE_REASON_LOCAL_CLOSE_API;
+
+            case CloseReason.MAX_SESSIONS_REACHED:
+                return RangingSession.Callback.CLOSE_REASON_LOCAL_MAX_SESSIONS_REACHED;
+
+            case CloseReason.SYSTEM_POLICY:
+                return RangingSession.Callback.CLOSE_REASON_LOCAL_SYSTEM_POLICY;
+
+            case CloseReason.REMOTE_REQUEST:
+                return RangingSession.Callback.CLOSE_REASON_REMOTE_REQUEST;
+
+            case CloseReason.PROTOCOL_SPECIFIC:
+                return RangingSession.Callback.CLOSE_REASON_PROTOCOL_SPECIFIC;
+
+            case CloseReason.UNKNOWN:
+            default:
+                return RangingSession.Callback.CLOSE_REASON_UNKNOWN;
+        }
+    }
+
+    @RangingSession.Callback.CloseReason
+    private static int convertStartFailureToCloseReason(@StartFailureReason int reason) {
+        switch (reason) {
+            case StartFailureReason.BAD_PARAMETERS:
+                return RangingSession.Callback.CLOSE_REASON_LOCAL_BAD_PARAMETERS;
+
+            case StartFailureReason.MAX_SESSIONS_REACHED:
+                return RangingSession.Callback.CLOSE_REASON_LOCAL_MAX_SESSIONS_REACHED;
+
+            case StartFailureReason.SYSTEM_POLICY:
+                return RangingSession.Callback.CLOSE_REASON_LOCAL_SYSTEM_POLICY;
+
+            case StartFailureReason.PROTOCOL_SPECIFIC:
+                return RangingSession.Callback.CLOSE_REASON_PROTOCOL_SPECIFIC;
+
+            case StartFailureReason.UNKNOWN:
+            default:
+                return RangingSession.Callback.CLOSE_REASON_UNKNOWN;
+        }
+    }
+}
diff --git a/core/java/android/uwb/RangingSession.java b/core/java/android/uwb/RangingSession.java
index e1af9b1..b0dbd85 100644
--- a/core/java/android/uwb/RangingSession.java
+++ b/core/java/android/uwb/RangingSession.java
@@ -18,7 +18,10 @@
 
 import android.annotation.IntDef;
 import android.annotation.NonNull;
+import android.os.Binder;
 import android.os.PersistableBundle;
+import android.os.RemoteException;
+import android.util.Log;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -34,12 +37,26 @@
  * {@link UwbManager#openRangingSession(PersistableBundle, Executor, Callback)} to request to open a
  * session. Once the session is opened, a {@link RangingSession} object is provided through
  * {@link RangingSession.Callback#onOpenSuccess(RangingSession, PersistableBundle)}. If opening a
- * session fails, the failure is reported through {@link RangingSession.Callback#onClosed(int)} with
- * the failure reason.
+ * session fails, the failure is reported through
+ * {@link RangingSession.Callback#onClosed(int, PersistableBundle)} with the failure reason.
  *
  * @hide
  */
 public final class RangingSession implements AutoCloseable {
+    private static final String TAG = "Uwb.RangingSession";
+    private final SessionHandle mSessionHandle;
+    private final IUwbAdapter mAdapter;
+    private final Executor mExecutor;
+    private final Callback mCallback;
+
+    private enum State {
+        INIT,
+        OPEN,
+        CLOSED,
+    }
+
+    private State mState;
+
     /**
      * Interface for receiving {@link RangingSession} events
      */
@@ -116,13 +133,20 @@
         int CLOSE_REASON_REMOTE_REQUEST = 7;
 
         /**
+         * Indicates that the session was closed for a protocol specific reason. The associated
+         * {@link PersistableBundle} should be consulted for additional information.
+         */
+        int CLOSE_REASON_PROTOCOL_SPECIFIC = 8;
+
+        /**
          * Invoked when session is either closed spontaneously, or per user request via
          * {@link RangingSession#close()} or {@link AutoCloseable#close()}, or when session failed
          * to open.
          *
          * @param reason reason for the session closure
+         * @param parameters protocol specific parameters related to the close reason
          */
-        void onClosed(@CloseReason int reason);
+        void onClosed(@CloseReason int reason, @NonNull PersistableBundle parameters);
 
         /**
          * Called once per ranging interval even when a ranging measurement fails
@@ -133,20 +157,97 @@
     }
 
     /**
+     * @hide
+     */
+    public RangingSession(Executor executor, Callback callback, IUwbAdapter adapter,
+            SessionHandle sessionHandle) {
+        mState = State.INIT;
+        mExecutor = executor;
+        mCallback = callback;
+        mAdapter = adapter;
+        mSessionHandle = sessionHandle;
+    }
+
+    /**
+     * @hide
+     */
+    public boolean isOpen() {
+        return mState == State.OPEN;
+    }
+
+    /**
      * Close the ranging session
      * <p>If this session is currently open, it will close and stop the session.
      * <p>If the session is in the process of being opened, it will attempt to stop the session from
      * being opened.
-     * <p>If the session is already closed, the registered {@link Callback#onClosed(int)} callback
-     * will still be invoked.
+     * <p>If the session is already closed, the registered
+     * {@link Callback#onClosed(int, PersistableBundle)} callback will still be invoked.
      *
-     * <p>{@link Callback#onClosed(int)} will be invoked using the same callback
+     * <p>{@link Callback#onClosed(int, PersistableBundle)} will be invoked using the same callback
      * object given to {@link UwbManager#openRangingSession(PersistableBundle, Executor, Callback)}
      * when the {@link RangingSession} was opened. The callback will be invoked after each call to
      * {@link #close()}, even if the {@link RangingSession} is already closed.
      */
     @Override
     public void close() {
-        throw new UnsupportedOperationException();
+        if (mState == State.CLOSED) {
+            mExecutor.execute(() -> mCallback.onClosed(
+                    Callback.CLOSE_REASON_LOCAL_CLOSE_API, new PersistableBundle()));
+            return;
+        }
+
+        try {
+            mAdapter.closeRanging(mSessionHandle);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * @hide
+     */
+    public void onRangingStarted(@NonNull PersistableBundle parameters) {
+        if (mState == State.CLOSED) {
+            Log.w(TAG, "onRangingStarted invoked for a closed session");
+            return;
+        }
+
+        mState = State.OPEN;
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            mExecutor.execute(() -> mCallback.onOpenSuccess(this, parameters));
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    /**
+     * @hide
+     */
+    public void onRangingClosed(@Callback.CloseReason int reason, PersistableBundle parameters) {
+        mState = State.CLOSED;
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            mExecutor.execute(() -> mCallback.onClosed(reason, parameters));
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    /**
+     * @hide
+     */
+    public void onRangingResult(@NonNull RangingReport report) {
+        if (!isOpen()) {
+            Log.w(TAG, "onRangingResult invoked for non-open session");
+            return;
+        }
+
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            mExecutor.execute(() -> mCallback.onReportReceived(report));
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
     }
 }
diff --git a/core/java/android/uwb/UwbManager.java b/core/java/android/uwb/UwbManager.java
index bb2be02..f4d8018 100644
--- a/core/java/android/uwb/UwbManager.java
+++ b/core/java/android/uwb/UwbManager.java
@@ -49,7 +49,8 @@
     private IUwbAdapter mUwbAdapter;
     private static final String SERVICE_NAME = "uwb";
 
-    private AdapterStateListener mAdapterStateListener;
+    private final AdapterStateListener mAdapterStateListener;
+    private final RangingManager mRangingManager;
 
     /**
      * Interface for receiving UWB adapter state changes
@@ -119,6 +120,7 @@
     private UwbManager(IUwbAdapter adapter) {
         mUwbAdapter = adapter;
         mAdapterStateListener = new AdapterStateListener(adapter);
+        mRangingManager = new RangingManager(adapter);
     }
 
     /**
@@ -395,6 +397,6 @@
     public AutoCloseable openRangingSession(@NonNull PersistableBundle parameters,
             @NonNull @CallbackExecutor Executor executor,
             @NonNull RangingSession.Callback callbacks) {
-        throw new UnsupportedOperationException();
+        return mRangingManager.openSession(parameters, executor, callbacks);
     }
 }
diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java
index 9473845..2e90619 100644
--- a/core/java/android/view/AccessibilityInteractionController.java
+++ b/core/java/android/view/AccessibilityInteractionController.java
@@ -113,6 +113,8 @@
 
     private AddNodeInfosForViewId mAddNodeInfosForViewId;
 
+    private List<Message> mPendingFindNodeByIdMessages;
+
     @GuardedBy("mLock")
     private int mNumActiveRequestPreparers;
     @GuardedBy("mLock")
@@ -128,6 +130,7 @@
         mViewRootImpl = viewRootImpl;
         mPrefetcher = new AccessibilityNodePrefetcher();
         mA11yManager = mViewRootImpl.mContext.getSystemService(AccessibilityManager.class);
+        mPendingFindNodeByIdMessages = new ArrayList<>();
     }
 
     private void scheduleMessage(Message message, int interrogatingPid, long interrogatingTid,
@@ -177,6 +180,7 @@
         args.arg4 = arguments;
         message.obj = args;
 
+        mPendingFindNodeByIdMessages.add(message);
         scheduleMessage(message, interrogatingPid, interrogatingTid, CONSIDER_REQUEST_PREPARERS);
     }
 
@@ -315,6 +319,8 @@
     }
 
     private void findAccessibilityNodeInfoByAccessibilityIdUiThread(Message message) {
+        mPendingFindNodeByIdMessages.remove(message);
+
         final int flags = message.arg1;
 
         SomeArgs args = (SomeArgs) message.obj;
@@ -329,22 +335,58 @@
 
         args.recycle();
 
-        List<AccessibilityNodeInfo> infos = mTempAccessibilityNodeInfoList;
-        infos.clear();
+        View rootView = null;
+        AccessibilityNodeInfo rootNode = null;
         try {
             if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
                 return;
             }
             mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
-            final View root = findViewByAccessibilityId(accessibilityViewId);
-            if (root != null && isShown(root)) {
-                mPrefetcher.prefetchAccessibilityNodeInfos(
-                        root, virtualDescendantId, flags, infos, arguments);
+            rootView = findViewByAccessibilityId(accessibilityViewId);
+            if (rootView != null && isShown(rootView)) {
+                rootNode = populateAccessibilityNodeInfoForView(
+                        rootView, arguments, virtualDescendantId);
             }
         } finally {
-            updateInfosForViewportAndReturnFindNodeResult(
-                    infos, callback, interactionId, spec, interactiveRegion);
+            updateInfoForViewportAndReturnFindNodeResult(
+                    rootNode == null ? null : AccessibilityNodeInfo.obtain(rootNode),
+                    callback, interactionId, spec, interactiveRegion);
         }
+        List<AccessibilityNodeInfo> infos = mTempAccessibilityNodeInfoList;
+        infos.clear();
+        mPrefetcher.prefetchAccessibilityNodeInfos(
+                rootView, rootNode == null ? null : AccessibilityNodeInfo.obtain(rootNode),
+                virtualDescendantId, flags, infos);
+        mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
+        updateInfosForViewPort(infos, spec, interactiveRegion);
+        returnPrefetchResult(interactionId, infos, callback);
+        returnPendingFindAccessibilityNodeInfosInPrefetch(infos);
+    }
+
+    private AccessibilityNodeInfo populateAccessibilityNodeInfoForView(
+            View view, Bundle arguments, int virtualViewId) {
+        AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider();
+        // Determine if we'll be populating extra data
+        final String extraDataRequested = (arguments == null) ? null
+                : arguments.getString(EXTRA_DATA_REQUESTED_KEY);
+        AccessibilityNodeInfo root = null;
+        if (provider == null) {
+            root = view.createAccessibilityNodeInfo();
+            if (root != null) {
+                if (extraDataRequested != null) {
+                    view.addExtraDataToAccessibilityNodeInfo(root, extraDataRequested, arguments);
+                }
+            }
+        } else {
+            root = provider.createAccessibilityNodeInfo(virtualViewId);
+            if (root != null) {
+                if (extraDataRequested != null) {
+                    provider.addExtraDataToAccessibilityNodeInfo(
+                            virtualViewId, root, extraDataRequested, arguments);
+                }
+            }
+        }
+        return root;
     }
 
     public void findAccessibilityNodeInfosByViewIdClientThread(long accessibilityNodeId,
@@ -402,6 +444,7 @@
                 mAddNodeInfosForViewId.reset();
             }
         } finally {
+            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
             updateInfosForViewportAndReturnFindNodeResult(
                     infos, callback, interactionId, spec, interactiveRegion);
         }
@@ -484,6 +527,7 @@
                 }
             }
         } finally {
+            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
             updateInfosForViewportAndReturnFindNodeResult(
                     infos, callback, interactionId, spec, interactiveRegion);
         }
@@ -575,6 +619,7 @@
                 }
             }
         } finally {
+            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
             updateInfoForViewportAndReturnFindNodeResult(
                     focused, callback, interactionId, spec, interactiveRegion);
         }
@@ -629,6 +674,7 @@
                 }
             }
         } finally {
+            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
             updateInfoForViewportAndReturnFindNodeResult(
                     next, callback, interactionId, spec, interactiveRegion);
         }
@@ -785,33 +831,6 @@
         }
     }
 
-    private void applyAppScaleAndMagnificationSpecIfNeeded(List<AccessibilityNodeInfo> infos,
-            MagnificationSpec spec) {
-        if (infos == null) {
-            return;
-        }
-        final float applicationScale = mViewRootImpl.mAttachInfo.mApplicationScale;
-        if (shouldApplyAppScaleAndMagnificationSpec(applicationScale, spec)) {
-            final int infoCount = infos.size();
-            for (int i = 0; i < infoCount; i++) {
-                AccessibilityNodeInfo info = infos.get(i);
-                applyAppScaleAndMagnificationSpecIfNeeded(info, spec);
-            }
-        }
-    }
-
-    private void adjustIsVisibleToUserIfNeeded(List<AccessibilityNodeInfo> infos,
-            Region interactiveRegion) {
-        if (interactiveRegion == null || infos == null) {
-            return;
-        }
-        final int infoCount = infos.size();
-        for (int i = 0; i < infoCount; i++) {
-            AccessibilityNodeInfo info = infos.get(i);
-            adjustIsVisibleToUserIfNeeded(info, interactiveRegion);
-        }
-    }
-
     private void adjustIsVisibleToUserIfNeeded(AccessibilityNodeInfo info,
             Region interactiveRegion) {
         if (interactiveRegion == null || info == null) {
@@ -832,17 +851,6 @@
         return false;
     }
 
-    private void adjustBoundsInScreenIfNeeded(List<AccessibilityNodeInfo> infos) {
-        if (infos == null || shouldBypassAdjustBoundsInScreen()) {
-            return;
-        }
-        final int infoCount = infos.size();
-        for (int i = 0; i < infoCount; i++) {
-            final AccessibilityNodeInfo info = infos.get(i);
-            adjustBoundsInScreenIfNeeded(info);
-        }
-    }
-
     private void adjustBoundsInScreenIfNeeded(AccessibilityNodeInfo info) {
         if (info == null || shouldBypassAdjustBoundsInScreen()) {
             return;
@@ -890,17 +898,6 @@
         return screenMatrix == null || screenMatrix.isIdentity();
     }
 
-    private void associateLeashedParentIfNeeded(List<AccessibilityNodeInfo> infos) {
-        if (infos == null || shouldBypassAssociateLeashedParent()) {
-            return;
-        }
-        final int infoCount = infos.size();
-        for (int i = 0; i < infoCount; i++) {
-            final AccessibilityNodeInfo info = infos.get(i);
-            associateLeashedParentIfNeeded(info);
-        }
-    }
-
     private void associateLeashedParentIfNeeded(AccessibilityNodeInfo info) {
         if (info == null || shouldBypassAssociateLeashedParent()) {
             return;
@@ -974,18 +971,46 @@
         return (appScale != 1.0f || (spec != null && !spec.isNop()));
     }
 
+    private void updateInfosForViewPort(List<AccessibilityNodeInfo> infos, MagnificationSpec spec,
+                                        Region interactiveRegion) {
+        for (int i = 0; i < infos.size(); i++) {
+            updateInfoForViewPort(infos.get(i), spec, interactiveRegion);
+        }
+    }
+
+    private void updateInfoForViewPort(AccessibilityNodeInfo info, MagnificationSpec spec,
+                                       Region interactiveRegion) {
+        associateLeashedParentIfNeeded(info);
+        applyScreenMatrixIfNeeded(info);
+        adjustBoundsInScreenIfNeeded(info);
+        // To avoid applyAppScaleAndMagnificationSpecIfNeeded changing the bounds of node,
+        // then impact the visibility result, we need to adjust visibility before apply scale.
+        adjustIsVisibleToUserIfNeeded(info, interactiveRegion);
+        applyAppScaleAndMagnificationSpecIfNeeded(info, spec);
+    }
+
     private void updateInfosForViewportAndReturnFindNodeResult(List<AccessibilityNodeInfo> infos,
             IAccessibilityInteractionConnectionCallback callback, int interactionId,
             MagnificationSpec spec, Region interactiveRegion) {
+        if (infos != null) {
+            updateInfosForViewPort(infos, spec, interactiveRegion);
+        }
+        returnFindNodesResult(infos, callback, interactionId);
+    }
+
+    private void returnFindNodeResult(AccessibilityNodeInfo info,
+                                      IAccessibilityInteractionConnectionCallback callback,
+                                      int interactionId) {
         try {
-            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
-            associateLeashedParentIfNeeded(infos);
-            applyScreenMatrixIfNeeded(infos);
-            adjustBoundsInScreenIfNeeded(infos);
-            // To avoid applyAppScaleAndMagnificationSpecIfNeeded changing the bounds of node,
-            // then impact the visibility result, we need to adjust visibility before apply scale.
-            adjustIsVisibleToUserIfNeeded(infos, interactiveRegion);
-            applyAppScaleAndMagnificationSpecIfNeeded(infos, spec);
+            callback.setFindAccessibilityNodeInfoResult(info, interactionId);
+        } catch (RemoteException re) {
+            /* ignore - the other side will time out */
+        }
+    }
+
+    private void returnFindNodesResult(List<AccessibilityNodeInfo> infos,
+            IAccessibilityInteractionConnectionCallback callback, int interactionId) {
+        try {
             callback.setFindAccessibilityNodeInfosResult(infos, interactionId);
             if (infos != null) {
                 infos.clear();
@@ -995,22 +1020,49 @@
         }
     }
 
+    private void returnPendingFindAccessibilityNodeInfosInPrefetch(
+            List<AccessibilityNodeInfo> infos) {
+        for (Message pendingMessage : mPendingFindNodeByIdMessages) {
+            SomeArgs args = (SomeArgs) pendingMessage.obj;
+            final int accessibilityViewId = args.argi1;
+            final int virtualDescendantId = args.argi2;
+            final int interactionId = args.argi3;
+            final IAccessibilityInteractionConnectionCallback callback =
+                    (IAccessibilityInteractionConnectionCallback) args.arg1;
+            final long nodeId =
+                    AccessibilityNodeInfo.makeNodeId(accessibilityViewId, virtualDescendantId);
+            for (int i = 0; i < infos.size(); i++) {
+                AccessibilityNodeInfo info = infos.get(i);
+                if (info.getSourceNodeId() == nodeId) {
+                    returnFindNodeResult(
+                            AccessibilityNodeInfo.obtain(info), callback, interactionId);
+                    mHandler.removeMessages(
+                            PrivateHandler.MSG_FIND_ACCESSIBILITY_NODE_INFO_BY_ACCESSIBILITY_ID,
+                            pendingMessage.obj);
+                    args.recycle();
+                    break;
+                }
+            }
+        }
+        mPendingFindNodeByIdMessages.clear();
+    }
+
+    private void returnPrefetchResult(int interactionId, List<AccessibilityNodeInfo> infos,
+                                      IAccessibilityInteractionConnectionCallback callback) {
+        if (infos.size() > 0) {
+            try {
+                callback.setPrefetchAccessibilityNodeInfoResult(infos, interactionId);
+            } catch (RemoteException re) {
+                /* ignore - other side isn't too bothered if this doesn't arrive */
+            }
+        }
+    }
+
     private void updateInfoForViewportAndReturnFindNodeResult(AccessibilityNodeInfo info,
             IAccessibilityInteractionConnectionCallback callback, int interactionId,
             MagnificationSpec spec, Region interactiveRegion) {
-        try {
-            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
-            associateLeashedParentIfNeeded(info);
-            applyScreenMatrixIfNeeded(info);
-            adjustBoundsInScreenIfNeeded(info);
-            // To avoid applyAppScaleAndMagnificationSpecIfNeeded changing the bounds of node,
-            // then impact the visibility result, we need to adjust visibility before apply scale.
-            adjustIsVisibleToUserIfNeeded(info, interactiveRegion);
-            applyAppScaleAndMagnificationSpecIfNeeded(info, spec);
-            callback.setFindAccessibilityNodeInfoResult(info, interactionId);
-        } catch (RemoteException re) {
-                /* ignore - the other side will time out */
-        }
+        updateInfoForViewPort(info, spec, interactiveRegion);
+        returnFindNodeResult(info, callback, interactionId);
     }
 
     private boolean handleClickableSpanActionUiThread(
@@ -1053,20 +1105,11 @@
 
         private final ArrayList<View> mTempViewList = new ArrayList<View>();
 
-        public void prefetchAccessibilityNodeInfos(View view, int virtualViewId, int fetchFlags,
-                List<AccessibilityNodeInfo> outInfos, Bundle arguments) {
-            AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider();
-            // Determine if we'll be populating extra data
-            final String extraDataRequested = (arguments == null) ? null
-                    : arguments.getString(EXTRA_DATA_REQUESTED_KEY);
-            if (provider == null) {
-                AccessibilityNodeInfo root = view.createAccessibilityNodeInfo();
-                if (root != null) {
-                    if (extraDataRequested != null) {
-                        view.addExtraDataToAccessibilityNodeInfo(
-                                root, extraDataRequested, arguments);
-                    }
-                    outInfos.add(root);
+        public void prefetchAccessibilityNodeInfos(View view, AccessibilityNodeInfo root,
+                int virtualViewId, int fetchFlags, List<AccessibilityNodeInfo> outInfos) {
+            if (root != null) {
+                AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider();
+                if (provider == null) {
                     if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
                         prefetchPredecessorsOfRealNode(view, outInfos);
                     }
@@ -1076,16 +1119,7 @@
                     if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS) != 0) {
                         prefetchDescendantsOfRealNode(view, outInfos);
                     }
-                }
-            } else {
-                final AccessibilityNodeInfo root =
-                        provider.createAccessibilityNodeInfo(virtualViewId);
-                if (root != null) {
-                    if (extraDataRequested != null) {
-                        provider.addExtraDataToAccessibilityNodeInfo(
-                                virtualViewId, root, extraDataRequested, arguments);
-                    }
-                    outInfos.add(root);
+                } else {
                     if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
                         prefetchPredecessorsOfVirtualNode(root, view, provider, outInfos);
                     }
@@ -1096,13 +1130,19 @@
                         prefetchDescendantsOfVirtualNode(root, provider, outInfos);
                     }
                 }
-            }
-            if (ENFORCE_NODE_TREE_CONSISTENT) {
-                enforceNodeTreeConsistent(outInfos);
+                if (ENFORCE_NODE_TREE_CONSISTENT) {
+                    enforceNodeTreeConsistent(root, outInfos);
+                }
             }
         }
 
-        private void enforceNodeTreeConsistent(List<AccessibilityNodeInfo> nodes) {
+        private boolean shouldStopPrefetching(List prefetchededInfos) {
+            return mHandler.hasUserInteractiveMessagesWaiting()
+                    || prefetchededInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE;
+        }
+
+        private void enforceNodeTreeConsistent(
+                AccessibilityNodeInfo root, List<AccessibilityNodeInfo> nodes) {
             LongSparseArray<AccessibilityNodeInfo> nodeMap =
                     new LongSparseArray<AccessibilityNodeInfo>();
             final int nodeCount = nodes.size();
@@ -1113,7 +1153,6 @@
 
             // If the nodes are a tree it does not matter from
             // which node we start to search for the root.
-            AccessibilityNodeInfo root = nodeMap.valueAt(0);
             AccessibilityNodeInfo parent = root;
             while (parent != null) {
                 root = parent;
@@ -1180,9 +1219,11 @@
 
         private void prefetchPredecessorsOfRealNode(View view,
                 List<AccessibilityNodeInfo> outInfos) {
+            if (shouldStopPrefetching(outInfos)) {
+                return;
+            }
             ViewParent parent = view.getParentForAccessibility();
-            while (parent instanceof View
-                    && outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+            while (parent instanceof View && !shouldStopPrefetching(outInfos)) {
                 View parentView = (View) parent;
                 AccessibilityNodeInfo info = parentView.createAccessibilityNodeInfo();
                 if (info != null) {
@@ -1194,6 +1235,9 @@
 
         private void prefetchSiblingsOfRealNode(View current,
                 List<AccessibilityNodeInfo> outInfos) {
+            if (shouldStopPrefetching(outInfos)) {
+                return;
+            }
             ViewParent parent = current.getParentForAccessibility();
             if (parent instanceof ViewGroup) {
                 ViewGroup parentGroup = (ViewGroup) parent;
@@ -1203,7 +1247,7 @@
                     parentGroup.addChildrenForAccessibility(children);
                     final int childCount = children.size();
                     for (int i = 0; i < childCount; i++) {
-                        if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+                        if (shouldStopPrefetching(outInfos)) {
                             return;
                         }
                         View child = children.get(i);
@@ -1231,7 +1275,7 @@
 
         private void prefetchDescendantsOfRealNode(View root,
                 List<AccessibilityNodeInfo> outInfos) {
-            if (!(root instanceof ViewGroup)) {
+            if (shouldStopPrefetching(outInfos) || !(root instanceof ViewGroup)) {
                 return;
             }
             HashMap<View, AccessibilityNodeInfo> addedChildren =
@@ -1242,7 +1286,7 @@
                 root.addChildrenForAccessibility(children);
                 final int childCount = children.size();
                 for (int i = 0; i < childCount; i++) {
-                    if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+                    if (shouldStopPrefetching(outInfos)) {
                         return;
                     }
                     View child = children.get(i);
@@ -1267,7 +1311,7 @@
             } finally {
                 children.clear();
             }
-            if (outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+            if (!shouldStopPrefetching(outInfos)) {
                 for (Map.Entry<View, AccessibilityNodeInfo> entry : addedChildren.entrySet()) {
                     View addedChild = entry.getKey();
                     AccessibilityNodeInfo virtualRoot = entry.getValue();
@@ -1289,7 +1333,7 @@
             long parentNodeId = root.getParentNodeId();
             int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId(parentNodeId);
             while (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
-                if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+                if (shouldStopPrefetching(outInfos)) {
                     return;
                 }
                 final int virtualDescendantId =
@@ -1334,7 +1378,7 @@
                 if (parent != null) {
                     final int childCount = parent.getChildCount();
                     for (int i = 0; i < childCount; i++) {
-                        if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+                        if (shouldStopPrefetching(outInfos)) {
                             return;
                         }
                         final long childNodeId = parent.getChildId(i);
@@ -1359,7 +1403,7 @@
             final int initialOutInfosSize = outInfos.size();
             final int childCount = root.getChildCount();
             for (int i = 0; i < childCount; i++) {
-                if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+                if (shouldStopPrefetching(outInfos)) {
                     return;
                 }
                 final long childNodeId = root.getChildId(i);
@@ -1369,7 +1413,7 @@
                     outInfos.add(child);
                 }
             }
-            if (outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
+            if (!shouldStopPrefetching(outInfos)) {
                 final int addedChildCount = outInfos.size() - initialOutInfosSize;
                 for (int i = 0; i < addedChildCount; i++) {
                     AccessibilityNodeInfo child = outInfos.get(initialOutInfosSize + i);
@@ -1478,6 +1522,10 @@
         boolean hasAccessibilityCallback(Message message) {
             return message.what < FIRST_NO_ACCESSIBILITY_CALLBACK_MSG ? true : false;
         }
+
+        boolean hasUserInteractiveMessagesWaiting() {
+            return hasMessagesOrCallbacks();
+        }
     }
 
     private final class AddNodeInfosForViewId implements Predicate<View> {
diff --git a/core/java/android/view/ContentInfo.java b/core/java/android/view/ContentInfo.java
index fcf699f..bc66ea1 100644
--- a/core/java/android/view/ContentInfo.java
+++ b/core/java/android/view/ContentInfo.java
@@ -19,6 +19,7 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.TestApi;
 import android.content.ClipData;
 import android.content.ClipDescription;
 import android.net.Uri;
@@ -222,7 +223,10 @@
      * content that matched the predicate, or null if none of the items matched. The pair's
      * second object will have the content that didn't match the predicate, or null if all of
      * the items matched.
+     *
+     * @hide
      */
+    @TestApi
     @NonNull
     public Pair<ContentInfo, ContentInfo> partition(
             @NonNull Predicate<ClipData.Item> itemPredicate) {
diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java
index 0201605..0ac0305 100644
--- a/core/java/android/view/DisplayInfo.java
+++ b/core/java/android/view/DisplayInfo.java
@@ -325,6 +325,7 @@
                 && rotation == other.rotation
                 && modeId == other.modeId
                 && defaultModeId == other.defaultModeId
+                && Arrays.equals(supportedModes, other.supportedModes)
                 && colorMode == other.colorMode
                 && Arrays.equals(supportedColorModes, other.supportedColorModes)
                 && Objects.equals(hdrCapabilities, other.hdrCapabilities)
diff --git a/core/java/android/view/OWNERS b/core/java/android/view/OWNERS
index 72fa4c3..bae6ee8 100644
--- a/core/java/android/view/OWNERS
+++ b/core/java/android/view/OWNERS
@@ -47,11 +47,13 @@
 per-file View.java = file:/graphics/java/android/graphics/OWNERS
 per-file View.java = file:/services/core/java/com/android/server/input/OWNERS
 per-file View.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file View.java = file:/core/java/android/view/inputmethod/OWNERS
 per-file ViewRootImpl.java = file:/services/accessibility/OWNERS
 per-file ViewRootImpl.java = file:/core/java/android/service/autofill/OWNERS
 per-file ViewRootImpl.java = file:/graphics/java/android/graphics/OWNERS
 per-file ViewRootImpl.java = file:/services/core/java/com/android/server/input/OWNERS
 per-file ViewRootImpl.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file ViewRootImpl.java = file:/core/java/android/view/inputmethod/OWNERS
 
 # WindowManager
 per-file DisplayCutout.aidl = file:/services/core/java/com/android/server/wm/OWNERS
diff --git a/core/java/android/view/OnReceiveContentListener.java b/core/java/android/view/OnReceiveContentListener.java
index 419f964..3d9968c 100644
--- a/core/java/android/view/OnReceiveContentListener.java
+++ b/core/java/android/view/OnReceiveContentListener.java
@@ -36,7 +36,7 @@
  *     &#64;Override
  *     public ContentInfo onReceiveContent(View view, ContentInfo payload) {
  *         Pair&lt;ContentInfo, ContentInfo&gt; split =
- *                 payload.partition(item -&gt; item.getUri() != null);
+ *                 ContentInfoCompat.partition(payload, item -&gt; item.getUri() != null);
  *         ContentInfo uriContent = split.first;
  *         ContentInfo remaining = split.second;
  *         if (uriContent != null) {
@@ -72,8 +72,7 @@
      * handling. For example, an implementation may provide handling for content URIs (to provide
      * support for inserting images, etc) and delegate the processing of text to the platform to
      * preserve the common behavior for inserting text. See the class javadoc for a sample
-     * implementation and see {@link ContentInfo#partition} for a convenient way to split the
-     * passed-in content.
+     * implementation.
      *
      * <p>If implementing handling for text: if the view has a selection, the selection should
      * be overwritten by the passed-in content; if there's no selection, the passed-in content
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 23de215..f642d75 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -232,6 +232,7 @@
             long nativeSurfaceControl);
     private static native void nativeRemoveJankDataListener(long nativeListener);
     private static native long nativeCreateJankDataListenerWrapper(OnJankDataListener listener);
+    private static native int nativeGetGPUContextPriority();
 
     @Nullable
     @GuardedBy("mLock")
@@ -2438,7 +2439,15 @@
         nativeRemoveJankDataListener(listener.mNativePtr.get());
     }
 
-     /**
+    /**
+     * Return GPU Context priority that is set in SurfaceFlinger's Render Engine.
+     * @hide
+     */
+    public static int getGPUContextPriority() {
+        return nativeGetGPUContextPriority();
+    }
+
+    /**
      * An atomic set of changes to a set of SurfaceControl.
      */
     public static class Transaction implements Closeable, Parcelable {
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 15adc5a..f05e671 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -232,6 +232,7 @@
     private final Matrix mTmpMatrix = new Matrix();
 
     SurfaceControlViewHost.SurfacePackage mSurfacePackage;
+    private final boolean mUseBlastSync = false;
 
     /**
      * Returns {@code true} if buffers should be submitted via blast
@@ -1922,6 +1923,6 @@
     }
 
     private boolean useBLASTSync(ViewRootImpl viewRoot) {
-        return viewRoot.useBLAST() && mUseBlastAdapter;
+        return viewRoot.useBLAST() && mUseBlastAdapter && mUseBlastSync;
     }
 }
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 37c18b5..d24380b 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -4667,7 +4667,12 @@
         if (mPointerCapture == enabled) {
             return;
         }
-        InputManager.getInstance().requestPointerCapture(mAttachInfo.mWindowToken, enabled);
+        final IBinder inputToken = getInputToken();
+        if (inputToken == null) {
+            Log.e(mTag, "No input channel to request Pointer Capture.");
+            return;
+        }
+        InputManager.getInstance().requestPointerCapture(inputToken, enabled);
     }
 
     private void handlePointerCaptureChanged(boolean hasCapture) {
@@ -8381,6 +8386,11 @@
         }
 
         @Override
+        public void onPointerCaptureEvent(boolean pointerCaptureEnabled) {
+            dispatchPointerCaptureChanged(pointerCaptureEnabled);
+        }
+
+        @Override
         public void dispose() {
             unscheduleConsumeBatchedInput();
             super.dispose();
diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
index f63749b..aff0b35 100644
--- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java
+++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
@@ -23,7 +23,9 @@
 import android.os.Binder;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Handler;
 import android.os.IBinder;
+import android.os.Looper;
 import android.os.Message;
 import android.os.Process;
 import android.os.RemoteException;
@@ -123,6 +125,12 @@
 
     private Message mSameThreadMessage;
 
+    private int mInteractionIdWaitingForPrefetchResult;
+    private int mConnectionIdWaitingForPrefetchResult;
+    private String[] mPackageNamesForNextPrefetchResult;
+    private final Handler mMainHandler;
+    private Runnable mPrefetchResultRunnable;
+
     /**
      * @return The client for the current thread.
      */
@@ -197,6 +205,7 @@
 
     private AccessibilityInteractionClient() {
         /* reducing constructor visibility */
+        mMainHandler = new Handler(Looper.getMainLooper());
     }
 
     /**
@@ -451,16 +460,16 @@
                     Binder.restoreCallingIdentity(identityToken);
                 }
                 if (packageNames != null) {
-                    List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear(
-                            interactionId);
-                    finalizeAndCacheAccessibilityNodeInfos(infos, connectionId,
-                            bypassCache, packageNames);
-                    if (infos != null && !infos.isEmpty()) {
-                        for (int i = 1; i < infos.size(); i++) {
-                            infos.get(i).recycle();
-                        }
-                        return infos.get(0);
+                    AccessibilityNodeInfo info =
+                            getFindAccessibilityNodeInfoResultAndClear(interactionId);
+                    if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_MASK) != 0
+                            && info != null) {
+                        setInteractionWaitingForPrefetchResult(interactionId, connectionId,
+                                packageNames);
                     }
+                    finalizeAndCacheAccessibilityNodeInfo(info, connectionId,
+                            bypassCache, packageNames);
+                    return info;
                 }
             } else {
                 if (DEBUG) {
@@ -474,6 +483,15 @@
         return null;
     }
 
+    private void setInteractionWaitingForPrefetchResult(int interactionId, int connectionId,
+            String[] packageNames) {
+        synchronized (mInstanceLock) {
+            mInteractionIdWaitingForPrefetchResult = interactionId;
+            mConnectionIdWaitingForPrefetchResult = connectionId;
+            mPackageNamesForNextPrefetchResult = packageNames;
+        }
+    }
+
     private static String idToString(int accessibilityWindowId, long accessibilityNodeId) {
         return accessibilityWindowId + "/"
                 + AccessibilityNodeInfo.idToString(accessibilityNodeId);
@@ -829,6 +847,26 @@
     }
 
     /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setPrefetchAccessibilityNodeInfoResult(List<AccessibilityNodeInfo> infos,
+                                                       int interactionId) {
+        synchronized (mInstanceLock) {
+            if (mPrefetchResultRunnable != null) {
+                mMainHandler.removeCallbacks(mPrefetchResultRunnable);
+                mPrefetchResultRunnable = null;
+            }
+            if (!infos.isEmpty() && mInteractionIdWaitingForPrefetchResult == interactionId) {
+                mPrefetchResultRunnable = () -> finalizeAndCacheAccessibilityNodeInfos(
+                        infos, mConnectionIdWaitingForPrefetchResult, false,
+                        mPackageNamesForNextPrefetchResult);
+                mMainHandler.post(mPrefetchResultRunnable);
+            }
+        }
+    }
+
+    /**
      * Gets the result of a request to perform an accessibility action.
      *
      * @param interactionId The interaction id to match the result with the request.
diff --git a/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl b/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl
index 049bb31..231e75a 100644
--- a/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl
@@ -47,6 +47,15 @@
         int interactionId);
 
     /**
+     * Sets the result of a prefetch request that returns {@link AccessibilityNodeInfo}s.
+     *
+     * @param root The {@link AccessibilityNodeInfo} for which the prefetching is based off of.
+     * @param infos The result {@link AccessibilityNodeInfo}s.
+     */
+    void setPrefetchAccessibilityNodeInfoResult(
+        in List<AccessibilityNodeInfo> infos, int interactionId);
+
+    /**
      * Sets the result of a request to perform an accessibility action.
      *
      * @param Whether the action was performed.
diff --git a/core/java/android/view/inputmethod/InputConnection.java b/core/java/android/view/inputmethod/InputConnection.java
index 14b5d7c..8c81143 100644
--- a/core/java/android/view/inputmethod/InputConnection.java
+++ b/core/java/android/view/inputmethod/InputConnection.java
@@ -858,6 +858,20 @@
     boolean reportFullscreenMode(boolean enabled);
 
     /**
+     * Have the editor perform spell checking around the current selection.
+     *
+     * <p>The editor can ignore this method call if it does not support spell checking.
+     *
+     * @return For editor authors, the return value will always be ignored. For IME authors, this
+     *         method returns true if the spell check request was sent (whether or not the
+     *         associated editor supports spell checking), false if the input connection is no
+     *         longer valid.
+     */
+    default boolean performSpellCheck() {
+        return false;
+    }
+
+    /**
      * API to send private commands from an input method to its
      * connected editor. This can be used to provide domain-specific
      * features that are only known between certain input methods and
diff --git a/core/java/android/view/inputmethod/InputConnectionWrapper.java b/core/java/android/view/inputmethod/InputConnectionWrapper.java
index 77956d1..ca85348 100644
--- a/core/java/android/view/inputmethod/InputConnectionWrapper.java
+++ b/core/java/android/view/inputmethod/InputConnectionWrapper.java
@@ -287,6 +287,15 @@
      * @throws NullPointerException if the target is {@code null}.
      */
     @Override
+    public boolean performSpellCheck() {
+        return mTarget.performSpellCheck();
+    }
+
+    /**
+     * {@inheritDoc}
+     * @throws NullPointerException if the target is {@code null}.
+     */
+    @Override
     public boolean performPrivateCommand(String action, Bundle data) {
         return mTarget.performPrivateCommand(action, data);
     }
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index eaf72dc..6526b8c 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -1747,8 +1747,14 @@
 
             try {
                 Log.d(TAG, "showSoftInput() view=" + view + " flags=" + flags);
-                return mService.showSoftInput(
-                        mClient, view.getWindowToken(), flags, resultReceiver);
+                final Completable.Boolean value = Completable.createBoolean();
+                mService.showSoftInput(
+                        mClient,
+                        view.getWindowToken(),
+                        flags,
+                        resultReceiver,
+                        ResultCallbacks.of(value));
+                return Completable.getResult(value);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -1775,8 +1781,14 @@
                     Log.w(TAG, "No current root view, ignoring showSoftInputUnchecked()");
                     return;
                 }
+                final Completable.Boolean value = Completable.createBoolean();
                 mService.showSoftInput(
-                        mClient, mCurRootView.getView().getWindowToken(), flags, resultReceiver);
+                        mClient,
+                        mCurRootView.getView().getWindowToken(),
+                        flags,
+                        resultReceiver,
+                        ResultCallbacks.of(value));
+                Completable.getResult(value); // ignore the result
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -1849,7 +1861,10 @@
             }
 
             try {
-                return mService.hideSoftInput(mClient, windowToken, flags, resultReceiver);
+                final Completable.Boolean value = Completable.createBoolean();
+                mService.hideSoftInput(
+                        mClient, windowToken, flags, resultReceiver, ResultCallbacks.of(value));
+                return Completable.getResult(value);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -2184,8 +2199,14 @@
                 return;
             }
             try {
+                final Completable.Boolean value = Completable.createBoolean();
                 mService.hideSoftInput(
-                        mClient, mCurRootView.getView().getWindowToken(), HIDE_NOT_ALWAYS, null);
+                        mClient,
+                        mCurRootView.getView().getWindowToken(),
+                        HIDE_NOT_ALWAYS,
+                        null,
+                        ResultCallbacks.of(value));
+                Completable.getResult(value); // ignore the result
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -2920,7 +2941,9 @@
     @TestApi
     public boolean isInputMethodPickerShown() {
         try {
-            return mService.isInputMethodPickerShownForTest();
+            final Completable.Boolean value = Completable.createBoolean();
+            mService.isInputMethodPickerShownForTest(ResultCallbacks.of(value));
+            return Completable.getResult(value);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/java/android/widget/SpellChecker.java b/core/java/android/widget/SpellChecker.java
index 0611bea..0788635 100644
--- a/core/java/android/widget/SpellChecker.java
+++ b/core/java/android/widget/SpellChecker.java
@@ -215,6 +215,27 @@
         spellCheck();
     }
 
+    void onPerformSpellCheck() {
+        final int selectionStart = mTextView.getSelectionStart();
+        final int selectionEnd = mTextView.getSelectionEnd();
+        final int selectionRangeStart;
+        final int selectionRangeEnd;
+        if (selectionStart < selectionEnd) {
+            selectionRangeStart = selectionStart;
+            selectionRangeEnd = selectionEnd;
+        } else {
+            selectionRangeStart = selectionEnd;
+            selectionRangeEnd = selectionStart;
+        }
+        // Expand the range so that it (hopefully) includes the current sentence.
+        final int start = Math.max(0, selectionRangeStart - MIN_SENTENCE_LENGTH);
+        final int end = Math.min(mTextView.length(), selectionRangeEnd + MIN_SENTENCE_LENGTH);
+        if (DBG) {
+            Log.d(TAG, "performSpellCheckAroundSelection: " + start + ", " + end);
+        }
+        spellCheck(start, end);
+    }
+
     public void spellCheck(int start, int end) {
         if (DBG) {
             Log.d(TAG, "Start spell-checking: " + start + ", " + end);
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 02a9300..12c91fa 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -8913,6 +8913,13 @@
         // intentionally empty
     }
 
+    /** @hide */
+    public void onPerformSpellCheck() {
+        if (mEditor != null && mEditor.mSpellChecker != null) {
+            mEditor.mSpellChecker.onPerformSpellCheck();
+        }
+    }
+
     /**
      * Called by the framework in response to a private command from the
      * current method, provided by it calling
@@ -13736,8 +13743,12 @@
      * custom behavior should configure a listener via {@link #setOnReceiveContentListener}.
      *
      * <p>For non-editable TextViews the default behavior is a no-op (returns the passed-in
-     * content without acting on it). For editable TextViews the default behavior coerces all
-     * content to text and inserts into the view.
+     * content without acting on it).
+     *
+     * <p>For editable TextViews the default behavior is to insert text into the view, coercing
+     * non-text content to text as needed. The MIME types "text/plain" and "text/html" have
+     * well-defined behavior for this, while other MIME types have reasonable fallback behavior
+     * (see {@link ClipData.Item#coerceToStyledText}).
      *
      * @param payload The content to insert and related metadata.
      *
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index ea458a1..e064137 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -28,6 +28,7 @@
 import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.ActivityManager;
+import android.app.SharedElementCallback;
 import android.app.prediction.AppPredictionContext;
 import android.app.prediction.AppPredictionManager;
 import android.app.prediction.AppPredictor;
@@ -176,6 +177,13 @@
     public static final String EXTRA_PRIVATE_RETAIN_IN_ON_STOP
             = "com.android.internal.app.ChooserActivity.EXTRA_PRIVATE_RETAIN_IN_ON_STOP";
 
+    /**
+     * Transition name for the first image preview.
+     * To be used for shared element transition into this activity.
+     * @hide
+     */
+    public static final String FIRST_IMAGE_PREVIEW_TRANSITION_NAME = "chooser_preview_image_1";
+
     private static final String PREF_NUM_SHEET_EXPANSIONS = "pref_num_sheet_expansions";
 
     private static final String CHIP_LABEL_METADATA_KEY = "android.service.chooser.chip_label";
@@ -307,6 +315,8 @@
     @VisibleForTesting
     protected ChooserMultiProfilePagerAdapter mChooserMultiProfilePagerAdapter;
 
+    private boolean mRemoveSharedElements = false;
+
     private class ContentPreviewCoordinator {
         private static final int IMAGE_FADE_IN_MILLIS = 150;
         private static final int IMAGE_LOAD_TIMEOUT = 1;
@@ -370,10 +380,29 @@
                         if (task.mExtraCount > 0) {
                             imageView.setExtraImageCount(task.mExtraCount);
                         }
+
+                        setupPreDrawForSharedElementTransition(imageView);
                 }
             }
         };
 
+        private void setupPreDrawForSharedElementTransition(View v) {
+            v.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
+                @Override
+                public boolean onPreDraw() {
+                    v.getViewTreeObserver().removeOnPreDrawListener(this);
+
+                    if (!mRemoveSharedElements && isActivityTransitionRunning()) {
+                        // Disable the window animations as it interferes with the
+                        // transition animation.
+                        getWindow().setWindowAnimations(0);
+                    }
+                    startPostponedEnterTransition();
+                    return true;
+                }
+            });
+        }
+
         ContentPreviewCoordinator(View parentView, boolean hideParentOnFail) {
             super();
 
@@ -413,6 +442,8 @@
                 }
                 mHideParentOnFail = false;
             }
+            mRemoveSharedElements = true;
+            startPostponedEnterTransition();
         }
 
         private void collapseParentView() {
@@ -794,6 +825,19 @@
         );
         mDirectShareShortcutInfoCache = new HashMap<>();
         mChooserTargetComponentNameCache = new HashMap<>();
+
+        setEnterSharedElementCallback(new SharedElementCallback() {
+            @Override
+            public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
+                if (mRemoveSharedElements) {
+                    names.remove(FIRST_IMAGE_PREVIEW_TRANSITION_NAME);
+                    sharedElements.remove(FIRST_IMAGE_PREVIEW_TRANSITION_NAME);
+                }
+                super.onMapSharedElements(names, sharedElements);
+                mRemoveSharedElements = false;
+            }
+        });
+        postponeEnterTransition();
     }
 
     @Override
@@ -1337,6 +1381,8 @@
         String action = targetIntent.getAction();
         if (Intent.ACTION_SEND.equals(action)) {
             Uri uri = targetIntent.getParcelableExtra(Intent.EXTRA_STREAM);
+            imagePreview.findViewById(R.id.content_preview_image_1_large)
+                    .setTransitionName(ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME);
             mPreviewCoord.loadUriIntoView(R.id.content_preview_image_1_large, uri, 0);
         } else {
             ContentResolver resolver = getContentResolver();
@@ -1356,6 +1402,8 @@
                 return contentPreviewLayout;
             }
 
+            imagePreview.findViewById(R.id.content_preview_image_1_large)
+                    .setTransitionName(ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME);
             mPreviewCoord.loadUriIntoView(R.id.content_preview_image_1_large, imageUris.get(0), 0);
 
             if (imageUris.size() == 2) {
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index 0b047a2..7a30ee2 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -20,6 +20,7 @@
 
 import android.bluetooth.BluetoothActivityEnergyInfo;
 import android.os.BatteryUsageStats;
+import android.os.BatteryUsageStatsQuery;
 import android.os.ParcelFileDescriptor;
 import android.os.WorkSource;
 import android.os.connectivity.CellularBatteryStats;
@@ -51,7 +52,7 @@
 
     // Remaining methods are only used in Java.
 
-    BatteryUsageStats getBatteryUsageStats();
+    BatteryUsageStats getBatteryUsageStats(in BatteryUsageStatsQuery query);
 
     @UnsupportedAppUsage
     byte[] getStatistics();
diff --git a/core/java/com/android/internal/inputmethod/CallbackUtils.java b/core/java/com/android/internal/inputmethod/CallbackUtils.java
index a315e5a..a77583f 100644
--- a/core/java/com/android/internal/inputmethod/CallbackUtils.java
+++ b/core/java/com/android/internal/inputmethod/CallbackUtils.java
@@ -22,6 +22,7 @@
 
 import com.android.internal.view.InputBindResult;
 
+import java.util.function.BooleanSupplier;
 import java.util.function.Supplier;
 
 /**
@@ -62,4 +63,30 @@
             callback.onResult(result);
         } catch (RemoteException ignored) { }
     }
+
+    /**
+     * A utility method using given {@link IBooleanResultCallback} to callback the result.
+     *
+     * @param callback {@link IInputBindResultResultCallback} to be called back.
+     * @param resultSupplier the supplier from which the result is provided.
+     */
+    public static void onResult(@NonNull IBooleanResultCallback callback,
+            @NonNull BooleanSupplier resultSupplier) {
+        boolean result = false;
+        Throwable exception = null;
+
+        try {
+            result = resultSupplier.getAsBoolean();
+        } catch (Throwable throwable) {
+            exception = throwable;
+        }
+
+        try {
+            if (exception != null) {
+                callback.onError(ThrowableHolder.of(exception));
+                return;
+            }
+            callback.onResult(result);
+        } catch (RemoteException ignored) { }
+    }
 }
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java b/core/java/com/android/internal/inputmethod/IBooleanResultCallback.aidl
similarity index 62%
copy from media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java
copy to core/java/com/android/internal/inputmethod/IBooleanResultCallback.aidl
index 52f2787..6daeb3f 100644
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java
+++ b/core/java/com/android/internal/inputmethod/IBooleanResultCallback.aidl
@@ -14,19 +14,11 @@
  * limitations under the License.
  */
 
-package com.android.mediatranscodingtest;
+package com.android.internal.inputmethod;
 
-/**
- *
- * This class has the names of the all the activity name and variables in the
- * instrumentation test.
- *
- */
-public class MediaConstants {
-    /*
-     * Source test files.
-     */
-    public static final String[] SOURCE_HEVC_VIDEO_ONLY_TEST_FILES = {
-        "/sdcard/media_api/video/VideoOnlyHEVC.mp4",
-    };
-}
+import com.android.internal.inputmethod.ThrowableHolder;
+
+oneway interface IBooleanResultCallback {
+    void onResult(boolean result);
+    void onError(in ThrowableHolder exception);
+}
\ No newline at end of file
diff --git a/core/java/com/android/internal/inputmethod/ResultCallbacks.java b/core/java/com/android/internal/inputmethod/ResultCallbacks.java
index 1929b6f..b07c5f8 100644
--- a/core/java/com/android/internal/inputmethod/ResultCallbacks.java
+++ b/core/java/com/android/internal/inputmethod/ResultCallbacks.java
@@ -193,4 +193,39 @@
             }
         };
     }
+
+    /**
+     * Creates {@link IBooleanResultCallback.Stub} that is to set {@link Completable.Boolean} when
+     * receiving the result.
+     *
+     * @param value {@link Completable.Boolean} to be set when receiving the result.
+     * @return {@link IBooleanResultCallback.Stub} that can be passed as a binder IPC parameter.
+     */
+    @AnyThread
+    public static IBooleanResultCallback.Stub of(@NonNull Completable.Boolean value) {
+        final AtomicReference<WeakReference<Completable.Boolean>>
+                atomicRef = new AtomicReference<>(new WeakReference<>(value));
+
+        return new IBooleanResultCallback.Stub() {
+            @BinderThread
+            @Override
+            public void onResult(boolean result) {
+                final Completable.Boolean value = unwrap(atomicRef);
+                if (value == null) {
+                    return;
+                }
+                value.onComplete(result);
+            }
+
+            @BinderThread
+            @Override
+            public void onError(ThrowableHolder throwableHolder) {
+                final Completable.Boolean value = unwrap(atomicRef);
+                if (value == null) {
+                    return;
+                }
+                value.onError(throwableHolder);
+            }
+        };
+    }
 }
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 4476e7e..5aedd1e 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -19,6 +19,7 @@
 import static android.os.BatteryStatsManager.NUM_WIFI_STATES;
 import static android.os.BatteryStatsManager.NUM_WIFI_SUPPL_STATES;
 
+import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManager;
@@ -32,6 +33,7 @@
 import android.content.IntentFilter;
 import android.database.ContentObserver;
 import android.hardware.usb.UsbManager;
+import android.location.GnssSignalQuality;
 import android.net.ConnectivityManager;
 import android.net.INetworkStatsService;
 import android.net.NetworkStats;
@@ -97,13 +99,13 @@
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.location.gnssmetrics.GnssMetrics;
 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidActiveTimeReader;
 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeReader;
 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader;
 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader;
 import com.android.internal.power.MeasuredEnergyArray;
 import com.android.internal.power.MeasuredEnergyStats;
+import com.android.internal.power.MeasuredEnergyStats.EnergyBucket;
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.FastPrintWriter;
 import com.android.internal.util.FrameworkStatsLog;
@@ -121,6 +123,8 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
@@ -166,7 +170,7 @@
     private static final int MAGIC = 0xBA757475; // 'BATSTATS'
 
     // Current on-disk Parcel version
-    static final int VERSION = 190 + (USE_OLD_HISTORY ? 1000 : 0);
+    static final int VERSION = 191 + (USE_OLD_HISTORY ? 1000 : 0);
 
     // The maximum number of names wakelocks we will keep track of
     // per uid; once the limit is reached, we batch the remaining wakelocks
@@ -644,9 +648,22 @@
         int UPDATE_RADIO = 0x04;
         int UPDATE_BT = 0x08;
         int UPDATE_RPM = 0x10;
-        int UPDATE_ENERGY = 0x20;
+        int UPDATE_DISPLAY = 0x20;
         int UPDATE_ALL =
-                UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT | UPDATE_RPM | UPDATE_ENERGY;
+                UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT | UPDATE_RPM | UPDATE_DISPLAY;
+
+        @IntDef(flag = true, prefix = "UPDATE_", value = {
+                UPDATE_CPU,
+                UPDATE_WIFI,
+                UPDATE_RADIO,
+                UPDATE_BT,
+                UPDATE_RPM,
+                UPDATE_DISPLAY,
+                UPDATE_ALL,
+        })
+        @Retention(RetentionPolicy.SOURCE)
+        public @interface ExternalUpdateFlag {
+        }
 
         Future<?> scheduleSync(String reason, int flags);
         Future<?> scheduleCpuSyncDueToRemovedUid(int uid);
@@ -827,6 +844,13 @@
 
     int mStartCount;
 
+    /**
+     * Set to true when a reset occurs, informing us that the next time BatteryExternalStatsWorker
+     * gives us data, we mustn't process it since this data includes pre-reset-period data.
+     */
+    @GuardedBy("this")
+    boolean mIgnoreNextExternalStats = false;
+
     long mStartClockTimeMs;
     String mStartPlatformVersion;
     String mEndPlatformVersion;
@@ -895,7 +919,7 @@
     int mGpsSignalQualityBin = -1;
     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
     protected final StopwatchTimer[] mGpsSignalQualityTimer =
-        new StopwatchTimer[GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS];
+        new StopwatchTimer[GnssSignalQuality.NUM_GNSS_SIGNAL_QUALITY_LEVELS];
 
     int mPhoneSignalStrengthBin = -1;
     int mPhoneSignalStrengthBinRaw = -1;
@@ -987,11 +1011,15 @@
     int mWifiRadioPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
 
     /**
-     * Accumulated energy consumption of various consumers while on battery.
-     * If energy consumer data is unavailable this will be null.
+     * Accumulated energy consumption, that is not attributed to individual uids, of various
+     * consumers while on battery.
+     * If energy consumer data is completely unavailable this will be null.
      */
     @GuardedBy("this")
-    MeasuredEnergyStats mBatteryMeasuredEnergyStats;
+    @VisibleForTesting
+    protected @Nullable MeasuredEnergyStats mGlobalMeasuredEnergyStats;
+    /** Last known screen state. Needed for apportioning display energy. */
+    int mScreenStateAtLastEnergyMeasurement = Display.STATE_UNKNOWN;
 
     /**
      * These provide time bases that discount the time the device is plugged
@@ -5049,7 +5077,7 @@
         if (mGpsNesting == 0) {
             return;
         }
-        if (signalLevel < 0 || signalLevel >= GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS) {
+        if (signalLevel < 0 || signalLevel >= mGpsSignalQualityTimer.length) {
             stopAllGpsSignalQualityTimersLocked(-1, elapsedRealtimeMs);
             return;
         }
@@ -5145,14 +5173,11 @@
                         + Display.stateToString(state));
                 addHistoryRecordLocked(elapsedRealtimeMs, uptimeMs);
             }
-            int updateFlag = ExternalStatsSync.UPDATE_CPU;
-            if (mBatteryMeasuredEnergyStats != null && mBatteryMeasuredEnergyStats.hasSubsystem(
-                    MeasuredEnergyArray.SUBSYSTEM_DISPLAY)) {
-                updateFlag |= ExternalStatsSync.UPDATE_ENERGY;
-            }
+            // TODO: (Probably overkill) Have mGlobalMeasuredEnergyStats store supported flags and
+            //       only update DISPLAY if it is. Currently overkill since CPU is scheduled anyway.
+            final int updateFlag = ExternalStatsSync.UPDATE_CPU | ExternalStatsSync.UPDATE_DISPLAY;
             mExternalSync.scheduleSyncDueToScreenStateChange(updateFlag,
-                    mOnBatteryTimeBase.isRunning(), mOnBatteryScreenOffTimeBase.isRunning(),
-                    mScreenState);
+                    mOnBatteryTimeBase.isRunning(), mOnBatteryScreenOffTimeBase.isRunning(), state);
             if (Display.isOnState(state)) {
                 updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), state,
                         uptimeMs * 1000, elapsedRealtimeMs * 1000);
@@ -5460,7 +5485,7 @@
     }
 
     void stopAllGpsSignalQualityTimersLocked(int except, long elapsedRealtimeMs) {
-        for (int i = 0; i < GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS; i++) {
+        for (int i = 0; i < mGpsSignalQualityTimer.length; i++) {
             if (i == except) {
                 continue;
             }
@@ -6911,7 +6936,7 @@
 
     @Override public long getGpsSignalQualityTime(int strengthBin,
             long elapsedRealtimeUs, int which) {
-        if (strengthBin < 0 || strengthBin >= GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS) {
+        if (strengthBin < 0 || strengthBin >= mGpsSignalQualityTimer.length) {
             return 0;
         }
         return mGpsSignalQualityTimer[strengthBin].getTotalTimeLocked(
@@ -6927,7 +6952,7 @@
         double energyUsedMaMs = 0.0;
         final int which = STATS_SINCE_CHARGED;
         final long rawRealtimeUs = SystemClock.elapsedRealtime() * 1000;
-        for(int i=0; i < GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS; i++) {
+        for(int i=0; i < mGpsSignalQualityTimer.length; i++) {
             energyUsedMaMs
                     += mPowerProfile.getAveragePower(PowerProfile.POWER_GPS_SIGNAL_QUALITY_BASED, i)
                     * (getGpsSignalQualityTime(i, rawRealtimeUs, which) / 1000);
@@ -7145,21 +7170,19 @@
 
     @Override
     public long getScreenOnEnergy() {
-        if (mBatteryMeasuredEnergyStats == null || !mBatteryMeasuredEnergyStats.hasSubsystem(
-                MeasuredEnergyArray.SUBSYSTEM_DISPLAY)) {
+        if (mGlobalMeasuredEnergyStats == null) {
             return ENERGY_DATA_UNAVAILABLE;
         }
-        return mBatteryMeasuredEnergyStats.getAccumulatedBucketEnergy(
+        return mGlobalMeasuredEnergyStats.getAccumulatedBucketEnergy(
                 MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_ON);
     }
 
     @Override
     public long getScreenDozeEnergy() {
-        if (mBatteryMeasuredEnergyStats == null || !mBatteryMeasuredEnergyStats.hasSubsystem(
-                MeasuredEnergyArray.SUBSYSTEM_DISPLAY)) {
+        if (mGlobalMeasuredEnergyStats == null) {
             return ENERGY_DATA_UNAVAILABLE;
         }
-        return mBatteryMeasuredEnergyStats.getAccumulatedBucketEnergy(
+        return mGlobalMeasuredEnergyStats.getAccumulatedBucketEnergy(
                 MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_DOZE);
     }
 
@@ -7509,6 +7532,11 @@
          */
         private final ArraySet<BinderCallStats> mBinderCallStats = new ArraySet<>();
 
+        /** Measured energies attributed to this uid while on battery. */
+        // We do not use a SparseArray<LongSamplingCounters> since it would cause lots of
+        // unnecessary timebase references, and we're just going to use on-battery anyway...
+        private MeasuredEnergyStats mUidMeasuredEnergyStats;
+
         /**
          * Estimated total time spent by the system server handling requests from this uid.
          */
@@ -7911,6 +7939,66 @@
             return mModemControllerActivity;
         }
 
+        private MeasuredEnergyStats getOrCreateMeasuredEnergyStatsLocked() {
+            if (mUidMeasuredEnergyStats == null) {
+                mUidMeasuredEnergyStats =
+                        MeasuredEnergyStats.createFromTemplate(mBsi.mGlobalMeasuredEnergyStats);
+            }
+            return mUidMeasuredEnergyStats;
+        }
+
+        /** Adds the given energy to the given energy bucket for this uid. */
+        private void addEnergyToEnergyBucketLocked(long energyDeltaUJ,
+                @MeasuredEnergyStats.EnergyBucket int energyBucket, boolean accumulate) {
+            getOrCreateMeasuredEnergyStatsLocked()
+                    .updateBucket(energyBucket, energyDeltaUJ, accumulate);
+        }
+
+        /**
+         * Returns the energy used by this uid for an energy bucket of interest.
+         * @param bucket energy bucket of interest
+         * @return energy (in microjoules) used by this uid for this energy bucket
+         */
+        public long getMeasuredEnergyMicroJoules(@MeasuredEnergyStats.EnergyBucket int bucket) {
+            if (mBsi.mGlobalMeasuredEnergyStats == null
+                    || !mBsi.mGlobalMeasuredEnergyStats.isEnergyBucketSupported(bucket)) {
+                return ENERGY_DATA_UNAVAILABLE;
+            }
+            if (mUidMeasuredEnergyStats == null) {
+                return 0L; // It is supported, but was never filled, so it must be 0
+            }
+            return mUidMeasuredEnergyStats.getAccumulatedBucketEnergy(bucket);
+        }
+
+        /**
+         * Gets the minimum of the uid's foreground activity time and its PROCESS_STATE_TOP time
+         * since last marked. Also sets the mark time for both these timers.
+         *
+         * @see BatteryStatsHelper#getProcessForegroundTimeMs
+         *
+         * @param doCalc if true, then calculate the minimum; else don't bother and return 0. Either
+         *               way, the mark is set.
+         */
+        private long markProcessForegroundTimeUs(long elapsedRealtimeMs,
+                boolean doCalc) {
+            long fgTimeUs = 0;
+            final StopwatchTimer fgTimer = mForegroundActivityTimer;
+            if (fgTimer != null) {
+                if (doCalc) fgTimeUs = fgTimer.getTimeSinceMarkLocked(elapsedRealtimeMs * 1000);
+                fgTimer.setMark(elapsedRealtimeMs);
+            }
+
+            long topTimeUs = 0;
+            final StopwatchTimer topTimer = mProcessStateTimer[PROCESS_STATE_TOP];
+            if (topTimer != null) {
+                if (doCalc) topTimeUs = topTimer.getTimeSinceMarkLocked(elapsedRealtimeMs * 1000);
+                topTimer.setMark(elapsedRealtimeMs);
+            }
+
+            // Return the min of the two
+            return (topTimeUs < fgTimeUs) ? topTimeUs : fgTimeUs;
+        }
+
         public StopwatchTimer createAudioTurnedOnTimerLocked() {
             if (mAudioTurnedOnTimer == null) {
                 mAudioTurnedOnTimer = new StopwatchTimer(mBsi.mClocks, Uid.this, AUDIO_TURNED_ON,
@@ -8639,6 +8727,8 @@
             resetIfNotNull(mBluetoothControllerActivity, false, realtimeUs);
             resetIfNotNull(mModemControllerActivity, false, realtimeUs);
 
+            MeasuredEnergyStats.resetIfNotNull(mUidMeasuredEnergyStats);
+
             resetIfNotNull(mUserCpuTime, false, realtimeUs);
             resetIfNotNull(mSystemCpuTime, false, realtimeUs);
 
@@ -9078,6 +9168,13 @@
                 out.writeInt(0);
             }
 
+            if (mUidMeasuredEnergyStats != null) {
+                out.writeInt(1);
+                mUidMeasuredEnergyStats.writeToParcel(out);
+            } else {
+                out.writeInt(0);
+            }
+
             mUserCpuTime.writeToParcel(out);
             mSystemCpuTime.writeToParcel(out);
 
@@ -9377,6 +9474,10 @@
                 mModemControllerActivity = null;
             }
 
+            if (in.readInt() != 0) {
+                mUidMeasuredEnergyStats = new MeasuredEnergyStats(in);
+            }
+
             mUserCpuTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase, in);
             mSystemCpuTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase, in);
 
@@ -10581,13 +10682,15 @@
     }
 
     public BatteryStatsImpl(File systemDir, Handler handler, PlatformIdleStateCallback cb,
-            MeasuredEnergyRetriever energyStatsCb, UserInfoProvider userInfoProvider) {
-        this(new SystemClocks(), systemDir, handler, cb, energyStatsCb, userInfoProvider);
+            MeasuredEnergyRetriever energyStatsCb, boolean[] supportedEnergyBuckets,
+            UserInfoProvider userInfoProvider) {
+        this(new SystemClocks(), systemDir, handler, cb, energyStatsCb, supportedEnergyBuckets,
+                userInfoProvider);
     }
 
     private BatteryStatsImpl(Clocks clocks, File systemDir, Handler handler,
             PlatformIdleStateCallback cb, MeasuredEnergyRetriever energyStatsCb,
-            UserInfoProvider userInfoProvider) {
+            boolean[] supportedEnergyBuckets, UserInfoProvider userInfoProvider) {
         init(clocks);
 
         if (systemDir == null) {
@@ -10659,7 +10762,7 @@
                     mOnBatteryTimeBase);
         }
         mWifiActiveTimer = new StopwatchTimer(mClocks, null, -900, null, mOnBatteryTimeBase);
-        for (int i=0; i< GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS; i++) {
+        for (int i=0; i< mGpsSignalQualityTimer.length; i++) {
             mGpsSignalQualityTimer[i] = new StopwatchTimer(mClocks, null, -1000-i, null,
                 mOnBatteryTimeBase);
         }
@@ -10694,12 +10797,9 @@
         mDeviceIdleMode = DEVICE_IDLE_MODE_OFF;
         FrameworkStatsLog.write(FrameworkStatsLog.DEVICE_IDLE_MODE_STATE_CHANGED, mDeviceIdleMode);
 
-        final MeasuredEnergyArray energyStats = mMeasuredEnergyRetriever.getEnergyConsumptionData();
-        // If measured energy is not available, it is not supported and
-        // mBatteryMeasuredEnergyStats should be left null.
-        if (energyStats != null) {
-            mBatteryMeasuredEnergyStats = new MeasuredEnergyStats(energyStats, mScreenState);
-        }
+        mGlobalMeasuredEnergyStats = supportedEnergyBuckets == null ? null :
+                new MeasuredEnergyStats(supportedEnergyBuckets);
+        mScreenStateAtLastEnergyMeasurement = mScreenState;
     }
 
     @UnsupportedAppUsage
@@ -11351,7 +11451,7 @@
         mWifiMulticastWakelockTimer.reset(false, elapsedRealtimeUs);
         mWifiActiveTimer.reset(false, elapsedRealtimeUs);
         mWifiActivity.reset(false, elapsedRealtimeUs);
-        for (int i=0; i< GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS; i++) {
+        for (int i=0; i< mGpsSignalQualityTimer.length; i++) {
             mGpsSignalQualityTimer[i].reset(false, elapsedRealtimeUs);
         }
         mBluetoothActivity.reset(false, elapsedRealtimeUs);
@@ -11402,10 +11502,7 @@
 
         mTmpRailStats.reset();
 
-        if (mBatteryMeasuredEnergyStats != null) {
-            mBatteryMeasuredEnergyStats.reset();
-            mExternalSync.scheduleSync("reset", ExternalStatsSync.UPDATE_ENERGY);
-        }
+        MeasuredEnergyStats.resetIfNotNull(mGlobalMeasuredEnergyStats);
 
         resetIfNotNull(mBinderThreadCpuTimesUs, false, elapsedRealtimeUs);
 
@@ -11429,6 +11526,10 @@
         clearHistoryLocked();
         mBatteryStatsHistory.resetAllFiles();
 
+        // Flush external data, gathering snapshots, but don't process it since it is pre-reset data
+        mIgnoreNextExternalStats = true;
+        mExternalSync.scheduleSync("reset", ExternalStatsSync.UPDATE_ALL);
+
         mHandler.sendEmptyMessage(MSG_REPORT_RESET_STATS);
     }
 
@@ -11559,7 +11660,7 @@
         }
 
         synchronized (this) {
-            if (!mOnBatteryInternal) {
+            if (!mOnBatteryInternal || mIgnoreNextExternalStats) {
                 if (delta != null) {
                     mNetworkStatsPool.release(delta);
                 }
@@ -11843,7 +11944,7 @@
         }
 
         synchronized (this) {
-            if (!mOnBatteryInternal) {
+            if (!mOnBatteryInternal || mIgnoreNextExternalStats) {
                 if (delta != null) {
                     mNetworkStatsPool.release(delta);
                 }
@@ -12057,7 +12158,14 @@
             Slog.d(TAG, "Updating bluetooth stats: " + info);
         }
 
-        if (info == null || !mOnBatteryInternal) {
+        if (info == null) {
+            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;
         }
 
@@ -12279,6 +12387,88 @@
     }
 
     /**
+     * Accumulate Display energy and distribute it to the correct state and the apps.
+     *
+     * NOTE: The algorithm used makes the strong assumption that app foreground activity time
+     * is always 0 when the screen is not "ON" and whenever the rail energy is 0 (if supported).
+     * To the extent that those assumptions are violated, the algorithm will err.
+     *
+     * @param energyUJ amount of energy (microjoules) used by Display since this was last called.
+     * @param screenState screen state at the time this data collection was scheduled
+     */
+    @GuardedBy("this")
+    public void updateDisplayEnergyLocked(long energyUJ, int screenState, long elapsedRealtimeMs) {
+        if (DEBUG_ENERGY) Slog.d(TAG, "Updating display stats: " + energyUJ);
+        if (mGlobalMeasuredEnergyStats == null) {
+            return;
+        }
+
+        final @EnergyBucket int energyBucket =
+                MeasuredEnergyStats.getDisplayEnergyBucket(mScreenStateAtLastEnergyMeasurement);
+        mScreenStateAtLastEnergyMeasurement = screenState;
+
+        if (!mOnBatteryInternal || energyUJ <= 0) {
+            // There's nothing further to update.
+            return;
+        }
+        if (mIgnoreNextExternalStats) {
+            // Although under ordinary resets we won't get here, and typically a new sync will
+            // happen right after the reset, strictly speaking we need to set all mark times to now.
+            final int uidStatsSize = mUidStats.size();
+            for (int i = 0; i < uidStatsSize; i++) {
+                final Uid uid = mUidStats.valueAt(i);
+                uid.markProcessForegroundTimeUs(elapsedRealtimeMs, false);
+            }
+            return;
+        }
+
+        mGlobalMeasuredEnergyStats.updateBucket(energyBucket, energyUJ, true);
+
+        // Now we blame individual apps, but only if the display was ON.
+        if (energyBucket != MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_ON) {
+            return;
+        }
+        // TODO(b/175726779): Consider unifying the code with the non-rail display energy blaming.
+
+        // NOTE: fg time is NOT pooled. If two uids are both somehow in fg, then that time is
+        // 'double counted' and will simply exceed the realtime that elapsed.
+        // If multidisplay becomes a reality, this is probably more reasonable than pooling.
+
+        // On the first pass, collect total time since mark so that we can normalize power.
+        long totalFgTimeMs = 0L;
+        final ArrayMap<Uid, Long> fgTimeMsArray = new ArrayMap<>();
+        final long elapsedRealtimeUs = elapsedRealtimeMs * 1000;
+        // TODO(b/175726779): Update and optimize the algorithm (e.g. avoid iterating over ALL uids)
+        final int uidStatsSize = mUidStats.size();
+        for (int i = 0; i < uidStatsSize; i++) {
+            final Uid uid = mUidStats.valueAt(i);
+            final long fgTimeMs = uid.markProcessForegroundTimeUs(elapsedRealtimeMs, true) / 1000;
+            if (fgTimeMs == 0) continue;
+            fgTimeMsArray.put(uid, fgTimeMs);
+            totalFgTimeMs += fgTimeMs;
+        }
+        long totalDisplayEnergyMJ = energyUJ / 1000; // not final
+
+        // Actually assign and distribute power usage to apps based on their fg time since mark.
+        // TODO(b/175726326): Decide on 'energy' units and make sure algorithm won't overflow.
+        final long fgTimeArraySize = fgTimeMsArray.size();
+        for (int i = 0; i < fgTimeArraySize; i++) {
+            final Uid uid = fgTimeMsArray.keyAt(i);
+            final long fgTimeMs = fgTimeMsArray.valueAt(i);
+
+            // Using long division: "appEnergy = totalEnergy * appFg/totalFg + 0.5" with rounding
+            final long appDisplayEnergyMJ =
+                    (totalDisplayEnergyMJ * fgTimeMs + (totalFgTimeMs / 2))
+                    / totalFgTimeMs;
+            uid.addEnergyToEnergyBucketLocked(appDisplayEnergyMJ * 1000, energyBucket, true);
+
+            // To mitigate round-off errors, remove this app from numerator & denominator totals
+            totalDisplayEnergyMJ -= appDisplayEnergyMJ;
+            totalFgTimeMs -= fgTimeMs;
+        }
+    }
+
+    /**
      * Read and record Rail Energy data.
      */
     public void updateRailStatsLocked() {
@@ -12288,6 +12478,14 @@
         mMeasuredEnergyRetriever.fillRailDataStats(mTmpRailStats);
     }
 
+    /** Informs that external stats data has been completely flushed. */
+    public void informThatAllExternalStatsAreFlushed() {
+        synchronized (this) {
+            // Any data from the pre-reset era is flushed, so we can henceforth process future data.
+            mIgnoreNextExternalStats = false;
+        }
+    }
+
     /**
      * Get energy consumed (in microjoules) by a set of subsystems from the {@link
      * MeasuredEnergyRetriever}, if available.
@@ -12539,21 +12737,6 @@
     }
 
     /**
-     * Update energy consumption data with a new snapshot of energy data.
-     * Generally this should only be called from BatteryExternalStatsWorker.
-     *
-     * @param energyStats latest energy data to update with.
-     */
-    @GuardedBy("this")
-    public void updateMeasuredEnergyStatsLocked(@NonNull MeasuredEnergyArray energyStats,
-            int screenState) {
-        if (mBatteryMeasuredEnergyStats != null) {
-            mBatteryMeasuredEnergyStats.update(energyStats, screenState,
-                    mOnBatteryTimeBase.isRunning());
-        }
-    }
-
-    /**
      * Mark the current partial timers as gone through a collection so that they will be
      * considered in the next cpu times distribution to wakelock holders.
      */
@@ -13641,7 +13824,7 @@
         final long rawRealTimeUs = SystemClock.elapsedRealtime() * 1000;
         s.setLoggingDurationMs(computeBatteryRealtime(rawRealTimeUs, which) / 1000);
         s.setEnergyConsumedMaMs(getGpsBatteryDrainMaMs());
-        long[] time = new long[GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS];
+        long[] time = new long[mGpsSignalQualityTimer.length];
         for (int i=0; i<time.length; i++) {
             time[i] = getGpsSignalQualityTime(i, rawRealTimeUs, which) / 1000;
         }
@@ -14254,11 +14437,27 @@
      */
     @GuardedBy("this")
     public void dumpMeasuredEnergyStatsLocked(PrintWriter pw) {
-        if (mBatteryMeasuredEnergyStats == null) return;
+        if (mGlobalMeasuredEnergyStats == null) return;
+        dumpMeasuredEnergyStatsLocked(pw, "non-uid usage", mGlobalMeasuredEnergyStats);
+
+        int size = mUidStats.size();
+        for (int i = 0; i < size; i++) {
+            final int u = mUidStats.keyAt(i);
+            final Uid uid = mUidStats.get(u);
+            final String name = "uid " + uid.mUid;
+            dumpMeasuredEnergyStatsLocked(pw, name, uid.mUidMeasuredEnergyStats);
+        }
+    }
+
+    /** Dump measured energy stats for the given uid */
+    @GuardedBy("this")
+    private void dumpMeasuredEnergyStatsLocked(PrintWriter pw, String name,
+            MeasuredEnergyStats stats) {
+        if (stats == null) return;
         final IndentingPrintWriter iPw = new IndentingPrintWriter(pw, "    ");
-        iPw.println("On battery measured energy stats:");
+        iPw.printf("On battery measured energy stats for %s:\n", name);
         iPw.increaseIndent();
-        mBatteryMeasuredEnergyStats.dump(iPw);
+        stats.dump(iPw);
         iPw.decreaseIndent();
     }
 
@@ -14637,7 +14836,7 @@
         mNextMaxDailyDeadlineMs = in.readLong();
         mBatteryTimeToFullSeconds = in.readLong();
 
-        MeasuredEnergyStats.readSummaryFromParcel(mBatteryMeasuredEnergyStats, in);
+        MeasuredEnergyStats.readSummaryFromParcel(mGlobalMeasuredEnergyStats, in);
 
         mStartCount++;
 
@@ -14692,7 +14891,7 @@
         }
         mWifiActiveTimer.readSummaryFromParcelLocked(in);
         mWifiActivity.readSummaryFromParcel(in);
-        for (int i=0; i<GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS; i++) {
+        for (int i=0; i<mGpsSignalQualityTimer.length; i++) {
             mGpsSignalQualityTimer[i].readSummaryFromParcelLocked(in);
         }
         mBluetoothActivity.readSummaryFromParcel(in);
@@ -14953,6 +15152,9 @@
                 u.mWifiRadioApWakeupCount = null;
             }
 
+            u.mUidMeasuredEnergyStats = MeasuredEnergyStats.createAndReadSummaryFromParcel(in,
+                    /* template */ mGlobalMeasuredEnergyStats);
+
             int NW = in.readInt();
             if (NW > (MAX_WAKELOCKS_PER_UID+1)) {
                 throw new ParcelFormatException("File corrupt: too many wake locks " + NW);
@@ -15132,7 +15334,7 @@
         out.writeLong(mNextMaxDailyDeadlineMs);
         out.writeLong(mBatteryTimeToFullSeconds);
 
-        MeasuredEnergyStats.writeSummaryToParcel(mBatteryMeasuredEnergyStats, out);
+        MeasuredEnergyStats.writeSummaryToParcel(mGlobalMeasuredEnergyStats, out);
 
         mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
         mScreenDozeTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
@@ -15178,7 +15380,7 @@
         }
         mWifiActiveTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
         mWifiActivity.writeSummaryToParcel(out);
-        for (int i=0; i< GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS; i++) {
+        for (int i=0; i< mGpsSignalQualityTimer.length; i++) {
             mGpsSignalQualityTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS);
         }
         mBluetoothActivity.writeSummaryToParcel(out);
@@ -15457,6 +15659,8 @@
                 out.writeInt(0);
             }
 
+            MeasuredEnergyStats.writeSummaryToParcel(u.mUidMeasuredEnergyStats, out);
+
             final ArrayMap<String, Uid.Wakelock> wakeStats = u.mWakelockStats.getMap();
             int NW = wakeStats.size();
             out.writeInt(NW);
@@ -15672,7 +15876,7 @@
             mOnBatteryTimeBase, in);
         mWifiActivity = new ControllerActivityCounterImpl(mOnBatteryTimeBase,
                 NUM_WIFI_TX_LEVELS, in);
-        for (int i=0; i<GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS; i++) {
+        for (int i=0; i<mGpsSignalQualityTimer.length; i++) {
             mGpsSignalQualityTimer[i] = new StopwatchTimer(mClocks, null, -1000-i,
                 null, mOnBatteryTimeBase, in);
         }
@@ -15719,7 +15923,7 @@
         mBatteryTimeToFullSeconds = in.readLong();
 
         if (in.readInt() != 0) {
-            mBatteryMeasuredEnergyStats = new MeasuredEnergyStats(in);
+            mGlobalMeasuredEnergyStats = new MeasuredEnergyStats(in);
         }
 
         mRpmStats.clear();
@@ -15886,7 +16090,7 @@
         }
         mWifiActiveTimer.writeToParcel(out, uSecRealtime);
         mWifiActivity.writeToParcel(out, 0);
-        for (int i = 0; i < GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS; i++) {
+        for (int i = 0; i < mGpsSignalQualityTimer.length; i++) {
             mGpsSignalQualityTimer[i].writeToParcel(out, uSecRealtime);
         }
         mBluetoothActivity.writeToParcel(out, 0);
@@ -15921,9 +16125,9 @@
         out.writeLong(mLastWriteTimeMs);
         out.writeLong(mBatteryTimeToFullSeconds);
 
-        if (mBatteryMeasuredEnergyStats != null) {
+        if (mGlobalMeasuredEnergyStats != null) {
             out.writeInt(1);
-            mBatteryMeasuredEnergyStats.writeToParcel(out);
+            mGlobalMeasuredEnergyStats.writeToParcel(out);
         } else {
             out.writeInt(0);
         }
@@ -16197,7 +16401,7 @@
                 pr.println("*** Wifi signal strength #" + i + ":");
                 mWifiSignalStrengthsTimer[i].logState(pr, "  ");
             }
-            for (int i=0; i<GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS; i++) {
+            for (int i=0; i<mGpsSignalQualityTimer.length; i++) {
                 pr.println("*** GPS signal quality #" + i + ":");
                 mGpsSignalQualityTimer[i].logState(pr, "  ");
             }
diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
index b97fdc9..9904d30 100644
--- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
+++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
@@ -21,6 +21,7 @@
 import android.net.ConnectivityManager;
 import android.os.BatteryStats;
 import android.os.BatteryUsageStats;
+import android.os.BatteryUsageStatsQuery;
 import android.os.Bundle;
 import android.os.SystemClock;
 import android.os.UserHandle;
@@ -89,7 +90,7 @@
     /**
      * Returns a snapshot of battery attribution data.
      */
-    public BatteryUsageStats getBatteryUsageStats() {
+    public BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
 
         // TODO(b/174186345): instead of BatteryStatsHelper, use PowerCalculators directly.
         final BatteryStatsHelper batteryStatsHelper = new BatteryStatsHelper(mContext,
@@ -109,8 +110,14 @@
         // TODO(b/174186358): read extra power component number from configuration
         final int customPowerComponentCount = 0;
         final int customTimeComponentCount = 0;
+        final boolean includeModeledComponents =
+                (query.getFlags() & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED)
+                        != 0;
+
+
         final BatteryUsageStats.Builder batteryUsageStatsBuilder =
-                new BatteryUsageStats.Builder(customPowerComponentCount, customTimeComponentCount)
+                new BatteryUsageStats.Builder(customPowerComponentCount, customTimeComponentCount,
+                        includeModeledComponents)
                         .setDischargePercentage(batteryStatsHelper.getStats().getDischargeAmount(0))
                         .setConsumedPower(batteryStatsHelper.getTotalPower());
 
@@ -129,8 +136,8 @@
 
         final List<PowerCalculator> powerCalculators = getPowerCalculators();
         for (PowerCalculator powerCalculator : powerCalculators) {
-            powerCalculator.calculate(batteryUsageStatsBuilder, mStats, realtimeUs, uptimeUs,
-                    BatteryStats.STATS_SINCE_CHARGED, users);
+            powerCalculator.calculate(batteryUsageStatsBuilder, mStats, realtimeUs, uptimeUs, query,
+                    users);
         }
 
         return batteryUsageStatsBuilder.build();
diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java
index 0f0839c..7972924 100644
--- a/core/java/com/android/internal/os/CpuPowerCalculator.java
+++ b/core/java/com/android/internal/os/CpuPowerCalculator.java
@@ -15,7 +15,9 @@
  */
 package com.android.internal.os;
 
+import android.os.BatteryConsumer;
 import android.os.BatteryStats;
+import android.os.BatteryUsageStatsQuery;
 import android.os.UidBatteryConsumer;
 import android.util.ArrayMap;
 import android.util.Log;
@@ -32,7 +34,9 @@
 
     @Override
     protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u,
-            long rawRealtimeUs, long rawUptimeUs, int statsType) {
+            long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
+        final int statsType = BatteryStats.STATS_SINCE_CHARGED;
+
         long cpuTimeMs = (u.getUserCpuTimeUs(statsType) + u.getSystemCpuTimeUs(statsType)) / 1000;
         final int numClusters = mProfile.getNumCpuClusters();
 
@@ -114,10 +118,15 @@
             cpuTimeMs = cpuFgTimeMs;
         }
 
-        app.setConsumedPower(UidBatteryConsumer.POWER_COMPONENT_CPU, cpuPowerMah)
-                .setUsageDurationMillis(UidBatteryConsumer.TIME_COMPONENT_CPU, cpuTimeMs)
-                .setUsageDurationMillis(UidBatteryConsumer.TIME_COMPONENT_CPU_FOREGROUND,
-                        cpuFgTimeMs)
+        app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, cpuPowerMah)
+                .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU, cpuTimeMs)
+                .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU_FOREGROUND, cpuFgTimeMs)
                 .setPackageWithHighestDrain(packageWithHighestDrain);
+
+        if ((query.getFlags()
+                & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED) != 0) {
+            app.setConsumedPowerForCustomComponent(BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
+                    + BatteryConsumer.POWER_COMPONENT_CPU, cpuPowerMah);
+        }
     }
 }
diff --git a/core/java/com/android/internal/os/PhonePowerCalculator.java b/core/java/com/android/internal/os/PhonePowerCalculator.java
index 27f19c0..992c487 100644
--- a/core/java/com/android/internal/os/PhonePowerCalculator.java
+++ b/core/java/com/android/internal/os/PhonePowerCalculator.java
@@ -19,6 +19,7 @@
 import android.os.BatteryConsumer;
 import android.os.BatteryStats;
 import android.os.BatteryUsageStats;
+import android.os.BatteryUsageStatsQuery;
 import android.os.SystemBatteryConsumer;
 import android.os.UserHandle;
 import android.util.SparseArray;
@@ -37,8 +38,10 @@
 
     @Override
     public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
-            long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
-        long phoneOnTimeMs = batteryStats.getPhoneOnTime(rawRealtimeUs, statsType) / 1000;
+            long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query,
+            SparseArray<UserHandle> asUsers) {
+        long phoneOnTimeMs = batteryStats.getPhoneOnTime(rawRealtimeUs,
+                BatteryStats.STATS_SINCE_CHARGED) / 1000;
         double phoneOnPower = mPowerProfile.getAveragePower(PowerProfile.POWER_RADIO_ACTIVE)
                 * phoneOnTimeMs / (60 * 60 * 1000);
         if (phoneOnPower != 0) {
diff --git a/core/java/com/android/internal/os/PowerCalculator.java b/core/java/com/android/internal/os/PowerCalculator.java
index 23f96d9..974894f 100644
--- a/core/java/com/android/internal/os/PowerCalculator.java
+++ b/core/java/com/android/internal/os/PowerCalculator.java
@@ -17,6 +17,7 @@
 
 import android.os.BatteryStats;
 import android.os.BatteryUsageStats;
+import android.os.BatteryUsageStatsQuery;
 import android.os.UidBatteryConsumer;
 import android.os.UserHandle;
 import android.util.SparseArray;
@@ -75,12 +76,13 @@
      *                      should be performed for all users.
      */
     public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
-            long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
+            long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query,
+            SparseArray<UserHandle> asUsers) {
         final SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders =
                 builder.getUidBatteryConsumerBuilders();
         for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
             final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
-            calculateApp(app, app.getBatteryStatsUid(), rawRealtimeUs, rawUptimeUs, statsType);
+            calculateApp(app, app.getBatteryStatsUid(), rawRealtimeUs, rawUptimeUs, query);
         }
     }
 
@@ -100,8 +102,8 @@
 
         // TODO(b/175156498): Temporary code during the transition from BatterySippers to
         //  BatteryConsumers.
-        UidBatteryConsumer.Builder builder = new UidBatteryConsumer.Builder(0, 0, u);
-        calculateApp(builder, u, rawRealtimeUs, rawUptimeUs, statsType);
+        UidBatteryConsumer.Builder builder = new UidBatteryConsumer.Builder(0, 0, false, u);
+        calculateApp(builder, u, rawRealtimeUs, rawUptimeUs, BatteryUsageStatsQuery.DEFAULT);
         final UidBatteryConsumer uidBatteryConsumer = builder.build();
         app.cpuPowerMah = uidBatteryConsumer.getConsumedPower(
                 UidBatteryConsumer.POWER_COMPONENT_CPU);
@@ -118,13 +120,10 @@
      * @param u The recorded stats for the app.
      * @param rawRealtimeUs The raw system realtime in microseconds.
      * @param rawUptimeUs The raw system uptime in microseconds.
-     * @param statsType The type of stats. As of {@link android.os.Build.VERSION_CODES#Q}, this can
-     *                  only be {@link BatteryStats#STATS_SINCE_CHARGED}, since
-     *                  {@link BatteryStats#STATS_CURRENT} and
-     *                  {@link BatteryStats#STATS_SINCE_UNPLUGGED} are deprecated.
+     * @param query Power calculation parameters.
      */
     protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u,
-            long rawRealtimeUs, long rawUptimeUs, int statsType) {
+            long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
     }
 
     /**
diff --git a/core/java/com/android/internal/os/SensorPowerCalculator.java b/core/java/com/android/internal/os/SensorPowerCalculator.java
index 5002daf..9c8aafb 100644
--- a/core/java/com/android/internal/os/SensorPowerCalculator.java
+++ b/core/java/com/android/internal/os/SensorPowerCalculator.java
@@ -17,12 +17,11 @@
 
 import android.hardware.Sensor;
 import android.hardware.SensorManager;
+import android.location.GnssSignalQuality;
 import android.os.BatteryStats;
 import android.os.UserHandle;
 import android.util.SparseArray;
 
-import com.android.internal.location.gnssmetrics.GnssMetrics;
-
 import java.util.List;
 
 public class SensorPowerCalculator extends PowerCalculator {
@@ -83,7 +82,7 @@
         averagePower = 0;
         long totalTime = 0;
         double totalPower = 0;
-        for (int i = 0; i < GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS; i++) {
+        for (int i = 0; i < GnssSignalQuality.NUM_GNSS_SIGNAL_QUALITY_LEVELS; i++) {
             long timePerLevel = stats.getGpsSignalQualityTime(i, rawRealtimeUs, statsType);
             totalTime += timePerLevel;
             totalPower +=
diff --git a/core/java/com/android/internal/power/MeasuredEnergyStats.java b/core/java/com/android/internal/power/MeasuredEnergyStats.java
index 7b6e079..b644df4 100644
--- a/core/java/com/android/internal/power/MeasuredEnergyStats.java
+++ b/core/java/com/android/internal/power/MeasuredEnergyStats.java
@@ -17,9 +17,12 @@
 package com.android.internal.power;
 
 
+import static android.os.BatteryStats.ENERGY_DATA_UNAVAILABLE;
+
 import android.annotation.IntDef;
 import android.annotation.Nullable;
 import android.os.Parcel;
+import android.util.Slog;
 import android.view.Display;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -28,16 +31,19 @@
 import java.io.PrintWriter;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
-import java.util.Arrays;
 
 /**
- * MeasuredEnergyStats adds up the measured energy usage of various subsystems
+ * Tracks the measured energy usage of various subsystems according to their {@link EnergyBucket}.
+ *
+ * This class doesn't use a TimeBase, and instead requires manually decisions about when to
+ * accumulate since it is trivial. However, in the future, a TimeBase could be used instead.
  */
 @VisibleForTesting
 public class MeasuredEnergyStats {
-    private static final long UNAVAILABLE = -1;
-    private static final long RESET = -2;
+    private static final String TAG = "MeasuredEnergyStats";
 
+    // Note: {@link com.android.internal.os.BatteryStatsImpl#VERSION} must be updated if energy
+    // bucket integers are modified.
     public static final int ENERGY_BUCKET_UNKNOWN = -1;
     public static final int ENERGY_BUCKET_SCREEN_ON = 0;
     public static final int ENERGY_BUCKET_SCREEN_DOZE = 1;
@@ -57,45 +63,59 @@
     }
 
     /**
-     * Energy snapshots from the last time each {@link MeasuredEnergySubsystem} was updated.
-     * An energy snapshot will be set to {@link #UNAVAILABLE} if the subsystem has never been
-     * updated.
-     * An energy snapshot will be set to {@link #RESET} on a reset. A subsystems energy will
-     * need to be updated at least twice to start accumulating energy again.
-     */
-    private final long[] mMeasuredEnergySnapshots =
-            new long[MeasuredEnergyArray.NUMBER_SUBSYSTEMS];
-
-    /**
-     * Total energy in microjoules since the last reset that an {@link EnergyBucket} has
-     * accumulated.
+     * Total energy (in microjoules) that an {@link EnergyBucket} has accumulated since the last
+     * reset. Values MUST be non-zero or ENERGY_DATA_UNAVAILABLE. Accumulation only occurs
+     * while the necessary conditions are satisfied (e.g. on battery).
      *
      * Warning: Long array is used for access speed. If the number of supported subsystems
-     * becomes too large, consider using an alternate data structure.
+     * becomes large, consider using an alternate data structure such as a SparseLongArray.
      */
     private final long[] mAccumulatedEnergiesMicroJoules = new long[NUMBER_ENERGY_BUCKETS];
 
     /**
-     * Last known screen state.
+     * Creates a MeasuredEnergyStats set to support the provided energy buckets.
+     * supportedEnergyBuckets should generally be of size {@link #NUMBER_ENERGY_BUCKETS}.
      */
-    private int mLastScreenState;
-
-    public MeasuredEnergyStats(MeasuredEnergyArray energyArray, int screenState) {
-        Arrays.fill(mMeasuredEnergySnapshots, UNAVAILABLE);
-
-        update(energyArray, screenState, false);
-    }
-
-    public MeasuredEnergyStats(Parcel in) {
-        in.readLongArray(mAccumulatedEnergiesMicroJoules);
+    public MeasuredEnergyStats(boolean[] supportedEnergyBuckets) {
+        // Initialize to all zeros where supported, otherwise ENERGY_DATA_UNAVAILABLE.
+        for (int bucket = 0; bucket < NUMBER_ENERGY_BUCKETS; bucket++) {
+            if (!supportedEnergyBuckets[bucket]) {
+                mAccumulatedEnergiesMicroJoules[bucket] = ENERGY_DATA_UNAVAILABLE;
+            }
+        }
     }
 
     /**
-     * Constructor for creating a temp MeasuredEnergyStats
-     * See {@link #readSummaryFromParcel(MeasuredEnergyStats, Parcel)}
+     * Creates a new zero'd MeasuredEnergyStats, using the template to determine which buckets are
+     * supported. This certainly does NOT produce an exact clone of the template.
+     */
+    private MeasuredEnergyStats(MeasuredEnergyStats template) {
+        // Initialize to all zeros where supported, otherwise ENERGY_DATA_UNAVAILABLE.
+        for (int bucket = 0; bucket < NUMBER_ENERGY_BUCKETS; bucket++) {
+            if (!template.isEnergyBucketSupported(bucket)) {
+                mAccumulatedEnergiesMicroJoules[bucket] = ENERGY_DATA_UNAVAILABLE;
+            }
+        }
+    }
+
+    /**
+     * Creates a new zero'd MeasuredEnergyStats, using the template to determine which buckets are
+     * supported.
+     */
+    public static MeasuredEnergyStats createFromTemplate(MeasuredEnergyStats template) {
+        return new MeasuredEnergyStats(template);
+    }
+
+    /**
+     * Constructor for creating a temp MeasuredEnergyStats.
+     * See {@link #readSummaryFromParcel(MeasuredEnergyStats, Parcel)}.
      */
     private MeasuredEnergyStats() {
-        Arrays.fill(mMeasuredEnergySnapshots, UNAVAILABLE);
+    }
+
+    /** Construct from parcel. */
+    public MeasuredEnergyStats(Parcel in) {
+        in.readLongArray(mAccumulatedEnergiesMicroJoules);
     }
 
     /** Write to parcel */
@@ -105,38 +125,32 @@
 
     /**
      * Read from summary parcel.
-     * Note: Measured subsystem availability may be different from when the summary parcel was
-     * written.
+     * Note: Measured subsystem (and therefore bucket) availability may be different from when the
+     * summary parcel was written. Availability has already been correctly set in the constructor.
+     * Note: {@link com.android.internal.os.BatteryStatsImpl#VERSION} must be updated if summary
+     *       parceling changes.
      */
     private void readSummaryFromParcel(Parcel in) {
         final int size = in.readInt();
         for (int i = 0; i < size; i++) {
             final int bucket = in.readInt();
             final long energyUJ = in.readLong();
-
-            final int subsystem = getSubsystem(bucket);
-            // Only accept the summary energy if subsystem is currently available
-            if (subsystem != MeasuredEnergyArray.SUBSYSTEM_UNKNOWN
-                    && mMeasuredEnergySnapshots[subsystem] != UNAVAILABLE) {
-                mAccumulatedEnergiesMicroJoules[bucket] = energyUJ;
-            }
+            setValueIfSupported(bucket, energyUJ);
         }
     }
 
     /**
      * Write to summary parcel.
      * Note: Measured subsystem availability may be different when the summary parcel is read.
-     * Note: {@link com.android.internal.os.BatteryStatsImpl#VERSION} must be updated if summary
-     *       parceling changes.
      */
     private void writeSummaryToParcel(Parcel out) {
         final int sizePos = out.dataPosition();
         out.writeInt(0);
         int size = 0;
-        // Write only the buckets with reported energy
+        // Write only the supported buckets with non-zero energy.
         for (int i = 0; i < NUMBER_ENERGY_BUCKETS; i++) {
-            final int subsystem = getSubsystem(i);
-            if (mMeasuredEnergySnapshots[subsystem] == UNAVAILABLE) continue;
+            final long energy = mAccumulatedEnergiesMicroJoules[i];
+            if (energy <= 0) continue;
 
             out.writeInt(i);
             out.writeLong(mAccumulatedEnergiesMicroJoules[i]);
@@ -148,91 +162,41 @@
         out.setDataPosition(currPos);
     }
 
-    /**
-     * Update with the latest measured energies and device state.
-     *
-     * @param energyArray measured energy array for some subsystems.
-     * @param screenState screen state to attribute disaply energy to after this update.
-     * @param accumulate whether or not to accumulate the latest energy
-     */
-    public void update(MeasuredEnergyArray energyArray, int screenState, boolean accumulate) {
-        final int size = energyArray.size();
-        if (!accumulate) {
-            for (int i = 0; i < size; i++) {
-                final int subsystem = energyArray.getSubsystem(i);
-                mMeasuredEnergySnapshots[subsystem] = energyArray.getEnergy(i);
-            }
-        } else {
-            for (int i = 0; i < size; i++) {
-                final int subsystem = energyArray.getSubsystem(i);
-                final long newEnergyUJ = energyArray.getEnergy(i);
-                final long oldEnergyUJ = mMeasuredEnergySnapshots[subsystem];
-                mMeasuredEnergySnapshots[subsystem] = newEnergyUJ;
-
-                // This is the first valid energy, skip accumulating the delta
-                if (oldEnergyUJ < 0) continue;
-                final long deltaUJ = newEnergyUJ - oldEnergyUJ;
-
-                final int bucket = getEnergyBucket(subsystem, mLastScreenState);
-                mAccumulatedEnergiesMicroJoules[bucket] += deltaUJ;
+    /** Updates the given bucket with the given energy iff accumulate is true. */
+    public void updateBucket(@EnergyBucket int bucket, long energyDeltaUJ, boolean accumulate) {
+        if (accumulate) {
+            if (mAccumulatedEnergiesMicroJoules[bucket] >= 0L) {
+                mAccumulatedEnergiesMicroJoules[bucket] += energyDeltaUJ;
+            } else {
+                Slog.wtf(TAG, "Attempting to add " + energyDeltaUJ + " to unavailable bucket "
+                        + ENERGY_BUCKET_NAMES[bucket] + " whose value was "
+                        + mAccumulatedEnergiesMicroJoules[bucket]);
             }
         }
-        mLastScreenState = screenState;
     }
 
     /**
-     * Map {@link MeasuredEnergySubsystem} and device state to an {@link EnergyBucket}.
-     * Keep in sync with {@link #getSubsystem}
-     */
-    @EnergyBucket
-    private int getEnergyBucket(@MeasuredEnergySubsystem int subsystem, int screenState) {
-        switch (subsystem) {
-            case MeasuredEnergyArray.SUBSYSTEM_DISPLAY:
-                if (Display.isOnState(screenState)) {
-                    return ENERGY_BUCKET_SCREEN_ON;
-                } else if (Display.isDozeState(screenState)) {
-                    return ENERGY_BUCKET_SCREEN_DOZE;
-                } else {
-                    return ENERGY_BUCKET_SCREEN_OTHER;
-                }
-            default:
-                return ENERGY_BUCKET_UNKNOWN;
-        }
-    }
-
-    /**
-     * Map {@link EnergyBucket} to a {@link MeasuredEnergySubsystem}.
-     * Keep in sync with {@link #getEnergyBucket}
-     */
-    @MeasuredEnergySubsystem
-    private int getSubsystem(@EnergyBucket int bucket) {
-        switch (bucket) {
-            case ENERGY_BUCKET_SCREEN_ON: //fallthrough
-            case ENERGY_BUCKET_SCREEN_DOZE: //fallthrough
-            case ENERGY_BUCKET_SCREEN_OTHER:
-                return MeasuredEnergyArray.SUBSYSTEM_DISPLAY;
-            default:
-                return MeasuredEnergyArray.SUBSYSTEM_UNKNOWN;
-        }
-    }
-
-    /**
-     * Check if a subsystem's measured energy is available.
-     * @param subsystem which subsystem.
-     * @return true if subsystem is avaiable.
-     */
-    public boolean hasSubsystem(@MeasuredEnergySubsystem int subsystem) {
-        return mMeasuredEnergySnapshots[subsystem] != UNAVAILABLE;
-    }
-
-    /**
-     * Return accumulated energy (in microjoules) since last reset.
+     * Return accumulated energy (in microjoules) for the given energy bucket since last reset.
+     * Returns {@link BatteryStats#ENERGY_DATA_UNAVAILABLE} if this energy data is unavailable.
      */
     public long getAccumulatedBucketEnergy(@EnergyBucket int bucket) {
         return mAccumulatedEnergiesMicroJoules[bucket];
     }
 
     /**
+     * Map {@link MeasuredEnergySubsystem} and device state to a Display {@link EnergyBucket}.
+     */
+    public static @EnergyBucket int getDisplayEnergyBucket(int screenState) {
+        if (Display.isOnState(screenState)) {
+            return ENERGY_BUCKET_SCREEN_ON;
+        }
+        if (Display.isDozeState(screenState)) {
+            return ENERGY_BUCKET_SCREEN_DOZE;
+        }
+        return ENERGY_BUCKET_SCREEN_OTHER;
+    }
+
+    /**
      * Populate a MeasuredEnergyStats from a parcel. If the stats is null, consume and
      * ignore the parcelled data.
      */
@@ -246,6 +210,46 @@
     }
 
     /**
+     * Create a MeasuredEnergyStats using the template to determine which buckets are supported,
+     * and populate this new object from the given parcel.
+     *
+     * @return a new MeasuredEnergyStats object as described.
+     *         Returns null if the stats contain no non-0 information (such as if template is null
+     *         or if the parcel indicates there is no data to populate).
+     *
+     * @see #createFromTemplate
+     */
+    public static @Nullable MeasuredEnergyStats createAndReadSummaryFromParcel(Parcel in,
+            @Nullable MeasuredEnergyStats template) {
+        // Check if any MeasuredEnergyStats exists on the parcel
+        if (in.readInt() == 0) return null;
+
+        if (template == null) {
+            // Nothing supported now. Create placeholder object just to consume the parcel data.
+            final MeasuredEnergyStats mes = new MeasuredEnergyStats();
+            mes.readSummaryFromParcel(in);
+            return null;
+        }
+
+        final MeasuredEnergyStats stats = createFromTemplate(template);
+        stats.readSummaryFromParcel(in);
+        if (stats.containsInterestingData()) {
+            return stats;
+        } else {
+            // Don't waste RAM on it (and make sure not to persist it in the next writeSummary)
+            return null;
+        }
+    }
+
+    /** Returns true iff any of the buckets are supported and non-zero. */
+    private boolean containsInterestingData() {
+        for (int bucket = 0; bucket < NUMBER_ENERGY_BUCKETS; bucket++) {
+            if (mAccumulatedEnergiesMicroJoules[bucket] > 0) return true;
+        }
+        return false;
+    }
+
+    /**
      * Write a MeasuredEnergyStats to a parcel. If the stats is null, just write a 0.
      */
     public static void writeSummaryToParcel(@Nullable MeasuredEnergyStats stats,
@@ -258,47 +262,42 @@
         stats.writeSummaryToParcel(dest);
     }
 
-    /**
-     * Reset accumulated energy.
-     */
-    public void reset() {
-        for (int i = 0; i < MeasuredEnergyArray.NUMBER_SUBSYSTEMS; i++) {
-            // Leave subsystems marked as unavailable alone.
-            if (mMeasuredEnergySnapshots[i] == UNAVAILABLE) continue;
-            mMeasuredEnergySnapshots[i] = RESET;
+    /** Reset accumulated energy. */
+    private void reset() {
+        for (int bucket = 0; bucket < NUMBER_ENERGY_BUCKETS; bucket++) {
+            setValueIfSupported(bucket, 0L);
         }
-        Arrays.fill(mAccumulatedEnergiesMicroJoules, 0);
     }
 
-    /**
-     * Dump debug data.
-     */
-    public void dump(PrintWriter pw) {
-        pw.println("Measured energy snapshot (microjoules):");
-        pw.print("   ");
-        for (int i = 0; i < MeasuredEnergyArray.NUMBER_SUBSYSTEMS; i++) {
-            final long energyUJ = mMeasuredEnergySnapshots[i];
-            if (energyUJ == UNAVAILABLE) continue;
-            pw.print(MeasuredEnergyArray.SUBSYSTEM_NAMES[i]);
-            pw.print(" : ");
-            if (energyUJ == RESET) {
-                pw.print("reset");
-            } else {
-                pw.print(energyUJ);
-            }
-            if (i != MeasuredEnergyArray.NUMBER_SUBSYSTEMS - 1) {
-                pw.print(", ");
-            }
-        }
-        pw.println();
+    /** Reset accumulated energy of the given stats. */
+    public static void resetIfNotNull(@Nullable MeasuredEnergyStats stats) {
+        if (stats != null) stats.reset();
+    }
 
+    /** If the bucket is AVAILABLE, overwrite its value; otherwise leave it as UNAVAILABLE. */
+    private void setValueIfSupported(@EnergyBucket int bucket, long value) {
+        if (mAccumulatedEnergiesMicroJoules[bucket] != ENERGY_DATA_UNAVAILABLE) {
+            mAccumulatedEnergiesMicroJoules[bucket] = value;
+        }
+    }
+
+    /** Check if measuring the energy of the given bucket is supported by this device. */
+    public boolean isEnergyBucketSupported(@EnergyBucket int bucket) {
+        return mAccumulatedEnergiesMicroJoules[bucket] != ENERGY_DATA_UNAVAILABLE;
+    }
+
+    /** Dump debug data. */
+    public void dump(PrintWriter pw) {
         pw.println("Accumulated energy since last reset (microjoules):");
         pw.print("   ");
-        for (int i = 0; i < NUMBER_ENERGY_BUCKETS; i++) {
-            pw.print(ENERGY_BUCKET_NAMES[i]);
+        for (int bucket = 0; bucket < NUMBER_ENERGY_BUCKETS; bucket++) {
+            pw.print(ENERGY_BUCKET_NAMES[bucket]);
             pw.print(" : ");
-            pw.print(mAccumulatedEnergiesMicroJoules[i]);
-            if (i != NUMBER_ENERGY_BUCKETS - 1) {
+            pw.print(mAccumulatedEnergiesMicroJoules[bucket]);
+            if (!isEnergyBucketSupported(bucket)) {
+                pw.print(" (unsupported)");
+            }
+            if (bucket != NUMBER_ENERGY_BUCKETS - 1) {
                 pw.print(", ");
             }
         }
diff --git a/core/java/com/android/internal/power/OWNERS b/core/java/com/android/internal/power/OWNERS
new file mode 100644
index 0000000..4068e2b
--- /dev/null
+++ b/core/java/com/android/internal/power/OWNERS
@@ -0,0 +1 @@
+include /BATTERY_STATS_OWNERS
diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java
index 5388235..3cf00ae 100644
--- a/core/java/com/android/internal/util/ArrayUtils.java
+++ b/core/java/com/android/internal/util/ArrayUtils.java
@@ -745,6 +745,25 @@
     }
 
     /**
+     * Throws {@link ArrayIndexOutOfBoundsException} if the range is out of bounds.
+     * @param len length of the array. Must be non-negative
+     * @param offset start index of the range. Must be non-negative
+     * @param count length of the range. Must be non-negative
+     * @throws ArrayIndexOutOfBoundsException if the range from {@code offset} with length
+     * {@code count} is out of bounds of the array
+     */
+    public static void throwsIfOutOfBounds(int len, int offset, int count) {
+        if (len < 0) {
+            throw new ArrayIndexOutOfBoundsException("Negative length: " + len);
+        }
+
+        if ((offset | count) < 0 || offset > len - count) {
+            throw new ArrayIndexOutOfBoundsException(
+                    "length=" + len + "; regionStart=" + offset + "; regionLength=" + count);
+        }
+    }
+
+    /**
      * Returns an array with values from {@code val} minus {@code null} values
      *
      * @param arrayConstructor typically {@code T[]::new} e.g. {@code String[]::new}
diff --git a/core/java/com/android/internal/view/IInputConnectionWrapper.java b/core/java/com/android/internal/view/IInputConnectionWrapper.java
index 1d5935d..3a7e66c 100644
--- a/core/java/com/android/internal/view/IInputConnectionWrapper.java
+++ b/core/java/com/android/internal/view/IInputConnectionWrapper.java
@@ -72,6 +72,7 @@
     private static final int DO_DELETE_SURROUNDING_TEXT_IN_CODE_POINTS = 81;
     private static final int DO_BEGIN_BATCH_EDIT = 90;
     private static final int DO_END_BATCH_EDIT = 95;
+    private static final int DO_PERFORM_SPELL_CHECK = 110;
     private static final int DO_PERFORM_PRIVATE_COMMAND = 120;
     private static final int DO_CLEAR_META_KEY_STATES = 130;
     private static final int DO_REQUEST_UPDATE_CURSOR_ANCHOR_INFO = 140;
@@ -234,6 +235,15 @@
         dispatchMessage(obtainMessage(DO_END_BATCH_EDIT));
     }
 
+    /**
+     * Dispatches the request for performing spell check.
+     *
+     * @see InputConnection#performSpellCheck()
+     */
+    public void performSpellCheck() {
+        dispatchMessage(obtainMessage(DO_PERFORM_SPELL_CHECK));
+    }
+
     public void performPrivateCommand(String action, Bundle data) {
         dispatchMessage(obtainMessageOO(DO_PERFORM_PRIVATE_COMMAND, action, data));
     }
@@ -681,6 +691,20 @@
                 }
                 return;
             }
+            case DO_PERFORM_SPELL_CHECK: {
+                Trace.traceBegin(Trace.TRACE_TAG_INPUT, "InputConnection#performSpellCheck");
+                try {
+                    InputConnection ic = getInputConnection();
+                    if (ic == null || !isActive()) {
+                        Log.w(TAG, "performSpellCheck on inactive InputConnection");
+                        return;
+                    }
+                    ic.performSpellCheck();
+                } finally {
+                    Trace.traceEnd(Trace.TRACE_TAG_INPUT);
+                }
+                return;
+            }
             case DO_PERFORM_PRIVATE_COMMAND: {
                 final SomeArgs args = (SomeArgs) msg.obj;
                 Trace.traceBegin(Trace.TRACE_TAG_INPUT, "InputConnection#performPrivateCommand");
diff --git a/core/java/com/android/internal/view/IInputContext.aidl b/core/java/com/android/internal/view/IInputContext.aidl
index 074908a..53cbf961 100644
--- a/core/java/com/android/internal/view/IInputContext.aidl
+++ b/core/java/com/android/internal/view/IInputContext.aidl
@@ -70,6 +70,8 @@
     
     void clearMetaKeyStates(int states);
     
+    void performSpellCheck();
+
     void performPrivateCommand(String action, in Bundle data);
 
     void setComposingRegion(int start, int end);
diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl
index e78ed4e..455e489 100644
--- a/core/java/com/android/internal/view/IInputMethodManager.aidl
+++ b/core/java/com/android/internal/view/IInputMethodManager.aidl
@@ -24,6 +24,7 @@
 import com.android.internal.view.InputBindResult;
 import com.android.internal.view.IInputContext;
 import com.android.internal.view.IInputMethodClient;
+import com.android.internal.inputmethod.IBooleanResultCallback;
 import com.android.internal.inputmethod.IInputBindResultResultCallback;
 
 /**
@@ -42,10 +43,10 @@
             boolean allowsImplicitlySelectedSubtypes);
     InputMethodSubtype getLastInputMethodSubtype();
 
-    boolean showSoftInput(in IInputMethodClient client, IBinder windowToken, int flags,
-            in ResultReceiver resultReceiver);
-    boolean hideSoftInput(in IInputMethodClient client, IBinder windowToken, int flags,
-            in ResultReceiver resultReceiver);
+    void showSoftInput(in IInputMethodClient client, IBinder windowToken, int flags,
+            in ResultReceiver resultReceiver, in IBooleanResultCallback resultCallback);
+    void hideSoftInput(in IInputMethodClient client, IBinder windowToken, int flags,
+            in ResultReceiver resultReceiver, 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
@@ -64,7 +65,7 @@
     void showInputMethodPickerFromSystem(in IInputMethodClient client, int auxiliarySubtypeMode,
             int displayId);
     void showInputMethodAndSubtypeEnablerFromClient(in IInputMethodClient client, String topId);
-    boolean isInputMethodPickerShownForTest();
+    void isInputMethodPickerShownForTest(in IBooleanResultCallback resultCallback);
     InputMethodSubtype getCurrentInputMethodSubtype();
     void setAdditionalInputMethodSubtypes(String id, in InputMethodSubtype[] subtypes);
     // This is kept due to @UnsupportedAppUsage.
@@ -80,7 +81,7 @@
     /** Remove the IME surface. Requires passing the currently focused window. */
     void removeImeSurfaceFromWindow(in IBinder windowToken);
     void startProtoDump(in byte[] protoDump, int source, String where);
-    boolean isImeTraceEnabled();
+    void isImeTraceEnabled(in IBooleanResultCallback resultCallback);
 
     // Starts an ime trace.
     void startImeTrace();
diff --git a/core/java/com/android/internal/view/InputConnectionWrapper.java b/core/java/com/android/internal/view/InputConnectionWrapper.java
index b70348a..af9c012 100644
--- a/core/java/com/android/internal/view/InputConnectionWrapper.java
+++ b/core/java/com/android/internal/view/InputConnectionWrapper.java
@@ -442,6 +442,17 @@
     }
 
     @AnyThread
+    @Override
+    public boolean performSpellCheck() {
+        try {
+            mIInputContext.performSpellCheck();
+            return true;
+        } catch (RemoteException e) {
+            return false;
+        }
+    }
+
+    @AnyThread
     public boolean performPrivateCommand(String action, Bundle data) {
         try {
             mIInputContext.performPrivateCommand(action, data);
diff --git a/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java b/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java
index 461e116..934241a 100644
--- a/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java
+++ b/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java
@@ -189,7 +189,7 @@
     @Override
     public void onPrepareForEnd(@NonNull ViewGroup view) {
         // Restore original position and state
-        view.scrollBy(0, mScrollDelta);
+        view.scrollBy(0, -mScrollDelta);
         view.setOverScrollMode(mOverScrollMode);
         view.setVerticalScrollBarEnabled(mScrollBarWasEnabled);
         if (DISABLE_ANIMATORS) {
diff --git a/core/java/com/android/internal/widget/EditableInputConnection.java b/core/java/com/android/internal/widget/EditableInputConnection.java
index 6cdf0df..767ad42 100644
--- a/core/java/com/android/internal/widget/EditableInputConnection.java
+++ b/core/java/com/android/internal/widget/EditableInputConnection.java
@@ -178,6 +178,12 @@
     }
 
     @Override
+    public boolean performSpellCheck() {
+        mTextView.onPerformSpellCheck();
+        return true;
+    }
+
+    @Override
     public boolean performPrivateCommand(String action, Bundle data) {
         mTextView.onPrivateIMECommand(action, data);
         return true;
diff --git a/core/jni/android_media_ToneGenerator.cpp b/core/jni/android_media_ToneGenerator.cpp
index ecb3cd6..82611ee 100644
--- a/core/jni/android_media_ToneGenerator.cpp
+++ b/core/jni/android_media_ToneGenerator.cpp
@@ -23,6 +23,7 @@
 
 #include <jni.h>
 #include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedUtfChars.h>
 #include "core_jni_helpers.h"
 
 #include <utils/Log.h>
@@ -85,9 +86,12 @@
     delete lpToneGen;
 }
 
-static void android_media_ToneGenerator_native_setup(JNIEnv *env, jobject thiz,
-        jint streamType, jint volume) {
-    ToneGenerator *lpToneGen = new ToneGenerator((audio_stream_type_t) streamType, AudioSystem::linearToLog(volume), true);
+static void android_media_ToneGenerator_native_setup(JNIEnv *env, jobject thiz, jint streamType,
+                                                     jint volume, jstring opPackageName) {
+    ScopedUtfChars opPackageNameStr(env, opPackageName);
+    ToneGenerator *lpToneGen =
+            new ToneGenerator((audio_stream_type_t)streamType, AudioSystem::linearToLog(volume),
+                              true /*threadCanCallJava*/, opPackageNameStr.c_str());
 
     env->SetLongField(thiz, fields.context, 0);
 
@@ -123,15 +127,14 @@
 
 // ----------------------------------------------------------------------------
 
-static const JNINativeMethod gMethods[] = {
-    { "startTone", "(II)Z", (void *)android_media_ToneGenerator_startTone },
-    { "stopTone", "()V", (void *)android_media_ToneGenerator_stopTone },
-    { "getAudioSessionId", "()I", (void *)android_media_ToneGenerator_getAudioSessionId},
-    { "release", "()V", (void *)android_media_ToneGenerator_release },
-    { "native_setup", "(II)V", (void *)android_media_ToneGenerator_native_setup },
-    { "native_finalize", "()V", (void *)android_media_ToneGenerator_native_finalize }
-};
-
+static const JNINativeMethod gMethods[] =
+        {{"startTone", "(II)Z", (void *)android_media_ToneGenerator_startTone},
+         {"stopTone", "()V", (void *)android_media_ToneGenerator_stopTone},
+         {"getAudioSessionId", "()I", (void *)android_media_ToneGenerator_getAudioSessionId},
+         {"release", "()V", (void *)android_media_ToneGenerator_release},
+         {"native_setup", "(IILjava/lang/String;)V",
+          (void *)android_media_ToneGenerator_native_setup},
+         {"native_finalize", "()V", (void *)android_media_ToneGenerator_native_finalize}};
 
 int register_android_media_ToneGenerator(JNIEnv *env) {
     jclass clazz = FindClassOrDie(env, "android/media/ToneGenerator");
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index a21545c..a6dbd19 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -1679,6 +1679,10 @@
     return reinterpret_cast<jlong>(new JankDataListenerWrapper(env, jankDataListenerObject));
 }
 
+static jint nativeGetGPUContextPriority(JNIEnv* env, jclass clazz) {
+    return static_cast<jint>(SurfaceComposerClient::getGPUContextPriority());
+}
+
 // ----------------------------------------------------------------------------
 
 static const JNINativeMethod sSurfaceControlMethods[] = {
@@ -1869,6 +1873,8 @@
             (void*)nativeRemoveJankDataListener },
     {"nativeCreateJankDataListenerWrapper", "(Landroid/view/SurfaceControl$OnJankDataListener;)J",
             (void*)nativeCreateJankDataListenerWrapper },
+    {"nativeGetGPUContextPriority", "()I",
+            (void*)nativeGetGPUContextPriority },
         // clang-format on
 };
 
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 4f9a8de..62a8ae5 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1536,7 +1536,8 @@
     <permission android:name="android.permission.BIND_DIRECTORY_SEARCH"
         android:protectionLevel="signature|privileged" />
 
-    <!-- @SystemApi @hide Allows an application to modify cell broadcasts through the content provider.
+    <!-- @SystemApi @hide Allows an application to modify the cell broadcasts configuration
+         (i.e. enable or disable channels).
          <p>Not for use by third-party applications. -->
     <permission android:name="android.permission.MODIFY_CELL_BROADCASTS"
                 android:protectionLevel="signature|privileged" />
@@ -4104,6 +4105,14 @@
     <permission android:name="android.permission.CONTROL_ALWAYS_ON_VPN"
         android:protectionLevel="signature" />
 
+    <!-- @SystemApi Allows an application to capture the audio from tuner input devices types,
+     such as FM_TUNER.
+
+     <p>Not for use by third-party applications.</p>
+     @hide -->
+    <permission android:name="android.permission.CAPTURE_TUNER_AUDIO_INPUT"
+                android:protectionLevel="signature|privileged" />
+
     <!-- Allows an application to capture audio output.
          Use the {@code CAPTURE_MEDIA_OUTPUT} permission if only the {@code USAGE_UNKNOWN}),
          {@code USAGE_MEDIA}) or {@code USAGE_GAME}) usages are intended to be captured.
@@ -5304,7 +5313,7 @@
     <attribution android:tag="TwilightService" android:label="@string/twilight_service"/>
     <!-- Attribution for the Offline LocationTimeZoneProvider, used to detect time zone using
          on-device data -->
-    <attribution android:tag="OfflineLocationTimeZoneProvider"
+    <attribution android:tag="OfflineLocationTimeZoneProviderService"
                  android:label="@string/offline_location_time_zone_detection_service_attribution"/>
 
     <application android:process="system"
@@ -5774,11 +5783,10 @@
 
         <!-- AOSP configures a default secondary LocationTimeZoneProvider that uses an on-device
              data set from the com.android.geotz APEX. -->
-        <uses-library android:name="com.android.location.provider" />
-        <service android:name="com.android.timezone.geotz.provider.OfflineLocationTimeZoneService"
+        <service android:name="com.android.timezone.geotz.provider.OfflineLocationTimeZoneProviderService"
                  android:exported="false">
             <intent-filter>
-                <action android:name="com.android.location.timezone.service.v1.SecondaryLocationTimeZoneProvider" />
+                <action android:name="android.service.timezone.SecondaryLocationTimeZoneProviderService" />
             </intent-filter>
             <meta-data android:name="serviceVersion" android:value="1" />
             <meta-data android:name="serviceIsMultiuser" android:value="true" />
diff --git a/core/res/OWNERS b/core/res/OWNERS
index 263d638..02cf0b7 100644
--- a/core/res/OWNERS
+++ b/core/res/OWNERS
@@ -6,6 +6,7 @@
 hackbod@google.com
 jsharkey@android.com
 jsharkey@google.com
+juliacr@google.com
 michaelwr@google.com
 nandana@google.com
 narayan@google.com
diff --git a/core/res/res/layout/notification_top_line_views.xml b/core/res/res/layout/notification_top_line_views.xml
index 361b7a3..7cda03f 100644
--- a/core/res/res/layout/notification_top_line_views.xml
+++ b/core/res/res/layout/notification_top_line_views.xml
@@ -112,11 +112,12 @@
         android:id="@+id/feedback"
         android:layout_width="@dimen/notification_feedback_size"
         android:layout_height="@dimen/notification_feedback_size"
-        android:layout_marginStart="4dp"
-        android:layout_marginEnd="4dp"
+        android:layout_marginStart="@dimen/notification_header_separating_margin"
+        android:layout_gravity="center"
         android:scaleType="fitCenter"
         android:src="@drawable/ic_feedback_indicator"
         android:background="?android:selectableItemBackgroundBorderless"
+        android:paddingTop="2dp"
         android:visibility="gone"
         android:contentDescription="@string/notification_feedback_indicator"
         />
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index dea4aa6..bc40003 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -20,12 +20,12 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="byteShort" msgid="202579285008794431">"B"</string>
+    <string name="byteShort" msgid="202579285008794431">"ባ"</string>
     <string name="kilobyteShort" msgid="2214285521564195803">"ኪባ"</string>
-    <string name="megabyteShort" msgid="6649361267635823443">"MB"</string>
-    <string name="gigabyteShort" msgid="7515809460261287991">"GB"</string>
-    <string name="terabyteShort" msgid="1822367128583886496">"TB"</string>
-    <string name="petabyteShort" msgid="5651571254228534832">"PB"</string>
+    <string name="megabyteShort" msgid="6649361267635823443">"ሜባ"</string>
+    <string name="gigabyteShort" msgid="7515809460261287991">"ጊባ"</string>
+    <string name="terabyteShort" msgid="1822367128583886496">"ቴባ"</string>
+    <string name="petabyteShort" msgid="5651571254228534832">"ፔባ"</string>
     <string name="fileSizeSuffix" msgid="4233671691980131257">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
     <string name="untitled" msgid="3381766946944136678">"&lt;ርዕስ አልባ&gt;"</string>
     <string name="emptyPhoneNumber" msgid="5812172618020360048">"(ምንም ስልክ ቁጥር የለም)"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 7ad157c..5a18497 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -365,10 +365,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"للسماح للتطبيق بتلقي ومعالجة رسائل الوسائط المتعددة. وهذا يعني أنه يمكن للتطبيق مراقبة الرسائل التي يتم إرسالها لجهازك أو حذفها بدون عرضها لك."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"إعادة توجيه رسائل البث الخلوي"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"يسمح للتطبيق بالارتباط بوحدة البث الخلوي لإعادة توجيه رسائل البث الخلوي بينما يتم استقبالها. ويتم تسليم تنبيهات البث الخلوي في بعض المواقع لتحذيرك في حالات الطوارئ. ويمكن أن تؤثر التطبيقات الضارة على أداء الجهاز أو تشغيله عندما يتم تلقي بث خلوي في حالات الطوارئ."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"إدارة المكالمات الجارية"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"يسمح هذا الإذن للتطبيق بمعرفة تفاصيل المكالمات الجارية على جهازك والتحكّم فيها."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"قراءة رسائل بث الخلية"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"السماح للتطبيق بقراءة رسائل بث الخلية التي يتلقاها هذا الجهاز. يتم تسليم اشعارات بث الخلية في بعض المواقع لتحذيرك من حالات طارئة. يمكن أن تتداخل التطبيقات الضارة مع أداء أو تشغيل الجهاز عندما يتم تلقي بث خلية طارئ."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"قراءة الخلاصات المشتركة"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index e6ab01a..e087332 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"এমএমএছ বার্তাবোৰ লাভ আৰু ইয়াৰ প্ৰক্ৰিয়া সম্পন্ন কৰিবলৈ এপক অনুমতি দিয়ে। ইয়াৰ অৰ্থ হৈছে এই এপে আপোনাৰ ডিভাইচলৈ প্ৰেৰণ কৰা বার্তাসমূহ আপোনাক নেদেখুৱাকৈয়ে পৰ্যবেক্ষণ আৰু মচিব পাৰে।"</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"চেল সম্প্ৰচাৰ বাৰ্তাসমূহ ফৰৱাৰ্ড কৰক"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"চেল সম্প্ৰচাৰ বাৰ্তাসমূহ লাভ কৰিলে সেইবোৰ ফৰৱাৰ্ড কৰিবলৈ এপ্‌টোক চেল সম্প্ৰচাৰ মডিউলটোৰ সৈতে সংযুক্ত হ\'বলৈ অনুমতি দিয়ে। আপোনাক জৰুৰীকালীন পৰিস্থিতিসমূহৰ বিষয়ে সতৰ্ক কৰিবলৈ কিছুমান অৱস্থানত চেল সম্প্ৰচাৰ সতৰ্কবাৰ্তাসমূহ ডেলিভাৰ কৰা হয়। কোনো জৰুৰীকালীন চেল সম্প্ৰচাৰ লাভ কৰিলে ক্ষতিকাৰক এপ্‌সমূহে আপোনাৰ ডিভাইচটোৰ কাৰ্যক্ষমতা অথবা কাৰ্যপ্ৰণালীত হস্তক্ষেপ কৰিব পাৰে।"</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"চলি থকা কলসমূহ পৰিচালনা কৰক"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"এটা এপক আপোনাৰ ডিভাইচত চলি থকা কলৰ সবিশেষ চাবলৈ আৰু এই কলসমূহ নিয়ন্ত্ৰণ কৰিবলৈ অনুমতি দিয়ে।"</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"চেল সম্প্ৰচাৰৰ বার্তাবোৰ পঢ়ক"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"আপোনাৰ ডিভাইচে লাভ কৰা চেল সম্প্ৰচাৰৰ বার্তাবোৰ পঢ়িবলৈ এপক অনুমতি দিয়ে। আপোনাক জৰুৰীকালীন পৰিস্থিতিবোৰত সর্তক কৰিবলৈ চেল সম্প্ৰচাৰৰ বার্তাবোৰ প্ৰেৰণ কৰা হয়। জৰুৰীকালীন চেল সম্প্ৰচাৰ লাভ কৰাৰ সময়ত আপোনাৰ ডিভাইচৰ কাৰ্যদক্ষতা বা কাৰ্যপ্ৰণালীত ক্ষতিকাৰক এপবোৰে হস্তক্ষেপ কৰিব পাৰে।"</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"আপুনি সদস্যভুক্ত হোৱা ফীডসমূহ পঢ়ক"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 763bd2a..2e36aab 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Tətbiqə MMS mesajlarını qəbul və emal üçün imkan verir. Bu o deməkdir ki, bu tətbiq sizə göstərmədən cihazınıza göndərilən mesajları silə bilər."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Şəbəkə yayımı mesajlarını yönləndirin"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Tətbiqə şəbəkə yayım mesajlarını əldə edildiyi anda yönləndirmək üçün şəbəkə yayımı moduluna bağlanmaq icazəsi verir. Şəbəkə yayımı bəzi məkanlarda olan fövqəladə hadisələrlə bağlı Sizi xəbərdar etmək üçün qəbul edilir. Zərərli tətbiqlər fövqəladə şəbəkə yayımı əldə edildiyi zaman cihazın performansına və əməliyyatına müdaxilə edə bilər."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Davam edən zəngləri idarə edin"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Tətbiqə cihazınızda davam edən zənglər haqqında məlumatları görmək və bu zəngləri idarə etmək imkanı verir."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"mobil yayım mesajlarını oxuyur"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Tətbiqə telefonunuz tərəfindən alınmış yayım mesajlarını oxuma icazəsi verir. Telefon yayımı bəzi məkanlarda olan fövqəladə hadisələrlə bağlı sizi xəbərdar etmək üçün qəbul edilir. Zərərli tətbiqlər təcili mobil yayım qəbul edildiyi zaman telefonunun performansına və əməliyyatına müdaxilə edə bilər."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"abunə olunmuş xəbərləri oxuyur"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index d092ad6..8c06ad6 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -359,10 +359,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Дазваляе прыкладанням атрымліваць і апрацоўваць MMS-паведамленнi. Гэта значыць, што прыкладанне можа кантраляваць або выдаляць паведамленні, адпраўленыя на прыладу, не паказваючы іх вам."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Пераадрасоўваць паведамленні сотавай трансляцыі"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Дазваляе праграме звязвацца з модулем сотавай трансляцыі, каб пераадрасоўваць атрыманыя там паведамленні. Абвесткі сотавай трансляцыі дасылаюцца ў некаторыя месцы, каб папярэджваць вас пра надзвычайныя сітуацыі. Шкодныя праграмы могуць негатыўна ўплываць на прадукцыйнасць або працу прылады падчас атрымання паведамленняў сотавай трансляцыі пра надзвычайныя сітуацыі."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Кіраваць уваходнымі выклікамі"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Дазваляе праграме праглядаць на прыладзе падрабязныя звесткі пра ўваходныя выклікі і кіраваць імі."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"чытаць паведамленні базавай станцыі"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Дазваляе прыкладанню чытаць паведамленні базавай станцыі, атрыманыя прыладай. Папярэджанні базавай станцыі дасылаюцца ў некаторыя месцы, каб папярэдзіць вас аб надзвычайных сітуацыях. Шкоднасныя прыкладанні могуць уплываць на прадукцыйнасць ці працу прылады пры атрыманні паведамлення базавай станцыі аб надзвычайнай сітуацыі."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"чытаць падпісаныя каналы"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 6de7e2d..98ba23c 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"অ্যাপ্লিকেশানটিকে MMS মেসেজ প্রাপ্ত করার এবং প্রক্রিয়া করার অনুমতি দেয়৷ এর মানে হল অ্যাপ্লিকেশানটি আপনার ডিভাইস থেকে পাঠানো মেসেজগুলিকে পর্যবেক্ষণ করতে পারে এবং মুছতে পারে সেগুলিকে আপনাকে না দেখিয়ে৷"</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"সেল ব্রডকাস্টের মাধ্যমে মেসেজ ফরওয়ার্ড করুন"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"সেল ব্রডকাস্ট মেসেজ পেলে এটি সেল ব্রডকাস্ট মডিউলের সাথে তা যুক্ত করে যাতে সেই মেসেজ ফরওয়ার্ড করা যায়। আপনাকে জরুরি অবস্থা সম্পর্কে সাবধান করতে কিছু লোকেশনে সেল ব্রডকাস্ট অ্যালার্ট মেসেজ ডেলিভার করা হয়। জরুরি সেল ব্রডকাস্ট পাওয়া গেলে ক্ষতিকারক অ্যাপ আপনার ডিভাইসের পারফর্ম্যান্স ও অপারেশনে বাধা সৃষ্টি করতে পারে।"</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"অনগোয়িং কল ম্যানেজ করুন"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"আপনার ডিভাইসে অনগোয়িং কলের বিষয়ে বিবরণ দেখতে এবং এই কলগুলি কন্ট্রোল করার জন্য অ্যাপকে অনুমতি দেয়।"</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"সেল সম্প্রচার মেসেজ পড়ুন"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"আপনার ডিভাইস দ্বারা প্রাপ্ত সেল সম্প্রচার পড়তে অ্যাপ্লিকেশানটিকে অনুমতি দেয়৷ কয়েকটি স্থানে আপনাকে জরুরি অবস্থার জন্য সতর্ক করতে জরুরি সতর্কতাগুলি বিতরণ করা হয়৷ যখন একটি জরুরি সেল সম্প্রচার প্রাপ্ত হয় তখন ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনার ডিভাইসের কার্য সম্পাদনা বা কার্যকলাপে প্রতিবন্ধকতার সৃষ্টি করতে পারে৷"</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"গ্রাহক হিসেবে নেওয়া ফিডগুলি পড়ে"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 41f4f8a..8038fc9 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Ermöglicht der App, MMS zu empfangen und zu verarbeiten. Das bedeutet, dass die App an dein Gerät gesendete Nachrichten überwachen und löschen kann, ohne sie dir anzuzeigen."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Cell-Broadcast-Nachrichten weiterleiten"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Ermöglicht der App, sich mit dem Cell-Broadcast-Modul zu verbinden, um empfangene Cell-Broadcast-Nachrichten weiterzuleiten. Cell-Broadcast-Benachrichtigungen können in einigen Ländern oder Regionen gesendet werden, um dich bei Notfallsituationen zu warnen. Schädliche Apps können die Leistung oder den Betrieb deines Geräts beeinträchtigen, wenn eine Cell-Broadcast-Notfallbenachrichtigung eingeht."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Aktuelle Anrufe verwalten"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Ermöglicht einer App, Details zu aktuellen Anrufen auf deinem Gerät zu sehen und diese Anrufe zu verwalten."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"Cell Broadcast-Nachrichten lesen"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Ermöglicht der App, von deinem Gerät empfangene Cell Broadcast-Nachrichten zu lesen. Cell Broadcast-Benachrichtigungen werden an einigen Standorten gesendet, um dich über Notfallsituationen zu informieren. Schädliche Apps können die Leistung oder den Betrieb deines Geräts beeinträchtigen, wenn eine Cell Broadcast-Notfallbenachrichtigung eingeht."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"Abonnierte Feeds lesen"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index cdfa15d..55e916e 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -52,7 +52,6 @@
     <string name="enablePin" msgid="2543771964137091212">"Opération infructueuse. Activez le verrouillage SIM/RUIM."</string>
     <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584">
       <item quantity="one">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM soit verrouillée.</item>
-      <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item>
       <item quantity="other">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM soit verrouillée.</item>
     </plurals>
     <string name="imei" msgid="2157082351232630390">"Code IIEM"</string>
@@ -180,7 +179,6 @@
     <string name="low_memory" product="default" msgid="2539532364144025569">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string>
     <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
       <item quantity="one">Autorité de certification installée</item>
-      <item quantity="many">Certificate authorities installed</item>
       <item quantity="other">Autorités de certification installées</item>
     </plurals>
     <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Par un tiers inconnu"</string>
@@ -256,7 +254,6 @@
     <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bogue. Aucune capture d\'écran supplémentaire ne peut être capturée, et vous ne pouvez entrer aucune autre information."</string>
     <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
       <item quantity="one">Saisie d\'écran pour le rapport de bogue dans <xliff:g id="NUMBER_1">%d</xliff:g> seconde.</item>
-      <item quantity="many">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
       <item quantity="other">Saisie d\'écran pour le rapport de bogue dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes.</item>
     </plurals>
     <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Capture d\'écran prise avec le rapport de bogue"</string>
@@ -356,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Permet à l\'application de recevoir et de traiter les messages multimédias. Cette autorisation lui donne la possibilité de surveiller ou de supprimer les messages envoyés à votre appareil sans vous les montrer."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Transférer les messages de diffusion cellulaire"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Permet à l\'application d\'établir un lien avec le module de diffusion cellulaire afin de transférer les messages de diffusion cellulaire à mesure de leur réception. Dans certaines régions, des alertes de diffusion cellulaire sont envoyées afin de vous avertir de situations d\'urgence. Des applications malveillantes peuvent interférer avec les performances ou le fonctionnement de votre appareil lors de la réception d\'une alerte d\'urgence par diffusion cellulaire."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Gérer les appels en cours"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Autorise une application à afficher les renseignements concernant les appels en cours sur votre appareil et à les gérer."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"lire les messages de diffusion cellulaire"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Permet à l\'application de lire les messages de diffusion cellulaire que votre appareil reçoit. Dans certaines zones géographiques, des alertes vous sont envoyées afin de vous prévenir en cas de situation d\'urgence. Des applications malveillantes peuvent venir perturber les performances ou le fonctionnement de votre appareil lors de la réception d\'un message de diffusion cellulaire."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"lire les flux auxquels vous êtes abonné"</string>
@@ -1010,7 +1005,6 @@
     <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Il y a plus d\'un mois"</string>
     <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
       <item quantity="one">Le dernier <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
-      <item quantity="many">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item>
       <item quantity="other">Le dernier <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
     </plurals>
     <string name="last_month" msgid="1528906781083518683">"Le mois dernier"</string>
@@ -1033,82 +1027,66 @@
     <string name="now_string_shortest" msgid="3684914126941650330">"maintenant"</string>
     <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
     </plurals>
     <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
     </plurals>
     <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> j</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> j</item>
     </plurals>
     <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
     </plurals>
     <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>m</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
     </plurals>
     <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>h</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item>
     </plurals>
     <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>d</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item>
     </plurals>
     <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>y</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item>
     </plurals>
     <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
       <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> minutes ago</item>
       <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
     </plurals>
     <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
       <item quantity="one">il y a<xliff:g id="COUNT_1">%d</xliff:g> heure</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> hours ago</item>
       <item quantity="other">il y a<xliff:g id="COUNT_1">%d</xliff:g> heures</item>
     </plurals>
     <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
       <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> days ago</item>
       <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
     </plurals>
     <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
       <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> an</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item>
       <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
     </plurals>
     <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
     </plurals>
     <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> heure</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> heures</item>
     </plurals>
     <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> days</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
     </plurals>
     <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> years</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
     </plurals>
     <string name="VideoView_error_title" msgid="5750686717225068016">"Problème vidéo"</string>
@@ -1481,7 +1459,6 @@
     <string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string>
     <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
       <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item>
-      <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item>
       <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item>
     </plurals>
     <string name="action_mode_done" msgid="2536182504764803222">"Terminé"</string>
@@ -1615,7 +1592,6 @@
     <string name="kg_wrong_pin" msgid="3680925703673166482">"NIP incorrect."</string>
     <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
       <item quantity="one">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item>
-      <item quantity="many">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
       <item quantity="other">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item>
     </plurals>
     <string name="kg_pattern_instructions" msgid="8366024510502517748">"Dessinez votre schéma."</string>
@@ -1802,7 +1778,6 @@
     <string name="restr_pin_error_too_short" msgid="1547007808237941065">"Le NIP est trop court. Il doit comporter au moins 4 chiffres."</string>
     <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
       <item quantity="one">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> seconde</item>
-      <item quantity="many">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item>
       <item quantity="other">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> secondes</item>
     </plurals>
     <string name="restr_pin_try_later" msgid="5897719962541636727">"Réessayez plus tard"</string>
@@ -1834,42 +1809,34 @@
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="one">Pendant %1$d minute (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
-      <item quantity="many">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
       <item quantity="other">Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
     </plurals>
     <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
       <item quantity="one">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
-      <item quantity="many">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
       <item quantity="other">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
     </plurals>
     <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
       <item quantity="one">Pendant %1$d heure (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
-      <item quantity="many">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
       <item quantity="other">Pendant %1$d heures (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
     </plurals>
     <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
       <item quantity="one">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
-      <item quantity="many">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
       <item quantity="other">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
     </plurals>
     <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
       <item quantity="one">Pendant %d minute</item>
-      <item quantity="many">For %d minutes</item>
       <item quantity="other">Pendant %d minutes</item>
     </plurals>
     <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
       <item quantity="one">Pendant %d min</item>
-      <item quantity="many">For %d min</item>
       <item quantity="other">Pendant %d min</item>
     </plurals>
     <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
       <item quantity="one">Pendant %d heure</item>
-      <item quantity="many">For %d hours</item>
       <item quantity="other">Pendant %d heures</item>
     </plurals>
     <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
       <item quantity="one">Pendant %d h</item>
-      <item quantity="many">For %d hr</item>
       <item quantity="other">Pendant %d h</item>
     </plurals>
     <string name="zen_mode_until_next_day" msgid="1403042784161725038">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
@@ -1911,7 +1878,6 @@
     <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g> : <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
     <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
       <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
       <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item>
     </plurals>
     <string name="default_notification_channel_label" msgid="3697928973567217330">"Sans catégorie"</string>
@@ -1979,7 +1945,6 @@
     <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Aucune suggestion de remplissage automatique"</string>
     <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
       <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> suggestion de remplissage automatique</item>
-      <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> autofill suggestions</item>
       <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suggestions de remplissage automatique</item>
     </plurals>
     <string name="autofill_save_title" msgid="7719802414283739775">"Enregistrer sous "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
@@ -2074,7 +2039,6 @@
     <string name="car_loading_profile" msgid="8219978381196748070">"Chargement en cours…"</string>
     <plurals name="file_count" formatted="false" msgid="7063513834724389247">
       <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item>
-      <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
       <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item>
     </plurals>
     <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 9e0f60c..3a0d0cd 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -52,7 +52,6 @@
     <string name="enablePin" msgid="2543771964137091212">"Échec de l\'opération. Veuillez activer le verrouillage de la carte SIM/RUIM."</string>
     <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584">
       <item quantity="one">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM ne soit verrouillée.</item>
-      <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item>
       <item quantity="other">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM ne soit verrouillée.</item>
     </plurals>
     <string name="imei" msgid="2157082351232630390">"Code IMEI"</string>
@@ -180,7 +179,6 @@
     <string name="low_memory" product="default" msgid="2539532364144025569">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string>
     <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
       <item quantity="one">Autorité de certification installée</item>
-      <item quantity="many">Certificate authorities installed</item>
       <item quantity="other">Autorités de certification installées</item>
     </plurals>
     <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Par un tiers inconnu"</string>
@@ -256,7 +254,6 @@
     <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bug. Aucune capture d\'écran supplémentaire ne peut être prise, et vous ne pouvez saisir aucune autre information."</string>
     <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
       <item quantity="one">Capture d\'écran pour le rapport de bug dans <xliff:g id="NUMBER_1">%d</xliff:g> seconde</item>
-      <item quantity="many">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
       <item quantity="other">Capture d\'écran pour le rapport de bug dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes</item>
     </plurals>
     <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Capture d\'écran avec rapport de bug effectuée"</string>
@@ -356,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Permet à l\'application de recevoir et de traiter les MMS. Cette autorisation lui donne la possibilité de surveiller ou supprimer les messages envoyés à votre appareil sans vous les montrer."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Transférer les messages reçus via un canal de diffusion cellulaire"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Autorise l\'application à établir une connexion avec le module de diffusion cellulaire afin de transférer les messages reçus via un canal de diffusion cellulaire. Des alertes de diffusion cellulaire sont générées dans certaines régions afin de vous avertir de situations d\'urgence. Des applications malveillantes peuvent interférer avec les performances ou le fonctionnement de votre appareil lors de la réception d\'une alerte d\'urgence par diffusion cellulaire."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Gérer les appels en cours"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Autorise une application à afficher les détails concernant les appels en cours sur votre appareil et à contrôler ces appels."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"lire les messages reçus via un canal de diffusion cellulaire"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Permet à l\'application de lire les messages que votre appareil reçoit via un canal de diffusion cellulaire. Dans certaines zones géographiques, des alertes vous sont envoyées afin de vous prévenir en cas de situation d\'urgence. Les applications malveillantes peuvent venir perturber les performances ou le fonctionnement de votre appareil lorsqu\'un message est reçu via un canal de diffusion cellulaire."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"lire les flux auxquels vous êtes abonné"</string>
@@ -1010,7 +1005,6 @@
     <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Il y a plus d\'un mois"</string>
     <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
       <item quantity="one">Le dernier jour (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
-      <item quantity="many">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item>
       <item quantity="other">Les <xliff:g id="COUNT_1">%d</xliff:g> derniers jours</item>
     </plurals>
     <string name="last_month" msgid="1528906781083518683">"Le mois dernier"</string>
@@ -1033,82 +1027,66 @@
     <string name="now_string_shortest" msgid="3684914126941650330">"mainten."</string>
     <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
     </plurals>
     <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
     </plurals>
     <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> j</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> j</item>
     </plurals>
     <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
     </plurals>
     <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>m</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
     </plurals>
     <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>h</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item>
     </plurals>
     <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>d</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item>
     </plurals>
     <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>y</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item>
     </plurals>
     <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
       <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> minutes ago</item>
       <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
     </plurals>
     <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
       <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> heure</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> hours ago</item>
       <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> heures</item>
     </plurals>
     <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
       <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> days ago</item>
       <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
     </plurals>
     <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
       <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> an</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item>
       <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
     </plurals>
     <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
     </plurals>
     <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> heure</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> heures</item>
     </plurals>
     <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> days</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
     </plurals>
     <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
       <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> an</item>
-      <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> years</item>
       <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
     </plurals>
     <string name="VideoView_error_title" msgid="5750686717225068016">"Problème vidéo"</string>
@@ -1481,7 +1459,6 @@
     <string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string>
     <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
       <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item>
-      <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item>
       <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item>
     </plurals>
     <string name="action_mode_done" msgid="2536182504764803222">"OK"</string>
@@ -1615,7 +1592,6 @@
     <string name="kg_wrong_pin" msgid="3680925703673166482">"Code PIN incorrect."</string>
     <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
       <item quantity="one">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item>
-      <item quantity="many">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
       <item quantity="other">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item>
     </plurals>
     <string name="kg_pattern_instructions" msgid="8366024510502517748">"Dessinez votre schéma."</string>
@@ -1802,7 +1778,6 @@
     <string name="restr_pin_error_too_short" msgid="1547007808237941065">"Le code PIN est trop court. Il doit comporter au moins 4 chiffres."</string>
     <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
       <item quantity="one">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> seconde</item>
-      <item quantity="many">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item>
       <item quantity="other">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> secondes</item>
     </plurals>
     <string name="restr_pin_try_later" msgid="5897719962541636727">"Veuillez réessayer ultérieurement."</string>
@@ -1834,42 +1809,34 @@
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="one">Pendant %1$d minute (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
-      <item quantity="many">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
       <item quantity="other">Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
     </plurals>
     <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
       <item quantity="one">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
-      <item quantity="many">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
       <item quantity="other">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
     </plurals>
     <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
       <item quantity="one">Pendant %1$d heure (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
-      <item quantity="many">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
       <item quantity="other">Pendant %1$d heures (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
     </plurals>
     <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
       <item quantity="one">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
-      <item quantity="many">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
       <item quantity="other">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
     </plurals>
     <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
       <item quantity="one">Pendant %d minute</item>
-      <item quantity="many">For %d minutes</item>
       <item quantity="other">Pendant %d minutes</item>
     </plurals>
     <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
       <item quantity="one">Pendant %d min</item>
-      <item quantity="many">For %d min</item>
       <item quantity="other">Pendant %d min</item>
     </plurals>
     <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
       <item quantity="one">Pendant %d heure</item>
-      <item quantity="many">For %d hours</item>
       <item quantity="other">Pendant %d heures</item>
     </plurals>
     <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
       <item quantity="one">Pendant %d h</item>
-      <item quantity="many">For %d hr</item>
       <item quantity="other">Pendant %d h</item>
     </plurals>
     <string name="zen_mode_until_next_day" msgid="1403042784161725038">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
@@ -1911,7 +1878,6 @@
     <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g> : <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
     <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
       <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
       <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item>
     </plurals>
     <string name="default_notification_channel_label" msgid="3697928973567217330">"Sans catégorie"</string>
@@ -1979,7 +1945,6 @@
     <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Aucune suggestion de saisie automatique"</string>
     <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
       <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> suggestion de saisie automatique</item>
-      <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> autofill suggestions</item>
       <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suggestions de saisie automatique</item>
     </plurals>
     <string name="autofill_save_title" msgid="7719802414283739775">"Enregistrer dans "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ?"</string>
@@ -2074,7 +2039,6 @@
     <string name="car_loading_profile" msgid="8219978381196748070">"Chargement…"</string>
     <plurals name="file_count" formatted="false" msgid="7063513834724389247">
       <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item>
-      <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
       <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item>
     </plurals>
     <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 423b97f..8c21193 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Permite á aplicación recibir e procesar mensaxes MMS. Isto significa que a aplicación pode supervisar ou eliminar mensaxes enviadas ao teu dispositivo sen mostrarchas."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Reenviar mensaxes de difusión móbil"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Permite que a aplicación se vincule ao módulo de difusión móbil para reenviar as mensaxes deste tipo segundo se reciban. As alertas de difusión móbil envíanse nalgunhas localizacións para avisar de situacións de emerxencia. As aplicacións maliciosas poden interferir no rendemento ou funcionamento do teu dispositivo cando se reciba unha difusión móbil de emerxencia."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Xestionar as chamadas saíntes"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Permite que unha aplicación controle as chamadas saíntes do teu dispositivo e consulte os detalles sobre elas."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"ler mensaxes de difusión móbil"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Permite á aplicación ler mensaxes de difusión móbil recibidas polo teu dispositivo. As alertas de difusión móbil envíanse nalgunhas localizacións para avisar de situacións de emerxencia. É posible que aplicacións maliciosas afecten ao rendemento ou funcionamento do teu dispositivo cando se recibe unha difusión móbil de emerxencia."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"ler feeds subscritos"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 14347ee..48edb0c 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"ઍપ્લિકેશનને MMS સંદેશા પ્રાપ્ત કરવાની અને તેના પર પ્રક્રિયા કરવાની મંજૂરી આપે છે. આનો અર્થ એ કે ઍપ્લિકેશન તમને દર્શાવ્યા વિના તમારા ઉપકરણ પર મોકલેલ સંદેશાઓનું નિરીક્ષણ કરી શકે છે અથવા કાઢી નાખી શકે છે."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"સેલ બ્રોડકાસ્ટ સંદેશા ફૉરવર્ડ કરો"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"સેલ બ્રોડકાસ્ટ સંદેશા પ્રાપ્ત થાય કે તરત ફૉરવર્ડ કરવા માટે સેલ બ્રોડકાસ્ટ મૉડ્યૂલ સાથે પ્રતિબદ્ધ થવા બાબતે ઍપને મંજૂરી આપે છે. તમને કટોકટીની પરિસ્થિતિની ચેતવણી આપવા માટે સેલ બ્રોડકાસ્ટ અલર્ટ અમુક સ્થાનોમાં ડિલિવર કરવામાં આવે છે. કટોકટી અંગેનો સેલ બ્રોડકાસ્ટ પ્રાપ્ત થાય, ત્યારે દુર્ભાવનાપૂર્ણ ઍપ તમારા ડિવાઇસના કાર્યપ્રદર્શન અથવા ઑપરેશનમાં વિક્ષેપ પાડે તેમ બની શકે છે."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"ચાલી રહેલા કૉલ મેનેજ કરો"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"ઍપને તમારા ડિવાઇસ પર ચાલુ કૉલ વિશેની વિગતો જોવાની અને આ કૉલને નિયંત્રિત કરવાની મંજૂરી આપે છે."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"સેલ બ્રોડકાસ્ટ સંદેશા વાંચો"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"એપ્લિકેશનને તમારા ઉપકરણ દ્વારા પ્રાપ્ત થયેલ સેલ બ્રોડકાસ્ટ સંદેશાને વાંચવાની મંજૂરી આપે છે. સેલ બ્રોડકાસ્ટ ચેતવણીઓ તમને કટોકટીની સ્થિતિઓ અંગે ચેતવવા માટે કેટલાક સ્થાનોમાં વિતરિત થાય છે. જ્યારે કટોકટીનો સેલ બ્રોડકાસ્ટ પ્રાપ્ત થાય ત્યારે દુર્ભાવનાપૂર્ણ ઍપ્લિકેશનો તમારા ઉપકરણના પ્રદર્શન અથવા ઓપરેશનમાં હસ્તક્ષેપ કરી શકે છે."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"સબ્સ્ક્રાઇબ કરેલ ફીડ્સ વાંચો"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index ec0715b..9525801 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Lehetővé teszi az alkalmazás számára, hogy MMS-eket fogadjon és dolgozzon fel. Ez azt jelenti, hogy az alkalmazás megfigyelheti vagy törölheti a beérkező üzeneteket anélkül, hogy Ön látná azokat."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Cellán belüli üzenetek továbbítása"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Az alkalmazás összekapcsolódhat a cellán belüli üzenetszórás moduljával, hogy az érkezésükkor továbbítani tudja a cellán belüli üzeneteket. Bizonyos helyeken figyelmeztető üzeneteket kaphat a cellán belül a vészhelyzetekről. A rosszindulatú alkalmazások vészhelyzeti cellaüzenet érkezésekor befolyásolhatják az eszköz teljesítményét és működését."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Folyamatban lévő hívások kezelése"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Engedélyezi az alkalmazásnak, hogy az eszközén folyamatban lévő hívások részleteihez hozzáférjen, és vezérelje ezeket a hívásokat."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"cellán belüli üzenetek olvasása"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Lehetővé teszi az alkalmazás számára az eszközre érkező cellán belüli üzenetek olvasását. Bizonyos helyeken figyelmeztető üzeneteket kaphat a cellán belül a vészhelyzetekről. A rosszindulatú alkalmazások befolyásolhatják az eszköz  teljesítményét vagy működését vészhelyzeti cellaüzenet érkezésekor."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"feliratkozott hírcsatornák olvasása"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 099f819..e6b4977 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Memungkinkan aplikasi menerima dan memproses pesan MMS. Ini artinya aplikasi dapat memantau atau menghapus pesan yang dikirim ke perangkat Anda tanpa menunjukkannya kepada Anda."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Teruskan pesan cell broadcast"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Mengizinkan aplikasi mem-binding ke modul cell broadcast untuk meneruskan pesan cell broadcast saat pesan tersebut diterima. Notifikasi cell broadcast dikirim di beberapa lokasi untuk memperingatkan Anda tentang situasi darurat. Aplikasi berbahaya dapat mengganggu performa atau operasi perangkat saat cell broadcast darurat diterima."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Mengelola panggilan yang sedang berlangsung"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Mengizinkan aplikasi untuk melihat detail panggilan yang sedang berlangsung di perangkat dan mengontrolnya."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"membaca pesan siaran seluler"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Mengizinkan aplikasi membaca pesan siaran seluler yang diterima perangkat Anda. Notifikasi siaran seluler dikirimkan di beberapa lokasi untuk memperingatkan Anda tentang situasi darurat. Aplikasi berbahaya dapat mengganggu kinerja atau operasi perangkat Anda saat siaran seluler darurat diterima."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"baca feed langganan"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index dfa3770..b20a427 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"앱이 MMS 메시지를 수신하고 처리할 수 있도록 허용합니다. 앱이 사용자에게 표시하지 않고 기기로 전송된 메시지를 확인 또는 삭제할 수도 있습니다."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"셀 브로드캐스트 메시지 전달"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"셀 브로드캐스트 메시지를 수신하자마자 전달하기 위해 앱이 셀 브로드캐스트 모듈에 연결하도록 허용합니다. 비상 상황임을 알리기 위해 일부 지역에서 셀 브로드캐스트 경고가 전달됩니다. 비상 셀 브로드캐스트를 수신할 때 악성 앱이 기기의 성능이나 작동을 방해할 수 있습니다."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"진행 중인 전화 관리"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"앱에서 기기의 진행 중인 전화에 관한 세부정보를 확인하고 전화를 제어하도록 허용합니다."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"셀 브로드캐스트 메시지 읽기"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"앱이 기기가 수신한 셀 브로드캐스트 메시지를 읽을 수 있도록 합니다. 비상 상황임을 알리기 위해 일부 지역에서 셀 브로드캐스트 경고가 전달됩니다. 비상 셀 브로드캐스트를 수신할 때 악성 앱이 기기의 성능이나 작동을 방해할 수 있습니다."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"가입된 피드 읽기"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index bd6ecef..1e8b38b 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Колдонмого MMS билдирүүлөрүн кабыл алууга жана аларды иштетип чыгууга уруксат берет. Бул, колдонмо сизге билгизбестен түзмөгүңүзгө жөнөтүлгөн билдирүүлөрдү мониторлой же жок кыла алат дегенди билдирет."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Уюк жөнөтүүлөрүнүн билдирүүлөрүн башка номерге багыттоо"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Уюк жөнөтүүлөрүнүн билдирүүлөрү келген сайын башка номерге багыттап туруу үчүн колдонмого уюк жөнөтүүлөрүнүн модулу менен байланышууга уруксат берет. Шашылыш уюк жөнөтүүлөрү кээ бир жерлердеги өзгөчө кырдаалдар тууралуу сизге эскертүү үчүн жөнөтүлөт. Зыянкеч колдонмолор шашылыш уюк жөнөтүүлөрү кабыл алынганда түзмөктүн майнаптуулугуна же иштешине жолтоо болушу мүмкүн."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Учурдагы чалууларды башкаруу"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Колдонмого телефонуңузда аткарылып жаткан чалууларды көрүп, аларды көзөмөлдөөгө уруксат берет."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"уюктук берүү билдирүүлөрүн окуу"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Колдонмого түзмөгүңүз кабыл алган уюк берүүнүн билдирүүлөрүн окууга жол берет. Шашылыш эскертүү билдирүүлөрү кээ бир жерлердеги өзгөчө кырдаалдар тууралу сизди эскертүү үчүн жөнөтүлөт. Зыяндуу колдономолор шашылыш эскертүүлөр берилип жатканда, сиздин түзмөктүн иштешине жолтоо болушу мүмкүн."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"жазылган түрмөктөрдү окуу"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 49d3f44..edc8728 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -356,10 +356,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Ļauj lietotnei saņemt un apstrādāt multiziņas. Tas nozīmē, ka lietotne var pārraudzīt vai dzēst uz jūsu ierīci nosūtītos ziņojumus, neparādot tos jums."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Pārsūtīt šūnu apraides ziņojumus"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Ļauj piesaistīt lietotni šūnu apraides modulim, lai pārsūtītu šūnu apraides ziņojumus, tiklīdz tie tiek saņemti. Šūnu apraides brīdinājumi tiek piegādāti noteiktās atrašanās vietās, lai brīdinātu jūs par ārkārtas situācijām. Ļaunprātīgas lietotnes var traucēt ierīces veiktspēju vai darbības, kad ir saņemts ārkārtas šūnas apraides ziņojums."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Aktīvo zvanu pārvaldība"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Ļauj lietotnei skatīt detalizētu informāciju par aktīvajiem zvaniem jūsu ierīcē, kā arī kontrolēt šos zvanus."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"šūnu apraides ziņojumu lasīšana"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Ļauj lietotnei lasīt ierīcē saņemtos šūnu apraides ziņojumus. Šūnu apraides brīdinājumi tiek piegādāti dažās atrašanās vietās, lai brīdinātu jūs par ārkārtas situācijām. Ļaunprātīgas lietotnes var traucēt ierīces veiktspēju vai darbības, kad ir saņemts ārkārtas šūnas apraides ziņojums."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"lasīt abonētās plūsmas"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 3eca56c..a027b4c 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"MMS സന്ദേശങ്ങൾ നേടാനും പ്രോസസ്സുചെയ്യാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. നിങ്ങളുടെ ഉപകരണത്തിലേക്ക് അയയ്‌ക്കുന്ന സന്ദേശങ്ങൾ നിങ്ങൾക്ക് ദൃശ്യമാക്കാതെ തന്നെ അപ്ലിക്കേഷന് നിരീക്ഷിക്കാനോ ഇല്ലാതാക്കാനോ കഴിയുമെന്നാണ് ഇതിനർത്ഥം."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"ബ്രോഡ്‌കാസ്‌റ്റ് സന്ദേശങ്ങൾ കൈമാറുക"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"സ്വീകരിക്കുന്ന മുറയ്ക്ക് ബ്രോഡ്‌കാസ്‌റ്റ് സന്ദേശങ്ങൾ കൈമാറുന്നതിന് സെൽ ബ്രോഡ്‌കാസ്‌റ്റ് മോഡ്യൂളിലേക്ക് ബൈൻഡ് ചെയ്യാൻ ആപ്പിനെ അനുവദിക്കുന്നു. അടിയന്തര സാഹചര്യങ്ങളെ കുറിച്ച് നിങ്ങൾക്ക് മുന്നറിയിപ്പ് നൽകുന്നതിന് ചില ലൊക്കേഷനുകളിൽ സെൽ ബ്രോഡ്‌കാസ്‌റ്റ് അലേർട്ടുകൾ ഡെലിവറി ചെയ്യപ്പെടുന്നു. ഒരു അടിയന്തര സെൽ ബ്രോഡ്‌കാസ്റ്റ് ലഭിക്കുമ്പോൾ ക്ഷുദ്രകരമായ അപ്ലിക്കേഷനുകൾ നിങ്ങളുടെ ഉപകരണത്തിന്റെ പ്രകടനത്തെയോ പ്രവർത്തനത്തെയോ തടസപ്പെടുത്താനിടയുണ്ട്."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"നടന്നുകൊണ്ടിരിക്കുന്ന കോളുകൾ മാനേജ് ചെയ്യുക"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"നിങ്ങളുടെ ഉപകരണത്തിൽ നടന്നുകൊണ്ടിരിക്കുന്ന കോളുകളുടെ വിശദാംശങ്ങൾ കാണാനും ഈ കോളുകൾ നിയന്ത്രിക്കാനും ആപ്പിനെ അനുവദിക്കുന്നു."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"സെൽ പ്രക്ഷേപണ സന്ദേശങ്ങൾ റീഡുചെയ്യുക"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"നിങ്ങളുടെ ഉപകരണത്തിൽ ലഭിച്ച സെൽ പ്രക്ഷേപണ സന്ദേശങ്ങൾ റീഡുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. അടിയന്തര സാഹചര്യങ്ങളെക്കുറിച്ച് നിങ്ങൾക്ക് മുന്നറിയിപ്പ് നൽകാനായി ചില ലൊക്കേഷനുകളിൽ നൽകപ്പെടുന്നവയാണ് സെൽ പ്രക്ഷേപണ അലേർട്ടുകൾ. ഒരു അടിയന്തര സെൽ പ്രക്ഷേപണം ലഭിക്കുമ്പോൾ, ക്ഷുദ്രകരമായ അപ്ലിക്കേഷനുകൾ നിങ്ങളുടെ ഉപകരണത്തിന്റെ പ്രകടനമോ പ്രവർത്തനമോ തടസ്സപ്പെടുത്താനിടയുണ്ട്."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"സബ്‌സ്ക്രൈബ് ചെയ്‌ത ഫീഡുകൾ വായിക്കുക"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 635c5b7..705ab6b 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Membenarkan apl menerima dan memproses mesej MMS. Ini bermakna apl boleh memantau atau memadam mesej yang dihantar ke peranti anda tanpa menunjukkannya kepada anda."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Kirim semula mesej siaran sel"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Membenarkan apl terikat pada modul siaran sel untuk mengirim semula mesej siaran sel apabila diterima. Makluman siaran sel dihantar di sesetengah lokasi untuk memberi amaran kepada anda tentang situasi kecemasan. Apl hasad boleh mengganggu prestasi atau operasi peranti anda apabila siaran sel kecemasan diterima."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Urus panggilan yang sedang berjalan"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Benarkan apl melihat butiran panggilan yang sedang berjalan pada peranti anda dan mengawal panggilan ini."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"baca mesej siaran sel"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Membolehkan apl membaca mesej siaran sel yang diterima oleh peranti anda. Isyarat siaran sel dihantar di beberapa lokasi untuk memberi amaran kepada anda tentang situasi kecemasan. Apl hasad boleh mengganggu prestasi atau operasi peranti anda apabila siaran sel kecemasan diterima."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"baca suapan langganan"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 295a54e..2feb6af 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -359,10 +359,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Pozwala aplikacji na odbieranie i przetwarzanie MMS-ów. To oznacza, że aplikacja będzie mogła bez Twojej wiedzy monitorować i usuwać wiadomości wysyłane do Twojego urządzenia."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Przekaż komunikaty z sieci komórkowej"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Zezwala aplikacji powiązać się z modułem komunikatów z sieci komórkowej, aby przekazywać je w momencie, w którym są otrzymywane. W niektórych lokalizacjach komunikaty alarmowe z sieci komórkowej są dostarczane, aby ostrzec Cię o sytuacjach zagrożenia. Złośliwe aplikacje mogą wpływać na działanie urządzenia lub zakłócać je po nadejściu komunikatu alarmowego z sieci komórkowej."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Zarządzaj połączeniami w toku"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Zezwala aplikacji zobaczyć detale dotyczące połączeń w toku na Twoim urządzeniu i na kontrolę tych połączeń."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"odczyt komunikatów z sieci komórkowej"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Zezwala aplikacji na odczyt komunikatów z sieci komórkowej odebranych na urządzeniu. Komunikaty alarmowe z sieci komórkowej są dostarczane w niektórych lokalizacjach w celu ostrzeżenia Cię o sytuacjach zagrożenia. Złośliwe aplikacje mogą wpływać na wydajność lub zakłócać działanie urządzenia po odebraniu komunikatu alarmowego z sieci komórkowej."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"czytanie subskrybowanych źródeł"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 340b752..e73d96c 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -356,10 +356,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Permite aplicației să primească și să proceseze mesaje MMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitivul dvs. fără a vi le arăta."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Redirecționează mesajele cu transmisie celulară"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Permite aplicației să se conecteze la modulul de transmisie celulară pentru a redirecționa mesajele cu transmisie celulară pe măsură ce le primește. Alertele cu transmisie celulară sunt difuzate în unele locații pentru a vă avertiza cu privire la situațiile de urgență. Aplicațiile rău intenționate pot afecta performanța sau funcționarea dispozitivului dvs. când este primită o transmisie celulară de urgență."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Să gestioneze apelurile în desfășurare"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Permite unei aplicații să vadă detalii despre apelurile în desfășurare de pe dispozitiv și să gestioneze apelurile respective."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"citește mesajele cu transmisie celulară"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Permite aplicației să citească mesajele primite prin transmisie celulară de dispozitivul dvs. Alertele cu transmisie celulară sunt difuzate în unele locații pentru a vă avertiza cu privire la situațiile de urgență. Aplicațiile rău intenționate pot afecta performanța sau funcționarea dispozitivului dvs. când este primită o transmisie celulară de urgență."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"citire feeduri abonat"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 74d5bf9..7ca863a 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -359,10 +359,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Приложение сможет получать и обрабатывать MMS. Это значит, что оно сможет отслеживать и удалять отправленные на ваше устройство сообщения, не показывая их."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Пересылка сообщений для оповещения населения"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Приложение сможет выполнить привязку к модулю оповещения населения, чтобы пересылать сообщения широковещательных SMS-служб сразу после их получения. В некоторых странах эти сообщения используются для информирования об экстренных ситуациях. Вредоносное ПО может помешать работе устройства, на которое поступают такие сообщения."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Управление текущими звонками"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Приложение сможет управлять текущими звонками на вашем устройстве, а также получит доступ к сведениям о них"</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"Читать сообщения массовой рассылки"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Приложение получит доступ к сообщениям широковещательных SMS-служб, которые в некоторых странах используются для информирования населения об экстренных ситуациях. Вредоносные программы могут помешать работе устройства, на которое поступают такие сообщения."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"Просмотр фидов пользователя"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 25989bd9..18a1f98 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Lejon aplikacionin të marrë dhe përpunojë mesazhe MMS. Kjo do të thotë se aplikacioni mund të monitorojë ose fshijë mesazhe të dërguara në pajisjen tënde, pa t\'i treguar ato."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Transmeto mesazhet e transmetimit celular"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Lejon që aplikacioni të lidhet me modulin e transmetimit celular për t\'i transferuar mesazhet e transmetimit celular menjëherë kur merren. Sinjalizimet e transmetimit celular dërgohen në disa vendndodhje për të të paralajmëruar për situata urgjente. Aplikacionet keqdashëse mund të ndërhyjnë në cilësinë e funksionimit ose në veprimin e pajisjes sate kur merret një transmetim celular urgjent."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Menaxho telefonatat në vazhdim"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Lejon që një aplikacion të shikojë detaje rreth telefonatave në vazhdim dhe t\'i kontrollojë këto telefonata."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"lexo mesazhet e transmetimit të qelizës"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Lejon aplikacionin të lexojë mesazhet e transmetimit të qelizës, të marra nga pajisja jote. Alarmet e transmetimit të qelizës dërgohen në disa vendndodhje për të të paralajmëruar në situata urgjente. Aplikacionet keqdashëse mund të ndërhyjnë në veprimtarinë ose operacionin e pajisjes tënde kur merret një transmetim urgjent i qelizës."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"lexo informacione të abonuara"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 0818d80..2f342b1 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Inaruhusu programu kupokea na kuchakata ujumbe medianwai (MMS). Hii inamaanisha uwezo wa kuchunguza na kufuta ujumbe uliotumwa kwa kifaa chako bila ya kukuonyesha."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Sambaza ujumbe wa matangazo ya simu"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Huruhusu programu ipachikwe katika sehemu ya matangazo ya simu ili isambaze ujumbe wa matangazo ya simu unapopokewa. Arifa za matangazo ya simu huwasilishwa katika maeneo mengine ili kukuonya juu ya hali za dharura. Huenda programu hasidi zikatatiza utendaji au shughuli ya kifaa chako matangazo ya simu ya dharura yanapopokewa."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Dhibiti simu zinazoendelea"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Huruhusu programu kuangalia maelezo kuhusu simu zinazoendelea kwenye kifaa chako na kuzidhibiti."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"soma mawasiliano ya matangazo ya simu"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Huruhusu programu kusoma mawasiliano ya matangazo ya simu yaliyoingia kwenye kifaa chako. Arifa za matangazo ya simu huwasilishwa katika maeneo mengine ili kukuonya juu ya hali za dharura. Huenda programu hasidi zikatatiza utendajikazi au shughuli ya kifaa chako wakati matangazo ya simu ya dharura yameingia."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"kusoma mipasho kutoka vyanzo unavyofuatilia"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index b4d3380..4602abb8 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"MMS సందేశాలను స్వీకరించడానికి మరియు ప్రాసెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. యాప్ మీ డివైజ్‌కు పంపబడిన సందేశాలను మీకు చూపకుండానే పర్యవేక్షించగలదని లేదా తొలగించగలదని దీని అర్థం."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"సెల్ ప్రసార సందేశాలను ఫార్వర్డ్ చేయడం"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"సెల్ ప్రసార సందేశాలను అందుకుంటే, వాటిని ఫార్వర్డ్ చేసే విధంగా సెల్ ప్రసార మాడ్యూల్‌కు కట్టుబడి ఉండటానికి యాప్‌ను అనుమతిస్తుంది. సెల్ ప్రసార హెచ్చరికలు అత్యవసర పరిస్థితుల గురించి మిమ్మల్ని హెచ్చరించడానికి కొన్ని స్థానాల్లో అందించబడతాయి. అత్యవసర సెల్ ప్రసారం అందుకున్నప్పుడు హానికరమైన యాప్‌లు మీ పరికరం యొక్క పనితీరు లేదా నిర్వహణకు అంతరాయం కలిగించవచ్చు."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"కొనసాగుతున్న కాల్స్‌ను మేనేజ్ చేయి"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"మీ పరికరంలో కొనసాగుతున్న కాల్స్‌ను చూడటానికి అలాగే వాటిని కంట్రోల్ చేయడానికి ఒక యాప్‌కు అనుమతిస్తోంది."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"సెల్ ప్రసార సందేశాలను చదవడం"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"మీ పరికరం స్వీకరించిన సెల్ ప్రసార సందేశాలను చదవడానికి యాప్‌ను అనుమతిస్తుంది. సెల్ ప్రసార హెచ్చరికలు అత్యవసర పరిస్థితుల గురించి మిమ్మల్ని హెచ్చరించడానికి కొన్ని స్థానాల్లో అందించబడతాయి. అత్యవసర సెల్ ప్రసారం స్వీకరించినప్పుడు హానికరమైన యాప్‌లు మీ పరికరం యొక్క పనితీరు లేదా నిర్వహణకు అంతరాయం కలిగించవచ్చు."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"చందా చేయబడిన ఫీడ్‌లను చదవడం"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 96c15b1..324101d 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Uygulamaya MMS iletilerini alma ve işleme izni verir. Bu izin, uygulamanın cihazınıza gönderilen iletileri takip edip size göstermeden silebileceği anlamına gelir."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Hücre yayını mesajlarını yönlendirme"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Uygulamanın hücre yayını mesajları geldiğinde bunları yönlendirmek için hücre yayını modülüne bağlanmasına izin verir. Hücre yayını uyarıları bazı konumlarda acil durumlar hakkında sizi uyarmak için kullanılır. Zararlı uygulamalar acil durum hücre yayını alındığında cihazınızın performansını ve çalışmasını olumsuz etkileyebilir."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Devam eden aramaları yönetme"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Uygulamanın, cihazınızda devam eden aramalarla ilgili bilgileri görüp kontrol etmesine izin verir."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"hücre yayını mesajlarını oku"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Uygulamaya, cihazınız tarafından alınan hücre yayını mesajlarını okuma izni verir. Hücre yayını uyarıları bazı yerlerde acil durumlar konusunda sizi uyarmak için gönderilir. Kötü amaçlı uygulamalar acil hücre yayını alındığında cihazınızın performansına ya da çalışmasına engel olabilir."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"abone olunan yayınları okuma"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 8511edc..ba124a6 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -359,10 +359,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Дозволяє програмі отримувати й обробляти MMS-повідомлення. Це означає, що програма може відстежувати чи видаляти повідомлення, надіслані на ваш пристрій, навіть не показуючи їх вам."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Переадресувати повідомлення Cell Broadcast"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Дозволяє додатку зв\'язуватися з модулем Cell Broadcast, щоб переадресувати відповідні вхідні повідомлення. У деяких місцеположеннях сповіщення Cell Broadcast надсилаються для попередження про надзвичайні ситуації. Після повідомлення Cell Broadcast шкідливі додатки можуть перешкоджати роботі вашого пристрою."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Керування поточними дзвінками"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Дає змогу додатку переглядати поточні дзвінки на пристрої та керувати ними."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"читати широкомовні повідомлення мережі"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Дозволяє програмі читати широкомовні повідомлення мережі, отримані пристроєм. Широкомовні сповіщення мережі надсилаються в деяких країнах для попередження про надзвичайні ситуації. Шкідливі програми можуть втручатися у швидкодію чи роботу пристрою під час отримання широкомовного повідомлення мережі про надзвичайну ситуацію."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"читати підписані канали"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 8b27cd0..702f693 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Cho phép ứng dụng nhận và xử lý tin nhắn MMS. Điều này có nghĩa là ứng dụng có thể theo dõi hoặc xóa tin nhắn được gửi đến thiết bị của bạn mà không hiển thị chúng cho bạn."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Chuyển tiếp tin nhắn truyền phát trên di động"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Cho phép ứng dụng liên kết với mô-đun truyền phát trên di động để chuyển tiếp tin nhắn truyền phát trên di động ngay khi nhận được. Ở một số vị trí, thông báo truyền phát trên di động sẽ được gửi nhằm cảnh báo cho bạn về các tình huống khẩn cấp. Các ứng dụng độc hại có thể ảnh hưởng đến hiệu suất hoặc hoạt động của thiết bị khi nhận được tin nhắn truyền phát trên di động lúc khẩn cấp."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Quản lý cuộc gọi đang diễn ra"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Cho phép một ứng dụng xem thông tin chi tiết về các cuộc gọi đang diễn ra trên thiết bị và kiểm soát các cuộc gọi này."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"đọc tin nhắn quảng bá"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Cho phép ứng dụng đọc tin nhắn quảng bá mà thiết bị của bạn nhận được. Tin nhắn quảng bá cảnh báo được gửi ở một số địa điểm nhằm cảnh báo cho bạn về các tình huống khẩn cấp. Các ứng dụng độc hại có thể gây ảnh hưởng đến hiệu suất hoặc hoạt động của thiết bị của bạn khi nhận được tin nhắn quảng bá khẩn cấp."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"đọc nguồn cấp dữ liệu đã đăng ký"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 9826dfb..c8d8f11 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"允许该应用接收和处理彩信。这就意味着,该应用可能会监视发送到您设备的彩信,或删除发送到您设备的彩信而不向您显示。"</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"转发小区广播消息"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"允许应用绑定到小区广播模块,以便及时转发收到的小区广播消息。小区广播消息是在某些地区发送的、用于发布紧急情况警告的提醒信息。恶意应用可能会在您的设备收到紧急小区广播时干扰设备的性能或操作。"</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"管理正在进行的通话"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"允许应用查看有关设备上正在进行的通话的详细信息并控制这些通话。"</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"读取小区广播消息"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"允许应用读取您的设备收到的小区广播消息。小区广播消息是在某些地区发送的、用于发布紧急情况警告的提醒信息。恶意应用可能会在您收到小区紧急广播时干扰您设备的性能或操作。"</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"读取订阅的供稿"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index a034f0b..1194b49 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -353,10 +353,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"允許應用程式接收和處理多媒體訊息。這項設定可讓應用程式監控傳送至你裝置的訊息,或在你閱讀訊息前擅自刪除訊息。"</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"轉送區域廣播訊息"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"允許應用程式繫結至區域廣播模組,以便轉送收到的區域廣播訊息。某些地點會發出區域廣播警示,警告你有緊急狀況發生。請注意,惡意應用程式可能會在裝置收到緊急區域廣播時,干擾裝置的效能或運作。"</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"管理進行中的通話"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"允許應用程式查看裝置上進行中通話的詳細資料,並控制這些通話。"</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"讀取區域廣播訊息"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"允許應用程式讀取你裝置收到的區域廣播訊息。某些地點會發出區域廣播警示,警告你有緊急狀況發生。請注意,惡意應用程式可能會在裝置收到緊急區域廣播時,干擾裝置的效能或運作。"</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"讀取訂閱資訊提供"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index f4c3063..7ca3faf 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3871,6 +3871,9 @@
         <!-- Component name of an activity that allows the user to modify
              the settings for this service. -->
         <attr name="settingsActivity"/>
+        <!-- Whether the device must be screen on before routing data to this service.
+             The default is true.-->
+        <attr name="requireDeviceScreenOn" format="boolean"/>
     </declare-styleable>
 
     <!-- Use <code>offhost-apdu-service</code> as the root tag of the XML resource that
@@ -3889,6 +3892,12 @@
         <attr name="settingsActivity"/>
         <!-- Secure Element which the AIDs should be routed to -->
         <attr name="secureElementName" format="string"/>
+        <!-- Whether the device must be unlocked before routing data to this service.
+             The default is false.-->
+        <attr name="requireDeviceUnlock"/>
+        <!-- Whether the device must be screen on before routing data to this service.
+             The default is false.-->
+        <attr name="requireDeviceScreenOn"/>
     </declare-styleable>
 
     <!-- Specify one or more <code>aid-group</code> elements inside a
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 945b586..da658cc 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -4585,4 +4585,7 @@
 
     <!-- Package with global data query permissions for AppSearch -->
     <string name="config_globalAppSearchDataQuerierPackage" translatable="false"></string>
+
+    <!-- If true, attach the navigation bar to the app during app transition -->
+    <bool name="config_attachNavBarToAppDuringTransition">false</bool>
 </resources>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 4fd8ef6..5b19a48 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -480,7 +480,7 @@
     <dimen name="notification_inbox_item_top_padding">5dp</dimen>
 
     <!-- Size of the feedback indicator for notifications -->
-    <dimen name="notification_feedback_size">16dp</dimen>
+    <dimen name="notification_feedback_size">20dp</dimen>
 
     <!-- Size of the profile badge for notifications -->
     <dimen name="notification_badge_size">12dp</dimen>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 1e9a747..4313d4a 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3049,6 +3049,7 @@
     <public name="windowLayoutAffinity" />
     <!-- @hide -->
     <public name="windowBackgroundBlurRadius"/>
+    <public name="requireDeviceScreenOn" />
   </public-group>
 
   <public-group type="drawable" first-id="0x010800b5">
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 31aee4a..3a593b9 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -5366,6 +5366,14 @@
     <!-- Feedback Indicator -->
     <!-- Content description of the feedback icon in the notification. [CHAR LIMIT=NONE] -->
     <string name="notification_feedback_indicator">Provide Feedback</string>
+    <!-- Content description of the alerted feedback icon in the notification. [CHAR LIMIT=NONE] -->
+    <string name="notification_feedback_indicator_alerted">This notification was promoted to Default. Tap to provide feedback.</string>
+    <!-- Content description of the silenced feedback icon in the notification. [CHAR LIMIT=NONE] -->
+    <string name="notification_feedback_indicator_silenced">This notification was demoted to Silent. Tap to provide feedback.</string>
+    <!-- Content description of the promoted feedback icon in the notification. [CHAR LIMIT=NONE] -->
+    <string name="notification_feedback_indicator_promoted">This notification was ranked higher. Tap to provide feedback.</string>
+    <!-- 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>
 
     <!-- Dynamic mode battery saver strings -->
     <!-- The user visible name of the notification channel for the routine mode battery saver fyi notification [CHAR_LIMIT=80]-->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index de275a5..fa66451 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2252,6 +2252,10 @@
   <java-symbol type="string" name="ext_media_move_success_message" />
   <java-symbol type="string" name="ext_media_move_failure_title" />
   <java-symbol type="string" name="ext_media_move_failure_message" />
+  <java-symbol type="string" name="notification_feedback_indicator_alerted" />
+  <java-symbol type="string" name="notification_feedback_indicator_silenced" />
+  <java-symbol type="string" name="notification_feedback_indicator_promoted" />
+  <java-symbol type="string" name="notification_feedback_indicator_demoted" />
   <java-symbol type="style" name="Animation.RecentApplications" />
   <java-symbol type="integer" name="dock_enter_exit_duration" />
   <java-symbol type="bool" name="config_battery_percentage_setting_available" />
@@ -4128,4 +4132,6 @@
   <java-symbol type="color" name="accessibility_focus_highlight_color" />
   <!-- Width of the outline stroke used by the accessibility focus rectangle -->
   <java-symbol type="dimen" name="accessibility_focus_highlight_stroke_width" />
+
+  <java-symbol type="bool" name="config_attachNavBarToAppDuringTransition" />
 </resources>
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 1d9d9e8..8086ff2 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
@@ -142,12 +142,16 @@
         }
 
         BatteryConsumer requestedBatteryConsumer = null;
+        double totalModeledCpuPowerMah = 0;
 
         for (BatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
             if (batteryConsumerId(consumer).equals(batteryConsumerId)) {
                 requestedBatteryConsumer = consumer;
-                break;
             }
+
+            totalModeledCpuPowerMah += consumer.getConsumedPowerForCustomComponent(
+                    BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
+                            + BatteryConsumer.POWER_COMPONENT_CPU);
         }
 
         if (requestedBatterySipper == null) {
@@ -190,9 +194,17 @@
             addEntry("CPU", EntryType.POWER,
                     requestedBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU),
                     totalCpuPowerMah);
+            if (totalModeledCpuPowerMah != 0) {
+                addEntry("CPU (modeled)", EntryType.POWER,
+                        requestedBatteryConsumer.getConsumedPowerForCustomComponent(
+                                BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
+                                        + BatteryConsumer.POWER_COMPONENT_CPU),
+                        totalModeledCpuPowerMah);
+            }
+        } else {
+            addEntry("CPU (sipper)", EntryType.POWER,
+                    requestedBatterySipper.cpuPowerMah, totalCpuPowerMah);
         }
-        addEntry("CPU (sipper)", EntryType.POWER,
-                requestedBatterySipper.cpuPowerMah, totalCpuPowerMah);
         addEntry("System services", EntryType.POWER,
                 requestedBatterySipper.systemServiceCpuPowerMah, totalSystemServiceCpuPowerMah);
         if (requestedBatteryConsumer != null) {
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 4978010f..87a175a 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
@@ -21,6 +21,7 @@
 import android.os.BatteryStats;
 import android.os.BatteryStatsManager;
 import android.os.BatteryUsageStats;
+import android.os.BatteryUsageStatsQuery;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -197,7 +198,10 @@
 
         @Override
         public BatteryUsageStats loadInBackground() {
-            return mBatteryStatsManager.getBatteryUsageStats();
+            final BatteryUsageStatsQuery query = new BatteryUsageStatsQuery.Builder()
+                    .includeModeled()
+                    .build();
+            return mBatteryStatsManager.getBatteryUsageStats(query);
         }
 
         @Override
diff --git a/core/tests/coretests/src/android/app/appsearch/external/app/cts/AppSearchResultCtsTest.java b/core/tests/coretests/src/android/app/appsearch/external/app/cts/AppSearchResultCtsTest.java
deleted file mode 100644
index 9c34b17..0000000
--- a/core/tests/coretests/src/android/app/appsearch/external/app/cts/AppSearchResultCtsTest.java
+++ /dev/null
@@ -1,79 +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.cts;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.appsearch.AppSearchResult;
-
-import org.junit.Test;
-
-public class AppSearchResultCtsTest {
-
-    @Test
-    public void testResultEquals_identical() {
-        AppSearchResult<String> result1 = AppSearchResult.newSuccessfulResult("String");
-        AppSearchResult<String> result2 = AppSearchResult.newSuccessfulResult("String");
-
-        assertThat(result1).isEqualTo(result2);
-        assertThat(result1.hashCode()).isEqualTo(result2.hashCode());
-
-        AppSearchResult<String> result3 =
-                AppSearchResult.newFailedResult(
-                        AppSearchResult.RESULT_INTERNAL_ERROR, "errorMessage");
-        AppSearchResult<String> result4 =
-                AppSearchResult.newFailedResult(
-                        AppSearchResult.RESULT_INTERNAL_ERROR, "errorMessage");
-
-        assertThat(result3).isEqualTo(result4);
-        assertThat(result3.hashCode()).isEqualTo(result4.hashCode());
-    }
-
-    @Test
-    public void testResultEquals_failure() {
-        AppSearchResult<String> result1 = AppSearchResult.newSuccessfulResult("String");
-        AppSearchResult<String> result2 = AppSearchResult.newSuccessfulResult("Wrong");
-        AppSearchResult<String> resultNull = AppSearchResult.newSuccessfulResult(/*value=*/ null);
-
-        assertThat(result1).isNotEqualTo(result2);
-        assertThat(result1.hashCode()).isNotEqualTo(result2.hashCode());
-        assertThat(result1).isNotEqualTo(resultNull);
-        assertThat(result1.hashCode()).isNotEqualTo(resultNull.hashCode());
-
-        AppSearchResult<String> result3 =
-                AppSearchResult.newFailedResult(
-                        AppSearchResult.RESULT_INTERNAL_ERROR, "errorMessage");
-        AppSearchResult<String> result4 =
-                AppSearchResult.newFailedResult(AppSearchResult.RESULT_IO_ERROR, "errorMessage");
-
-        assertThat(result3).isNotEqualTo(result4);
-        assertThat(result3.hashCode()).isNotEqualTo(result4.hashCode());
-
-        AppSearchResult<String> result5 =
-                AppSearchResult.newFailedResult(AppSearchResult.RESULT_INTERNAL_ERROR, "Wrong");
-
-        assertThat(result3).isNotEqualTo(result5);
-        assertThat(result3.hashCode()).isNotEqualTo(result5.hashCode());
-
-        AppSearchResult<String> result6 =
-                AppSearchResult.newFailedResult(
-                        AppSearchResult.RESULT_INTERNAL_ERROR, /*errorMessage=*/ null);
-
-        assertThat(result3).isNotEqualTo(result6);
-        assertThat(result3.hashCode()).isNotEqualTo(result6.hashCode());
-    }
-}
diff --git a/core/tests/coretests/src/android/app/appsearch/external/app/cts/AppSearchSchemaCtsTest.java b/core/tests/coretests/src/android/app/appsearch/external/app/cts/AppSearchSchemaCtsTest.java
deleted file mode 100644
index 7072a81..0000000
--- a/core/tests/coretests/src/android/app/appsearch/external/app/cts/AppSearchSchemaCtsTest.java
+++ /dev/null
@@ -1,202 +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.cts;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.testng.Assert.expectThrows;
-
-import android.app.appsearch.AppSearchSchema;
-import android.app.appsearch.AppSearchSchema.PropertyConfig;
-import android.app.appsearch.exceptions.IllegalSchemaException;
-
-import org.junit.Test;
-
-public class AppSearchSchemaCtsTest {
-    @Test
-    public void testInvalidEnums() {
-        PropertyConfig.Builder builder = new PropertyConfig.Builder("test");
-        expectThrows(IllegalArgumentException.class, () -> builder.setDataType(99));
-        expectThrows(IllegalArgumentException.class, () -> builder.setCardinality(99));
-    }
-
-    @Test
-    public void testMissingFields() {
-        PropertyConfig.Builder builder = new PropertyConfig.Builder("test");
-        IllegalSchemaException e = expectThrows(IllegalSchemaException.class, builder::build);
-        assertThat(e).hasMessageThat().contains("Missing field: dataType");
-
-        builder.setDataType(PropertyConfig.DATA_TYPE_DOCUMENT);
-        e = expectThrows(IllegalSchemaException.class, builder::build);
-        assertThat(e).hasMessageThat().contains("Missing field: schemaType");
-
-        builder.setSchemaType("TestType");
-        e = expectThrows(IllegalSchemaException.class, builder::build);
-        assertThat(e).hasMessageThat().contains("Missing field: cardinality");
-
-        builder.setCardinality(PropertyConfig.CARDINALITY_REPEATED);
-        builder.build();
-    }
-
-    @Test
-    public void testDuplicateProperties() {
-        AppSearchSchema.Builder builder =
-                new AppSearchSchema.Builder("Email")
-                        .addProperty(
-                                new PropertyConfig.Builder("subject")
-                                        .setDataType(PropertyConfig.DATA_TYPE_STRING)
-                                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
-                                        .setIndexingType(PropertyConfig.INDEXING_TYPE_PREFIXES)
-                                        .setTokenizerType(PropertyConfig.TOKENIZER_TYPE_PLAIN)
-                                        .build());
-        IllegalSchemaException e =
-                expectThrows(
-                        IllegalSchemaException.class,
-                        () ->
-                                builder.addProperty(
-                                        new PropertyConfig.Builder("subject")
-                                                .setDataType(PropertyConfig.DATA_TYPE_STRING)
-                                                .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
-                                                .setIndexingType(
-                                                        PropertyConfig.INDEXING_TYPE_PREFIXES)
-                                                .setTokenizerType(
-                                                        PropertyConfig.TOKENIZER_TYPE_PLAIN)
-                                                .build()));
-        assertThat(e).hasMessageThat().contains("Property defined more than once: subject");
-    }
-
-    @Test
-    public void testEquals_identical() {
-        AppSearchSchema schema1 =
-                new AppSearchSchema.Builder("Email")
-                        .addProperty(
-                                new PropertyConfig.Builder("subject")
-                                        .setDataType(PropertyConfig.DATA_TYPE_STRING)
-                                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
-                                        .setIndexingType(PropertyConfig.INDEXING_TYPE_PREFIXES)
-                                        .setTokenizerType(PropertyConfig.TOKENIZER_TYPE_PLAIN)
-                                        .build())
-                        .build();
-        AppSearchSchema schema2 =
-                new AppSearchSchema.Builder("Email")
-                        .addProperty(
-                                new PropertyConfig.Builder("subject")
-                                        .setDataType(PropertyConfig.DATA_TYPE_STRING)
-                                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
-                                        .setIndexingType(PropertyConfig.INDEXING_TYPE_PREFIXES)
-                                        .setTokenizerType(PropertyConfig.TOKENIZER_TYPE_PLAIN)
-                                        .build())
-                        .build();
-        assertThat(schema1).isEqualTo(schema2);
-        assertThat(schema1.hashCode()).isEqualTo(schema2.hashCode());
-    }
-
-    @Test
-    public void testEquals_differentOrder() {
-        AppSearchSchema schema1 =
-                new AppSearchSchema.Builder("Email")
-                        .addProperty(
-                                new PropertyConfig.Builder("subject")
-                                        .setDataType(PropertyConfig.DATA_TYPE_STRING)
-                                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
-                                        .setIndexingType(PropertyConfig.INDEXING_TYPE_PREFIXES)
-                                        .setTokenizerType(PropertyConfig.TOKENIZER_TYPE_PLAIN)
-                                        .build())
-                        .build();
-        AppSearchSchema schema2 =
-                new AppSearchSchema.Builder("Email")
-                        .addProperty(
-                                new PropertyConfig.Builder("subject")
-                                        .setTokenizerType(PropertyConfig.TOKENIZER_TYPE_PLAIN)
-                                        .setIndexingType(PropertyConfig.INDEXING_TYPE_PREFIXES)
-                                        .setDataType(PropertyConfig.DATA_TYPE_STRING)
-                                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
-                                        .build())
-                        .build();
-        assertThat(schema1).isEqualTo(schema2);
-        assertThat(schema1.hashCode()).isEqualTo(schema2.hashCode());
-    }
-
-    @Test
-    public void testEquals_failure() {
-        AppSearchSchema schema1 =
-                new AppSearchSchema.Builder("Email")
-                        .addProperty(
-                                new PropertyConfig.Builder("subject")
-                                        .setDataType(PropertyConfig.DATA_TYPE_STRING)
-                                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
-                                        .setIndexingType(PropertyConfig.INDEXING_TYPE_PREFIXES)
-                                        .setTokenizerType(PropertyConfig.TOKENIZER_TYPE_PLAIN)
-                                        .build())
-                        .build();
-        AppSearchSchema schema2 =
-                new AppSearchSchema.Builder("Email")
-                        .addProperty(
-                                new PropertyConfig.Builder("subject")
-                                        .setDataType(PropertyConfig.DATA_TYPE_STRING)
-                                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
-                                        .setIndexingType(
-                                                PropertyConfig
-                                                        .INDEXING_TYPE_EXACT_TERMS) // Different
-                                        .setTokenizerType(PropertyConfig.TOKENIZER_TYPE_PLAIN)
-                                        .build())
-                        .build();
-        assertThat(schema1).isNotEqualTo(schema2);
-        assertThat(schema1.hashCode()).isNotEqualTo(schema2.hashCode());
-    }
-
-    @Test
-    public void testEquals_failure_differentOrder() {
-        AppSearchSchema schema1 =
-                new AppSearchSchema.Builder("Email")
-                        .addProperty(
-                                new PropertyConfig.Builder("subject")
-                                        .setDataType(PropertyConfig.DATA_TYPE_STRING)
-                                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
-                                        .setIndexingType(PropertyConfig.INDEXING_TYPE_PREFIXES)
-                                        .setTokenizerType(PropertyConfig.TOKENIZER_TYPE_PLAIN)
-                                        .build())
-                        .addProperty(
-                                new PropertyConfig.Builder("body")
-                                        .setDataType(PropertyConfig.DATA_TYPE_STRING)
-                                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
-                                        .setIndexingType(PropertyConfig.INDEXING_TYPE_PREFIXES)
-                                        .setTokenizerType(PropertyConfig.TOKENIZER_TYPE_PLAIN)
-                                        .build())
-                        .build();
-        // Order of 'body' and 'subject' has been switched
-        AppSearchSchema schema2 =
-                new AppSearchSchema.Builder("Email")
-                        .addProperty(
-                                new PropertyConfig.Builder("body")
-                                        .setDataType(PropertyConfig.DATA_TYPE_STRING)
-                                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
-                                        .setIndexingType(PropertyConfig.INDEXING_TYPE_PREFIXES)
-                                        .setTokenizerType(PropertyConfig.TOKENIZER_TYPE_PLAIN)
-                                        .build())
-                        .addProperty(
-                                new PropertyConfig.Builder("subject")
-                                        .setDataType(PropertyConfig.DATA_TYPE_STRING)
-                                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
-                                        .setIndexingType(PropertyConfig.INDEXING_TYPE_PREFIXES)
-                                        .setTokenizerType(PropertyConfig.TOKENIZER_TYPE_PLAIN)
-                                        .build())
-                        .build();
-        assertThat(schema1).isNotEqualTo(schema2);
-        assertThat(schema1.hashCode()).isNotEqualTo(schema2.hashCode());
-    }
-}
diff --git a/core/tests/coretests/src/android/app/appsearch/external/app/cts/GenericDocumentCtsTest.java b/core/tests/coretests/src/android/app/appsearch/external/app/cts/GenericDocumentCtsTest.java
deleted file mode 100644
index 657d556..0000000
--- a/core/tests/coretests/src/android/app/appsearch/external/app/cts/GenericDocumentCtsTest.java
+++ /dev/null
@@ -1,286 +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.cts;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.testng.Assert.expectThrows;
-
-import android.app.appsearch.GenericDocument;
-
-import org.junit.Test;
-
-public class GenericDocumentCtsTest {
-    private static final byte[] sByteArray1 = new byte[] {(byte) 1, (byte) 2, (byte) 3};
-    private static final byte[] sByteArray2 = new byte[] {(byte) 4, (byte) 5, (byte) 6, (byte) 7};
-    private static final GenericDocument sDocumentProperties1 =
-            new GenericDocument.Builder<>("sDocumentProperties1", "sDocumentPropertiesSchemaType1")
-                    .setCreationTimestampMillis(12345L)
-                    .build();
-    private static final GenericDocument sDocumentProperties2 =
-            new GenericDocument.Builder<>("sDocumentProperties2", "sDocumentPropertiesSchemaType2")
-                    .setCreationTimestampMillis(6789L)
-                    .build();
-
-    @Test
-    public void testDocumentEquals_identical() {
-        GenericDocument document1 =
-                new GenericDocument.Builder<>("uri1", "schemaType1")
-                        .setCreationTimestampMillis(5L)
-                        .setTtlMillis(1L)
-                        .setPropertyLong("longKey1", 1L, 2L, 3L)
-                        .setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0)
-                        .setPropertyBoolean("booleanKey1", true, false, true)
-                        .setPropertyString(
-                                "stringKey1", "test-value1", "test-value2", "test-value3")
-                        .setPropertyBytes("byteKey1", sByteArray1, sByteArray2)
-                        .setPropertyDocument(
-                                "documentKey1", sDocumentProperties1, sDocumentProperties2)
-                        .build();
-        GenericDocument document2 =
-                new GenericDocument.Builder<>("uri1", "schemaType1")
-                        .setCreationTimestampMillis(5L)
-                        .setTtlMillis(1L)
-                        .setPropertyLong("longKey1", 1L, 2L, 3L)
-                        .setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0)
-                        .setPropertyBoolean("booleanKey1", true, false, true)
-                        .setPropertyString(
-                                "stringKey1", "test-value1", "test-value2", "test-value3")
-                        .setPropertyBytes("byteKey1", sByteArray1, sByteArray2)
-                        .setPropertyDocument(
-                                "documentKey1", sDocumentProperties1, sDocumentProperties2)
-                        .build();
-        assertThat(document1).isEqualTo(document2);
-        assertThat(document1.hashCode()).isEqualTo(document2.hashCode());
-    }
-
-    @Test
-    public void testDocumentEquals_differentOrder() {
-        GenericDocument document1 =
-                new GenericDocument.Builder<>("uri1", "schemaType1")
-                        .setCreationTimestampMillis(5L)
-                        .setPropertyLong("longKey1", 1L, 2L, 3L)
-                        .setPropertyBytes("byteKey1", sByteArray1, sByteArray2)
-                        .setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0)
-                        .setPropertyBoolean("booleanKey1", true, false, true)
-                        .setPropertyDocument(
-                                "documentKey1", sDocumentProperties1, sDocumentProperties2)
-                        .setPropertyString(
-                                "stringKey1", "test-value1", "test-value2", "test-value3")
-                        .build();
-
-        // Create second document with same parameter but different order.
-        GenericDocument document2 =
-                new GenericDocument.Builder<>("uri1", "schemaType1")
-                        .setCreationTimestampMillis(5L)
-                        .setPropertyBoolean("booleanKey1", true, false, true)
-                        .setPropertyDocument(
-                                "documentKey1", sDocumentProperties1, sDocumentProperties2)
-                        .setPropertyString(
-                                "stringKey1", "test-value1", "test-value2", "test-value3")
-                        .setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0)
-                        .setPropertyBytes("byteKey1", sByteArray1, sByteArray2)
-                        .setPropertyLong("longKey1", 1L, 2L, 3L)
-                        .build();
-        assertThat(document1).isEqualTo(document2);
-        assertThat(document1.hashCode()).isEqualTo(document2.hashCode());
-    }
-
-    @Test
-    public void testDocumentEquals_failure() {
-        GenericDocument document1 =
-                new GenericDocument.Builder<>("uri1", "schemaType1")
-                        .setCreationTimestampMillis(5L)
-                        .setPropertyLong("longKey1", 1L, 2L, 3L)
-                        .build();
-
-        // Create second document with same order but different value.
-        GenericDocument document2 =
-                new GenericDocument.Builder<>("uri1", "schemaType1")
-                        .setCreationTimestampMillis(5L)
-                        .setPropertyLong("longKey1", 1L, 2L, 4L) // Different
-                        .build();
-        assertThat(document1).isNotEqualTo(document2);
-        assertThat(document1.hashCode()).isNotEqualTo(document2.hashCode());
-    }
-
-    @Test
-    public void testDocumentEquals_repeatedFieldOrder_failure() {
-        GenericDocument document1 =
-                new GenericDocument.Builder<>("uri1", "schemaType1")
-                        .setCreationTimestampMillis(5L)
-                        .setPropertyBoolean("booleanKey1", true, false, true)
-                        .build();
-
-        // Create second document with same order but different value.
-        GenericDocument document2 =
-                new GenericDocument.Builder<>("uri1", "schemaType1")
-                        .setCreationTimestampMillis(5L)
-                        .setPropertyBoolean("booleanKey1", true, true, false) // Different
-                        .build();
-        assertThat(document1).isNotEqualTo(document2);
-        assertThat(document1.hashCode()).isNotEqualTo(document2.hashCode());
-    }
-
-    @Test
-    public void testDocumentGetSingleValue() {
-        GenericDocument document =
-                new GenericDocument.Builder<>("uri1", "schemaType1")
-                        .setCreationTimestampMillis(5L)
-                        .setScore(1)
-                        .setTtlMillis(1L)
-                        .setPropertyLong("longKey1", 1L)
-                        .setPropertyDouble("doubleKey1", 1.0)
-                        .setPropertyBoolean("booleanKey1", true)
-                        .setPropertyString("stringKey1", "test-value1")
-                        .setPropertyBytes("byteKey1", sByteArray1)
-                        .setPropertyDocument("documentKey1", sDocumentProperties1)
-                        .build();
-        assertThat(document.getUri()).isEqualTo("uri1");
-        assertThat(document.getTtlMillis()).isEqualTo(1L);
-        assertThat(document.getSchemaType()).isEqualTo("schemaType1");
-        assertThat(document.getCreationTimestampMillis()).isEqualTo(5);
-        assertThat(document.getScore()).isEqualTo(1);
-        assertThat(document.getPropertyLong("longKey1")).isEqualTo(1L);
-        assertThat(document.getPropertyDouble("doubleKey1")).isEqualTo(1.0);
-        assertThat(document.getPropertyBoolean("booleanKey1")).isTrue();
-        assertThat(document.getPropertyString("stringKey1")).isEqualTo("test-value1");
-        assertThat(document.getPropertyBytes("byteKey1"))
-                .asList()
-                .containsExactly((byte) 1, (byte) 2, (byte) 3);
-        assertThat(document.getPropertyDocument("documentKey1")).isEqualTo(sDocumentProperties1);
-    }
-
-    @Test
-    public void testDocumentGetArrayValues() {
-        GenericDocument document =
-                new GenericDocument.Builder<>("uri1", "schemaType1")
-                        .setCreationTimestampMillis(5L)
-                        .setPropertyLong("longKey1", 1L, 2L, 3L)
-                        .setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0)
-                        .setPropertyBoolean("booleanKey1", true, false, true)
-                        .setPropertyString(
-                                "stringKey1", "test-value1", "test-value2", "test-value3")
-                        .setPropertyBytes("byteKey1", sByteArray1, sByteArray2)
-                        .setPropertyDocument(
-                                "documentKey1", sDocumentProperties1, sDocumentProperties2)
-                        .build();
-
-        assertThat(document.getUri()).isEqualTo("uri1");
-        assertThat(document.getSchemaType()).isEqualTo("schemaType1");
-        assertThat(document.getPropertyLongArray("longKey1")).asList().containsExactly(1L, 2L, 3L);
-        assertThat(document.getPropertyDoubleArray("doubleKey1"))
-                .usingExactEquality()
-                .containsExactly(1.0, 2.0, 3.0);
-        assertThat(document.getPropertyBooleanArray("booleanKey1"))
-                .asList()
-                .containsExactly(true, false, true);
-        assertThat(document.getPropertyStringArray("stringKey1"))
-                .asList()
-                .containsExactly("test-value1", "test-value2", "test-value3");
-        assertThat(document.getPropertyBytesArray("byteKey1"))
-                .asList()
-                .containsExactly(sByteArray1, sByteArray2);
-        assertThat(document.getPropertyDocumentArray("documentKey1"))
-                .asList()
-                .containsExactly(sDocumentProperties1, sDocumentProperties2);
-    }
-
-    @Test
-    public void testDocument_toString() {
-        GenericDocument document =
-                new GenericDocument.Builder<>("uri1", "schemaType1")
-                        .setCreationTimestampMillis(5L)
-                        .setPropertyLong("longKey1", 1L, 2L, 3L)
-                        .setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0)
-                        .setPropertyBoolean("booleanKey1", true, false, true)
-                        .setPropertyString("stringKey1", "String1", "String2", "String3")
-                        .setPropertyBytes("byteKey1", sByteArray1, sByteArray2)
-                        .setPropertyDocument(
-                                "documentKey1", sDocumentProperties1, sDocumentProperties2)
-                        .build();
-        String exceptedString =
-                "{ key: 'creationTimestampMillis' value: 5 } "
-                        + "{ key: 'namespace' value:  } "
-                        + "{ key: 'properties' value: "
-                        + "{ key: 'booleanKey1' value: [ 'true' 'false' 'true' ] } "
-                        + "{ key: 'byteKey1' value: "
-                        + "{ key: 'byteArray' value: [ '1' '2' '3' ] } "
-                        + "{ key: 'byteArray' value: [ '4' '5' '6' '7' ] }  } "
-                        + "{ key: 'documentKey1' value: [ '"
-                        + "{ key: 'creationTimestampMillis' value: 12345 } "
-                        + "{ key: 'namespace' value:  } "
-                        + "{ key: 'properties' value:  } "
-                        + "{ key: 'schemaType' value: sDocumentPropertiesSchemaType1 } "
-                        + "{ key: 'score' value: 0 } "
-                        + "{ key: 'ttlMillis' value: 0 } "
-                        + "{ key: 'uri' value: sDocumentProperties1 } ' '"
-                        + "{ key: 'creationTimestampMillis' value: 6789 } "
-                        + "{ key: 'namespace' value:  } "
-                        + "{ key: 'properties' value:  } "
-                        + "{ key: 'schemaType' value: sDocumentPropertiesSchemaType2 } "
-                        + "{ key: 'score' value: 0 } "
-                        + "{ key: 'ttlMillis' value: 0 } "
-                        + "{ key: 'uri' value: sDocumentProperties2 } ' ] } "
-                        + "{ key: 'doubleKey1' value: [ '1.0' '2.0' '3.0' ] } "
-                        + "{ key: 'longKey1' value: [ '1' '2' '3' ] } "
-                        + "{ key: 'stringKey1' value: [ 'String1' 'String2' 'String3' ] }  } "
-                        + "{ key: 'schemaType' value: schemaType1 } "
-                        + "{ key: 'score' value: 0 } "
-                        + "{ key: 'ttlMillis' value: 0 } "
-                        + "{ key: 'uri' value: uri1 } ";
-        assertThat(document.toString()).isEqualTo(exceptedString);
-    }
-
-    @Test
-    public void testDocumentGetValues_differentTypes() {
-        GenericDocument document =
-                new GenericDocument.Builder<>("uri1", "schemaType1")
-                        .setScore(1)
-                        .setPropertyLong("longKey1", 1L)
-                        .setPropertyBoolean("booleanKey1", true, false, true)
-                        .setPropertyString(
-                                "stringKey1", "test-value1", "test-value2", "test-value3")
-                        .build();
-
-        // Get a value for a key that doesn't exist
-        assertThat(document.getPropertyDouble("doubleKey1")).isEqualTo(0.0);
-        assertThat(document.getPropertyDoubleArray("doubleKey1")).isNull();
-
-        // Get a value with a single element as an array and as a single value
-        assertThat(document.getPropertyLong("longKey1")).isEqualTo(1L);
-        assertThat(document.getPropertyLongArray("longKey1")).asList().containsExactly(1L);
-
-        // Get a value with multiple elements as an array and as a single value
-        assertThat(document.getPropertyString("stringKey1")).isEqualTo("test-value1");
-        assertThat(document.getPropertyStringArray("stringKey1"))
-                .asList()
-                .containsExactly("test-value1", "test-value2", "test-value3");
-
-        // Get a value of the wrong type
-        assertThat(document.getPropertyDouble("longKey1")).isEqualTo(0.0);
-        assertThat(document.getPropertyDoubleArray("longKey1")).isNull();
-    }
-
-    @Test
-    public void testDocumentInvalid() {
-        GenericDocument.Builder<?> builder = new GenericDocument.Builder<>("uri1", "schemaType1");
-        expectThrows(
-                IllegalArgumentException.class,
-                () -> builder.setPropertyBoolean("test", new boolean[] {}));
-    }
-}
diff --git a/core/tests/coretests/src/android/app/appsearch/external/app/cts/SearchSpecCtsTest.java b/core/tests/coretests/src/android/app/appsearch/external/app/cts/SearchSpecCtsTest.java
deleted file mode 100644
index 50bca27..0000000
--- a/core/tests/coretests/src/android/app/appsearch/external/app/cts/SearchSpecCtsTest.java
+++ /dev/null
@@ -1,67 +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.cts;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.testng.Assert.expectThrows;
-
-import android.app.appsearch.SearchSpec;
-
-import org.junit.Test;
-
-public class SearchSpecCtsTest {
-    @Test
-    public void buildSearchSpecWithoutTermMatchType() {
-        RuntimeException e =
-                expectThrows(
-                        RuntimeException.class,
-                        () -> new SearchSpec.Builder().addSchemaType("testSchemaType").build());
-        assertThat(e).hasMessageThat().contains("Missing termMatchType field");
-    }
-
-    @Test
-    public void testBuildSearchSpec() {
-        SearchSpec searchSpec =
-                new SearchSpec.Builder()
-                        .setTermMatch(SearchSpec.TERM_MATCH_PREFIX)
-                        .addNamespace("namespace1", "namespace2")
-                        .addSchemaType("schemaTypes1", "schemaTypes2")
-                        .setSnippetCount(5)
-                        .setSnippetCountPerProperty(10)
-                        .setMaxSnippetSize(15)
-                        .setResultCountPerPage(42)
-                        .setOrder(SearchSpec.ORDER_ASCENDING)
-                        .setRankingStrategy(SearchSpec.RANKING_STRATEGY_DOCUMENT_SCORE)
-                        .build();
-
-        assertThat(searchSpec.getTermMatch()).isEqualTo(SearchSpec.TERM_MATCH_PREFIX);
-        assertThat(searchSpec.getNamespaces())
-                .containsExactly("namespace1", "namespace2")
-                .inOrder();
-        assertThat(searchSpec.getSchemaTypes())
-                .containsExactly("schemaTypes1", "schemaTypes2")
-                .inOrder();
-        assertThat(searchSpec.getSnippetCount()).isEqualTo(5);
-        assertThat(searchSpec.getSnippetCountPerProperty()).isEqualTo(10);
-        assertThat(searchSpec.getMaxSnippetSize()).isEqualTo(15);
-        assertThat(searchSpec.getResultCountPerPage()).isEqualTo(42);
-        assertThat(searchSpec.getOrder()).isEqualTo(SearchSpec.ORDER_ASCENDING);
-        assertThat(searchSpec.getRankingStrategy())
-                .isEqualTo(SearchSpec.RANKING_STRATEGY_DOCUMENT_SCORE);
-    }
-}
diff --git a/core/tests/coretests/src/android/app/appsearch/external/app/cts/customer/CustomerDocumentTest.java b/core/tests/coretests/src/android/app/appsearch/external/app/cts/customer/CustomerDocumentTest.java
deleted file mode 100644
index 29b5754..0000000
--- a/core/tests/coretests/src/android/app/appsearch/external/app/cts/customer/CustomerDocumentTest.java
+++ /dev/null
@@ -1,105 +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.cts.customer;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.annotation.NonNull;
-import android.app.appsearch.GenericDocument;
-
-import org.junit.Test;
-
-/**
- * Tests that {@link GenericDocument} and {@link GenericDocument.Builder} are extendable by
- * developers.
- *
- * <p>This class is intentionally in a different package than {@link GenericDocument} to make sure
- * there are no package-private methods required for external developers to add custom types.
- */
-public class CustomerDocumentTest {
-
-    private static final byte[] BYTE_ARRAY1 = new byte[] {(byte) 1, (byte) 2, (byte) 3};
-    private static final byte[] BYTE_ARRAY2 = new byte[] {(byte) 4, (byte) 5, (byte) 6};
-    private static final GenericDocument DOCUMENT_PROPERTIES1 =
-            new GenericDocument.Builder<>("sDocumentProperties1", "sDocumentPropertiesSchemaType1")
-                    .build();
-    private static final GenericDocument DOCUMENT_PROPERTIES2 =
-            new GenericDocument.Builder<>("sDocumentProperties2", "sDocumentPropertiesSchemaType2")
-                    .build();
-
-    @Test
-    public void testBuildCustomerDocument() {
-        CustomerDocument customerDocument =
-                new CustomerDocument.Builder("uri1")
-                        .setScore(1)
-                        .setCreationTimestampMillis(0)
-                        .setPropertyLong("longKey1", 1L, 2L, 3L)
-                        .setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0)
-                        .setPropertyBoolean("booleanKey1", true, false, true)
-                        .setPropertyString(
-                                "stringKey1", "test-value1", "test-value2", "test-value3")
-                        .setPropertyBytes("byteKey1", BYTE_ARRAY1, BYTE_ARRAY2)
-                        .setPropertyDocument(
-                                "documentKey1", DOCUMENT_PROPERTIES1, DOCUMENT_PROPERTIES2)
-                        .build();
-
-        assertThat(customerDocument.getUri()).isEqualTo("uri1");
-        assertThat(customerDocument.getSchemaType()).isEqualTo("customerDocument");
-        assertThat(customerDocument.getScore()).isEqualTo(1);
-        assertThat(customerDocument.getCreationTimestampMillis()).isEqualTo(0L);
-        assertThat(customerDocument.getPropertyLongArray("longKey1"))
-                .asList()
-                .containsExactly(1L, 2L, 3L);
-        assertThat(customerDocument.getPropertyDoubleArray("doubleKey1"))
-                .usingExactEquality()
-                .containsExactly(1.0, 2.0, 3.0);
-        assertThat(customerDocument.getPropertyBooleanArray("booleanKey1"))
-                .asList()
-                .containsExactly(true, false, true);
-        assertThat(customerDocument.getPropertyStringArray("stringKey1"))
-                .asList()
-                .containsExactly("test-value1", "test-value2", "test-value3");
-        assertThat(customerDocument.getPropertyBytesArray("byteKey1"))
-                .asList()
-                .containsExactly(BYTE_ARRAY1, BYTE_ARRAY2);
-        assertThat(customerDocument.getPropertyDocumentArray("documentKey1"))
-                .asList()
-                .containsExactly(DOCUMENT_PROPERTIES1, DOCUMENT_PROPERTIES2);
-    }
-
-    /**
-     * An example document type for test purposes, defined outside of {@link GenericDocument} (the
-     * way an external developer would define it).
-     */
-    private static class CustomerDocument extends GenericDocument {
-        private CustomerDocument(GenericDocument document) {
-            super(document);
-        }
-
-        public static class Builder extends GenericDocument.Builder<CustomerDocument.Builder> {
-            private Builder(@NonNull String uri) {
-                super(uri, "customerDocument");
-            }
-
-            @Override
-            @NonNull
-            public CustomerDocument build() {
-                return new CustomerDocument(super.build());
-            }
-        }
-    }
-}
diff --git a/core/tests/coretests/src/android/os/storage/OWNERS b/core/tests/coretests/src/android/os/storage/OWNERS
new file mode 100644
index 0000000..6f9dbea
--- /dev/null
+++ b/core/tests/coretests/src/android/os/storage/OWNERS
@@ -0,0 +1 @@
+include /core/java/android/os/storage/OWNERS
diff --git a/core/tests/coretests/src/android/service/timezone/ParcelableTestSupport.java b/core/tests/coretests/src/android/service/timezone/ParcelableTestSupport.java
new file mode 100644
index 0000000..777bda9
--- /dev/null
+++ b/core/tests/coretests/src/android/service/timezone/ParcelableTestSupport.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.timezone;
+
+import static org.junit.Assert.assertEquals;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.lang.reflect.Field;
+
+/** Utility methods related to {@link Parcelable} objects used in several tests. */
+final class ParcelableTestSupport {
+
+    private ParcelableTestSupport() {}
+
+    /** Returns the result of parceling and unparceling the argument. */
+    @SuppressWarnings("unchecked")
+    public static <T extends Parcelable> T roundTripParcelable(T parcelable) {
+        Parcel parcel = Parcel.obtain();
+        parcel.writeTypedObject(parcelable, 0);
+        parcel.setDataPosition(0);
+
+        Parcelable.Creator<T> creator;
+        try {
+            Field creatorField = parcelable.getClass().getField("CREATOR");
+            creator = (Parcelable.Creator<T>) creatorField.get(null);
+        } catch (NoSuchFieldException | IllegalAccessException e) {
+            throw new AssertionError(e);
+        }
+        T toReturn = parcel.readTypedObject(creator);
+        parcel.recycle();
+        return toReturn;
+    }
+
+    public static <T extends Parcelable> void assertRoundTripParcelable(T instance) {
+        assertEquals(instance, roundTripParcelable(instance));
+    }
+}
diff --git a/core/tests/coretests/src/android/service/timezone/TimeZoneProviderSuggestionTest.java b/core/tests/coretests/src/android/service/timezone/TimeZoneProviderSuggestionTest.java
new file mode 100644
index 0000000..f805555
--- /dev/null
+++ b/core/tests/coretests/src/android/service/timezone/TimeZoneProviderSuggestionTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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.service.timezone;
+
+import static android.service.timezone.ParcelableTestSupport.assertRoundTripParcelable;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import static java.util.Collections.singletonList;
+
+import org.junit.Test;
+
+import java.util.List;
+
+public class TimeZoneProviderSuggestionTest {
+
+    private static final long ARBITRARY_ELAPSED_REALTIME_MILLIS = 9999;
+
+    private static final List<String> ARBITRARY_TIME_ZONE_IDS = singletonList("Europe/London");
+
+    @Test(expected = RuntimeException.class)
+    public void testInvalidTimeZoneIds() {
+        new TimeZoneProviderSuggestion.Builder()
+                .setTimeZoneIds(null);
+    }
+
+    @Test
+    public void testEquals() {
+        TimeZoneProviderSuggestion.Builder builder1 = new TimeZoneProviderSuggestion.Builder()
+                .setElapsedRealtimeMillis(ARBITRARY_ELAPSED_REALTIME_MILLIS);
+        {
+            TimeZoneProviderSuggestion one = builder1.build();
+            assertEquals(one, one);
+        }
+
+        TimeZoneProviderSuggestion.Builder builder2 = new TimeZoneProviderSuggestion.Builder()
+                .setElapsedRealtimeMillis(ARBITRARY_ELAPSED_REALTIME_MILLIS);
+        {
+            TimeZoneProviderSuggestion one = builder1.build();
+            TimeZoneProviderSuggestion two = builder2.build();
+            assertEquals(one, two);
+            assertEquals(two, one);
+        }
+
+        builder1.setElapsedRealtimeMillis(ARBITRARY_ELAPSED_REALTIME_MILLIS + 1);
+        {
+            TimeZoneProviderSuggestion one = builder1.build();
+            TimeZoneProviderSuggestion two = builder2.build();
+            assertNotEquals(one, two);
+            assertNotEquals(two, one);
+        }
+
+        builder2.setElapsedRealtimeMillis(ARBITRARY_ELAPSED_REALTIME_MILLIS + 1);
+        {
+            TimeZoneProviderSuggestion one = builder1.build();
+            TimeZoneProviderSuggestion two = builder2.build();
+            assertEquals(one, two);
+            assertEquals(two, one);
+        }
+
+        builder2.setTimeZoneIds(ARBITRARY_TIME_ZONE_IDS);
+        {
+            TimeZoneProviderSuggestion one = builder1.build();
+            TimeZoneProviderSuggestion two = builder2.build();
+            assertNotEquals(one, two);
+            assertNotEquals(two, one);
+        }
+
+        builder1.setTimeZoneIds(ARBITRARY_TIME_ZONE_IDS);
+        {
+            TimeZoneProviderSuggestion one = builder1.build();
+            TimeZoneProviderSuggestion two = builder2.build();
+            assertEquals(one, two);
+            assertEquals(two, one);
+        }
+    }
+
+    @Test
+    public void testParcelable_noTimeZoneIds() {
+        TimeZoneProviderSuggestion.Builder builder = new TimeZoneProviderSuggestion.Builder()
+                .setElapsedRealtimeMillis(ARBITRARY_ELAPSED_REALTIME_MILLIS);
+        assertRoundTripParcelable(builder.build());
+    }
+
+    @Test
+    public void testParcelable_withTimeZoneIds() {
+        TimeZoneProviderSuggestion.Builder builder = new TimeZoneProviderSuggestion.Builder()
+                .setElapsedRealtimeMillis(ARBITRARY_ELAPSED_REALTIME_MILLIS)
+                .setTimeZoneIds(ARBITRARY_TIME_ZONE_IDS);
+        assertRoundTripParcelable(builder.build());
+    }
+}
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java
index ab24f89..7e1e7f4 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityInteractionClientTest.java
@@ -33,9 +33,6 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 
-import java.util.Arrays;
-import java.util.List;
-
 /**
  * Tests for AccessibilityInteractionClient
  */
@@ -65,7 +62,7 @@
         final long accessibilityNodeId = 0x4321L;
         AccessibilityNodeInfo nodeFromConnection = AccessibilityNodeInfo.obtain();
         nodeFromConnection.setSourceNodeId(accessibilityNodeId, windowId);
-        mMockConnection.mInfosToReturn = Arrays.asList(nodeFromConnection);
+        mMockConnection.mInfoToReturn = nodeFromConnection;
         AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance();
         AccessibilityNodeInfo node = client.findAccessibilityNodeInfoByAccessibilityId(
                 MOCK_CONNECTION_ID, windowId, accessibilityNodeId, true, 0, null);
@@ -75,7 +72,7 @@
     }
 
     private static class MockConnection extends AccessibilityServiceConnectionImpl {
-        List<AccessibilityNodeInfo> mInfosToReturn;
+        AccessibilityNodeInfo mInfoToReturn;
 
         @Override
         public String[] findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId,
@@ -83,7 +80,7 @@
                 IAccessibilityInteractionConnectionCallback callback, int flags, long threadId,
                 Bundle arguments) {
             try {
-                callback.setFindAccessibilityNodeInfosResult(mInfosToReturn, interactionId);
+                callback.setFindAccessibilityNodeInfoResult(mInfoToReturn, interactionId);
             } catch (RemoteException e) {
                 throw new RuntimeException(e);
             }
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
index 8f5dfc5..97c07ea 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
@@ -30,6 +30,7 @@
 
 import com.android.internal.os.BatteryStatsImpl.DualTimer;
 import com.android.internal.os.BatteryStatsImpl.Uid;
+import com.android.internal.power.MeasuredEnergyStats;
 
 import junit.framework.TestCase;
 
@@ -497,4 +498,116 @@
         t = bi.getUidStatsLocked(UID).getSensorTimerLocked(Sensor.GPS, false);
         assertFalse(t.isRunningLocked());
     }
+
+    @SmallTest
+    public void testUpdateDisplayEnergyLocked() {
+        final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms
+        final MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
+
+        clocks.realtime = 0;
+        int screen = Display.STATE_OFF;
+        boolean battery = false;
+
+        final int uid1 = 10500;
+        final int uid2 = 10501;
+        long blame1 = 0;
+        long blame2 = 0;
+        long globalDoze = 0;
+
+        // Case A: uid1 off, uid2 off, battery off, screen off
+        bi.updateTimeBasesLocked(battery, screen, clocks.realtime*1000, 0);
+        bi.setOnBatteryInternal(battery);
+        bi.updateDisplayEnergyLocked(500_000, screen, clocks.realtime);
+        checkMeasuredEnergy("A", uid1, blame1, uid2, blame2, globalDoze, bi);
+
+        // Case B: uid1 off, uid2 off, battery ON,  screen off
+        clocks.realtime += 17;
+        battery = true;
+        bi.updateTimeBasesLocked(battery, screen, clocks.realtime*1000, 0);
+        bi.setOnBatteryInternal(battery);
+        clocks.realtime += 19;
+        bi.updateDisplayEnergyLocked(510_000, screen, clocks.realtime);
+        checkMeasuredEnergy("B", uid1, blame1, uid2, blame2, globalDoze, bi);
+
+        // Case C: uid1 ON,  uid2 off, battery on,  screen off
+        clocks.realtime += 18;
+        setFgState(uid1, true, bi);
+        clocks.realtime += 18;
+        bi.updateDisplayEnergyLocked(520_000, screen, clocks.realtime);
+        checkMeasuredEnergy("C", uid1, blame1, uid2, blame2, globalDoze, bi);
+
+        // Case D: uid1 on,  uid2 off, battery on,  screen ON
+        clocks.realtime += 17;
+        screen = Display.STATE_ON;
+        bi.updateDisplayEnergyLocked(521_000, screen, clocks.realtime);
+        blame1 += 0; // Screen had been off during the measurement period
+        checkMeasuredEnergy("D.1", uid1, blame1, uid2, blame2, globalDoze, bi);
+        clocks.realtime += 101;
+        bi.updateDisplayEnergyLocked(530_000, screen, clocks.realtime);
+        blame1 += 530_000;
+        checkMeasuredEnergy("D.2", uid1, blame1, uid2, blame2, globalDoze, bi);
+
+        // Case E: uid1 on,  uid2 ON,  battery on,  screen on
+        clocks.realtime += 20;
+        setFgState(uid2, true, bi);
+        clocks.realtime += 40;
+        bi.updateDisplayEnergyLocked(540_000, screen, clocks.realtime);
+        // In the past 60ms, sum of fg is 20+40+40=100ms. uid1 is blamed for 60/100; uid2 for 40/100
+        blame1 += 540_000 * (20 + 40) / (20 + 40 + 40);
+        blame2 += 540_000 * ( 0 + 40) / (20 + 40 + 40);
+        checkMeasuredEnergy("E", uid1, blame1, uid2, blame2, globalDoze, bi);
+
+        // Case F: uid1 on,  uid2 OFF, battery on,  screen on
+        clocks.realtime += 40;
+        setFgState(uid2, false, bi);
+        clocks.realtime += 120;
+        bi.updateDisplayEnergyLocked(550_000, screen, clocks.realtime);
+        // In the past 160ms, sum f fg is 200ms. uid1 is blamed for 40+120 of it; uid2 for 40 of it.
+        blame1 += 550_000 * (40 + 120) / (40 + 40 + 120);
+        blame2 += 550_000 * (40 + 0  ) / (40 + 40 + 120);
+        checkMeasuredEnergy("F", uid1, blame1, uid2, blame2, globalDoze, bi);
+
+        // Case G: uid1 on,  uid2 off,  battery on, screen DOZE
+        clocks.realtime += 5;
+        screen = Display.STATE_DOZE;
+        bi.updateDisplayEnergyLocked(570_000, screen, clocks.realtime);
+        blame1 += 570_000; // All of this pre-doze time is blamed on uid1.
+        checkMeasuredEnergy("G", uid1, blame1, uid2, blame2, globalDoze, bi);
+
+        // Case H: uid1 on,  uid2 off,  battery on, screen ON
+        clocks.realtime += 6;
+        screen = Display.STATE_ON;
+        bi.updateDisplayEnergyLocked(580_000, screen, clocks.realtime);
+        blame1 += 0; // The screen had been doze during the energy period
+        globalDoze += 580_000;
+        checkMeasuredEnergy("H", uid1, blame1, uid2, blame2, globalDoze, bi);
+    }
+
+    private void setFgState(int uid, boolean fgOn, MockBatteryStatsImpl bi) {
+        // Note that noteUidProcessStateLocked uses ActivityManager process states.
+        if (fgOn) {
+            bi.noteActivityResumedLocked(uid);
+            bi.noteUidProcessStateLocked(uid, ActivityManager.PROCESS_STATE_TOP);
+        } else {
+            bi.noteActivityPausedLocked(uid);
+            bi.noteUidProcessStateLocked(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+        }
+    }
+
+    private void checkMeasuredEnergy(String caseName, int uid1, long blame1, int uid2, long blame2,
+            long globalDoze, MockBatteryStatsImpl bi) {
+        final int bucket = MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_ON;
+
+        assertEquals("Wrong uid1 blame for Case " + caseName, blame1,
+                bi.getUidStatsLocked(uid1).getMeasuredEnergyMicroJoules(bucket));
+
+        assertEquals("Wrong uid2 blame for Case " + caseName, blame2,
+                bi.getUidStatsLocked(uid2).getMeasuredEnergyMicroJoules(bucket));
+
+        assertEquals("Wrong total blame for Case " + caseName, blame1 + blame2,
+                bi.getScreenOnEnergy());
+
+        assertEquals("Wrong doze for Case " + caseName, globalDoze,
+                bi.getScreenDozeEnergy());
+    }
 }
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
index bef27e2..cfa8c4d 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
@@ -52,7 +52,9 @@
         LongSamplingCounterTest.class,
         LongSamplingCounterArrayTest.class,
         PowerCalculatorTest.class,
-        PowerProfileTest.class
+        PowerProfileTest.class,
+
+        com.android.internal.power.MeasuredEnergyStatsTest.class
     })
 public class BatteryStatsTests {
 }
diff --git a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
index ff1d965c..1b1590a 100644
--- a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
+++ b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
@@ -16,17 +16,19 @@
 
 package com.android.internal.os;
 
+import android.location.GnssSignalQuality;
 import android.os.Handler;
 import android.os.Looper;
 import android.util.SparseIntArray;
 
-import com.android.internal.location.gnssmetrics.GnssMetrics;
 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidActiveTimeReader;
 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeReader;
 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader;
 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader;
+import com.android.internal.power.MeasuredEnergyStats;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Queue;
 import java.util.concurrent.Future;
 
@@ -47,11 +49,15 @@
         mBluetoothScanTimer = new StopwatchTimer(mClocks, null, -14, null, mOnBatteryTimeBase);
         setExternalStatsSyncLocked(new DummyExternalStatsSync());
 
-        for (int i = 0; i < GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS; i++) {
+        for (int i = 0; i < GnssSignalQuality.NUM_GNSS_SIGNAL_QUALITY_LEVELS; i++) {
             mGpsSignalQualityTimer[i] = new StopwatchTimer(clocks, null, -1000 - i, null,
                     mOnBatteryTimeBase);
         }
 
+        final boolean[] supportedBuckets = new boolean[MeasuredEnergyStats.NUMBER_ENERGY_BUCKETS];
+        Arrays.fill(supportedBuckets, true);
+        mGlobalMeasuredEnergyStats = new MeasuredEnergyStats(supportedBuckets);
+
         // A no-op handler.
         mHandler = new Handler(Looper.getMainLooper()) {
         };
diff --git a/core/tests/coretests/src/com/android/internal/os/MockClocks.java b/core/tests/coretests/src/com/android/internal/os/MockClocks.java
index f750c37..d0fa756 100644
--- a/core/tests/coretests/src/com/android/internal/os/MockClocks.java
+++ b/core/tests/coretests/src/com/android/internal/os/MockClocks.java
@@ -17,7 +17,9 @@
 package com.android.internal.os;
 
 public class MockClocks implements BatteryStatsImpl.Clocks {
+    /** ElapsedRealtime in ms */
     public long realtime;
+    /** Uptime in ms */
     public long uptime;
 
     @Override
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 88295ef..2ede751 100644
--- a/core/tests/coretests/src/com/android/internal/power/MeasuredEnergyStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/power/MeasuredEnergyStatsTest.java
@@ -16,18 +16,22 @@
 
 package com.android.internal.power;
 
-import static com.android.internal.power.MeasuredEnergyArray.NUMBER_SUBSYSTEMS;
-import static com.android.internal.power.MeasuredEnergyArray.SUBSYSTEM_DISPLAY;
+import static android.os.BatteryStats.ENERGY_DATA_UNAVAILABLE;
+
 import static com.android.internal.power.MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_DOZE;
 import static com.android.internal.power.MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_ON;
+import static com.android.internal.power.MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_OTHER;
 import static com.android.internal.power.MeasuredEnergyStats.NUMBER_ENERGY_BUCKETS;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import android.os.Parcel;
 import android.view.Display;
 
-import org.junit.Before;
+import androidx.test.filters.SmallTest;
+
 import org.junit.Test;
 
 /**
@@ -36,243 +40,225 @@
  * To run the tests, use
  * atest FrameworksCoreTests:com.android.internal.power.MeasuredEnergyStatsTest
  */
+@SmallTest
 public class MeasuredEnergyStatsTest {
-    private MeasuredEnergyStats mStats;
-    private int[] mAllSubsystems = new int[NUMBER_SUBSYSTEMS];
-    private long[] mCurrentSubsystemEnergyUJ = new long[NUMBER_SUBSYSTEMS];
 
-    MeasuredEnergyArray mMeasuredEnergyArray = new MeasuredEnergyArray() {
-        @Override
-        public int getSubsystem(int index) {
-            return mAllSubsystems[index];
+    @Test
+    public void testConstruction() {
+        final boolean[] supportedEnergyBuckets = new boolean[NUMBER_ENERGY_BUCKETS];
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_ON] = true;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_DOZE] = false;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_OTHER] = true;
+
+        final MeasuredEnergyStats stats = new MeasuredEnergyStats(supportedEnergyBuckets);
+
+        for (int i = 0; i < NUMBER_ENERGY_BUCKETS; i++) {
+            if (supportedEnergyBuckets[i]) {
+                assertTrue(stats.isEnergyBucketSupported(i));
+                assertEquals(0L, stats.getAccumulatedBucketEnergy(i));
+            } else {
+                assertFalse(stats.isEnergyBucketSupported(i));
+                assertEquals(ENERGY_DATA_UNAVAILABLE, stats.getAccumulatedBucketEnergy(i));
+            }
         }
+    }
 
-        @Override
-        public long getEnergy(int index) {
-            return mCurrentSubsystemEnergyUJ[index];
+    @Test
+    public void testCreateFromTemplate() {
+        final boolean[] supportedEnergyBuckets = new boolean[NUMBER_ENERGY_BUCKETS];
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_ON] = true;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_DOZE] = false;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_OTHER] = true;
+
+        final MeasuredEnergyStats stats = new MeasuredEnergyStats(supportedEnergyBuckets);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_ON, 10, true);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_ON, 5, true);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_OTHER, 40, true);
+
+        final MeasuredEnergyStats newStats = MeasuredEnergyStats.createFromTemplate(stats);
+
+        for (int i = 0; i < NUMBER_ENERGY_BUCKETS; i++) {
+            if (supportedEnergyBuckets[i]) {
+                assertTrue(newStats.isEnergyBucketSupported(i));
+                assertEquals(0, newStats.getAccumulatedBucketEnergy(i));
+            } else {
+                assertFalse(newStats.isEnergyBucketSupported(i));
+                assertEquals(ENERGY_DATA_UNAVAILABLE, newStats.getAccumulatedBucketEnergy(i));
+            }
         }
-
-        @Override
-        public int size() {
-            return NUMBER_SUBSYSTEMS;
-        }
-    };
-
-    @Before
-    public void setUp() {
-        // Populate all supported subsystems indexes and arbitrary starting energy values.
-        mAllSubsystems[SUBSYSTEM_DISPLAY] = SUBSYSTEM_DISPLAY;
-        mCurrentSubsystemEnergyUJ[SUBSYSTEM_DISPLAY] = 111;
-
-        mStats = new MeasuredEnergyStats(mMeasuredEnergyArray, Display.STATE_UNKNOWN);
     }
 
     @Test
     public void testReadWriteParcel() {
-        // update with some arbitrary data
-        mCurrentSubsystemEnergyUJ[SUBSYSTEM_DISPLAY] += 222;
-        mStats.update(mMeasuredEnergyArray, Display.STATE_ON, true);
-        mCurrentSubsystemEnergyUJ[SUBSYSTEM_DISPLAY] += 321;
-        mStats.update(mMeasuredEnergyArray, Display.STATE_DOZE, true);
-        mCurrentSubsystemEnergyUJ[SUBSYSTEM_DISPLAY] += 456;
-        mStats.update(mMeasuredEnergyArray, Display.STATE_OFF, true);
+        final boolean[] supportedEnergyBuckets = new boolean[NUMBER_ENERGY_BUCKETS];
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_ON] = true;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_DOZE] = false;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_OTHER] = true;
+
+        final MeasuredEnergyStats stats = new MeasuredEnergyStats(supportedEnergyBuckets);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_ON, 10, true);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_ON, 5, true);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_OTHER, 40, true);
 
         final Parcel parcel = Parcel.obtain();
-        mStats.writeToParcel(parcel);
+        stats.writeToParcel(parcel);
 
         parcel.setDataPosition(0);
-        MeasuredEnergyStats stats = new MeasuredEnergyStats(parcel);
+        MeasuredEnergyStats newStats = new MeasuredEnergyStats(parcel);
 
         for (int i = 0; i < NUMBER_ENERGY_BUCKETS; i++) {
-            assertEquals(mStats.getAccumulatedBucketEnergy(i), stats.getAccumulatedBucketEnergy(i));
+            assertEquals(stats.getAccumulatedBucketEnergy(i),
+                    newStats.getAccumulatedBucketEnergy(i));
         }
         parcel.recycle();
     }
 
     @Test
     public void testReadWriteSummaryParcel() {
-        // update with some arbitrary data
-        mCurrentSubsystemEnergyUJ[SUBSYSTEM_DISPLAY] += 222;
-        mStats.update(mMeasuredEnergyArray, Display.STATE_ON, true);
-        mCurrentSubsystemEnergyUJ[SUBSYSTEM_DISPLAY] += 321;
-        mStats.update(mMeasuredEnergyArray, Display.STATE_DOZE, true);
-        mCurrentSubsystemEnergyUJ[SUBSYSTEM_DISPLAY] += 456;
-        mStats.update(mMeasuredEnergyArray, Display.STATE_OFF, true);
+        final boolean[] supportedEnergyBuckets = new boolean[NUMBER_ENERGY_BUCKETS];
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_ON] = true;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_DOZE] = false;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_OTHER] = true;
+
+        final MeasuredEnergyStats stats = new MeasuredEnergyStats(supportedEnergyBuckets);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_ON, 10, true);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_ON, 5, true);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_OTHER, 40, true);
 
         final Parcel parcel = Parcel.obtain();
-        MeasuredEnergyStats.writeSummaryToParcel(mStats, parcel);
+        MeasuredEnergyStats.writeSummaryToParcel(stats, parcel);
 
+
+        final boolean[] newSupportedEnergyBuckets = new boolean[NUMBER_ENERGY_BUCKETS];
+        newSupportedEnergyBuckets[ENERGY_BUCKET_SCREEN_ON] = true;
+        newSupportedEnergyBuckets[ENERGY_BUCKET_SCREEN_DOZE] = true; // switched from false to true
+        newSupportedEnergyBuckets[ENERGY_BUCKET_SCREEN_OTHER] = false; // switched true to false
+        MeasuredEnergyStats newStats = new MeasuredEnergyStats(newSupportedEnergyBuckets);
         parcel.setDataPosition(0);
-        MeasuredEnergyStats stats = new MeasuredEnergyStats(mMeasuredEnergyArray,
-                Display.STATE_UNKNOWN);
-        MeasuredEnergyStats.readSummaryFromParcel(stats, parcel);
+        MeasuredEnergyStats.readSummaryFromParcel(newStats, parcel);
 
         for (int i = 0; i < NUMBER_ENERGY_BUCKETS; i++) {
-            assertEquals(mStats.getAccumulatedBucketEnergy(i), stats.getAccumulatedBucketEnergy(i));
+            if (!newSupportedEnergyBuckets[i]) {
+                assertFalse(newStats.isEnergyBucketSupported(i));
+                assertEquals(ENERGY_DATA_UNAVAILABLE, newStats.getAccumulatedBucketEnergy(i));
+            } else if (!supportedEnergyBuckets[i]) {
+                assertTrue(newStats.isEnergyBucketSupported(i));
+                assertEquals(0L, newStats.getAccumulatedBucketEnergy(i));
+            } else {
+                assertTrue(newStats.isEnergyBucketSupported(i));
+                assertEquals(stats.getAccumulatedBucketEnergy(i),
+                        newStats.getAccumulatedBucketEnergy(i));
+            }
         }
         parcel.recycle();
     }
 
     @Test
-    public void testDisplayStateEnergyAttribution() {
-        long expectedScreenOnEnergy = 0;
-        long expectedScreenDozeEnergy = 0;
+    public void testCreateAndReadSummaryFromParcel() {
+        final boolean[] supportedEnergyBuckets = new boolean[NUMBER_ENERGY_BUCKETS];
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_ON] = true;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_DOZE] = false;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_OTHER] = true;
 
-        // Display energy should be attributed to the previous screen state.
-        mStats.update(mMeasuredEnergyArray, Display.STATE_UNKNOWN, true);
+        final MeasuredEnergyStats template = new MeasuredEnergyStats(supportedEnergyBuckets);
+        template.updateBucket(ENERGY_BUCKET_SCREEN_ON, 10, true);
+        template.updateBucket(ENERGY_BUCKET_SCREEN_ON, 5, true);
+        template.updateBucket(ENERGY_BUCKET_SCREEN_OTHER, 40, true);
 
-        incrementDisplayState(222, Display.STATE_ON, true, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
+        final MeasuredEnergyStats stats = MeasuredEnergyStats.createFromTemplate(template);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_ON, 200, true);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_ON, 7, true);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_OTHER, 63, true);
 
-        expectedScreenOnEnergy += 321;
-        incrementDisplayState(321, Display.STATE_DOZE, true, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
+        final Parcel parcel = Parcel.obtain();
+        MeasuredEnergyStats.writeSummaryToParcel(stats, parcel);
 
-        expectedScreenDozeEnergy += 456;
-        incrementDisplayState(456, Display.STATE_OFF, true, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
+        final boolean[] newSupportedEnergyBuckets = new boolean[NUMBER_ENERGY_BUCKETS];
+        newSupportedEnergyBuckets[ENERGY_BUCKET_SCREEN_ON] = true;
+        newSupportedEnergyBuckets[ENERGY_BUCKET_SCREEN_DOZE] = true; // switched from false to true
+        newSupportedEnergyBuckets[ENERGY_BUCKET_SCREEN_OTHER] = false; // switched true to false
+        final MeasuredEnergyStats newTemplate = new MeasuredEnergyStats(newSupportedEnergyBuckets);
+        parcel.setDataPosition(0);
 
-        incrementDisplayState(1111, Display.STATE_DOZE_SUSPEND, true, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
+        final MeasuredEnergyStats newStats =
+                MeasuredEnergyStats.createAndReadSummaryFromParcel(parcel, newTemplate);
 
-        expectedScreenDozeEnergy += 2345;
-        incrementDisplayState(2345, Display.STATE_ON_SUSPEND, true, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
-
-        expectedScreenOnEnergy += 767;
-        incrementDisplayState(767, Display.STATE_VR, true, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
-
-        expectedScreenOnEnergy += 999;
-        incrementDisplayState(999, Display.STATE_UNKNOWN, true, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
+        for (int i = 0; i < NUMBER_ENERGY_BUCKETS; i++) {
+            if (!newSupportedEnergyBuckets[i]) {
+                assertFalse(newStats.isEnergyBucketSupported(i));
+                assertEquals(ENERGY_DATA_UNAVAILABLE, newStats.getAccumulatedBucketEnergy(i));
+            } else if (!supportedEnergyBuckets[i]) {
+                assertTrue(newStats.isEnergyBucketSupported(i));
+                assertEquals(0L, newStats.getAccumulatedBucketEnergy(i));
+            } else {
+                assertTrue(newStats.isEnergyBucketSupported(i));
+                assertEquals(stats.getAccumulatedBucketEnergy(i),
+                        newStats.getAccumulatedBucketEnergy(i));
+            }
+        }
+        parcel.recycle();
     }
 
     @Test
-    public void testDisplayStateEnergyAttribution_notRunning() {
-        long expectedScreenOnEnergy = 0;
-        long expectedScreenDozeEnergy = 0;
+    public void testUpdateBucket() {
+        final boolean[] supportedEnergyBuckets = new boolean[NUMBER_ENERGY_BUCKETS];
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_ON] = true;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_DOZE] = false;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_OTHER] = true;
 
-        // Display energy should be attributed to the previous screen state.
-        mStats.update(mMeasuredEnergyArray, Display.STATE_UNKNOWN, true);
+        final MeasuredEnergyStats stats = new MeasuredEnergyStats(supportedEnergyBuckets);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_ON, 10, true);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_DOZE, 30, true);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_OTHER, 40, true);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_ON, 5, true);
 
-        incrementDisplayState(222, Display.STATE_ON, true, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
-
-        expectedScreenOnEnergy += 321;
-        incrementDisplayState(321, Display.STATE_DOZE, true, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
-
-        // Updates after this point should not result in energy accumulation.
-        incrementDisplayState(456, Display.STATE_OFF, false, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
-
-        incrementDisplayState(1111, Display.STATE_DOZE_SUSPEND, false, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
-
-        incrementDisplayState(2345, Display.STATE_ON_SUSPEND, false, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
-
-        incrementDisplayState(767, Display.STATE_VR, false, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
-
-        // Resume energy accumulation.
-        expectedScreenOnEnergy += 999;
-        incrementDisplayState(999, Display.STATE_UNKNOWN, true, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
+        assertEquals(15, stats.getAccumulatedBucketEnergy(ENERGY_BUCKET_SCREEN_ON));
+        assertEquals(ENERGY_DATA_UNAVAILABLE,
+                stats.getAccumulatedBucketEnergy(ENERGY_BUCKET_SCREEN_DOZE));
+        assertEquals(40, stats.getAccumulatedBucketEnergy(ENERGY_BUCKET_SCREEN_OTHER));
     }
 
     @Test
     public void testReset() {
-        // update with some arbitrary data.
-        mCurrentSubsystemEnergyUJ[SUBSYSTEM_DISPLAY] += 222;
-        mStats.update(mMeasuredEnergyArray, Display.STATE_ON, true);
-        mCurrentSubsystemEnergyUJ[SUBSYSTEM_DISPLAY] += 321;
-        mStats.update(mMeasuredEnergyArray, Display.STATE_DOZE, true);
-        mCurrentSubsystemEnergyUJ[SUBSYSTEM_DISPLAY] += 456;
-        mStats.update(mMeasuredEnergyArray, Display.STATE_OFF, true);
+        final boolean[] supportedEnergyBuckets = new boolean[NUMBER_ENERGY_BUCKETS];
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_ON] = true;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_DOZE] = false;
+        supportedEnergyBuckets[ENERGY_BUCKET_SCREEN_OTHER] = true;
 
-        mStats.reset();
+        final MeasuredEnergyStats stats = new MeasuredEnergyStats(supportedEnergyBuckets);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_ON, 10, true);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_ON, 5, true);
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_OTHER, 40, true);
+
+        MeasuredEnergyStats.resetIfNotNull(stats);
         // All energy should be reset to 0
         for (int i = 0; i < NUMBER_ENERGY_BUCKETS; i++) {
-            assertEquals(mStats.getAccumulatedBucketEnergy(i), 0);
+            if (supportedEnergyBuckets[i]) {
+                assertTrue(stats.isEnergyBucketSupported(i));
+                assertEquals(0, stats.getAccumulatedBucketEnergy(i));
+            } else {
+                assertFalse(stats.isEnergyBucketSupported(i));
+                assertEquals(ENERGY_DATA_UNAVAILABLE, stats.getAccumulatedBucketEnergy(i));
+            }
         }
 
-        // Increment all subsystem energy by some arbitrary amount and update
-        for (int i = 0; i < NUMBER_SUBSYSTEMS; i++) {
-            mCurrentSubsystemEnergyUJ[i] += 100 * i;
-        }
-        mStats.update(mMeasuredEnergyArray, Display.STATE_OFF, true);
-
-        // All energy should still be 0 after the first post-reset update.
-        for (int i = 0; i < NUMBER_ENERGY_BUCKETS; i++) {
-            assertEquals(mStats.getAccumulatedBucketEnergy(i), 0);
-        }
-
-        // Energy accumulation should continue like normal.
-        long expectedScreenOnEnergy = 0;
-        long expectedScreenDozeEnergy = 0;
-        incrementDisplayState(222, Display.STATE_ON, true, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
-
-        expectedScreenOnEnergy += 321;
-        incrementDisplayState(321, Display.STATE_DOZE, true, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
-
-        expectedScreenDozeEnergy += 456;
-        incrementDisplayState(456, Display.STATE_OFF, true, expectedScreenOnEnergy,
-                expectedScreenDozeEnergy);
+        // Values should increase as usual.
+        stats.updateBucket(ENERGY_BUCKET_SCREEN_ON, 70, true);
+        assertEquals(70L, stats.getAccumulatedBucketEnergy(ENERGY_BUCKET_SCREEN_ON));
     }
 
+    /** Test that states are mapped to the expected energy buckets. Beware of mapping changes. */
     @Test
-    public void testHasSubsystem() {
-        for (int i = 0; i < NUMBER_SUBSYSTEMS; i++) {
-            assertEquals(mStats.hasSubsystem(i), true);
-        }
-    }
+    public void testEnergyBucketMapping() {
+        int exp;
 
-    @Test
-    public void testHasSubsystem_unavailable() {
-        // Setup MeasuredEnergyStats with not available subsystems.
-        int[] subsystems = new int[0];
-        long[] energies = new long[0];
-        MeasuredEnergyArray measuredEnergyArray = new MeasuredEnergyArray() {
-            @Override
-            public int getSubsystem(int index) {
-                return subsystems[index];
-            }
+        exp = ENERGY_BUCKET_SCREEN_ON;
+        assertEquals(exp, MeasuredEnergyStats.getDisplayEnergyBucket(Display.STATE_ON));
+        assertEquals(exp, MeasuredEnergyStats.getDisplayEnergyBucket(Display.STATE_VR));
+        assertEquals(exp, MeasuredEnergyStats.getDisplayEnergyBucket(Display.STATE_ON_SUSPEND));
 
-            @Override
-            public long getEnergy(int index) {
-                return energies[index];
-            }
-
-            @Override
-            public int size() {
-                return 0;
-            }
-        };
-        MeasuredEnergyStats stats = new MeasuredEnergyStats(measuredEnergyArray,
-                Display.STATE_UNKNOWN);
-
-        for (int i = 0; i < NUMBER_SUBSYSTEMS; i++) {
-            assertEquals(stats.hasSubsystem(i), false);
-        }
-
-        stats.reset();
-        // a reset should not change the state of an unavailable subsystem.
-        for (int i = 0; i < NUMBER_SUBSYSTEMS; i++) {
-            assertEquals(stats.hasSubsystem(i), false);
-        }
-    }
-
-    private void incrementDisplayState(long deltaEnergy, int nextState, boolean accumulate,
-            long expectScreenEnergy, long expectedDozeEnergy) {
-        mCurrentSubsystemEnergyUJ[SUBSYSTEM_DISPLAY] += deltaEnergy;
-        mStats.update(mMeasuredEnergyArray, nextState, accumulate);
-        assertEquals(expectScreenEnergy,
-                mStats.getAccumulatedBucketEnergy(ENERGY_BUCKET_SCREEN_ON));
-        assertEquals(expectedDozeEnergy,
-                mStats.getAccumulatedBucketEnergy(ENERGY_BUCKET_SCREEN_DOZE));
+        exp = ENERGY_BUCKET_SCREEN_DOZE;
+        assertEquals(exp, MeasuredEnergyStats.getDisplayEnergyBucket(Display.STATE_DOZE));
+        assertEquals(exp, MeasuredEnergyStats.getDisplayEnergyBucket(Display.STATE_DOZE_SUSPEND));
     }
 }
diff --git a/core/tests/coretests/src/com/android/internal/power/OWNERS b/core/tests/coretests/src/com/android/internal/power/OWNERS
index d68066b..4068e2b 100644
--- a/core/tests/coretests/src/com/android/internal/power/OWNERS
+++ b/core/tests/coretests/src/com/android/internal/power/OWNERS
@@ -1 +1 @@
-include /services/core/java/com/android/server/power/OWNERS
+include /BATTERY_STATS_OWNERS
diff --git a/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java b/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java
index d026735..e8793a9 100644
--- a/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java
+++ b/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java
@@ -118,4 +118,89 @@
         assertEquals(3, ArrayUtils.unstableRemoveIf(collection, isNull));
         assertEquals(0, collection.size());
     }
+
+    @SmallTest
+    public void testThrowsIfOutOfBounds_passesWhenRangeInsideArray() {
+        ArrayUtils.throwsIfOutOfBounds(10, 2, 6);
+    }
+
+    @SmallTest
+    public void testThrowsIfOutOfBounds_passesWhenRangeIsWholeArray() {
+        ArrayUtils.throwsIfOutOfBounds(10, 0, 10);
+    }
+
+    @SmallTest
+    public void testThrowsIfOutOfBounds_passesWhenEmptyRangeAtStart() {
+        ArrayUtils.throwsIfOutOfBounds(10, 0, 0);
+    }
+
+    @SmallTest
+    public void testThrowsIfOutOfBounds_passesWhenEmptyRangeAtEnd() {
+        ArrayUtils.throwsIfOutOfBounds(10, 10, 0);
+    }
+
+    @SmallTest
+    public void testThrowsIfOutOfBounds_passesWhenEmptyArray() {
+        ArrayUtils.throwsIfOutOfBounds(0, 0, 0);
+    }
+
+    @SmallTest
+    public void testThrowsIfOutOfBounds_failsWhenRangeStartNegative() {
+        try {
+            ArrayUtils.throwsIfOutOfBounds(10, -1, 5);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException expected) {
+            // expected
+        }
+    }
+
+    @SmallTest
+    public void testThrowsIfOutOfBounds_failsWhenCountNegative() {
+        try {
+            ArrayUtils.throwsIfOutOfBounds(10, 5, -1);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException expected) {
+            // expected
+        }
+    }
+
+    @SmallTest
+    public void testThrowsIfOutOfBounds_failsWhenRangeStartTooHigh() {
+        try {
+            ArrayUtils.throwsIfOutOfBounds(10, 11, 0);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException expected) {
+            // expected
+        }
+    }
+
+    @SmallTest
+    public void testThrowsIfOutOfBounds_failsWhenRangeEndTooHigh() {
+        try {
+            ArrayUtils.throwsIfOutOfBounds(10, 5, 6);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException expected) {
+            // expected
+        }
+    }
+
+    @SmallTest
+    public void testThrowsIfOutOfBounds_failsWhenLengthNegative() {
+        try {
+            ArrayUtils.throwsIfOutOfBounds(-1, 0, 0);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException expected) {
+            // expected
+        }
+    }
+
+    @SmallTest
+    public void testThrowsIfOutOfBounds_failsWhenOverflowRangeEndTooHigh() {
+        try {
+            ArrayUtils.throwsIfOutOfBounds(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException expected) {
+            // expected
+        }
+    }
 }
diff --git a/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java
index 306388f..9531181d 100644
--- a/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java
+++ b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java
@@ -195,6 +195,11 @@
         }
 
         @Override
+        public boolean shouldHandleTvPowerKey() {
+            return false;
+        }
+
+        @Override
         public void queryDisplayStatus(final IHdmiControlCallback callback) {
         }
 
diff --git a/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java b/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java
new file mode 100644
index 0000000..6df1c3e
--- /dev/null
+++ b/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java
@@ -0,0 +1,260 @@
+/*
+ * 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.uwb;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.os.PersistableBundle;
+import android.os.RemoteException;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Test of {@link AdapterStateListener}.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class RangingManagerTest {
+
+    private static final IUwbAdapter ADAPTER = mock(IUwbAdapter.class);
+    private static final Executor EXECUTOR = UwbTestUtils.getExecutor();
+    private static final PersistableBundle PARAMS = new PersistableBundle();
+    private static final @CloseReason int CLOSE_REASON = CloseReason.UNKNOWN;
+
+    @Test
+    public void testOpenSession_StartRangingInvoked() throws RemoteException {
+        RangingManager rangingManager = new RangingManager(ADAPTER);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        rangingManager.openSession(PARAMS, EXECUTOR, callback);
+        verify(ADAPTER, times(1)).startRanging(eq(rangingManager), eq(PARAMS));
+    }
+
+    @Test
+    public void testOpenSession_ErrorIfSameSessionHandleReturned() throws RemoteException {
+        RangingManager rangingManager = new RangingManager(ADAPTER);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        SessionHandle handle = new SessionHandle(1);
+        when(ADAPTER.startRanging(any(), any())).thenReturn(handle);
+
+        rangingManager.openSession(PARAMS, EXECUTOR, callback);
+
+        // Calling openSession will cause the same session handle to be returned. The onClosed
+        // callback should be invoked
+        RangingSession.Callback callback2 = mock(RangingSession.Callback.class);
+        rangingManager.openSession(PARAMS, EXECUTOR, callback2);
+        verify(callback, times(0)).onClosed(anyInt(), any());
+        verify(callback2, times(1)).onClosed(anyInt(), any());
+    }
+
+    @Test
+    public void testOnRangingStarted_ValidSessionHandle() throws RemoteException {
+        RangingManager rangingManager = new RangingManager(ADAPTER);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        SessionHandle handle = new SessionHandle(1);
+        when(ADAPTER.startRanging(any(), any())).thenReturn(handle);
+
+        rangingManager.openSession(PARAMS, EXECUTOR, callback);
+        rangingManager.onRangingStarted(handle, PARAMS);
+        verify(callback, times(1)).onOpenSuccess(any(), any());
+    }
+
+    @Test
+    public void testOnRangingStarted_InvalidSessionHandle() throws RemoteException {
+        RangingManager rangingManager = new RangingManager(ADAPTER);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+
+        rangingManager.onRangingStarted(new SessionHandle(2), PARAMS);
+        verify(callback, times(0)).onOpenSuccess(any(), any());
+    }
+
+    @Test
+    public void testOnRangingStarted_MultipleSessionsRegistered() throws RemoteException {
+        SessionHandle sessionHandle1 = new SessionHandle(1);
+        SessionHandle sessionHandle2 = new SessionHandle(2);
+        RangingSession.Callback callback1 = mock(RangingSession.Callback.class);
+        RangingSession.Callback callback2 = mock(RangingSession.Callback.class);
+
+        when(ADAPTER.startRanging(any(), any()))
+                .thenReturn(sessionHandle1)
+                .thenReturn(sessionHandle2);
+
+        RangingManager rangingManager = new RangingManager(ADAPTER);
+        rangingManager.openSession(PARAMS, EXECUTOR, callback1);
+        rangingManager.openSession(PARAMS, EXECUTOR, callback2);
+
+        rangingManager.onRangingStarted(sessionHandle1, PARAMS);
+        verify(callback1, times(1)).onOpenSuccess(any(), any());
+        verify(callback2, times(0)).onOpenSuccess(any(), any());
+
+        rangingManager.onRangingStarted(sessionHandle2, PARAMS);
+        verify(callback1, times(1)).onOpenSuccess(any(), any());
+        verify(callback2, times(1)).onOpenSuccess(any(), any());
+    }
+
+    @Test
+    public void testOnRangingClosed_OnRangingClosedCalled() throws RemoteException {
+        RangingManager rangingManager = new RangingManager(ADAPTER);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        SessionHandle handle = new SessionHandle(1);
+        when(ADAPTER.startRanging(any(), any())).thenReturn(handle);
+        rangingManager.openSession(PARAMS, EXECUTOR, callback);
+
+        rangingManager.onRangingClosed(handle, CLOSE_REASON, PARAMS);
+        verify(callback, times(1)).onClosed(anyInt(), any());
+    }
+
+    @Test
+    public void testOnRangingClosed_MultipleSessionsRegistered() throws RemoteException {
+        // Verify that if multiple sessions are registered, only the session that is
+        // requested to close receives the associated callbacks
+        SessionHandle sessionHandle1 = new SessionHandle(1);
+        SessionHandle sessionHandle2 = new SessionHandle(2);
+        RangingSession.Callback callback1 = mock(RangingSession.Callback.class);
+        RangingSession.Callback callback2 = mock(RangingSession.Callback.class);
+
+        when(ADAPTER.startRanging(any(), any()))
+                .thenReturn(sessionHandle1)
+                .thenReturn(sessionHandle2);
+
+        RangingManager rangingManager = new RangingManager(ADAPTER);
+        rangingManager.openSession(PARAMS, EXECUTOR, callback1);
+        rangingManager.openSession(PARAMS, EXECUTOR, callback2);
+
+        rangingManager.onRangingClosed(sessionHandle1, CLOSE_REASON, PARAMS);
+        verify(callback1, times(1)).onClosed(anyInt(), any());
+        verify(callback2, times(0)).onClosed(anyInt(), any());
+
+        rangingManager.onRangingClosed(sessionHandle2, CLOSE_REASON, PARAMS);
+        verify(callback1, times(1)).onClosed(anyInt(), any());
+        verify(callback2, times(1)).onClosed(anyInt(), any());
+    }
+
+    @Test
+    public void testOnRangingReport_OnReportReceived() throws RemoteException {
+        RangingManager rangingManager = new RangingManager(ADAPTER);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        SessionHandle handle = new SessionHandle(1);
+        when(ADAPTER.startRanging(any(), any())).thenReturn(handle);
+        rangingManager.openSession(PARAMS, EXECUTOR, callback);
+        rangingManager.onRangingStarted(handle, PARAMS);
+
+        RangingReport report = UwbTestUtils.getRangingReports(1);
+        rangingManager.onRangingResult(handle, report);
+        verify(callback, times(1)).onReportReceived(eq(report));
+    }
+
+    @Test
+    public void testOnRangingReport_MultipleSessionsRegistered() throws RemoteException {
+        SessionHandle sessionHandle1 = new SessionHandle(1);
+        SessionHandle sessionHandle2 = new SessionHandle(2);
+        RangingSession.Callback callback1 = mock(RangingSession.Callback.class);
+        RangingSession.Callback callback2 = mock(RangingSession.Callback.class);
+
+        when(ADAPTER.startRanging(any(), any()))
+                .thenReturn(sessionHandle1)
+                .thenReturn(sessionHandle2);
+
+        RangingManager rangingManager = new RangingManager(ADAPTER);
+        rangingManager.openSession(PARAMS, EXECUTOR, callback1);
+        rangingManager.onRangingStarted(sessionHandle1, PARAMS);
+        rangingManager.openSession(PARAMS, EXECUTOR, callback2);
+        rangingManager.onRangingStarted(sessionHandle2, PARAMS);
+
+        rangingManager.onRangingResult(sessionHandle1, UwbTestUtils.getRangingReports(1));
+        verify(callback1, times(1)).onReportReceived(any());
+        verify(callback2, times(0)).onReportReceived(any());
+
+        rangingManager.onRangingResult(sessionHandle2, UwbTestUtils.getRangingReports(1));
+        verify(callback1, times(1)).onReportReceived(any());
+        verify(callback2, times(1)).onReportReceived(any());
+    }
+
+    @Test
+    public void testOnClose_Reasons() throws RemoteException {
+        runOnClose_Reason(CloseReason.LOCAL_API,
+                RangingSession.Callback.CLOSE_REASON_LOCAL_CLOSE_API);
+
+        runOnClose_Reason(CloseReason.MAX_SESSIONS_REACHED,
+                RangingSession.Callback.CLOSE_REASON_LOCAL_MAX_SESSIONS_REACHED);
+
+        runOnClose_Reason(CloseReason.PROTOCOL_SPECIFIC,
+                RangingSession.Callback.CLOSE_REASON_PROTOCOL_SPECIFIC);
+
+        runOnClose_Reason(CloseReason.REMOTE_REQUEST,
+                RangingSession.Callback.CLOSE_REASON_REMOTE_REQUEST);
+
+        runOnClose_Reason(CloseReason.SYSTEM_POLICY,
+                RangingSession.Callback.CLOSE_REASON_LOCAL_SYSTEM_POLICY);
+
+        runOnClose_Reason(CloseReason.UNKNOWN,
+                RangingSession.Callback.CLOSE_REASON_UNKNOWN);
+    }
+
+    private void runOnClose_Reason(@CloseReason int reasonIn,
+            @RangingSession.Callback.CloseReason int reasonOut) throws RemoteException {
+        RangingManager rangingManager = new RangingManager(ADAPTER);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        SessionHandle handle = new SessionHandle(1);
+        when(ADAPTER.startRanging(any(), any())).thenReturn(handle);
+        rangingManager.openSession(PARAMS, EXECUTOR, callback);
+
+        rangingManager.onRangingClosed(handle, reasonIn, PARAMS);
+        verify(callback, times(1)).onClosed(eq(reasonOut), eq(PARAMS));
+    }
+
+    @Test
+    public void testStartFailureReasons() throws RemoteException {
+        runOnRangingStartFailed_Reason(StartFailureReason.BAD_PARAMETERS,
+                RangingSession.Callback.CLOSE_REASON_LOCAL_BAD_PARAMETERS);
+
+        runOnRangingStartFailed_Reason(StartFailureReason.MAX_SESSIONS_REACHED,
+                RangingSession.Callback.CLOSE_REASON_LOCAL_MAX_SESSIONS_REACHED);
+
+        runOnRangingStartFailed_Reason(StartFailureReason.PROTOCOL_SPECIFIC,
+                RangingSession.Callback.CLOSE_REASON_PROTOCOL_SPECIFIC);
+
+        runOnRangingStartFailed_Reason(StartFailureReason.SYSTEM_POLICY,
+                RangingSession.Callback.CLOSE_REASON_LOCAL_SYSTEM_POLICY);
+
+        runOnRangingStartFailed_Reason(StartFailureReason.UNKNOWN,
+                RangingSession.Callback.CLOSE_REASON_UNKNOWN);
+    }
+
+    private void runOnRangingStartFailed_Reason(@StartFailureReason int reasonIn,
+            @RangingSession.Callback.CloseReason int reasonOut) throws RemoteException {
+        RangingManager rangingManager = new RangingManager(ADAPTER);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        SessionHandle handle = new SessionHandle(1);
+        when(ADAPTER.startRanging(any(), any())).thenReturn(handle);
+        rangingManager.openSession(PARAMS, EXECUTOR, callback);
+
+        rangingManager.onRangingStartFailed(handle, reasonIn, PARAMS);
+        verify(callback, times(1)).onClosed(eq(reasonOut), eq(PARAMS));
+    }
+}
diff --git a/core/tests/uwbtests/src/android/uwb/RangingSessionTest.java b/core/tests/uwbtests/src/android/uwb/RangingSessionTest.java
new file mode 100644
index 0000000..702c68e
--- /dev/null
+++ b/core/tests/uwbtests/src/android/uwb/RangingSessionTest.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.uwb;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.os.PersistableBundle;
+import android.os.RemoteException;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Test of {@link RangingSession}.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class RangingSessionTest {
+    private static final IUwbAdapter ADAPTER = mock(IUwbAdapter.class);
+    private static final Executor EXECUTOR = UwbTestUtils.getExecutor();
+    private static final PersistableBundle PARAMS = new PersistableBundle();
+    private static final @RangingSession.Callback.CloseReason int CLOSE_REASON =
+            RangingSession.Callback.CLOSE_REASON_LOCAL_GENERIC_ERROR;
+
+    @Test
+    public void testOnRangingStarted_OnOpenSuccessCalled() {
+        SessionHandle handle = new SessionHandle(123);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+        verifyOpenState(session, false);
+
+        session.onRangingStarted(PARAMS);
+        verifyOpenState(session, true);
+
+        // Verify that the onOpenSuccess callback was invoked
+        verify(callback, times(1)).onOpenSuccess(eq(session), any());
+        verify(callback, times(0)).onClosed(anyInt(), any());
+    }
+
+    @Test
+    public void testOnRangingStarted_CannotOpenClosedSession() {
+        SessionHandle handle = new SessionHandle(123);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+
+        session.onRangingStarted(PARAMS);
+        verifyOpenState(session, true);
+        verify(callback, times(1)).onOpenSuccess(eq(session), any());
+        verify(callback, times(0)).onClosed(anyInt(), any());
+
+        session.onRangingClosed(CLOSE_REASON, PARAMS);
+        verifyOpenState(session, false);
+        verify(callback, times(1)).onOpenSuccess(eq(session), any());
+        verify(callback, times(1)).onClosed(anyInt(), any());
+
+        // Now invoke the ranging started callback and ensure the session remains closed
+        session.onRangingStarted(PARAMS);
+        verifyOpenState(session, false);
+        verify(callback, times(1)).onOpenSuccess(eq(session), any());
+        verify(callback, times(1)).onClosed(anyInt(), any());
+    }
+
+    @Test
+    public void testOnRangingClosed_OnClosedCalledWhenSessionNotOpen() {
+        SessionHandle handle = new SessionHandle(123);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+        verifyOpenState(session, false);
+
+        session.onRangingClosed(CLOSE_REASON, PARAMS);
+        verifyOpenState(session, false);
+
+        // Verify that the onOpenSuccess callback was invoked
+        verify(callback, times(0)).onOpenSuccess(eq(session), any());
+        verify(callback, times(1)).onClosed(anyInt(), any());
+    }
+
+    @Test public void testOnRangingClosed_OnClosedCalled() {
+        SessionHandle handle = new SessionHandle(123);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+        session.onRangingStarted(PARAMS);
+        session.onRangingClosed(CLOSE_REASON, PARAMS);
+        verify(callback, times(1)).onClosed(anyInt(), any());
+
+        verifyOpenState(session, false);
+        session.onRangingClosed(CLOSE_REASON, PARAMS);
+        verify(callback, times(2)).onClosed(anyInt(), any());
+    }
+
+    @Test
+    public void testOnRangingResult_OnReportReceivedCalled() {
+        SessionHandle handle = new SessionHandle(123);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+        verifyOpenState(session, false);
+
+        session.onRangingStarted(PARAMS);
+        verifyOpenState(session, true);
+
+        RangingReport report = UwbTestUtils.getRangingReports(1);
+        session.onRangingResult(report);
+        verify(callback, times(1)).onReportReceived(eq(report));
+    }
+
+    @Test
+    public void testClose() throws RemoteException {
+        SessionHandle handle = new SessionHandle(123);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+        session.onRangingStarted(PARAMS);
+
+        // Calling close multiple times should invoke closeRanging until the session receives
+        // the onClosed callback.
+        int totalCallsBeforeOnRangingClosed = 3;
+        for (int i = 1; i <= totalCallsBeforeOnRangingClosed; i++) {
+            session.close();
+            verifyOpenState(session, true);
+            verify(ADAPTER, times(i)).closeRanging(handle);
+            verify(callback, times(0)).onClosed(anyInt(), any());
+        }
+
+        // After onClosed is invoked, then the adapter should no longer be called for each call to
+        // the session's close.
+        final int totalCallsAfterOnRangingClosed = 2;
+        for (int i = 1; i <= totalCallsAfterOnRangingClosed; i++) {
+            session.onRangingClosed(CLOSE_REASON, PARAMS);
+            verifyOpenState(session, false);
+            verify(ADAPTER, times(totalCallsBeforeOnRangingClosed)).closeRanging(handle);
+            verify(callback, times(i)).onClosed(anyInt(), any());
+        }
+    }
+
+    @Test
+    public void testOnRangingResult_OnReportReceivedCalledWhenOpen() {
+        SessionHandle handle = new SessionHandle(123);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+
+        assertFalse(session.isOpen());
+        session.onRangingStarted(PARAMS);
+        assertTrue(session.isOpen());
+
+        // Verify that the onReportReceived callback was invoked
+        RangingReport report = UwbTestUtils.getRangingReports(1);
+        session.onRangingResult(report);
+        verify(callback, times(1)).onReportReceived(report);
+    }
+
+    @Test
+    public void testOnRangingResult_OnReportReceivedNotCalledWhenNotOpen() {
+        SessionHandle handle = new SessionHandle(123);
+        RangingSession.Callback callback = mock(RangingSession.Callback.class);
+        RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+
+        assertFalse(session.isOpen());
+
+        // Verify that the onReportReceived callback was invoked
+        RangingReport report = UwbTestUtils.getRangingReports(1);
+        session.onRangingResult(report);
+        verify(callback, times(0)).onReportReceived(report);
+    }
+
+    private void verifyOpenState(RangingSession session, boolean expected) {
+        assertEquals(expected, session.isOpen());
+    }
+}
diff --git a/core/tests/uwbtests/src/android/uwb/UwbTestUtils.java b/core/tests/uwbtests/src/android/uwb/UwbTestUtils.java
index fb75092..b4b2e30 100644
--- a/core/tests/uwbtests/src/android/uwb/UwbTestUtils.java
+++ b/core/tests/uwbtests/src/android/uwb/UwbTestUtils.java
@@ -22,6 +22,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.Executor;
 
 public class UwbTestUtils {
     private UwbTestUtils() {}
@@ -96,4 +97,13 @@
         }
         return UwbAddress.fromBytes(addressBytes);
     }
+
+    public static Executor getExecutor() {
+        return new Executor() {
+            @Override
+            public void execute(Runnable command) {
+                command.run();
+            }
+        };
+    }
 }
diff --git a/data/etc/com.android.cellbroadcastreceiver.xml b/data/etc/com.android.cellbroadcastreceiver.xml
index dd2df42..ef49bfa 100644
--- a/data/etc/com.android.cellbroadcastreceiver.xml
+++ b/data/etc/com.android.cellbroadcastreceiver.xml
@@ -19,6 +19,7 @@
         <permission name="android.permission.INTERACT_ACROSS_USERS"/>
         <permission name="android.permission.MANAGE_USERS"/>
         <permission name="android.permission.MODIFY_PHONE_STATE"/>
+        <permission name="android.permission.MODIFY_CELL_BROADCASTS"/>
         <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
         <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/>
         <permission name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"/>
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 0a77be9..2e12795 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -49,6 +49,7 @@
         <permission name="android.permission.INTERACT_ACROSS_USERS"/>
         <permission name="android.permission.MANAGE_USERS"/>
         <permission name="android.permission.MODIFY_PHONE_STATE"/>
+        <permission name="android.permission.MODIFY_CELL_BROADCASTS"/>
         <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
         <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/>
         <permission name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"/>
@@ -452,6 +453,8 @@
         <permission name="android.permission.TEST_BIOMETRIC" />
         <!-- Permissions required for CTS test - CtsContactsProviderTestCases -->
         <permission name="android.contacts.permission.MANAGE_SIM_ACCOUNTS" />
+        <!-- Permissions required for CTS test - CtsHdmiCecHostTestCases -->
+        <permission name="android.permission.HDMI_CEC"/>
     </privapp-permissions>
 
     <privapp-permissions package="com.android.statementservice">
diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml
index ba2e52a..2db4c5d 100644
--- a/data/fonts/fonts.xml
+++ b/data/fonts/fonts.xml
@@ -377,16 +377,44 @@
         </font>
     </family>
     <family lang="und-Deva" variant="elegant">
-        <font weight="400" style="normal">NotoSansDevanagari-Regular.otf</font>
-        <font weight="500" style="normal">NotoSansDevanagari-Medium.otf</font>
-        <font weight="700" style="normal">NotoSansDevanagari-Bold.otf</font>
-        <font weight="400" style="normal" fallbackFor="serif">NotoSerifDevanagari-Regular.ttf</font>
-        <font weight="700" style="normal" fallbackFor="serif">NotoSerifDevanagari-Bold.ttf</font>
+        <font weight="400" style="normal">NotoSansDevanagari-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansDevanagari-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansDevanagari-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansDevanagari-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifDevanagari-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal" fallbackFor="serif">NotoSerifDevanagari-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal" fallbackFor="serif">NotoSerifDevanagari-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifDevanagari-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Deva" variant="compact">
-        <font weight="400" style="normal">NotoSansDevanagariUI-Regular.otf</font>
-        <font weight="500" style="normal">NotoSansDevanagariUI-Medium.otf</font>
-        <font weight="700" style="normal">NotoSansDevanagariUI-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansDevanagariUI-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansDevanagariUI-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansDevanagariUI-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansDevanagariUI-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
 
     <!-- All scripts of India should come after Devanagari, due to shared
@@ -395,78 +423,262 @@
     <family lang="und-Gujr" variant="elegant">
         <font weight="400" style="normal">NotoSansGujarati-Regular.ttf</font>
         <font weight="700" style="normal">NotoSansGujarati-Bold.ttf</font>
-        <font weight="400" style="normal" fallbackFor="serif">NotoSerifGujarati-Regular.ttf</font>
-        <font weight="700" style="normal" fallbackFor="serif">NotoSerifGujarati-Bold.ttf</font>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifGujarati-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal" fallbackFor="serif">NotoSerifGujarati-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal" fallbackFor="serif">NotoSerifGujarati-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifGujarati-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Gujr" variant="compact">
         <font weight="400" style="normal">NotoSansGujaratiUI-Regular.ttf</font>
         <font weight="700" style="normal">NotoSansGujaratiUI-Bold.ttf</font>
     </family>
     <family lang="und-Guru" variant="elegant">
-        <font weight="400" style="normal">NotoSansGurmukhi-Regular.ttf</font>
-        <font weight="700" style="normal">NotoSansGurmukhi-Bold.ttf</font>
-        <font weight="400" style="normal" fallbackFor="serif">NotoSerifGurmukhi-Regular.otf</font>
-        <font weight="700" style="normal" fallbackFor="serif">NotoSerifGurmukhi-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansGurmukhi-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansGurmukhi-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansGurmukhi-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansGurmukhi-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifGurmukhi-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal" fallbackFor="serif">NotoSerifGurmukhi-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal" fallbackFor="serif">NotoSerifGurmukhi-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifGurmukhi-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Guru" variant="compact">
-        <font weight="400" style="normal">NotoSansGurmukhiUI-Regular.ttf</font>
-        <font weight="700" style="normal">NotoSansGurmukhiUI-Bold.ttf</font>
+        <font weight="400" style="normal">NotoSansGurmukhiUI-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansGurmukhiUI-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansGurmukhiUI-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansGurmukhiUI-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Taml" variant="elegant">
-        <font weight="400" style="normal">NotoSansTamil-Regular.otf</font>
-        <font weight="500" style="normal">NotoSansTamil-Medium.otf</font>
-        <font weight="700" style="normal">NotoSansTamil-Bold.otf</font>
-        <font weight="400" style="normal" fallbackFor="serif">NotoSerifTamil-Regular.otf</font>
-        <font weight="700" style="normal" fallbackFor="serif">NotoSerifTamil-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansTamil-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansTamil-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansTamil-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansTamil-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifTamil-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal" fallbackFor="serif">NotoSerifTamil-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal" fallbackFor="serif">NotoSerifTamil-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifTamil-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Taml" variant="compact">
-        <font weight="400" style="normal">NotoSansTamilUI-Regular.otf</font>
-        <font weight="500" style="normal">NotoSansTamilUI-Medium.otf</font>
-        <font weight="700" style="normal">NotoSansTamilUI-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansTamilUI-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansTamilUI-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansTamilUI-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansTamilUI-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Mlym" variant="elegant">
-        <font weight="400" style="normal">NotoSansMalayalam-Regular.otf</font>
-        <font weight="500" style="normal">NotoSansMalayalam-Medium.otf</font>
-        <font weight="700" style="normal">NotoSansMalayalam-Bold.otf</font>
-        <font weight="400" style="normal" fallbackFor="serif">NotoSerifMalayalam-Regular.ttf</font>
-        <font weight="700" style="normal" fallbackFor="serif">NotoSerifMalayalam-Bold.ttf</font>
+        <font weight="400" style="normal">NotoSansMalayalam-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansMalayalam-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansMalayalam-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansMalayalam-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifMalayalam-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal" fallbackFor="serif">NotoSerifMalayalam-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal" fallbackFor="serif">NotoSerifMalayalam-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifMalayalam-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Mlym" variant="compact">
-        <font weight="400" style="normal">NotoSansMalayalamUI-Regular.otf</font>
-        <font weight="500" style="normal">NotoSansMalayalamUI-Medium.otf</font>
-        <font weight="700" style="normal">NotoSansMalayalamUI-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansMalayalamUI-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansMalayalamUI-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansMalayalamUI-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansMalayalamUI-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Beng" variant="elegant">
-        <font weight="400" style="normal">NotoSansBengali-Regular.otf</font>
-        <font weight="500" style="normal">NotoSansBengali-Medium.otf</font>
-        <font weight="700" style="normal">NotoSansBengali-Bold.otf</font>
-        <font weight="400" style="normal" fallbackFor="serif">NotoSerifBengali-Regular.ttf</font>
-        <font weight="700" style="normal" fallbackFor="serif">NotoSerifBengali-Bold.ttf</font>
+        <font weight="400" style="normal">NotoSansBengali-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansBengali-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansBengali-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansBengali-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifBengali-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal" fallbackFor="serif">NotoSerifBengali-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal" fallbackFor="serif">NotoSerifBengali-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifBengali-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Beng" variant="compact">
-        <font weight="400" style="normal">NotoSansBengaliUI-Regular.otf</font>
-        <font weight="500" style="normal">NotoSansBengaliUI-Medium.otf</font>
-        <font weight="700" style="normal">NotoSansBengaliUI-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansBengaliUI-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansBengaliUI-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansBengaliUI-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansBengaliUI-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Telu" variant="elegant">
-        <font weight="400" style="normal">NotoSansTelugu-Regular.ttf</font>
-        <font weight="700" style="normal">NotoSansTelugu-Bold.ttf</font>
-        <font weight="400" style="normal" fallbackFor="serif">NotoSerifTelugu-Regular.ttf</font>
-        <font weight="700" style="normal" fallbackFor="serif">NotoSerifTelugu-Bold.ttf</font>
+        <font weight="400" style="normal">NotoSansTelugu-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansTelugu-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansTelugu-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansTelugu-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifTelugu-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal" fallbackFor="serif">NotoSerifTelugu-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal" fallbackFor="serif">NotoSerifTelugu-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifTelugu-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Telu" variant="compact">
-        <font weight="400" style="normal">NotoSansTeluguUI-Regular.ttf</font>
-        <font weight="700" style="normal">NotoSansTeluguUI-Bold.ttf</font>
+        <font weight="400" style="normal">NotoSansTeluguUI-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansTeluguUI-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansTeluguUI-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansTeluguUI-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Knda" variant="elegant">
-        <font weight="400" style="normal">NotoSansKannada-Regular.ttf</font>
-        <font weight="700" style="normal">NotoSansKannada-Bold.ttf</font>
-        <font weight="400" style="normal" fallbackFor="serif">NotoSerifKannada-Regular.ttf</font>
-        <font weight="700" style="normal" fallbackFor="serif">NotoSerifKannada-Bold.ttf</font>
+        <font weight="400" style="normal">NotoSansKannada-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansKannada-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansKannada-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansKannada-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifKannada-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal" fallbackFor="serif">NotoSerifKannada-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal" fallbackFor="serif">NotoSerifKannada-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifKannada-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Knda" variant="compact">
-        <font weight="400" style="normal">NotoSansKannadaUI-Regular.ttf</font>
-        <font weight="700" style="normal">NotoSansKannadaUI-Bold.ttf</font>
+        <font weight="400" style="normal">NotoSansKannadaUI-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansKannadaUI-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansKannadaUI-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansKannadaUI-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Orya" variant="elegant">
         <font weight="400" style="normal">NotoSansOriya-Regular.ttf</font>
@@ -476,18 +688,45 @@
         <font weight="400" style="normal">NotoSansOriyaUI-Regular.ttf</font>
         <font weight="700" style="normal">NotoSansOriyaUI-Bold.ttf</font>
     </family>
-
     <family lang="und-Sinh" variant="elegant">
-        <font weight="400" style="normal">NotoSansSinhala-Regular.otf</font>
-        <font weight="500" style="normal">NotoSansSinhala-Medium.otf</font>
-        <font weight="700" style="normal">NotoSansSinhala-Bold.otf</font>
-        <font weight="400" style="normal" fallbackFor="serif">NotoSerifSinhala-Regular.otf</font>
-        <font weight="700" style="normal" fallbackFor="serif">NotoSerifSinhala-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansSinhala-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansSinhala-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansSinhala-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansSinhala-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifSinhala-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal" fallbackFor="serif">NotoSerifSinhala-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal" fallbackFor="serif">NotoSerifSinhala-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifSinhala-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Sinh" variant="compact">
-        <font weight="400" style="normal">NotoSansSinhalaUI-Regular.otf</font>
-        <font weight="500" style="normal">NotoSansSinhalaUI-Medium.otf</font>
-        <font weight="700" style="normal">NotoSansSinhalaUI-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansSinhalaUI-VF.ttf
+            <axis tag="wght" stylevalue="400"/>
+        </font>
+        <font weight="500" style="normal">NotoSansSinhalaUI-VF.ttf
+            <axis tag="wght" stylevalue="500"/>
+        </font>
+        <font weight="600" style="normal">NotoSansSinhalaUI-VF.ttf
+            <axis tag="wght" stylevalue="600"/>
+        </font>
+        <font weight="700" style="normal">NotoSansSinhalaUI-VF.ttf
+            <axis tag="wght" stylevalue="700"/>
+        </font>
     </family>
     <family lang="und-Khmr" variant="elegant">
         <font weight="100" style="normal">NotoSansKhmer-VF.ttf
@@ -650,7 +889,7 @@
         <font weight="400" style="normal">NotoSansInscriptionalParthian-Regular.ttf</font>
     </family>
     <family lang="und-Java">
-        <font weight="400" style="normal">NotoSansJavanese-Regular.ttf</font>
+        <font weight="400" style="normal">NotoSansJavanese-Regular.otf</font>
     </family>
     <family lang="und-Kthi">
         <font weight="400" style="normal">NotoSansKaithi-Regular.ttf</font>
diff --git a/drm/java/android/drm/DrmOutputStream.java b/drm/java/android/drm/DrmOutputStream.java
index 73e7f23..2a3f530 100644
--- a/drm/java/android/drm/DrmOutputStream.java
+++ b/drm/java/android/drm/DrmOutputStream.java
@@ -25,9 +25,10 @@
 import android.system.Os;
 import android.util.Log;
 
+import com.android.internal.util.ArrayUtils;
+
 import libcore.io.IoBridge;
 import libcore.io.Streams;
-import libcore.util.ArrayUtils;
 
 import java.io.FileDescriptor;
 import java.io.FilterOutputStream;
diff --git a/graphics/java/android/graphics/BitmapShader.java b/graphics/java/android/graphics/BitmapShader.java
index 1cb5912..e6ff187 100644
--- a/graphics/java/android/graphics/BitmapShader.java
+++ b/graphics/java/android/graphics/BitmapShader.java
@@ -31,6 +31,23 @@
     private int mTileX;
     private int mTileY;
 
+    /*
+     *  This is cache of the last value from the Paint of bitmap-filtering.
+     *  In the future, BitmapShaders will carry their own (expanded) data for this
+     *  (e.g. including mipmap options, or bicubic weights)
+     *
+     *  When that happens, this bool will become those extended values, and we will
+     *  need to track whether this Shader was created with those new constructors,
+     *  or from the current "legacy" constructor, which (for compatibility) will
+     *  still need to know the Paint's setting.
+     *
+     *  When the filter Paint setting is finally gone, we will be able to remove
+     *  the filterFromPaint parameter currently being passed to createNativeInstance()
+     *  and shouldDiscardNativeInstance(), as shaders will always know their filter
+     *  settings.
+     */
+    private boolean mFilterFromPaint;
+
     /**
      * Call this to create a new shader that will draw with a bitmap.
      *
@@ -49,14 +66,24 @@
         mBitmap = bitmap;
         mTileX = tileX;
         mTileY = tileY;
+        mFilterFromPaint = false;
     }
 
     /** @hide */
     @Override
-    protected long createNativeInstance(long nativeMatrix) {
-        return nativeCreate(nativeMatrix, mBitmap.getNativeInstance(), mTileX, mTileY);
+    protected long createNativeInstance(long nativeMatrix, boolean filterFromPaint) {
+        mFilterFromPaint = filterFromPaint;
+        return nativeCreate(nativeMatrix, mBitmap.getNativeInstance(), mTileX, mTileY,
+                            mFilterFromPaint);
+    }
+
+    /** @hide */
+    @Override
+    protected boolean shouldDiscardNativeInstance(boolean filterFromPaint) {
+        return mFilterFromPaint != filterFromPaint;
     }
 
     private static native long nativeCreate(long nativeMatrix, long bitmapHandle,
-            int shaderTileModeX, int shaderTileModeY);
+            int shaderTileModeX, int shaderTileModeY, boolean filter);
 }
+
diff --git a/graphics/java/android/graphics/BlurShader.java b/graphics/java/android/graphics/BlurShader.java
index 3bc8119..2e4bd7d 100644
--- a/graphics/java/android/graphics/BlurShader.java
+++ b/graphics/java/android/graphics/BlurShader.java
@@ -69,16 +69,18 @@
 
     /** @hide **/
     @Override
-    protected long createNativeInstance(long nativeMatrix) {
-        mNativeInputShader = mInputShader != null ? mInputShader.getNativeInstance() : 0;
+    protected long createNativeInstance(long nativeMatrix, boolean filterFromPaint) {
+        mNativeInputShader = mInputShader != null
+                ? mInputShader.getNativeInstance(filterFromPaint) : 0;
         return nativeCreate(nativeMatrix, mRadiusX, mRadiusY, mNativeInputShader,
                 mEdgeTreatment.nativeInt);
     }
 
     /** @hide **/
     @Override
-    protected boolean shouldDiscardNativeInstance() {
-        long currentNativeInstance = mInputShader != null ? mInputShader.getNativeInstance() : 0;
+    protected boolean shouldDiscardNativeInstance(boolean filterFromPaint) {
+        long currentNativeInstance = mInputShader != null
+                ? mInputShader.getNativeInstance(filterFromPaint) : 0;
         return mNativeInputShader != currentNativeInstance;
     }
 
diff --git a/graphics/java/android/graphics/ComposeShader.java b/graphics/java/android/graphics/ComposeShader.java
index b840f3f..977aeaa 100644
--- a/graphics/java/android/graphics/ComposeShader.java
+++ b/graphics/java/android/graphics/ComposeShader.java
@@ -86,18 +86,18 @@
 
     /** @hide */
     @Override
-    protected long createNativeInstance(long nativeMatrix) {
-        mNativeInstanceShaderA = mShaderA.getNativeInstance();
-        mNativeInstanceShaderB = mShaderB.getNativeInstance();
+    protected long createNativeInstance(long nativeMatrix, boolean filterFromPaint) {
+        mNativeInstanceShaderA = mShaderA.getNativeInstance(filterFromPaint);
+        mNativeInstanceShaderB = mShaderB.getNativeInstance(filterFromPaint);
         return nativeCreate(nativeMatrix,
                 mShaderA.getNativeInstance(), mShaderB.getNativeInstance(), mPorterDuffMode);
     }
 
     /** @hide */
     @Override
-    protected boolean shouldDiscardNativeInstance() {
-        return mShaderA.getNativeInstance() != mNativeInstanceShaderA
-                || mShaderB.getNativeInstance() != mNativeInstanceShaderB;
+    protected boolean shouldDiscardNativeInstance(boolean filterFromPaint) {
+        return mShaderA.getNativeInstance(filterFromPaint) != mNativeInstanceShaderA
+                || mShaderB.getNativeInstance(filterFromPaint) != mNativeInstanceShaderB;
     }
 
     private static native long nativeCreate(long nativeMatrix,
diff --git a/graphics/java/android/graphics/LinearGradient.java b/graphics/java/android/graphics/LinearGradient.java
index 4eedbf5..56d912b 100644
--- a/graphics/java/android/graphics/LinearGradient.java
+++ b/graphics/java/android/graphics/LinearGradient.java
@@ -154,7 +154,7 @@
 
     /** @hide */
     @Override
-    protected long createNativeInstance(long nativeMatrix) {
+    protected long createNativeInstance(long nativeMatrix, boolean filterFromPaint) {
         return nativeCreate(nativeMatrix, mX0, mY0, mX1, mY1,
                 mColorLongs, mPositions, mTileMode.nativeInt,
                 colorSpace().getNativeInstance());
diff --git a/graphics/java/android/graphics/OWNERS b/graphics/java/android/graphics/OWNERS
index a8a3631..9fa8f1b 100644
--- a/graphics/java/android/graphics/OWNERS
+++ b/graphics/java/android/graphics/OWNERS
@@ -4,6 +4,8 @@
 jreck@google.com
 njawad@google.com
 sumir@google.com
+djsollen@google.com
+scroggo@google.com
 
 per-file BLASTBufferQueue.java = file:/services/core/java/com/android/server/wm/OWNERS
 per-file FontFamily.java = file:fonts/OWNERS
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index 4b6e4d1..f1f9a5f 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -698,7 +698,8 @@
      */
     @UnsupportedAppUsage
     public synchronized long getNativeInstance() {
-        long newNativeShader = mShader == null ? 0 : mShader.getNativeInstance();
+        boolean filter = isFilterBitmap();
+        long newNativeShader = mShader == null ? 0 : mShader.getNativeInstance(filter);
         if (newNativeShader != mNativeShader) {
             mNativeShader = newNativeShader;
             nSetShader(mNativePaint, mNativeShader);
diff --git a/graphics/java/android/graphics/RadialGradient.java b/graphics/java/android/graphics/RadialGradient.java
index dd1be15..199365e 100644
--- a/graphics/java/android/graphics/RadialGradient.java
+++ b/graphics/java/android/graphics/RadialGradient.java
@@ -207,7 +207,7 @@
 
     /** @hide */
     @Override
-    protected long createNativeInstance(long nativeMatrix) {
+    protected long createNativeInstance(long nativeMatrix, boolean filterFromPaint) {
         return nativeCreate(nativeMatrix, mFocalX, mFocalY, mFocalRadius, mX, mY, mRadius,
                 mColorLongs, mPositions, mTileMode.nativeInt, colorSpace().getNativeInstance());
     }
diff --git a/graphics/java/android/graphics/RuntimeShader.java b/graphics/java/android/graphics/RuntimeShader.java
index 63089e2..fb0983a 100644
--- a/graphics/java/android/graphics/RuntimeShader.java
+++ b/graphics/java/android/graphics/RuntimeShader.java
@@ -105,10 +105,10 @@
 
     /** @hide */
     @Override
-    protected long createNativeInstance(long nativeMatrix) {
+    protected long createNativeInstance(long nativeMatrix, boolean filterFromPaint) {
         long[] nativeShaders = mInputShaders.length > 0 ? new long[mInputShaders.length] : null;
         for (int i = 0; i < mInputShaders.length; i++) {
-            nativeShaders[i] = mInputShaders[i].getNativeInstance();
+            nativeShaders[i] = mInputShaders[i].getNativeInstance(filterFromPaint);
         }
 
         return nativeCreate(mNativeInstanceRuntimeShaderFactory, nativeMatrix, mUniforms,
diff --git a/graphics/java/android/graphics/Shader.java b/graphics/java/android/graphics/Shader.java
index 7651d01..4d6bead 100644
--- a/graphics/java/android/graphics/Shader.java
+++ b/graphics/java/android/graphics/Shader.java
@@ -148,7 +148,7 @@
     /**
      *  @hide Only to be used by subclasses in the graphics package.
      */
-    protected long createNativeInstance(long nativeMatrix) {
+    protected long createNativeInstance(long nativeMatrix, boolean filterFromPaint) {
         return 0;
     }
 
@@ -173,7 +173,7 @@
      * constructed native instance is still valid.
      *  @hide Only to be used by subclasses in the graphics package.
      */
-    protected boolean shouldDiscardNativeInstance() {
+    protected boolean shouldDiscardNativeInstance(boolean filterBitmap) {
         return false;
     }
 
@@ -182,14 +182,14 @@
      * @hide so it can be called by android.graphics.drawable but must not be called from outside
      * the module.
      */
-    public synchronized final long getNativeInstance() {
-        if (shouldDiscardNativeInstance()) {
+    public final synchronized long getNativeInstance(boolean filterFromPaint) {
+        if (shouldDiscardNativeInstance(filterFromPaint)) {
             discardNativeInstanceLocked();
         }
 
         if (mNativeInstance == 0) {
             mNativeInstance = createNativeInstance(mLocalMatrix == null
-                    ? 0 : mLocalMatrix.ni());
+                    ? 0 : mLocalMatrix.ni(), filterFromPaint);
             if (mNativeInstance != 0) {
                 mCleaner = NoImagePreloadHolder.sRegistry.registerNativeAllocation(
                         this, mNativeInstance);
@@ -199,6 +199,15 @@
     }
 
     /**
+     * @hide so it can be called by android.graphics.drawable but must not be called from outside
+     * the module.
+     */
+    public final long getNativeInstance() {
+        // If the caller has no paint flag for filtering bitmaps, we just pass false
+        return getNativeInstance(false);
+    }
+
+    /**
      * @hide Only to be called by subclasses in the android.graphics package.
      */
     protected static @ColorLong long[] convertColors(@NonNull @ColorInt int[] colors) {
diff --git a/graphics/java/android/graphics/SweepGradient.java b/graphics/java/android/graphics/SweepGradient.java
index 2280780..3a29395 100644
--- a/graphics/java/android/graphics/SweepGradient.java
+++ b/graphics/java/android/graphics/SweepGradient.java
@@ -133,7 +133,7 @@
 
     /** @hide */
     @Override
-    protected long createNativeInstance(long nativeMatrix) {
+    protected long createNativeInstance(long nativeMatrix, boolean filterFromPaint) {
         return nativeCreate(nativeMatrix, mCx, mCy, mColorLongs, mPositions,
                 colorSpace().getNativeInstance());
     }
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index d6b4f18..48b474d 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -25,6 +25,7 @@
 import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.UiThread;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.res.AssetManager;
 import android.graphics.fonts.Font;
@@ -149,8 +150,8 @@
     static final Map<String, Typeface> sSystemFontMap = new HashMap<>();
 
     // DirectByteBuffer object to hold sSystemFontMap's backing memory mapping.
-    @GuardedBy("SYSTEM_FONT_MAP_LOCK")
     static ByteBuffer sSystemFontMapBuffer = null;
+    static SharedMemory sSystemFontMapSharedMemory = null;
 
     // Lock to guard sSystemFontMap and derived default or public typefaces.
     // sStyledCacheLock may be held while this lock is held. Holding them in the reverse order may
@@ -1252,14 +1253,27 @@
      * per process.
      */
     /** @hide */
-    public static void setSystemFontMap(SharedMemory sharedMemory)
+    @UiThread
+    public static void setSystemFontMap(@Nullable SharedMemory sharedMemory)
             throws IOException, ErrnoException {
         if (sSystemFontMapBuffer != null) {
+            // Apps can re-send BIND_APPLICATION message from their code. This is a work around to
+            // detect it and avoid crashing.
+            if (sharedMemory == null || sharedMemory == sSystemFontMapSharedMemory) {
+                return;
+            }
             throw new UnsupportedOperationException(
                     "Once set, buffer-based system font map cannot be updated");
         }
+        sSystemFontMapSharedMemory = sharedMemory;
         Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "setSystemFontMap");
         try {
+            if (sharedMemory == null) {
+                // FontManagerService is not started. This may happen in FACTORY_TEST_LOW_LEVEL
+                // mode for example.
+                loadPreinstalledSystemFontMap();
+                return;
+            }
             sSystemFontMapBuffer = sharedMemory.mapReadOnly().order(ByteOrder.BIG_ENDIAN);
             Map<String, Typeface> systemFontMap = deserializeFontMap(sSystemFontMapBuffer);
             setSystemFontMap(systemFontMap);
@@ -1319,6 +1333,7 @@
                 SharedMemory.unmap(sSystemFontMapBuffer);
             }
             sSystemFontMapBuffer = null;
+            sSystemFontMapSharedMemory = null;
         }
     }
 
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index 6dcc251..9298d9fc 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -84,10 +84,10 @@
  * <dd>Defines the name of this vector drawable.</dd>
  * <dt><code>android:width</code></dt>
  * <dd>Used to define the intrinsic width of the drawable.
- * This support all the dimension units, normally specified with dp.</dd>
+ * This supports all the dimension units, normally specified with dp.</dd>
  * <dt><code>android:height</code></dt>
- * <dd>Used to define the intrinsic height the drawable.
- * This support all the dimension units, normally specified with dp.</dd>
+ * <dd>Used to define the intrinsic height of the drawable.
+ * This supports all the dimension units, normally specified with dp.</dd>
  * <dt><code>android:viewportWidth</code></dt>
  * <dd>Used to define the width of the viewport space. Viewport is basically
  * the virtual canvas where the paths are drawn on.</dd>
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreLoadStoreParameter.java b/keystore/java/android/security/keystore2/AndroidKeyStoreLoadStoreParameter.java
index afb1054..0c6744f 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreLoadStoreParameter.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreLoadStoreParameter.java
@@ -22,11 +22,11 @@
 /**
  * @hide
  */
-class AndroidKeyStoreLoadStoreParameter implements KeyStore.LoadStoreParameter {
+public class AndroidKeyStoreLoadStoreParameter implements KeyStore.LoadStoreParameter {
 
     private final int mNamespace;
 
-    AndroidKeyStoreLoadStoreParameter(int namespace) {
+    public AndroidKeyStoreLoadStoreParameter(int namespace) {
         mNamespace = namespace;
     }
 
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
index aca5314..c42c7b2 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
@@ -250,13 +250,10 @@
             return null;
         }
 
-
-        // TODO add modification time to key metadata.
-        return null;
-        // if (response.metadata.modificationTime == -1) {
-        //     return null;
-        // }
-        // return new Date(response.metadata.modificationTime);
+        if (response.metadata.modificationTimeMs == -1) {
+            return null;
+        }
+        return new Date(response.metadata.modificationTimeMs);
     }
 
     @Override
diff --git a/libs/WindowManager/Shell/res/layout/docked_stack_divider.xml b/libs/WindowManager/Shell/res/layout/docked_stack_divider.xml
index ea21eb9..ed5d2e1 100644
--- a/libs/WindowManager/Shell/res/layout/docked_stack_divider.xml
+++ b/libs/WindowManager/Shell/res/layout/docked_stack_divider.xml
@@ -27,9 +27,9 @@
     <com.android.wm.shell.legacysplitscreen.MinimizedDockShadow
         style="@style/DockedDividerMinimizedShadow"
         android:id="@+id/minimized_dock_shadow"
-        android:alpha="0"/>">
+        android:alpha="0"/>
 
-    <com.android.wm.shell.legacysplitscreen.DividerHandleView
+    <com.android.wm.shell.common.split.DividerHandleView
         style="@style/DockedDividerHandle"
         android:id="@+id/docked_divider_handle"
         android:contentDescription="@string/accessibility_divider"
diff --git a/libs/WindowManager/Shell/res/layout/split_divider.xml b/libs/WindowManager/Shell/res/layout/split_divider.xml
index 341fe61..7f583f3 100644
--- a/libs/WindowManager/Shell/res/layout/split_divider.xml
+++ b/libs/WindowManager/Shell/res/layout/split_divider.xml
@@ -24,4 +24,10 @@
         android:id="@+id/docked_divider_background"
         android:background="@color/docked_divider_background"/>
 
+    <com.android.wm.shell.common.split.DividerHandleView
+        style="@style/DockedDividerHandle"
+        android:id="@+id/docked_divider_handle"
+        android:contentDescription="@string/accessibility_divider"
+        android:background="@null"/>
+
 </com.android.wm.shell.common.split.DividerView>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java
index f741a42..4a8b450 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java
@@ -18,6 +18,7 @@
 
 import android.util.SparseArray;
 import android.view.SurfaceControl;
+import android.window.DisplayAreaAppearedInfo;
 import android.window.DisplayAreaInfo;
 import android.window.DisplayAreaOrganizer;
 
@@ -43,7 +44,10 @@
 
     public RootTaskDisplayAreaOrganizer(Executor executor) {
         super(executor);
-        registerOrganizer(FEATURE_DEFAULT_TASK_CONTAINER);
+        List<DisplayAreaAppearedInfo> infos = registerOrganizer(FEATURE_DEFAULT_TASK_CONTAINER);
+        for (int i = infos.size() - 1; i >= 0; --i) {
+            onDisplayAreaAppeared(infos.get(i).getDisplayAreaInfo(), infos.get(i).getLeash());
+        }
     }
 
     public void registerListener(int displayId, RootTaskDisplayAreaListener listener) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
index 10cec6d..8d15080 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
@@ -261,12 +261,6 @@
         synchronized (mLock) {
             ProtoLog.v(WM_SHELL_TASK_ORG, "Task info changed taskId=%d", taskInfo.taskId);
             final TaskAppearedInfo data = mTasks.get(taskInfo.taskId);
-            if (data == null) {
-                // TODO(b/171749427): It means onTaskInfoChanged send before onTaskAppeared or
-                //  after onTaskVanished, it should be fixed in controller side.
-                return;
-            }
-
             final TaskListener oldListener = getTaskListener(data.getTaskInfo());
             final TaskListener newListener = getTaskListener(taskInfo);
             mTasks.put(taskInfo.taskId, new TaskAppearedInfo(taskInfo, data.getLeash()));
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java
index 7440f19..d588419 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java
@@ -237,7 +237,7 @@
                 // so go ahead and hide the task entirely
                 updateTaskVisibility();
             }
-
+            mTaskOrganizer.setInterceptBackPressedOnTaskRoot(mTaskToken, true);
             // TODO: Synchronize show with the resize
             onLocationChanged();
             setResizeBackgroundColor(taskInfo.taskDescription.getBackgroundColor());
@@ -257,6 +257,7 @@
             if (mListener != null) {
                 mListener.onTaskRemovalStarted(taskInfo.taskId);
             }
+            mTaskOrganizer.setInterceptBackPressedOnTaskRoot(mTaskToken, false);
 
             // Unparent the task when this surface is destroyed
             mTransaction.reparent(mTaskLeash, null).apply();
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 9754f51..563de06 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
@@ -96,7 +96,8 @@
         mTaskInfo2 = task2;
         mSplitLayout = new SplitLayout(
                 mDisplayController.getDisplayContext(mRootTaskInfo.displayId),
-                mRootTaskInfo.configuration, this, b -> b.setParent(mRootTaskLeash));
+                mRootTaskInfo.configuration, this /* layoutChangeListener */,
+                b -> b.setParent(mRootTaskLeash));
 
         final WindowContainerToken token1 = task1.token;
         final WindowContainerToken token2 = task2.token;
@@ -191,22 +192,7 @@
 
             if (mSplitLayout != null
                     && mSplitLayout.updateConfiguration(mRootTaskInfo.configuration)) {
-                // Update bounds when root bounds or its orientation changed.
-                final WindowContainerTransaction wct = new WindowContainerTransaction();
-                final SurfaceControl dividerLeash = mSplitLayout.getDividerLeash();
-                final Rect dividerBounds = mSplitLayout.getDividerBounds();
-                final Rect bounds1 = mSplitLayout.getBounds1();
-                final Rect bounds2 = mSplitLayout.getBounds2();
-
-                wct.setBounds(mTaskInfo1.token, bounds1)
-                        .setBounds(mTaskInfo2.token, bounds2);
-                mController.getTaskOrganizer().applyTransaction(wct);
-                mSyncQueue.runInSync(t -> t
-                        .setPosition(mTaskLeash1, bounds1.left, bounds1.top)
-                        .setPosition(mTaskLeash2, bounds2.left, bounds2.top)
-                        .setPosition(dividerLeash, dividerBounds.left, dividerBounds.top)
-                        // Resets layer to divider bar to make sure it is always on top.
-                        .setLayer(dividerLeash, Integer.MAX_VALUE));
+                onBoundsChanged(mSplitLayout);
             }
         } else if (taskInfo.taskId == getTaskId1()) {
             mTaskInfo1 = taskInfo;
@@ -262,6 +248,10 @@
         final Rect bounds1 = layout.getBounds1();
         final Rect bounds2 = layout.getBounds2();
         mSyncQueue.runInSync(t -> t
+                // Ignores the original surface bounds so that the app could fill up the gap
+                // between each surface with corresponding background while resizing.
+                .setWindowCrop(mTaskLeash1, bounds1.width(), bounds1.height())
+                .setWindowCrop(mTaskLeash2, bounds2.width(), bounds2.height())
                 .setPosition(dividerLeash, dividerBounds.left, dividerBounds.top)
                 .setPosition(mTaskLeash1, bounds1.left, bounds1.top)
                 .setPosition(mTaskLeash2, bounds2.left, bounds2.top));
@@ -279,6 +269,10 @@
                 .setBounds(mTaskInfo2.token, bounds2);
         mController.getTaskOrganizer().applyTransaction(wct);
         mSyncQueue.runInSync(t -> t
+                // Resets layer of divider bar to make sure it is always on top.
+                .setLayer(dividerLeash, Integer.MAX_VALUE)
+                .setWindowCrop(mTaskLeash1, bounds1.width(), bounds1.height())
+                .setWindowCrop(mTaskLeash2, bounds2.width(), bounds2.height())
                 .setPosition(dividerLeash, dividerBounds.left, dividerBounds.top)
                 .setPosition(mTaskLeash1, bounds1.left, bounds1.top)
                 .setPosition(mTaskLeash2, bounds2.left, bounds2.top));
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerHandleView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerHandleView.java
similarity index 91%
rename from libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerHandleView.java
rename to libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerHandleView.java
index 17ca110..218bf47 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerHandleView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerHandleView.java
@@ -14,7 +14,10 @@
  * limitations under the License.
  */
 
-package com.android.wm.shell.legacysplitscreen;
+package com.android.wm.shell.common.split;
+
+import static com.android.wm.shell.common.split.DividerView.TOUCH_ANIMATION_DURATION;
+import static com.android.wm.shell.common.split.DividerView.TOUCH_RELEASE_ANIMATION_DURATION;
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
@@ -84,7 +87,8 @@
         mCircleDiameter = (mWidth + mHeight) / 3;
     }
 
-    void setTouching(boolean touching, boolean animate) {
+    /** Sets touching state for this handle view. */
+    public void setTouching(boolean touching, boolean animate) {
         if (touching == mTouching) {
             return;
         }
@@ -116,8 +120,8 @@
         mAnimator = new AnimatorSet();
         mAnimator.playTogether(widthAnimator, heightAnimator);
         mAnimator.setDuration(touching
-                ? DividerView.TOUCH_ANIMATION_DURATION
-                : DividerView.TOUCH_RELEASE_ANIMATION_DURATION);
+                ? TOUCH_ANIMATION_DURATION
+                : TOUCH_RELEASE_ANIMATION_DURATION);
         mAnimator.setInterpolator(touching
                 ? Interpolators.TOUCH_RESPONSE
                 : Interpolators.FAST_OUT_SLOW_IN);
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 e97fe0a..707747b 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
@@ -33,17 +33,23 @@
 import androidx.annotation.Nullable;
 
 import com.android.internal.policy.DividerSnapAlgorithm;
+import com.android.wm.shell.R;
+import com.android.wm.shell.animation.Interpolators;
 
 /**
  * Stack divider for app pair.
  */
-// TODO(b/172704238): add handle view to indicate touching status.
 public class DividerView extends FrameLayout implements View.OnTouchListener {
+    public static final long TOUCH_ANIMATION_DURATION = 150;
+    public static final long TOUCH_RELEASE_ANIMATION_DURATION = 200;
+
     private final int mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
 
     private SplitLayout mSplitLayout;
     private SurfaceControlViewHost mViewHost;
-    private DragListener mDragListener;
+    private DividerHandleView mHandle;
+    private View mBackground;
+    private int mTouchElevation;
 
     private VelocityTracker mVelocityTracker;
     private boolean mMoving;
@@ -70,16 +76,18 @@
     /** Sets up essential dependencies of the divider bar. */
     public void setup(
             SplitLayout layout,
-            SurfaceControlViewHost viewHost,
-            @Nullable DragListener dragListener) {
+            SurfaceControlViewHost viewHost) {
         mSplitLayout = layout;
         mViewHost = viewHost;
-        mDragListener = dragListener;
     }
 
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
+        mHandle = findViewById(R.id.docked_divider_handle);
+        mBackground = findViewById(R.id.docked_divider_background);
+        mTouchElevation = getResources().getDimensionPixelSize(
+                R.dimen.docked_stack_divider_lift_elevation);
         setOnTouchListener(this);
     }
 
@@ -97,7 +105,7 @@
             case MotionEvent.ACTION_DOWN:
                 mVelocityTracker = VelocityTracker.obtain();
                 mVelocityTracker.addMovement(event);
-                setSlippery(false);
+                setTouching();
                 mStartPos = touchPos;
                 mMoving = false;
                 break;
@@ -106,9 +114,6 @@
                 if (!mMoving && Math.abs(touchPos - mStartPos) > mTouchSlop) {
                     mStartPos = touchPos;
                     mMoving = true;
-                    if (mDragListener != null) {
-                        mDragListener.onDragStart();
-                    }
                 }
                 if (mMoving) {
                     final int position = mSplitLayout.getDividePosition() + touchPos - mStartPos;
@@ -122,11 +127,8 @@
                 final float velocity = isLandscape
                         ? mVelocityTracker.getXVelocity()
                         : mVelocityTracker.getYVelocity();
-                setSlippery(true);
+                releaseTouching();
                 mMoving = false;
-                if (mDragListener != null) {
-                    mDragListener.onDragEnd();
-                }
 
                 final int position = mSplitLayout.getDividePosition() + touchPos - mStartPos;
                 final DividerSnapAlgorithm.SnapTarget snapTarget =
@@ -137,6 +139,45 @@
         return true;
     }
 
+    private void setTouching() {
+        setSlippery(false);
+        mHandle.setTouching(true, true);
+        if (isLandscape()) {
+            mBackground.animate().scaleX(1.4f);
+        } else {
+            mBackground.animate().scaleY(1.4f);
+        }
+        mBackground.animate()
+                .setInterpolator(Interpolators.TOUCH_RESPONSE)
+                .setDuration(TOUCH_ANIMATION_DURATION)
+                .translationZ(mTouchElevation)
+                .start();
+        // Lift handle as well so it doesn't get behind the background, even though it doesn't
+        // cast shadow.
+        mHandle.animate()
+                .setInterpolator(Interpolators.TOUCH_RESPONSE)
+                .setDuration(TOUCH_ANIMATION_DURATION)
+                .translationZ(mTouchElevation)
+                .start();
+    }
+
+    private void releaseTouching() {
+        setSlippery(true);
+        mHandle.setTouching(false, true);
+        mBackground.animate()
+                .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
+                .setDuration(TOUCH_RELEASE_ANIMATION_DURATION)
+                .translationZ(0)
+                .scaleX(1f)
+                .scaleY(1f)
+                .start();
+        mHandle.animate()
+                .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
+                .setDuration(TOUCH_RELEASE_ANIMATION_DURATION)
+                .translationZ(0)
+                .start();
+    }
+
     private void setSlippery(boolean slippery) {
         if (mViewHost == null) {
             return;
@@ -159,13 +200,4 @@
     private boolean isLandscape() {
         return getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE;
     }
-
-    /** Monitors dragging action of the divider bar. */
-    // TODO(b/172704238): add listeners to deal with resizing state of the app windows.
-    public interface DragListener {
-        /** Called when start dragging. */
-        void onDragStart();
-        /** Called when stop dragging. */
-        void onDragEnd();
-    }
 }
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 6b9bf2d..291e9bd 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
@@ -156,12 +156,14 @@
     void updateDivideBounds(int position) {
         updateBounds(position);
         mLayoutChangeListener.onBoundsChanging(this);
+        mSplitWindowManager.setResizingSplits(true);
     }
 
     void setDividePosition(int position) {
         mDividePosition = position;
         updateBounds(mDividePosition);
         mLayoutChangeListener.onBoundsChanged(this);
+        mSplitWindowManager.setResizingSplits(false);
     }
 
     /**
@@ -172,9 +174,11 @@
         switch (snapTarget.flag) {
             case FLAG_DISMISS_START:
                 mLayoutChangeListener.onSnappedToDismiss(false /* snappedToEnd */);
+                mSplitWindowManager.setResizingSplits(false);
                 break;
             case FLAG_DISMISS_END:
                 mLayoutChangeListener.onSnappedToDismiss(true /* snappedToEnd */);
+                mSplitWindowManager.setResizingSplits(false);
                 break;
             default:
                 flingDividePosition(currentPosition, snapTarget.position);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java
index 238caef..29116bd 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java
@@ -25,6 +25,7 @@
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
 
+import android.app.ActivityTaskManager;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.graphics.PixelFormat;
@@ -32,6 +33,8 @@
 import android.graphics.Region;
 import android.os.Binder;
 import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Slog;
 import android.view.IWindow;
 import android.view.LayoutInflater;
 import android.view.SurfaceControl;
@@ -47,11 +50,13 @@
  * Holds view hierarchy of a root surface and helps to inflate {@link DividerView} for a split.
  */
 public final class SplitWindowManager extends WindowlessWindowManager {
+    private static final String TAG = SplitWindowManager.class.getSimpleName();
     private static final String DIVIDER_WINDOW_TITLE = "SplitDivider";
 
+    private final ParentContainerCallbacks mParentContainerCallbacks;
     private Context mContext;
     private SurfaceControlViewHost mViewHost;
-    final private ParentContainerCallbacks mParentContainerCallbacks;
+    private boolean mResizingSplits;
 
     public interface ParentContainerCallbacks {
         void attachToParentSurface(SurfaceControl.Builder b);
@@ -104,7 +109,7 @@
         lp.setTitle(DIVIDER_WINDOW_TITLE);
         lp.privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION | PRIVATE_FLAG_TRUSTED_OVERLAY;
         mViewHost.setView(dividerView, lp);
-        dividerView.setup(splitLayout, mViewHost, null /* dragListener */);
+        dividerView.setup(splitLayout, mViewHost);
     }
 
     /**
@@ -117,6 +122,16 @@
         mViewHost = null;
     }
 
+    void setResizingSplits(boolean resizing) {
+        if (resizing == mResizingSplits) return;
+        try {
+            ActivityTaskManager.getService().setSplitScreenResizing(resizing);
+            mResizingSplits = resizing;
+        } catch (RemoteException e) {
+            Slog.w(TAG, "Error calling setSplitScreenResizing", e);
+        }
+    }
+
     /**
      * Gets {@link SurfaceControl} of the surface holding divider view. @return {@code null} if not
      * feasible.
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 16c966f..c1b6c4f 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
@@ -20,6 +20,9 @@
 import static android.view.PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW;
 import static android.view.WindowManager.DOCKED_RIGHT;
 
+import static com.android.wm.shell.common.split.DividerView.TOUCH_ANIMATION_DURATION;
+import static com.android.wm.shell.common.split.DividerView.TOUCH_RELEASE_ANIMATION_DURATION;
+
 import android.animation.AnimationHandler;
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
@@ -66,6 +69,7 @@
 import com.android.wm.shell.R;
 import com.android.wm.shell.animation.FlingAnimationUtils;
 import com.android.wm.shell.animation.Interpolators;
+import com.android.wm.shell.common.split.DividerHandleView;
 
 import java.util.function.Consumer;
 
@@ -82,9 +86,6 @@
         void onDraggingEnd();
     }
 
-    static final long TOUCH_ANIMATION_DURATION = 150;
-    static final long TOUCH_RELEASE_ANIMATION_DURATION = 200;
-
     public static final int INVALID_RECENTS_GROW_TARGET = -1;
 
     private static final int LOG_VALUE_RESIZE_50_50 = 0;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java
index de3bb29..f8b4dd9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java
@@ -41,12 +41,12 @@
     }
 
     public void setTaskInfo(TaskInfo taskInfo) {
-        if (taskInfo == null) {
-            mPackageName = null;
-            mPackageUid = INVALID_PACKAGE_UID;
-        } else {
+        if (taskInfo != null && taskInfo.topActivity != null) {
             mPackageName = taskInfo.topActivity.getPackageName();
             mPackageUid = getUid(mPackageName, taskInfo.userId);
+        } else {
+            mPackageName = null;
+            mPackageUid = INVALID_PACKAGE_UID;
         }
     }
 
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/PipAppHelper.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/PipAppHelper.kt
index ed5f8a4..bc74daf 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/PipAppHelper.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/PipAppHelper.kt
@@ -20,20 +20,17 @@
 import android.media.session.MediaController
 import android.media.session.MediaSessionManager
 import android.os.SystemClock
-import android.view.KeyEvent.KEYCODE_WINDOW
 import androidx.test.uiautomator.By
-import androidx.test.uiautomator.Until
+import androidx.test.uiautomator.BySelector
 import com.android.server.wm.flicker.helpers.closePipWindow
 import com.android.server.wm.flicker.helpers.hasPipWindow
-import com.android.wm.shell.flicker.SYSTEM_UI_PACKAGE_NAME
 import com.android.wm.shell.flicker.TEST_APP_PIP_ACTIVITY_LABEL
+import com.android.wm.shell.flicker.pip.tv.closeTvPipWindow
+import com.android.wm.shell.flicker.pip.tv.isFocusedOrHasFocusedChild
 import com.android.wm.shell.flicker.testapp.Components
-import org.junit.Assert.assertNotNull
 import org.junit.Assert.fail
 
-class PipAppHelper(
-    instrumentation: Instrumentation
-) : BaseAppHelper(
+class PipAppHelper(instrumentation: Instrumentation) : BaseAppHelper(
         instrumentation,
         TEST_APP_PIP_ACTIVITY_LABEL,
         Components.PipActivity()
@@ -47,12 +44,34 @@
             it.packageName == packageName
         }
 
-    fun clickButton(resourceId: String) =
-            uiDevice.findObject(By.res(packageName, resourceId))?.click()
-                ?: fail("$resourceId button is not found")
+    fun clickObject(resId: String) {
+        val selector = By.res(packageName, resId)
+        val obj = uiDevice.findObject(selector) ?: error("Could not find `$resId` object")
+
+        if (!isTelevision) {
+            obj.click()
+        } else {
+            focusOnObject(selector) || error("Could not focus on `$resId` object")
+            uiDevice.pressDPadCenter()
+        }
+    }
+
+    private fun focusOnObject(selector: BySelector): Boolean {
+        // We expect all the focusable UI elements to be arranged in a way so that it is possible
+        // to "cycle" over all them by clicking the D-Pad DOWN button, going back up to "the top"
+        // from "the bottom".
+        repeat(FOCUS_ATTEMPTS) {
+            uiDevice.findObject(selector)?.apply { if (isFocusedOrHasFocusedChild) return true }
+                    ?: error("The object we try to focus on is gone.")
+
+            uiDevice.pressDPadDown()
+            uiDevice.waitForIdle()
+        }
+        return false
+    }
 
     fun clickEnterPipButton() {
-        clickButton("enter_pip")
+        clickObject(ENTER_PIP_BUTTON_ID)
 
         // TODO(b/172321238): remove this check once hasPipWindow is fixed on TVs
         if (!isTelevision) {
@@ -64,17 +83,14 @@
     }
 
     fun clickStartMediaSessionButton() {
-        val startButton = uiDevice.findObject(By.res(packageName, "media_session_start"))
-        assertNotNull("Start button not found, this usually happens when the device " +
-                "was left in an unknown state (e.g. in split screen)", startButton)
-        startButton.click()
+        clickObject(MEDIA_SESSION_START_RADIO_BUTTON_ID)
     }
 
     fun checkWithCustomActionsCheckbox() = uiDevice
-            .findObject(By.res(packageName, "with_custom_actions"))
-            ?.takeIf { it.isCheckable }
-            ?.apply { if (!isChecked) click() }
-            ?: error("'With custom actions' checkbox not found")
+            .findObject(By.res(packageName, WITH_CUSTOM_ACTIONS_BUTTON_ID))
+                ?.takeIf { it.isCheckable }
+                ?.apply { if (!isChecked) clickObject(WITH_CUSTOM_ACTIONS_BUTTON_ID) }
+                ?: error("'With custom actions' checkbox not found")
 
     fun pauseMedia() = mediaController?.transportControls?.pause()
             ?: error("No active media session found")
@@ -83,21 +99,21 @@
             ?: error("No active media session found")
 
     fun closePipWindow() {
-        // TODO(b/172321238): remove this check once and simply call closePipWindow once the TV
-        //  logic is integrated there.
-        if (!isTelevision) {
-            uiDevice.closePipWindow()
+        if (isTelevision) {
+            uiDevice.closeTvPipWindow()
         } else {
-            // Bring up Pip menu
-            uiDevice.pressKeyCode(KEYCODE_WINDOW)
-
-            // Wait for the menu to come up and render the close button
-            val closeButton = uiDevice.wait(
-                    Until.findObject(By.res(SYSTEM_UI_PACKAGE_NAME, "close_button")), 3_000)
-            assertNotNull("Pip menu close button is not found", closeButton)
-            closeButton.click()
-
-            waitUntilClosed()
+            uiDevice.closePipWindow()
         }
+
+        if (!waitUntilClosed()) {
+            fail("Couldn't close Pip")
+        }
+    }
+
+    companion object {
+        private const val FOCUS_ATTEMPTS = 20
+        private const val ENTER_PIP_BUTTON_ID = "enter_pip"
+        private const val WITH_CUSTOM_ACTIONS_BUTTON_ID = "with_custom_actions"
+        private const val MEDIA_SESSION_START_RADIO_BUTTON_ID = "media_session_start"
     }
 }
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipBasicTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipBasicTest.kt
index 70425a3..49094e6 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipBasicTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipBasicTest.kt
@@ -42,7 +42,7 @@
         testApp.launchViaIntent()
 
         // Set up ratio and enter Pip
-        testApp.clickButton(radioButtonId)
+        testApp.clickObject(radioButtonId)
         testApp.clickEnterPipButton()
 
         val actualRatio: Float = testApp.ui?.visibleBounds?.ratio
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt
index 4cb6447..66efb5a 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt
@@ -59,17 +59,24 @@
 
     @Test
     fun pipMenu_correctPosition() {
-        val pipMenu = enterPip_openMenu_assertShown()
-
-        // Make sure it's fullscreen
-        assertTrue("Pip menu should be shown fullscreen", pipMenu.isFullscreen(uiDevice))
+        enterPip_openMenu_assertShown()
 
         // Make sure the PiP task is positioned where it should be.
         val activityBounds: Rect = testApp.ui?.visibleBounds
-                ?: error("Could not retrieve PiP Activity bounds")
+                ?: error("Could not retrieve Pip Activity bounds")
         assertTrue("Pip Activity is positioned correctly while Pip menu is shown",
                 pipBoundsWhileInMenu == activityBounds)
 
+        // Make sure the Pip Menu Actions are positioned correctly.
+        uiDevice.findTvPipMenuControls()?.visibleBounds?.run {
+            assertTrue("Pip Menu Actions should be positioned below the Activity in Pip",
+                top >= activityBounds.bottom)
+            assertTrue("Pip Menu Actions should be positioned central horizontally",
+                centerX() == uiDevice.displayWidth / 2)
+            assertTrue("Pip Menu Actions should be fully shown on the screen",
+                left >= 0 && right <= uiDevice.displayWidth && bottom <= uiDevice.displayHeight)
+        } ?: error("Could not retrieve Pip Menu Actions bounds")
+
         testApp.closePipWindow()
     }
 
@@ -100,11 +107,11 @@
         enterPip_openMenu_assertShown()
 
         // PiP menu should contain the Close button
-        val closeButton = uiDevice.findTvPipMenuCloseButton()
+        uiDevice.findTvPipMenuCloseButton()
                 ?: fail("\"Close PIP\" button should be shown in Pip menu")
 
         // Clicking on the Close button should close the app
-        closeButton.click()
+        uiDevice.clickTvPipMenuCloseButton()
         assertTrue("\"Close PIP\" button should close the PiP", testApp.waitUntilClosed())
     }
 
@@ -113,12 +120,12 @@
         enterPip_openMenu_assertShown()
 
         // PiP menu should contain the Fullscreen button
-        val fullscreenButton = uiDevice.findTvPipMenuFullscreenButton()
+        uiDevice.findTvPipMenuFullscreenButton()
                 ?: fail("\"Full screen\" button should be shown in Pip menu")
 
         // Clicking on the fullscreen button should return app to the fullscreen mode.
         // Click, wait for the app to go fullscreen
-        fullscreenButton.click()
+        uiDevice.clickTvPipMenuFullscreenButton()
         assertTrue("\"Full screen\" button should open the app fullscreen",
                 wait { testApp.ui?.isFullscreen(uiDevice) ?: false })
 
@@ -136,12 +143,12 @@
         assertFullscreenAndCloseButtonsAreShown()
 
         // PiP menu should contain the Pause button
-        val pauseButton = uiDevice.findTvPipMenuElementWithDescription(pauseButtonDescription)
+        uiDevice.findTvPipMenuElementWithDescription(pauseButtonDescription)
                 ?: fail("\"Pause\" button should be shown in Pip menu if there is an active " +
                         "playing media session.")
 
         // When we pause media, the button should change from Pause to Play
-        pauseButton.click()
+        uiDevice.clickTvPipMenuElementWithDescription(pauseButtonDescription)
 
         assertFullscreenAndCloseButtonsAreShown()
         // PiP menu should contain the Play button now
@@ -161,27 +168,26 @@
         // PiP menu should contain "No-Op", "Off" and "Clear" buttons...
         uiDevice.findTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_NO_OP)
                 ?: fail("\"No-Op\" button should be shown in Pip menu")
-        val offButton = uiDevice.findTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_OFF)
+        uiDevice.findTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_OFF)
                 ?: fail("\"Off\" button should be shown in Pip menu")
         uiDevice.findTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_CLEAR)
                 ?: fail("\"Clear\" button should be shown in Pip menu")
         // ... and should also contain the "Full screen" and "Close" buttons.
         assertFullscreenAndCloseButtonsAreShown()
 
-        offButton.click()
+        uiDevice.clickTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_OFF)
         // Invoking the "Off" action should replace it with the "On" action/button and should
         // remove the "No-Op" action/button. "Clear" action/button should remain in the menu ...
         uiDevice.waitForTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_ON)
                 ?: fail("\"On\" button should be shown in Pip for a corresponding custom action")
         assertNull("\"No-Op\" button should not be shown in Pip menu",
                 uiDevice.findTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_NO_OP))
-        val clearButton =
-                uiDevice.findTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_CLEAR)
+        uiDevice.findTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_CLEAR)
                         ?: fail("\"Clear\" button should be shown in Pip menu")
         // ... as well as the "Full screen" and "Close" buttons.
         assertFullscreenAndCloseButtonsAreShown()
 
-        clearButton.click()
+        uiDevice.clickTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_CLEAR)
         // Invoking the "Clear" action should remove all the custom actions and their corresponding
         // buttons, ...
         uiDevice.waitUntilTvPipMenuElementWithDescriptionIsGone(TEST_APP_PIP_MENU_ACTION_ON)?.also {
@@ -211,9 +217,8 @@
                 ?: fail("\"No-Op\" button should be shown in Pip menu")
         uiDevice.findTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_OFF)
                 ?: fail("\"Off\" button should be shown in Pip menu")
-        val clearButton =
-                uiDevice.findTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_CLEAR)
-                        ?: fail("\"Clear\" button should be shown in Pip menu")
+        uiDevice.findTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_CLEAR)
+                ?: fail("\"Clear\" button should be shown in Pip menu")
         // ... should also contain the "Full screen" and "Close" buttons, ...
         assertFullscreenAndCloseButtonsAreShown()
         // ... but should not contain media buttons.
@@ -222,7 +227,7 @@
         assertNull("\"Pause\" button should not be shown in menu when there are custom actions",
                 uiDevice.findTvPipMenuElementWithDescription(pauseButtonDescription))
 
-        clearButton.click()
+        uiDevice.clickTvPipMenuElementWithDescription(TEST_APP_PIP_MENU_ACTION_CLEAR)
         // Invoking the "Clear" action should remove all the custom actions, which should bring up
         // media buttons...
         uiDevice.waitForTvPipMenuElementWithDescription(pauseButtonDescription)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvUtils.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvUtils.kt
index 0732794..587b551 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvUtils.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvUtils.kt
@@ -18,6 +18,7 @@
 
 import android.view.KeyEvent
 import androidx.test.uiautomator.By
+import androidx.test.uiautomator.BySelector
 import androidx.test.uiautomator.UiDevice
 import androidx.test.uiautomator.UiObject2
 import androidx.test.uiautomator.Until
@@ -25,11 +26,18 @@
 
 /** Id of the root view in the com.android.wm.shell.pip.tv.PipMenuActivity */
 private const val TV_PIP_MENU_ROOT_ID = "tv_pip_menu"
+private const val TV_PIP_MENU_CONTROLS_ID = "pip_controls"
 private const val TV_PIP_MENU_CLOSE_BUTTON_ID = "close_button"
 private const val TV_PIP_MENU_FULLSCREEN_BUTTON_ID = "full_button"
 
+private const val FOCUS_ATTEMPTS = 10
 private const val WAIT_TIME_MS = 3_000L
 
+private val TV_PIP_MENU_CLOSE_BUTTON_SELECTOR =
+        By.res(SYSTEM_UI_PACKAGE_NAME, TV_PIP_MENU_CLOSE_BUTTON_ID)
+private val TV_PIP_MENU_FULLSCREEN_BUTTON_SELECTOR =
+        By.res(SYSTEM_UI_PACKAGE_NAME, TV_PIP_MENU_FULLSCREEN_BUTTON_ID)
+
 private val tvPipMenuSelector = By.res(SYSTEM_UI_PACKAGE_NAME, TV_PIP_MENU_ROOT_ID)
 
 fun UiDevice.pressWindowKey() = pressKeyCode(KeyEvent.KEYCODE_WINDOW)
@@ -39,16 +47,35 @@
 
 fun UiDevice.waitForTvPipMenuToClose(): Boolean = wait(Until.gone(tvPipMenuSelector), WAIT_TIME_MS)
 
-fun UiDevice.findTvPipMenuCloseButton(): UiObject2? = findObject(
-        By.res(SYSTEM_UI_PACKAGE_NAME, TV_PIP_MENU_CLOSE_BUTTON_ID))
+fun UiDevice.findTvPipMenuControls(): UiObject2? =
+        findObject(tvPipMenuSelector)
+                ?.findObject(By.res(SYSTEM_UI_PACKAGE_NAME, TV_PIP_MENU_CONTROLS_ID))
 
-fun UiDevice.findTvPipMenuFullscreenButton(): UiObject2? = findObject(
-        By.res(SYSTEM_UI_PACKAGE_NAME, TV_PIP_MENU_FULLSCREEN_BUTTON_ID))
+fun UiDevice.findTvPipMenuCloseButton(): UiObject2? =
+        findObject(tvPipMenuSelector)?.findObject(TV_PIP_MENU_CLOSE_BUTTON_SELECTOR)
 
-fun UiDevice.findTvPipMenuElementWithDescription(desc: String): UiObject2? {
-    val buttonSelector = By.desc(desc)
-    val menuWithButtonSelector = By.copy(tvPipMenuSelector).hasDescendant(buttonSelector)
-    return findObject(menuWithButtonSelector)?.findObject(buttonSelector)
+fun UiDevice.clickTvPipMenuCloseButton() {
+    focusOnObjectInTvPipMenu(TV_PIP_MENU_CLOSE_BUTTON_SELECTOR) ||
+            error("Could not focus on the Close button")
+    pressDPadCenter()
+}
+
+fun UiDevice.findTvPipMenuFullscreenButton(): UiObject2? =
+        findObject(tvPipMenuSelector)?.findObject(TV_PIP_MENU_FULLSCREEN_BUTTON_SELECTOR)
+
+fun UiDevice.clickTvPipMenuFullscreenButton() {
+    focusOnObjectInTvPipMenu(TV_PIP_MENU_FULLSCREEN_BUTTON_SELECTOR) ||
+            error("Could not focus on the Fullscreen button")
+    pressDPadCenter()
+}
+
+fun UiDevice.findTvPipMenuElementWithDescription(desc: String): UiObject2? =
+        findObject(tvPipMenuSelector)?.findObject(By.desc(desc).pkg(SYSTEM_UI_PACKAGE_NAME))
+
+fun UiDevice.clickTvPipMenuElementWithDescription(desc: String) {
+    focusOnObjectInTvPipMenu(By.desc(desc).pkg(SYSTEM_UI_PACKAGE_NAME)) ||
+            error("Could not focus on the Pip menu object with \"$desc\" description")
+    pressDPadCenter()
 }
 
 fun UiDevice.waitForTvPipMenuElementWithDescription(desc: String): UiObject2? {
@@ -63,4 +90,33 @@
 
 fun UiObject2.isFullscreen(uiDevice: UiDevice): Boolean = visibleBounds.run {
     height() == uiDevice.displayHeight && width() == uiDevice.displayWidth
+}
+
+val UiObject2.isFocusedOrHasFocusedChild: Boolean
+    get() = isFocused || findObject(By.focused(true)) != null
+
+fun UiDevice.closeTvPipWindow() {
+    // Check if Pip menu is Open. If it's not, open it.
+    if (findObject(tvPipMenuSelector) == null) {
+        pressWindowKey()
+        waitForTvPipMenu() ?: error("Could not open Pip menu")
+    }
+
+    clickTvPipMenuCloseButton()
+    waitForTvPipMenuToClose()
+}
+
+private fun UiDevice.focusOnObjectInTvPipMenu(objectSelector: BySelector): Boolean {
+    repeat(FOCUS_ATTEMPTS) {
+        val menu = findObject(tvPipMenuSelector) ?: error("Pip Menu is now shown")
+        val objectToFocus = menu.findObject(objectSelector)
+                .apply { if (isFocusedOrHasFocusedChild) return true }
+                ?: error("The object we try to focus on is gone.")
+        val currentlyFocused = menu.findObject(By.focused(true))
+                ?: error("Pip menu does not contain a focused element")
+        if (objectToFocus.visibleCenter.x < currentlyFocused.visibleCenter.x)
+            pressDPadLeft() else pressDPadRight()
+        waitForIdle()
+    }
+    return false
 }
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/res/layout/activity_pip.xml b/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/res/layout/activity_pip.xml
index e5d2f82..909b77c 100644
--- a/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/res/layout/activity_pip.xml
+++ b/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/res/layout/activity_pip.xml
@@ -21,6 +21,12 @@
     android:orientation="vertical"
     android:background="@android:color/holo_blue_bright">
 
+    <!-- All the buttons (and other clickable elements) should be arranged in a way so that it is
+         possible to "cycle" over all them by clicking on the D-Pad DOWN button. The way we do it
+         here is by arranging them this vertical LL and by relying on the nextFocusDown attribute
+         where things are arranged differently and to circle back up to the top once we reach the
+         bottom. -->
+
     <Button
         android:id="@+id/enter_pip"
         android:layout_width="wrap_content"
@@ -87,12 +93,14 @@
             android:id="@+id/media_session_start"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:nextFocusDown="@id/media_session_stop"
             android:text="Start"/>
 
         <Button
             android:id="@+id/media_session_stop"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:nextFocusDown="@id/enter_pip"
             android:text="Stop"/>
 
     </LinearLayout>
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TaskViewTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TaskViewTest.java
index 11bf4ff..01b5204 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TaskViewTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TaskViewTest.java
@@ -215,4 +215,19 @@
 
         verify(mViewListener).onBackPressedOnTaskRoot(eq(mTaskInfo.taskId));
     }
+
+    @Test
+    public void testSetOnBackPressedOnTaskRoot() {
+        mTaskView.onTaskAppeared(mTaskInfo, mLeash);
+        verify(mOrganizer).setInterceptBackPressedOnTaskRoot(eq(mTaskInfo.token), eq(true));
+    }
+
+    @Test
+    public void testUnsetOnBackPressedOnTaskRoot() {
+        mTaskView.onTaskAppeared(mTaskInfo, mLeash);
+        verify(mOrganizer).setInterceptBackPressedOnTaskRoot(eq(mTaskInfo.token), eq(true));
+
+        mTaskView.onTaskVanished(mTaskInfo);
+        verify(mOrganizer).setInterceptBackPressedOnTaskRoot(eq(mTaskInfo.token), eq(false));
+    }
 }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java
index 708a6c5..cd46816 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java
@@ -75,15 +75,16 @@
     }
 
     @Test
-    @UiThreadTest
-    public void testSnapToTarget() {
-        DividerSnapAlgorithm.SnapTarget snapTarget = getSnapTarget(0 /* position */,
-                DividerSnapAlgorithm.SnapTarget.FLAG_NONE);
-        mSplitLayout.snapToTarget(0 /* currentPosition */, snapTarget);
-        verify(mLayoutChangeListener).onBoundsChanging(any(SplitLayout.class));
+    public void testSetDividePosition() {
+        mSplitLayout.setDividePosition(anyInt());
+        verify(mLayoutChangeListener).onBoundsChanged(any(SplitLayout.class));
+    }
 
+    @Test
+    @UiThreadTest
+    public void testSnapToDismissTarget() {
         // verify it callbacks properly when the snap target indicates dismissing split.
-        snapTarget = getSnapTarget(0 /* position */,
+        DividerSnapAlgorithm.SnapTarget snapTarget = getSnapTarget(0 /* position */,
                 DividerSnapAlgorithm.SnapTarget.FLAG_DISMISS_START);
         mSplitLayout.snapToTarget(0 /* currentPosition */, snapTarget);
         verify(mLayoutChangeListener).onSnappedToDismiss(eq(false));
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index 0533aa6..9d82f63 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -618,6 +618,7 @@
         "tests/unit/LayerUpdateQueueTests.cpp",
         "tests/unit/LinearAllocatorTests.cpp",
         "tests/unit/MatrixTests.cpp",
+        "tests/unit/OpBufferTests.cpp",
         "tests/unit/PathInterpolatorTests.cpp",
         "tests/unit/RenderNodeDrawableTests.cpp",
         "tests/unit/RenderNodeTests.cpp",
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 9a4ed81..acb74f4 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -669,7 +669,10 @@
     if (paint) {
         pnt = *paint;
     }
-    pnt.setShader(bitmap.makeImage()->makeShader());
+    SkSamplingOptions sampling(pnt.isFilterBitmap() ? SkFilterMode::kLinear
+                                                    : SkFilterMode::kNearest,
+                               SkMipmapMode::kNone);
+    pnt.setShader(bitmap.makeImage()->makeShader(sampling));
     auto v = builder.detach();
     apply_looper(&pnt, [&](const SkPaint& p) {
         mCanvas->drawVertices(v, SkBlendMode::kModulate, p);
diff --git a/libs/hwui/canvas/OpBuffer.h b/libs/hwui/canvas/OpBuffer.h
index 6dc29d9..1237d69 100644
--- a/libs/hwui/canvas/OpBuffer.h
+++ b/libs/hwui/canvas/OpBuffer.h
@@ -144,7 +144,86 @@
 
     ItemHeader* last() const { return isEmpty() ? nullptr : itemAt(mBuffer->endOffset); }
 
+    class sentinal {
+    public:
+        explicit sentinal(const uint8_t* end) : end(end) {}
+    private:
+        const uint8_t* const end;
+    };
+
+    sentinal end() const {
+        return sentinal{end_ptr()};
+    }
+
+    template <ItemTypes T>
+    class filtered_iterator {
+    public:
+        explicit filtered_iterator(uint8_t* start, const uint8_t* end)
+                : mCurrent(start), mEnd(end) {
+            ItemHeader* header = reinterpret_cast<ItemHeader*>(mCurrent);
+            if (header->type != T) {
+                advance();
+            }
+        }
+
+        filtered_iterator& operator++() {
+            advance();
+            return *this;
+        }
+
+        // Although this iterator self-terminates, we need a placeholder to compare against
+        // to make for-each loops happy
+        bool operator!=(const sentinal& other) const {
+            return mCurrent != mEnd;
+        }
+
+        ItemContainer<T>& operator*() {
+            return *reinterpret_cast<ItemContainer<T>*>(mCurrent);
+        }
+    private:
+        void advance() {
+            ItemHeader* header = reinterpret_cast<ItemHeader*>(mCurrent);
+            do {
+                mCurrent += header->size;
+                header = reinterpret_cast<ItemHeader*>(mCurrent);
+            } while (mCurrent != mEnd && header->type != T);
+        }
+        uint8_t* mCurrent;
+        const uint8_t* const mEnd;
+    };
+
+    template <ItemTypes T>
+    class filtered_view {
+    public:
+        explicit filtered_view(uint8_t* start, const uint8_t* end) : mStart(start), mEnd(end) {}
+
+        filtered_iterator<T> begin() const {
+            return filtered_iterator<T>{mStart, mEnd};
+        }
+
+        sentinal end() const {
+            return sentinal{mEnd};
+        }
+    private:
+        uint8_t* mStart;
+        const uint8_t* const mEnd;
+    };
+
+    template <ItemTypes T>
+    filtered_view<T> filter() const {
+        return filtered_view<T>{start_ptr(), end_ptr()};
+    }
+
 private:
+
+    uint8_t* start_ptr() const {
+        return reinterpret_cast<uint8_t*>(mBuffer) + mBuffer->startOffset;
+    }
+
+    const uint8_t* end_ptr() const {
+        return reinterpret_cast<uint8_t*>(mBuffer) + mBuffer->used;
+    }
+
     template <typename F, std::size_t... I>
     void for_each(F&& f, std::index_sequence<I...>) const {
         // Validate we're not empty
@@ -159,8 +238,8 @@
         }...};
 
         // Do the actual iteration of each item
-        uint8_t* current = reinterpret_cast<uint8_t*>(mBuffer) + mBuffer->startOffset;
-        uint8_t* end = reinterpret_cast<uint8_t*>(mBuffer) + mBuffer->used;
+        uint8_t* current = start_ptr();
+        const uint8_t* end = end_ptr();
         while (current != end) {
             auto header = reinterpret_cast<ItemHeader*>(current);
             // `f` could be a destructor, so ensure all accesses to the OP happen prior to invoking
diff --git a/libs/hwui/hwui/Paint.h b/libs/hwui/hwui/Paint.h
index e75e9e7..05bae5c 100644
--- a/libs/hwui/hwui/Paint.h
+++ b/libs/hwui/hwui/Paint.h
@@ -137,6 +137,9 @@
     bool isDevKern() const { return mDevKern; }
     void setDevKern(bool d) { mDevKern = d; }
 
+    // Deprecated -- bitmapshaders will be taking this flag explicitly
+    bool isFilterBitmap() const { return this->getFilterQuality() != kNone_SkFilterQuality; }
+
     // The Java flags (Paint.java) no longer fit into the native apis directly.
     // These methods handle converting to and from them and the native representations
     // in android::Paint.
@@ -149,7 +152,7 @@
     // The only respected flags are : [ antialias, dither, filterBitmap ]
     static uint32_t GetSkPaintJavaFlags(const SkPaint&);
     static void SetSkPaintJavaFlags(SkPaint*, uint32_t flags);
- 
+
 private:
     SkFont mFont;
     sk_sp<SkDrawLooper> mLooper;
diff --git a/libs/hwui/jni/Shader.cpp b/libs/hwui/jni/Shader.cpp
index 45795ff..aaec60b 100644
--- a/libs/hwui/jni/Shader.cpp
+++ b/libs/hwui/jni/Shader.cpp
@@ -61,7 +61,7 @@
 ///////////////////////////////////////////////////////////////////////////////////////////////
 
 static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jlong matrixPtr, jlong bitmapHandle,
-        jint tileModeX, jint tileModeY) {
+        jint tileModeX, jint tileModeY, bool filter) {
     const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
     sk_sp<SkImage> image;
     if (bitmapHandle) {
@@ -74,8 +74,10 @@
         SkBitmap bitmap;
         image = SkMakeImageFromRasterBitmap(bitmap, kNever_SkCopyPixelsMode);
     }
+    SkSamplingOptions sampling(filter ? SkFilterMode::kLinear : SkFilterMode::kNearest,
+                               SkMipmapMode::kNone);
     sk_sp<SkShader> shader = image->makeShader(
-            (SkTileMode)tileModeX, (SkTileMode)tileModeY);
+            (SkTileMode)tileModeX, (SkTileMode)tileModeY, sampling);
     ThrowIAE_IfNull(env, shader.get());
 
     if (matrix) {
@@ -291,7 +293,7 @@
 };
 
 static const JNINativeMethod gBitmapShaderMethods[] = {
-    { "nativeCreate",      "(JJII)J",  (void*)BitmapShader_constructor },
+    { "nativeCreate",      "(JJIIZ)J",  (void*)BitmapShader_constructor },
 };
 
 static const JNINativeMethod gLinearGradientMethods[] = {
diff --git a/libs/hwui/tests/common/scenes/BitmapShaders.cpp b/libs/hwui/tests/common/scenes/BitmapShaders.cpp
index c4067af..03aeb55 100644
--- a/libs/hwui/tests/common/scenes/BitmapShaders.cpp
+++ b/libs/hwui/tests/common/scenes/BitmapShaders.cpp
@@ -44,15 +44,16 @@
                     skCanvas.drawRect(SkRect::MakeXYWH(100, 100, 100, 100), skPaint);
                 });
 
+        SkSamplingOptions sampling;
         Paint paint;
         sk_sp<SkImage> image = hwuiBitmap->makeImage();
         sk_sp<SkShader> repeatShader =
-                image->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat);
+                image->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat, sampling);
         paint.setShader(std::move(repeatShader));
         canvas.drawRoundRect(0, 0, 500, 500, 50.0f, 50.0f, paint);
 
         sk_sp<SkShader> mirrorShader =
-                image->makeShader(SkTileMode::kMirror, SkTileMode::kMirror);
+                image->makeShader(SkTileMode::kMirror, SkTileMode::kMirror, sampling);
         paint.setShader(std::move(mirrorShader));
         canvas.drawRoundRect(0, 600, 500, 1100, 50.0f, 50.0f, paint);
     }
diff --git a/libs/hwui/tests/common/scenes/HwBitmapInCompositeShader.cpp b/libs/hwui/tests/common/scenes/HwBitmapInCompositeShader.cpp
index 5886ea3..564354f 100644
--- a/libs/hwui/tests/common/scenes/HwBitmapInCompositeShader.cpp
+++ b/libs/hwui/tests/common/scenes/HwBitmapInCompositeShader.cpp
@@ -74,6 +74,6 @@
 
     sk_sp<SkShader> createBitmapShader(Bitmap& bitmap) {
         sk_sp<SkImage> image = bitmap.makeImage();
-        return image->makeShader();
+        return image->makeShader(SkSamplingOptions());
     }
 };
diff --git a/libs/hwui/tests/unit/CanvasOpTests.cpp b/libs/hwui/tests/unit/CanvasOpTests.cpp
index 033a587..a09e742 100644
--- a/libs/hwui/tests/unit/CanvasOpTests.cpp
+++ b/libs/hwui/tests/unit/CanvasOpTests.cpp
@@ -36,50 +36,6 @@
 // We lazy
 using Op = CanvasOpType;
 
-enum MockTypes {
-    Lifecycle,
-    COUNT
-};
-
-template<MockTypes T>
-struct MockOp;
-
-template<MockTypes T>
-struct MockOpContainer {
-    OpBufferItemHeader<MockTypes> header;
-    MockOp<T> impl;
-};
-
-struct LifecycleTracker {
-    int ctor_count = 0;
-    int dtor_count = 0;
-
-    int alive() { return ctor_count - dtor_count; }
-};
-
-template<>
-struct MockOp<MockTypes::Lifecycle> {
-    MockOp() = delete;
-    void operator=(const MockOp&) = delete;
-
-    MockOp(LifecycleTracker* tracker) : tracker(tracker) {
-        tracker->ctor_count += 1;
-    }
-
-    MockOp(const MockOp& other) {
-        tracker = other.tracker;
-        tracker->ctor_count += 1;
-    }
-
-    ~MockOp() {
-        tracker->dtor_count += 1;
-    }
-
-    LifecycleTracker* tracker = nullptr;
-};
-
-using MockBuffer = OpBuffer<MockTypes, MockOpContainer>;
-
 class CanvasOpCountingReceiver {
 public:
     template <CanvasOpType T>
@@ -104,62 +60,6 @@
     return count;
 }
 
-TEST(CanvasOp, lifecycleCheck) {
-    LifecycleTracker tracker;
-    {
-        MockBuffer buffer;
-        buffer.push_container(MockOpContainer<MockTypes::Lifecycle> {
-            .impl = MockOp<MockTypes::Lifecycle>{&tracker}
-        });
-        EXPECT_EQ(tracker.alive(), 1);
-        buffer.clear();
-        EXPECT_EQ(tracker.alive(), 0);
-    }
-    EXPECT_EQ(tracker.alive(), 0);
-}
-
-TEST(CanvasOp, lifecycleCheckMove) {
-    LifecycleTracker tracker;
-    {
-        MockBuffer buffer;
-        buffer.push_container(MockOpContainer<MockTypes::Lifecycle> {
-            .impl = MockOp<MockTypes::Lifecycle>{&tracker}
-        });
-        EXPECT_EQ(tracker.alive(), 1);
-        {
-            MockBuffer other(std::move(buffer));
-            EXPECT_EQ(tracker.alive(), 1);
-            EXPECT_EQ(buffer.size(), 0);
-            EXPECT_GT(other.size(), 0);
-            EXPECT_EQ(1, countItems(other));
-            EXPECT_EQ(0, countItems(buffer));
-
-            other.push_container(MockOpContainer<MockTypes::Lifecycle> {
-                .impl = MockOp<MockTypes::Lifecycle>{&tracker}
-            });
-
-            EXPECT_EQ(2, countItems(other));
-            EXPECT_EQ(2, tracker.alive());
-
-            buffer.push_container(MockOpContainer<MockTypes::Lifecycle> {
-                .impl = MockOp<MockTypes::Lifecycle>{&tracker}
-            });
-            EXPECT_EQ(1, countItems(buffer));
-            EXPECT_EQ(3, tracker.alive());
-
-            buffer = std::move(other);
-            EXPECT_EQ(2, countItems(buffer));
-            EXPECT_EQ(2, tracker.alive());
-        }
-        EXPECT_EQ(2, countItems(buffer));
-        EXPECT_EQ(2, tracker.alive());
-        buffer.clear();
-        EXPECT_EQ(0, countItems(buffer));
-        EXPECT_EQ(0, tracker.alive());
-    }
-    EXPECT_EQ(tracker.alive(), 0);
-}
-
 TEST(CanvasOp, verifyConst) {
     CanvasOpBuffer buffer;
     buffer.push<Op::DrawColor>({
@@ -708,7 +608,3 @@
     EXPECT_EQ(1, receiver[Op::Save]);
     EXPECT_EQ(1, receiver[Op::Restore]);
 }
-
-TEST(CanvasOp, frontendTransform) {
-
-}
\ No newline at end of file
diff --git a/libs/hwui/tests/unit/OpBufferTests.cpp b/libs/hwui/tests/unit/OpBufferTests.cpp
new file mode 100644
index 0000000..c0ae943
--- /dev/null
+++ b/libs/hwui/tests/unit/OpBufferTests.cpp
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 <gtest/gtest.h>
+
+#include <canvas/OpBuffer.h>
+
+using namespace android;
+using namespace android::uirenderer;
+
+enum MockTypes {
+    Lifecycle,
+    NoOp,
+    IntHolder,
+    COUNT
+};
+
+using Op = MockTypes;
+
+template<MockTypes T>
+struct MockOp;
+
+template<MockTypes T>
+struct MockOpContainer {
+    OpBufferItemHeader<MockTypes> header;
+    MockOp<T> impl;
+
+    MockOpContainer(MockOp<T>&& impl) : impl(std::move(impl)) {}
+};
+
+struct LifecycleTracker {
+    int ctor_count = 0;
+    int dtor_count = 0;
+
+    int alive() { return ctor_count - dtor_count; }
+};
+
+template<>
+struct MockOp<MockTypes::Lifecycle> {
+    MockOp() = delete;
+    void operator=(const MockOp&) = delete;
+
+    MockOp(LifecycleTracker* tracker) : tracker(tracker) {
+        tracker->ctor_count += 1;
+    }
+
+    MockOp(const MockOp& other) {
+        tracker = other.tracker;
+        tracker->ctor_count += 1;
+    }
+
+    ~MockOp() {
+        tracker->dtor_count += 1;
+    }
+
+    LifecycleTracker* tracker = nullptr;
+};
+
+template<>
+struct MockOp<MockTypes::NoOp> {};
+
+template<>
+struct MockOp<MockTypes::IntHolder> {
+    int value = -1;
+};
+
+struct MockBuffer : public OpBuffer<MockTypes, MockOpContainer> {
+    template <MockTypes T>
+    void push(MockOp<T>&& op) {
+        push_container(MockOpContainer<T>{std::move(op)});
+    }
+};
+
+template<typename T>
+static int countItems(const T& t) {
+    int count = 0;
+    t.for_each([&](auto i) {
+        count++;
+    });
+    return count;
+}
+
+TEST(OpBuffer, lifecycleCheck) {
+    LifecycleTracker tracker;
+    {
+        MockBuffer buffer;
+        buffer.push_container(MockOpContainer<Op::Lifecycle> {
+            MockOp<MockTypes::Lifecycle>{&tracker}
+        });
+        EXPECT_EQ(tracker.alive(), 1);
+        buffer.clear();
+        EXPECT_EQ(tracker.alive(), 0);
+    }
+    EXPECT_EQ(tracker.alive(), 0);
+}
+
+TEST(OpBuffer, lifecycleCheckMove) {
+    LifecycleTracker tracker;
+    {
+        MockBuffer buffer;
+        buffer.push_container(MockOpContainer<Op::Lifecycle> {
+            MockOp<MockTypes::Lifecycle>{&tracker}
+        });
+        EXPECT_EQ(tracker.alive(), 1);
+        {
+            MockBuffer other(std::move(buffer));
+            EXPECT_EQ(tracker.alive(), 1);
+            EXPECT_EQ(buffer.size(), 0);
+            EXPECT_GT(other.size(), 0);
+            EXPECT_EQ(1, countItems(other));
+            EXPECT_EQ(0, countItems(buffer));
+
+            other.push_container(MockOpContainer<MockTypes::Lifecycle> {
+                MockOp<MockTypes::Lifecycle>{&tracker}
+            });
+
+            EXPECT_EQ(2, countItems(other));
+            EXPECT_EQ(2, tracker.alive());
+
+            buffer.push_container(MockOpContainer<MockTypes::Lifecycle> {
+                MockOp<MockTypes::Lifecycle>{&tracker}
+            });
+            EXPECT_EQ(1, countItems(buffer));
+            EXPECT_EQ(3, tracker.alive());
+
+            buffer = std::move(other);
+            EXPECT_EQ(2, countItems(buffer));
+            EXPECT_EQ(2, tracker.alive());
+        }
+        EXPECT_EQ(2, countItems(buffer));
+        EXPECT_EQ(2, tracker.alive());
+        buffer.clear();
+        EXPECT_EQ(0, countItems(buffer));
+        EXPECT_EQ(0, tracker.alive());
+    }
+    EXPECT_EQ(tracker.alive(), 0);
+}
+
+TEST(OpBuffer, verifyConst) {
+    MockBuffer buffer;
+    buffer.push<Op::IntHolder>({42});
+    buffer.for_each([](auto op) {
+        static_assert(std::is_const_v<std::remove_reference_t<decltype(*op)>>,
+                "Expected container to be const");
+    });
+}
+
+TEST(OpBuffer, filterView) {
+    MockBuffer buffer;
+    buffer.push<Op::NoOp>({});
+    buffer.push<Op::IntHolder>({0});
+    buffer.push<Op::IntHolder>({1});
+    buffer.push<Op::NoOp>({});
+    buffer.push<Op::NoOp>({});
+    buffer.push<Op::IntHolder>({2});
+    buffer.push<Op::NoOp>({});
+    buffer.push<Op::NoOp>({});
+    buffer.push<Op::NoOp>({});
+    buffer.push<Op::NoOp>({});
+
+
+    int index = 0;
+    for (const auto& it : buffer.filter<Op::IntHolder>()) {
+        ASSERT_EQ(Op::IntHolder, it.header.type);
+        EXPECT_EQ(index, it.impl.value);
+        index++;
+    }
+    EXPECT_EQ(index, 3);
+
+    int count = 0;
+    for (const auto& it : buffer.filter<Op::NoOp>()) {
+        ASSERT_EQ(Op::NoOp, it.header.type);
+        count++;
+    }
+    EXPECT_EQ(count, 7);
+}
+
diff --git a/location/java/android/location/GnssSignalQuality.java b/location/java/android/location/GnssSignalQuality.java
new file mode 100644
index 0000000..7945f3e
--- /dev/null
+++ b/location/java/android/location/GnssSignalQuality.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.location;
+
+import android.server.location.ServerLocationProtoEnums;
+
+/**
+ * Gnss signal quality information.
+ *
+ * @hide
+ */
+public interface GnssSignalQuality {
+
+    int GNSS_SIGNAL_QUALITY_UNKNOWN =
+            ServerLocationProtoEnums.GPS_SIGNAL_QUALITY_UNKNOWN; // -1
+
+    int GNSS_SIGNAL_QUALITY_POOR =
+            ServerLocationProtoEnums.GPS_SIGNAL_QUALITY_POOR; // 0
+
+    int GNSS_SIGNAL_QUALITY_GOOD =
+            ServerLocationProtoEnums.GPS_SIGNAL_QUALITY_GOOD; // 1
+
+    int NUM_GNSS_SIGNAL_QUALITY_LEVELS = GNSS_SIGNAL_QUALITY_GOOD + 1;
+}
diff --git a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
index 0822cda..dd8a8c3 100644
--- a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
+++ b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
@@ -16,6 +16,11 @@
 
 package com.android.internal.location.gnssmetrics;
 
+import static android.location.GnssSignalQuality.GNSS_SIGNAL_QUALITY_GOOD;
+import static android.location.GnssSignalQuality.GNSS_SIGNAL_QUALITY_POOR;
+import static android.location.GnssSignalQuality.GNSS_SIGNAL_QUALITY_UNKNOWN;
+import static android.location.GnssSignalQuality.NUM_GNSS_SIGNAL_QUALITY_LEVELS;
+
 import android.app.StatsManager;
 import android.content.Context;
 import android.location.GnssStatus;
@@ -23,7 +28,6 @@
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.os.connectivity.GpsBatteryStats;
-import android.server.location.ServerLocationProtoEnums;
 import android.text.format.DateUtils;
 import android.util.Base64;
 import android.util.Log;
@@ -50,17 +54,6 @@
 
     private static final String TAG = "GnssMetrics";
 
-    private static final int GPS_SIGNAL_QUALITY_UNKNOWN =
-            ServerLocationProtoEnums.GPS_SIGNAL_QUALITY_UNKNOWN; // -1
-
-    private static final int GPS_SIGNAL_QUALITY_POOR =
-            ServerLocationProtoEnums.GPS_SIGNAL_QUALITY_POOR; // 0
-
-    private static final int GPS_SIGNAL_QUALITY_GOOD =
-            ServerLocationProtoEnums.GPS_SIGNAL_QUALITY_GOOD; // 1
-
-    public static final int NUM_GPS_SIGNAL_QUALITY_LEVELS = GPS_SIGNAL_QUALITY_GOOD + 1;
-
     /** Default time between location fixes (in millisecs) */
     private static final int DEFAULT_TIME_BETWEEN_FIXES_MILLISECS = 1000;
 
@@ -397,7 +390,7 @@
                     stats.getLoggingDurationMs() / ((double) DateUtils.MINUTE_IN_MILLIS)).append(
                     "\n");
             long[] t = stats.getTimeInGpsSignalQualityLevel();
-            if (t != null && t.length == NUM_GPS_SIGNAL_QUALITY_LEVELS) {
+            if (t != null && t.length == NUM_GNSS_SIGNAL_QUALITY_LEVELS) {
                 s.append("  Amount of time (while on battery) Top 4 Avg CN0 > "
                         + GnssPowerMetrics.POOR_TOP_FOUR_AVG_CN0_THRESHOLD_DB_HZ
                         + " dB-Hz (min): ").append(
@@ -512,7 +505,7 @@
           // so that
             // the first CNO report will trigger an update to BatteryStats
             mLastAverageCn0 = -100.0;
-            mLastSignalLevel = GPS_SIGNAL_QUALITY_UNKNOWN;
+            mLastSignalLevel = GNSS_SIGNAL_QUALITY_UNKNOWN;
         }
 
         /**
@@ -584,9 +577,9 @@
          */
         private int getSignalLevel(double cn0) {
             if (cn0 > POOR_TOP_FOUR_AVG_CN0_THRESHOLD_DB_HZ) {
-                return GnssMetrics.GPS_SIGNAL_QUALITY_GOOD;
+                return GNSS_SIGNAL_QUALITY_GOOD;
             }
-            return GnssMetrics.GPS_SIGNAL_QUALITY_POOR;
+            return GNSS_SIGNAL_QUALITY_POOR;
         }
     }
 
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 3bd68d8..d9cfb63 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -2931,7 +2931,7 @@
     public boolean isMusicActive() {
         final IAudioService service = getService();
         try {
-            return service.isMusicActive();
+            return service.isMusicActive(false /*remotely*/);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -2945,7 +2945,12 @@
      */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public boolean isMusicActiveRemotely() {
-        return AudioSystem.isStreamActiveRemotely(STREAM_MUSIC, 0);
+        final IAudioService service = getService();
+        try {
+            return service.isMusicActive(true /*remotely*/);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
     }
 
     /**
@@ -5108,7 +5113,12 @@
         case STREAM_NOTIFICATION:
         case STREAM_DTMF:
         case STREAM_ACCESSIBILITY:
-            return AudioSystem.getDevicesForStream(streamType);
+            final IAudioService service = getService();
+            try {
+                return service.getDevicesForStream(streamType);
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
         default:
             return 0;
         }
diff --git a/media/java/android/media/AudioPlaybackConfiguration.java b/media/java/android/media/AudioPlaybackConfiguration.java
index 17305a5..b9f449c 100644
--- a/media/java/android/media/AudioPlaybackConfiguration.java
+++ b/media/java/android/media/AudioPlaybackConfiguration.java
@@ -21,6 +21,7 @@
 
 import android.annotation.IntDef;
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.annotation.SystemApi;
 import android.os.Binder;
 import android.os.IBinder;
@@ -47,6 +48,8 @@
     public static final int PLAYER_PIID_INVALID = -1;
     /** @hide */
     public static final int PLAYER_UPID_INVALID = -1;
+    /** @hide */
+    public static final int PLAYER_DEVICEID_INVALID = 0;
 
     // information about the implementation
     /**
@@ -158,6 +161,11 @@
      */
     @SystemApi
     public static final int PLAYER_STATE_STOPPED = 4;
+    /**
+     * @hide
+     * The state used to update device id, does not actually change the state of the player
+     */
+    public static final int PLAYER_UPDATE_DEVICE_ID = 5;
 
     /** @hide */
     @IntDef({
@@ -166,7 +174,8 @@
         PLAYER_STATE_IDLE,
         PLAYER_STATE_STARTED,
         PLAYER_STATE_PAUSED,
-        PLAYER_STATE_STOPPED
+        PLAYER_STATE_STOPPED,
+        PLAYER_UPDATE_DEVICE_ID
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface PlayerState {}
@@ -184,6 +193,8 @@
     private int mPlayerState;
     private AudioAttributes mPlayerAttr; // never null
 
+    private int mDeviceId;
+
     /**
      * Never use without initializing parameters afterwards
      */
@@ -201,6 +212,7 @@
         mPlayerType = pic.mPlayerType;
         mClientUid = uid;
         mClientPid = pid;
+        mDeviceId = PLAYER_DEVICEID_INVALID;
         mPlayerState = PLAYER_STATE_IDLE;
         mPlayerAttr = pic.mAttributes;
         if ((sPlayerDeathMonitor != null) && (pic.mIPlayer != null)) {
@@ -241,6 +253,7 @@
                         in.mPlayerAttr.getAllowedCapturePolicy() == ALLOW_CAPTURE_BY_ALL
                         ? ALLOW_CAPTURE_BY_ALL : ALLOW_CAPTURE_BY_NONE)
                 .build();
+        anonymCopy.mDeviceId = in.mDeviceId;
         // anonymized data
         anonymCopy.mPlayerType = PLAYER_TYPE_UNKNOWN;
         anonymCopy.mClientUid = PLAYER_UPID_INVALID;
@@ -278,6 +291,25 @@
     }
 
     /**
+     * Returns information about the {@link AudioDeviceInfo} used for this playback.
+     * @return the audio playback device or null if the device is not available at the time of query
+     */
+    public @Nullable AudioDeviceInfo getAudioDevice() {
+        if (mDeviceId == PLAYER_DEVICEID_INVALID) {
+            return null;
+        }
+        // TODO(175802592): change this to AudioManager.getDeviceForPortId() when available
+        AudioDeviceInfo[] devices =
+                AudioManager.getDevicesStatic(AudioManager.GET_DEVICES_OUTPUTS);
+        for (int i = 0; i < devices.length; i++) {
+            if (devices[i].getId() == mDeviceId) {
+                return devices[i];
+            }
+        }
+        return null;
+    }
+
+    /**
      * @hide
      * Return the type of player linked to this configuration.
      * <br>Note that player types not exposed in the system API will be represented as
@@ -359,13 +391,29 @@
      * @hide
      * Handle a player state change
      * @param event
+     * @param deviceId active device id or {@Code PLAYER_DEVICEID_INVALID}
+     * <br>Note device id is valid for {@code PLAYER_UPDATE_DEVICE_ID} or
+     * <br>{@code PLAYER_STATE_STARTED} events, as the device id will be reset to none when
+     * <br>pausing or stopping playback. It will be set to active device when playback starts or
+     * <br>it will be changed when PLAYER_UPDATE_DEVICE_ID is sent. The latter can happen if the
+     * <br>device changes in the middle of playback.
      * @return true if the state changed, false otherwise
      */
-    public boolean handleStateEvent(int event) {
-        final boolean changed;
+    public boolean handleStateEvent(int event, int deviceId) {
+        boolean changed = false;
         synchronized (this) {
-            changed = (mPlayerState != event);
-            mPlayerState = event;
+
+            // Do not update if it is only device id update
+            if (event != PLAYER_UPDATE_DEVICE_ID) {
+                changed = (mPlayerState != event);
+                mPlayerState = event;
+            }
+
+            if (event == PLAYER_STATE_STARTED || event == PLAYER_UPDATE_DEVICE_ID) {
+                changed = changed || (mDeviceId != deviceId);
+                mDeviceId = deviceId;
+            }
+
             if (changed && (event == PLAYER_STATE_RELEASED) && (mIPlayerShell != null)) {
                 mIPlayerShell.release();
                 mIPlayerShell = null;
@@ -436,7 +484,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(mPlayerIId, mPlayerType, mClientUid, mClientPid);
+        return Objects.hash(mPlayerIId, mDeviceId, mPlayerType, mClientUid, mClientPid);
     }
 
     @Override
@@ -447,6 +495,7 @@
     @Override
     public void writeToParcel(Parcel dest, int flags) {
         dest.writeInt(mPlayerIId);
+        dest.writeInt(mDeviceId);
         dest.writeInt(mPlayerType);
         dest.writeInt(mClientUid);
         dest.writeInt(mClientPid);
@@ -461,6 +510,7 @@
 
     private AudioPlaybackConfiguration(Parcel in) {
         mPlayerIId = in.readInt();
+        mDeviceId = in.readInt();
         mPlayerType = in.readInt();
         mClientUid = in.readInt();
         mClientPid = in.readInt();
@@ -478,6 +528,7 @@
         AudioPlaybackConfiguration that = (AudioPlaybackConfiguration) o;
 
         return ((mPlayerIId == that.mPlayerIId)
+                && (mDeviceId == that.mDeviceId)
                 && (mPlayerType == that.mPlayerType)
                 && (mClientUid == that.mClientUid)
                 && (mClientPid == that.mClientPid));
@@ -486,6 +537,7 @@
     @Override
     public String toString() {
         return "AudioPlaybackConfiguration piid:" + mPlayerIId
+                + " deviceId:" + mDeviceId
                 + " type:" + toLogFriendlyPlayerType(mPlayerType)
                 + " u/pid:" + mClientUid + "/" + mClientPid
                 + " state:" + toLogFriendlyPlayerState(mPlayerState)
@@ -571,6 +623,7 @@
             case PLAYER_STATE_STARTED: return "started";
             case PLAYER_STATE_PAUSED: return "paused";
             case PLAYER_STATE_STOPPED: return "stopped";
+            case PLAYER_UPDATE_DEVICE_ID: return "device";
             default:
                 return "unknown player state - FIXME";
         }
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index e3b6fba..e9a18e9 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -1824,6 +1824,7 @@
 
     @Override
     protected void finalize() {
+        tryToDisableNativeRoutingCallback();
         baseRelease();
         native_finalize();
     }
@@ -2717,9 +2718,15 @@
     }
 
     private void startImpl() {
+        synchronized (mRoutingChangeListeners) {
+            if (!mEnableSelfRoutingMonitor) {
+                testEnableNativeRoutingCallbacksLocked();
+                mEnableSelfRoutingMonitor = true;
+            }
+        }
         synchronized(mPlayStateLock) {
-            baseStart();
             native_start();
+            baseStart(native_getRoutedDeviceId());
             if (mPlayState == PLAYSTATE_PAUSED_STOPPING) {
                 mPlayState = PLAYSTATE_STOPPING;
             } else {
@@ -2757,6 +2764,7 @@
                 mPlayStateLock.notify();
             }
         }
+        tryToDisableNativeRoutingCallback();
     }
 
     /**
@@ -3496,12 +3504,21 @@
         return null;
     }
 
+    private void tryToDisableNativeRoutingCallback() {
+        synchronized (mRoutingChangeListeners) {
+            if (mEnableSelfRoutingMonitor) {
+                mEnableSelfRoutingMonitor = false;
+                testDisableNativeRoutingCallbacksLocked();
+            }
+        }
+    }
+
     /*
      * Call BEFORE adding a routing callback handler.
      */
     @GuardedBy("mRoutingChangeListeners")
     private void testEnableNativeRoutingCallbacksLocked() {
-        if (mRoutingChangeListeners.size() == 0) {
+        if (mRoutingChangeListeners.size() == 0 && !mEnableSelfRoutingMonitor) {
             native_enableDeviceCallback();
         }
     }
@@ -3511,7 +3528,7 @@
      */
     @GuardedBy("mRoutingChangeListeners")
     private void testDisableNativeRoutingCallbacksLocked() {
-        if (mRoutingChangeListeners.size() == 0) {
+        if (mRoutingChangeListeners.size() == 0 && !mEnableSelfRoutingMonitor) {
             native_disableDeviceCallback();
         }
     }
@@ -3528,6 +3545,9 @@
     private ArrayMap<AudioRouting.OnRoutingChangedListener,
             NativeRoutingEventHandlerDelegate> mRoutingChangeListeners = new ArrayMap<>();
 
+    @GuardedBy("mRoutingChangeListeners")
+    private boolean mEnableSelfRoutingMonitor;
+
    /**
     * Adds an {@link AudioRouting.OnRoutingChangedListener} to receive notifications of routing
     * changes on this AudioTrack.
@@ -3627,6 +3647,7 @@
      */
     private void broadcastRoutingChange() {
         AudioManager.resetAudioPortGeneration();
+        baseUpdateDeviceId(getRoutedDevice());
         synchronized (mRoutingChangeListeners) {
             for (NativeRoutingEventHandlerDelegate delegate : mRoutingChangeListeners.values()) {
                 delegate.notifyClient();
diff --git a/media/java/android/media/HwAudioSource.java b/media/java/android/media/HwAudioSource.java
index 01a02f1..bbf632a 100644
--- a/media/java/android/media/HwAudioSource.java
+++ b/media/java/android/media/HwAudioSource.java
@@ -22,6 +22,8 @@
 
 import com.android.internal.util.Preconditions;
 
+import java.util.ArrayList;
+
 /**
  * The HwAudioSource represents the audio playback directly from a source audio device.
  * It currently supports {@link HwAudioSource#start()} and {@link HwAudioSource#stop()} only
@@ -130,10 +132,32 @@
      */
     public void start() {
         Preconditions.checkState(!isPlaying(), "HwAudioSource is currently playing");
-        baseStart();
         mNativeHandle = AudioSystem.startAudioSource(
                 mAudioDeviceInfo.getPort().activeConfig(),
                 mAudioAttributes);
+        // FIXME: b/174876389 clean up device id reporting
+        baseStart(getDeviceId());
+    }
+
+    private int getDeviceId() {
+        ArrayList<AudioPatch> patches = new ArrayList<AudioPatch>();
+        if (AudioManager.listAudioPatches(patches) != AudioManager.SUCCESS) {
+            return 0;
+        }
+
+        for (int i = 0; i < patches.size(); i++) {
+            AudioPatch patch = patches.get(i);
+            AudioPortConfig[] sources = patch.sources();
+            AudioPortConfig[] sinks = patch.sinks();
+            if ((sources != null) && (sources.length > 0)) {
+                for (int c = 0;  c < sources.length; c++) {
+                    if (sources[c].port().id() == mAudioDeviceInfo.getId()) {
+                        return sinks[c].port().id();
+                    }
+                }
+            }
+        }
+        return 0;
     }
 
     /**
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 2ac5b50..77fde6a 100755
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -62,7 +62,7 @@
 
     oneway void playerAttributes(in int piid, in AudioAttributes attr);
 
-    oneway void playerEvent(in int piid, in int event);
+    oneway void playerEvent(in int piid, in int event, in int deviceId);
 
     oneway void releasePlayer(in int piid);
 
@@ -335,5 +335,7 @@
             in String packageName, int uid, int pid, in UserHandle userHandle,
             int targetSdkVersion);
 
-    boolean isMusicActive();
+    boolean isMusicActive(in boolean remotely);
+
+    int getDevicesForStream(in int streamType);
 }
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index f8311cd..ceac2c9 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -1352,7 +1352,6 @@
     }
 
     private void startImpl() {
-        baseStart();
         stayAwake(true);
         _start();
     }
@@ -1378,7 +1377,6 @@
     public void stop() throws IllegalStateException {
         stayAwake(false);
         _stop();
-        baseStop();
     }
 
     private native void _stop() throws IllegalStateException;
@@ -1392,7 +1390,6 @@
     public void pause() throws IllegalStateException {
         stayAwake(false);
         _pause();
-        basePause();
     }
 
     private native void _pause() throws IllegalStateException;
@@ -1497,13 +1494,60 @@
         return null;
     }
 
+
+    /**
+     * Sends device list change notification to all listeners.
+     */
+    private void broadcastRoutingChange() {
+        AudioManager.resetAudioPortGeneration();
+        synchronized (mRoutingChangeListeners) {
+            // Prevent the case where an event is triggered by registering a routing change
+            // listener via the media player.
+            if (mEnableSelfRoutingMonitor) {
+                baseUpdateDeviceId(getRoutedDevice());
+            }
+            for (NativeRoutingEventHandlerDelegate delegate
+                    : mRoutingChangeListeners.values()) {
+                delegate.notifyClient();
+            }
+        }
+    }
+
     /*
-     * Call BEFORE adding a routing callback handler or AFTER removing a routing callback handler.
+     * Call BEFORE adding a routing callback handler.
      */
     @GuardedBy("mRoutingChangeListeners")
-    private void enableNativeRoutingCallbacksLocked(boolean enabled) {
-        if (mRoutingChangeListeners.size() == 0) {
-            native_enableDeviceCallback(enabled);
+    private void testEnableNativeRoutingCallbacksLocked() {
+        if (mRoutingChangeListeners.size() == 0 && !mEnableSelfRoutingMonitor) {
+            native_enableDeviceCallback(true);
+        }
+    }
+
+    private void tryToEnableNativeRoutingCallback() {
+        synchronized (mRoutingChangeListeners) {
+            if (!mEnableSelfRoutingMonitor) {
+                testEnableNativeRoutingCallbacksLocked();
+                mEnableSelfRoutingMonitor = true;
+            }
+        }
+    }
+
+    private void tryToDisableNativeRoutingCallback() {
+        synchronized (mRoutingChangeListeners) {
+            if (mEnableSelfRoutingMonitor) {
+                mEnableSelfRoutingMonitor = false;
+                testDisableNativeRoutingCallbacksLocked();
+            }
+        }
+    }
+
+    /*
+     * Call AFTER removing a routing callback handler.
+     */
+    @GuardedBy("mRoutingChangeListeners")
+    private void testDisableNativeRoutingCallbacksLocked() {
+        if (mRoutingChangeListeners.size() == 0 && !mEnableSelfRoutingMonitor) {
+            native_enableDeviceCallback(false);
         }
     }
 
@@ -1516,6 +1560,9 @@
     private ArrayMap<AudioRouting.OnRoutingChangedListener,
             NativeRoutingEventHandlerDelegate> mRoutingChangeListeners = new ArrayMap<>();
 
+    @GuardedBy("mRoutingChangeListeners")
+    private boolean mEnableSelfRoutingMonitor;
+
     /**
      * Adds an {@link AudioRouting.OnRoutingChangedListener} to receive notifications of routing
      * changes on this MediaPlayer.
@@ -1529,7 +1576,7 @@
             Handler handler) {
         synchronized (mRoutingChangeListeners) {
             if (listener != null && !mRoutingChangeListeners.containsKey(listener)) {
-                enableNativeRoutingCallbacksLocked(true);
+                testEnableNativeRoutingCallbacksLocked();
                 mRoutingChangeListeners.put(
                         listener, new NativeRoutingEventHandlerDelegate(this, listener,
                                 handler != null ? handler : mEventHandler));
@@ -1548,8 +1595,8 @@
         synchronized (mRoutingChangeListeners) {
             if (mRoutingChangeListeners.containsKey(listener)) {
                 mRoutingChangeListeners.remove(listener);
-                enableNativeRoutingCallbacksLocked(false);
             }
+            testDisableNativeRoutingCallbacksLocked();
         }
     }
 
@@ -3301,6 +3348,7 @@
 
     @Override
     protected void finalize() {
+        tryToDisableNativeRoutingCallback();
         baseRelease();
         native_finalize();
     }
@@ -3415,6 +3463,8 @@
 
             case MEDIA_STOPPED:
                 {
+                    tryToDisableNativeRoutingCallback();
+                    baseStop();
                     TimeProvider timeProvider = mTimeProvider;
                     if (timeProvider != null) {
                         timeProvider.onStopped();
@@ -3423,8 +3473,16 @@
                 break;
 
             case MEDIA_STARTED:
+                {
+                    baseStart(native_getRoutedDeviceId());
+                    tryToEnableNativeRoutingCallback();
+                }
+                // fall through
             case MEDIA_PAUSED:
                 {
+                    if (msg.what == MEDIA_PAUSED) {
+                        basePause();
+                    }
                     TimeProvider timeProvider = mTimeProvider;
                     if (timeProvider != null) {
                         timeProvider.onPaused(msg.what == MEDIA_PAUSED);
@@ -3590,14 +3648,8 @@
                 break;
 
             case MEDIA_AUDIO_ROUTING_CHANGED:
-                AudioManager.resetAudioPortGeneration();
-                synchronized (mRoutingChangeListeners) {
-                    for (NativeRoutingEventHandlerDelegate delegate
-                            : mRoutingChangeListeners.values()) {
-                        delegate.notifyClient();
-                    }
-                }
-                return;
+                    broadcastRoutingChange();
+                    return;
 
             case MEDIA_TIME_DISCONTINUITY:
                 final OnMediaTimeDiscontinuityListener mediaTimeListener;
@@ -3803,6 +3855,7 @@
         @Override
         public void onCompletion(MediaPlayer mp) {
             baseStop();
+            tryToDisableNativeRoutingCallback();
         }
     };
 
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index 4940c76..36f7bed 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -43,6 +43,7 @@
 import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.text.TextUtils;
+import android.util.ArrayMap;
 import android.util.Log;
 import android.view.Display;
 import android.view.DisplayAddress;
@@ -54,6 +55,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.CopyOnWriteArrayList;
 
@@ -111,6 +113,8 @@
         IMediaRouterClient mClient;
         MediaRouterClientState mClientState;
 
+        Map<Integer, Integer> mStreamVolume = new ArrayMap<>();
+
         final IAudioRoutesObserver.Stub mAudioRoutesObserver = new IAudioRoutesObserver.Stub() {
             @Override
             public void dispatchAudioRoutesChanged(final AudioRoutesInfo newRoutes) {
@@ -262,6 +266,17 @@
             mCurAudioRoutesInfo.bluetoothName = newRoutes.bluetoothName;
         }
 
+        int getStreamVolume(int streamType) {
+            if (!mStreamVolume.containsKey(streamType)) {
+                try {
+                    mStreamVolume.put(streamType, mAudioService.getStreamVolume(streamType));
+                } catch (RemoteException e) {
+                    Log.e(TAG, "Error getting local stream volume", e);
+                }
+            }
+            return mStreamVolume.get(streamType);
+        }
+
         boolean isBluetoothA2dpOn() {
             try {
                 return mBluetoothA2dpRoute != null && mAudioService.isBluetoothA2dpOn();
@@ -1976,13 +1991,7 @@
          */
         public int getVolume() {
             if (mPlaybackType == PLAYBACK_TYPE_LOCAL) {
-                int vol = 0;
-                try {
-                    vol = sStatic.mAudioService.getStreamVolume(mPlaybackStream);
-                } catch (RemoteException e) {
-                    Log.e(TAG, "Error getting local stream volume", e);
-                }
-                return vol;
+                return sStatic.getStreamVolume(mPlaybackStream);
             } else {
                 return mVolume;
             }
@@ -3139,11 +3148,12 @@
             if (intent.getAction().equals(AudioManager.VOLUME_CHANGED_ACTION)) {
                 final int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE,
                         -1);
+                final int newVolume = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, 0);
+                sStatic.mStreamVolume.put(streamType, newVolume);
                 if (streamType != AudioManager.STREAM_MUSIC) {
                     return;
                 }
 
-                final int newVolume = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, 0);
                 final int oldVolume = intent.getIntExtra(
                         AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, 0);
                 if (newVolume != oldVolume) {
diff --git a/media/java/android/media/PlayerBase.java b/media/java/android/media/PlayerBase.java
index da69c6c..58ae279 100644
--- a/media/java/android/media/PlayerBase.java
+++ b/media/java/android/media/PlayerBase.java
@@ -90,6 +90,8 @@
     private float mPanMultiplierR = 1.0f;
     @GuardedBy("mLock")
     private float mVolMultiplier = 1.0f;
+    @GuardedBy("mLock")
+    private int mDeviceId;
 
     /**
      * Constructor. Must be given audio attributes, as they are required for AppOps.
@@ -152,14 +154,35 @@
         }
     }
 
-    private void updateState(int state) {
+    void baseUpdateDeviceId(@Nullable AudioDeviceInfo deviceInfo) {
+        int deviceId = 0;
+        if (deviceInfo != null) {
+            deviceId = deviceInfo.getId();
+        }
+        int piid;
+        synchronized (mLock) {
+            piid = mPlayerIId;
+            mDeviceId = deviceId;
+        }
+        try {
+            getService().playerEvent(piid,
+                    AudioPlaybackConfiguration.PLAYER_UPDATE_DEVICE_ID, deviceId);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Error talking to audio service, "
+                    + deviceId
+                    + " device id will not be tracked for piid=" + piid, e);
+        }
+    }
+
+    private void updateState(int state, int deviceId) {
         final int piid;
         synchronized (mLock) {
             mState = state;
             piid = mPlayerIId;
+            mDeviceId = deviceId;
         }
         try {
-            getService().playerEvent(piid, state);
+            getService().playerEvent(piid, state, deviceId);
         } catch (RemoteException e) {
             Log.e(TAG, "Error talking to audio service, "
                     + AudioPlaybackConfiguration.toLogFriendlyPlayerState(state)
@@ -167,9 +190,11 @@
         }
     }
 
-    void baseStart() {
-        if (DEBUG) { Log.v(TAG, "baseStart() piid=" + mPlayerIId); }
-        updateState(AudioPlaybackConfiguration.PLAYER_STATE_STARTED);
+    void baseStart(int deviceId) {
+        if (DEBUG) {
+            Log.v(TAG, "baseStart() piid=" + mPlayerIId + " deviceId=" + deviceId);
+        }
+        updateState(AudioPlaybackConfiguration.PLAYER_STATE_STARTED, deviceId);
         synchronized (mLock) {
             if (isRestricted_sync()) {
                 playerSetVolume(true/*muting*/,0, 0);
@@ -191,12 +216,12 @@
 
     void basePause() {
         if (DEBUG) { Log.v(TAG, "basePause() piid=" + mPlayerIId); }
-        updateState(AudioPlaybackConfiguration.PLAYER_STATE_PAUSED);
+        updateState(AudioPlaybackConfiguration.PLAYER_STATE_PAUSED, 0);
     }
 
     void baseStop() {
         if (DEBUG) { Log.v(TAG, "baseStop() piid=" + mPlayerIId); }
-        updateState(AudioPlaybackConfiguration.PLAYER_STATE_STOPPED);
+        updateState(AudioPlaybackConfiguration.PLAYER_STATE_STOPPED, 0);
     }
 
     void baseSetPan(float pan) {
diff --git a/media/java/android/media/SoundPool.java b/media/java/android/media/SoundPool.java
index 1bf2863..797caf3 100644
--- a/media/java/android/media/SoundPool.java
+++ b/media/java/android/media/SoundPool.java
@@ -149,7 +149,8 @@
         super(attributes, AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL);
 
         // do native setup
-        if (native_setup(new WeakReference<SoundPool>(this), maxStreams, attributes) != 0) {
+        if (native_setup(new WeakReference<SoundPool>(this),
+                maxStreams, attributes, getCurrentOpPackageName()) != 0) {
             throw new RuntimeException("Native setup failed");
         }
         mAttributes = attributes;
@@ -302,7 +303,8 @@
      */
     public final int play(int soundID, float leftVolume, float rightVolume,
             int priority, int loop, float rate) {
-        baseStart();
+        // FIXME: b/174876164 implement device id for soundpool
+        baseStart(0);
         return _play(soundID, leftVolume, rightVolume, priority, loop, rate);
     }
 
@@ -501,7 +503,7 @@
     private native final int _load(FileDescriptor fd, long offset, long length, int priority);
 
     private native final int native_setup(Object weakRef, int maxStreams,
-            Object/*AudioAttributes*/ attributes);
+            @NonNull Object/*AudioAttributes*/ attributes, @NonNull String opPackageName);
 
     private native final int _play(int soundID, float leftVolume, float rightVolume,
             int priority, int loop, float rate);
diff --git a/media/java/android/media/ToneGenerator.java b/media/java/android/media/ToneGenerator.java
index 140e70d..6a695e6 100644
--- a/media/java/android/media/ToneGenerator.java
+++ b/media/java/android/media/ToneGenerator.java
@@ -16,9 +16,11 @@
 
 package android.media;
 
+import android.annotation.NonNull;
+import android.app.ActivityThread;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.os.Build;
-
+import android.text.TextUtils;
 
 
 /**
@@ -746,7 +748,7 @@
      *
      */
     public ToneGenerator(int streamType, int volume) {
-        native_setup(streamType, volume);
+        native_setup(streamType, volume, getCurrentOpPackageName());
     }
 
     /**
@@ -880,7 +882,8 @@
      */
     public native void release();
 
-    private native final void native_setup(int streamType, int volume);
+    private native void native_setup(
+            int streamType, int volume, @NonNull String opPackageName);
 
     private native final void native_finalize();
 
@@ -895,6 +898,10 @@
     @Override
     protected void finalize() { native_finalize(); }
 
+    private String getCurrentOpPackageName() {
+        return TextUtils.emptyIfNull(ActivityThread.currentOpPackageName());
+    }
+
     @SuppressWarnings("unused")
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     private long mNativeContext; // accessed by native methods
diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp
index ac44843..253b4e3 100644
--- a/media/jni/soundpool/SoundPool.cpp
+++ b/media/jni/soundpool/SoundPool.cpp
@@ -84,8 +84,9 @@
 
 } // namespace
 
-SoundPool::SoundPool(int32_t maxStreams, const audio_attributes_t* attributes)
-    : mStreamManager(maxStreams, kStreamManagerThreads, attributes)
+SoundPool::SoundPool(
+        int32_t maxStreams, const audio_attributes_t* attributes, const std::string& opPackageName)
+    : mStreamManager(maxStreams, kStreamManagerThreads, attributes, opPackageName)
 {
     ALOGV("%s(maxStreams=%d, attr={ content_type=%d, usage=%d, flags=0x%x, tags=%s })",
             __func__, maxStreams,
diff --git a/media/jni/soundpool/SoundPool.h b/media/jni/soundpool/SoundPool.h
index d5b16ef..ffb1c99 100644
--- a/media/jni/soundpool/SoundPool.h
+++ b/media/jni/soundpool/SoundPool.h
@@ -19,6 +19,8 @@
 #include "SoundManager.h"
 #include "StreamManager.h"
 
+#include <string>
+
 namespace android {
 
 /**
@@ -29,7 +31,8 @@
  */
 class SoundPool {
 public:
-    SoundPool(int32_t maxStreams, const audio_attributes_t* attributes);
+    SoundPool(int32_t maxStreams, const audio_attributes_t* attributes,
+            const std::string& opPackageName = {});
     ~SoundPool();
 
     // SoundPool Java API support
diff --git a/media/jni/soundpool/Stream.cpp b/media/jni/soundpool/Stream.cpp
index e7042d0..73e319a 100644
--- a/media/jni/soundpool/Stream.cpp
+++ b/media/jni/soundpool/Stream.cpp
@@ -332,7 +332,9 @@
                     0 /*default notification frames*/, AUDIO_SESSION_ALLOCATE,
                     AudioTrack::TRANSFER_DEFAULT,
                     nullptr /*offloadInfo*/, -1 /*uid*/, -1 /*pid*/,
-                    mStreamManager->getAttributes());
+                    mStreamManager->getAttributes(),
+                    false /*doNotReconnect*/, 1.0f /*maxRequiredSpeed*/,
+                    mStreamManager->getOpPackageName());
             // Set caller name so it can be logged in destructor.
             // MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_SOUNDPOOL
             newTrack->setCallerName("soundpool");
diff --git a/media/jni/soundpool/StreamManager.cpp b/media/jni/soundpool/StreamManager.cpp
index 5b6494d..502ee00 100644
--- a/media/jni/soundpool/StreamManager.cpp
+++ b/media/jni/soundpool/StreamManager.cpp
@@ -98,9 +98,11 @@
 #pragma clang diagnostic ignored "-Wthread-safety-analysis"
 
 StreamManager::StreamManager(
-        int32_t streams, size_t threads, const audio_attributes_t* attributes)
+        int32_t streams, size_t threads, const audio_attributes_t* attributes,
+        std::string opPackageName)
     : StreamMap(streams)
     , mAttributes(*attributes)
+    , mOpPackageName(std::move(opPackageName))
 {
     ALOGV("%s(%d, %zu, ...)", __func__, streams, threads);
     forEach([this](Stream *stream) {
diff --git a/media/jni/soundpool/StreamManager.h b/media/jni/soundpool/StreamManager.h
index 59ae2f9..81ac69e 100644
--- a/media/jni/soundpool/StreamManager.h
+++ b/media/jni/soundpool/StreamManager.h
@@ -24,6 +24,7 @@
 #include <map>
 #include <memory>
 #include <mutex>
+#include <string>
 #include <unordered_set>
 #include <vector>
 
@@ -386,7 +387,8 @@
 public:
     // Note: the SoundPool pointer is only used for stream initialization.
     // It is not stored in StreamManager.
-    StreamManager(int32_t streams, size_t threads, const audio_attributes_t* attributes);
+    StreamManager(int32_t streams, size_t threads, const audio_attributes_t* attributes,
+            std::string opPackageName);
     ~StreamManager();
 
     // Returns positive streamID on success, 0 on failure.  This is locked.
@@ -400,6 +402,8 @@
 
     const audio_attributes_t* getAttributes() const { return &mAttributes; }
 
+    const std::string& getOpPackageName() const { return mOpPackageName; }
+
     // Moves the stream to the restart queue (called upon BUFFER_END of the static track)
     // this is locked internally.
     // If activeStreamIDToMatch is nonzero, it will only move to the restart queue
@@ -473,6 +477,8 @@
     // The paired stream may be active or restarting.
     // No particular order.
     std::unordered_set<Stream*> mProcessingStreams GUARDED_BY(mStreamManagerLock);
+
+    const std::string           mOpPackageName;
 };
 
 } // namespace android::soundpool
diff --git a/media/jni/soundpool/android_media_SoundPool.cpp b/media/jni/soundpool/android_media_SoundPool.cpp
index 26725f8..357cc63 100644
--- a/media/jni/soundpool/android_media_SoundPool.cpp
+++ b/media/jni/soundpool/android_media_SoundPool.cpp
@@ -22,6 +22,7 @@
 #include <utils/Log.h>
 #include <jni.h>
 #include <nativehelper/JNIPlatformHelp.h>
+#include <nativehelper/ScopedUtfChars.h>
 #include <android_runtime/AndroidRuntime.h>
 #include "SoundPool.h"
 
@@ -181,7 +182,7 @@
 
 static jint
 android_media_SoundPool_native_setup(JNIEnv *env, jobject thiz, jobject weakRef,
-        jint maxChannels, jobject jaa)
+        jint maxChannels, jobject jaa, jstring opPackageName)
 {
     if (jaa == nullptr) {
         ALOGE("Error creating SoundPool: invalid audio attributes");
@@ -203,7 +204,8 @@
     paa->flags = (audio_flags_mask_t) env->GetIntField(jaa, javaAudioAttrFields.fieldFlags);
 
     ALOGV("android_media_SoundPool_native_setup");
-    auto *ap = new SoundPool(maxChannels, paa);
+    ScopedUtfChars opPackageNameStr(env, opPackageName);
+    auto *ap = new SoundPool(maxChannels, paa, opPackageNameStr.c_str());
     if (ap == nullptr) {
         return -1;
     }
@@ -298,7 +300,7 @@
         (void *)android_media_SoundPool_setRate
     },
     {   "native_setup",
-        "(Ljava/lang/Object;ILjava/lang/Object;)I",
+        "(Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/String;)I",
         (void*)android_media_SoundPool_native_setup
     },
     {   "native_release",
diff --git a/media/tests/MediaTranscodingTest/Android.bp b/media/tests/MediaTranscodingTest/Android.bp
deleted file mode 100644
index bd687a1..0000000
--- a/media/tests/MediaTranscodingTest/Android.bp
+++ /dev/null
@@ -1,16 +0,0 @@
-android_test {
-    name: "mediatranscodingtest",
-    srcs: ["**/*.java"],
-    libs: [
-        "android.test.runner",
-        "android.test.base",
-    ],
-    static_libs: [
-        "androidx.test.ext.junit",
-        "androidx.test.rules",
-        "androidx.test.uiautomator_uiautomator",
-        "androidx.test.rules",
-        "testng"
-    ],
-    platform_apis: true,
-}
diff --git a/media/tests/MediaTranscodingTest/AndroidManifest.xml b/media/tests/MediaTranscodingTest/AndroidManifest.xml
deleted file mode 100644
index 07674da..0000000
--- a/media/tests/MediaTranscodingTest/AndroidManifest.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-     package="com.android.mediatranscodingtest">
-
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-    <uses-permission android:name="android.permission.WAKE_LOCK"/>
-
-    <application android:label="@string/app_name">
-        <uses-library android:name="android.test.runner"/>
-        <activity android:label="@string/app_name"
-             android:name="MediaTranscodingTest"
-             android:screenOrientation="landscape"
-             android:exported="true">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
-        </activity>
-    </application>
-
-    <instrumentation android:name=".MediaTranscodingTestRunner"
-         android:targetPackage="com.android.mediatranscodingtest"
-         android:label="MediaTranscoding tests InstrumentationRunner">
-    </instrumentation>
-</manifest>
diff --git a/media/tests/MediaTranscodingTest/AndroidTest.xml b/media/tests/MediaTranscodingTest/AndroidTest.xml
deleted file mode 100644
index c2167e8..0000000
--- a/media/tests/MediaTranscodingTest/AndroidTest.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<configuration description="Runs MediaTranscoding Tests">
-    <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
-        <option name="test-file-name" value="mediatranscodingtest.apk" />
-    </target_preparer>
-
-    <option name="test-tag" value="MediaTranscodingTest" />
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="com.android.mediatranscodingtest" />
-        <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
-        <option name="hidden-api-checks" value="false"/>
-    </test>
-</configuration>
diff --git a/media/tests/MediaTranscodingTest/Readme.txt b/media/tests/MediaTranscodingTest/Readme.txt
deleted file mode 100644
index e3b835b..0000000
--- a/media/tests/MediaTranscodingTest/Readme.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-MediaTranscodingTest/
-    Uses instrumentation and so can be run with runtest.
-    It assumes /sdcard/media_api/ has been populated.
-
-contents/media_api/
-    Push to /sdcard/media_api/ for use with MediaTranscodingTest:
-    adb shell mkdir /sdcard/media_api
-    adb push contents/media_api/ /sdcard/media_api/
diff --git a/media/tests/MediaTranscodingTest/assets/ConflictSupportedValue.xml b/media/tests/MediaTranscodingTest/assets/ConflictSupportedValue.xml
deleted file mode 100644
index 9b2fa3b..0000000
--- a/media/tests/MediaTranscodingTest/assets/ConflictSupportedValue.xml
+++ /dev/null
@@ -1,20 +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.
--->
-
-<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    <format android:name="HEVC" supported="true"/>
-    <format android:name="HEVC" supported="false"/>
-</media-capabilities>
diff --git a/media/tests/MediaTranscodingTest/assets/EmptyFormat.xml b/media/tests/MediaTranscodingTest/assets/EmptyFormat.xml
deleted file mode 100644
index 5ef5e51..0000000
--- a/media/tests/MediaTranscodingTest/assets/EmptyFormat.xml
+++ /dev/null
@@ -1,19 +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.
--->
-
-<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    <format />
-</media-capabilities>
diff --git a/media/tests/MediaTranscodingTest/assets/FormatWithoutSupported.xml b/media/tests/MediaTranscodingTest/assets/FormatWithoutSupported.xml
deleted file mode 100644
index e50c212..0000000
--- a/media/tests/MediaTranscodingTest/assets/FormatWithoutSupported.xml
+++ /dev/null
@@ -1,19 +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.
--->
-
-<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    <format android:name="HEVC"/>
-</media-capabilities>
diff --git a/media/tests/MediaTranscodingTest/assets/MediaCapabilities.xml b/media/tests/MediaTranscodingTest/assets/MediaCapabilities.xml
deleted file mode 100644
index 3bff61e..0000000
--- a/media/tests/MediaTranscodingTest/assets/MediaCapabilities.xml
+++ /dev/null
@@ -1,21 +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.
--->
-
-<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    <format android:name="HEVC" supported="true"/>
-    <format android:name="HDR10" supported="false"/>
-    <format android:name="SlowMotion" supported="false"/>
-</media-capabilities>
diff --git a/media/tests/MediaTranscodingTest/assets/SupportAllHdr.xml b/media/tests/MediaTranscodingTest/assets/SupportAllHdr.xml
deleted file mode 100644
index 5cf66b0..0000000
--- a/media/tests/MediaTranscodingTest/assets/SupportAllHdr.xml
+++ /dev/null
@@ -1,24 +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.
--->
-
-<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    <format android:name="HEVC" supported="true"/>
-    <format android:name="HDR10" supported="true"/>
-    <format android:name="HDR10Plus" supported="true"/>
-    <format android:name="Dolby-Vision" supported="true"/>
-    <format android:name="HLG" supported="true"/>
-    <format android:name="SlowMotion" supported="true"/>
-</media-capabilities>
diff --git a/media/tests/MediaTranscodingTest/assets/SupportHdrWithoutHevc.xml b/media/tests/MediaTranscodingTest/assets/SupportHdrWithoutHevc.xml
deleted file mode 100644
index 309aa1d..0000000
--- a/media/tests/MediaTranscodingTest/assets/SupportHdrWithoutHevc.xml
+++ /dev/null
@@ -1,20 +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.
--->
-
-<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    <format android:name="HDR10" supported="true"/>
-    <format android:name="SlowMotion" supported="false"/>
-</media-capabilities>
diff --git a/media/tests/MediaTranscodingTest/assets/SupportedWithoutFormat.xml b/media/tests/MediaTranscodingTest/assets/SupportedWithoutFormat.xml
deleted file mode 100644
index 29454fc..0000000
--- a/media/tests/MediaTranscodingTest/assets/SupportedWithoutFormat.xml
+++ /dev/null
@@ -1,19 +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.
--->
-
-<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    <format supported="true"/>
-</media-capabilities>
diff --git a/media/tests/MediaTranscodingTest/assets/WrongBooleanValue.xml b/media/tests/MediaTranscodingTest/assets/WrongBooleanValue.xml
deleted file mode 100644
index 62de6cd..0000000
--- a/media/tests/MediaTranscodingTest/assets/WrongBooleanValue.xml
+++ /dev/null
@@ -1,21 +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.
--->
-
-<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    <format android:name="HEVC" supported="yes"/>
-    <format android:name="HDR10" supported="false"/>
-    <format android:name="SlowMotion" supported="false"/>
-</media-capabilities>
diff --git a/media/tests/MediaTranscodingTest/assets/WrongMediaCapabilityTag.xml b/media/tests/MediaTranscodingTest/assets/WrongMediaCapabilityTag.xml
deleted file mode 100644
index 5db42e5..0000000
--- a/media/tests/MediaTranscodingTest/assets/WrongMediaCapabilityTag.xml
+++ /dev/null
@@ -1,21 +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.
--->
-
-<media-capability xmlns:android="http://schemas.android.com/apk/res/android">
-    <format android:name="HEVC" supported="true"/>
-    <format android:name="HDR10" supported="true"/>
-    <format android:name="SlowMotion" supported="true"/>
-</media-capabilities>
diff --git a/media/tests/MediaTranscodingTest/assets/WrongMediaCapabilityTag2.xml b/media/tests/MediaTranscodingTest/assets/WrongMediaCapabilityTag2.xml
deleted file mode 100644
index e924c48..0000000
--- a/media/tests/MediaTranscodingTest/assets/WrongMediaCapabilityTag2.xml
+++ /dev/null
@@ -1,21 +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.
--->
-
-<MediaCapability xmlns:android="http://schemas.android.com/apk/res/android">
-    <format android:name="HEVC" supported="true"/>
-    <format android:name="HDR10" supported="true"/>
-    <format android:name="SlowMotion" supported="true"/>
-</MediaCapability>
diff --git a/media/tests/MediaTranscodingTest/build_and_run_unit_tests.sh b/media/tests/MediaTranscodingTest/build_and_run_unit_tests.sh
deleted file mode 100644
index c8fb3a6..0000000
--- a/media/tests/MediaTranscodingTest/build_and_run_unit_tests.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/bash
-#
-# Run tests in this directory.
-#
-
-if [ -z "$ANDROID_BUILD_TOP" ]; then
-    echo "Android build environment not set"
-    exit -1
-fi
-
-# ensure we have mm
-. $ANDROID_BUILD_TOP/build/envsetup.sh
-
-mm
-
-echo "[==========] waiting for device"
-adb root && adb wait-for-device remount
-
-echo "[==========] set to use real transcoder"
-adb shell setprop debug.transcoding.simulated_transcoder false;
-adb shell kill -9 `pid media.transcoding`
-
-echo "[==========] build test apk"
-mmm -j16 .
-adb install -r -g ${OUT}/testcases/mediatranscodingtest/arm64/mediatranscodingtest.apk
-
-# Push the files into app's cache directory/
-FILES=$ANDROID_BUILD_TOP/frameworks/av/media/libmediatranscoding/tests/assets/*
-for file in $FILES
-do
-adb push --sync $file /data/user/0/com.android.mediatranscodingtest/cache/
-done
-
-echo "[==========] running MediaTranscodeManagerTest"
-adb shell am instrument -e class com.android.mediatranscodingtest.MediaTranscodeManagerTest -w com.android.mediatranscodingtest/.MediaTranscodingTestRunner
-
-echo "[==========] running MediaTranscodeManagerDiedTest"
-adb shell am instrument -e class com.android.mediatranscodingtest.MediaTranscodeManagerDiedTest -w com.android.mediatranscodingtest/.MediaTranscodingTestRunner
-
diff --git a/media/tests/MediaTranscodingTest/res/drawable-hdpi/icon.png b/media/tests/MediaTranscodingTest/res/drawable-hdpi/icon.png
deleted file mode 100644
index a02138e..0000000
--- a/media/tests/MediaTranscodingTest/res/drawable-hdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/media/tests/MediaTranscodingTest/res/drawable-mdpi/icon.png b/media/tests/MediaTranscodingTest/res/drawable-mdpi/icon.png
deleted file mode 100644
index 64e3601..0000000
--- a/media/tests/MediaTranscodingTest/res/drawable-mdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/media/tests/MediaTranscodingTest/res/layout/surface_view.xml b/media/tests/MediaTranscodingTest/res/layout/surface_view.xml
deleted file mode 100644
index 3b49db0..0000000
--- a/media/tests/MediaTranscodingTest/res/layout/surface_view.xml
+++ /dev/null
@@ -1,35 +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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-  android:layout_width="match_parent"
-  android:layout_height="match_parent"
-  android:orientation="vertical">
-
-  <FrameLayout
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-  <SurfaceView
-     android:id="@+id/surface_view"
-     android:layout_width="match_parent"
-     android:layout_height="match_parent"
-     android:layout_centerInParent="true"
-     />
-
-  </FrameLayout>
-
-</LinearLayout>
diff --git a/media/tests/MediaTranscodingTest/res/raw/VideoOnlyAVC.mp4 b/media/tests/MediaTranscodingTest/res/raw/VideoOnlyAVC.mp4
deleted file mode 100644
index 2033a3f..0000000
--- a/media/tests/MediaTranscodingTest/res/raw/VideoOnlyAVC.mp4
+++ /dev/null
Binary files differ
diff --git a/media/tests/MediaTranscodingTest/res/raw/VideoOnlyHEVC.mp4 b/media/tests/MediaTranscodingTest/res/raw/VideoOnlyHEVC.mp4
deleted file mode 100644
index 7ac0024..0000000
--- a/media/tests/MediaTranscodingTest/res/raw/VideoOnlyHEVC.mp4
+++ /dev/null
Binary files differ
diff --git a/media/tests/MediaTranscodingTest/res/raw/cubicle_avc_480x240_aac_24KHz.mp4 b/media/tests/MediaTranscodingTest/res/raw/cubicle_avc_480x240_aac_24KHz.mp4
deleted file mode 100644
index ef7e1b7..0000000
--- a/media/tests/MediaTranscodingTest/res/raw/cubicle_avc_480x240_aac_24KHz.mp4
+++ /dev/null
Binary files differ
diff --git a/media/tests/MediaTranscodingTest/res/values/strings.xml b/media/tests/MediaTranscodingTest/res/values/strings.xml
deleted file mode 100644
index 0e1f8eb..0000000
--- a/media/tests/MediaTranscodingTest/res/values/strings.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-	<!-- Test application name [CHAR LIMIT=32] -->
-    <string name="app_name">MediaTranscodingTest</string>
-</resources>
diff --git a/media/tests/MediaTranscodingTest/res/xml/mediacapabilities.xml b/media/tests/MediaTranscodingTest/res/xml/mediacapabilities.xml
deleted file mode 100644
index 3bff61e..0000000
--- a/media/tests/MediaTranscodingTest/res/xml/mediacapabilities.xml
+++ /dev/null
@@ -1,21 +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.
--->
-
-<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    <format android:name="HEVC" supported="true"/>
-    <format android:name="HDR10" supported="false"/>
-    <format android:name="SlowMotion" supported="false"/>
-</media-capabilities>
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/ApplicationMediaCapabilitiesTest.java b/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/ApplicationMediaCapabilitiesTest.java
deleted file mode 100644
index 74552a5..0000000
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/ApplicationMediaCapabilitiesTest.java
+++ /dev/null
@@ -1,306 +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.mediatranscodingtest;
-
-/*
- * Test for ApplicationMediaCapabilities in the media framework.
- *
- * To run this test suite:
-     make frameworks/base/media/tests/MediaTranscodingTest
-     make mediatranscodingtest
-
-     adb install -r testcases/mediatranscodingtest/arm64/mediatranscodingtest.apk
-
-     adb shell am instrument -e class \
-     com.android.mediatranscodingtest.ApplicationMediaCapabilitiesTest \
-     -w com.android.mediatranscodingtest/.MediaTranscodingTestRunner
- *
- */
-
-import static org.testng.Assert.assertThrows;
-
-import android.content.Context;
-import android.content.res.XmlResourceParser;
-import android.media.ApplicationMediaCapabilities;
-import android.media.MediaFeature;
-import android.media.MediaFormat;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-import android.util.Xml;
-
-import org.junit.Test;
-import org.xmlpull.v1.XmlPullParser;
-
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-
-public class ApplicationMediaCapabilitiesTest extends
-        ActivityInstrumentationTestCase2<MediaTranscodingTest> {
-    private static final String TAG = "MediaCapabilityTest";
-
-    private Context mContext;
-
-    public ApplicationMediaCapabilitiesTest() {
-        super("com.android.MediaCapabilityTest", MediaTranscodingTest.class);
-    }
-
-    public void setUp() throws Exception {
-        Log.d(TAG, "setUp");
-        super.setUp();
-
-        mContext = getInstrumentation().getContext();
-    }
-
-
-    @Test
-    public void testSetSupportHevc() throws Exception {
-        ApplicationMediaCapabilities capability =
-                new ApplicationMediaCapabilities.Builder().addSupportedVideoMimeType(
-                        MediaFormat.MIMETYPE_VIDEO_HEVC).build();
-        assertTrue(capability.isVideoMimeTypeSupported(MediaFormat.MIMETYPE_VIDEO_HEVC));
-
-        ApplicationMediaCapabilities capability2 =
-                new ApplicationMediaCapabilities.Builder().build();
-        assertFalse(capability2.isVideoMimeTypeSupported(MediaFormat.MIMETYPE_VIDEO_HEVC));
-    }
-
-    @Test
-    public void testSetSupportHdr() throws Exception {
-        ApplicationMediaCapabilities capability =
-                new ApplicationMediaCapabilities.Builder().addSupportedHdrType(
-                        MediaFeature.HdrType.HDR10_PLUS).addSupportedVideoMimeType(
-                        MediaFormat.MIMETYPE_VIDEO_HEVC).build();
-        assertEquals(true, capability.isHdrTypeSupported(MediaFeature.HdrType.HDR10_PLUS));
-    }
-
-    @Test
-    public void testSetSupportSlowMotion() throws Exception {
-        ApplicationMediaCapabilities capability =
-                new ApplicationMediaCapabilities.Builder().setSlowMotionSupported(true).build();
-        assertTrue(capability.isSlowMotionSupported());
-    }
-
-    @Test
-    public void testBuilder() throws Exception {
-        ApplicationMediaCapabilities capability =
-                new ApplicationMediaCapabilities.Builder().addSupportedVideoMimeType(
-                        MediaFormat.MIMETYPE_VIDEO_HEVC).addSupportedHdrType(
-                        MediaFeature.HdrType.HDR10_PLUS).setSlowMotionSupported(true).build();
-        assertTrue(capability.isVideoMimeTypeSupported(MediaFormat.MIMETYPE_VIDEO_HEVC));
-        assertTrue(capability.isHdrTypeSupported(MediaFeature.HdrType.HDR10_PLUS));
-        assertTrue(capability.isSlowMotionSupported());
-    }
-
-    @Test
-    public void testSupportHdrWithoutSupportHevc() throws Exception {
-        assertThrows(UnsupportedOperationException.class, () -> {
-            ApplicationMediaCapabilities capability =
-                    new ApplicationMediaCapabilities.Builder().addSupportedHdrType(
-                            MediaFeature.HdrType.HDR10_PLUS).build();
-        });
-    }
-
-    //   Test read the application's xml from res/xml folder using the XmlResourceParser.
-    //    <format android:name="HEVC" supported="true"/>
-    //    <format android:name="HDR10" supported="false"/>
-    //    <format android:name="SlowMotion" supported="false"/>
-    @Test
-    public void testReadMediaCapabilitiesXml() throws Exception {
-        XmlResourceParser parser = mContext.getResources().getXml(R.xml.mediacapabilities);
-        ApplicationMediaCapabilities capability = ApplicationMediaCapabilities.createFromXml(
-                parser);
-        assertFalse(capability.isHdrTypeSupported(MediaFeature.HdrType.HDR10));
-        assertFalse(capability.isSlowMotionSupported());
-        assertTrue(capability.isVideoMimeTypeSupported(MediaFormat.MIMETYPE_VIDEO_HEVC));
-    }
-
-    //   Test read the application's xml from res/xml folder using the XmlResourceParser.
-    //    <format android:name="HEVC" supported="true"/>
-    //    <format android:name="HDR10" supported="true"/>
-    //    <format android:name="HDR10Plus" supported="true"/>
-    //    <format android:name="Dolby-Vision" supported="true"/>
-    //    <format android:name="HLG" supported="true"/>
-    //    <format android:name="SlowMotion" supported="true"/>
-    @Test
-    public void testReadMediaCapabilitiesXmlWithSupportAllHdr() throws Exception {
-        InputStream xmlIs = mContext.getAssets().open("SupportAllHdr.xml");
-        final XmlPullParser parser = Xml.newPullParser();
-        parser.setInput(xmlIs, StandardCharsets.UTF_8.name());
-
-        ApplicationMediaCapabilities capability = ApplicationMediaCapabilities.createFromXml(
-                parser);
-        assertTrue(capability.isHdrTypeSupported(MediaFeature.HdrType.HDR10));
-        assertTrue(capability.isHdrTypeSupported(MediaFeature.HdrType.HDR10_PLUS));
-        assertTrue(capability.isHdrTypeSupported(MediaFeature.HdrType.DOLBY_VISION));
-        assertTrue(capability.isHdrTypeSupported(MediaFeature.HdrType.HLG));
-        assertTrue(capability.isSlowMotionSupported());
-        assertTrue(capability.isVideoMimeTypeSupported(MediaFormat.MIMETYPE_VIDEO_HEVC));
-    }
-
-    //   Test read the xml from res/assets folder using the InputStream.
-    //    <format android:name="HEVC" supported="true"/>
-    //    <format android:name="HDR10" supported="false"/>
-    //    <format android:name="SlowMotion" supported="false"/>
-    @Test
-    public void testReadFromCorrectXmlWithInputStreamInAssets() throws Exception {
-        InputStream xmlIs = mContext.getAssets().open("MediaCapabilities.xml");
-        final XmlPullParser parser = Xml.newPullParser();
-        parser.setInput(xmlIs, StandardCharsets.UTF_8.name());
-
-        ApplicationMediaCapabilities capability = ApplicationMediaCapabilities.createFromXml(
-                parser);
-        assertFalse(capability.isHdrTypeSupported(MediaFeature.HdrType.HDR10));
-        assertFalse(capability.isSlowMotionSupported());
-        assertTrue(capability.isVideoMimeTypeSupported(MediaFormat.MIMETYPE_VIDEO_HEVC));
-    }
-
-    // Test parsing invalid xml with wrong tag expect UnsupportedOperationException
-    // MediaCapability does not match MediaCapabilities at the end which will lead to
-    // exception with "Ill-formatted xml file"
-    // <MediaCapability xmlns:android="http://schemas.android.com/apk/res/android">
-    //    <format android:name="HEVC" supported="true"/>
-    //    <format android:name="HDR10" supported="true"/>
-    //    <format android:name="SlowMotion" supported="true"/>
-    // </MediaCapabilities>
-    @Test
-    public void testReadFromWrongMediaCapabilityXml() throws Exception {
-        assertThrows(UnsupportedOperationException.class, () -> {
-            InputStream xmlIs = mContext.getAssets().open("WrongMediaCapabilityTag.xml");
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(xmlIs, StandardCharsets.UTF_8.name());
-            ApplicationMediaCapabilities capability = ApplicationMediaCapabilities.createFromXml(
-                    parser);
-        });
-    }
-
-    // Test invalid xml with wrong tag expect UnsupportedOperationException
-    // MediaCapability is wrong tag.
-    // <MediaCapability xmlns:android="http://schemas.android.com/apk/res/android">
-    //    <format android:name="HEVC" supported="true"/>
-    //    <format android:name="HDR10" supported="true"/>
-    //    <format android:name="SlowMotion" supported="true"/>
-    // </MediaCapability>
-    @Test
-    public void testReadFromWrongMediaCapabilityXml2() throws Exception {
-        assertThrows(UnsupportedOperationException.class, () -> {
-            InputStream xmlIs = mContext.getAssets().open("WrongMediaCapabilityTag2.xml");
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(xmlIs, StandardCharsets.UTF_8.name());
-            ApplicationMediaCapabilities capability = ApplicationMediaCapabilities.createFromXml(
-                    parser);
-        });
-    }
-
-    // Test invalid attribute value of "support" with true->yes expect UnsupportedOperationException
-    // <MediaCapabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    //    <format android:name="HEVC" supported="yes"/>
-    //    <format android:name="HDR10" supported="false"/>
-    //    <format android:name="SlowMotion" supported="false"/>
-    // </MediaCapabilities>
-    @Test
-    public void testReadFromXmlWithWrongBoolean() throws Exception {
-        assertThrows(UnsupportedOperationException.class, () -> {
-            InputStream xmlIs = mContext.getAssets().open("WrongBooleanValue.xml");
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(xmlIs, StandardCharsets.UTF_8.name());
-            ApplicationMediaCapabilities capability = ApplicationMediaCapabilities.createFromXml(
-                    parser);
-        });
-    }
-
-    // Test parsing capabilities that support HDR10 but not support HEVC.
-    // Expect UnsupportedOperationException
-    // <MediaCapability xmlns:android="http://schemas.android.com/apk/res/android">
-    //    <format android:name="HDR10" supported="true"/>
-    //    <format android:name="SlowMotion" supported="false"/>
-    // </MediaCapabilities>
-    @Test
-    public void testReadXmlSupportHdrWithoutSupportHevc() throws Exception {
-        assertThrows(UnsupportedOperationException.class, () -> {
-            InputStream xmlIs = mContext.getAssets().open("SupportHdrWithoutHevc.xml");
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(xmlIs, StandardCharsets.UTF_8.name());
-            ApplicationMediaCapabilities capability = ApplicationMediaCapabilities.createFromXml(
-                    parser);
-        });
-    }
-
-    // Test parsing capabilities that has conflicted supported value.
-    // Expect UnsupportedOperationException
-    // <media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    //     <format android:name="HEVC" supported="true"/>
-    //     <format android:name="HEVC" supported="false"/>
-    // </media-capabilities>
-    @Test
-    public void testReadXmlConflictSupportedValue() throws Exception {
-        assertThrows(UnsupportedOperationException.class, () -> {
-            InputStream xmlIs = mContext.getAssets().open("ConflictSupportedValue.xml");
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(xmlIs, StandardCharsets.UTF_8.name());
-            ApplicationMediaCapabilities capability = ApplicationMediaCapabilities.createFromXml(
-                    parser);
-        });
-    }
-
-    // Test parsing capabilities that has empty format.
-    // Expect UnsupportedOperationException
-    // <media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    //     <format/>
-    // </media-capabilities>
-    @Test
-    public void testReadXmlWithEmptyFormat() throws Exception {
-        assertThrows(UnsupportedOperationException.class, () -> {
-            InputStream xmlIs = mContext.getAssets().open("EmptyFormat.xml");
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(xmlIs, StandardCharsets.UTF_8.name());
-            ApplicationMediaCapabilities capability = ApplicationMediaCapabilities.createFromXml(
-                    parser);
-        });
-    }
-
-    // Test parsing capabilities that has empty format.
-    // Expect UnsupportedOperationException
-    // <media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    //     <format android:name="HEVC"/>
-    // </media-capabilities>
-    @Test
-    public void testReadXmlFormatWithoutSupported() throws Exception {
-        assertThrows(UnsupportedOperationException.class, () -> {
-            InputStream xmlIs = mContext.getAssets().open("FormatWithoutSupported.xml");
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(xmlIs, StandardCharsets.UTF_8.name());
-            ApplicationMediaCapabilities capability = ApplicationMediaCapabilities.createFromXml(
-                    parser);
-        });
-    }
-
-    // Test parsing capabilities that has supported without the format name.
-    // Expect UnsupportedOperationException
-    // <media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
-    //     <format supported="true"/>
-    // </media-capabilities>
-    @Test
-    public void testReadXmlSupportedWithoutFormat() throws Exception {
-        assertThrows(UnsupportedOperationException.class, () -> {
-            InputStream xmlIs = mContext.getAssets().open("SupportedWithoutFormat.xml");
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(xmlIs, StandardCharsets.UTF_8.name());
-            ApplicationMediaCapabilities capability = ApplicationMediaCapabilities.createFromXml(
-                    parser);
-        });
-    }
-}
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerDiedTest.java b/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerDiedTest.java
deleted file mode 100644
index 7c9842b..0000000
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerDiedTest.java
+++ /dev/null
@@ -1,284 +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.mediatranscodingtest;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.media.MediaFormat;
-import android.media.MediaTranscodeManager;
-import android.media.MediaTranscodeManager.TranscodingRequest;
-import android.media.MediaTranscodeManager.TranscodingSession;
-import android.media.MediaTranscodingException;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.FileUtils;
-import android.os.ParcelFileDescriptor;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.uiautomator.UiDevice;
-
-import org.junit.Test;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/*
- * Service died tests for MediaTranscodeManager in the media framework.
- *
- * To run this test suite:
-     make frameworks/base/media/tests/MediaTranscodingTest
-     make mediatranscodingtest
-
-     adb install -r testcases/mediatranscodingtest/arm64/mediatranscodingtest.apk
-
-     adb shell am instrument -e class \
-     com.android.mediatranscodingtest.MediaTranscodeManagerDiedTest \
-     -w com.android.mediatranscodingtest/.MediaTranscodingTestRunner
- *
- */
-public class MediaTranscodeManagerDiedTest
-        extends ActivityInstrumentationTestCase2<MediaTranscodingTest> {
-    private static final String TAG = "MediaTranscodeManagerDiedTest";
-    /** The time to wait for the transcode operation to complete before failing the test. */
-    private static final int TRANSCODE_TIMEOUT_SECONDS = 10;
-
-    /** Maximum number of retry to connect to the service. */
-    private static final int CONNECT_SERVICE_RETRY_COUNT = 100;
-
-    /** Interval between trying to reconnect to the service. */
-    private static final int INTERVAL_CONNECT_SERVICE_RETRY_MS = 40;
-
-    private Context mContext;
-    private MediaTranscodeManager mMediaTranscodeManager = null;
-    private Uri mSourceHEVCVideoUri = null;
-    private Uri mSourceAVCVideoUri = null;
-    private Uri mDestinationUri = null;
-
-    // Setting for transcoding to H.264.
-    private static final String MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_AVC;
-    private static final int BIT_RATE = 20000000;            // 20Mbps
-    private static final int WIDTH = 1920;
-    private static final int HEIGHT = 1080;
-
-    public MediaTranscodeManagerDiedTest() {
-        super("com.android.MediaTranscodeManagerTest", MediaTranscodingTest.class);
-    }
-
-    // Copy the resource to cache.
-    private Uri resourceToUri(Context context, int resId, String name) throws IOException {
-        Uri resUri = new Uri.Builder()
-                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
-                .authority(context.getResources().getResourcePackageName(resId))
-                .appendPath(context.getResources().getResourceTypeName(resId))
-                .appendPath(context.getResources().getResourceEntryName(resId))
-                .build();
-
-        Uri cacheUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
-                + mContext.getCacheDir().getAbsolutePath() + "/" + name);
-
-        InputStream is = mContext.getResources().openRawResource(resId);
-        OutputStream os = mContext.getContentResolver().openOutputStream(cacheUri);
-
-        FileUtils.copy(is, os);
-
-        return cacheUri;
-    }
-
-    private static Uri generateNewUri(Context context, String filename) {
-        File outFile = new File(context.getExternalCacheDir(), filename);
-        return Uri.fromFile(outFile);
-    }
-
-    /**
-     * Creates a MediaFormat with the basic set of values.
-     */
-    private static MediaFormat createMediaFormat() {
-        MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, WIDTH, HEIGHT);
-        format.setInteger(MediaFormat.KEY_BIT_RATE, BIT_RATE);
-        return format;
-    }
-
-    private MediaTranscodeManager getManager() {
-        for (int count = 1; count <= CONNECT_SERVICE_RETRY_COUNT; count++) {
-            Log.d(TAG, "Trying to connect to service. Try count: " + count);
-            MediaTranscodeManager manager = mContext.getSystemService(MediaTranscodeManager.class);
-            if (manager != null) {
-                return manager;
-            }
-            try {
-                // Sleep a bit before retry.
-                Thread.sleep(INTERVAL_CONNECT_SERVICE_RETRY_MS);
-            } catch (InterruptedException ie) {
-                /* ignore */
-            }
-        }
-
-        throw new UnsupportedOperationException("Failed to acquire MediaTranscodeManager");
-    }
-
-    @Override
-    public void setUp() throws Exception {
-        Log.d(TAG, "setUp");
-        super.setUp();
-
-        mContext = getInstrumentation().getContext();
-        mMediaTranscodeManager = getManager();
-        assertNotNull(mMediaTranscodeManager);
-        androidx.test.InstrumentationRegistry.registerInstance(getInstrumentation(), new Bundle());
-
-        // Setup source HEVC file uri.
-        mSourceHEVCVideoUri = resourceToUri(mContext, R.raw.VideoOnlyHEVC, "VideoOnlyHEVC.mp4");
-
-        // Setup source AVC file uri.
-        mSourceAVCVideoUri = resourceToUri(mContext, R.raw.VideoOnlyAVC,
-                "VideoOnlyAVC.mp4");
-
-        // Setup destination file.
-        mDestinationUri = generateNewUri(mContext, "transcoded.mp4");
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    // [[ $(adb shell whoami) == "root" ]]
-    private boolean checkIfRoot() {
-        try (ParcelFileDescriptor result = getInstrumentation().getUiAutomation()
-                .executeShellCommand("whoami");
-             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(
-                     new FileInputStream(result.getFileDescriptor())))) {
-            String line;
-            while ((line = bufferedReader.readLine()) != null) {
-                if (line.contains("root")) {
-                    return true;
-                }
-            }
-        } catch (IOException ie) {
-            return false;
-        }
-        return false;
-    }
-
-    private String executeShellCommand(String cmd) throws Exception {
-        return UiDevice.getInstance(
-                InstrumentationRegistry.getInstrumentation()).executeShellCommand(cmd);
-    }
-
-    @Test
-    public void testHandleTranscoderServiceDied() throws Exception {
-        if (!checkIfRoot()) {
-            throw new AssertionError("must be root to run this test; try adb root?");
-        }
-
-        Semaphore transcodeCompleteSemaphore = new Semaphore(0);
-        Semaphore sessionStartedSemaphore = new Semaphore(0);
-
-        // Transcode a 15 seconds video, so that the transcoding is not finished when we kill the
-        // service.
-        Uri srcUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
-                + mContext.getCacheDir().getAbsolutePath() + "/longtest_15s.mp4");
-        Uri destinationUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
-                + mContext.getCacheDir().getAbsolutePath() + "/HevcTranscode.mp4");
-
-        TranscodingRequest request =
-                new TranscodingRequest.Builder()
-                        .setSourceUri(mSourceHEVCVideoUri)
-                        .setDestinationUri(destinationUri)
-                        .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-                        .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                        .setVideoTrackFormat(createMediaFormat())
-                        .build();
-        Executor listenerExecutor = Executors.newSingleThreadExecutor();
-
-        Log.i(TAG, "transcoding to " + createMediaFormat());
-
-        TranscodingSession session = mMediaTranscodeManager.enqueueRequest(request,
-                listenerExecutor,
-                TranscodingSession -> {
-                    Log.d(TAG,
-                            "Transcoding completed with result: " + TranscodingSession.getResult());
-                    transcodeCompleteSemaphore.release();
-                });
-        assertNotNull(session);
-
-        AtomicInteger progressUpdateCount = new AtomicInteger(0);
-
-        // Set progress update executor and use the same executor as result listener.
-        session.setOnProgressUpdateListener(listenerExecutor,
-                new TranscodingSession.OnProgressUpdateListener() {
-                    @Override
-                    public void onProgressUpdate(TranscodingSession session, int newProgress) {
-                        if (newProgress > 0) {
-                            sessionStartedSemaphore.release();
-                        }
-                    }
-                });
-
-        // Wait for progress update so the session is in running state.
-        sessionStartedSemaphore.tryAcquire(TRANSCODE_TIMEOUT_SECONDS, TimeUnit.SECONDS);
-        assertTrue("session is not running",
-                session.getStatus() == TranscodingSession.STATUS_RUNNING);
-
-        // Kills the service and expects receiving failure of the session.
-        executeShellCommand("pkill -f media.transcoding");
-
-        Log.d(TAG, "testMediaTranscodeManager - Waiting for transcode result.");
-        boolean finishedOnTime = transcodeCompleteSemaphore.tryAcquire(
-                TRANSCODE_TIMEOUT_SECONDS, TimeUnit.SECONDS);
-        assertTrue("Invalid session status",
-                session.getStatus() == TranscodingSession.STATUS_FINISHED);
-        assertTrue("Invalid session result",
-                session.getResult() == TranscodingSession.RESULT_ERROR);
-
-
-        boolean retrysession = false;
-        // Wait till service is available again.
-        Log.d(TAG, "Retry the failed transcoding session");
-        while (!retrysession) {
-            try {
-                session.retry();
-                // Break out when session retry succeeds.
-                break;
-            } catch (MediaTranscodingException.ServiceNotAvailableException ex) {
-                // Sleep for 10 milliseconds to wait.
-                Thread.sleep(10);
-            }
-        }
-
-        finishedOnTime = transcodeCompleteSemaphore.tryAcquire(
-                TRANSCODE_TIMEOUT_SECONDS, TimeUnit.SECONDS);
-        // Check the make sure session is successfully finished after retry.
-        assertTrue("Invalid session status",
-                session.getStatus() == TranscodingSession.STATUS_FINISHED);
-        assertTrue("Invalid session result",
-                session.getResult() == TranscodingSession.RESULT_SUCCESS);
-    }
-}
-
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerTest.java b/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerTest.java
deleted file mode 100644
index 8231988..0000000
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerTest.java
+++ /dev/null
@@ -1,649 +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.mediatranscodingtest;
-
-import static org.testng.Assert.assertThrows;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.media.ApplicationMediaCapabilities;
-import android.media.MediaFormat;
-import android.media.MediaTranscodeManager;
-import android.media.MediaTranscodeManager.TranscodingRequest;
-import android.media.MediaTranscodeManager.TranscodingRequest.MediaFormatResolver;
-import android.media.MediaTranscodeManager.TranscodingSession;
-import android.media.TranscodingTestConfig;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.FileUtils;
-import android.os.ParcelFileDescriptor;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.uiautomator.UiDevice;
-
-import org.junit.Test;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/*
- * Functional tests for MediaTranscodeManager in the media framework.
- * The test uses actual media.Transcoding service as backend to fully
- * test the API functionality.
- *
- * To run this test suite:
-     make frameworks/base/media/tests/MediaTranscodingTest
-     make mediatranscodingtest
-
-     adb install -r testcases/mediatranscodingtest/arm64/mediatranscodingtest.apk
-
-     adb shell am instrument -e class \
-     com.android.mediatranscodingtest.MediaTranscodeManagerTest \
-     -w com.android.mediatranscodingtest/.MediaTranscodingTestRunner
- *
- */
-public class MediaTranscodeManagerTest
-        extends ActivityInstrumentationTestCase2<MediaTranscodingTest> {
-    private static final String TAG = "MediaTranscodeManagerTest";
-    /** The time to wait for the transcode operation to complete before failing the test. */
-    private static final int TRANSCODE_TIMEOUT_SECONDS = 10;
-
-    /** Maximum number of retry to connect to the service. */
-    private static final int CONNECT_SERVICE_RETRY_COUNT = 100;
-
-    /** Interval between trying to reconnect to the service. */
-    private static final int INTERVAL_CONNECT_SERVICE_RETRY_MS = 40;
-
-    private Context mContext;
-    private MediaTranscodeManager mMediaTranscodeManager = null;
-    private Uri mSourceHEVCVideoUri = null;
-    private Uri mSourceAVCVideoUri = null;
-    private Uri mDestinationUri = null;
-
-    // Setting for transcoding to H.264.
-    private static final String MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_AVC;
-    private static final int BIT_RATE = 20000000;            // 20Mbps
-    private static final int WIDTH = 1920;
-    private static final int HEIGHT = 1080;
-
-    // Threshold for the psnr to make sure the transcoded video is sane.
-    private static final int PSNR_THRESHOLD = 20;
-
-    public MediaTranscodeManagerTest() {
-        super("com.android.MediaTranscodeManagerTest", MediaTranscodingTest.class);
-    }
-
-
-    // Copy the resource to cache.
-    private Uri resourceToUri(Context context, int resId, String name) throws IOException {
-        Uri resUri = new Uri.Builder()
-                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
-                .authority(context.getResources().getResourcePackageName(resId))
-                .appendPath(context.getResources().getResourceTypeName(resId))
-                .appendPath(context.getResources().getResourceEntryName(resId))
-                .build();
-
-        Uri cacheUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
-                + mContext.getCacheDir().getAbsolutePath() + "/" + name);
-
-        InputStream is = mContext.getResources().openRawResource(resId);
-        OutputStream os = mContext.getContentResolver().openOutputStream(cacheUri);
-
-        FileUtils.copy(is, os);
-
-        return cacheUri;
-    }
-
-    private static Uri generateNewUri(Context context, String filename) {
-        File outFile = new File(context.getExternalCacheDir(), filename);
-        return Uri.fromFile(outFile);
-    }
-
-    // Generates a invalid uri which will let the mock service return transcoding failure.
-    private static Uri generateInvalidTranscodingUri(Context context) {
-        File outFile = new File(context.getExternalCacheDir(), "InvalidUri.mp4");
-        return Uri.fromFile(outFile);
-    }
-
-    /**
-     * Creates a MediaFormat with the basic set of values.
-     */
-    private static MediaFormat createMediaFormat() {
-        MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, WIDTH, HEIGHT);
-        format.setInteger(MediaFormat.KEY_BIT_RATE, BIT_RATE);
-        return format;
-    }
-
-    private MediaTranscodeManager getManager() {
-        for (int count = 1; count <= CONNECT_SERVICE_RETRY_COUNT; count++) {
-            Log.d(TAG, "Trying to connect to service. Try count: " + count);
-            MediaTranscodeManager manager = mContext.getSystemService(MediaTranscodeManager.class);
-            if (manager != null) {
-                return manager;
-            }
-            try {
-                // Sleep a bit before retry.
-                Thread.sleep(INTERVAL_CONNECT_SERVICE_RETRY_MS);
-            } catch (InterruptedException ie) {
-                /* ignore */
-            }
-        }
-
-        throw new UnsupportedOperationException("Failed to acquire MediaTranscodeManager");
-    }
-
-    @Override
-    public void setUp() throws Exception {
-        Log.d(TAG, "setUp");
-        super.setUp();
-
-        mContext = getInstrumentation().getContext();
-        mMediaTranscodeManager = getManager();
-        assertNotNull(mMediaTranscodeManager);
-        androidx.test.InstrumentationRegistry.registerInstance(getInstrumentation(), new Bundle());
-
-        // Setup source HEVC file uri.
-        mSourceHEVCVideoUri = resourceToUri(mContext, R.raw.VideoOnlyHEVC, "VideoOnlyHEVC.mp4");
-
-        // Setup source AVC file uri.
-        mSourceAVCVideoUri = resourceToUri(mContext, R.raw.VideoOnlyAVC,
-                "VideoOnlyAVC.mp4");
-
-        // Setup destination file.
-        mDestinationUri = generateNewUri(mContext, "transcoded.mp4");
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-
-    /**
-     * Verify that setting null destination uri will throw exception.
-     */
-    @Test
-    public void testCreateTranscodingRequestWithNullDestinationUri() throws Exception {
-        assertThrows(IllegalArgumentException.class, () -> {
-            TranscodingRequest request =
-                    new TranscodingRequest.Builder()
-                            .setSourceUri(mSourceHEVCVideoUri)
-                            .setDestinationUri(null)
-                            .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-                            .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                            .setVideoTrackFormat(createMediaFormat())
-                            .build();
-        });
-    }
-
-    /**
-     * Verify that setting invalid pid will throw exception.
-     */
-    @Test
-    public void testCreateTranscodingWithInvalidClientPid() throws Exception {
-        assertThrows(IllegalArgumentException.class, () -> {
-            TranscodingRequest request =
-                    new TranscodingRequest.Builder()
-                            .setSourceUri(mSourceHEVCVideoUri)
-                            .setDestinationUri(mDestinationUri)
-                            .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-                            .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                            .setClientPid(-1)
-                            .setVideoTrackFormat(createMediaFormat())
-                            .build();
-        });
-    }
-
-    /**
-     * Verify that setting invalid uid will throw exception.
-     */
-    @Test
-    public void testCreateTranscodingWithInvalidClientUid() throws Exception {
-        assertThrows(IllegalArgumentException.class, () -> {
-            TranscodingRequest request =
-                    new TranscodingRequest.Builder()
-                            .setSourceUri(mSourceHEVCVideoUri)
-                            .setDestinationUri(mDestinationUri)
-                            .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-                            .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                            .setClientUid(-1)
-                            .setVideoTrackFormat(createMediaFormat())
-                            .build();
-        });
-    }
-
-    /**
-     * Verify that setting null source uri will throw exception.
-     */
-    @Test
-    public void testCreateTranscodingRequestWithNullSourceUri() throws Exception {
-        assertThrows(IllegalArgumentException.class, () -> {
-            TranscodingRequest request =
-                    new TranscodingRequest.Builder()
-                            .setSourceUri(null)
-                            .setDestinationUri(mDestinationUri)
-                            .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                            .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-                            .build();
-        });
-    }
-
-    /**
-     * Verify that not setting source uri will throw exception.
-     */
-    @Test
-    public void testCreateTranscodingRequestWithoutSourceUri() throws Exception {
-        assertThrows(UnsupportedOperationException.class, () -> {
-            TranscodingRequest request =
-                    new TranscodingRequest.Builder()
-                            .setDestinationUri(mDestinationUri)
-                            .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-                            .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                            .setVideoTrackFormat(createMediaFormat())
-                            .build();
-        });
-    }
-
-    /**
-     * Verify that not setting destination uri will throw exception.
-     */
-    @Test
-    public void testCreateTranscodingRequestWithoutDestinationUri() throws Exception {
-        assertThrows(UnsupportedOperationException.class, () -> {
-            TranscodingRequest request =
-                    new TranscodingRequest.Builder()
-                            .setSourceUri(mSourceHEVCVideoUri)
-                            .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-                            .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                            .setVideoTrackFormat(createMediaFormat())
-                            .build();
-        });
-    }
-
-    /**
-     * Verify that setting image transcoding mode will throw exception.
-     */
-    @Test
-    public void testCreateTranscodingRequestWithUnsupportedMode() throws Exception {
-        assertThrows(UnsupportedOperationException.class, () -> {
-            TranscodingRequest request =
-                    new TranscodingRequest.Builder()
-                            .setSourceUri(mSourceHEVCVideoUri)
-                            .setDestinationUri(mDestinationUri)
-                            .setType(MediaTranscodeManager.TRANSCODING_TYPE_IMAGE)
-                            .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                            .setVideoTrackFormat(createMediaFormat())
-                            .build();
-        });
-    }
-
-    /**
-     * Verify that setting video transcoding without setting video format will throw exception.
-     */
-    @Test
-    public void testCreateTranscodingRequestWithoutVideoFormat() throws Exception {
-        assertThrows(UnsupportedOperationException.class, () -> {
-            TranscodingRequest request =
-                    new TranscodingRequest.Builder()
-                            .setSourceUri(mSourceHEVCVideoUri)
-                            .setDestinationUri(mDestinationUri)
-                            .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-                            .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                            .build();
-        });
-    }
-
-    void testTranscodingWithExpectResult(Uri srcUri, Uri dstUri, int expectedResult)
-            throws Exception {
-        Semaphore transcodeCompleteSemaphore = new Semaphore(0);
-        TranscodingTestConfig testConfig = new TranscodingTestConfig();
-        testConfig.passThroughMode = true;
-        testConfig.processingTotalTimeMs = 300; // minimum time spent on transcoding.
-
-        TranscodingRequest request =
-                new TranscodingRequest.Builder()
-                        .setSourceUri(srcUri)
-                        .setDestinationUri(dstUri)
-                        .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-                        .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                        .setVideoTrackFormat(createMediaFormat())
-                        .setTestConfig(testConfig)
-                        .build();
-        Executor listenerExecutor = Executors.newSingleThreadExecutor();
-
-        TranscodingSession session = mMediaTranscodeManager.enqueueRequest(request,
-                listenerExecutor,
-                TranscodingSession -> {
-                    Log.d(TAG,
-                            "Transcoding completed with result: " + TranscodingSession.getResult());
-                    assertTrue("Transcoding should failed.",
-                            TranscodingSession.getResult() == expectedResult);
-                    transcodeCompleteSemaphore.release();
-                });
-        assertNotNull(session);
-
-        if (session != null) {
-            Log.d(TAG, "testMediaTranscodeManager - Waiting for transcode to complete.");
-            boolean finishedOnTime = transcodeCompleteSemaphore.tryAcquire(
-                    TRANSCODE_TIMEOUT_SECONDS, TimeUnit.SECONDS);
-            assertTrue("Transcode failed to complete in time.", finishedOnTime);
-        }
-
-        if (expectedResult == TranscodingSession.RESULT_SUCCESS) {
-            // Checks the destination file get generated.
-            File file = new File(dstUri.getPath());
-            assertTrue("Failed to create destination file", file.exists());
-
-            // Removes the file.
-            file.delete();
-        }
-    }
-
-    // Tests transcoding from invalid a invalid  and expects failure.
-    @Test
-    public void testTranscodingInvalidSrcUri() throws Exception {
-        Log.d(TAG, "Starting: testMediaTranscodeManager");
-
-        Uri invalidSrcUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://"
-                + mContext.getPackageName() + "/source.mp4");
-        Log.d(TAG, "Transcoding from source: " + invalidSrcUri);
-
-        // Create a file Uri: file:///data/user/0/com.android.mediatranscodingtest/cache/temp.mp4
-        // The full path of this file is:
-        // /data/user/0/com.android.mediatranscodingtest/cache/temp.mp4
-        Uri destinationUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://"
-                + mContext.getPackageName() + "/temp.mp4");
-        Log.d(TAG, "Transcoding to destination: " + destinationUri);
-
-        testTranscodingWithExpectResult(invalidSrcUri, destinationUri,
-                TranscodingSession.RESULT_ERROR);
-    }
-
-    // Tests transcoding to a uri in res folder and expects failure as we could not write to res
-    // folder.
-    @Test
-    public void testTranscodingToResFolder() throws Exception {
-        Log.d(TAG, "Starting: testMediaTranscodeManager");
-
-        // Create a file Uri: file:///data/user/0/com.android.mediatranscodingtest/cache/temp.mp4
-        // The full path of this file is:
-        // /data/user/0/com.android.mediatranscodingtest/cache/temp.mp4
-        Uri destinationUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://"
-                + mContext.getPackageName() + "/temp.mp4");
-        Log.d(TAG, "Transcoding to destination: " + destinationUri);
-
-        testTranscodingWithExpectResult(mSourceHEVCVideoUri, destinationUri,
-                TranscodingSession.RESULT_ERROR);
-    }
-
-    // Tests transcoding to a uri in internal storage folder and expects success.
-    @Test
-    public void testTranscodingToCacheDir() throws Exception {
-        Log.d(TAG, "Starting: testMediaTranscodeManager");
-
-        // Create a file Uri: file:///data/user/0/com.android.mediatranscodingtest/cache/temp.mp4
-        // The full path of this file is:
-        // /data/user/0/com.android.mediatranscodingtest/cache/temp.mp4
-        Uri destinationUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
-                + mContext.getCacheDir().getAbsolutePath() + "/temp.mp4");
-
-        testTranscodingWithExpectResult(mSourceHEVCVideoUri, destinationUri,
-                TranscodingSession.RESULT_SUCCESS);
-    }
-
-    // Tests transcoding to a uri in internal files directory and expects success.
-    @Test
-    public void testTranscodingToInternalFilesDir() throws Exception {
-        Log.d(TAG, "Starting: testMediaTranscodeManager");
-
-        // Create a file Uri:
-        // file:///storage/emulated/0/Android/data/com.android.mediatranscodingtest/files/temp.mp4
-        Uri destinationUri = Uri.fromFile(new File(mContext.getFilesDir(), "temp.mp4"));
-        Log.i(TAG, "Transcoding to files dir: " + destinationUri);
-
-        testTranscodingWithExpectResult(mSourceHEVCVideoUri, destinationUri,
-                TranscodingSession.RESULT_SUCCESS);
-    }
-
-    // Tests transcoding to a uri in external files directory and expects success.
-    @Test
-    public void testTranscodingToExternalFilesDir() throws Exception {
-        Log.d(TAG, "Starting: testMediaTranscodeManager");
-
-        // Create a file Uri: file:///data/user/0/com.android.mediatranscodingtest/files/temp.mp4
-        Uri destinationUri = Uri.fromFile(new File(mContext.getExternalFilesDir(null), "temp.mp4"));
-        Log.i(TAG, "Transcoding to files dir: " + destinationUri);
-
-        testTranscodingWithExpectResult(mSourceHEVCVideoUri, destinationUri,
-                TranscodingSession.RESULT_SUCCESS);
-    }
-
-    @Test
-    public void testTranscodingFromHevcToAvc() throws Exception {
-        Semaphore transcodeCompleteSemaphore = new Semaphore(0);
-
-        // Create a file Uri: file:///data/user/0/com.android.mediatranscodingtest/cache/temp.mp4
-        // The full path of this file is:
-        // /data/user/0/com.android.mediatranscodingtest/cache/temp.mp4
-        Uri destinationUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
-                + mContext.getCacheDir().getAbsolutePath() + "/HevcTranscode.mp4");
-
-        ApplicationMediaCapabilities clientCaps =
-                new ApplicationMediaCapabilities.Builder().build();
-        MediaFormatResolver resolver = new MediaFormatResolver()
-                .setSourceVideoFormatHint(MediaFormat.createVideoFormat(
-                        MediaFormat.MIMETYPE_VIDEO_HEVC, WIDTH, HEIGHT))
-                .setClientCapabilities(clientCaps);
-        assertTrue(resolver.shouldTranscode());
-        MediaFormat videoTrackFormat = resolver.resolveVideoFormat();
-        assertNotNull(videoTrackFormat);
-
-        int pid = android.os.Process.myPid();
-        int uid = android.os.Process.myUid();
-
-        TranscodingRequest request =
-                new TranscodingRequest.Builder()
-                        .setSourceUri(mSourceHEVCVideoUri)
-                        .setDestinationUri(destinationUri)
-                        .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-                        .setClientPid(pid)
-                        .setClientUid(uid)
-                        .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                        .setVideoTrackFormat(videoTrackFormat)
-                        .build();
-        Executor listenerExecutor = Executors.newSingleThreadExecutor();
-
-        assertEquals(pid, request.getClientPid());
-        assertEquals(uid, request.getClientUid());
-
-        Log.i(TAG, "transcoding to " + videoTrackFormat);
-
-        TranscodingSession session = mMediaTranscodeManager.enqueueRequest(request,
-                listenerExecutor,
-                TranscodingSession -> {
-                    Log.d(TAG,
-                            "Transcoding completed with result: " + TranscodingSession.getResult());
-                    assertEquals(TranscodingSession.getResult(), TranscodingSession.RESULT_SUCCESS);
-                    transcodeCompleteSemaphore.release();
-                });
-        assertNotNull(session);
-
-        if (session != null) {
-            Log.d(TAG, "testMediaTranscodeManager - Waiting for transcode to cancel.");
-            boolean finishedOnTime = transcodeCompleteSemaphore.tryAcquire(
-                    TRANSCODE_TIMEOUT_SECONDS, TimeUnit.SECONDS);
-            assertTrue("Transcode failed to complete in time.", finishedOnTime);
-        }
-
-        // TODO(hkuang): Validate the transcoded video's width and height, framerate.
-
-        // Validates the transcoded video's psnr.
-        MediaTranscodingTestUtil.VideoTranscodingStatistics stats =
-                MediaTranscodingTestUtil.computeStats(mContext, mSourceAVCVideoUri, destinationUri);
-        assertTrue("PSNR: " + stats.mAveragePSNR + " is too low",
-                stats.mAveragePSNR >= PSNR_THRESHOLD);
-    }
-
-
-    @Test
-    public void testCancelTranscoding() throws Exception {
-        Log.d(TAG, "Starting: testMediaTranscodeManager");
-        Semaphore transcodeCompleteSemaphore = new Semaphore(0);
-
-        // Transcode a 15 seconds video, so that the transcoding is not finished when we cancel.
-        Uri srcUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
-                + mContext.getCacheDir().getAbsolutePath() + "/longtest_15s.mp4");
-        Uri destinationUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
-                + mContext.getCacheDir().getAbsolutePath() + "/HevcTranscode.mp4");
-
-        TranscodingRequest request =
-                new TranscodingRequest.Builder()
-                        .setSourceUri(srcUri)
-                        .setDestinationUri(destinationUri)
-                        .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-                        .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                        .setVideoTrackFormat(createMediaFormat())
-                        .build();
-        Executor listenerExecutor = Executors.newSingleThreadExecutor();
-
-        TranscodingSession session = mMediaTranscodeManager.enqueueRequest(request,
-                listenerExecutor,
-                TranscodingSession -> {
-                    Log.d(TAG,
-                            "Transcoding completed with result: " + TranscodingSession.getResult());
-                    assertEquals(TranscodingSession.getResult(),
-                            TranscodingSession.RESULT_CANCELED);
-                    transcodeCompleteSemaphore.release();
-                });
-        assertNotNull(session);
-
-        // TODO(hkuang): Wait for progress update before calling cancel to make sure transcoding is
-        // started.
-
-        session.cancel();
-        Log.d(TAG, "testMediaTranscodeManager - Waiting for transcode to cancel.");
-        boolean finishedOnTime = transcodeCompleteSemaphore.tryAcquire(
-                30, TimeUnit.MILLISECONDS);
-        assertTrue("Fails to cancel transcoding", finishedOnTime);
-    }
-
-
-    @Test
-    public void testTranscodingProgressUpdate() throws Exception {
-        Log.d(TAG, "Starting: testMediaTranscodeManager");
-
-        Semaphore transcodeCompleteSemaphore = new Semaphore(0);
-        final CountDownLatch statusLatch = new CountDownLatch(1);
-
-        // Create a file Uri: file:///data/user/0/com.android.mediatranscodingtest/cache/temp.mp4
-        // The full path of this file is:
-        // /data/user/0/com.android.mediatranscodingtest/cache/temp.mp4
-        Uri destinationUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
-                + mContext.getCacheDir().getAbsolutePath() + "/HevcTranscode.mp4");
-
-        TranscodingRequest request =
-                new TranscodingRequest.Builder()
-                        .setSourceUri(mSourceHEVCVideoUri)
-                        .setDestinationUri(destinationUri)
-                        .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-                        .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                        .setVideoTrackFormat(createMediaFormat())
-                        .build();
-        Executor listenerExecutor = Executors.newSingleThreadExecutor();
-
-        Log.i(TAG, "transcoding to " + createMediaFormat());
-
-        TranscodingSession session = mMediaTranscodeManager.enqueueRequest(request,
-                listenerExecutor,
-                TranscodingSession -> {
-                    Log.d(TAG,
-                            "Transcoding completed with result: " + TranscodingSession.getResult());
-                    assertEquals(TranscodingSession.getResult(), TranscodingSession.RESULT_SUCCESS);
-                    transcodeCompleteSemaphore.release();
-                });
-        assertNotNull(session);
-
-        AtomicInteger progressUpdateCount = new AtomicInteger(0);
-
-        // Set progress update executor and use the same executor as result listener.
-        session.setOnProgressUpdateListener(listenerExecutor,
-                new TranscodingSession.OnProgressUpdateListener() {
-                    int mPreviousProgress = 0;
-
-                    @Override
-                    public void onProgressUpdate(TranscodingSession session, int newProgress) {
-                        assertTrue("Invalid proress update", newProgress > mPreviousProgress);
-                        assertTrue("Invalid proress update", newProgress <= 100);
-                        if (newProgress > 0) {
-                            statusLatch.countDown();
-                        }
-                        mPreviousProgress = newProgress;
-                        progressUpdateCount.getAndIncrement();
-                        Log.i(TAG, "Get progress update " + newProgress);
-                    }
-                });
-
-        try {
-            statusLatch.await();
-            // The transcoding should not be finished yet as the clip is long.
-            assertTrue("Invalid status", session.getStatus() == TranscodingSession.STATUS_RUNNING);
-        } catch (InterruptedException e) {
-        }
-
-        Log.d(TAG, "testMediaTranscodeManager - Waiting for transcode to cancel.");
-        boolean finishedOnTime = transcodeCompleteSemaphore.tryAcquire(
-                TRANSCODE_TIMEOUT_SECONDS, TimeUnit.SECONDS);
-        assertTrue("Transcode failed to complete in time.", finishedOnTime);
-        assertTrue("Failed to receive at least 10 progress updates",
-                progressUpdateCount.get() > 10);
-    }
-
-    // [[ $(adb shell whoami) == "root" ]]
-    private boolean checkIfRoot() throws IOException {
-        try (ParcelFileDescriptor result = getInstrumentation().getUiAutomation()
-                .executeShellCommand("whoami");
-             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(
-                     new FileInputStream(result.getFileDescriptor())))) {
-            String line;
-            while ((line = bufferedReader.readLine()) != null) {
-                if (line.contains("root")) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    private String executeShellCommand(String cmd) throws Exception {
-        return UiDevice.getInstance(
-                InstrumentationRegistry.getInstrumentation()).executeShellCommand(cmd);
-    }
-}
-
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodingBenchmark.java b/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodingBenchmark.java
deleted file mode 100644
index b152450..0000000
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodingBenchmark.java
+++ /dev/null
@@ -1,324 +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.mediatranscodingtest;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.media.MediaFormat;
-import android.media.MediaTranscodeManager;
-import android.media.MediaTranscodeManager.TranscodingRequest;
-import android.media.MediaTranscodeManager.TranscodingSession;
-import android.media.MediaTranscodingException;
-import android.net.Uri;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-
-import org.junit.Test;
-
-import java.io.IOException;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-
-/*
- * Benchmarking for MediaTranscodeManager in the media framework.
- *
- * Note: This benchmarking requires to push all the files from http://go/transcodingbenchmark
- * to /data/user/0/com.android.mediatranscodingtest/cache/ directory after installing the apk.
- *
- * TODO(hkuang): Change it to download from server automatically instead of manually.
- *
- * To run this test suite:
-     make frameworks/base/media/tests/MediaTranscodingTest
-     make mediatranscodingtest
-
-     adb install -r testcases/mediatranscodingtest/arm64/mediatranscodingtest.apk
-      // Push the files to /data/user/0/com.android.mediatranscodingtest/cache/
-     adb push $DOWNLOADPATH/*.mp4 /data/user/0/com.android.mediatranscodingtest/cache/
-
-     adb shell am instrument -e class \
-     com.android.mediatranscodingtest.MediaTranscodingBenchmark \
-     -w com.android.mediatranscodingtest/.MediaTranscodingTestRunner
- *
- */
-public class MediaTranscodingBenchmark
-        extends ActivityInstrumentationTestCase2<MediaTranscodingTest> {
-    private static final String TAG = "MediaTranscodingBenchmark";
-    // TODO(hkuang): Change this to query from MediaCodecInfo.CodecCapabilities for different
-    // resolution.
-    private static final int MINIMUM_TRANSCODING_FPS = 80;
-    private static final int LOOP_COUNT = 3;
-    // Default Setting for transcoding to H.264.
-    private static final String MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_AVC;
-    private static final int BIT_RATE = 20000000;            // 20Mbps
-    private static final int WIDTH = 1920;
-    private static final int HEIGHT = 1080;
-    private Context mContext;
-    private MediaTranscodeManager mMediaTranscodeManager = null;
-
-    public MediaTranscodingBenchmark() {
-        super("com.android.MediaTranscodingBenchmark", MediaTranscodingTest.class);
-    }
-
-    /**
-     * Creates a MediaFormat with the basic set of values.
-     */
-    private static MediaFormat createMediaFormat() {
-        MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, WIDTH, HEIGHT);
-        format.setInteger(MediaFormat.KEY_BIT_RATE, BIT_RATE);
-        return format;
-    }
-
-    @Override
-    public void setUp() throws Exception {
-        Log.d(TAG, "setUp");
-        super.setUp();
-        mContext = getInstrumentation().getContext();
-        mMediaTranscodeManager = mContext.getSystemService(MediaTranscodeManager.class);
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    /*
-     * Transcode the sourceFileName to destinationFileName with LOOP_COUNT.
-     */
-    private void transcode(final String sourceFileName, final String destinationFileName)
-            throws IOException, InterruptedException,
-            MediaTranscodingException.ServiceNotAvailableException {
-        AtomicLong totalTimeMs = new AtomicLong();
-        AtomicLong transcodingTime = new AtomicLong();
-        Uri srcUri = getUri(sourceFileName);
-        Uri dstUri = getUri(destinationFileName);
-
-        MediaTranscodingTestUtil.VideoFileInfo info =
-                MediaTranscodingTestUtil.extractVideoFileInfo(mContext, getUri(sourceFileName));
-
-        int timeoutSeconds = calMaxTranscodingWaitTimeSeconds(info.mNumVideoFrames,
-                MINIMUM_TRANSCODING_FPS);
-        Log.d(TAG, "Start Transcoding " + info.toString() + " " + timeoutSeconds);
-
-        for (int loop = 0; loop < LOOP_COUNT; ++loop) {
-            Semaphore transcodeCompleteSemaphore = new Semaphore(0);
-            TranscodingRequest request =
-                    new TranscodingRequest.Builder()
-                            .setSourceUri(srcUri)
-                            .setDestinationUri(dstUri)
-                            .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
-                            .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
-                            .setVideoTrackFormat(createMediaFormat())
-                            .build();
-            Executor listenerExecutor = Executors.newSingleThreadExecutor();
-
-            long startTimeMs = System.currentTimeMillis();
-            TranscodingSession session = mMediaTranscodeManager.enqueueRequest(request,
-                    listenerExecutor,
-                    TranscodingSession -> {
-                        Log.d(TAG,
-                                "Transcoding completed with result: "
-                                        + TranscodingSession.getResult());
-                        assertEquals(TranscodingSession.getResult(),
-                                TranscodingSession.RESULT_SUCCESS);
-                        transcodingTime.set(System.currentTimeMillis() - startTimeMs);
-                        totalTimeMs.addAndGet(transcodingTime.get());
-                        transcodeCompleteSemaphore.release();
-                    });
-
-            if (session != null) {
-                Log.d(TAG, "testMediaTranscodeManager - Waiting for transcode to complete.");
-                boolean finishedOnTime = transcodeCompleteSemaphore.tryAcquire(
-                        timeoutSeconds, TimeUnit.SECONDS);
-                assertTrue("Transcode failed to complete in time.", finishedOnTime);
-            }
-            Log.i(TAG, "Loop: " + loop + " take " + transcodingTime.get() + " ms ");
-        }
-
-        float fps = info.mNumVideoFrames * 1000 * LOOP_COUNT / totalTimeMs.get();
-        Log.i(TAG, "Transcoding " + info.toString() + " Transcoding fps: " + fps);
-    }
-
-    // Calculate the maximum wait time based on minimum transcoding throughput and frame number.
-    private int calMaxTranscodingWaitTimeSeconds(int numberFrames, int minTranscodingFps) {
-        float waitTime = (float) numberFrames / (float) minTranscodingFps;
-        // If waitTimeSeconds is 0, wait for 1 second at least.
-        int waitTimeSeconds = (int) Math.ceil(waitTime);
-        return waitTimeSeconds == 0 ? 1 : waitTimeSeconds;
-    }
-
-    private Uri getUri(final String fileName) {
-        String path = mContext.getCacheDir().getAbsolutePath();
-        return new Uri.Builder().scheme(ContentResolver.SCHEME_FILE).appendPath(path).appendPath(
-                fileName).build();
-    }
-
-    @Test
-    public void testBenchmarkingAVCToAVCWith66FramesWithoutAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_66frame_h264_22Mbps_30fps";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingAVCToAVCWith66FramesWithAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_66frame_h264_22Mbps_30fps_aac";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingAVCToAVCWith361FramesWithoutAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_361frame_h264_22Mbps_30fps";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingAVCToAVCWith361FramesWithAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_361frame_h264_22Mbps_30fps_aac";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingAVCToAVCWith943FramesWithoutAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_943frame_h264_22Mbps_30fps";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingAVCToAVCWith943FramesWithAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_943frame_h264_22Mbps_30fps_aac";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingAVCToAVCWith1822FramesWithoutAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_1822frame_h264_22Mbps_30fps";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingAVCToAVCWith1822FramesWithAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_1822frame_h264_22Mbps_30fps_aac";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingAVCToAVCWith3648FramesWithoutAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_3648frame_h264_22Mbps_30fps";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingAVCToAVCWith3648FramesWithAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_3648frame_h264_22Mbps_30fps_aac";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingAVCToAVCWith11042FramesWithoutAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_11042frame_h264_22Mbps_30fps";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingAVCToAVCWith11042FramesWithAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_11042frame_h264_22Mbps_30fps_aac";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingHEVCToAVCWith107FramesWithoutAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_107frame_hevc_4Mbps_30fps";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingHEVCToAVCWith928FramesWithoutAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_928frame_hevc_4Mbps_30fps";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingHEVCToAVCWith1863FramesWithoutAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_1863frame_hevc_4Mbps_30fps";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingHEVCToAVCWith3863FramesWithoutAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_3863frame_hevc_4Mbps_30fps";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-
-    @Test
-    public void testBenchmarkingHEVCToAVCWith9374FramesWithoutAudio() throws Exception {
-        String videoNameWithoutExtension = "video_1920x1080_9374frame_hevc_4Mbps_30fps";
-        String testVideoName = videoNameWithoutExtension + ".mp4";
-        String transcodedVideoName = videoNameWithoutExtension + "_transcode.mp4";
-
-        transcode(testVideoName, transcodedVideoName);
-    }
-}
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodingTest.java b/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodingTest.java
deleted file mode 100644
index 6f83bad..0000000
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodingTest.java
+++ /dev/null
@@ -1,47 +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.mediatranscodingtest;
-
-import android.app.Activity;
-import android.content.Context;
-import android.os.Bundle;
-import android.os.PowerManager;
-
-public class MediaTranscodingTest extends Activity {
-    private PowerManager.WakeLock mWakeLock = null;
-
-    public MediaTranscodingTest() {
-    }
-
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        setContentView(R.layout.surface_view);
-
-        //Acquire the full wake lock to keep the device up
-        PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
-        mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "MediaTranscodingTest");
-        mWakeLock.acquire();
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        mWakeLock.release();
-    }
-}
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodingTestRunner.java b/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodingTestRunner.java
deleted file mode 100644
index 76050ac..0000000
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodingTestRunner.java
+++ /dev/null
@@ -1,55 +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.mediatranscodingtest;
-
-import android.os.Bundle;
-import android.test.InstrumentationTestRunner;
-import android.test.InstrumentationTestSuite;
-
-import junit.framework.TestSuite;
-
-
-/**
- * Instrumentation Test Runner for all MediaTranscoding tests.
- *
- * Running all tests:
- *
- * adb shell am instrument \
- *  -w com.android.mediatranscodingtest/.MediaTranscodingTestRunner
- */
-
-public class MediaTranscodingTestRunner extends InstrumentationTestRunner {
-    @Override
-    public TestSuite getAllTests() {
-        TestSuite suite = new InstrumentationTestSuite(this);
-        suite.addTestSuite(MediaTranscodeManagerDiedTest.class);
-        suite.addTestSuite(ApplicationMediaCapabilitiesTest.class);
-        suite.addTestSuite(MediaTranscodeManagerTest.class);
-        suite.addTestSuite(MediaTranscodingBenchmark.class);
-        return suite;
-    }
-
-    @Override
-    public ClassLoader getLoader() {
-        return MediaTranscodingTestRunner.class.getClassLoader();
-    }
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-    }
-}
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodingTestUtil.java b/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodingTestUtil.java
deleted file mode 100644
index 69f124f..0000000
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodingTestUtil.java
+++ /dev/null
@@ -1,480 +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.mediatranscodingtest;
-
-import static org.junit.Assert.assertTrue;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.res.AssetFileDescriptor;
-import android.graphics.ImageFormat;
-import android.media.Image;
-import android.media.MediaCodec;
-import android.media.MediaCodecInfo;
-import android.media.MediaExtractor;
-import android.media.MediaFormat;
-import android.media.MediaMetadataRetriever;
-import android.net.Uri;
-import android.util.Log;
-import android.util.Size;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Locale;
-
-
-/* package */ class MediaTranscodingTestUtil {
-    private static final String TAG = "MediaTranscodingTestUtil";
-
-    // Helper class to extract the information from source file and transcoded file.
-    static class VideoFileInfo {
-        String mUri;
-        int mNumVideoFrames = 0;
-        int mWidth = 0;
-        int mHeight = 0;
-        float mVideoFrameRate = 0.0f;
-        boolean mHasAudio = false;
-
-        public String toString() {
-            String str = mUri;
-            str += " Width:" + mWidth;
-            str += " Height:" + mHeight;
-            str += " FrameRate:" + mWidth;
-            str += " FrameCount:" + mNumVideoFrames;
-            str +=  " HasAudio:" + (mHasAudio ? "Yes" : "No");
-            return str;
-        }
-    }
-
-    static VideoFileInfo extractVideoFileInfo(Context ctx, Uri videoUri) throws IOException {
-        VideoFileInfo info = new VideoFileInfo();
-        AssetFileDescriptor afd =  null;
-        MediaMetadataRetriever retriever = null;
-
-        try {
-            afd = ctx.getContentResolver().openAssetFileDescriptor(videoUri, "r");
-            retriever = new MediaMetadataRetriever();
-            retriever.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
-
-            info.mUri = videoUri.getLastPathSegment();
-            Log.i(TAG, "Trying to transcode to " + info.mUri);
-            String width = retriever.extractMetadata(
-                    MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
-            String height = retriever.extractMetadata(
-                    MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
-            if (width != null && height != null) {
-                info.mWidth = Integer.parseInt(width);
-                info.mHeight = Integer.parseInt(height);
-            }
-
-            String frameRate = retriever.extractMetadata(
-                    MediaMetadataRetriever.METADATA_KEY_CAPTURE_FRAMERATE);
-            if (frameRate != null) {
-                info.mVideoFrameRate = Float.parseFloat(frameRate);
-            }
-
-            String frameCount = retriever.extractMetadata(
-                    MediaMetadataRetriever.METADATA_KEY_VIDEO_FRAME_COUNT);
-            if (frameCount != null) {
-                info.mNumVideoFrames = Integer.parseInt(frameCount);
-            }
-
-            String hasAudio = retriever.extractMetadata(
-                    MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO);
-            if (hasAudio != null) {
-                info.mHasAudio = hasAudio.equals("yes");
-            }
-        } finally {
-            if (retriever != null) {
-                retriever.close();
-            }
-            if (afd != null) {
-                afd.close();
-            }
-        }
-        return info;
-    }
-
-    static VideoTranscodingStatistics computeStats(final Context ctx, final Uri sourceMp4,
-            final Uri transcodedMp4)
-            throws Exception {
-        // First decode the sourceMp4 to a temp yuv in yuv420p format.
-        Uri sourceYUV420PUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
-                + ctx.getCacheDir().getAbsolutePath() + "/sourceYUV420P.yuv");
-        Size sourceSize = decodeMp4ToYuv(ctx, sourceMp4, sourceYUV420PUri);
-
-        // Second decode the transcodedMp4 to a temp yuv in yuv420p format.
-        Uri transcodedYUV420PUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
-                + ctx.getCacheDir().getAbsolutePath() + "/transcodedYUV420P.yuv");
-        Size transcodedSize = decodeMp4ToYuv(ctx, transcodedMp4, transcodedYUV420PUri);
-
-        assertTrue(sourceSize.equals(transcodedSize));
-
-        // Then Compute the psnr of transcodedYUV420PUri against sourceYUV420PUri.
-        return computePsnr(ctx, sourceYUV420PUri, transcodedYUV420PUri, sourceSize.getWidth(),
-                transcodedSize.getHeight());
-    }
-
-    private static Size decodeMp4ToYuv(final Context ctx, final Uri fileUri, final Uri yuvUri)
-            throws Exception {
-        AssetFileDescriptor fileFd = null;
-        MediaExtractor extractor = null;
-        MediaCodec codec = null;
-        AssetFileDescriptor yuvFd = null;
-        FileOutputStream out = null;
-        int width = 0;
-        int height = 0;
-
-        try {
-            fileFd = ctx.getContentResolver().openAssetFileDescriptor(fileUri,"r");
-            extractor = new MediaExtractor();
-            extractor.setDataSource(fileFd.getFileDescriptor(), fileFd.getStartOffset(),
-                    fileFd.getLength());
-
-            // Selects the video track.
-            int trackCount = extractor.getTrackCount();
-            if (trackCount <= 0) {
-                throw new IllegalArgumentException("Invalid mp4 file");
-            }
-            int videoTrackIndex = -1;
-            for (int i = 0; i < trackCount; i++) {
-                extractor.selectTrack(i);
-                MediaFormat format = extractor.getTrackFormat(i);
-                if (format.getString(MediaFormat.KEY_MIME).startsWith("video/")) {
-                    videoTrackIndex = i;
-                    break;
-                }
-            }
-            if (videoTrackIndex == -1) {
-                throw new IllegalArgumentException("Can not find video track");
-            }
-
-            extractor.selectTrack(videoTrackIndex);
-            MediaFormat format = extractor.getTrackFormat(videoTrackIndex);
-            String mime = format.getString(MediaFormat.KEY_MIME);
-            format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
-                    MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
-
-            // Opens the yuv file uri.
-            yuvFd = ctx.getContentResolver().openAssetFileDescriptor(yuvUri,
-                    "w");
-            out = new FileOutputStream(yuvFd.getFileDescriptor());
-
-            codec = MediaCodec.createDecoderByType(mime);
-            codec.configure(format,
-                    null,  // surface
-                    null,  // crypto
-                    0);    // flags
-            codec.start();
-
-            ByteBuffer[] inputBuffers = codec.getInputBuffers();
-            ByteBuffer[] outputBuffers = codec.getOutputBuffers();
-            MediaFormat decoderOutputFormat = codec.getInputFormat();
-
-            // start decode loop
-            MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
-
-            final long kTimeOutUs = 1000; // 1ms timeout
-            long lastOutputTimeUs = 0;
-            boolean sawInputEOS = false;
-            boolean sawOutputEOS = false;
-            int inputNum = 0;
-            int outputNum = 0;
-            boolean advanceDone = true;
-
-            long start = System.currentTimeMillis();
-            while (!sawOutputEOS) {
-                // handle input
-                if (!sawInputEOS) {
-                    int inputBufIndex = codec.dequeueInputBuffer(kTimeOutUs);
-
-                    if (inputBufIndex >= 0) {
-                        ByteBuffer dstBuf = inputBuffers[inputBufIndex];
-                        // sample contains the buffer and the PTS offset normalized to frame index
-                        int sampleSize =
-                                extractor.readSampleData(dstBuf, 0 /* offset */);
-                        long presentationTimeUs = extractor.getSampleTime();
-                        advanceDone = extractor.advance();
-
-                        if (sampleSize < 0) {
-                            Log.d(TAG, "saw input EOS.");
-                            sawInputEOS = true;
-                            sampleSize = 0;
-                        }
-                        codec.queueInputBuffer(
-                                inputBufIndex,
-                                0 /* offset */,
-                                sampleSize,
-                                presentationTimeUs,
-                                sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
-                    } else {
-                        Log.d(TAG, "codec.dequeueInputBuffer() unrecognized return value:");
-                    }
-                }
-
-                // handle output
-                int outputBufIndex = codec.dequeueOutputBuffer(info, kTimeOutUs);
-
-                if (outputBufIndex >= 0) {
-                    if (info.size > 0) { // Disregard 0-sized buffers at the end.
-                        outputNum++;
-                        Log.i(TAG, "Output frame numer " + outputNum);
-                        Image image = codec.getOutputImage(outputBufIndex);
-                        dumpYUV420PToFile(image, out);
-                    }
-
-                    codec.releaseOutputBuffer(outputBufIndex, false /* render */);
-                    if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
-                        Log.d(TAG, "saw output EOS.");
-                        sawOutputEOS = true;
-                    }
-                } else if (outputBufIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
-                    outputBuffers = codec.getOutputBuffers();
-                    Log.d(TAG, "output buffers have changed.");
-                } else if (outputBufIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
-                    decoderOutputFormat = codec.getOutputFormat();
-                    width = decoderOutputFormat.getInteger(MediaFormat.KEY_WIDTH);
-                    height = decoderOutputFormat.getInteger(MediaFormat.KEY_HEIGHT);
-                    Log.d(TAG, "output resolution " + width + "x" + height);
-                } else {
-                    Log.w(TAG, "codec.dequeueOutputBuffer() unrecognized return index");
-                }
-            }
-        } finally {
-            codec.stop();
-            codec.release();
-            extractor.release();
-            out.close();
-            fileFd.close();
-            yuvFd.close();
-        }
-        return new Size(width, height);
-    }
-
-    private static void dumpYUV420PToFile(Image image, FileOutputStream out) throws IOException {
-        int format = image.getFormat();
-
-        if (ImageFormat.YUV_420_888 != format) {
-            throw new UnsupportedOperationException("Only supports YUV420P");
-        }
-
-        int imageWidth = image.getWidth();
-        int imageHeight = image.getHeight();
-        byte[] bb = new byte[imageWidth * imageHeight];
-        byte[] lb = null;
-        Image.Plane[] planes = image.getPlanes();
-        for (int i = 0; i < planes.length; ++i) {
-            ByteBuffer buf = planes[i].getBuffer();
-
-            int width, height, rowStride, pixelStride, x, y;
-            rowStride = planes[i].getRowStride();
-            pixelStride = planes[i].getPixelStride();
-            if (i == 0) {
-                width = imageWidth;
-                height = imageHeight;
-            } else {
-                width = imageWidth / 2;
-                height = imageHeight / 2;
-            }
-
-            if (buf.hasArray()) {
-                byte b[] = buf.array();
-                int offs = buf.arrayOffset();
-                if (pixelStride == 1) {
-                    for (y = 0; y < height; ++y) {
-                        System.arraycopy(bb, y * width, b, y * rowStride + offs, width);
-                    }
-                } else {
-                    // do it pixel-by-pixel
-                    for (y = 0; y < height; ++y) {
-                        int lineOffset = offs + y * rowStride;
-                        for (x = 0; x < width; ++x) {
-                            bb[y * width + x] = b[lineOffset + x * pixelStride];
-                        }
-                    }
-                }
-            } else { // almost always ends up here due to direct buffers
-                int pos = buf.position();
-                if (pixelStride == 1) {
-                    for (y = 0; y < height; ++y) {
-                        buf.position(pos + y * rowStride);
-                        buf.get(bb, y * width, width);
-                    }
-                } else {
-                    // Reallocate linebuffer if necessary.
-                    if (lb == null || lb.length < rowStride) {
-                        lb = new byte[rowStride];
-                    }
-                    // do it pixel-by-pixel
-                    for (y = 0; y < height; ++y) {
-                        buf.position(pos + y * rowStride);
-                        // we're only guaranteed to have pixelStride * (width - 1) + 1 bytes
-                        buf.get(lb, 0, pixelStride * (width - 1) + 1);
-                        for (x = 0; x < width; ++x) {
-                            bb[y * width + x] = lb[x * pixelStride];
-                        }
-                    }
-                }
-                buf.position(pos);
-            }
-            // Write out the buffer to the output.
-            out.write(bb, 0, width * height);
-        }
-    }
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////
-    // The following psnr code is leveraged from the following file with minor modification:
-    // cts/tests/tests/media/src/android/media/cts/VideoCodecTestBase.java
-    ////////////////////////////////////////////////////////////////////////////////////////////////
-
-    /**
-     * Calculates PSNR value between two video frames.
-     */
-    private static double computePSNR(byte[] data0, byte[] data1) {
-        long squareError = 0;
-        assertTrue(data0.length == data1.length);
-        int length = data0.length;
-        for (int i = 0; i < length; i++) {
-            int diff = ((int) data0[i] & 0xff) - ((int) data1[i] & 0xff);
-            squareError += diff * diff;
-        }
-        double meanSquareError = (double) squareError / length;
-        double psnr = 10 * Math.log10((double) 255 * 255 / meanSquareError);
-        return psnr;
-    }
-
-    /**
-     * Calculates average and minimum PSNR values between
-     * set of reference and decoded video frames.
-     * Runs PSNR calculation for the full duration of the decoded data.
-     */
-    private static VideoTranscodingStatistics computePsnr(
-            Context ctx,
-            Uri referenceYuvFileUri,
-            Uri decodedYuvFileUri,
-            int width,
-            int height) throws Exception {
-        VideoTranscodingStatistics statistics = new VideoTranscodingStatistics();
-        AssetFileDescriptor referenceFd = ctx.getContentResolver().openAssetFileDescriptor(
-                referenceYuvFileUri, "r");
-        InputStream referenceStream = new FileInputStream(referenceFd.getFileDescriptor());
-
-        AssetFileDescriptor decodedFd = ctx.getContentResolver().openAssetFileDescriptor(
-                decodedYuvFileUri, "r");
-        InputStream decodedStream = new FileInputStream(decodedFd.getFileDescriptor());
-
-        int ySize = width * height;
-        int uvSize = width * height / 4;
-        byte[] yRef = new byte[ySize];
-        byte[] yDec = new byte[ySize];
-        byte[] uvRef = new byte[uvSize];
-        byte[] uvDec = new byte[uvSize];
-
-        int frames = 0;
-        double averageYPSNR = 0;
-        double averageUPSNR = 0;
-        double averageVPSNR = 0;
-        double minimumYPSNR = Integer.MAX_VALUE;
-        double minimumUPSNR = Integer.MAX_VALUE;
-        double minimumVPSNR = Integer.MAX_VALUE;
-        int minimumPSNRFrameIndex = 0;
-
-        while (true) {
-            // Calculate Y PSNR.
-            int bytesReadRef = referenceStream.read(yRef);
-            int bytesReadDec = decodedStream.read(yDec);
-            if (bytesReadDec == -1) {
-                break;
-            }
-            if (bytesReadRef == -1) {
-                // Reference file wrapping up
-                referenceStream.close();
-                break;
-            }
-            double curYPSNR = computePSNR(yRef, yDec);
-            averageYPSNR += curYPSNR;
-            minimumYPSNR = Math.min(minimumYPSNR, curYPSNR);
-            double curMinimumPSNR = curYPSNR;
-
-            // Calculate U PSNR.
-            bytesReadRef = referenceStream.read(uvRef);
-            bytesReadDec = decodedStream.read(uvDec);
-            double curUPSNR = computePSNR(uvRef, uvDec);
-            averageUPSNR += curUPSNR;
-            minimumUPSNR = Math.min(minimumUPSNR, curUPSNR);
-            curMinimumPSNR = Math.min(curMinimumPSNR, curUPSNR);
-
-            // Calculate V PSNR.
-            bytesReadRef = referenceStream.read(uvRef);
-            bytesReadDec = decodedStream.read(uvDec);
-            double curVPSNR = computePSNR(uvRef, uvDec);
-            averageVPSNR += curVPSNR;
-            minimumVPSNR = Math.min(minimumVPSNR, curVPSNR);
-            curMinimumPSNR = Math.min(curMinimumPSNR, curVPSNR);
-
-            // Frame index for minimum PSNR value - help to detect possible distortions
-            if (curMinimumPSNR < statistics.mMinimumPSNR) {
-                statistics.mMinimumPSNR = curMinimumPSNR;
-                minimumPSNRFrameIndex = frames;
-            }
-
-            String logStr = String.format(Locale.US, "PSNR #%d: Y: %.2f. U: %.2f. V: %.2f",
-                    frames, curYPSNR, curUPSNR, curVPSNR);
-            Log.v(TAG, logStr);
-
-            frames++;
-        }
-
-        averageYPSNR /= frames;
-        averageUPSNR /= frames;
-        averageVPSNR /= frames;
-        statistics.mAveragePSNR = (4 * averageYPSNR + averageUPSNR + averageVPSNR) / 6;
-
-        Log.d(TAG, "PSNR statistics for " + frames + " frames.");
-        String logStr = String.format(Locale.US,
-                "Average PSNR: Y: %.1f. U: %.1f. V: %.1f. Average: %.1f",
-                averageYPSNR, averageUPSNR, averageVPSNR, statistics.mAveragePSNR);
-        Log.d(TAG, logStr);
-        logStr = String.format(Locale.US,
-                "Minimum PSNR: Y: %.1f. U: %.1f. V: %.1f. Overall: %.1f at frame %d",
-                minimumYPSNR, minimumUPSNR, minimumVPSNR,
-                statistics.mMinimumPSNR, minimumPSNRFrameIndex);
-        Log.d(TAG, logStr);
-
-        referenceStream.close();
-        decodedStream.close();
-        referenceFd.close();
-        decodedFd.close();
-        return statistics;
-    }
-
-    /**
-     * Transcoding PSNR statistics.
-     */
-    protected static class VideoTranscodingStatistics {
-        public double mAveragePSNR;
-        public double mMinimumPSNR;
-
-        VideoTranscodingStatistics() {
-            mMinimumPSNR = Integer.MAX_VALUE;
-        }
-    }
-}
-
diff --git a/mime/OWNERS b/mime/OWNERS
index 6f9dbea..2357979 100644
--- a/mime/OWNERS
+++ b/mime/OWNERS
@@ -1 +1,2 @@
+include platform/libcore:/OWNERS
 include /core/java/android/os/storage/OWNERS
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 411a78a..7ea9686 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -368,6 +368,9 @@
     <!-- Permission required for CTS test - HideOverlayWindowsTest -->
     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
 
+    <!-- Permission required for CTS test - CtsHdmiCecHostTestCases -->
+    <uses-permission android:name="android.permission.HDMI_CEC" />
+
     <application android:label="@string/app_label"
                 android:theme="@android:style/Theme.DeviceDefault.DayNight"
                 android:defaultToDeviceProtectedStorage="true"
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index d50f08d..a2608a0 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -380,6 +380,11 @@
         public void onFinished() {
             mInfo.renameBugreportFile();
             mInfo.renameScreenshots();
+            if (mInfo.bugreportFile.length() == 0) {
+                Log.e(TAG, "Bugreport file empty. File path = " + mInfo.bugreportFile);
+                onError(BUGREPORT_ERROR_RUNTIME);
+                return;
+            }
             synchronized (mLock) {
                 sendBugreportFinishedBroadcastLocked();
                 mMainThreadHandler.post(() -> mInfoDialog.onBugreportFinished(mInfo));
@@ -408,10 +413,6 @@
         @GuardedBy("mLock")
         private void sendBugreportFinishedBroadcastLocked() {
             final String bugreportFilePath = mInfo.bugreportFile.getAbsolutePath();
-            if (mInfo.bugreportFile.length() == 0) {
-                Log.e(TAG, "Bugreport file empty. File path = " + bugreportFilePath);
-                return;
-            }
             if (mInfo.type == BugreportParams.BUGREPORT_MODE_REMOTE) {
                 sendRemoteBugreportFinishedBroadcast(mContext, bugreportFilePath,
                         mInfo.bugreportFile);
@@ -617,12 +618,21 @@
 
         BugreportInfo info = new BugreportInfo(mContext, baseName, name,
                 shareTitle, shareDescription, bugreportType, mBugreportsDir);
+        synchronized (mLock) {
+            if (info.bugreportFile.exists()) {
+                Log.e(TAG, "Failed to start bugreport generation, the requested bugreport file "
+                        + info.bugreportFile + " already exists");
+                return;
+            }
+            info.createBugreportFile();
+        }
         ParcelFileDescriptor bugreportFd = info.getBugreportFd();
         if (bugreportFd == null) {
             Log.e(TAG, "Failed to start bugreport generation as "
                     + " bugreport parcel file descriptor is null.");
             return;
         }
+        info.createScreenshotFile(mBugreportsDir);
         ParcelFileDescriptor screenshotFd = null;
         if (isDefaultScreenshotRequired(bugreportType, /* hasScreenshotButton= */ !mIsTv)) {
             screenshotFd = info.getDefaultScreenshotFd();
@@ -1919,12 +1929,10 @@
             this.shareDescription = shareDescription == null ? "" : shareDescription;
             this.type = type;
             this.baseName = baseName;
-            createBugreportFile(bugreportsDir);
-            createScreenshotFile(bugreportsDir);
+            this.bugreportFile = new File(bugreportsDir, getFileName(this, ".zip"));
         }
 
-        void createBugreportFile(File bugreportsDir) {
-            bugreportFile = new File(bugreportsDir, getFileName(this, ".zip"));
+        void createBugreportFile() {
             createReadWriteFile(bugreportFile);
         }
 
diff --git a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
index 3b02e3b..9476912 100644
--- a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
+++ b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
@@ -40,6 +40,7 @@
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
 import android.app.ActivityManager;
@@ -513,6 +514,17 @@
     }
 
     @Test
+    public void testBugreportFinished_withEmptyBugreportFile() throws Exception {
+        sendBugreportStarted();
+
+        IoUtils.closeQuietly(mBugreportFd);
+        mBugreportFd = null;
+        sendBugreportFinished();
+
+        assertServiceNotRunning();
+    }
+
+    @Test
     public void testShareBugreportAfterServiceDies() throws Exception {
         sendBugreportStarted();
         waitForScreenshotButtonEnabled(true);
@@ -523,6 +535,18 @@
         assertActionSendMultiple(extras);
     }
 
+    @Test
+    public void testBugreportRequestTwice_oneStartBugreportInvoked() throws Exception {
+        sendBugreportStarted();
+        new BugreportRequestedReceiver().onReceive(mContext,
+                new Intent(INTENT_BUGREPORT_REQUESTED));
+        getInstrumentation().waitForIdleSync();
+
+        verify(mMockIDumpstate, times(1)).startBugreport(anyInt(), any(), any(), any(),
+                anyInt(), any(), anyBoolean());
+        sendBugreportFinished();
+    }
+
     private void cancelExistingNotifications() {
         // Must kill service first, because notifications from a foreground service cannot be
         // canceled.
@@ -576,9 +600,10 @@
      */
     private void sendBugreportStarted() throws Exception {
         Intent intent = new Intent(INTENT_BUGREPORT_REQUESTED);
-        intent.setPackage("com.android.shell");
-        intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-        mContext.sendBroadcast(intent);
+        // Ideally, we should invoke BugreportRequestedReceiver by sending
+        // INTENT_BUGREPORT_REQUESTED. But the intent has been protected broadcast by the system
+        // starting from S.
+        new BugreportRequestedReceiver().onReceive(mContext, intent);
 
         ArgumentCaptor<IDumpstateListener> listenerCap = ArgumentCaptor.forClass(
                 IDumpstateListener.class);
@@ -646,7 +671,9 @@
      * Callbacks to service to finish the bugreport.
      */
     private void sendBugreportFinished() throws Exception {
-        writeZipFile(mBugreportFd, BUGREPORT_FILE, BUGREPORT_CONTENT);
+        if (mBugreportFd != null) {
+            writeZipFile(mBugreportFd, BUGREPORT_FILE, BUGREPORT_CONTENT);
+        }
         if (mScreenshotFd != null) {
             writeScreenshotFile(mScreenshotFd, SCREENSHOT_CONTENT);
         }
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index 2ea0c22..fda1e36 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -74,6 +74,7 @@
         "androidx.lifecycle_lifecycle-extensions",
         "androidx.dynamicanimation_dynamicanimation",
         "androidx-constraintlayout_constraintlayout",
+        "androidx.exifinterface_exifinterface",
         "kotlinx-coroutines-android",
         "kotlinx-coroutines-core",
         "iconloader_base",
@@ -140,6 +141,7 @@
         "androidx.lifecycle_lifecycle-extensions",
         "androidx.dynamicanimation_dynamicanimation",
         "androidx-constraintlayout_constraintlayout",
+        "androidx.exifinterface_exifinterface",
         "kotlinx-coroutines-android",
         "kotlinx-coroutines-core",
         "iconloader_base",
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 3fb5a9c..070c021 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -570,15 +570,10 @@
         <!-- People Space UI Screen -->
         <activity android:name=".people.PeopleSpaceActivity"
             android:label="People"
-            android:icon="@drawable/ic_music_note"
             android:exported="true"
-            android:enabled="false"
-            android:theme="@android:style/Theme.Material.NoActionBar"
-            android:launchMode="singleInstance">
+            android:theme="@android:style/Theme.Material.NoActionBar">
             <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
                 <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
             </intent-filter>
         </activity>
 
diff --git a/packages/SystemUI/res/drawable/ic_tune_black_16dp.xml b/packages/SystemUI/res/drawable/ic_tune_black_16dp.xml
index 339cb70..c41d102 100644
--- a/packages/SystemUI/res/drawable/ic_tune_black_16dp.xml
+++ b/packages/SystemUI/res/drawable/ic_tune_black_16dp.xml
@@ -18,7 +18,8 @@
         android:width="16dp"
         android:height="16dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/textColorPrimary">
     <path
         android:fillColor="#FF000000"
         android:pathData="M3,17v2h6v-2L3,17zM3,5v2h10L13,5L3,5zM13,21v-2h8v-2h-8v-2h-2v6h2zM7,9v2L3,11v2h4v2h2L9,9L7,9zM21,13v-2L11,11v2h10zM15,9h2L17,7h4L21,5h-4L17,3h-2v6z"/>
diff --git a/packages/SystemUI/res/drawable/ic_volume_accessibility.xml b/packages/SystemUI/res/drawable/ic_volume_accessibility.xml
index 71376d5..c6d133a 100644
--- a/packages/SystemUI/res/drawable/ic_volume_accessibility.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_accessibility.xml
@@ -19,7 +19,7 @@
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0"
-        android:tint="?android:attr/colorControlNormal">
+    android:tint="?android:attr/textColorPrimary">
     <path
         android:fillColor="#FFFFFFFF"
         android:pathData="M20.5,6c-2.61,0.7 -5.67,1 -8.5,1s-5.89,-0.3 -8.5,-1L3,8c1.86,0.5 4,0.83 6,1v13h2v-6h2v6h2V9c2,-0.17 4.14,-0.5 6,-1l-0.5,-2zM12,6c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2z"/>
diff --git a/packages/SystemUI/res/drawable/ic_volume_alarm.xml b/packages/SystemUI/res/drawable/ic_volume_alarm.xml
index 771b466..6fc2f20 100644
--- a/packages/SystemUI/res/drawable/ic_volume_alarm.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_alarm.xml
@@ -17,7 +17,8 @@
     android:height="24dp"
     android:width="24dp"
     android:viewportHeight="24"
-    android:viewportWidth="24">
+    android:viewportWidth="24"
+    android:tint="?android:attr/textColorPrimary">
     <path
         android:fillColor="#FFFFFF"
         android:pathData="M13,8h-2v5.41l3.79,3.8 1.42,-1.42 -3.21,-3.2zM12,4c-4.97,0 -9,4.03 -9,9s4.03,9 9,9 9,-4.03 9,-9 -4.03,-9 -9,-9zM12,20c-3.86,0 -7,-3.14 -7,-7s3.14,-7 7,-7 7,3.14 7,7 -3.14,7 -7,7zM16.056,3.346l1.282,-1.535 4.607,3.85 -1.28,1.54zM2.056,5.654L6.663,1.81l1.28,1.536L3.338,7.19z"/>
diff --git a/packages/SystemUI/res/drawable/ic_volume_alarm_mute.xml b/packages/SystemUI/res/drawable/ic_volume_alarm_mute.xml
index 18e2736..730c26f 100644
--- a/packages/SystemUI/res/drawable/ic_volume_alarm_mute.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_alarm_mute.xml
@@ -18,7 +18,7 @@
     android:viewportHeight="24.0"
     android:viewportWidth="24.0"
     android:width="24.0dp"
-    android:tint="?android:attr/colorControlNormal" >
+    android:tint="?android:attr/textColorPrimary" >
 
     <path
         android:fillColor="#FFFFFF"
diff --git a/packages/SystemUI/res/drawable/ic_volume_bt_sco.xml b/packages/SystemUI/res/drawable/ic_volume_bt_sco.xml
index b0b9404..9ed77fe 100644
--- a/packages/SystemUI/res/drawable/ic_volume_bt_sco.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_bt_sco.xml
@@ -18,7 +18,7 @@
     android:viewportHeight="24.0"
     android:viewportWidth="24.0"
     android:width="24.0dp"
-    android:tint="?android:attr/colorControlNormal" >
+    android:tint="?android:attr/textColorPrimary" >
 
     <path
         android:fillColor="#FFFFFF"
diff --git a/packages/SystemUI/res/drawable/ic_volume_media.xml b/packages/SystemUI/res/drawable/ic_volume_media.xml
index 99be7b6..bffb5a4 100644
--- a/packages/SystemUI/res/drawable/ic_volume_media.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_media.xml
@@ -18,7 +18,7 @@
     android:viewportHeight="24.0"
     android:viewportWidth="24.0"
     android:width="24.0dp"
-    android:tint="?android:attr/colorControlNormal" >
+    android:tint="?android:attr/textColorPrimary" >
 
     <path
         android:fillColor="#FFFFFFFF"
diff --git a/packages/SystemUI/res/drawable/ic_volume_media_bt.xml b/packages/SystemUI/res/drawable/ic_volume_media_bt.xml
index 23cb206..ea467c6 100644
--- a/packages/SystemUI/res/drawable/ic_volume_media_bt.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_media_bt.xml
@@ -18,7 +18,7 @@
     android:height="24dp"
     android:viewportWidth="24"
     android:viewportHeight="24"
-    android:tint="?android:attr/colorControlNormal">
+    android:tint="?android:attr/textColorPrimary">
     <path
         android:fillColor="@android:color/white"
         android:pathData="M9 3l0.01 10.55c-0.6-0.34-1.28-0.55-2-0.55C4.79 13 3 14.79 3 17s1.79 4 4.01 4S11 19.21 11 17V7h4V3H9zm12 9.43L17.57 9h-0.6v4.55l-2.75-2.75-0.85 0.85 L16.73 15l-3.35 3.35 0.85 0.85 2.75-2.75V21h0.6L21 17.57 18.42 15 21 12.43zm-2.83-1.13l1.13 1.13-1.13 1.13V11.3zm1.13 6.27l-1.13 1.13v-2.26l1.13 1.13z" />
diff --git a/packages/SystemUI/res/drawable/ic_volume_media_bt_mute.xml b/packages/SystemUI/res/drawable/ic_volume_media_bt_mute.xml
index 2469ddc..f01e49f 100644
--- a/packages/SystemUI/res/drawable/ic_volume_media_bt_mute.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_media_bt_mute.xml
@@ -18,7 +18,7 @@
     android:height="24dp"
     android:viewportWidth="24"
     android:viewportHeight="24"
-    android:tint="?android:attr/colorControlNormal">
+    android:tint="?android:attr/textColorPrimary">
     <path
         android:fillColor="@android:color/white"
         android:pathData="M9 6.17V3h6v4h-4v1.17l-2-2zM19.42 15L22 17.57l-0.8 0.8 -6.78-6.78 0.8 -0.8 2.75 2.75V9h0.6L22 12.43 19.42 15zm-0.25-1.45l1.13-1.13-1.13-1.13v2.26zm-1.96 3.66l3.98 3.98-1.41 1.41-3.98-3.98-0.58 0.58 -0.85-0.85 0.58 -0.58L11 13.83V17c0 2.21-1.78 4-3.99 4S3 19.21 3 17s1.79-4 4.01-4c0.73 0 1.41 0.21 2 0.55v-1.72L1.39 4.22 2.8 2.81l13.56 13.56 0.85 0.84z" />
diff --git a/packages/SystemUI/res/drawable/ic_volume_media_mute.xml b/packages/SystemUI/res/drawable/ic_volume_media_mute.xml
index 3a495963..63dfe8f 100644
--- a/packages/SystemUI/res/drawable/ic_volume_media_mute.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_media_mute.xml
@@ -18,7 +18,7 @@
     android:viewportHeight="24.0"
     android:viewportWidth="24.0"
     android:width="24.0dp"
-    android:tint="?android:attr/colorControlNormal" >
+    android:tint="?android:attr/textColorPrimary" >
 
     <path
         android:fillColor="#FFFFFFFF"
diff --git a/packages/SystemUI/res/drawable/ic_volume_odi_captions.xml b/packages/SystemUI/res/drawable/ic_volume_odi_captions.xml
index 719b702..946c137 100644
--- a/packages/SystemUI/res/drawable/ic_volume_odi_captions.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_odi_captions.xml
@@ -17,7 +17,8 @@
     android:width="24dp"
     android:height="24dp"
     android:viewportWidth="24"
-    android:viewportHeight="24">
+    android:viewportHeight="24"
+    android:tint="?android:attr/textColorPrimary">
     <path
         android:fillColor="#FF000000"
         android:pathData="M20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,18L4,18L4,6h16v12zM6,10h2v2L6,12zM6,14h8v2L6,16zM16,14h2v2h-2zM10,10h8v2h-8z"/>
diff --git a/packages/SystemUI/res/drawable/ic_volume_odi_captions_disabled.xml b/packages/SystemUI/res/drawable/ic_volume_odi_captions_disabled.xml
index 953d4fe..5af38e4 100644
--- a/packages/SystemUI/res/drawable/ic_volume_odi_captions_disabled.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_odi_captions_disabled.xml
@@ -17,7 +17,8 @@
     android:width="24dp"
     android:height="24dp"
     android:viewportWidth="24"
-    android:viewportHeight="24">
+    android:viewportHeight="24"
+    android:tint="?android:attr/textColorPrimary">
     <path
         android:fillColor="#FF000000"
         android:pathData="M18,10l-5.18,0l2,2l3.18,0z"/>
diff --git a/packages/SystemUI/res/drawable/ic_volume_ringer.xml b/packages/SystemUI/res/drawable/ic_volume_ringer.xml
index 42eb7b7..998344f 100644
--- a/packages/SystemUI/res/drawable/ic_volume_ringer.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_ringer.xml
@@ -18,7 +18,7 @@
     android:width="24dp"
     android:viewportHeight="24"
     android:viewportWidth="24"
-    android:tint="?android:attr/colorControlNormal" >
+    android:tint="?android:attr/textColorPrimary" >
 
     <path
         android:fillColor="#FFFFFFFF"
diff --git a/packages/SystemUI/res/drawable/ic_volume_ringer_mute.xml b/packages/SystemUI/res/drawable/ic_volume_ringer_mute.xml
index 9cb7ca3..064e239 100644
--- a/packages/SystemUI/res/drawable/ic_volume_ringer_mute.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_ringer_mute.xml
@@ -18,7 +18,7 @@
     android:viewportHeight="24"
     android:viewportWidth="24"
     android:width="24dp"
-    android:tint="?android:attr/colorControlNormal" >
+    android:tint="?android:attr/textColorPrimary" >
 
     <path
         android:fillColor="#FFFFFFFF"
diff --git a/packages/SystemUI/res/drawable/ic_volume_ringer_vibrate.xml b/packages/SystemUI/res/drawable/ic_volume_ringer_vibrate.xml
index 314e06c..b18e0a7 100644
--- a/packages/SystemUI/res/drawable/ic_volume_ringer_vibrate.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_ringer_vibrate.xml
@@ -17,7 +17,8 @@
     android:height="19dp"
     android:width="19dp"
     android:viewportHeight="24.0"
-    android:viewportWidth="24.0">
+    android:viewportWidth="24.0"
+    android:tint="?android:attr/textColorPrimary">
 
     <path
         android:fillColor="#FFFFFFFF"
diff --git a/packages/SystemUI/res/drawable/ic_volume_system.xml b/packages/SystemUI/res/drawable/ic_volume_system.xml
index 71eed34..ad3d881 100644
--- a/packages/SystemUI/res/drawable/ic_volume_system.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_system.xml
@@ -18,7 +18,7 @@
     android:viewportHeight="24.0"
     android:viewportWidth="24.0"
     android:width="24.0dp"
-    android:tint="?android:attr/colorControlNormal" >
+    android:tint="?android:attr/textColorPrimary" >
 
     <path
         android:fillColor="#FFFFFF"
diff --git a/packages/SystemUI/res/drawable/ic_volume_system_mute.xml b/packages/SystemUI/res/drawable/ic_volume_system_mute.xml
index baad92a..c68f587 100644
--- a/packages/SystemUI/res/drawable/ic_volume_system_mute.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_system_mute.xml
@@ -18,7 +18,7 @@
     android:viewportHeight="24.0"
     android:viewportWidth="24.0"
     android:width="24.0dp"
-    android:tint="?android:attr/colorControlNormal" >
+    android:tint="?android:attr/textColorPrimary" >
 
     <path
         android:fillColor="#FFFFFF"
diff --git a/packages/SystemUI/res/drawable/ic_volume_voice.xml b/packages/SystemUI/res/drawable/ic_volume_voice.xml
index 7dc3dac..3e7748a 100644
--- a/packages/SystemUI/res/drawable/ic_volume_voice.xml
+++ b/packages/SystemUI/res/drawable/ic_volume_voice.xml
@@ -18,7 +18,7 @@
     android:viewportHeight="48.0"
     android:viewportWidth="48.0"
     android:width="24.0dp"
-    android:tint="?android:attr/colorControlNormal" >
+    android:tint="?android:attr/textColorPrimary" >
 
     <path
         android:fillColor="#FFFFFF"
diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml
index a90b1eb..1810c19 100644
--- a/packages/SystemUI/res/layout/volume_dialog.xml
+++ b/packages/SystemUI/res/layout/volume_dialog.xml
@@ -58,7 +58,7 @@
                 android:layout_height="match_parent"
                 android:scaleType="fitCenter"
                 android:padding="@dimen/volume_dialog_ringer_icon_padding"
-                android:tint="@color/accent_tint_color_selector"
+                android:tint="?android:attr/textColorPrimary"
                 android:layout_gravity="center"
                 android:soundEffectsEnabled="false" />
 
@@ -105,7 +105,7 @@
                     android:layout_gravity="center"
                     android:contentDescription="@string/accessibility_volume_settings"
                     android:background="@drawable/ripple_drawable_20dp"
-                    android:tint="?android:attr/textColorSecondary"
+                    android:tint="?android:attr/textColorPrimary"
                     android:soundEffectsEnabled="false" />
             </FrameLayout>
         </LinearLayout>
@@ -127,7 +127,7 @@
                 android:background="@drawable/rounded_ripple"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:tint="@color/caption_tint_color_selector"
+                android:tint="?android:attr/textColorPrimary"
                 android:layout_gravity="center"
                 android:soundEffectsEnabled="false"
                 sysui:optedOut="false"/>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index ce47ed8..da91f27 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Battery, drie stawe."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Battery vol."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batterypersentasie is onbekend."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Geen foon nie."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Foon, een staaf."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Foon, twee stawe."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Foon, drie stawe."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Foonsein is vol."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Geen data nie."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Data, een staaf."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Data, twee stawe."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data, drie stawe."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Datasein vol."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Gekoppel aan <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Gekoppel aan <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Gekoppel aan <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX twee strepies."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX drie strepies."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX-sein vol."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet is ontkoppel."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet gekoppel."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Geen sein nie."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nie gekoppel nie."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Geen stawe."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Af"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Gekoppel."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Koppel tans."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Swerwing"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Geen SIM nie."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobiele data"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobiele data is aan"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobiele data is af"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Nie gestel om data te gebruik nie"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Af"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth-verbinding."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Vliegtuigmodus."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN aan."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Geen SIM-kaart nie."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Diensverskaffernetwerk verander tans"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Maak batterybesonderhede oop"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Battery <xliff:g id="NUMBER">%d</xliff:g> persent."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Battery <xliff:g id="PERCENTAGE">%1$s</xliff:g> persent, ongeveer <xliff:g id="TIME">%2$s</xliff:g> oor gegrond op jou gebruik"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Kan lui of vibreer op grond van fooninstellings. Gesprekke van <xliff:g id="APP_NAME">%1$s</xliff:g> af verskyn by verstek in \'n borrel."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Hou jou aandag met \'n swewende kortpad na hierdie inhoud toe."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Laat die stelsel bepaal of hierdie kennisgewing \'n klank moet maak of vibreer"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wys boaan die gespreksafdeling, verskyn as \'n swewende borrel, wys profielfoto op sluitskerm"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Instellings"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Hierdie program wys tans bo-oor ander programme op jou skerm en gebruik die mikrofoon en kamera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Instellings"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Die stelsel het hierdie kennisgewing stilgemaak."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Die stelsel het hierdie kennisgewing bevorder."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Die stelsel het hierdie kennisgewing gedegradeer."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Is dit korrek?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Dankie vir jou terugvoer!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 2573175..d098079 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"ባትሪ ሦስት አሞሌዎች።"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"ባትሪ ሙሉ ነው።"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"የባትሪ መቶኛ አይታወቅም።"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"ምንም ስልክ የለም።"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"የስልክ አንድ አሞሌ"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"የስልክ ሁለት አሞሌ"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"የስልክ ሦስት አሞሌ"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"የስልክ አመልካች ሙሉ ነው።"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"ምንም ውሂብ የለም።"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"የውሂብ አንድ አሞሌ"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"የውሂብ ሁለት አሞሌዎች።"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"የውሂብ ሦስት አሞሌዎች።"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"የውሂብ አመልካች ሙሉ ነው።"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"ከ<xliff:g id="WIFI">%s</xliff:g> ጋር ተገናኝቷል።"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"ከ<xliff:g id="BLUETOOTH">%s</xliff:g> ጋር ተገናኝቷል።"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"ከ<xliff:g id="CAST">%s</xliff:g> ጋር ተገናኝቷል።"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX ሁለት አሞሌዎች።"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX ሦስት አሞሌዎች።"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX አመልካች ሙሉ ነው።"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ኤተርኔት ተነቅሏል።"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ኤተርኔት ተገናኝቷል።"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"ምንም ምልክት የለም።"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"አልተገናኘም።"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"ዜሮ አሞሌዎች።"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"ጠፍቷል።"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"ተገናኝቷል።"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"በማገናኘት ላይ።"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"ጂፒአርኤስ"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"ኤችኤስፒኤ"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3ጂ"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"ሰ"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"ሰ+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4ጂ"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"በማዛወር ላይ"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"ኤጅ"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"ምንም SIM የለም።"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"የተንቀሳቃሽ ስልክ ውሂብ"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"የተንቀሳቃሽ ስልክ ውሂብ በርቷል"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"የተንቀሳቃሽ ስልክ ውሂብ ጠፍቷል"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"ውሂብን ለመጠቀም አልተቀናበረም"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ጠፍቷል"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ብሉቱዝ ማያያዝ።"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"የአውሮፕላን ሁነታ።"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"ቪፒኤን በርቷል።"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"ምንም SIM ካርድ የለም።"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"የአገልግሎት አቅራቢ አውታረ መረብን በመቀየር ላይ"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"የባትሪ ዝርዝሮችን ክፈት"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"የባትሪ <xliff:g id="NUMBER">%d</xliff:g> መቶኛ።"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"ባትሪ <xliff:g id="PERCENTAGE">%1$s</xliff:g> በመቶ፣ በአጠቃቀምዎ ላይ በመመስረት <xliff:g id="TIME">%2$s</xliff:g> ገደማ ይቀራል"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"በእርስዎ የስልክ ቅንብሮች የሚወሰን ሆኖ ሊደውል ወይም ሊነዝር ይችላል። የ<xliff:g id="APP_NAME">%1$s</xliff:g> አረፋ ውይይቶች በነባሪነት።"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ለዚህ ይዞታ ከተንሳፋፊ አቋራጭ ጋር የእርስዎን ትኩረት ያቆያል።"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"ይህ ማሳወቂያ ድምጽ ወይም ንዝረት መደረግ ካለበት ስርዓቱ እንዲወሰን ያድርጉት"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"በውይይት ክፍል አናት ላይ ያሳያል፣ እንደ ተንሳፋፊ አረፋ ብቅ ይላል፣ በቆልፍ ማያ ገጽ ላይ የመገለጫ ሥዕልን ያሳያል"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ቅንብሮች"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ቅድሚያ"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"ይህ መተግበሪያ በማያ ገጽዎ ላይ በሌሎች መተግበሪያዎች ላይ እያሳየ እና ማይክሮፎኑንና ካሜራውን እየተጠቀመ ነው።"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"ቅንብሮች"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"እሺ"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"ይህ ማስታወቂያ በስርዓቱ ጸጥ እንዲል ተደርጓል።"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"ይህ ማስታወቂያ በስርዓቱ ከፍ ተደርጓል።"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"ይህ ማስታወቂያ በስርዓቱ ዝቅ ተደርጓል።"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"ይህ ትክክል ነበር?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"ለግብረመልስዎ እናመሰግናለን!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"እሺ"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index f0d0b84..2fa6b27 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"إشارة البطارية تتكون من ثلاثة أشرطة."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"إشارة البطارية كاملة."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"نسبة شحن البطارية غير معروفة."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"ليست هناك إشارة بالهاتف."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"إشارة الهاتف تتكون من شريط واحد."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"إشارة الهاتف تتكون من شريطين."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"إشارة الهاتف تتكون من ثلاثة أشرطة."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"إشارة الهاتف كاملة."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"لا تتوفر بيانات."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"إشارة البيانات تتكون من شريط واحد."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"إشارة البيانات تتكون من شريطين."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"إشارة البيانات تتكون من ثلاثة أشرطة."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"إشارة البيانات كاملة."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"متصل بـ <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"متصل بـ <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"تم الاتصال بـ <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"‏شريطا WiMAX."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"‏أشرطة WiMAX الثلاثة."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"‏إشارة WiMAX كاملة."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"‏تم قطع اتصال Ethernet."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"‏تم إنشاء اتصال Ethernet."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"ليست هناك إشارة."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"غير متصل."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"ليست هناك أشرطة."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"تم الإيقاف."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"متصل."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"جارٍ الاتصال."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"‏شبكة GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"شبكة الجيل الثالث"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+‎"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"شبكة الجيل الرابع"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"شبكة الجيل الرابع أو أحدث"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+‎"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"التجوال"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"‏شبكة EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"‏ليست هناك شريحة SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"بيانات الجوّال"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"تفعيل بيانات الجوال"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"تم إيقاف بيانات الجوال"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"لم يتم الضبط على استخدام البيانات"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"غير مفعّلة"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"التوصيل عبر البلوتوث"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"وضع الطيران."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"‏الشبكة الافتراضية الخاصة (VPN) قيد التفعيل."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"‏ليس هناك شريحة SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"جارٍ تغيير شبكة مشغِّل شبكة الجوّال."</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"فتح تفاصيل البطارية"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"مستوى البطارية <xliff:g id="NUMBER">%d</xliff:g> في المائة."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"نسبة الشحن بالبطارية <xliff:g id="PERCENTAGE">%1$s</xliff:g> بالمائة، ويتبقى <xliff:g id="TIME">%2$s</xliff:g> تقريبًا بناءً على استخدامك."</string>
@@ -735,6 +710,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"يمكن إصدار رنين أو اهتزاز بناءً على إعدادات الهاتف. تظهر المحادثات من <xliff:g id="APP_NAME">%1$s</xliff:g> كفقاعات تلقائيًا."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"يلفِت هذا الإشعار انتباهك لهذا المحتوى باستخدام اختصار عائم."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"السماح للنظام بتحديد ما إذا يجب اهتزاز الجهاز أو إصدار رنين عند تلقّي هذا الإشعار"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"تظهر في أعلى قسم المحادثات وتظهر كفقاعة عائمة وتعرض صورة الملف الشخصي على شاشة القفل"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"الإعدادات"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"الأولوية"</string>
@@ -753,9 +736,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"يتم عرض هذا التطبيق فوق التطبيقات الأخرى على شاشتك ويستخدم الميكروفون والكاميرا."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"الإعدادات"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"حسنًا"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"كتم النظام صوت هذا الإشعار."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"رفع النظام ترتيب هذا الإشعار."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"خفض النظام ترتيب هذا الإشعار."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"هل كان هذا صحيحًا؟"</string>
     <string name="feedback_response" msgid="4671729244976641339">"شكرًا على تعليقك"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"حسنًا"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 366a86f..85bd4a7 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"বেটাৰিৰ তিনিডাল দণ্ড।"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"বেটাৰি পূৰাকৈ চ্চাৰ্জ হৈছে।"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"বেটাৰীৰ চাৰ্জৰ শতাংশ অজ্ঞাত।"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"ফ\'নত ছিগনেল নাই৷"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"ফ\'ন ছিগনেলৰ এডাল দণ্ড।"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"ফ\'ন ছিগনেলৰ দুডাল দণ্ড।"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"ফ\'নৰ ছিগনেলৰ তিনিডাল দণ্ড আছে।"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"ফ\'নৰ ছিগনেল পূৰা আছে৷"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"কোনো ডেটা নাই।"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"ডেটা ছিগনেলৰ এডাল দণ্ড।"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"ডেটা ছংনেলৰ তিনিডাল দণ্ড।"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"ডেটা ছিংগনেলত তিনিডাল দণ্ড আছে।"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"ডেটা ছিগনেল পূৰা আছে।"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g>ৰ লগত সংযোগ কৰা হ’ল।"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>ৰ লগত সংযোগ কৰা হ’ল।"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>ত সংযোগ হ’ল।"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAXৰ দুডাল দণ্ড আছে।"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAXৰ তিনিডাল দণ্ড আছে।"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAXৰ ছিগনেল পূৰা আছে৷"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ইথাৰনেট সংযোগ বিচ্ছিন্ন হৈছে।"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ইথাৰনেট সংযোগ হৈছে।"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"কোনো ছিগনেল নাই।"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"সংযোগ হৈ থকা নাই।"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"এডালো দণ্ড নাই।"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"অফ।"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"সংযোগ কৰা হ’ল।"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"সংযোগ কৰি থকা হৈছে।"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"জিপিআৰএছ"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"এলটিই"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"এলটিই+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"ৰ\'মিং"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"ৱাই-ফাই"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"ছিম নাই।"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"ম’বাইল ডেটা"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"ম’বাইল ডেটা অন অৱস্থাত আছে"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"ম’বাইল ডেটা অফ অৱস্থাত আছে"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"ডেটা ব্যৱহাৰ কৰিবলৈ ছেট কৰা নাই"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"অফ অৱস্থাত আছে"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ব্লুটুথ টেডাৰিং।"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"এয়াৰপ্লেইন ম\'ড।"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"ভিপিএন অন অৱস্থাত আছে।"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"কোনো ছিম কাৰ্ড নাই"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"বাহক নেটৱৰ্কৰ পৰিৱৰ্তন"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"বেটাৰিৰ বিৱৰণসমূহ খোলক"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"<xliff:g id="NUMBER">%d</xliff:g> শতাংশ বেটাৰি।"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি বেটাৰী <xliff:g id="PERCENTAGE">%1$s</xliff:g> শতাংশ, প্ৰায় <xliff:g id="TIME">%2$s</xliff:g> বাকী আছে"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ফ’নৰ ছেটিঙৰ ওপৰত নিৰ্ভৰ কৰি ৰিং কৰিব অথবা কম্পন হ’ব পাৰে। <xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাৰ্তালাপ ডিফ’ল্ট হিচাপে বাবল হয়।"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"উপঙি থকা এটা শ্বৰ্টকাটৰ জৰিয়তে এই সমলখিনিৰ প্ৰতি আপোনাক মনোযোগী কৰি ৰাখে।"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"এই জাননীটোৱে ধ্বনি নে কম্পন সৃষ্টি কৰিব সেয়া ছিষ্টেমটোক নিৰ্ধাৰণ কৰিবলৈ দিয়ক"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"বাৰ্তালাপ শাখাটোৰ শীৰ্ষত দেখুৱায়, ওপঙা বাবল হিচাপে দেখা পোৱা যায়, লক স্ক্ৰীনত প্ৰ’ফাইলৰ চিত্ৰ প্ৰদৰ্শন কৰে"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ছেটিংসমূহ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"অগ্ৰাধিকাৰ"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"এই এপে আপোনাৰ স্ক্ৰীণত থকা অন্য় এপৰ ওপৰত প্ৰদৰ্শিত হৈ মাইক্ৰ\'ফ\'ন আৰু কেমেৰা ব্য়ৱহাৰ কৰি আছে।"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"ছেটিংসমূহ"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ঠিক আছে"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"ছিষ্টেমটোৱে এই জাননীক নীৰৱ কৰিছে।"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"ছিষ্টেমটোৱে এই জাননীটোৰ ক্ষেত্ৰত দিয়া গুৰুত্ব বৃদ্ধি কৰিছে।"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"ছিষ্টেমটোৱে এই জাননীটোৰ ক্ষেত্ৰত দিয়া গুৰুত্ব হ্ৰাস কৰিছে।"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"এইটো শুদ্ধ আছিলনে?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"আপোনাৰ মতামতৰ বাবে ধন্যবাদ!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ঠিক আছে"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index d201926..84f9560 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Batareya üç xətdir."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Batareya doludur"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batareyanın faizi naməlumdur."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Telefon yoxdur."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Şəbəkə bir xətdir."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Şəbəkə iki xətdir."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Şəbəkə üç xətdir."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Tam şəbəkə."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Məlumat yoxdur."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Data bir xətdir."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Data iki xətdir."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data üç xətdir."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Data siqnalı tamdır."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> üzərindən qoşuldu."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> üzərindən qoşuldu."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> cihazına qoşulub."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX iki xətdir."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX üç xətdir."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX siqnalı tamdır."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet bağlantısı kəsilib."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet qoşuludur."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Siqnal yoxdur."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Qoşulu deyil."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Sıfır xətt."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Deaktiv"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Qoşuludur."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Birləşdirilir."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Rominq"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM yoxdur"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobil Data"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobil Data Aktivdir"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobil data deaktivdir"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Data istifadə etmək üçün ayarlanmayıb"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Deaktiv"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth tezering."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Uçuş rejimi"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN aktivdir."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM kart yoxdur."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Operator şəbəkəsinin dəyişilməsi"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Batareya detallarını açın"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Batareya <xliff:g id="NUMBER">%d</xliff:g> faizdir."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Batareya <xliff:g id="PERCENTAGE">%1$s</xliff:g> faizdir, istifadəyə əsasən təxminən <xliff:g id="TIME">%2$s</xliff:g> qalıb"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Telefon ayarlarına əsasən zəng çala və ya vibrasiya edə bilər. <xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqindən söhbətlərdə defolt olaraq qabarcıq çıxır."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Bu məzmuna üzən qısayol ilə diqqətinizi cəlb edir."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Bu bildirişin səs çıxarması və ya vibrasiya etməsi sistem tərəfindən təyin edilsin"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Söhbət bölməsinin yuxarısında göstərilir, üzən qabarcıq kimi görünür, kilid ekranında profil şəkli göstərir"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ayarlar"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Bu tətbiq ekranda digər tətbiqlərin üzərində göstərilir və mikrofon ilə kameradan istifadə edir."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Ayarlar"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Bu bildiriş sistem tərəfindən səssiz edilib."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Bu bildiriş sistem tərəfindən irəli çəkilib."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Bu bildiriş sistem tərəfindən geri çəkilib."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Bu, doğru oldu?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Rəyiniz üçün təşəkkür edirik!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index aa44b36..7c0e652 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Baterija od tri crte."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Baterija je puna."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Procenat napunjenosti baterije nije poznat."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Nema telefona."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Signal telefona ima jednu crtu."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Signal telefona od dve crte."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Signal telefona od tri crte."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Signal telefona je pun."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Nema podataka."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Signal za podatke ima jednu crtu."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Signal za podatke od dve crte."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Signal za podatke od tri crte."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Signal za podatke je najjači."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Povezani ste sa <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Povezani ste sa <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Povezani smo sa uređajem <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX signal ima dve crte."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX signal ima tri crte."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX signal je najjači."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Veza sa eternetom je prekinuta."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Eternet je povezan."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Nema signala."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nije povezano."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Nijedna crta."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Isključeno."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Povezano je."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Povezivanje."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"WiFi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Nema SIM kartice."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobilni podaci"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobilni podaci su uključeni"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobilni podaci su isključeni"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Nije podešeno za korišćenje podataka"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Isključeno"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth privezivanje."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Režim rada u avionu."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN je uključen."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Nema SIM kartice."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Promena mreže mobilnog operatera"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Otvori detalje o bateriji"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Baterija je na <xliff:g id="NUMBER">%d</xliff:g> posto."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Baterija je na <xliff:g id="PERCENTAGE">%1$s</xliff:g> posto, preostalo vreme na osnovu korišćenja je <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -726,6 +701,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Može da zvoni ili vibrira u zavisnosti od podešavanja telefona. Konverzacije iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> se podrazumevano prikazuju u oblačićima."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Privlači vam pažnju pomoću plutajuće prečice do ovog sadržaja."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Neka sistem utvrdi da li ovo obaveštenje treba da emituje zvuk ili da vibrira"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikazuje se u vrhu odeljka za konverzacije kao plutajući oblačić, prikazuje sliku profila na zaključanom ekranu"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Podešavanja"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
@@ -744,9 +727,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Ova aplikacija se prikazuje preko drugih aplikacija na ekranu i koristi mikrofon i kameru."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Podešavanja"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Potvrdi"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Sistem je isključio ovo obaveštenje."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Sistem je promovisao ovo obaveštenje."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Sistem je postavio ovo obaveštenje na dno."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Da li je to tačno?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Hvala vam na povratnim informacijama!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Potvrdi"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index bc28f9b..65d45b9 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Тры планкі акумулятара."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Акумулятар поўны."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Працэнт зараду акумулятара невядомы."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Няма тэлефона."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Адна планка на тэлефоне."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"2 планкі тэлефона."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"3 планкі тэлефона."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Поўны сігнал тэлефона."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Няма дадзеных."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Адна планка дадзеных."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"2 планкі дадзеных."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"3 планкі дадзеных."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Поўны сігнал перадачы дадзеных."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Падключаны да <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Падлучаны да <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Ёсць падключэнне да <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Два слупкi сiгналу WiMAX."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Тры слупкi сiгналу WiMAX."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Моцны сiгнал WiMAX."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet адлучаны."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet падлучаны."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Няма сігналу."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Няма падключэння."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Няма."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Выключана."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Падключана."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Падлучэнне."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роўмінг"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Няма SIM-карты."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Мабільная перадача даных"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Мабільная перадача даных уключана"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Мабільная перадача даных выключана"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Не зададзена для выкарыстання даных"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Выключана"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Сувязь па Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Рэжым палёту."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN уключана."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Няма SIM-карты."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Змяненне аператара сеткі"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Паказаць падрабязную інфармацыю пра акумулятар"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Працэнт зараду акумулятара: <xliff:g id="NUMBER">%d</xliff:g>."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Зарад акумулятара ў працэнтах: <xliff:g id="PERCENTAGE">%1$s</xliff:g>. Пры такім выкарыстанні яго хопіць прыблізна на <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -729,6 +704,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"У залежнасці ад налад тэлефона магчымы званок або вібрацыя. Размовы ў праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" стандартна паяўляюцца ў выглядзе ўсплывальных апавяшчэнняў."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Прыцягвае ўвагу да гэтага змесціва ўсплывальнай кнопкай."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Сістэма сама будзе вызначаць, ці трэба для гэтага апавяшчэння ўключаць гук або вібрацыю"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Паказваецца ўверсе раздзела размоў, як усплывальнае апавяшчэнне, паказвае фота профілю на экране блакіроўкі"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Налады"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Прыярытэт"</string>
@@ -747,9 +730,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Гэта праграма паказваецца на экране паверх іншых праграм. Яна выкарыстоўвае мікрафон і камеру."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Налады"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ОК"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Гук гэтага апавяшчэння выключаны сістэмай."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Прыярытэт гэтага апавяшчэння павышаны сістэмай."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Прыярытэт гэтага апавяшчэння паніжаны сістэмай."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Усё правільна?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Дзякуй за водгук!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ОК"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index faa7e56..6f90c2a 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Батерията е с три чертички."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Батерията е пълна."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Процентът на батерията е неизвестен."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Няма телефон."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Телефонът е с една чертичка."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Телефонът е с две чертички."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Телефонът е с три чертички."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Сигналът за телефона е пълен."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Няма данни."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Данните са с една чертичка."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Данните са с две чертички."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Данните са с три чертички."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Сигналът за данни е пълен."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Има връзка с <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Има връзка с <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Установена е връзка с/ъс <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX е с две чертички."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX е с три чертички."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Сигналът за WiMAX е пълен."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Връзката с Ethernet е прекратена."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Установена е връзка с Ethernet."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Няма сигнал."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Няма връзка."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Нула чертички."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Изкл."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Има връзка."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Установява се връзка."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роуминг"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Няма SIM карта."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Мобилни данни"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Мобилните данни са включени"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Мобилните данни са изключени"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Не е зададено да използва данни"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Изключени"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Тетъринг през Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Самолетен режим."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"Функцията за виртуална частна мрежа (VPN) е включена."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Няма SIM карта."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Промяна на мрежата на оператора"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Отваряне на подробностите за батерията"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"<xliff:g id="NUMBER">%d</xliff:g> процента батерия."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Батерията е на <xliff:g id="PERCENTAGE">%1$s</xliff:g> процента. Още около <xliff:g id="TIME">%2$s</xliff:g> въз основа на използването"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Може да звъни или да вибрира въз основа на настройките за телефона. Разговорите от <xliff:g id="APP_NAME">%1$s</xliff:g> се показват като балончета по подразбиране."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Задържа вниманието ви посредством плаващ пряк път към това съдържание."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Нека системата да определя дали дадено известие да се придружава от звук, или вибриране"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Показва се като плаващо балонче в горната част на секцията с разговори, показва снимката на потр. профил на заключения екран"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Настройки"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Това приложение се показва върху други приложения на екрана и използва микрофона и камерата."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Настройки"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Това известие бе заглушено от системата."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Това известие бе повишено от системата."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Това известие бе понижено от системата."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Правилно ли е това?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Благодарим ви за отзивите!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ОК"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 04fd1ca..6b23edc 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"তিন দন্ড ব্যাটারি রয়েছে৷"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"ব্যাটারি পূর্ণ রয়েছে৷"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ব্যাটারি কত শতাংশ আছে তা জানা যায়নি।"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"কোনো ফোনের সংকেত নেই৷"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"এক দন্ড ফোনের সংকেত রয়েছে৷"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"দুই দন্ড ফোনের সংকেত রয়েছে৷"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"তিন দন্ড ফোনের সংকেত রয়েছে৷"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"ফোনের সংকেত পূর্ণ রয়েছে৷"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"কোনো ডেটা নেই৷"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"এক দন্ড ডেটার সংকেত৷"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"দুই দন্ড ডেটার সংকেত রয়েছে৷"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"তিন দন্ড ডেটার সংকেত৷"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"পূর্ণ ডেটার সংকেত রয়েছে৷"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> এর সাথে সংযুক্ত।"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>এ সংযুক্ত হয়ে আছে।"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> এর সাথে সংযুক্ত৷"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX এ দুইটি দণ্ড৷"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX এ তিনটি দণ্ড৷"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX এ সম্পূর্ণ সিগন্যাল৷"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ইথারনেটের সংযোগ বিচ্ছিন্ন হয়েছে৷"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ইথারনেট সংযুক্ত হয়েছে৷"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"কোনো সিগন্যাল নেই৷"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"সংযুক্ত নয়৷"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"কোনো দণ্ড নেই৷"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"বন্ধ৷"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"সংযুক্ত৷"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"সংযুক্ত হচ্ছে৷"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"রোমিং"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"ওয়াই-ফাই"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"কোনো সিম নেই৷"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"মোবাইল ডেটা"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"মোবাইল ডেটা চালু আছে"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"মোবাইল ডেটা বন্ধ করা হয়েছে"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"ডেটা ব্যবহার করার জন্য সেট করা নেই"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"বন্ধ"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ব্লুটুথ টিথারিং৷"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"বিমান মোড৷"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN চালু আছে।"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"কোনো সিম কার্ড নেই।"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"পরিষেবা প্রদানকারীর নেটওয়ার্ক পরিবর্তন করা হচ্ছে"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"ব্যাটারির বিশদ বিবরণ খুলুন"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"<xliff:g id="NUMBER">%d</xliff:g> শতাংশ ব্যাটারি রয়েছে৷"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"ব্যাটারি <xliff:g id="PERCENTAGE">%1$s</xliff:g> শতাংশ, বর্তমান ব্যবহারের উপর ভিত্তি করে আর <xliff:g id="TIME">%2$s</xliff:g> চলবে"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ফোনের সেটিংস অনুযায়ী ফোন রিং বা ভাইব্রেট হতে পারে। <xliff:g id="APP_NAME">%1$s</xliff:g>-এর কথোপকথন সাধারণত বাবলের মতো দেখাবে।"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ফ্লোটিং শর্টকাট ব্যবহার করে এই কন্টেন্টে আপনার দৃষ্টি আকর্ষণ করে রাখে।"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"এই বিজ্ঞপ্তি এলে ডিভাইস আওয়াজ করবে না ভাইব্রেট করবে তা সিস্টেমকে সেট করতে দিন"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"কথোপকথন বিভাগের উপরে ভাসমান বাবলের মতো দেখা যাবে, লক স্ক্রিনে প্রোফাইল ছবি দেখাবে"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"সেটিংস"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"অগ্রাধিকার"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"এই অ্যাপটি স্ক্রিনে অন্যান্য অ্যাপের উপরে দেখানো হচ্ছে এবং মাইক্রোফোন ও ক্যামেরা ব্যবহার করছে।"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"সেটিংস"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ঠিক আছে"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"সিস্টেম এই বিজ্ঞপ্তি মিউট করে রেখেছিল।"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"সিস্টেম এই বিজ্ঞপ্তি দেখাতে চেয়েছে।"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"সিস্টেম এই বিজ্ঞপ্তি বন্ধ রেখেছে।"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"এটি কি সঠিক ছিল?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"মতামতের জন্য ধন্যবাদ!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"বুঝেছি"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index e2a623c..bb2bd8b 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Baterija na tri crtice."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Baterija je puna."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Postotak napunjenosti baterije nije poznat"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Nema telefonskog signala."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefonski signal na jednoj crtici."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefonski signal na dvije crtice."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefonski signal na tri crtice."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Telefonski signal pun."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Nema podataka."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Prijenos podataka na jednoj crtici."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Prijenos podataka na dvije crtice."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Prijenos podataka na tri crtice."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Signal za prijenos podataka pun."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Povezan na <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Povezan na <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Povezan na <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX signal na dvije crtice."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX signal na tri crtice."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX signal pun."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Veza sa Ethernetom je prekinuta."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet je spojen."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Nema signala."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nije povezano."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Nema crtica."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Isključeno."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Povezano"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Povezivanje."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"WiFi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Nema SIM kartice."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Prijenos podataka na mobilnoj mreži"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Prijenos podataka na mobilnoj mreži je uključen"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Prijenos podataka na mobilnoj mreži je isključen"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Nije postavljeno za korištenje podataka"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Isključeno"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Dijeljenje Bluetooth veze."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Način rada u avionu."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN uključen."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Nema SIM kartice."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Promjena mreže mobilnog operatera"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Otvori detalje o potrošnji baterije"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Baterija na <xliff:g id="NUMBER">%d</xliff:g> posto."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Baterija je na <xliff:g id="PERCENTAGE">%1$s</xliff:g> posto. Na osnovu vaše potrošnje preostalo vam je otprilike <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -726,6 +701,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Može zvoniti ili vibrirati na osnovu postavki vašeg telefona. Razgovori iz oblačića u aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> kao zadana opcija."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Privlači vašu pažnju pomoću plutajuće prečice do ovog sadržaja."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Neka sistem odluči treba li se ovo obavještenje oglasiti zvukom ili vibracijom"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikazuje se na vrhu odjeljka za razgovor, pojavljuje se kao plutajući oblačić, prikazuje sliku profila na zaključanom ekranu"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Postavke"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetni"</string>
@@ -744,9 +727,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Ova aplikacija prekriva druge aplikacije na ekranu i koristi mikrofon i kameru."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Postavke"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Uredu"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Sistem je utišao ovo obavještenje."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Sistem je pomovirao ovo obavještenje."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Sistem je umanjio značaj ovog obavještenja."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Je li ovo bilo tačno?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Hvala na povratnim informacijama!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"UREDU"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 1fa0c9a..bb7bdd4 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Bateria: tres barres."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Bateria carregada."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Es desconeix el percentatge de bateria."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"No hi ha senyal de telèfon."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Senyal de telèfon: una barra"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Senyal de telèfon: dues barres."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Senyal de telèfon: tres barres."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Senyal de telèfon: complet."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Senyal de dades: no n\'hi ha"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Senyal de dades: una barra."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Senyal de dades: dues barres."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Senyal de dades: tres barres."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Senyal de dades: complet."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"S\'ha connectat a <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"S\'ha connectat a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Està connectat amb <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Dues barres de WiMAX."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Tres barres de WiMAX."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Senyal de WiMAX plena."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"S\'ha desconnectat l\'Ethernet."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet connectada"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Sense senyal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Sense connexió."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Cap barra."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Desactivat."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Connectat"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"S’està connectant."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Itinerància"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"No hi ha cap SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Dades mòbils"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Dades mòbils activades"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"S\'han desactivat les dades mòbils"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"No s\'ha definit per utilitzar dades"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Desactivades"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Compartició de xarxa per Bluetooth"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Mode d\'avió."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN activada"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"No hi ha cap SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"S\'està canviant la xarxa de l\'operador de telefonia mòbil"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Obre els detalls de la bateria"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"<xliff:g id="NUMBER">%d</xliff:g> per cent de bateria."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> per cent de bateria amb aproximadament <xliff:g id="TIME">%2$s</xliff:g> de temps restant segons l\'ús que en fas"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Pot sonar o vibrar en funció de la configuració del telèfon. Les converses de l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g> es mostren com a bombolles de manera predeterminada."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Atrau la teva atenció amb una drecera flotant a aquest contingut."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Fes que el sistema determini si aquesta notificació ha d\'emetre un so o una vibració"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Es mostra com a bombolla flotant a la part superior de la secció de converses i mostra la foto de perfil a la pantalla de bloqueig"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuració"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritat"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Aquesta aplicació es mostra sobre altres aplicacions a la pantalla i utilitza el micròfon i la càmera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Configuració"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"D\'acord"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"El sistema ha silenciat aquesta notificació."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"El sistema ha augmentat el nivell d\'aquesta notificació."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"El sistema ha disminuït el nivell d\'aquesta notificació."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"La informació ha estat correcta?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Gràcies pels suggeriments."</string>
     <string name="feedback_ok" msgid="6481426753298857144">"D\'acord"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index e414fd0..7cfe95c 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Tři čárky baterie."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Baterie je nabitá."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Procento baterie není známé."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Žádná telefonní síť."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Jedna čárka signálu telefonní sítě."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Dvě čárky signálu telefonní sítě."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Tři čárky signálu telefonní sítě."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Plný signál telefonní sítě."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Žádné datové připojení."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Jedna čárka signálu datové sítě."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Dvě čárky signálu datové sítě."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Tři čárky signálu datové sítě."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Plný signál datové sítě."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Připojeno k zařízení <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Připojeno k zařízení <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Jste připojeni k zařízení <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Dvě čárky signálu sítě WiMAX."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Tři čárky signálu sítě WiMAX."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Plný signál sítě WiMAX."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Síť ethernet je odpojena."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Síť ethernet je připojena."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Není signál."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nepřipojeno."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Žádná čárka."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Vypnuto."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Připojeno."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Připojování."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Žádná SIM karta."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobilní data"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobilní data jsou zapnuta"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobilní data jsou vypnuta"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Nenastaveno k využití dat"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Vypnuto"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Sdílené připojení přes Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Režim Letadlo."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN je zapnuto."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Chybí SIM karta"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Probíhá změna sítě operátora"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Otevřít podrobnosti o baterii"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Stav baterie: <xliff:g id="NUMBER">%d</xliff:g> procent."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Baterie je nabitá na <xliff:g id="PERCENTAGE">%1$s</xliff:g> procent, při vašem používání vydrží ještě <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -729,6 +704,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Může vyzvánět nebo vibrovat v závislosti na nastavení telefonu. Konverzace z aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> ve výchozím nastavení bublají."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Přitahuje pozornost pomocí plovoucí zkratky k tomuto obsahu."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Nechat systém rozhodnout, zda má toto oznámení vydat zvuk či zavibrovat"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Zobrazuje se v horní části sekce konverzací a má podobu plovoucí bubliny, zobrazuje profilovou fotku na obrazovce uzamčení"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavení"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string>
@@ -747,9 +730,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Tato aplikace se zobrazuje přes ostatní aplikace na obrazovce a využívá mikrofon a fotoaparát."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Nastavení"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Toto oznámení systém ztlumil."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"U tohoto oznámení systém zvýšil prioritu."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"U tohoto oznámení systém snížil prioritu."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Udělal to správně?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Děkujeme za zpětnou vazbu."</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 4be2c26..5bde4d8 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Batteri tre bjælker."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Batteri fuldt."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batteriniveauet er ukendt."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Ingen telefon."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefon en bjælke."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefon to bjælker."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefon tre bjælker."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Telefonsignal fuldt."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Ingen data."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Data en bjælke."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Data to bjælker."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data tre bjælker."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Datasignal fuldt."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Tilsluttet <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Tilsluttet <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Forbundet til <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX to bjælker."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX tre bjælker."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX-signal er fuldt."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet er ikke tilsluttet."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet er tilsluttet."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Intet signal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Ikke tilsluttet."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Nul bjælker."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Fra."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Forbundet."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Opretter forbindelse..."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Intet SIM-kort."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobildata"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobildata er aktiveret"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobildata er deaktiveret"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Ikke indstillet til at anvende data"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Fra"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth-netdeling."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Flytilstand."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN er slået til."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Der er ikke noget SIM-kort."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Skift af mobilnetværk"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Åbn oplysninger om batteri"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Batteri <xliff:g id="NUMBER">%d</xliff:g> procent."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Batteriniveauet er på <xliff:g id="PERCENTAGE">%1$s</xliff:g> procent, så du har ca. <xliff:g id="TIME">%2$s</xliff:g> tilbage, alt efter hvordan du bruger enheden"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Kan ringe eller vibrere baseret på telefonens indstillinger. Samtaler fra <xliff:g id="APP_NAME">%1$s</xliff:g> vises som standard i bobler."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Fastholder din opmærksomhed med en svævende genvej til indholdet."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Få systemet til at afgøre, om denne notifikation skal vibrere eller afspille en lyd"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Vises øverst i samtalesektionen som en svævende boble og med profilbillede på låseskærmen"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Indstillinger"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Denne app vises over andre apps på din skærm og anvender mikrofonen og kameraet."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Indstillinger"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Denne notifikation blev sat på lydløs af systemet."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Denne notifikation blev rykket op af systemet."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Denne notifikation blev rykket ned af systemet."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Var dette korrekt?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Tak for din feedback"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 0386240..14e7e16 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Akku - drei Balken"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Akku voll"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akkustand unbekannt."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Kein Telefon"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefonsignal - ein Balken"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefonsignal - zwei Balken"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefonsignal - drei Balken"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Volle Telefonsignalstärke"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Keine Daten"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Datensignal - ein Balken"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Datensignal - zwei Balken"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Datensignal - drei Balken"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Volle Datensignalstärke"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Mit <xliff:g id="WIFI">%s</xliff:g> verbunden"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Mit <xliff:g id="BLUETOOTH">%s</xliff:g> verbunden"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Verbunden mit <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX - zwei Balken"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX - drei Balken"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Volle WiMAX-Signalstärke"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet nicht verbunden"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet verbunden"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Kein Signal"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nicht verbunden"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Kein Balken"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Aus"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Verbunden"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Verbindung wird hergestellt."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"WLAN"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Keine SIM-Karte"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobile Daten"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobile Datennutzung aktiviert"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobile Daten deaktiviert"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Nicht für Datennutzung konfiguriert"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Aus"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth-Tethering"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Flugmodus"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN an."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Keine SIM-Karte"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Mobilfunknetzwerk wird gewechselt"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Akkudetails öffnen"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Akku bei <xliff:g id="NUMBER">%d</xliff:g> Prozent."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Akku bei <xliff:g id="PERCENTAGE">%1$s</xliff:g> Prozent. Bei deinem Nutzungsmuster hast du noch Strom für etwa <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Kann klingeln oder vibrieren, je nach Telefoneinstellungen. Unterhaltungen von <xliff:g id="APP_NAME">%1$s</xliff:g> werden standardmäßig als Bubble angezeigt."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Du wirst mit einer unverankerten Verknüpfung darauf aufmerksam gemacht."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Das System entscheiden lassen, ob bei dieser Benachrichtigung ein Ton oder eine Vibration ausgegeben wird"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wird oben im Bereich \"Unterhaltungen\" als unverankerte Bubble mit einem Profilbild auf dem Sperrbildschirm angezeigt"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Einstellungen"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorität"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Diese App wird über anderen Apps auf dem Bildschirm angezeigt und verwendet das Mikrofon und die Kamera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Einstellungen"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Ok"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Diese Benachrichtigung wurde vom System stummgeschaltet."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Diese Benachrichtigung wurde vom System hochgestuft."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Diese Benachrichtigung wurde vom System heruntergestuft."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"War das richtig?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Vielen Dank für dein Feedback."</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 2985064..1e65310 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Τρεις γραμμές μπαταρίας."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Πλήρης μπαταρία."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Άγνωστο ποσοστό μπαταρίας."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Δεν υπάρχει τηλέφωνο."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Μία γραμμή τηλεφώνου."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Δύο γραμμές τηλεφώνου."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Τρεις γραμμές μπαταρίας."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Πλήρες σήμα τηλεφώνου."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Δεν υπάρχουν δεδομένα."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Μία γραμμή δεδομένων."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Δύο γραμμές δεδομένων."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Τρεις γραμμές δεδομένων."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Πλήρες σήμα δεδομένων."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Συνδέθηκε στο <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Συνδέθηκε στο <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Συνδέθηκε σε <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Σήμα WiMAX δύο γραμμές."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Σήμα WiMAX τρεις γραμμές."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Πλήρες σήμα WiMAX."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Το Ethernet αποσυνδέθηκε."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Το Ethernet συνδέθηκε."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Δεν υπάρχει σήμα."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Μη συνδεδεμένο"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Μηδέν γραμμές."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Ανενεργό."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Έχει συνδεθεί."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Σύνδεση."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Περιαγωγή"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Δεν υπάρχει SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Δεδομένα κινητής τηλεφωνίας"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Τα δεδομένα κινητής τηλεφωνίας ενεργοποιήθηκαν"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Τα δεδομένα κινητής τηλεφωνίας απενεργοποιήθηκαν"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Δεν ρυθμίστηκε ώστε να χρησιμοποιεί δεδομένα"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Ανενεργά"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Σύνδεση με Bluetooth"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Λειτουργία πτήσης."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ενεργό."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Δεν υπάρχει κάρτα SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Αλλαγή δικτύου εταιρείας κινητής τηλεφωνίας"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Άνοιγμα λεπτομερειών μπαταρίας"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Μπαταρία <xliff:g id="NUMBER">%d</xliff:g> τοις εκατό."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Μπαταρία στο <xliff:g id="PERCENTAGE">%1$s</xliff:g> τοις εκατό. Περίπου <xliff:g id="TIME">%2$s</xliff:g> ακόμη, βάσει της χρήσης σας"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Ενδέχεται να κουδουνίζει ή να δονείται βάσει των ρυθμίσεων του τηλεφώνου. Οι συζητήσεις από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> εμφανίζονται σε συννεφάκι από προεπιλογή."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Κρατάει την προσοχή σας με μια κινούμενη συντόμευση προς αυτό το περιεχόμενο."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Επιτρέψτε στο σύστημα να αποφασίσει αν αυτή η ειδοποίηση θα αναπαράγει έναν ήχο ή θα ενεργοποιήσει τη δόνηση της συσκευής"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Εμφανίζεται επάνω στις συζητήσεις, προβάλλεται ως κιν. συννεφάκι, εμφανίζει τη φωτ. προφίλ στην οθ. κλειδ."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ρυθμίσεις"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Προτεραιότητα"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Αυτή η εφαρμογή εμφανίζεται πάνω σε άλλες εφαρμογές στην οθόνη σας και χρησιμοποιεί το μικρόφωνο και την κάμερα."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Ρυθμίσεις"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ΟΚ"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Αυτή η ειδοποίηση τέθηκε σε σίγαση από το σύστημα."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Αυτή η ειδοποίηση προωθήθηκε από το σύστημα."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Αυτή η ειδοποίηση υποβιβάστηκε από το σύστημα."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Ήταν σωστό αυτό;"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Σας ευχαριστούμε για τα σχόλιά σας!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ΟΚ"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index fbc0396..0779fba 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Battery three bars."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Battery full."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"No phone."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Phone one bar."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Phone two bars."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Phone three bars."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Phone signal full."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"No data."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Data one bar."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Data two bars."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data three bars."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Data signal full."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Connected to <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Connected to <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX two bars."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX three bars."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX signal full."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet disconnected."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet connected."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"No signal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Not connected."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Zero bars."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Off."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Connected."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Connecting."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"No SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobile data"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobile data on"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobile data off"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Not set to use data"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Off"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth tethering"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Aeroplane mode"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN on."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"No SIM card."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Operator network changing"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Open battery details"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Battery <xliff:g id="PERCENTAGE">%1$s</xliff:g> percentage, about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"May ring or vibrate based on phone settings. Conversations from <xliff:g id="APP_NAME">%1$s</xliff:g> bubble by default."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Keeps your attention with a floating shortcut to this content."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Have the system determine if this notification should make sound or vibration"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"This app is displaying over other apps on your screen and using the microphone and camera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Settings"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"This notification was silenced by the system."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"This notification was promoted by the system."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"This notification was demoted by the system."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Was this correct?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Thanks for your feedback!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index a8eed15..3d93f9f 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Battery three bars."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Battery full."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"No phone."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Phone one bar."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Phone two bars."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Phone three bars."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Phone signal full."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"No data."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Data one bar."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Data two bars."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data three bars."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Data signal full."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Connected to <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Connected to <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX two bars."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX three bars."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX signal full."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet disconnected."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet connected."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"No signal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Not connected."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Zero bars."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Off."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Connected."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Connecting."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"No SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobile data"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobile data on"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobile data off"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Not set to use data"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Off"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth tethering"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Airplane mode."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN on."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"No SIM card."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Operator network changing"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Open battery details"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Battery <xliff:g id="PERCENTAGE">%1$s</xliff:g> percentage, about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"May ring or vibrate based on phone settings. Conversations from <xliff:g id="APP_NAME">%1$s</xliff:g> bubble by default."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Keeps your attention with a floating shortcut to this content."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Have the system determine if this notification should make sound or vibration"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"This app is displaying over other apps on your screen and using the microphone and camera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Settings"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"This notification was silenced by the system."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"This notification was promoted by the system."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"This notification was demoted by the system."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Was this correct?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Thanks for your feedback!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index fbc0396..0779fba 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Battery three bars."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Battery full."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"No phone."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Phone one bar."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Phone two bars."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Phone three bars."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Phone signal full."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"No data."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Data one bar."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Data two bars."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data three bars."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Data signal full."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Connected to <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Connected to <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX two bars."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX three bars."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX signal full."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet disconnected."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet connected."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"No signal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Not connected."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Zero bars."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Off."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Connected."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Connecting."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"No SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobile data"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobile data on"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobile data off"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Not set to use data"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Off"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth tethering"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Aeroplane mode"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN on."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"No SIM card."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Operator network changing"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Open battery details"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Battery <xliff:g id="PERCENTAGE">%1$s</xliff:g> percentage, about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"May ring or vibrate based on phone settings. Conversations from <xliff:g id="APP_NAME">%1$s</xliff:g> bubble by default."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Keeps your attention with a floating shortcut to this content."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Have the system determine if this notification should make sound or vibration"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"This app is displaying over other apps on your screen and using the microphone and camera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Settings"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"This notification was silenced by the system."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"This notification was promoted by the system."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"This notification was demoted by the system."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Was this correct?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Thanks for your feedback!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index fbc0396..0779fba 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Battery three bars."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Battery full."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"No phone."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Phone one bar."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Phone two bars."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Phone three bars."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Phone signal full."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"No data."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Data one bar."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Data two bars."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data three bars."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Data signal full."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Connected to <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Connected to <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX two bars."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX three bars."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX signal full."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet disconnected."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet connected."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"No signal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Not connected."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Zero bars."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Off."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Connected."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Connecting."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"No SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobile data"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobile data on"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobile data off"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Not set to use data"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Off"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth tethering"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Aeroplane mode"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN on."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"No SIM card."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Operator network changing"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Open battery details"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Battery <xliff:g id="PERCENTAGE">%1$s</xliff:g> percentage, about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"May ring or vibrate based on phone settings. Conversations from <xliff:g id="APP_NAME">%1$s</xliff:g> bubble by default."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Keeps your attention with a floating shortcut to this content."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Have the system determine if this notification should make sound or vibration"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"This app is displaying over other apps on your screen and using the microphone and camera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Settings"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"This notification was silenced by the system."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"This notification was promoted by the system."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"This notification was demoted by the system."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Was this correct?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Thanks for your feedback!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 47bda8b..7d7e4b9 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‏‎‎‎‏‏‎Battery three bars.‎‏‎‎‏‎"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‎‏‏‎‏‎‎‏‎‏‏‏‎‎Battery full.‎‏‎‎‏‎"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‎‏‎‏‏‎‎‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‎‏‏‎‎‏‏‏‏‎‎‎‎Battery percentage unknown.‎‏‎‎‏‎"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎‏‎‎‏‏‎‏‏‎‎‎‏‏‏‎‎‎‏‎No phone.‎‏‎‎‏‎"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎‏‎‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‎‎‏‏‏‎‏‎‎‎Phone one bar.‎‏‎‎‏‎"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎Phone two bars.‎‏‎‎‏‎"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‎‏‏‎‎‏‏‎‏‏‏‎‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‎‏‏‎‎Phone three bars.‎‏‎‎‏‎"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎Phone signal full.‎‏‎‎‏‎"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‎‎‎‎‏‏‏‏‎‏‎‎‎‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‏‏‏‎No data.‎‏‎‎‏‎"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‏‎‎‎‏‎‎‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‎‏‏‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎Data one bar.‎‏‎‎‏‎"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‏‎‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‎Data two bars.‎‏‎‎‏‎"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‎‎‏‎‎‎‎‎‎‏‎‎‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‎‎‎‏‎‏‏‏‎‎‏‏‎‏‎‏‎‏‎‏‎Data three bars.‎‏‎‎‏‎"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‏‎‏‏‎‏‎‏‏‎‎‏‎‏‎‎‏‏‏‎‏‎‎‎‎‎‎‏‏‏‏‎Data signal full.‎‏‎‎‏‎"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‎‏‎‏‎‎‎‎‎‎‏‏‏‎‎‏‎‏‎‎‏‎‎‎‏‎‎‏‎‏‎‏‎‎‏‎‏‏‎‎Connected to ‎‏‎‎‏‏‎<xliff:g id="WIFI">%s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‏‏‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‎‏‏‎‏‎‏‏‏‎‏‏‏‏‎‎Connected to ‎‏‎‎‏‏‎<xliff:g id="BLUETOOTH">%s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‏‏‎‎‏‎‏‎‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‏‎‎‎‏‏‎‏‏‎‏‎‎‎‏‏‎‏‎‎‏‎‎‏‏‎‏‎‏‎Connected to ‎‏‎‎‏‏‎<xliff:g id="CAST">%s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‏‏‎‎‏‏‏‎‎‎‎‎‏‏‏‎‏‎‏‎‏‏‎‏‏‎‏‏‏‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎WiMAX two bars.‎‏‎‎‏‎"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‎‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‎‏‏‏‏‎‎‏‎‎WiMAX three bars.‎‏‎‎‏‎"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‏‎‏‎‏‎‎‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‏‎‎‎‏‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎WiMAX signal full.‎‏‎‎‏‎"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‏‏‏‏‎Ethernet disconnected.‎‏‎‎‏‎"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‏‏‎‎‏‎‏‏‏‎‏‎‏‎‎‎‎‏‎‏‏‎‏‏‎‏‎‎‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‎‏‎Ethernet connected.‎‏‎‎‏‎"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‏‏‎‎‎‎‎‎‎No signal.‎‏‎‎‏‎"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‏‎‎‏‎‏‎‎‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‎‎‏‎‏‏‏‏‎‎Not connected.‎‏‎‎‏‎"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‏‏‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‏‎‏‏‏‎‏‏‎Zero bars.‎‏‎‎‏‎"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‎‎Off.‎‏‎‎‏‎"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‎‎‎‏‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‏‎‎‏‏‎‏‎‎‏‎Connected.‎‏‎‎‏‎"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‏‏‏‏‎‎Connecting.‎‏‎‎‏‎"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‏‎‏‏‎‏‎‏‏‎‎‏‏‎GPRS‎‏‎‎‏‎"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‏‎‎‎‏‎‏‏‎‎‏‎‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‎‎‏‏‏‎‏‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‏‎HSPA‎‏‎‎‏‎"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‎‎‏‏‎‎‏‏‎‎‏‏‏‎‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‎3G‎‏‎‎‏‎"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‏‏‏‎‎‏‎‏‏‎‎‏‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‎‏‎‎‎‏‏‏‏‎‎‏‎‎H‎‏‎‎‏‎"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‎‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‏‎H+‎‏‎‎‏‎"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎4G‎‏‎‎‏‎"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‏‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‏‏‎4G+‎‏‎‎‏‎"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‎‎‏‎‎‏‏‏‎‎‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎LTE‎‏‎‎‏‎"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‏‏‎‏‎‏‎‎‎‏‏‎‎‎‎‎‏‏‎‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‏‎‏‎‏‎‎LTE+‎‏‎‎‏‎"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‎‏‎‏‎‎‎‎‎‏‎‏‏‎‏‏‏‎‎1X‎‏‎‎‏‎"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎‎‏‎‏‎‎‎‏‏‏‎‎‏‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‏‎‎‏‎‎‎‏‏‎‏‎Roaming‎‏‎‎‏‎"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‏‎‎‏‏‎‎‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‏‎‎‎‎‏‎‎EDGE‎‏‎‎‏‎"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎‎‏‎‏‎‏‏‏‎‏‏‏‎‎‏‎‎‏‎‎‎‎‎‏‎‎‎‏‎‎Wi-Fi‎‏‎‎‏‎"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‎‎‎‏‎‎‏‏‎‏‎‎‏‏‎‎‏‏‎‏‎‎‎‎‎‏‎‎‎‏‎‏‏‎‏‎No SIM.‎‏‎‎‏‎"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‎‏‏‎‎‏‏‏‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‎‎‎‎Mobile Data‎‏‎‎‏‎"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‎‏‎‎Mobile Data On‎‏‎‎‏‎"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‏‎‎‎Mobile data off‎‏‎‎‏‎"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‎‏‎‎‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‎‏‎‏‎‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎‏‎‏‎Not set to use data‎‏‎‎‏‎"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‎‎‎‏‏‎‎Off‎‏‎‎‏‎"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎‏‎‎‎‎‏‏‎‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‏‎Bluetooth tethering.‎‏‎‎‏‎"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‎‎‏‏‎‎‎‏‎‏‏‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‏‏‎‏‎‏‎‎‏‎Airplane mode.‎‏‎‎‏‎"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‏‎‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‎‎‎‎‏‎‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‎‏‏‎VPN on.‎‏‎‎‏‎"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‎No SIM card.‎‏‎‎‏‎"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‎‏‎‎‏‏‏‎‏‎‏‏‏‏‎‎Carrier network changing‎‏‎‎‏‎"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‎‏‎‎‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‏‏‎‏‎Open battery details‎‏‎‎‏‎"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‎‎‎‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎‎‎‏‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‎‎‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎Battery ‎‏‎‎‏‏‎<xliff:g id="NUMBER">%d</xliff:g>‎‏‎‎‏‏‏‎ percent.‎‏‎‎‏‎"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‎‏‎‏‏‏‎‎‎Battery ‎‏‎‎‏‏‎<xliff:g id="PERCENTAGE">%1$s</xliff:g>‎‏‎‎‏‏‏‎ percent, about ‎‏‎‎‏‏‎<xliff:g id="TIME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ left based on your usage‎‏‎‎‏‎"</string>
@@ -723,6 +698,10 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‏‏‏‎‎‎‏‏‎‏‏‎‏‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎‎May ring or vibrate based on phone settings. Conversations from ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ bubble by default.‎‏‎‎‏‎"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‏‏‎‎‏‏‎‏‎‎‏‎‏‏‏‏‎‎‏‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‏‎‏‎‎‎‎‏‏‏‏‎‎‏‎Keeps your attention with a floating shortcut to this content.‎‏‎‎‏‎"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‎‎‏‎‏‎‎‏‎‎‎‎‎‏‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‏‎‎‎‏‎‏‏‎Have the system determine if this notification should make sound or vibration‎‏‎‎‏‎"</string>
+    <string name="notification_channel_summary_automatic_alerted" msgid="954166812246932240">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‏‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‎‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎&lt;b&gt;Status:&lt;/b&gt; Promoted to Default‎‏‎‎‏‎"</string>
+    <string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‏‏‎‎‏‏‎‎‎‎‎‏‎‏‎‏‎‎‎‎‏‎‏‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎&lt;b&gt;Status:&lt;/b&gt; Demoted to Silent‎‏‎‎‏‎"</string>
+    <string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‏‎‎‎‎‏‎‎‏‏‎‏‎‏‎‏‎‎‎‎‎‎‎‏‏‎‎‏‎‏‏‏‎‏‎‎‎‎‎‎‏‏‎‏‏‏‎‎‏‏‎‏‎‎&lt;b&gt;Status:&lt;/b&gt; Ranked Higher‎‏‎‎‏‎"</string>
+    <string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‏‎‏‎‎‎&lt;b&gt;Status:&lt;/b&gt; Ranked Lower‎‏‎‎‏‎"</string>
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‏‏‎‎‎‎‎‎‏‎‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎‎‎‏‏‏‎‎‎‏‎Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen‎‏‎‎‏‎"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‏‎Settings‎‏‎‎‏‎"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‎Priority‎‏‎‎‏‎"</string>
@@ -741,9 +720,10 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‏‏‏‎‎‏‎‎‎‎‏‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎This app is displaying over other apps on your screen and using the microphone and camera.‎‏‎‎‏‎"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‎‏‎‏‎‏‏‏‏‏‏‎‏‏‎‎Settings‎‏‎‎‏‎"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‏‎‏‏‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‏‎‎‎‏‏‏‎‏‎‏‎‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎OK‎‏‎‎‏‎"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‎‏‎‏‏‏‎‏‎‏‏‎‎‏‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‏‏‏‎This notification was silenced by the system.‎‏‎‎‏‎"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‎‎‎‏‎‎‎‎This notification was promoted by the system.‎‏‎‎‏‎"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‎‏‎‎‎‏‎‎‎‎‎‎‏‎‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‎This notification was demoted by the system.‎‏‎‎‏‎"</string>
+    <string name="feedback_alerted" msgid="5192459808484271208">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‎‏‎‏‎‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‏‎‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‏‎‎‎‎This notification was automatically &lt;b&gt;promoted to Default&lt;/b&gt; by the system.‎‏‎‎‏‎"</string>
+    <string name="feedback_silenced" msgid="9116540317466126457">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‏‎‏‎‎‎‏‏‏‏‎‎‎‎‎‎‎‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‏‏‏‏‎‎‏‎This notification was automatically &lt;b&gt;demoted to Silent&lt;/b&gt; by the system.‎‏‎‎‏‎"</string>
+    <string name="feedback_promoted" msgid="2125562787759780807">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‎‎‏‏‎‎‎‎‎‎‎‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‏‏‎This notification was automatically &lt;b&gt;ranked higher&lt;/b&gt; in your shade.‎‏‎‎‏‎"</string>
+    <string name="feedback_demoted" msgid="951884763467110604">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‏‏‎‏‎‏‏‏‎‎‎‏‏‎‎‎‏‎‎‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‎‎‎This notification was automatically &lt;b&gt;ranked lower&lt;/b&gt; in your shade.‎‏‎‎‏‎"</string>
     <string name="feedback_prompt" msgid="2278631214125128281">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‎‏‏‏‎‎‏‏‎‏‎‎‏‎‏‏‎‎‏‎Was this correct?‎‏‎‎‏‎"</string>
     <string name="feedback_response" msgid="4671729244976641339">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‎‏‎‏‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‏‎‏‎‎‎‏‎‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‏‎Thanks for your feedback!‎‏‎‎‏‎"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‏‎‏‎‎‏‎‏‎‏‏‎‎‎‏‎‎‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎‎‏‎‏‏‏‎‎‎‎OK‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index ab23eb6..5940767 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Tres barras de batería"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Batería completa"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Se desconoce el porcentaje de la batería."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Sin teléfono"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Una barra de teléfono"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Dos barras de teléfono"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Tres barras de teléfono"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Señal de teléfono completa"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"No hay datos."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Una barra de datos"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Dos barras de datos"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Tres barras de datos"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Señal de datos completa"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Conectado a <xliff:g id="WIFI">%s</xliff:g>"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Conectado a <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Dos barras de WiMAX"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Tres barras de WiMAX"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Señal de WiMAX al máximo"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet desconectada"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet conectada"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Sin señal"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"No conectado"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Cero barras"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Desactivado"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Conectado"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Conectando"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Sin tarjeta SIM"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Datos móviles"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Activar datos móviles"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Datos móviles desactivados"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"No se configuró para usar datos"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Desactivados"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Conexión Bluetooth"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Modo avión"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN activada"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Sin tarjeta SIM"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Cambio de proveedor de red"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Abrir detalles de la batería"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Batería <xliff:g id="NUMBER">%d</xliff:g> por ciento"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Batería: <xliff:g id="PERCENTAGE">%1$s</xliff:g> por ciento; tiempo restante: aproximadamente <xliff:g id="TIME">%2$s</xliff:g> en función del uso"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Puede sonar o vibrar en función de la configuración del teléfono. Conversaciones de la burbuja de <xliff:g id="APP_NAME">%1$s</xliff:g> de forma predeterminada."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Retiene tu atención con un acceso directo flotante a este contenido."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Dejar que el sistema determine si esta notificación debe emitir un sonido o una vibración"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece en la parte superior de la sección de conversaciones, en forma de burbuja flotante, y muestra la foto de perfil en la pantalla de bloqueo."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaria"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Esta app se muestra sobre otras apps en la pantalla y está usando el micrófono y la cámara."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Configuración"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Aceptar"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"El sistema silenció la notificación."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"El sistema ascendió el nivel de esta notificación."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"El sistema descendió el nivel de esta notificación."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"¿Te parece bien?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Gracias por tus comentarios."</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Aceptar"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index e589ce6..1f6a153 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Tres barras de batería"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Batería completa"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Porcentaje de batería desconocido."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Sin teléfono"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Una barra de cobertura"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Dos barras de cobertura"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Tres barras de cobertura"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Cobertura al máximo"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Sin datos"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Una barra de datos"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Dos barras de datos"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Tres barras de datos"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Señal de datos al máximo"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Conectado a <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Conectado a <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Dos barras de WiMAX"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Tres barras de WiMAX"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Señal de WiMAX al máximo"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Conexión Ethernet desconectada."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Conexión Ethernet conectada."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"No hay señal"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"No conectado"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Ninguna barra"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Desactivado"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Conectado"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Conectando."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Itinerancia"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Sin tarjeta SIM"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Datos móviles"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Datos móviles activados"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Datos desactiv."</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"No está establecido para usar los datos"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Desactivados"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Compartir conexión por Bluetooth"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Modo avión"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"La red VPN está activada."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"No hay tarjeta SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Cambiando la red del operador"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Abrir detalles de la batería"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"<xliff:g id="NUMBER">%d</xliff:g> por ciento de batería"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Queda un <xliff:g id="PERCENTAGE">%1$s</xliff:g> por ciento de batería (<xliff:g id="TIME">%2$s</xliff:g> aproximadamente según tu uso)"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Es posible que suene o vibre según los ajustes del teléfono. Las conversaciones de <xliff:g id="APP_NAME">%1$s</xliff:g> aparecen como burbujas de forma predeterminada."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Llama tu atención con un acceso directo flotante a este contenido."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Haz que el sistema determine si con esta notificación el dispositivo debe sonar o vibrar"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Se muestra arriba en la sección de conversaciones, como burbuja flotante, y la imagen de perfil aparece en la pantalla de bloqueo"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ajustes"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Esta aplicación se está mostrando sobre otras aplicaciones en tu pantalla y está usando el micrófono y la cámara."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Ajustes"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Aceptar"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"El sistema ha silenciado esta notificación."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"El sistema ha promocionado esta notificación."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"El sistema ha disminuido el nivel de esta notificación."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"¿Estuvo bien?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Gracias por tus comentarios."</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Aceptar"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index cce8d83..3e454f2 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Aku: kolm pulka."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Aku täis."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Aku laetuse protsent on teadmata."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Telefonisignaal puudub"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefonisignaal: üks pulk."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefonisignaal: kaks pulka."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefonisignaal: kolm pulka."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Telefonisignaal on tugev."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Andmed puuduvad."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Andmesignaal: üks pulk."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Andmeside: kaks pulka."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Andmeside: kolm pulka."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Andmesignaal on tugev."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Ühendatud: <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ühendatud: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Ühendatud ülekandega <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX-i on kaks riba."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX-i on kolm riba."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX-i signaal on tugev."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Etherneti-ühendus on katkestatud."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Etherneti-ühendus on loodud."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Signaal puudub."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Ühendus puudub."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Null pulka."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Väljas."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Ühendatud."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Ühenduse loomine."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Rändlus"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"WiFi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM-kaarti pole."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobiilne andmeside"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobiilne andmeside on sees"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobiilne andmeside on väljas"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Ei ole andmeside kasutamiseks seadistatud"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Väljas"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Jagamine Bluetoothiga."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Lennukirežiim."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN on sees."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM-kaarti pole."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Operaatori võrku muudetakse"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Aku üksikasjade avamine"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Aku: <xliff:g id="NUMBER">%d</xliff:g> protsenti."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Aku protsent <xliff:g id="PERCENTAGE">%1$s</xliff:g>, teie kasutuse põhjal on jäänud ligikaudu <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Võib telefoni seadete põhjal heliseda või vibreerida. Rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> vestlused kuvatakse vaikimisi mullis."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Hoiab teie tähelepanu hõljuva otseteega selle sisu juurde."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Laske süsteemil määrata, kas selle märguande puhul peaks esitama heli või vibreerima"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Kuvatakse vestluste jaotise ülaosas hõljuva mullina ja lukustuskuval kuvatakse profiilipilt"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Seaded"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteetne"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"See rakendus kuvatakse teie ekraanil muude rakenduste peal ning see kasutab mikrofoni ja kaamerat."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Seaded"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Selle märguande vaigistas süsteem."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Selle märguande ülendas süsteem."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Selle märguande alandas süsteem."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Kas see oli õige?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Täname tagasiside eest!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index ad64da2..5dcfa7f 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Bateriak hiru barra ditu."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Bateria beteta dago."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Bateriaren ehunekoa ezezaguna da."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Ez dago telefono-zenbakirik."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefono-seinaleak barra bat du."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefono-seinaleak bi barra ditu."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefono-seinaleak hiru barra ditu."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Telefono-seinale osoa."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Ez dago daturik."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Datu-seinaleak barra bat du."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Datu-seinaleak bi barra ditu."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Datu-seinaleak hiru barra ditu."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Datu-seinale osoa."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> sarera konektatuta."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> gailura konektatuta."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Hona konektatuta: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX sarearen bi barra."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX sarearen hiru barra."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX sarearen seinalea osoa."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet bidezko konexioa eten da."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet bidez konektatu da."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Ez dago seinalerik."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Konektatu gabe."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Barrarik ez."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Desaktibatuta."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Konektatuta."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Konektatzen."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Ibiltaritza"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wifia"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Ez dago SIM txartelik."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Datu-konexioa"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Datu-konexioa aktibatuta"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Desaktibatuta dago datu-konexioa"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Ez dago ezarrita datuak erabiltzeko"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Desaktibatuta"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Konexioa partekatzea (Bluetooth)"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Hegaldi-modua"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN eginbidea aktibatuta."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Ez dago SIM txartelik."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Operadorearen sarea aldatzen"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Ireki bateriaren xehetasunak"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Bateriaren karga: <xliff:g id="NUMBER">%d</xliff:g>."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Bateriak ehuneko <xliff:g id="PERCENTAGE">%1$s</xliff:g> dauka kargatuta. Zure erabilera kontuan izanda, <xliff:g id="TIME">%2$s</xliff:g> inguru gelditzen zaizkio."</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Tonua jo edo dar-dar egin dezake, telefonoaren ezarpenen arabera. Modu lehenetsian, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko elkarrizketak burbuila gisa agertzen dira."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Eduki honetarako lasterbide gainerakor bat eskaintzen dizu, arretarik gal ez dezazun."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Ezarri sistemak zehaztu dezala jakinarazpen honek soinua edo dardara egin behar duen ala ez"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Burbuila gisa agertzen da elkarrizketen atalaren goialdean, eta profileko argazkia bistaratzen du pantaila blokeatuta dagoenean"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ezarpenak"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Lehentasuna"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Aplikazioa pantailako beste aplikazioen gainean agertzen da, eta mikrofonoa eta kamera erabiltzen ari da."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Ezarpenak"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Ados"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Sistemak isilarazi egin du jakinarazpen hau."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Sistemak mailaz igo du jakinarazpen hau."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Sistemak mailaz jaitsi du jakinarazpen hau."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Zuzena al da hau?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Mila esker iritzia emateagatik!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Ados"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index f5f9580..85a89b3 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"سه نوار برای باتری."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"باتری پر است."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"درصد شارژ باتری مشخص نیست."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"بدون تلفن."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"یک نوار برای تلفن."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"دو نوار برای تلفن."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"سه نوار برای تلفن."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"قدرت امواج تلفن همراه کامل است."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"داده‌ای وجود ندارد."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"یک نوار برای داده."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"دو نوار برای داده."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"سه نوار برای داده."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"قدرت سیگنال داده کامل است."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"به <xliff:g id="WIFI">%s</xliff:g> متصل شد."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"به <xliff:g id="BLUETOOTH">%s</xliff:g> متصل شد."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"به <xliff:g id="CAST">%s</xliff:g> متصل شد."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"‏WiMAX دو نوار دارد."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"‏WiMAX سه نوار دارد."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"‏قدرت سیگنال WiMAX کامل است."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"اترنت قطع شد."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"اترنت متصل شد."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"فاقد سیگنال."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"متصل نیست."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"بدون میله."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"خاموش."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"متصل."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"در حال مرتبط‌ شدن."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+‎"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+‎"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+‎"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"فراگردی"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"بدون سیم کارت."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"داده‌ تلفن همراه"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"داده تلفن همراه روشن"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"داده تلفن همراه خاموش است"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"برای استفاده از داده تنظیم نشده است"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"خاموش"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"اشتراک‌گذاری اینترنت با بلوتوث."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"حالت هواپیما."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"‏VPN روشن است."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"سیم‌کارتی موجود نیست."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"تغییر شبکه شرکت مخابراتی"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"باز کردن جزئیات باتری"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"باتری <xliff:g id="NUMBER">%d</xliff:g> درصد."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"باتری <xliff:g id="PERCENTAGE">%1$s</xliff:g> درصد شارژ دارد، براساس مصرفتان تقریباً <xliff:g id="TIME">%2$s</xliff:g> شارژ باقی‌مانده است"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"بسته به تنظیمات ممکن است تلفن زنگ بزند یا لرزش داشته باشد. مکالمه‌های <xliff:g id="APP_NAME">%1$s</xliff:g> به‌طور پیش‌فرض در حبابک نشان داده می‌شوند."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"با میان‌بری شناور به این محتوا، توجه‌تان را جلب می‌کند."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"سیستم را تنظیم کنید که تشخیص دهد اعلان صدا و لرزش داشته باشد یا نه"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"در بالای بخش مکالمه به‌صورت حبابک شناور نشان داده می‌شود و تصویر نمایه را در صفحه قفل نمایش می‌دهد"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"تنظیمات"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"اولویت"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"این برنامه روی برنامه‌های دیگر در صفحه‌نمایش نشان داده می‌شود و از میکروفون و دوربین استفاده می‌کند."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"تنظیمات"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"تأیید"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"سیستم این اعلان را بی‌صدا کرده است."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"سیستمْ این اعلان را ارتقا داده است."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"سیستمْ این اعلان را تنزل داده است."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"این مورد درست بود؟"</string>
     <string name="feedback_response" msgid="4671729244976641339">"از بازخوردتان سپاس‌گزاریم!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"تأیید"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 65db4ce..bb17d32 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Akun virta - kolme palkkia."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Akku täynnä."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akun varaustaso ei tiedossa."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Ei puhelinverkkoyhteyttä."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Puhelinverkkosignaali - yksi palkki."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Puhelinverkkosignaali - kaksi palkkia."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Puhelinverkkosignaali - kolme palkkia."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Vahva puhelinverkkosignaali."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Ei datasignaalia."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Datasignaali - yksi palkki."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Datasignaali - kaksi palkkia."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Datasignaali - kolme palkkia"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Vahva kuuluvuus."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Yhteys: <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Yhteys: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Yhdistetty kohteeseen <xliff:g id="CAST">%s</xliff:g>"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX: kaksi palkkia."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX: kolme palkkia."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Vahva WiMAX-signaali."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet on irrotettu."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet on yhdistetty."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Ei signaalia."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Ei yhteyttä."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Nolla palkkia."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Pois käytöstä."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Yhdistetty."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Yhdistetään."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Ei SIM-korttia."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobiilidata"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobiilidata käytössä"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobiilidata poistettu käytöstä"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Ei käytä dataa"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Pois käytöstä"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Internetin jakaminen Bluetoothin kautta."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Lentokonetila."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN päällä"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Ei SIM-korttia."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Operaattorin verkko muuttuu"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Avaa akun tiedot."</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Akun virta <xliff:g id="NUMBER">%d</xliff:g> prosenttia."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Akkua jäljellä <xliff:g id="PERCENTAGE">%1$s</xliff:g> prosenttia eli noin <xliff:g id="TIME">%2$s</xliff:g> käyttösi perusteella"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Voi soida tai väristä puhelimen asetuksista riippuen. Näistä keskusteluista (<xliff:g id="APP_NAME">%1$s</xliff:g>) syntyy oletuksena kuplia."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Kelluva sisällön pikakuvake säilyttää huomiosi"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Järjestelmä valitsee, kuuluuko tästä ilmoituksesta ääntä tai väriseekö se"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Näkyy keskusteluosion yläosassa kelluvana kuplana, profiilikuva näkyy lukitusnäytöllä"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Asetukset"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Tärkeä"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Tämä sovellus näkyy näytöllä muiden sovellusten päällä ja käyttää mikrofonia sekä kameraa."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Asetukset"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Järjestelmä hiljensi tämän ilmoituksen."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Järjestelmä nosti tämän ilmoituksen tasoa."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Järjestelmä laski tämän ilmoituksen tasoa."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Oliko tämä oikein?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Kiitos palautteesta!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 9f5c98d..897a475 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Niveau de batterie : bon"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Batterie pleine"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Pourcentage de la pile inconnu."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Aucun signal"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Signal : faible"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Signal : moyen"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Signal : bon"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Signal excellent"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Aucun signal"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Signal faible"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Signal moyen"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Signal bon"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Signal excellent"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Connecté à : <xliff:g id="WIFI">%s</xliff:g>"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connecté à : <xliff:g id="BLUETOOTH">%s</xliff:g>"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Connecté à <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Signal WiMAX : moyen"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Signal WiMAX : bon"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Signal WiMAX : excellent"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet déconnecté."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet connecté."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Aucun signal"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Non connecté"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Aucun signal"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Désactivé"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Connecté"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Connexion."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Itinérance"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Aucune carte SIM"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Données cellulaires"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Données cellulaires activées"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Désactivées"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Non configuré pour l\'utilisation des données cellulaires"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Désactivé"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Partage de connexion Bluetooth"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Mode Avion"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"RPV activé."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Aucune carte SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Changer de réseau de fournisseur de services"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Ouvrir les détails de la pile"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Pile : <xliff:g id="NUMBER">%d</xliff:g> pour cent"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Pile chargée à <xliff:g id="PERCENTAGE">%1$s</xliff:g> pour cent (environ <xliff:g id="TIME">%2$s</xliff:g> d\'autonomie en fonction de votre usage)"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Peut sonner ou vibrer, selon les paramètres du téléphone. Conversations des bulles de <xliff:g id="APP_NAME">%1$s</xliff:g> par défaut."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Garde votre attention à l\'aide d\'un raccourci flottant vers ce contenu."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Faire en sorte que le système détermine si cette notification devrait émettre un son ou vibrer"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"S\'affiche en haut de la section des conversations sous forme de bulle flottante et affiche la photo du profil sur l\'écran de verrouillage"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Paramètres"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Cette application superpose du contenu par-dessus d\'autres applications à l\'écran et utilise le microphone et l\'appareil photo."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Paramètres"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Cette notification a été désactivée par le système."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Cette notification a été promue par le système."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Cette notification a été rétrogradée par le système."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Était-ce correct?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Merci de vos commentaires!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index b482c24..d756991 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Niveau de batterie : bon"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Batterie pleine"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Pourcentage de la batterie inconnu."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Aucun signal"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Signal : faible"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Signal : moyen"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Signal : bon"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Signal excellent"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Aucun signal"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Signal faible"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Signal moyen"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Signal bon"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Signal excellent"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Connecté à : <xliff:g id="WIFI">%s</xliff:g>"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connecté à : <xliff:g id="BLUETOOTH">%s</xliff:g>"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Connecté à <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Signal WiMAX : moyen"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Signal WiMAX : bon"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Signal WiMAX : excellent"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet déconnecté"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet connecté"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Aucun signal"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Non connecté"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Aucun signal"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Désactivé"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Connecté"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Connexion en cours…"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Itinérance"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Aucune carte SIM"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Données mobiles"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Données mobiles activées"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Désactivées"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Non configuré pour utiliser les données"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Désactivées"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Partage de connexion Bluetooth"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Mode Avion"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"Le VPN est activé."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Aucune carte SIM"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Modification du réseau de l\'opérateur"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Ouvrir les détails de la batterie"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Batterie : <xliff:g id="NUMBER">%d</xliff:g> pour cent"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Batterie chargée à <xliff:g id="PERCENTAGE">%1$s</xliff:g> pour cent : il reste environ <xliff:g id="TIME">%2$s</xliff:g> d\'autonomie, selon votre utilisation"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Peut sonner ou vibrer en fonction des paramètres du téléphone. Les conversations provenant de <xliff:g id="APP_NAME">%1$s</xliff:g> s\'affichent sous forme de bulles par défaut."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Attire votre attention à l\'aide d\'un raccourci flottant vers ce contenu."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Laisser le système déterminer si cette notification doit être accompagnée d\'un son ou d\'une vibration"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"S\'affiche en haut de la section des conversations, apparaît sous forme de bulle flottante, affiche la photo de profil sur l\'écran de verrouillage"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Paramètres"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Cette application se superpose aux autres applications sur l\'écran, et utilise le micro et la caméra."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Paramètres"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Le son de cette notification a été coupé par le système."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Cette notification a été mise en avant par le système."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Cette notification a été rétrogradée par le système."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Est-ce que c\'était correct ?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Merci de nous avoir envoyé vos commentaires."</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 808048b..abfdf6b 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Tres barras de batería"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Batería cargada"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Descoñécese a porcentaxe da batería."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Sen teléfono"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Unha barra de cobertura"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Dúas barras de cobertura"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Tres barras de cobertura"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Cobertura ao máximo"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Sen datos"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Unha barra de sinal de datos"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Sinal de datos: dúas barras"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Tres barras de sinal de datos"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Sinal de datos: completo"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Conectado a <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Dispositivo conectado: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Dúas barras de WiMAX"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Tres barras de WiMAX"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Sinal completo de WiMAX"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Desconectouse a Ethernet."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Conectouse a Ethernet."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Sen sinal"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Non conectada"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Ningunha barra"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Desactivada"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Conectado"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Conectando."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Itinerancia"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Sen SIM"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Datos móbiles"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Os datos móbiles están activados"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Os datos móbiles están desactivados"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Non se configurou para utilizar datos"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Desactivado"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Conexión compartida por Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Modo avión"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"A VPN está activada."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Non hai tarxeta SIM"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Cambio de rede do operador"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Abrir os detalles da batería"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Carga da batería: <xliff:g id="NUMBER">%d</xliff:g> por cento."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Batería: <xliff:g id="PERCENTAGE">%1$s</xliff:g> por cento, durará <xliff:g id="TIME">%2$s</xliff:g> co uso que adoitas darlle"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Podería soar ou vibrar en función da configuración do teléfono. Conversas desde a burbulla da aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> de forma predeterminada."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantén a túa atención cun atallo flotante a este contido."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Fai que o sistema determine se a notificación debe emitir un son ou unha vibración"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Móstranse na parte superior da sección de conversas en forma de burbulla flotante e aparece a imaxe do perfil na pantalla de bloqueo"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Esta aplicación móstrase sobre outras aplicacións da pantalla e está utilizando o micrófono e a cámara."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Configuración"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Aceptar"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"O sistema silenciou esta notificación."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"O sistema subiu o nivel desta notificación."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"O sistema diminuíu o nivel desta notificación."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"A información era correcta?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Grazas polo teu comentario"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Aceptar"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 1ba649a..a4562aa 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"બૅટરી ત્રણ બાર."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"બૅટરી પૂર્ણ."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"બૅટરીની ટકાવારી અજાણ છે."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"કોઈ ફોન નથી."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"ફોન એક બાર."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"ફોન બે બાર."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"ફોન ત્રણ બાર."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"પૂર્ણ ફોન સિગ્નલ."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"કોઈ ડેટા નથી."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"ડેટા એક બાર."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"ડેટા બે બાર."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"ડેટા ત્રણ બાર."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"ડેટા સિગ્નલ પૂર્ણ."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> થી કનેક્ટ થયેલું છે."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> થી કનેક્ટ થયાં."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> થી કનેક્ટ કરેલ."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX બે બાર."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX ત્રણ બાર."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"પૂર્ણ WiMAX સિગ્નલ."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ઇથરનેટ ડિસ્કનેક્ટ થયું."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ઇથરનેટ કનેક્ટ થયું."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"કોઈ સિગ્નલ નથી."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"કનેક્ટ થયેલ નથી."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"શૂન્ય બાર."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"બંધ."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"કનેક્ટ કરી"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"કનેક્ટ થઈ રહ્યું છે."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"રોમિંગ"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"વાઇ-ફાઇ"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"સિમ નથી."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"મોબાઇલ ડેટા"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"મોબાઇલ ડેટા ચાલુ છે"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"મોબાઇલ ડેટા બંધ છે"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"ડેટાનો ઉપયોગ કરવાનું સેટ કર્યું નથી"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"બંધ કરો"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"બ્લૂટૂથ ટિથરિંગ."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"એરપ્લેન મોડ."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ચાલુ છે."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"કોઈ સિમ કાર્ડ નથી."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"કૅરીઅર નેટવર્કમાં ફેરફાર થઈ રહ્યો છે"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"બૅટરીની વિગતો ખોલો"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"બૅટરી <xliff:g id="NUMBER">%d</xliff:g> ટકા."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"તમારા વપરાશના આધારે બૅટરી <xliff:g id="PERCENTAGE">%1$s</xliff:g> ટકા, જે લગભગ <xliff:g id="TIME">%2$s</xliff:g> સુધી ચાલે તેટલી બચી છે"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ફોન સેટિંગના આધારે રિંગ અથવા વાઇબ્રેટ થઈ શકે છે. ડિફૉલ્ટ તરીકે <xliff:g id="APP_NAME">%1$s</xliff:g> બબલની વાતચીત."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ફ્લોટિંગ શૉર્ટકટથી આ કન્ટેન્ટ પર તમારું ધ્યાન દોરી રાખે છે."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"આ નોટિફિકેશન સાઉન્ડ અથવા વાઇબ્રેટ કરી શકશે કે નહીં તે સિસ્ટમને નક્કી કરવા દો"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"એને વાતચીત વિભાગની ટોચ પર બતાવે છે, તરતા બબલ તરીકે દેખાય છે, લૉક સ્ક્રીન પર પ્રોફાઇલ ફોટા તરીકે બતાવે છે"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"સેટિંગ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"પ્રાધાન્યતા"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"આ ઍપ તમારી સ્ક્રીન પરની અન્ય ઍપની ઉપર પ્રદર્શિત થઈ રહી છે અને માઇક્રોફોન અને કૅમેરાનો ઉપયોગ કરી રહી છે."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"સેટિંગ"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ઓકે"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"આ નોટિફિકેશનને સિસ્ટમ દ્વારા સાઇલન્ટ કરવામાં આવ્યું હતું."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"આ નોટિફિકેશનને સિસ્ટમ દ્વારા બઢતી આપવામાં આવી હતી."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"આ નોટિફિકેશનને સિસ્ટમ દ્વારા ડિમોટ કરવામાં આવ્યું હતું."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"શું આ યોગ્ય હતું?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"તમારા પ્રતિસાદ બદલ આભાર!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ઓકે"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 330ff90..6cde262 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"बैटरी तीन बार."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"बैटरी पूरी है."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"इस बारे में जानकारी नहीं है कि अभी बैटरी कितने प्रतिशत चार्ज है."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"कोई फ़ोन नहीं."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"फ़ोन एक बार."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"फ़ोन दो बार."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"फोन तीन बार."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"फ़ोन सि‍ग्‍नल पूरा."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"कोई डेटा नहीं."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"डेटा एक बार."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"डेटा दो बार."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"डेटा तीन बार."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"डेटा सि‍ग्‍नल पूरा."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> से कनेक्ट किया गया."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> से कनेक्ट किया गया."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> से कनेक्ट है."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX दो बार."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX तीन बार."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX सि‍ग्‍नल पूरा है."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ईथरनेट डिस्‍कनेक्‍ट किया गया."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ईथरनेट कनेक्‍ट किया गया."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"कोई सिग्नल नहीं."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"कनेक्ट नहीं है."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"शून्य बार."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"बंद."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"कनेक्ट है."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"कनेक्ट हो रहा है."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3जी"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"एलटीई"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"रोमिंग"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"वाई-फ़ाई"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"कोई सिम नहीं."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"मोबाइल डेटा"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"मोबाइल डेटा चालू है"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"मोबाइल डेटा बंद है"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"डेटा इस्तेमाल करने के लिए सेट नहीं किया गया है"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"बंद है"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ब्लूटूथ से टेदरिंग."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"हवाई जहाज़ मोड."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN चालू."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"कोई सिम कार्ड नहीं है."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"मोबाइल और इंटरनेट सेवा देने वाली कंपनी का नेटवर्क बदल रहा है"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"बैटरी का विवरण खोलें"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"<xliff:g id="NUMBER">%d</xliff:g> प्रति‍शत बैटरी."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> प्रतिशत बैटरी बची है और आपके इस्तेमाल के हिसाब से यह <xliff:g id="TIME">%2$s</xliff:g> में खत्म हो जाएगी"</string>
@@ -725,6 +700,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"फ़ोन की सेटिंग के आधार पर, सूचना आने पर घंटी बज सकती है या वाइब्रेशन हो सकता है. <xliff:g id="APP_NAME">%1$s</xliff:g> में होने वाली बातचीत, डिफ़ॉल्ट रूप से बबल के तौर पर दिखती है."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"फ़्लोट करने वाले शॉर्टकट की मदद से इस सामग्री पर आपका ध्यान बना रहता है."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"सिस्टम को यह तय करने की अनुमति दें कि इस सूचना के मिलने पर आवाज़ हो या वाइब्रेशन हो"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"इससे बातचीत, सेक्शन में सबसे ऊपर और फ़्लोटिंग बबल के तौर पर दिखती है. साथ ही, लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो दिखती है"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिंग"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string>
@@ -743,9 +726,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"यह ऐप्लिकेशन आपकी स्क्रीन पर इस्तेमाल हो रहे दूसरे ऐप्लिकेशन के ऊपर दिखाया जा रहा है. इसके साथ ही यह माइक्रोफ़ोन और कैमरे का भी इस्तेमाल कर रहा है."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"सेटिंग"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ठीक है"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"सिस्टम ने उपयोगकर्ता के इस्तेमाल के आधार पर, इस सूचना के मिलने पर होने वाली आवाज़ बंद कर दी है."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"सिस्टम ने उपयोगकर्ता के इस्तेमाल के आधार पर यह तय किया है कि कोई सूचना, खोज के क्रम में एकदम नीचे दिखेगी या फिर बिना आवाज़ किए मिलेगी."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"सिस्टम ने उपयोगकर्ता के इस्तेमाल के आधार पर यह तय किया है कि कोई सूचना, खोज के क्रम में एकदम नीचे दिखेगी या फिर बिना आवाज़ किए मिलेगी."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"आपको यह सुविधा कैसी लगी?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"सुझाव या शिकायत के लिए धन्यवाद!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ठीक है"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 6879259..3b25e38 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Baterija tri stupca."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Baterija je puna."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Postotak baterije nije poznat."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Nema telefona."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefonski signal jedan stupac."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefonski signal dva stupca."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefonski signal tri stupca."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Telefonski signal pun."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Nema podataka."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Podatkovni signal jedan stupac."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Podatkovni signal dva stupca."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Podatkovni signal tri stupca."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Podatkovni signal pun."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Spojen na <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Spojen na <xliff:g id="BLUETOOTH">%s</xliff:g> ."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Povezani ste sa sljedećim uređajem: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX s dva stupca."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX s tri stupca."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Signal WiMAX potpun je."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Prekinuta je veza s ethernetom."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Uspostavljena je veza s ethernetom."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Nema signala."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nije povezano."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Nijedan stupac."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Isključeno."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Povezano."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Povezivanje."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G i više"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Nema SIM kartice."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobilni podaci"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobilni su podaci uključeni"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobilni su podaci isključeni"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Nije postavljeno za upotrebu podataka"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Isključeno"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Posredno povezivanje Bluetootha."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Način rada u zrakoplovu"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN uključen."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Nema SIM kartice."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Promjena mreže mobilnog operatera"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Otvaranje pojedinosti o bateriji"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Baterija <xliff:g id="NUMBER">%d</xliff:g> posto."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Baterija je na <xliff:g id="PERCENTAGE">%1$s</xliff:g> posto, još otprilike <xliff:g id="TIME">%2$s</xliff:g> na temelju vaše upotrebe"</string>
@@ -726,6 +701,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Možda će zvoniti ili vibrirati, ovisno o postavkama telefona. Razgovori iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> prikazuju se u oblačiću prema zadanim postavkama."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Održava vam pozornost pomoću plutajućeg prečaca ovom sadržaju."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Neka sustav odredi treba li obavijest najaviti zvukom ili vibracijom"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikazuje se pri vrhu odjeljka razgovora kao pomični oblačić i prikazuje profilnu sliku na zaključanom zaslonu"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Postavke"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
@@ -744,9 +727,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Ova se aplikacija prikazuje preko drugih aplikacija na zaslonu i upotrebljava mikrofon i kameru."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Postavke"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"U redu"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Ovu obavijest utišao je sustav."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Ovu obavijest promovirao je sustav."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Ovu obavijest degradirao je sustav."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Je li to bilo točno?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Zahvaljujemo na povratnim informacijama!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"U redu"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 90f42cb..e7ee331 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Akkumulátor három sáv."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Akkumulátor feltöltve."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Az akkumulátor töltöttségi szintje ismeretlen."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Nincs telefon."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefon egy sáv."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefon két sáv."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefon három sáv."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Telefonjel megtelt."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Nincsenek adatok."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Adat egy sáv."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Adat két sáv."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Adat három sáv."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Adatjel teljes."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Csatlakoztatva a következőhöz: <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Csatlakoztatva a következőhöz: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Csatlakozva a következőhöz: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX-jel: két sáv."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX-jel: három sáv."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX-jel: teljes."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet leválasztva."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet csatlakoztatva."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Nincs jel."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nincs csatlakozva."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Nincs sáv."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Kikapcsolva."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Csatlakoztatva."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Csatlakozás."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Nincs SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobiladatok"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobiladatok bekapcsolva"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobiladatok kikapcsolva"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Nincs beállítva az adathasználat"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Ki"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth megosztása."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Repülőgép üzemmód."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN bekapcsolva."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Nincs SIM-kártya."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Szolgáltatói hálózat váltása"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Az akkumulátorral kapcsolatos részletek megnyitása"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Akkumulátor <xliff:g id="NUMBER">%d</xliff:g> százalék."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Az akkumulátor <xliff:g id="PERCENTAGE">%1$s</xliff:g> százalékon áll, a használati adatok alapján körülbelül <xliff:g id="TIME">%2$s</xliff:g> múlva merül le"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"A telefonbeállítások alapján csöröghet és rezeghet. A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazásban lévő beszélgetések alapértelmezés szerint buborékban jelennek meg."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"A tartalomra mutató lebegő parancsikon segítségével tartja fenn az Ön figyelmét."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"A rendszer határozza meg, hogy ez az értesítés adjon-e ki hangot, illetve rezegjen-e"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"A beszélgetések szakaszának tetején, lebegő buborékként látható, megjeleníti a profilképet a lezárási képernyőn"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Beállítások"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritás"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Ez az alkalmazás a képernyőn lévő egyéb alkalmazások előtt jelenik meg, és használja a mikrofont és a kamerát."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Beállítások"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Ezt az értesítést lenémította a rendszer."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Ezt az értesítést magasabb prioritásra állította a rendszer."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Ezt az értesítést alacsonyabb prioritásra állította a rendszer."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Megfelelő ez így?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Köszönjük a visszajelzést!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index aaa2794..af300ea 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Մարտկոցի երեք գիծ:"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Մարտկոցը լիքն է:"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Մարտկոցի լիցքի մակարդակն անհայտ է։"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Հեռախոս չկա:"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Հեռախոսի մեկ գիծ:"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Հեռախոսի երկու գիծ:"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Հեռախոսի երեք գիծ:"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Հեռախոսի ազդանշանը լիքն է:"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Տվյալներ չկան:"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Տվյալների մեկ գիծ:"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Տվյալների երկու գիծ:"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Տվյալների երեք գիծ:"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Տվյալների ազդանշանը լրիվ է:"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Միացված է <xliff:g id="WIFI">%s</xliff:g>-ին:"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Միացված է <xliff:g id="BLUETOOTH">%s</xliff:g>-ին:"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Միացված է <xliff:g id="CAST">%s</xliff:g>-ին:"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX-ի երկու գիծ:"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX-ի երեք գիծ:"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX-ի ազդանշանը լիքն է:"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet-ը անջատված է:"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet-ը կապակցված է:"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Ազդանշան չկա:"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Միացված չէ:"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Զրո գիծ:"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Անջատված է:"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Միացված է:"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Միանում է:"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Ռոումինգ"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM չկա:"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Բջջային ինտերնետ"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Բջջային տվյալները միացված են"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Բջջային ինտերնետն անջատված է"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Բջջային ինտերնետն ըստ կանխադրման չի օգտագործվում"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Անջատված է"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth մոդեմ"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Ավիառեժիմ"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"Միացնել VPN-ը։"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM քարտ չկա:"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Օպերատորի ցանցի փոփոխություն"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Բացել մարտկոցի տվյալները"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Մարտկոցը <xliff:g id="NUMBER">%d</xliff:g> տոկոս է:"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Մարտկոցի լիցքը <xliff:g id="PERCENTAGE">%1$s</xliff:g> տոկոս է և կբավարարի մոտ <xliff:g id="TIME">%2$s</xliff:g>՝ կախված օգտագործման եղանակից:"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Կարող է զնգալ կամ թրթռալ (հեռախոսի կարգավորումներից կախված)։ <xliff:g id="APP_NAME">%1$s</xliff:g>-ի զրույցներն ըստ կանխադրման հայտնվում են ամպիկների տեսքով։"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Լողացող դյուրանցման միջոցով ձեր ուշադրությունն է գրավում բովանդակության նկատմամբ"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Թող համակարգն ավտոմատ որոշի՝ արդյոք այս ծանուցումը ձայնով, թե թրթռոցով է պետք մատուցել"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Ցուցադրվում է զրույցների ցանկի վերևում, հայտնվում է լողացող ամպիկի տեսքով, ցուցադրում է պրոֆիլի նկարը կողպէկրանին"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Կարգավորումներ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Կարևոր"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Այս հավելվածը ցուցադրվում է մյուս հավելվածների վրայից և օգտագործում է խոսափողն ու տեսախցիկը:"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Կարգավորումներ"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Եղավ"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Այս ծանուցման ձայնն անջատվել է համակարգի կողմից։"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Այս ծանուցման կարևորության մակարդակը բարձրացվել է համակարգի կողմից։"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Այս ծանուցման կարևորության մակարդակը իջեցվել է համակարգի կողմից։"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Սա ճի՞շտ էր"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Շնորհակալություն արձագանքելու համար"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Եղավ"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index ff5d4ed..0038463 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Baterai tiga batang."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Baterai penuh."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Persentase baterai tidak diketahui."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Tidak dapat melakukan panggilan."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Ponsel satu batang."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Ponsel dua batang."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Ponsel tiga batang."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Sinyal ponsel penuh."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Tidak ada data yang diterima."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Data satu batang."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Data dua batang."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data tiga batang."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Sinyal data penuh."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Terhubung ke <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Terhubung ke <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Terhubung ke <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX dua batang."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX tiga batang."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Sinyal WiMAX penuh."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet terputus."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet tersambung."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Tidak ada sinyal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Tidak terhubung."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"0 baris."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Nonaktif."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Tersambung."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Menyambung."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Tidak ada SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Data Seluler"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Data Seluler Aktif"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Kuota nonaktif"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Tidak disetel untuk menggunakan data"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Nonaktif"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Tethering bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Mode pesawat."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN aktif."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Tidak ada kartu SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Jaringan operator berubah"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Membuka detail baterai"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Baterai <xliff:g id="NUMBER">%d</xliff:g> persen."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Baterai <xliff:g id="PERCENTAGE">%1$s</xliff:g> persen, sekitar <xliff:g id="TIME">%2$s</xliff:g> lagi berdasarkan penggunaan Anda"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Dapat berdering atau bergetar berdasarkan setelan ponsel. Percakapan dari balon <xliff:g id="APP_NAME">%1$s</xliff:g> secara default."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Menjaga perhatian dengan pintasan floating ke konten ini."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Biarkan sistem menentukan apakah notifikasi ini akan berbunyi atau bergetar"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Muncul di atas bagian percakapan, ditampilkan sebagai balon yang mengambang, menampilkan gambar profil di layar kunci"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Setelan"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritas"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Aplikasi ini ditampilkan di atas aplikasi lain di layar serta sedang menggunakan mikrofon dan kamera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Setelan"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Ya"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Notifikasi ini disenyapkan oleh sistem."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Notifikasi ini dipromosikan oleh sistem."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Notifikasi ini didemosikan oleh sistem."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Sudah benar?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Terima kasih atas masukan Anda"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Oke"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 20231b4..25b907f 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Þrjú strik á rafhlöðu."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Rafhlaða fullhlaðin."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Staða rafhlöðu óþekkt."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Ekkert símasamband."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Styrkur símasambands er eitt strik."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Styrkur símasambands er tvö strik."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Styrkur símasambands er þrjú strik."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Fullur styrkur símasambands."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Engin gögn."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Sendistyrkur gagnatengingar er eitt strik."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Sendistyrkur gagnatengingar tvö strik."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Sendistyrkur gagnatengingar er þrjú strik."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Fullur sendistyrkur gagnatengingar."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Tengt við <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Tengt við <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Tengt við <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX: Tvö strik."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX: Þrjú strik."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Fullur WiMAX-sendistyrkur."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet aftengt."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet tengt."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Ekkert merki."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Engin tenging."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Engin strik."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Slökkt."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Tenging virk."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Tengist."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Reiki"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Ekkert SIM-kort."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Farsímagögn"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Kveikt á farsímagögnum"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Slökkt á farsímagögnum"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Ekki stillt á að nota gögn"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Slökkt"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Tjóðrun með Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Flugstilling"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"Kveikt á VPN."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Ekkert SIM-kort."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Skiptir um farsímakerfi"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Opna upplýsingar um rafhlöðu"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"<xliff:g id="NUMBER">%d</xliff:g> prósent á rafhlöðu."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Rafhlaða í <xliff:g id="PERCENTAGE">%1$s</xliff:g> prósentum, um það bil <xliff:g id="TIME">%2$s</xliff:g> eftir miðað við notkun þína"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Gæti hringt eða titrað eftir stillingum símans. Samtöl á <xliff:g id="APP_NAME">%1$s</xliff:g> birtast sjálfkrafa í blöðru."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Fangar athygli þína með fljótandi flýtileið á þetta efni."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Láta kerfið ákvarða hvort hljóð eða titringur fylgir þessari tilkynningu"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Birtist efst í samtalshluta, birtist sem fljótandi blaðra, birtir prófílmynd á lásskjánum"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Áfram"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Forgangur"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Þetta forrit er að birta efni yfir öðrum forritum á skjánum þínum og er að nota hljóðnemann og myndavélina."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Stillingar"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Í lagi"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Kerfið þaggaði þessa tilkynningu."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Kerfið hækkaði þessa tilkynningu."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Kerfið lækkaði þessa tilkynningu."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Var þetta rétt?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Takk fyrir að segja þína skoðun!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Í lagi"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index a7952ba..e393cea 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Batteria: tre barre."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Batteria carica."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Percentuale della batteria sconosciuta."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Nessun telefono."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefono: una barra."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefono: due barre."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefono: tre barre."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Massimo segnale telefonico."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Nessun dato."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Dati: una barra."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Dati: due barre."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Dati: tre barre."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Massimo segnale dati."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Connesso a <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connesso a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Connesso a: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX: due barre."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX: tre barre."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Massimo segnale WiMAX."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Connessione Ethernet annullata."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Connessione Ethernet stabilita."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Nessun segnale."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Non connesso."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Nessuna barra."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Off"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Connesso."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Connessione in corso."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Nessuna SIM presente."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Dati mobili"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Dati mobili attivati"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Dati mobili disattivati"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Non impostato per l\'utilizzo dei dati"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Off"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Tethering Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Modalità aereo."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN attiva."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Nessuna SIM presente."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Cambio della rete dell\'operatore"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Visualizza i dettagli relativi alla batteria"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Batteria: <xliff:g id="NUMBER">%d</xliff:g> percento."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Livello della batteria: <xliff:g id="PERCENTAGE">%1$s</xliff:g> percento. Tempo rimanente in base al tuo utilizzo: <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Può suonare o vibrare in base alle impostazioni del telefono. Conversazioni dalla bolla <xliff:g id="APP_NAME">%1$s</xliff:g> per impostazione predefinita."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantiene la tua attenzione con una scorciatoia mobile a questi contenuti."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Fai stabilire al sistema se questa notifica deve emettere suoni o vibrazioni"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Appare in cima alla sezione delle conversazioni e sotto forma di bolla mobile, mostra l\'immagine del profilo nella schermata di blocco"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Impostazioni"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorità"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Questa app è visualizzata sopra altre app sullo schermo e sta utilizzando il microfono e la fotocamera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Impostazioni"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Ok"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Questa notifica è stata silenziata dal sistema."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Questa notifica è stata promossa dal sistema."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Questa notifica è stata retrocessa dal sistema."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Era corretto?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Grazie per il feedback."</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index cd07d77..4f30f1f 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"שלושה פסים של סוללה."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"סוללה מלאה."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"אחוז טעינת הסוללה לא ידוע."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"אין טלפון."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"פס אחד של טלפון."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"שני פסים של טלפון."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"שלושה פסים של טלפון."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"אות הטלפון מלא."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"אין נתונים."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"פס אחד של נתונים."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"שני פסים של נתונים."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"שלושה פסים של נתונים."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"אות הנתונים מלא."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"מחובר אל <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"מחובר אל <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"מחובר אל <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"‏שני פסים של WiMAX."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"‏שלושה פסים של WiMAX."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"‏אות ה-WiMAX מלא."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"אתרנט מנותק."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"אתרנט מחובר."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"אין אות."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"אין חיבור."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"אפס פסים."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"כבוי."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"מחובר."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"מתחבר."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"+H"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"+4G"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"+LTE"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"נדידה"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"‏אין כרטיס SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"חבילת גלישה"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"חבילת הגלישה פועלת"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"חבילת הגלישה כבויה"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"לא מוגדרת לשימוש בנתונים"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"כבוי"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"‏שיתוף אינטרנט דרך Bluetooth"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"מצב טיסה"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"‏VPN פועל."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"‏אין כרטיס SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"רשת ספק משתנה"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"פתיחת פרטי סוללה"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"<xliff:g id="NUMBER">%d</xliff:g> אחוזים של סוללה."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"רמת הטעינה בסוללה: <xliff:g id="PERCENTAGE">%1$s</xliff:g> אחוזים, הזמן הנותר המשוער על סמך השימוש שלך:<xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -729,6 +704,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ייתכן שיופעל צלצול או רטט בהתאם להגדרות הטלפון. שיחות מהאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מופיעות בבועות כברירת מחדל."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"מעוררת תשומת לב באמצעות קיצור דרך צף לתוכן הזה."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"אפשר לתת למערכת לקבוע אם ההתראה הזאת צריכה להיות מלווה בצליל או ברטט"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"מוצגת בחלק העליון של קטע התראות השיחה, מופיעה בבועה צפה, תוצג תמונת פרופיל במסך הנעילה"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"הגדרות"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"עדיפות"</string>
@@ -747,9 +730,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"האפליקציה הזו מוצגת מעל אפליקציות אחרות במסך, ומשתמשת במיקרופון ובמצלמה."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"הגדרות"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"אישור"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"ההתראה הזאת הושתקה על-ידי המערכת."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"ההתראה הזאת קודמה על-ידי המערכת."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"ההתראה הזאת הורדה בדרגה על-ידי המערכת."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"האם פעולה זו הייתה נכונה?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"תודה על המשוב!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"אישור"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 1b30a92..baca136 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"電池残量:レベル3"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"電池残量:満"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"電池残量は不明です。"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"電波状態:なし"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"電波状態:レベル1"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"電波状態:レベル2"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"電波状態:レベル3"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"電波状態:フル"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"データ信号:なし"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"データ信号:レベル1"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"データ信号:レベル2"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"データ信号:レベル3"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"データ信号:フル"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g>に接続しました。"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>に接続しました。"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>に接続されています。"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX電波状態:レベル2"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX電波状態:レベル3"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX電波状態:フル"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"イーサネット接続を解除しました。"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"イーサネットに接続しました。"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"圏外です。"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"接続されていません。"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"レベル0"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"OFF"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"接続済みです。"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"接続しています。"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"ローミング"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIMがありません。"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"モバイルデータ"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"モバイルデータ ON"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"モバイルデータ OFF"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"データを使用するように設定されていません"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"OFF"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetoothテザリング。"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"機内モード。"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN は ON です。"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIMカードが挿入されていません。"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"携帯通信会社のネットワークを変更します"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"電池の詳細情報を開きます"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"電池残量: <xliff:g id="NUMBER">%d</xliff:g>パーセント"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"電池残量: <xliff:g id="PERCENTAGE">%1$s</xliff:g>、およそ <xliff:g id="TIME">%2$s</xliff:g> に電池切れ(使用状況に基づく)"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"スマートフォンの設定を基に着信音またはバイブレーションが有効になります。デフォルトでは <xliff:g id="APP_NAME">%1$s</xliff:g> からの会話がバブルとして表示されます。"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"このコンテンツのフローティング ショートカットで通知をお知らせします。"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"この通知を音またはバイブレーションで知らせるかどうかの自動判断"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"会話セクションの一番上にバブルとして表示され、プロフィール写真がロック画面に表示されます"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"優先"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"このアプリは画面上で他のアプリの上に重ねて表示されます。また、マイクとカメラを使用しています。"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"設定"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"この通知はシステムによってサイレントに設定されました。"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"この通知はシステムによって順位が上げられました。"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"この通知はシステムによって順位が下げられました。"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"間違いありませんか?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"フィードバックをお寄せいただきありがとうございます。"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index f128dde..d11c302 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"ბატარეა სამ ზოლზე."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"ბატარეა სავსეა."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ბატარეის პროცენტული მაჩვენებელი უცნობია."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"ტელეფონი არ არის."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"ტელეფონის სიგნალი ერთ ზოლზეა."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"ტელეფონის სიგნალი ორ ზოლზეა."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"ტელეფონის სიგნალი სამ ზოლზეა."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"ტელეფონის სიგნალი სრულია."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"მონაცემები არ არის."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"თარიღი ზოლზე."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"მონაცემების გადაცემა: ორი ზოლი"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"მონაცემების გადაცემა: სამი ზოლი"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"მონაცემთა გადაცემის საიმედო სიგნალი."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"დაკავშირებულია <xliff:g id="WIFI">%s</xliff:g>-თან."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"დაკავშირებულია <xliff:g id="BLUETOOTH">%s</xliff:g>-თან."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"დაკავშირებულია მოწყობილობასთან: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX-ის ორი ზოლი."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX-ის სამი ზოლი."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX სიგნალი სრულია."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet კავშირი შეწყვეტილია."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet დაკავშირებულია."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"სიგნალი არ არის."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"არ არის დაკავშირებული."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"სიგნალი ნულ ზოლზეა."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"გამორთულია."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"დაკავშირებულია."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"უკავშირდება."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"როუმინგი"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM არ არის."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"მობილური ინტერნეტი"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"მობილური ინტერნეტი ჩართულია"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"მობილური ინტერნეტი გამორთულია"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"არ არის დაყენებული მონაცემების გამოყენებისთვის"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"გამორთული"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth ტეტერინგის ჩართვა"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"თვითმფრინავის რეჟიმი"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ჩართულია."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM ბარათი არ არის."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"ოპერატორის ქსელის შეცვლა"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"ბატარეის დეტალების გახსნა"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"ბატარეა: <xliff:g id="NUMBER">%d</xliff:g> პროცენტი."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"ბატარეა <xliff:g id="PERCENTAGE">%1$s</xliff:g> პროცენტზეა, მოხმარების გათვალისწინებით დარჩა დაახლოებით <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"დარეკვა ან ვიბრაცია ტელეფონის პარამეტრების მიხედვით. მიმოწერები <xliff:g id="APP_NAME">%1$s</xliff:g>-ის ბუშტიდან, ნაგულისხმევად."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"იპყრობს თქვენს ყურადღებას ამ კონტენტის მოლივლივე მალსახმობით."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"სისტემისთვის ისეთი უფლების მინიჭება, რომ მან განსაზღვროს, ამ შეტყობინებამ ხმოვანი სიგნალი უნდა აამოქმედოს თუ ვიბრაცია"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"გამოჩნდება მიმოწერების ზედა ნაწილში ბუშტის სახით, აჩვენებს პროფილის სურათს ჩაკეტილ ეკრანზე"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"პარამეტრები"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"პრიორიტეტი"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"ეს აპი თქვენს ეკრანზე ფარავს სხვა აპებს და იყენებს მიკროფონსა და კამერას."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"პარამეტრები"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"კარგი"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"ეს შეტყობინება სისტემის მიერ არის ჩაჩუმებული."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"ამ შეტყობინების მნიშვნელობა სისტემის მიერ არის აწეული."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"ამ შეტყობინების მნიშვნელობა სისტემის მიერ არის დაწეული."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"სწორია ეს?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"გმადლობთ გამოხმაურებისთვის!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"კარგი"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index b9c54cc..55552e9 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Батарея үш баған."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Батарея толы."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Батарея зарядының мөлшері белгісіз."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Телефон жоқ."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Телефон бір баған."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Телефон екі баған."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Телефон үш баған."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Телефон сигналы толық."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Дерекқор жоқ."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Дерекқор бір баған."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Дерекқор екі баған."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Дерекқор үш баған."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Дерекқор сигналы толы."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> қосылған."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> қосылған."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> трансляциясына қосылды."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX екі жолақ."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX үш жолақ."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX сигналы толық."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet ажыратылған."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet қосылған."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Сигнал жоқ."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Жалғанбаған."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Нөл жолақ."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Өшірулі."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Жалғанған."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Қосылуда."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роуминг"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM жоқ."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Мобильдік дерекқор"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Мобильдік деректер қосулы"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Мобильдік деректер өшірулі"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Деректерді пайдалануға реттелмеген."</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Өшірулі"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth тетеринг."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Ұшақ режимі."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN қосулы."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM картасы жоқ."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Оператор желісін өзгерту"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Батарея мәліметтерін ашу"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Батарея <xliff:g id="NUMBER">%d</xliff:g> пайыз."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Батарея заряды: <xliff:g id="PERCENTAGE">%1$s</xliff:g> пайыз. Пайдалануға байланысты шамамен <xliff:g id="TIME">%2$s</xliff:g> уақытқа жетеді."</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Телефон параметрлеріне байланысты шылдырлауы не дірілдеуі мүмкін. <xliff:g id="APP_NAME">%1$s</xliff:g> чаттары әдепкісінше қалқымалы етіп көрсетіледі."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Осы мазмұнға бекітілген қалқымалы таңбашамен назарыңызды өзіне тартады."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Хабарландыру дыбысының немесе дірілдің қосылуын жүйе анықтайтын болады"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Әңгімелер бөлімінің жоғарғы жағында тұрады, қалқыма хабар түрінде шығады, құлыптаулы экранда профиль суретін көрсетеді"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Параметрлер"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Маңызды"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Бұл қолданба экранда басқа қолданбалардың үстінен көрсетіліп тұр және ол микрофон мен камераны пайдалануда."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Параметрлер"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Жарайды"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Хабарландырудың дыбысы жүйе арқылы өшірілген."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Хабарландырудың күйі жүйе арқылы көтерілген."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Хабарландырудың күйі жүйе арқылы түсірілген."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Барлығы дұрыс па?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Пікіріңіз үшін рақмет!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Жарайды"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index d293c0d..5885383 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"ថ្ម​ទាំង​បី​​កាំ​។"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"ថ្ម​ពេញ​ហើយ។"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"មិនដឹងអំពី​ភាគរយថ្មទេ។"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"គ្មាន​ទូរស័ព្ទ។"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"សេវា​ទូរស័ព្ទ​មួយ​កាំ។"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"សេវា​ទូរស័ព្ទ​ពីរ​កាំ។"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"សេវា​ទូរស័ព្ទ​បី​កាំ​។"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"សេវា​ទូរស័ព្ទ​ពេញ។"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"គ្មាន​ទិន្នន័យ​។"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"ទិន្នន័យ​មួយ​​កាំ។"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"ទិន្នន័យ​ពីរ​​កាំ។"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"ទិន្នន័យ​បី​កាំ។"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"សញ្ញា​ទិន្នន័យ​ពេញ។"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"បាន​ភ្ជាប់​ទៅ <xliff:g id="WIFI">%s</xliff:g> ។"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"បាន​ភ្ជាប់​ទៅ <xliff:g id="BLUETOOTH">%s</xliff:g> ។"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"បានភ្ជាប់ទៅ <xliff:g id="CAST">%s</xliff:g>"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX ពីរ​កាំ។"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX បី​កាំ។"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"សញ្ញា WiMAX ពេញ។"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"បានផ្តាច់អ៊ីសឺរណិត។"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"បានភ្ជាប់អ៊ីសឺរណិត។"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"គ្មាន​សញ្ញា។"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"មិន​បាន​តភ្ជាប់​។"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"សូន្យ​កាំ។"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"បិទ"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"បាន​តភ្ជាប់។"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"ការ​ភ្ជាប់​។"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"រ៉ូ​មីង"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"គ្មាន​ស៊ីម​កាត។"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"ទិន្នន័យ​ទូរសព្ទចល័ត"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"ទិន្នន័យទូរសព្ទចល័តបានបើក"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"ទិន្នន័យ​ទូរសព្ទចល័ត​បានបិទ"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"មិនបានកំណត់​ឱ្យប្រើ​ទិន្នន័យ​ទេ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"បិទ"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ការ​ភ្ជាប់​តាមប៊្លូធូស"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"ពេល​ជិះ​យន្តហោះ"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"បើក VPN ។"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"គ្មានស៊ីមកាតទេ។"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"បណ្តាញ​ក្រុមហ៊ុនសេវាទូរសព្ទ​កំពុងផ្លាស់ប្តូរ"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"បើកព័ត៌មានលម្អិតអំពីថ្ម"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"ថ្ម <xliff:g id="NUMBER">%d</xliff:g> ភាគរយ។"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"ថ្ម <xliff:g id="PERCENTAGE">%1$s</xliff:g> ភាគរយ អាចប្រើបាន​ប្រហែល <xliff:g id="TIME">%2$s</xliff:g> ទៀត ផ្អែក​លើការ​ប្រើប្រាស់​របស់អ្នក"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"អាចរោទ៍ ឬញ័រ ដោយផ្អែកលើ​ការកំណត់​ទូរសព្ទ។ ការសន្ទនា​ពី​ពពុះ <xliff:g id="APP_NAME">%1$s</xliff:g> តាម​លំនាំដើម​។"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ធ្វើឱ្យអ្នក​ចាប់អារម្មណ៍​ដោយប្រើ​ផ្លូវកាត់​អណ្ដែត​សម្រាប់ខ្លឹមសារនេះ។"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"ឱ្យប្រព័ន្ធកំណត់ថាតើ​ការជូនដំណឹងនេះ​គួរតែបន្លឺសំឡេង ឬញ័រ"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"បង្ហាញនៅខាងលើ​ផ្នែកសន្ទនា បង្ហាញជា​ពពុះអណ្ដែត បង្ហាញ​រូបភាព​កម្រងព័ត៌មាន​នៅលើ​អេក្រង់ចាក់សោ"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ការកំណត់"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"អាទិភាព"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"កម្មវិធីនេះ​កំពុងបង្ហាញ​ពីលើកម្មវិធី​ផ្សេងទៀត​នៅលើអេក្រង់​របស់អ្នក និងកំពុងប្រើ​មីក្រូហ្វូន ក៏​ដូចជា​​កាមេរ៉ា។"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"ការកំណត់"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"យល់ព្រម"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"ការជូនដំណឹងនេះ​ត្រូវបានបិទសំឡេង​ដោយប្រព័ន្ធ។"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"ការជូនដំណឹងនេះ​ត្រូវបាន​ដំឡើងតំណែង​ដោយប្រព័ន្ធ។"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"ការជូនដំណឹងនេះ​ត្រូវបានបន្ទាបតំណែងដោយប្រព័ន្ធ។"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"តើវា​ត្រឹមត្រូវទេ?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"សូមអរគុណចំពោះ​មតិកែលម្អ​របស់អ្នក!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"យល់ព្រម"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index a906a39..0b3c4e3 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"ಬ್ಯಾಟರಿ ಮೂರು ಪಟ್ಟಿಗಳು."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"ಬ್ಯಾಟರಿ ಭರ್ತಿಯಾಗಿದೆ."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ಬ್ಯಾಟರಿ ಶೇಕಡಾವಾರು ತಿಳಿದಿಲ್ಲ."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"ಯಾವುದೇ ಫೋನ್ ಇಲ್ಲ."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"ಪೋನ್ ಒಂದು ಪಟ್ಟಿ."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"ಫೋನ್ ಎರಡು ಪಟ್ಟಿಗಳು."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"ಫೋನ್ ಮೂರು ಪಟ್ಟಿಗಳು."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"ಫೋನ್ ಸಂಕೇತ ಪೂರ್ತಿ ಇದೆ."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"ಯಾವುದೇ ಡೇಟಾ ಇಲ್ಲ."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"ಡೇಟಾ ಒಂದು ಪಟ್ಟಿ."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"ಡೇಟಾ ಎರಡು ಪಟ್ಟಿಗಳು."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"ಡೇಟಾ ಮೂರು ಪಟ್ಟಿಗಳು."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"ಡೇಟಾ ಸಂಕೇತ ತುಂಬಿದೆ."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> ಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX ಎರಡು ಪಟ್ಟಿಗಳು."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX ಮೂರು ಪಟ್ಟಿಗಳು."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX ಸಿಗ್ನಲ್‌ ಪೂರ್ತಿ ಇದೆ."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ಇಥರ್ನೆಟ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ಇಥರ್ನೆಟ್ ಸಂಪರ್ಕಗೊಳಿಸಲಾಗಿದೆ."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"ಸಂಕೇತವಿಲ್ಲ."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"ಸಂಪರ್ಕಗೊಂಡಿಲ್ಲ."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"ಶೂನ್ಯ ಪಟ್ಟಿಗಳು."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"ಆಫ್."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"ಸಂಪರ್ಕಗೊಂಡಿದೆ."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"ಸಂಪರ್ಕಗೊಳ್ಳುತ್ತಿದೆ."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"ರೋಮಿಂಗ್"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"ವೈ-ಫೈ"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"ಯಾವುದೇ ಸಿಮ್‌ ಇಲ್ಲ."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"ಮೊಬೈಲ್ ಡೇಟಾ"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"ಮೊಬೈಲ್ ಡೇಟಾ ಆನ್"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"ಮೊಬೈಲ್ ಡೇಟಾ ಆಫ್"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"ಡೇಟಾ ಬಳಸಲು ಹೊಂದಿಸಲಾಗಿಲ್ಲ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ಆಫ್"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ಬ್ಲೂಟೂತ್‌‌ ಟೆಥರಿಂಗ್."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"ಏರೋಪ್ಲೇನ್‌ ಮೋಡ್‌"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"ನಲ್ಲಿ VPN"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"ಯಾವುದೇ ಸಿಮ್‌ ಇಲ್ಲ."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"ವಾಹಕ ನೆಟ್‌ವರ್ಕ್ ಬದಲಾಯಿಸುವಿಕೆ"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"ಬ್ಯಾಟರಿ ವಿವರಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"ಬ್ಯಾಟರಿ <xliff:g id="NUMBER">%d</xliff:g> ಪ್ರತಿಶತ."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"ನಿಮ್ಮ ಬಳಕೆಯ ಆಧಾರದ ಮೇಲೆ ಬ್ಯಾಟರಿಯು ಪ್ರತಿಶತ <xliff:g id="PERCENTAGE">%1$s</xliff:g> ರಷ್ಟು ಮತ್ತು <xliff:g id="TIME">%2$s</xliff:g> ಸಮಯ ಬಾಕಿ ಉಳಿದಿದೆ"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಆಧರಿಸಿ ಫೋನ್ ರಿಂಗ್ ಅಥವಾ ವೈಬ್ರೇಟ್ ಆಗುತ್ತದೆ. ಡಿಫಾಲ್ಟ್ ಆಗಿ, <xliff:g id="APP_NAME">%1$s</xliff:g> ನ ಬಬಲ್ ಸಂಭಾಷಣೆಗಳು."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ಈ ವಿಷಯಕ್ಕೆ ಲಿಂಕ್ ಮಾಡಿ ಕೊಂಡೊಯ್ಯುವ ಶಾರ್ಟ್‌ಕಟ್‌ ಕಡೆಗೆ ಗಮನ ಇರಿಸಿ."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"ಈ ಅಧಿಸೂಚನೆಯು ಶಬ್ದ ಮಾಡಬೇಕೇ ಅಥವಾ ವೈಬ್ರೇಟ್ ಮಾಡಬೇಕೇ ಎಂಬುದನ್ನು ನಿರ್ಧರಿಸುವ ಅವಕಾಶವನ್ನು ಸಿಸ್ಟಂಗೆ ನೀಡಿ"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ಸಂಭಾಷಣೆ ವಿಭಾಗದ ಮೇಲ್ಭಾಗದಲ್ಲಿ ತೇಲುವ ಬಬಲ್‌ ಆಗಿ ಗೋಚರಿಸುತ್ತದೆ ಮತ್ತು ಪ್ರೊಫೈಲ್ ಚಿತ್ರವನ್ನು ಲಾಕ್‌ಸ್ಕ್ರೀನ್‌ ಮೇಲೆ‌ ಗೋಚರಿಸುತ್ತದೆ"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ಆದ್ಯತೆ"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿ ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಮೇಲಿಂದ ಪ್ರದರ್ಶಿಸುತ್ತಿದೆ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್ ಮತ್ತು ಕ್ಯಾಮರಾವನ್ನು ಬಳಸುತ್ತಿದೆ."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ಸರಿ"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"ಈ ಅಧಿಸೂಚನೆಯನ್ನು ಸಿಸ್ಟಂ ಮೌನಗೊಳಿಸಿದೆ."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"ಈ ಅಧಿಸೂಚನೆಯನ್ನು ಸಿಸ್ಟಂ ಮೇಲ್ದರ್ಜೆಗೆ ಏರಿಸಿದೆ."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"ಈ ಅಧಿಸೂಚನೆಯನ್ನು ಸಿಸ್ಟಂ ಕೆಳದರ್ಜೆಗೆ ಇಳಿಸಿದೆ."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"ಇದು ಸರಿಯಾಗಿತ್ತೇ?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಗೆ ಧನ್ಯವಾದಗಳು!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ಸರಿ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index adedb88..e39ffaa 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"배터리 막대가 세 개입니다."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"배터리 충전이 완료되었습니다."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"배터리 잔량을 알 수 없습니다."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"휴대전화의 신호가 없습니다."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"휴대전화 신호 막대가 하나입니다."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"휴대전화 신호 막대가 두 개입니다."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"휴대전화 신호 막대가 세 개입니다."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"휴대전화의 신호가 강합니다."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"데이터가 없습니다."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"데이터 신호 막대가 하나입니다."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"데이터 신호 막대가 두 개입니다."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"데이터 신호 막대가 세 개입니다."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"데이터 신호가 강합니다."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g>에 연결되었습니다."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>에 연결되었습니다."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>에 연결됨"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX 신호 막대가 두 개입니다."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX 신호 막대가 세 개입니다."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX 신호가 강합니다."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"이더넷에서 연결 해제되었습니다."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"이더넷에 연결되었습니다."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"신호가 없습니다."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"연결되지 않았습니다."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"신호 막대가 없습니다."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"사용 안함"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"연결됨"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"연결 중..."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G 이상"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"로밍"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM이 없습니다."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"모바일 데이터"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"모바일 데이터 사용"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"모바일 데이터 꺼짐"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"데이터를 사용하도록 설정되지 않음"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"사용 안함"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"블루투스 테더링입니다."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"비행기 모드입니다."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN 켜짐"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM 카드가 없습니다."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"이동통신사 네트워크 변경"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"배터리 세부정보 열기"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"배터리 <xliff:g id="NUMBER">%d</xliff:g>퍼센트"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"배터리 <xliff:g id="PERCENTAGE">%1$s</xliff:g>퍼센트, 평소 사용량 기준 약 <xliff:g id="TIME">%2$s</xliff:g> 남음"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"휴대전화 설정에 따라 벨소리나 진동이 울릴 수 있습니다. 기본적으로 <xliff:g id="APP_NAME">%1$s</xliff:g>의 대화는 대화창으로 표시됩니다."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"이 콘텐츠로 연결되는 플로팅 바로가기로 사용자의 주의를 끕니다."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"시스템에서 알림 시 소리 또는 진동을 사용할지 결정하도록 허용합니다."</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"대화 섹션 상단에 표시, 플로팅 대화창으로 표시, 그리고 잠금 화면에 프로필 사진이 표시됨"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"설정"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"우선순위"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"앱이 화면의 다른 앱 위에 표시되고 있으며, 마이크와 카메라를 사용 중입니다.."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"설정"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"확인"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"시스템에서 이 알림을 숨겼습니다."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"시스템에서 이 알림의 순위를 올렸습니다."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"시스템에서 이 알림의 순위를 내렸습니다."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"맞나요?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"의견을 보내 주셔서 감사합니다."</string>
     <string name="feedback_ok" msgid="6481426753298857144">"확인"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 92b98fb..99cc3d5 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -189,16 +189,6 @@
     <!-- String.format failed for translation -->
     <!-- no translation found for accessibility_battery_unknown (1807789554617976440) -->
     <skip />
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Телефон сигналы жок."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Телефон сигналы бир таякча."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Телефон сигналы эки таякча."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Телефон сигналы үч таякча."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Телефон сигналы толук."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Сигнал жок."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Мобилдик интернеттин сигналы бир таякча."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Мобилдик интернеттин сигналы эки таякча."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Мобилдик интернеттин сигналы үч таякча."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Мобилдик интернеттин сигналы толук."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> менен туташкан."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> менен туташкан."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> менен туташты."</string>
@@ -207,8 +197,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX эки таякча."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX үч таякча."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX сигналы толук."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet ажырады."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet туташты."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Сигнал жок."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Интернет жок."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Таякча жок."</string>
@@ -220,30 +208,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Өчүк."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Туташтып турат."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Туташууда."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роуминг"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM карта жок."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Мобилдик Интернет"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Мобилдик Интернет күйгүзүлгөн"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Мобилдик Интернет өчүрүлгөн"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Дайындарды колдонуу үчүн жөндөлгөн эмес"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Өчүк"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth аркылуу интернет бөлүшүү."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Учак тартиби."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN күйүк."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM карта жок"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Байланыш оператору өзгөртүлүүдө"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Батареянын чоо-жайын ачуу"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Батарея <xliff:g id="NUMBER">%d</xliff:g> пайыз."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Батареянын деңгээли <xliff:g id="PERCENTAGE">%1$s</xliff:g> пайыз, колдонгонуңузга караганда болжол менен <xliff:g id="TIME">%2$s</xliff:g> калды"</string>
@@ -725,6 +700,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Телефондун жөндөөлөрүнө жараша шыңгырап же дирилдеши мүмкүн. <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосундагы жазышуулар демейки жөндөө боюнча калкып чыкма билдирмелер түрүндө көрүнөт."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Калкыма ыкчам баскыч менен көңүлүңүздү бул мазмунга буруп турат."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Билдирменин үнүн чыгартууну же басууну тутумга тапшырыңыз"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Жазышуулар тизмесинин өйдө жагында калкып чыкма билдирме түрүндө көрүнүп, профиль сүрөтү кулпуланган экрандан чагылдырылат"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Жөндөөлөр"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Маанилүүлүгү"</string>
@@ -743,9 +726,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Бул колдонмо экрандагы башка терезелердин үстүнөн көрсөтүлүп, микрофонду жана камераны колдонууда."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Жөндөөлөр"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ЖАРАЙТ"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Бул билдирменин үнү тутум тарабынан басылды."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Бул билдирменин маанилүүлүгү тутум тарабынан жогорулатылды."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Бул билдирменин маанилүүлүгү тутум тарабынан төмөндөтүлдү."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Бул туурабы?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Пикириңиз үчүн рахмат!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Жарайт"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index aa3bc88..a01d1a4 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"ແບັດເຕີຣີສາມຂີດ."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"ແບັດເຕີຣີເຕັມ."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ບໍ່ຮູ້ເປີເຊັນແບັດເຕີຣີ."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"ບໍ່ມີໂທລະສັບ."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"ສັນຍານນຶ່ງຂີດ."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"ສັນຍານສອງຂີດ."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"ສັນຍານສາມຂີດ."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"ສັນຍານເຕັມ."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"ບໍ່ມີຂໍ້ມູນ."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"ຂໍ້ມູນນຶ່ງຂີດ."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"ຂໍ້ມູນສອງຂີດ."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"ຂໍ້ມູນສາມຂີດ."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"ສັນ​ຍານຂໍ້ມູນ​ເຕັມ."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"ເຊື່ອມ​ຕໍ່​ຫາ <xliff:g id="WIFI">%s</xliff:g> ແລ້ວ."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"ເຊື່ອມ​ຕໍ່​ຫາ <xliff:g id="BLUETOOTH">%s</xliff:g> ແລ້ວ."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"ເຊື່ອມຕໍ່ຫາ <xliff:g id="CAST">%s</xliff:g> ແລ້ວ."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX ສອງຂີດ."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX ສາມຂີດ."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"ສັນ​ຍານ WiMAX ເຕັມ."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ອີ​ເທີ​ເນັດ​ຕັດ​ເຊື່ອມ​ຕໍ່​ແລ້ວ."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ອີ​ເທີ​ເນັດ​ເຊື່ອມ​ຕໍ່​ແລ້ວ."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"ບໍ່ມີສັນຍານ."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"ບໍ່ໄດ້ເຊື່ອມຕໍ່."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"ບໍ່ມີຈັກຂີດ."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"ປິດ."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"ເຊື່ອມ​ຕໍ່ແລ້ວ."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"ກຳ​ລັງ​ເຊື່ອມ​ຕໍ່."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"ໂຣມມິງ"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"ບໍ່ມີຊິມ."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"ອິນເຕີເນັດມືຖື"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"ເປີດອິນເຕີເນັດມືຖືແລ້ວ"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"ປິດອິນເຕີເນັດມືຖືແລ້ວ"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"ບໍ່ໄດ້ຕັ້ງໃຫ້ໃຊ້ອິນເຕີເນັດ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ປິດ"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ການປ່ອຍສັນຍານ Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"ໂໝດໃນຍົນ."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ເປີດ."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"ບໍ່ມີແຜ່ນ SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"ການປ່ຽນເຄືອຂ່າຍຜູ້ໃຫ້ບໍລິການ"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"ເປີດລາຍລະອຽດແບັດເຕີຣີ"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"ແບັດເຕີຣີ <xliff:g id="NUMBER">%d</xliff:g> ເປີເຊັນ."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"ແບັດເຕີຣີ <xliff:g id="PERCENTAGE">%1$s</xliff:g> ເປີເຊັນ, ເຫຼືອປະມານ <xliff:g id="TIME">%2$s</xliff:g> ອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ອາດສົ່ງສຽງ ຫຼື ສັ່ນເຕືອນໂດຍອ້າງອີງຈາກການຕັ້ງຄ່າໂທລະສັບ. ການສົນທະນາຈາກ <xliff:g id="APP_NAME">%1$s</xliff:g> ຈະເປັນ bubble ຕາມຄ່າເລີ່ມຕົ້ນ."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ເອົາໃຈໃສ່ທາງລັດແບບລອຍໄປຫາເນື້ອຫານີ້."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"ໃຫ້ລະບົບກຳນົດວ່າການແຈ້ງເຕືອນນິ້ຄວນມີສຽງ ຫຼື ສັ່ນເຕືອນຫຼືບໍ່"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ສະແດງຢູ່ເທິງສຸດຂອງພາກສ່ວນການສົນທະນາ, ປາກົດເປັນ bubble ແບບລອຍ, ສະແດງຮູບໂປຣໄຟລ໌ຢູ່ໜ້າຈໍລັອກ"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ຕັ້ງຄ່າ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ສຳຄັນ"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"ແອັບນີ້ກຳລັງສະແດງຜົນບັງແອັບອື່ນຢູ່ໜ້າຈໍຂອງທ່ານ ແລະ ກຳລັງໃຊ້ໄມໂຄຣໂຟນ ແລະ ກ້ອງຖ່າຍຮູບຢູ່."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"ການຕັ້ງຄ່າ"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ຕົກລົງ"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"ການແຈ້ງເຕືອນນີ້ຖືກປີດສຽງໂດຍລະບົບແລ້ວ."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"ການແຈ້ງເຕືອນນີ້ຖືກຍົກລະດັບໂດຍລະບົບແລ້ວ."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"ການແຈ້ງເຕືອນນີ້ຖືກຫຼຸດລະດັບໂດຍລະບົບແລ້ວ."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"ສິ່ງນີ້ບໍ່ຖືກຕ້ອງບໍ?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"ຂອບໃຈສຳລັບຄຳເຫັນຂອງທ່ານ!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ຕົກລົງ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index c40c5c9..7cb83b9 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Trys akumuliatoriaus juostos."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Akumuliatorius įkrautas."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akumuliatoriaus energija procentais nežinoma."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Nėra telefono."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Viena telefono juosta."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Dvi telefono juostos."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Trys telefono juostos."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Telefono signalas stiprus."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Duomenų nėra."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Viena duomenų juosta."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Dvi duomenų juostos."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Trys duomenų juostos."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Stiprus duomenų signalas."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Prisijungta prie „<xliff:g id="WIFI">%s</xliff:g>“."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Prisijungta prie „<xliff:g id="BLUETOOTH">%s</xliff:g>“."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Prisijungta prie <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Dvi „WiMAX“ signalo juostos."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Trys „WiMAX“ signalo juostos."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"„WiMAX“ signalas stiprus."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Atsijungta nuo eterneto."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Prijungta prie eterneto."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Nėra signalo."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Neprijungta."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Nė vienos juostos."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Išjungta."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Prijungta."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Prisijungiama."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Tarptinklinis ryšys"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Nėra SIM kortelės."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobiliojo ryšio duomenys"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobiliojo ryšio duomenys įjungti"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobiliojo ryšio duomenys išjungti"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Nenustatyta naudoti duomenis"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Išjungta"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"„Bluetooth“ įrenginio kaip modemo naudojimas."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Lėktuvo režimas."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN įjungtas."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Nėra SIM kortelės."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Keičiamas operatoriaus tinklas"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Atidaryti išsamią akumuliatoriaus informaciją"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Akumuliatorius: <xliff:g id="NUMBER">%d</xliff:g> proc."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> proc. akumuliatoriaus energijos – liko maždaug <xliff:g id="TIME">%2$s</xliff:g>, atsižvelgiant į naudojimą"</string>
@@ -729,6 +704,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Gali skambėti arba vibruoti, atsižvelgiant į telefono nustatymus. Pokalbiai iš „<xliff:g id="APP_NAME">%1$s</xliff:g>“ debesėlio pagal numatytuosius nustatymus."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Naudojant slankųjį spartųjį klavišą lengviau sutelkti dėmesį į šį turinį."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Nustatykite, kad sistema aptiktų, ar šis pranešimas turi skambėti, ar vibruoti"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Rodoma pokalbių skilties viršuje, rodoma kaip slankusis burbulas, pateikiama profilio nuotrauka užrakinimo ekrane"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nustatymai"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetiniai"</string>
@@ -747,9 +730,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Ši programa rodoma ekrane virš kitų programų, ji naudoja mikrofoną ir fotoaparatą."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Nustatymai"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Gerai"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Sistema nutildė šį pranešimą."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Sistema paaukštino šį pranešimą."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Sistema pažemino šį pranešimą."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Ar tai teisinga?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Dėkojame už atsiliepimą!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Gerai"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 85b272a..2d6a509 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Akumulators: trīs joslas."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Akumulators ir pilnīgi uzlādēts."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akumulatora uzlādes līmenis procentos nav zināms."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Nav tālruņa."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Tālrunis: viena josla."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Tālrunis: divas joslas."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Tālrunis: trīs joslas."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Pilna piekļuve tālruņa signālam"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Nav datu."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Dati: viena josla"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Dati: divas joslas."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Dati: trīs joslas."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Pilna piekļuve datu signālam."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Ir izveidots savienojums ar <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ir izveidots savienojum ar <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Savienots ar ierīci <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX divas joslas."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX trīs joslas."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX signāls pilns."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Pārtraukts savienojums ar tīklu Ethernet."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Izveidots savienojums ar tīklu Ethernet."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Nav signāla."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Savienojums nav izveidots."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Nulle joslu"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Izslēgts"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Savienojums ir izveidots."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Notiek savienojuma izveide..."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Viesabonēšana"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Nav SIM kartes."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobilie dati"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobilie dati ieslēgti"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobilie dati izslēgti"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Nav iestatīts datu lietošanai"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Izslēgti"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth piesaiste."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Lidmašīnas režīms."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ieslēgts"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Nav SIM kartes."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Mobilo sakaru operatora tīkla mainīšana"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Atvērt akumulatora informāciju"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Akumulators: <xliff:g id="NUMBER">%d</xliff:g> procenti"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Akumulatora uzlādes līmenis: <xliff:g id="PERCENTAGE">%1$s</xliff:g> procenti. Ņemot vērā lietojumu, atlikušais laiks ir apmēram <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -726,6 +701,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Atkarībā no tālruņa iestatījumiem var zvanīt vai vibrēt. Sarunas no lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> pēc noklusējuma tiek parādītas burbulī."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Piesaista jūsu uzmanību, rādot peldošu saīsni uz šo saturu."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Iestatiet, lai sistēma noteiktu, vai šim paziņojumam būs skaņa vai vibrācija"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Parādās sarunu sadaļas augšdaļā un kā peldošs burbulis, kā arī bloķēšanas ekrānā tiek rādīts profila attēls"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Iestatījumi"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritārs"</string>
@@ -744,9 +727,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Šī lietotne tiek rādīta ekrānā pāri citām lietotnēm, un tajā tiek izmantots mikrofons un kamera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Iestatījumi"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Labi"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Šim paziņojumam tika izslēgta skaņa sistēmā."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Šis paziņojums tika paaugstināts sistēmā."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Šis paziņojums tika pazemināts sistēmā."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Vai šī informācija ir pareiza?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Paldies par atsauksmēm!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Labi"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index bbcf93c..2168279 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Батерија три цртички."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Батеријата е полна."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Процентот на батеријата е непознат."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Нема сигнал."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Телефон една цртичка.."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Телефон две цртички."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Телефон три цртички."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Сигналот за телефон е исполнет."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Нема податоци."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Податоци една цртичка."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Сигналот за податоци е на две цртички."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Податоци три цртички."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Сигналот за податоци е исполнет."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Поврзано со <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Поврзано со <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Поврзано со <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX две цртички."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX три цртички."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Полн сигнал на WiMAX."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Етернетот е исклучен."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Етернетот е поврзан."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Нема сигнал."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Не е поврзана"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Нула цртички."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Исклучено."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Поврзано."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Се поврзува."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роаминг"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Нема SIM картичка."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Мобилен интернет"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Мобилниот интернет е вклучен"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Мобилниот интернет е исклучен"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Не е поставен да користи интернет"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Исклучено"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Се поврзува со Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Авионски режим."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN е вклучена."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Нема SIM-картичка"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Променување на мрежата на операторот"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Отвори ги деталите за батеријата"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Батерија <xliff:g id="NUMBER">%d</xliff:g> проценти."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Батерија <xliff:g id="PERCENTAGE">%1$s</xliff:g> отсто, уште околу <xliff:g id="TIME">%2$s</xliff:g> според вашето користење"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Може да ѕвони или вибрира во зависност од поставките на телефонот Стандардно, разговорите од <xliff:g id="APP_NAME">%1$s</xliff:g> се во балончиња."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Ви го задржува вниманието со лебдечка кратенка на содржинава."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Дозволете системот да определи дали известувањево треба да испушти звук или да вибрира"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Се појавува на горниот дел од секцијата на разговорот во вид на лебдечко меурче, покажувајќи ја профилната слика на заклучениот екран"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Поставки"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Приоритетно"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Апликацијава се прикажува врз други апликации на вашиот екран и ги користи микрофонот и камерата."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Поставки"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Во ред"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Системот го стиши известувањево."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Системот ја зголеми приоритетноста на известувањево."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Системот ја намали приоритетноста на известувањево."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Дали ова беше точно?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Фала за повратните информации!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Во ред"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index b4db453..3cbb8e7 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"ബാറ്ററി മൂന്ന് ബാർ."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"ബാറ്ററി നിറഞ്ഞു."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ബാറ്ററി ശതമാനം അജ്ഞാതമാണ്."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"ഫോൺ സിഗ്‌നൽ ഒന്നുമില്ല."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"ഫോണിൽ ഒരു ബാർ."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"ഫോണിൽ രണ്ട് ബാർ."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"ഫോണിൽ മൂന്ന് ബാർ."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"ഫോൺ സിഗ്‌നൽ പൂർണ്ണമാണ്."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"ഡാറ്റാ സിഗ്‌നൽ ഒന്നുമില്ല."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"ഡാറ്റ ഒരു ബാർ."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"ഡാറ്റ രണ്ട് ബാറുകൾ."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"ഡാറ്റ മൂന്ന് ബാർ."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"ഡാറ്റ സിഗ്‌നൽ പൂർണ്ണമാണ്."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> എന്നതിലേക്ക് കണക്‌റ്റുചെയ്‌തു."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> എന്നതിലേക്ക് കണക്‌റ്റുചെയ്‌തു."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തു."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX രണ്ട് ബാറുകൾ."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX മൂന്ന് ബാറുകൾ."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX മികച്ച സിഗ്‌നൽ."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ഇതർനെറ്റ് വിച്ഛേദിച്ചു."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ഇതർനെറ്റ് കണക്റ്റുചെയ്‌തു."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"സിഗ്‌നൽ ഇല്ല."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"കണക്റ്റുചെയ്‌തിട്ടില്ല."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"ബാറുകളൊന്നുമില്ല."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"ഓഫാണ്."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"കണക്റ്റുചെയ്‌തു."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"കണക്റ്റുചെയ്യുന്നു."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"റോമിംഗ്"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDG"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"വൈഫൈ"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"സിം ഇല്ല."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"മൊബൈൽ ഡാറ്റ"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"മൊബൈൽ ഡാറ്റ ഓണാണ്"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"മൊബൈൽ ഡാറ്റ ഓഫാണ്"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"ഡാറ്റ ഉപയോഗിക്കുന്നതിന് സജ്ജീകരിച്ചിട്ടില്ല"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ഓഫ്"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ബ്ലൂടൂത്ത് ടെതറിംഗ്."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"ഫ്ലൈറ്റ് മോഡ്."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ഓണാണ്."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM കാർഡൊന്നുമില്ല."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"കാരിയർ നെറ്റ്‌വർക്ക് മാറ്റൽ"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"ബാറ്ററി വിശദാംശങ്ങൾ തുറക്കുക"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"ബാറ്ററി <xliff:g id="NUMBER">%d</xliff:g> ശതമാനം."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"ബാറ്ററി <xliff:g id="PERCENTAGE">%1$s</xliff:g> ശതമാനം, നിങ്ങളുടെ ഉപയോഗത്തിൻ്റെ അടിസ്ഥാനത്തിൽ ഏകദേശം <xliff:g id="TIME">%2$s</xliff:g> സമയം കൂടി ശേഷിക്കുന്നു"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ് ചെയ്‌തേക്കാം അല്ലെങ്കിൽ വൈബ്രേറ്റ് ചെയ്‌തേക്കാം. <xliff:g id="APP_NAME">%1$s</xliff:g>-ൽ നിന്നുള്ള സംഭാഷണങ്ങൾ ഡിഫോൾട്ടായി ബബ്ൾ ആവുന്നു."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ഈ ഉള്ളടക്കത്തിലേക്ക് ഒരു ഫ്ലോട്ടിംഗ് കുറുക്കുവഴി ഉപയോഗിച്ച് നിങ്ങളുടെ ശ്രദ്ധ നിലനിർത്തുന്നു."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"ഈ അറിയിപ്പ് വരുമ്പോൾ ശബ്‌ദിക്കുകയാണോ വൈബ്രേറ്റ് ചെയ്യുകയാണോ വേണ്ടതെന്ന് നിർണ്ണയിക്കാൻ സിസ്‌റ്റത്തെ അനുവദിക്കുക"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"സംഭാഷണ വിഭാഗത്തിന് മുകളിലായി കാണിക്കുന്നു, ഫ്ലോട്ടിംഗ് ബബിളായി ദൃശ്യമാകുന്നു, ലോക്ക് സ്ക്രീനിൽ പ്രൊഫൈൽ ചിത്രം പ്രദർശിപ്പിക്കുന്നു"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ക്രമീകരണം"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"മുൻഗണന"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"ഈ ആപ്പ് നിങ്ങളുടെ സ്‌ക്രീനിലെ മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു, മൈക്രോഫോണും ക്യാമറയും ഉപയോഗിക്കുകയും ചെയ്യുന്നു."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"ക്രമീകരണം"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ശരി"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"ഈ അറിയിപ്പ്, സിസ്റ്റം നിശബ്‌ദമാക്കിയിരിക്കുന്നു."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"ഈ അറിയിപ്പ്, സിസ്റ്റം പ്രമോട്ട് ചെയ്തിരിക്കുന്നു."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"ഈ അറിയിപ്പ്, സിസ്റ്റം താഴേക്ക് മാറ്റിയിരിക്കുന്നു."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"ഇത് ശരിയായിരുന്നോ?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"നിങ്ങളുടെ ഫീഡ്‌ബാക്കിന് നന്ദി!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ശരി"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 1e5a67a..9ce77ef 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Батерей гурван баганатай."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Батерей дүүрэн."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Батарейн хувь тодорхойгүй байна."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Утас байхгүй."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Утас нэг баганатай."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Утас хоёр баганатай."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Утас гурван баганатай."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Утасны дохио дүүрэн."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Дата байхгүй."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Дата нэг баганатай."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Дата хоёр баганатай."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Дата гурван баганатай."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Дата дохио дүүрэн."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g>-тай холбогдсон."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>-тай холбогдсон."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>-д холбогдсон."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX хоёр баганатай."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX гурван баганатай."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX дохио дүүрэн."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet саллаа."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet холбогдсон."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Дохио байхгүй."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Холбогдоогүй."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Тэг баганатай."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Унтраах"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Холбогдсон."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Холбож байна."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роуминг"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM байхгүй."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Мобайл дата"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Мобайл дата асаалттай байна"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Мобайл дата унтраалттай байна"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Дата ашиглахаар тохируулаагүй"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Идэвхгүй"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth модем болж байна."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Нислэгийн горим"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN асаалттай байна."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM карт байхгүй."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Оператор компанийн сүлжээг өөрчилж байна"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Тэжээлийн дэлгэрэнгүй мэдээллийг нээх"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Батерей <xliff:g id="NUMBER">%d</xliff:g> хувьтай."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Батарей <xliff:g id="PERCENTAGE">%1$s</xliff:g> хувьтай байна. Таны хэрэглээнд тулгуурлан ойролцоогоор <xliff:g id="TIME">%2$s</xliff:g> үлдсэн"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Утасны тохиргоонд тулгуурлан хонх дуугаргах эсвэл чичирхийлж болзошгүй. <xliff:g id="APP_NAME">%1$s</xliff:g>-н харилцан яриаг өгөгдмөл тохиргооны дагуу бөмбөлөг болгоно."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Энэ контентын хөвөн гарч ирэх товчлолтойгоор таны анхаарлыг татдаг."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Энэ мэдэгдэл дуу гаргах эсвэл чичрэх эсэхийг системээр тодорхойлуулаарай"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Харилцан ярианы хэсгийн дээд талд хөвж буй бөмбөлөг хэлбэрээр харагдах бөгөөд профайлын зургийг түгжигдсэн дэлгэцэд үзүүлнэ"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Тохиргоо"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Ач холбогдол"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Энэ аппыг таны дэлгэцэд бусад аппын дээр харуулж байгаа бөгөөд микрофон болон камерыг ашиглаж байна."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Тохиргоо"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ОК"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Систем энэ мэдэгдлийг дуугүй болгосон."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Систем энэ мэдэгдлийн зэргийг дэвшүүлсэн."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Систем энэ мэдэгдлийн зэргийг бууруулсан."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Энэ зөв байсан уу?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Санал хүсэлтээ илгээсэнд баярлалаа!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ОК"</string>
@@ -839,7 +827,7 @@
     <string name="switch_bar_on" msgid="1770868129120096114">"Идэвхтэй"</string>
     <string name="switch_bar_off" msgid="5669805115416379556">"Идэвхгүй"</string>
     <string name="tile_unavailable" msgid="3095879009136616920">"Боломжгүй"</string>
-    <string name="nav_bar" msgid="4642708685386136807">"Навигацийн самбар"</string>
+    <string name="nav_bar" msgid="4642708685386136807">"Навигацын самбар"</string>
     <string name="nav_bar_layout" msgid="4716392484772899544">"Бүдүүвч"</string>
     <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Нэмэлт зүүн товчлуураар шивэх"</string>
     <string name="right_nav_bar_button_type" msgid="4472566498647364715">"Нэмэлт баруун товчлуураар шивэх"</string>
@@ -861,7 +849,7 @@
     <string name="reset" msgid="8715144064608810383">"Шинэчлэх"</string>
     <string name="adjust_button_width" msgid="8313444823666482197">"Товчлуурын өргөнг тохируулах"</string>
     <string name="clipboard" msgid="8517342737534284617">"Түр санах ой"</string>
-    <string name="accessibility_key" msgid="3471162841552818281">"Навигацийн товчлуурыг өөрчлөх"</string>
+    <string name="accessibility_key" msgid="3471162841552818281">"Навигацын товчлуурыг өөрчлөх"</string>
     <string name="left_keycode" msgid="8211040899126637342">"Зүүн түлхүүрийн код"</string>
     <string name="right_keycode" msgid="2480715509844798438">"Баруун түлхүүрийн код"</string>
     <string name="left_icon" msgid="5036278531966897006">"Зүүн дүрс тэмдэг"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index a667ab7..ed4b7f4 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"बॅटरी तीन बार."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"बॅटरी पूर्ण भरली."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"बॅटरीच्या चार्जिंगची टक्केवारी माहित नाही."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"कोणताही फोन नाही."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"फोन एक बार."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"फोन दोन बार."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"फोन तीन बार."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"फोन सिग्नल पूर्ण."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"कोणताही डेटा नाही."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"डेटा एक बार."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"डेटा दोन बार."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"डेटा तीन बार."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"डेटा सिग्नल पूर्ण."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> शी कनेक्‍ट केले."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> शी कनेक्‍ट केले."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> शी कनेक्ट केले."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX दोन बार."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX तीन बार."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX सिग्नल पूर्ण."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"इथरनेट डिस्कनेक्ट केले."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"इथरनेट कनेक्ट केले."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"सिग्नल नाही."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"कनेक्ट केले नाही."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"शून्य बार."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"बंद."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"कनेक्‍ट केले."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"कनेक्ट करत आहे."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"३G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"४G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"४G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"१X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"रोमिंग"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"वाय-फाय"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"सिम नाही."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"मोबाइल डेटा"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"मोबाइल डेटा सुरू आहे"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"मोबाइल डेटा बंद आहे"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"डेटा वापरण्यासाठी सेट केलेले नाही"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"बंद"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ब्लूटूथ टेदरिंग."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"विमान मोड."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN सुरू."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"सिम कार्ड नाही."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"वाहक नेटवर्क बदलत आहे"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"बॅटरी तपशील उघडा"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"बॅटरी <xliff:g id="NUMBER">%d</xliff:g> टक्के."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"बॅटरी <xliff:g id="PERCENTAGE">%1$s</xliff:g> टक्के, तुमच्या वापराच्या आधारावर सुमारे <xliff:g id="TIME">%2$s</xliff:g> शिल्लक आहे"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"फोन सेटिंग्जच्या आधारावर रिंग किंवा व्हायब्रेट होऊ शकतो. <xliff:g id="APP_NAME">%1$s</xliff:g> मधील संभाषणे बाय डीफॉल्ट बबल होतात."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"या आशयाच्या फ्लोटिंग शॉर्टकटसह तुमचे लक्ष केंद्रित करते."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"ही सूचना मिळाल्‍यावर आवाज व्‍हावा की व्हायब्रेशन व्‍हावे ते सिस्‍टममध्ये नमूद करा"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"संभाषण विभागात सर्वात वरती फ्लोटिंग बबल म्हणून दिसते, लॉक स्क्रीनवर प्रोफाइल पिक्चर दाखवते"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिंग्ज"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"प्राधान्य"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"हे अ‍ॅप तुमच्या स्क्रीनवरील इतर अ‍ॅप्स वर प्रदर्शित होत आहे आणि मायक्रोफोन आणि कॅमेरा वापरत आहे."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"सेटिंग्ज"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ओके"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"ही सूचना सिस्‍टमने सायलंट केली होती."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"ही सूचना सिस्‍टमने प्रमोट केली होती."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"ही सूचना सिस्‍टमने डीमोट केली होती."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"हे बरोबर होते का?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"तुमच्‍या फीडबॅकबद्दल धन्यवाद!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ओके"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 8656590..e03de37 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Bateri tiga bar."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Bateri penuh."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Peratusan kuasa bateri tidak diketahui."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Tiada telefon."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefon satu bar."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefon dua bar."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefon tiga bar."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Isyarat telefon penuh."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Tiada data."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Data satu bar."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Data dua bar."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data tiga bar."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Isyarat data penuh."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Disambungkan kepada <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Disambungkan kepada <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Disambungkan ke <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX dua bar."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX tiga bar."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Isyarat WiMAX penuh."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet diputuskan sambungan."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet disambungkan."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Tiada isyarat."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Tidak disambungkan."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Tiada bar."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Dimatikan."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Disambungkan."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Menyambung."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Perayauan"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Tiada SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Data Mudah Alih"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Data Mudah Alih Dihidupkan"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Data mudah alih dimatikan"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Tidak ditetapkan untuk menggunakan data"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Mati"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Penambatan Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Mod pesawat"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN dihidupkan."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Tiada kad SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Rangkaian pembawa berubah"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Buka butiran bateri"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Bateri <xliff:g id="NUMBER">%d</xliff:g> peratus."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Bateri <xliff:g id="PERCENTAGE">%1$s</xliff:g> peratus, tinggal kira-kira <xliff:g id="TIME">%2$s</xliff:g> lagi berdasarkan penggunaan anda"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Mungkin berbunyi atau bergetar berdasarkan tetapan telefon. Perbualan daripada gelembung <xliff:g id="APP_NAME">%1$s</xliff:g> secara lalai."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Memastikan anda memberikan perhatian dengan pintasan terapung ke kandungan ini."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Minta sistem menentukan jika pemberitahuan ini patut menghasilkan bunyi atau getaran"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Ditunjukkan di sebelah atas bahagian perbualan, muncul sebagai gelembung terapung, memaparkan gambar profil pada skrin kunci"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Tetapan"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Keutamaan"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Apl ini dipaparkan di atas apl lain pada skrin anda dan sedang menggunakan mikrofon dan kamera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Tetapan"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Pemberitahuan ini disenyapkan oleh sistem."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Pemberitahuan ini dinaik taraf oleh sistem."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Pemberitahuan ini diturun taraf oleh sistem."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Adakah ini betul?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Terima kasih atas maklum balas anda!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 5b5531d0..50154ba 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"ဘတ္တရီသုံးဘား။"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"ဘတ္တရီအပြည့်။"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ဘက်ထရီရာခိုင်နှုန်းကို မသိပါ။"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"ဖုန်းလိုင်းမရှိပါ။"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"ဖုန်းလိုင်းတစ်ဘား။"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"ဖုန်းလိုင်းနှစ်ဘား။"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"ဖုန်းလိုင်းသုံးဘား။"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"ဖုန်းလိုင်းအပြည့်။"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"ဒေတာမရှိပါ။"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"ဒေတာတစ်ဘား။"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"ဒေတာထုတ်လွှင့်မှု ၂ဘားဖမ်းမိခြင်း။"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"ဒေတာသုံးဘား။"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"ဒေတာထုတ်လွှင့်မှုအပြည့်ဖမ်းမိခြင်း"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g>သို့ ချိတ်ဆက်ထား။"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>သို့ ချိတ်ဆက်ထား"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> သို့ချိတ်ဆက်ထားပါသည်။"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"ဝိုင်မက်စ် ၂ ဘားရှိ"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"ဝိုင်မက်စ် ၃ ဘား"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"ဝိုင်မက်စ် အပြည့်ရှိ"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet နှင့်ချိတ်ဆက်မှုပြတ်တောက်"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet ချိတ်ဆက်ထား။"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"အချက်ပြမှု မရှိပါ"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"ချိတ်ဆက်မထားပါ"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"၀ ဘား"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"ပိတ်ထားသည်"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"ချိတ်ဆက်ထားသည်"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"ချိတ်ဆက်နေ။"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"ပြင်ပကွန်ရက်နှင့် ချိတ်ဆက်ခြင်း"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"ဆင်းကဒ်မရှိပါ။"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"မိုဘိုင်းဒေတာ"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"မိုဘိုင်းဒေတာကို ဖွင့်ထားပါသည်"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"မိုဘိုင်းဒေတာ ပိတ်ထားသည်"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"ဒေတာအသုံးပြုရန် သတ်မှတ်မထားပါ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ပိတ်ရန်"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ဘလူးတုသ်သုံး၍ ချိတ်ဆက်ခြင်း"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"လေယာဉ်ပျံမုဒ်"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ကို ဖွင့်ထားသည်။"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM ကတ် မရှိပါ"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"ဝန်ဆောင်မှုပေးသူ ကွန်ရက် ပြောင်းလဲနေသည်။"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"ဘက်ထရီ အသေးစိတ် အချက်အလက်များကို ဖွင့်ပါ"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"ဘက်ထရီ <xliff:g id="NUMBER">%d</xliff:g> ရာခိုင်နှုန်း။"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"ဘက်ထရီ <xliff:g id="PERCENTAGE">%1$s</xliff:g> ရာခိုင်နှုန်း၊ သင်၏ အသုံးပြုမှုအပေါ် မူတည်၍ <xliff:g id="TIME">%2$s</xliff:g> ခန့်ကျန်သည်"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ဖုန်းဆက်တင်များပေါ် အခြေခံပြီး အသံမြည်နိုင်သည် သို့မဟုတ် တုန်ခါနိုင်သည်။ မူရင်းသတ်မှတ်ချက်အဖြစ် <xliff:g id="APP_NAME">%1$s</xliff:g> မှ စကားဝိုင်းများကို ပူဖောင်းကွက်ဖြင့် ပြသည်။"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"အကြောင်းအရာကို floating shortcut ကိုသုံး၍ အာရုံစိုက်လာအောင်လုပ်ပါ။"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"ဤအကြောင်းကြားချက်က အသံ သို့မဟုတ် တုန်ခါမှု ပေးရန် သင့်/မသင့်ကို စနစ်က ဆုံးဖြတ်ပါစေ"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"စကားဝိုင်းကဏ္ဍ၏ ထိပ်ပိုင်းတွင် ပြပြီး ပူဖောင်းကွက်အဖြစ် မြင်ရသည်၊ လော့ခ်ချထားချိန် မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံကို ပြသည်"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ဆက်တင်များ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ဦးစားပေး"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"ဤအက်ပ်က မိုက်ခရိုဖုန်းနှင့် ကင်မရာကို အသုံးပြု၍ ဖန်သားမျက်နှာပြင်ပေါ်ရှိ အခြားအက်ပ်များ အပေါ်မှ ထပ်ပြီး ပြသနေပါသည်။"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"ဆက်တင်များ"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"ဤအကြောင်းကြားချက်ကို စနစ်က အသံပိတ်ထားလိုက်သည်။"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"ဤအကြောင်းကြားချက်ကို စနစ်က အဆင့်မြှင့်လိုက်သည်။"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"ဤအကြောင်းကြားချက်ကို စနစ်က အဆင့်ချလိုက်သည်။"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"ဤအရာက မှန်ပါသလား။"</string>
     <string name="feedback_response" msgid="4671729244976641339">"အကြံပြုချက်အတွက် ကျေးဇူးတင်ပါသည်"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 6b0568d..4147bc8 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Batteri – tre stolper."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Batteriet er fullt."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batteriprosenten er ukjent."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Ingen telefon."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefon – én stolpe."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefon – to stolper."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefon – tre stolper."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Telefonsignal er fullt."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Ingen data."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Data – én stolpe"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Data – to stolper."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data – tre stolper."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Datasignal er fullt."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Koblet til <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Koblet til <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Koblet til <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX – to stolper."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX – tre stolper."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Fullt WiMAX-signal."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet er frakoblet."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet er tilkoblet."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Ikke noe signal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Ikke tilkoblet."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Ingen stolper."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Av."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Tilkoblet."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Kobler til."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Uten SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobildata"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobildata er slått på"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobildata er slått av"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Ikke konfigurert til å bruke data"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Av"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth-internettdeling."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Flymodus."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN på."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Mangler SIM-kort."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Bytting av operatørnettverk"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Åpne informasjon om batteriet"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Batteri – <xliff:g id="NUMBER">%d</xliff:g> prosent."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Batterinivået er <xliff:g id="PERCENTAGE">%1$s</xliff:g> prosent – omtrent <xliff:g id="TIME">%2$s</xliff:g> gjenstår basert på bruken din"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Kan ringe eller vibrere basert på telefoninnstillingene. Samtaler fra <xliff:g id="APP_NAME">%1$s</xliff:g> lager bobler som standard."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Holder deg oppmerksom med en svevende snarvei til dette innholdet."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"La systemet velge om dette varselet skal lage lyd eller vibrere"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Vises øverst i samtaledelen, vises som en flytende boble, viser profilbildet på låseskjermen"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Innstillinger"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Denne appen vises over andre apper på skjermen, og bruker mikrofonen og kameraet."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Innstillinger"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Dette varselet ble dempet av systemet."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Dette varselet ble oppgradert av systemet."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Dette varselet ble nedgradert av systemet."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Var det riktig?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Takk for tilbakemeldingen!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index f72808f..e4fbe93 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"ब्याट्रिका तिनवटा पट्टिहरू"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"ब्याट्री पूर्ण छ।"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ब्याट्रीमा कति प्रतिशत चार्ज छ भन्ने कुराको जानाकरी छैन।"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"फोन छैन्।"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"फोन एउटा पट्टि।"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"फोन दुई पट्टि।"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"फोन तिन पट्टिहरू।"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"फोन सङ्केत भरिएको।"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"डेटा छैन।"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"डेटाको एउटा पट्टि।"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"डेटा दुई बाधाहरू।"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"डेटा तिन बाधाहरू।"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"डेटा संकेत पूर्ण।"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> मा जडित।"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> मा जडित।"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> मा कनेक्ट गरियो।"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"वाइम्याक्स दुईवटा बारहरू।"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"वाइम्याक्स तिनवटा बारहरू।"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"वाइम्याक्स सङ्केत भरिएका।"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"इथरनेट विच्छेद भयो।"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"इथरनेट जोडियो।"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"सङ्केत छैन।"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"जडान नगरिएको।"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"शून्य पट्टि।"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"बन्द गर्नुहोस्।"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"जडान गरिएको।"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"जडान हुँदै।"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"रोमिङ"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM छैन।"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"मोबाइल डेटा"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"मोबाइल डेटा सक्रिय छ"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"मोबाइल डेटा निष्क्रिय छ"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"डेटा प्रयोग गर्ने गरी सेट गरिएन"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"निष्क्रिय पार्नु"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ब्लुटुथ टेदर गर्दै।"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"हवाइजहाज मोड।"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN सक्रिय छ।"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM कार्ड छैन।"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"सेवा प्रदायकको नेटवर्क परिवर्तन गर्ने आइकन"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"ब्याट्री सम्बन्धी विवरणहरूलाई खोल्नुहोस्"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"ब्याट्री <xliff:g id="NUMBER">%d</xliff:g> प्रतिशत"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"ब्याट्रीको चार्ज <xliff:g id="PERCENTAGE">%1$s</xliff:g> प्रतिशत छ, तपाईंको प्रयोगका आधारमा <xliff:g id="TIME">%2$s</xliff:g> बाँकी छ"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"फोनको सेटिङका आधारमा घन्टी बज्न वा कम्पन हुन सक्छ। <xliff:g id="APP_NAME">%1$s</xliff:g> का वार्तालापहरू पूर्वनिर्धारित रूपमा बबलमा देखाइन्छन्।"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"फ्लोटिङ सर्टकटमार्फत यो सामग्रीतर्फ तपाईंको ध्यान आकर्षित गर्दछ।"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"सिस्टमलाई यो सूचना आउँदा ध्वनि बज्नु पर्छ वा कम्पन हुनु पर्छ भन्ने कुराको निधो गर्न दिनुहोस्"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"वार्तालाप खण्डको सिरानमा देखा पर्छ, तैरने बबलका रूपमा देखा पर्छ, लक स्क्रिनमा प्रोफाइल फोटो देखाइन्छ"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिङ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य एपमाथि प्रदर्शन गर्नुका साथै माइक्रोफोन र क्यामेराको प्रयोग गर्दै छ।"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"सेटिङहरू"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ठिक छ"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"सिस्टमले यो सूचना आउँदा बज्ने ध्वनि बन्द गरेको छ।"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"सिस्टमले यो सूचनालाई दिइने दर्जा बढाएको छ।"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"सिस्टमले यो सूचनालाई दिइने दर्जा घटाएको छ।"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"के यो सही थियो?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"तपाईंको प्रतिक्रियाका लागि धन्यवाद!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ठिक छ"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index aa738c4..1871eef 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Batterij: drie streepjes."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Batterij is vol."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batterijpercentage onbekend."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Geen telefoonsignaal."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefoon: één streepje."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefoon: twee streepjes."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefoon: drie streepjes."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Telefoonsignaal is op volle sterkte."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Geen gegevens."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Gegevens: één streepje."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Gegevens: twee streepjes."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Gegevens: drie streepjes."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Gegevenssignaal is op volle sterkte."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Verbonden met <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Verbonden met <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Verbonden met <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX: twee streepjes."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX: drie streepjes."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX-signaal  is op volle sterkte."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernetverbinding verbroken."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet verbonden."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Geen signaal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Niet verbonden."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Geen streepjes."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Uitgeschakeld."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Verbonden."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Verbinden."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wifi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Geen simkaart."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobiele data"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobiele data aan"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobiele data uit"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Gebruik van gegevens is niet ingesteld"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Uit"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth-tethering."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Vliegtuigmodus."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ingeschakeld."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Geen simkaart."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Netwerk van provider wordt gewijzigd"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Accudetails openen"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Batterij: <xliff:g id="NUMBER">%d</xliff:g> procent."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Batterij op <xliff:g id="PERCENTAGE">%1$s</xliff:g> procent, nog ongeveer <xliff:g id="TIME">%2$s</xliff:g> op basis van je gebruik"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Kan overgaan of trillen op basis van de telefooninstellingen. Gesprekken uit <xliff:g id="APP_NAME">%1$s</xliff:g> worden standaard als bubbels weergegeven."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Trekt de aandacht met een zwevende snelkoppeling naar deze content."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Het systeem laten bepalen of deze melding geluid moet maken of moet trillen"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wordt bovenaan het gespreksgedeelte weergegeven, verschijnt als zwevende bubbel, geeft profielfoto weer op vergrendelscherm"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Instellingen"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Deze app geeft andere apps op je scherm weer en gebruikt de microfoon en camera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Instellingen"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Deze melding is gedempt door het systeem."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Deze melding is gepromoveerd door het systeem."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Deze melding is verlaagd door het systeem."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Is dit juist?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Bedankt voor je feedback."</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 7e34067..601b8f4 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"ବ୍ୟାଟେରୀର ତିନୋଟି ବାର୍‍ ଅଛି।"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"ବ୍ୟାଟେରୀ ପୂର୍ଣ୍ଣ‍।"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ବ୍ୟାଟେରୀ ଶତକଡ଼ା ଅଜଣା ଅଟେ।"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"କୌଣସି ଫୋନ୍ ନାହିଁ।"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"ଫୋନର ଗୋଟିଏ ବାର ଅଛି।"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"ଫୋନର ଦୁଇଟି ବାର୍‌ ଅଛି।"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"ଫୋନ୍‍ରେ ତିନୋଟି ବାର୍‍ ଅଛି।"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"ଫୋନ୍ ସିଗ୍ନାଲ୍ ପୂର୍ଣ୍ଣ ଅଛି।"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"କୌଣସି ଡାଟା ନାହିଁ।"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"ଡାଟାର ଗୋଟିଏ ବାର ଅଛି।"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"ଡାଟାର ଦୁଇଟି ବାର୍‌ ଅଛି।"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"ଡାଟାର ତିନୋଟି ବାର୍‍ ଅଛି।"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"ଡାଟା ସିଗ୍ନାଲ୍ ପୂର୍ଣ୍ଣ ଅଛି।"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> ସହିତ ସଂଯୁକ୍ତ।"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ସହ ସଂଯୁକ୍ତ"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> ସହିତ ସଂଯୁକ୍ତ।"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAXର ଦୁଇଟି ବାର୍‌ ଅଛି।"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAXର ତିନୋଟି ବାର୍‌ ଅଛି।"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAXର ସିଗ୍ନାଲ୍ ସମ୍ପୂର୍ଣ୍ଣ ଅଛି।"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ଇଥରନେଟ୍‍ ବିଚ୍ଛିନ୍ନ ହୋଇଛି।"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ଇଥରନେଟ୍‍ ସଂଯୁକ୍ତ ହୋଇଛି।"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"କୌଣସି ସିଗ୍ନାଲ୍‍ ନାହିଁ।"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"ସଂଯୁକ୍ତ ହୋଇନାହିଁ।"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"କୌଣସି ବାର୍‍ ନାହିଁ।"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"ବନ୍ଦ।"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"ସଂଯୁକ୍ତ।"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"ସଂଯୋଗ କରୁଛି।"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"ରୋମିଙ୍ଗ"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"ୱାଇ-ଫାଇ"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"କୌଣସି SIM ନାହିଁ।"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"ମୋବାଇଲ୍‌ ଡାଟା"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"ମୋବାଇଲ୍‌ ଡାଟା ଅନ୍‍"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"ମୋବାଇଲ୍‌ ଡାଟା ବନ୍ଦ ଅଛି"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"ବ୍ୟବହୃତ ଡାଟା ପାଇଁ ସେଟ୍ ହୋଇନାହିଁ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ବନ୍ଦ"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ବ୍ଲୁଟୁଥ ଟିଥରିଂ।"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"ଏରୋପ୍ଲେନ୍‍ ମୋଡ୍‌।"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ଅନ୍‍।"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"କୌଣସି SIM କାର୍ଡ ନାହିଁ।"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"କେରିଅର୍‍ ନେଟ୍‌ୱର୍କ ବଦଳୁଛି"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"ବ୍ୟାଟେରୀ ବିବରଣୀ ଖୋଲନ୍ତୁ"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"ବ୍ୟାଟେରୀ <xliff:g id="NUMBER">%d</xliff:g> ଶତକଡ଼ା।"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"ବ୍ୟାଟେରୀ <xliff:g id="PERCENTAGE">%1$s</xliff:g> ଶତକଡା, ଆପଣଙ୍କର ବ୍ୟବହାରକୁ ଆଧାର କରି ପାଖାପାଖି <xliff:g id="TIME">%2$s</xliff:g> ବାକି ଅଛି"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ଫୋନ୍ ସେଟିଂସ୍ ଆଧାରରେ ରିଙ୍ଗ କିମ୍ବା ଭାଇବ୍ରେଟ୍ ହୋଇପାରେ। <xliff:g id="APP_NAME">%1$s</xliff:g>ରୁ ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ ଡିଫଲ୍ଟ ଭାବରେ ବବଲ୍ ହୁଏ।"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ଏହି ବିଷୟବସ୍ତୁ ପାଇଁ ଏକ ଭାସମାନ ସର୍ଟକଟ୍ ସହ ଆପଣଙ୍କର ଧ୍ୟାନ ଦିଅନ୍ତୁ।"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"ଏହି ବିଜ୍ଞପ୍ତି ପ୍ରାପ୍ତ ହେବା ସମୟରେ ସାଉଣ୍ଡ ହେବା ଉଚିତ ନା ଭାଇବ୍ରେସନ୍ ତାହା ସିଷ୍ଟମକୁ ସ୍ଥିର କରିବାକୁ ଦିଅନ୍ତୁ"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ଦେଖାଏ, ଫ୍ଲୋଟିଂ ବବଲ୍ ଭାବେ ଦେଖାଯାଏ, ଲକ୍ ସ୍କ୍ରିନରେ ପ୍ରୋଫାଇଲ୍ ଛବି ଡିସପ୍ଲେ କରେ"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ସେଟିଂସ୍"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ପ୍ରାଥମିକତା"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"ଏହି ଆପ୍, ଆପଣଙ୍କର ସ୍କ୍ରୀନ୍ ଉପରେ ଥିବା ଅନ୍ୟ ଆପ୍ ଉପରେ ପ୍ରଦର୍ଶିତ ହେଉଛି ଏବଂ ମାଇକ୍ରୋଫୋନ୍ ଓ କ୍ୟାମେରା ବ୍ୟବହାର କରୁଛି।"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"ସେଟିଂସ୍"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ଠିକ୍ ଅଛି"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"ଏହି ବିଜ୍ଞପ୍ତିକୁ ସିଷ୍ଟମ୍ ଦ୍ୱାରା ନୀରବ କରାଯାଇଥିଲା।"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"ଏହି ବିଜ୍ଞପ୍ତିକୁ ସିଷ୍ଟମ୍ ଦ୍ୱାରା ପ୍ରମୋଟ୍ କରାଯାଇଥିଲା।"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"ଏହି ବିଜ୍ଞପ୍ତିକୁ ସିଷ୍ଟମ୍ ଦ୍ୱାରା ଡିମୋଟ୍ କରାଯାଇଥିଲା।"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"ଏହା ଠିକ୍ ଥିଲା କି?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"ଆପଣଙ୍କ ମତାମତ ପାଇଁ ଧନ୍ୟବାଦ!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ଠିକ୍ ଅଛି"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index ca4b6ad..b374a6e 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"ਬੈਟਰੀ ਤਿੰਨ ਬਾਰਸ।"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"ਬੈਟਰੀ ਪੂਰੀ।"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ਬੈਟਰੀ ਪ੍ਰਤੀਸ਼ਤ ਅਗਿਆਤ ਹੈ।"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"ਕੋਈ ਫ਼ੋਨ ਨਹੀਂ।"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"ਫ਼ੋਨ ਇੱਕ ਬਾਰ।"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"ਫ਼ੋਨ ਦੋ ਬਾਰਸ।"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"ਫ਼ੋਨ ਤਿੰਨ ਬਾਰਸ।"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"ਫ਼ੋਨ ਸਿਗਨਲ ਪੂਰਾ।"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"ਕੋਈ  ਡਾਟਾ  ਨਹੀਂ।"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">" ਡਾਟਾ  ਇੱਕ ਬਾਰ।"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">" ਡਾਟਾ  ਦੋ ਬਾਰਸ।"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">" ਡਾਟਾ  ਤਿੰਨ ਬਾਰ।"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">" ਡਾਟਾ  ਸਿਗਨਲ ਪੂਰਾ।"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ।"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ।"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ।"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX ਦੋ ਬਾਰਸ।"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX ਤਿੰਨ ਬਾਰਸ।"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX ਸਿਗਨਲ ਪੂਰਾ।"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ਈਥਰਨੈੱਟ ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ।"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ਈਥਰਨੈੱਟ ਕਨੈਕਟ ਹੋ ਗਿਆ।"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"ਕੋਈ ਸਿਗਨਲ ਨਹੀਂ।"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ।"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"ਸਿਫ਼ਰ ਬਾਰਸ।"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"ਬੰਦ।"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"ਕਨੈਕਟ ਕੀਤਾ।"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ।"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"ਰੋਮਿੰਗ"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"ਵਾਈ-ਫਾਈ"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"ਕੋਈ SIM ਨਹੀਂ।"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"ਮੋਬਾਈਲ ਡਾਟਾ"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"ਮੋਬਾਈਲ ਡਾਟਾ ਚਾਲੂ"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"ਮੋਬਾਈਲ ਡਾਟਾ ਬੰਦ"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"ਡਾਟਾ ਵਰਤਣ ਲਈ ਸੈੱਟ ਨਹੀਂ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ਬੰਦ"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ਬਲੂਟੁੱਥ ਟੈਦਰਿੰਗ।"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"ਏਅਰਪਲੇਨ ਮੋਡ।"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ਚਾਲੂ ਹੈ।"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"ਕੋਈ ਸਿਮ ਕਾਰਡ ਨਹੀਂ।"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"ਕੈਰੀਅਰ ਨੈੱਟਵਰਕ ਦੀ ਬਦਲੀ"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"ਬੈਟਰੀ ਵੇਰਵੇ ਖੋਲ੍ਹੋ"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"ਬੈਟਰੀ <xliff:g id="NUMBER">%d</xliff:g> ਪ੍ਰਤੀਸ਼ਤ ਹੈ।"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"ਬੈਟਰੀ <xliff:g id="PERCENTAGE">%1$s</xliff:g> ਫ਼ੀਸਦ, ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">%2$s</xliff:g> ਬਾਕੀ"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ਫ਼ੋਨ ਸੈਟਿੰਗਾਂ ਦੇ ਆਧਾਰ \'ਤੇ ਘੰਟੀ ਵੱਜ ਸਕਦੀ ਹੈ ਜਾਂ ਥਰਥਰਾਹਟ ਹੋ ਸਕਦੀ ਹੈ। ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੌਰ \'ਤੇ <xliff:g id="APP_NAME">%1$s</xliff:g> ਬਬਲ ਤੋਂ ਗੱਲਾਂਬਾਤਾਂ।"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ਇਸ ਸਮੱਗਰੀ ਦੇ ਅਸਥਿਰ ਸ਼ਾਰਟਕੱਟ ਨਾਲ ਆਪਣਾ ਧਿਆਨ ਕੇਂਦਰਿਤ ਰੱਖੋ।"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"ਸਿਸਟਮ ਨੂੰ ਨਿਰਧਾਰਤ ਕਰਨ ਦਿਓ ਕਿ ਇਸ ਸੂਚਨਾ ਲਈ ਕੋਈ ਧੁਨੀ ਵਜਾਉਣੀ ਚਾਹੀਦੀ ਹੈ ਜਾਂ ਥਰਥਰਾਹਟ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਦੇ ਸਿਖਰ \'ਤੇ ਦਿਖਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਬਬਲ ਵਜੋਂ ਦਿਸਦੀਆਂ ਹਨ, ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਦਿਖਾਈ ਜਾਂਦੀ ਹੈ"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ਸੈਟਿੰਗਾਂ"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ਤਰਜੀਹ"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"ਇਹ ਐਪ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਹੋਰਾਂ ਐਪਾਂ ਉੱਪਰ ਦਿਖਾਈ ਜਾ ਰਹੀ ਹੈ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਅਤੇ ਕੈਮਰੇ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"ਸੈਟਿੰਗਾਂ"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ਠੀਕ ਹੈ"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"ਸਿਸਟਮ ਵੱਲੋਂ ਇਹ ਸੂਚਨਾ ਸ਼ਾਂਤ ਕਰ ਦਿੱਤੀ ਗਈ ਸੀ।"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"ਸਿਸਟਮ ਵੱਲੋਂ ਇਸ ਸੂਚਨਾ ਦਾ ਦਰਜਾ ਵਧਾ ਦਿੱਤਾ ਗਿਆ ਸੀ।"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"ਸਿਸਟਮ ਵੱਲੋਂ ਇਸ ਸੂਚਨਾ ਦਾ ਦਰਜਾ ਘਟਾ ਦਿੱਤਾ ਗਿਆ ਸੀ।"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"ਕੀ ਇਹ ਸਹੀ ਸੀ?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"ਤੁਹਾਡੇ ਵਿਚਾਰ ਲਈ ਧੰਨਵਾਦ!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ਠੀਕ ਹੈ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 142a507..3ff500e 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Bateria: trzy paski."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Bateria naładowana."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Poziom naładowania baterii jest nieznany."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Brak sygnału telefonu."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefon: jeden pasek."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefon: dwa paski."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefon: trzy paski."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Telefon: pełna moc sygnału."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Brak danych."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Dane: jeden pasek."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Dane: dwa paski."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Dane: trzy paski."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Dane: pełna moc sygnału."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Połączono z <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Połączono z <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Połączono z urządzeniem <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX: dwa paski"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX: trzy paski"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX: pełna moc sygnału"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Rozłączono z siecią Ethernet."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Połączono z siecią Ethernet."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Brak sygnału."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nie połączono."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Zero pasków."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Wył."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Połączono."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Łączę..."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Brak karty SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobilna transmisja danych"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobilna transmisja danych włączona"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Wyłączona"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Nie skonfigurowano do transmisji danych"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Wył."</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Thethering przez Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Tryb samolotowy."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"Sieć VPN włączona."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Brak karty SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Zmiana sieci operatora"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Zobacz szczegóły baterii"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Bateria: <xliff:g id="NUMBER">%d</xliff:g> procent."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Bateria <xliff:g id="PERCENTAGE">%1$s</xliff:g> procent, jeszcze <xliff:g id="TIME">%2$s</xliff:g> (na podstawie Twojego sposobu korzystania)"</string>
@@ -729,6 +704,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Może włączyć dzwonek lub wibracje w zależności od ustawień telefonu. Rozmowy z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> są domyślnie wyświetlane jako dymki."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Przyciąga uwagę dzięki pływającym skrótom do treści."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Pozwól systemowi decydować, czy o powiadomieniu powinien informować dźwięk czy wibracja"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wyświetla się jako pływający dymek u góry sekcji rozmów, pokazuje zdjęcie profilowe na ekranie blokady"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ustawienia"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorytet"</string>
@@ -747,9 +730,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Ta aplikacja wyświetla się nad innymi aplikacjami na ekranie i używa mikrofonu oraz aparatu."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Ustawienia"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"System wyciszył to powiadomienie."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"System zmienił ważność tego powiadomienia na wyższą."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"System zmienił ważność tego powiadomienia na niższą."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Czy to było prawidłowe?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Dziękujemy za opinię"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 82139f5..8529f40 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Três barras de bateria."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Bateria cheia."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Porcentagem da bateria desconhecida."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Sem telefone."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Uma barra de sinal do telefone."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Duas barras de sinal do telefone."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Três barras de sinal do telefone."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Sinal do telefone cheio."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Nenhum dado."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Uma barra de sinal de dados."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Duas barras de sinal de dados."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Três barras do sinal de dados."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Sinal de dados cheio."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Conectado a <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Conectado a <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Duas barras do WiMAX."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Três barras do WiMAX."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Sinal WiMAX completo."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet desconectada."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet conectada."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Sem sinal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Sem conexão."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Nenhuma barra."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Desligado."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Conectado."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Conectando."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Sem chip."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Dados móveis"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Dados móveis ativados"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Dados móveis desativados"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Sem configuração para uso de dados"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Desativados"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Tethering Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Modo avião."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ativada."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Sem chip."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Alteração de rede da operadora"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Abrir detalhes da bateria"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Bateria em <xliff:g id="NUMBER">%d</xliff:g> por cento."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Bateria com <xliff:g id="PERCENTAGE">%1$s</xliff:g> de carga, tempo restante aproximado, com base no seu uso: <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Pode vibrar ou tocar com base nas configurações do smartphone. As conversas do app <xliff:g id="APP_NAME">%1$s</xliff:g> aparecem em balões por padrão."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantém sua atenção com um atalho flutuante para esse conteúdo."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Faça com que o sistema determine se a notificação resultará em som ou vibração"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparecem na parte superior de uma seção de conversa, em forma de balões, mostrando a foto do perfil na tela de bloqueio"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configurações"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritárias"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Este app está sobreposto a outros apps na sua tela e está usando o microfone e a câmera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Configurações"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Esta notificação foi silenciada pelo sistema."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Esta notificação foi promovida pelo sistema."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Esta notificação foi rebaixada pelo sistema."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Isso está correto?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Agradecemos seu feedback."</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 8203bf6..e90e105 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Três barras de bateria."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Bateria carregada."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Percentagem da bateria desconhecida."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Sem telefone."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Uma barra de telefone."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Duas barras de telefone."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Três barras de telefone."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Sinal de telefone completo."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Sem dados."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Uma barra de dados."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Duas barras de dados."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Três barras de dados."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Sinal de dados completo."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Ligado a <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ligado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Ligado a <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Duas barras de WiMAX."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Três barras de WiMAX."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Sinal WiMAX completo."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet desligada."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet ligada."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Sem sinal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Sem ligação."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Zero barras."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Desativado."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Ligado."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"A ligar..."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Sem SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Dados móveis"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Dados móveis ativados"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Dados móveis desativados"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Não definido para utilizar dados"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Desativado"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Ligação Bluetooth via telemóvel."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Modo de avião"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ativada."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Nenhum cartão SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Rede do operador em mudança."</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Abrir detalhes da bateria"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Bateria a <xliff:g id="NUMBER">%d</xliff:g> por cento."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Bateria a <xliff:g id="PERCENTAGE">%1$s</xliff:g> por cento, resta(m) cerca de <xliff:g id="TIME">%2$s</xliff:g> com base na sua utilização."</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Pode tocar ou vibrar com base nas definições do telemóvel. As conversas da app <xliff:g id="APP_NAME">%1$s</xliff:g> aparecem como um balão por predefinição."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantém a sua atenção com um atalho flutuante para este conteúdo."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Faça com que o sistema determine se esta notificação deve emitir um som ou uma vibração"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece no topo da secção de conversas, surge como balão flutuante e apresenta a imagem do perfil no ecrã de bloqueio."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Definições"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Esta app está a sobrepor-se a outras aplicações no ecrã e a utilizar o microfone e a câmara."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Definições"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"O sistema silenciou esta notificação."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"O sistema promoveu esta notificação."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"O sistema despromoveu esta notificação."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Estava correto?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Obrigado pelo seu feedback!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 82139f5..8529f40 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Três barras de bateria."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Bateria cheia."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Porcentagem da bateria desconhecida."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Sem telefone."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Uma barra de sinal do telefone."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Duas barras de sinal do telefone."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Três barras de sinal do telefone."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Sinal do telefone cheio."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Nenhum dado."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Uma barra de sinal de dados."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Duas barras de sinal de dados."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Três barras do sinal de dados."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Sinal de dados cheio."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Conectado a <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Conectado a <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Duas barras do WiMAX."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Três barras do WiMAX."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Sinal WiMAX completo."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet desconectada."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet conectada."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Sem sinal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Sem conexão."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Nenhuma barra."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Desligado."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Conectado."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Conectando."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Sem chip."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Dados móveis"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Dados móveis ativados"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Dados móveis desativados"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Sem configuração para uso de dados"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Desativados"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Tethering Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Modo avião."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ativada."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Sem chip."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Alteração de rede da operadora"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Abrir detalhes da bateria"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Bateria em <xliff:g id="NUMBER">%d</xliff:g> por cento."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Bateria com <xliff:g id="PERCENTAGE">%1$s</xliff:g> de carga, tempo restante aproximado, com base no seu uso: <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Pode vibrar ou tocar com base nas configurações do smartphone. As conversas do app <xliff:g id="APP_NAME">%1$s</xliff:g> aparecem em balões por padrão."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantém sua atenção com um atalho flutuante para esse conteúdo."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Faça com que o sistema determine se a notificação resultará em som ou vibração"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparecem na parte superior de uma seção de conversa, em forma de balões, mostrando a foto do perfil na tela de bloqueio"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configurações"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritárias"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Este app está sobreposto a outros apps na sua tela e está usando o microfone e a câmera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Configurações"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Esta notificação foi silenciada pelo sistema."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Esta notificação foi promovida pelo sistema."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Esta notificação foi rebaixada pelo sistema."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Isso está correto?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Agradecemos seu feedback."</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 123d672..9339dec 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Baterie: trei bare."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Baterie: complet."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Procentajul bateriei este necunoscut."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Nu există semnal pentru telefon."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Semnal pentru telefon: o bară."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Semnal pentru telefon: două bare."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Semnal pentru telefon: trei bare."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Semnal pentru telefon: complet."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Nu există semnal pentru date."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Semnal pentru date: o bară."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Semnal pentru date: două bare."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Semnal pentru date: trei bare."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Semnal pentru date: complet."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Conectat la <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectat la <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"S-a stabilit conexiunea la <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX două bare."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX trei bare."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX semnal complet."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet deconectat."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet conectat."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Fără semnal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Neconectat."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Nicio bară."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Dezactivat."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Conectat."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Se conectează."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Niciun card SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Date mobile"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Date mobile activate"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Date mobile dezactivate"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Nu este setat pentru a folosi datele"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Dezactivate"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Conectarea ca modem prin Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Mod Avion."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"Rețea VPN activată"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Fără SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Se schimbă rețeaua operatorului"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Deschideți detaliile privind bateria"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Baterie: <xliff:g id="NUMBER">%d</xliff:g> la sută."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Procentul rămas din baterie este <xliff:g id="PERCENTAGE">%1$s</xliff:g>. În baza utilizării, timpul rămas este de aproximativ <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -726,6 +701,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Poate să sune sau să vibreze, în funcție de setările telefonului. Conversațiile din balonul <xliff:g id="APP_NAME">%1$s</xliff:g> în mod prestabilit."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Vă atrage atenția printr-o comandă rapidă flotantă la acest conținut."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Solicitați-i sistemului să stabilească dacă această notificare este sonoră sau cu vibrații."</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Se afișează în partea de sus a secțiunii de conversație, apare ca un balon flotant, afișează fotografia de profil pe ecranul de blocare"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Setări"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritate"</string>
@@ -744,9 +727,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Această aplicație se afișează peste alte aplicații de pe ecran și folosește microfonul și camera foto."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Setări"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Notificarea a fost dezactivată de sistem."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Notificarea a fost promovată de sistem."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Notificarea a fost mutată în jos de sistem."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Este corect?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Mulțumim pentru feedback!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 03f1dfc..1fa974935 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Заряд батареи: три деления."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Батарея полностью заряжена."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Уровень заряда батареи в процентах неизвестен."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Сигнал телефонной сети отсутствует."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Сигнал телефонной сети: одно деление."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Сигнал телефонной сети: два деления."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Сигнал телефонной сети: три деления."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Надежный телефонный сигнал."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Сигнал передачи данных отсутствует."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Сигнал передачи данных: одно деление."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Сигнал передачи данных: два деления."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Сигнал передачи данных: три деления."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Надежный сигнал передачи данных."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g>: подключено."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>: подключено."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Подключено к: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Сигнал WiMAX: два деления."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Сигнал WiMAX: три деления."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Надежный сигнал WiMAX."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Устройство отключено от Ethernet."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Устройство подключено к Ethernet."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Нет сигнала"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Не подключено"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Нет сигнала"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Отключено"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Подключено"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Соединение."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роуминг"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM-карта отсутствует."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Мобильный Интернет"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Мобильный Интернет включен"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Мобильный Интернет отключен"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Мобильный Интернет по умолчанию не используется."</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Отключен"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth-модем"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Режим полета."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"Режим VPN включен."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Нет SIM-карты."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Сменить сеть"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Сведения о расходе заряда батареи"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Заряд батареи в процентах: <xliff:g id="NUMBER">%d</xliff:g>."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Заряд батареи в процентах: <xliff:g id="PERCENTAGE">%1$s</xliff:g>. Оценка оставшегося времени работы: <xliff:g id="TIME">%2$s</xliff:g>."</string>
@@ -729,6 +704,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Звонок или вибрация в зависимости от настроек телефона. Разговоры из приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" по умолчанию появляются в виде всплывающего чата."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Привлекает ваше внимание к контенту с помощью плавающего ярлыка"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Система будет сама определять, включать ли звуковой сигнал или вибрацию для уведомления"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Появляется в верхней части списка разговоров и как всплывающий чат, фото профиля показывается на заблок. экране"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Настройки"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string>
@@ -747,9 +730,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Это приложение располагается поверх других приложений, а также использует микрофон и камеру."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Настройки"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ОК"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Это уведомление отключено системой."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Статус этого уведомления повышен системой."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Статус этого уведомления понижен системой."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Все верно?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Спасибо!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ОК"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index f5e2e70..d39bc52 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"බැටරිය තීරු තුනයි."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"බැටරිය පිරී ඇත."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"බැටරි ප්‍රතිශතය නොදනී."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"දුරකථනයක් නැත."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"දුරකථනය තීරු එකයි."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"දුරකථනය තීරු දෙකයි."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"දුරකථනය තීරු තුනයි."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"දුරකථනයේ සංඥාව පිරී ඇත."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"දත්ත නැත."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"දත්ත තීරු එකයි."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"දත්ත තීරු 2."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"දත්ත තීරු 3."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"දත්ත සංඥාව පිරී ඇත."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> වෙත සම්බන්ධ කරන ලදි."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> වෙත සම්බන්ධ කරන ලදි."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> වෙත සම්බන්ධ විය."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX තීරු දෙකයි."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX තීරු තුනයි."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX සංඥාව පිරී ඇත."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ඊතර්නෙට් විසන්ධි කරන ලදී."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ඊතර්නෙට් සම්බන්ධ කරන ලදී."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"සංඥා නැත."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"සම්බන්ධ වී නැත."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"තීරු ශුන්‍යයි."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"අක්‍රිය කරන්න."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"සම්බන්ධිතයි."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"සම්බන්ධ වෙමින්."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"රෝමිං"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM නැත."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"ජංගම දත්ත"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"ජංගම දත්ත ක්‍රියාත්මකයි"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"ජංගම දත්ත ක්‍රියාවිරහිතයි"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"දත්ත භාවිත කිරීමට සකසා නැත"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ක්‍රියාවිරහිතයි"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"බ්ලූටූත් ටෙදරින්."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"අහස්යානා ආකාරය."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ක්‍රියාත්මකයි."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM කාඩ්පත නැත."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"වාහක ජාලය වෙනස් වෙමින්"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"බැටරි විස්තර විවෘත කරන්න"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"බැටරි ප්‍රතිශතය <xliff:g id="NUMBER">%d</xliff:g>"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"බැටරි ප්‍රතිශතය <xliff:g id="PERCENTAGE">%1$s</xliff:g>, ඔබේ භාවිතයට අනුව <xliff:g id="TIME">%2$s</xliff:g> ක් පමණ ඉතුරුයි"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"දුරකථන සැකසීම් මත පදනම්ව නාද කිරීමට හෝ කම්පනය කිරීමට හැකිය. <xliff:g id="APP_NAME">%1$s</xliff:g> වෙතින් සංවාද පෙරනිමියෙන් බුබුළු දමයි"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"පාවෙන කෙටිමගක් සමග ඔබේ අවධානය මෙම අන්තර්ගතය වෙත තබා ගන්න."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"මෙම දැනුම් දීම ශබ්දයක් හෝ කම්පනයක් ඇති කළ යුතු ද යන්න පද්ධතිය මගින් තීරණය කර තිබේද"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"සංවාද කොටසේ ඉහළම පෙන්වයි, බුබුළක් ලෙස දිස් වේ, අගුලු තිරයේ පැතිකඩ පින්තූරය සංදර්ශනය වේ"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"සැකසීම්"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ප්‍රමුඛතාව"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"මෙම යෙදුම් ඔබගේ තිරය මත අනෙකුත් යෙදුම්වලට උඩින් සංදර්ශනය වන අතර මයික්‍රෆෝනය සහ කැමරාව භාවිතා කරයි."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"සැකසීම්"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"හරි"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"මෙම දැනුම් දීම පද්ධතිය මගින් නිහඬ කරන ලදී."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"මෙම දැනුම් දීම පද්ධතිය මගින් ඉහළ දමන ලදී."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"මෙම දැනුම් දීම පද්ධතිය මගින් පහත දමන ලදී."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"මෙය නිවැරදි වුයේද?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"ඔබේ ප්‍රතිපෝෂණයට ස්තූතියි!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"හරි"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 22673b9..a50da0e 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Tri čiarky batérie."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Batéria je nabitá."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Percento batérie nie je známe."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Žiadna telefónna sieť."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Jeden stĺpec signálu telefónnej siete."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Dve čiarky signálu telefónnej siete."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Tri čiarky signálu telefónnej siete."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Plný signál telefónnej siete."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Žiadna dátová sieť."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Jedna čiarka signálu dátovej siete."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Dve čiarky signálu dátovej siete."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Tri čiarky signálu dátovej siete."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Plný signál dátovej siete."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Pripojené k zariadeniu <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Pripojené k zariadeniu <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Pripojené k zariadeniu <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Dva stĺpce signálu siete WiMAX."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Tri stĺpce signálu siete WiMAX."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Plný signál siete WiMAX."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Sieť ethernet je odpojená"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Sieť ethernet je pripojená"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Žiadny signál."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nepripojené."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Žiadna čiarka."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Vypnuté."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Pripojené."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Pripája sa"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi‑Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Žiadna SIM karta."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobilné dáta"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobilné dáta sú zapnuté"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobilné dáta sú vypnuté"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Nie je nastavené na používanie dát"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Vypnuté"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Pripojenie cez Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Režim v lietadle."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN je zapnuté."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Žiadna SIM karta."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Mení sa sieť operátora"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Otvoriť podrobnosti o batérii"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Batéria <xliff:g id="NUMBER">%d</xliff:g> percent."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Percentá batérie: <xliff:g id="PERCENTAGE">%1$s</xliff:g>. Na základe vášho používania zostáva <xliff:g id="TIME">%2$s</xliff:g>."</string>
@@ -729,6 +704,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Môže zvoniť alebo vibrovať podľa nastavení telefónu. Predvolene sa zobrazia konverzácie z bubliny <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Upúta vás plávajúcim odkazom na tento obsah."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Nechajte systém určiť, či má toto upozornenie vydávať zvuk alebo vibrovať"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Nájdete ju hore v sekcii konverzácií ako plávajúcu bublinu, zobrazuje profilovú fotku na uzamknutej obrazovke"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavenia"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string>
@@ -747,9 +730,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Táto aplikácia sa zobrazuje cez ďalšie aplikácie na obrazovke a používa mikrofón aj fotoaparát."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Nastavenia"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Zvuk tohto upozornenia bol vypnutý systémom."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Toto upozornenie bolo povýšené systémom."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Toto upozornenie bolo systémom preradené nižšie."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Bolo toto správne?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Ďakujeme za váš názor."</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 42a961c..7d9a5d9 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Baterija s tremi črticami."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Baterija je polna."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Neznan odstotek napolnjenosti baterije."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Ni telefona."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefon z eno črtico."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefon z dvema črticama."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefon s tremi črticami."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Signal telefona je poln."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Ni podatkov."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Podatkovni signal z eno črtico."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Podatki z dvema črticama."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Podatki s tremi črticami."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Podatkovni signal poln."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Povezava vzpostavljena z: <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Povezava vzpostavljena z: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Vzpostavljena povezava: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Signal WiMAX: dve črtici."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Signal WiMAX: tri črtice."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Poln signal WiMAX."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernetna povezava je prekinjena."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernetna povezava je vzpostavljena."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Ni signala."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Ni povezan."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Nič črtic."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Izklopljen."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Povezan."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Povezovanje."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Gostovanje"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Ni kartice SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Prenos podatkov v mobilnem omrežju"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Prenos podatkov v mobilnem omrežju je vklopljen"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Prenos podatkov v mobilnem omrežju je izklopljen"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Ni nastavljeno za uporabo prenosa podatkov"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Izklopljeno"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Internet prek Bluetootha."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Način za letalo."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"Omrežje VPN je vklopljeno."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Ni kartice SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Spreminjanje omrežja operaterja"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Odpiranje podrobnosti o bateriji"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Baterija <xliff:g id="NUMBER">%d</xliff:g> odstotkov."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Napolnjenost baterije je <xliff:g id="PERCENTAGE">%1$s</xliff:g>, glede na način uporabe imate na voljo še približno <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -729,6 +704,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Zvonjenje ali vibriranje je omogočeno na podlagi nastavitev telefona. Pogovori v aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> so privzeto prikazani v oblačkih."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Zadrži vašo pozornost z lebdečo bližnjico do te vsebine."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Naj sistem določi, ali ob prejemu tega obvestila naprava predvaja zvok ali zavibrira"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikaz na vrhu razdelka s pogovorom in v plavajočem oblačku, prikaz profilne slike na zaklenjenem zaslonu"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavitve"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prednost"</string>
@@ -747,9 +730,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Ta aplikacija prekriva druge aplikacije na zaslonu ter uporablja mikrofon in fotoaparat."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Nastavitve"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"V redu"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Sistem je utišal to obvestilo."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Sistem je zvišal prednost tega obvestila."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Sistem je znižal prednost tega obvestila."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Je bilo to prav?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Hvala za povratne informacije."</string>
     <string name="feedback_ok" msgid="6481426753298857144">"V redu"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 1943823..a72f090 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Bateria ka edhe tre vija."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Bateria u mbush."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Përqindja e baterisë e panjohur."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Nuk ka telefon."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefoni ka edhe një vijë."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefoni ka dy vija."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefoni ka tre vija."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Sinjali i telefonit është i plotë."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Nuk ka të dhëna."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Sinjali është vetëm një vijë."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Të dhënat kanë dy vija."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Sinjali është me tre vija."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Sinjali i të dhënave është i plotë."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Lidhur me <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Lidhur me <xliff:g id="BLUETOOTH">%s</xliff:g>"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Është lidhur me <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX ka dy vija."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX ka tre vija."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX ka sinjal të plotë."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Lidhja e eternetit u shkëput."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Lidhja e eternetit u lidh."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Nuk ka sinjal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nuk është i lidhur."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Zero vija."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Çaktivizuar."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"I lidhur."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Po lidhet."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Nuk ka kartë SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Të dhënat celulare"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Të dhënat celulare janë aktive"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Të dhënat celulare janë joaktive"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Nuk është caktuar të përdorë të dhënat"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Joaktiv"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Po lidhet me \"bluetooth\"."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"modaliteti i aeroplanit"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN-ja është aktive."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Nuk ka kartë SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Rrjeti i operatorit celular po ndryshohet"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Hap detajet e baterisë"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Bateria ka edhe <xliff:g id="NUMBER">%d</xliff:g> për qind."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Bateria <xliff:g id="PERCENTAGE">%1$s</xliff:g> përqind, rreth <xliff:g id="TIME">%2$s</xliff:g> të mbetura bazuar në përdorimin tënd"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Mund të bjerë zilja ose të dridhet në bazë të cilësimeve të telefonit. Bisedat nga flluska e <xliff:g id="APP_NAME">%1$s</xliff:g> si parazgjedhje."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mban vëmendjen tënde me një shkurtore pluskuese te kjo përmbajtje."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Kërkoji sistemit të përcaktojë nëse ky njoftim duhet të lëshojë tingull apo dridhje"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shfaqet në krye të seksionit të bisedës dhe shfaqet si flluskë pluskuese, shfaq fotografinë e profilit në ekranin e kyçjes"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Cilësimet"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Përparësia"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Ky aplikacion po shfaqet mbi aplikacionet e tjera në ekran dhe po përdor mikrofonin dhe kamerën."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Cilësimet"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Në rregull"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Ky njoftim është vendosur në heshtje nga sistemi."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Ky njoftim është rritur në nivel nga sistemi."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Ky njoftim është ulur në nivel nga sistemi."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"A ishte e saktë kjo?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Faleminderit për komentin!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Në rregull"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 50bbff2..3cc9f20 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Батерија од три црте."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Батерија је пуна."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Проценат напуњености батерије није познат."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Нема телефона."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Сигнал телефона има једну црту."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Сигнал телефона од две црте."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Сигнал телефона од три црте."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Сигнал телефона је пун."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Нема података."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Сигнал за податке има једну црту."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Сигнал за податке од две црте."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Сигнал за податке од три црте."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Сигнал за податке је најјачи."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Повезани сте са <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Повезани сте са <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Повезани смо са уређајем <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX сигнал има две црте."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX сигнал има три црте."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX сигнал је најјачи."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Веза са етернетом је прекинута."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Етернет је повезан."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Нема сигнала."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Није повезано."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Ниједна црта."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Искључено."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Повезано је."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Повезивање."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роминг"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"WiFi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Нема SIM картице."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Мобилни подаци"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Мобилни подаци су укључени"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Мобилни подаци су искључени"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Није подешено за коришћење података"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Искључено"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth привезивање."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Режим рада у авиону."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN је укључен."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Нема SIM картице."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Промена мреже мобилног оператера"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Отвори детаље о батерији"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Батерија је на <xliff:g id="NUMBER">%d</xliff:g> посто."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Батерија је на <xliff:g id="PERCENTAGE">%1$s</xliff:g> посто, преостало време на основу коришћења је <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -726,6 +701,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Може да звони или вибрира у зависности од подешавања телефона. Конверзације из апликације <xliff:g id="APP_NAME">%1$s</xliff:g> се подразумевано приказују у облачићима."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Привлачи вам пажњу помоћу плутајуће пречице до овог садржаја."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Нека систем утврди да ли ово обавештење треба да емитује звук или да вибрира"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Приказује се у врху одељка за конверзације као плутајући облачић, приказује слику профила на закључаном екрану"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Подешавања"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string>
@@ -744,9 +727,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Ова апликација се приказује преко других апликација на екрану и користи микрофон и камеру."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Подешавања"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Потврди"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Систем је искључио ово обавештење."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Систем је промовисао ово обавештење."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Систем је поставио ово обавештење на дно."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Да ли је то тачно?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Хвала вам на повратним информацијама!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Потврди"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 1aba0e3..5b8a526 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Batteri: tre staplar."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Batteriet är fulladdat."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Okänd batterinivå."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Ingen telefon."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefon: en stapel."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefon: två staplar."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefon: tre staplar."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Telefonsignalen är full."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Inga data."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Data: en stapel."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Data: två staplar."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data: tre staplar."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Datasignalen är full."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Ansluten till <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ansluten till <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Ansluten till <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX: två staplar."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX: tre staplar."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX-signalen är full."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet har kopplats från."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet har anslutits."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Ingen signal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Inte ansluten."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Inga staplar."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Inaktiverad."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Ansluten."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Ansluter."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Inget SIM-kort."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobildata"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobildata har aktiverats"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobildata har inaktiverats"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Inte inställd på mobildata"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Av"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Internetdelning via Bluetooth"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Flygplansläge"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN har aktiverats."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Inget SIM-kort."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Byter leverantörsnätverk"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Visa uppgifter om batteri"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Batteri <xliff:g id="NUMBER">%d</xliff:g> procent."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Batteri: <xliff:g id="PERCENTAGE">%1$s</xliff:g> procent, cirka <xliff:g id="TIME">%2$s</xliff:g> kvar utifrån din användning"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Kan ringa eller vibrera beroende på inställningarna på telefonen. Konversationer från <xliff:g id="APP_NAME">%1$s</xliff:g> visas i bubblor som standard."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Behåller din uppmärksamhet med en flytande genväg till innehållet."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Låt systemet avgöra om den här aviseringen ska låta eller vibrera"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Visas högst upp bland konversationerna som en flytande bubbla, visar profilbilden på låsskärmen"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Inställningar"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Appen visas över andra appar på skärmen och den använder mikrofonen och kameran."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Inställningar"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Den här aviseringen har tystats av systemet."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Den här aviseringen har flyttats upp av systemet."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Den här aviseringen har flyttats ned av systemet."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Stämmer detta?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Tack för din feedback!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index f02cc91..b2b2c37 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Pau tatu za betri."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Betri imejaa."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Asilimia ya betri haijulikani."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Hakuna simu"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Mwambaa mmoja wa simu."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Miambaa miwili ya simu"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Miambaa mitatu ya simu."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Ishara ya simu imejaa."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Hakuna data."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Upapi mmoja wa habari"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Miamba miwili ya data."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Fito tatu za habari."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Ishara ya data imejaa."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Imeunganishwa kwenye <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Imeunganishwa kwenye <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Imeunganishwa kwenye <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Pau mbili za WiMAX."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Pau tatu za WiMAX."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Ishara ya WiMAX imejaa."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethaneti imeondolewa."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethaneti imeunganishwa."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Hakuna mtandao"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Haijaunganishwa."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Vipima mtandao sufuri."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Imezimwa."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Imeunganishwa."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Inaunganisha."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Mitandao ya ng\'ambo"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Hakuna SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Data ya Simu"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Data ya Simu Imewashwa"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Umezima data ya mtandao wa simu"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Haijawekewa mipangilio ya kutumia data"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Zima"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Shiriki intaneti kwa Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Hali ya ndegeni."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN imewashwa."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Hakuna SIM kadi."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Mabadiliko katika mtandao wa mtoa huduma"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Fungua maelezo ya betri"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Asilimia <xliff:g id="NUMBER">%d</xliff:g> ya betri"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Betri ina asilimia <xliff:g id="PERCENTAGE">%1$s</xliff:g>, zimesalia takribani <xliff:g id="TIME">%2$s</xliff:g> kulingana na jinsi unavyoitumia"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Huenda ikalia au kutetema kulingana na mipangilio ya simu. Mazungumzo kutoka kiputo cha <xliff:g id="APP_NAME">%1$s</xliff:g> kwa chaguomsingi."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Huweka umakinifu wako kwenye maudhui haya kwa kutumia njia ya mkato ya kuelea."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Ruhusu mfumo ubainishe iwapo arifa hii inapaswa kutoa sauti au mtetemo"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Huonyeshwa kwenye sehemu ya juu ya mazungumzo, huonekana kama kiputo, huonyesha picha ya wasifu kwenye skrini iliyofungwa"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Mipangilio"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Kipaumbele"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Programu hii inachomoza kwenye programu zingine zilizo katika skrini yako na inatumia maikrofoni na kamera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Mipangilio"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Sawa"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Arifa hii ilizimwa na mfumo."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Arifa hii ilipandishwa hadhi na mfumo."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Arifa hii ilishushwa hadhi na mfumo."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Je, hatua hii ilikuwa sahihi?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Asante kwa maoni yako!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Sawa"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index a9a3b07..8833153 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"பேட்டரி சக்தி மூன்று பார் அளவில் உள்ளது."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"பேட்டரி முழுமையாக உள்ளது."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"பேட்டரி சதவீதம் தெரியவில்லை."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"சிக்னல் இல்லை."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"சிக்னல் ஒரு கோட்டில் உள்ளது."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"சிக்னல் இரண்டு கோட்டில் உள்ளது."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"சிக்னல் மூன்று கோட்டில் உள்ளது."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"சிக்னல் முழுமையாக உள்ளது."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"டேட்டா சிக்னல் இல்லை."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"தரவு சிக்னல் ஒரு கோட்டில் உள்ளது."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"தரவின் சிக்னல் இரண்டு கோடு வரை உள்ளது."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"தரவு சிக்னல் மூன்று கோட்டில் உள்ளது."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"தரவு சிக்னல் முழுமையாக உள்ளது."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g>க்கு இணைக்கப்பட்டது."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>க்கு இணைக்கப்பட்டது."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> உடன் இணைக்கப்பட்டுள்ளது."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX இரண்டு கோடுகள்."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX மூன்று கோடுகள்."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX சிக்னல் முழுமையாக உள்ளது."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ஈத்தர்நெட் துண்டிக்கப்பட்டது."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ஈத்தர்நெட் இணைக்கப்பட்டது."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"சிக்னல் இல்லை."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"இணைக்கப்படவில்லை."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"கோடுகள் இல்லை."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"ஆஃப்."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"இணைக்கப்பட்டது."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"இணைக்கிறது."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"ரோமிங்"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"வைஃபை"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"சிம் இல்லை."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"மொபைல் டேட்டா"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"மொபைல் டேட்டா இயக்கப்பட்டது"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"மொபைல் டேட்டா ஆஃப் செய்யப்பட்டது"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"தரவை உபயோகிக்க அமைக்கப்படவில்லை"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ஆஃப்"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"புளூடூத் டெதெரிங்."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"விமானப் பயன்முறை."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN இயக்கத்தில் உள்ளது."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"சிம் கார்டு இல்லை."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"மொபைல் நிறுவன நெட்வொர்க்கை மாற்றும்"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"பேட்டரி விவரங்களைத் திறக்கும்"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"பேட்டரி சக்தி <xliff:g id="NUMBER">%d</xliff:g> சதவிகிதம் உள்ளது."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"பேட்டரி: <xliff:g id="PERCENTAGE">%1$s</xliff:g> சதவீதம், உபயோகத்தின் அடிப்படையில் <xliff:g id="TIME">%2$s</xliff:g> மீதமுள்ளது"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"மொபைல் அமைப்புகளின் அடிப்படையில் ஒலிக்கவோ அதிரவோ செய்யும். <xliff:g id="APP_NAME">%1$s</xliff:g> இலிருந்து வரும் உரையாடல்கள் இயல்பாகவே குமிழாகத் தோன்றும்."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"இந்த உள்ளடக்கத்திற்கான மிதக்கும் ஷார்ட்கட் மூலம் உங்கள் கவனத்தைப் பெற்றிருக்கும்."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"இந்த அறிவிப்பு ஒலி எழுப்ப வேண்டுமா அதிர வேண்டுமா என்பதை சிஸ்டம் தீர்மானிக்கும்"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"உரையாடல் பிரிவின் மேற்பகுதியில் மிதக்கும் குமிழாகத் தோன்றும். பூட்டுத் திரையின் மேல் சுயவிவரப் படத்தைக் காட்டும்"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"அமைப்புகள்"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"முன்னுரிமை"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"இந்த ஆப்ஸானது, உங்கள் திரையில் பிற ஆப்ஸின் இடைமுகத்தின் மேல் தோன்றுவதுடன், மைக்ரோஃபோனையும் கேமராவையும் உபயோகிக்கிறது."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"அமைப்புகள்"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"சரி"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"இந்த அறிவிப்பு சிஸ்டத்தால் ஒலியடக்கப்பட்டது."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"இந்த அறிவிப்பு சிஸ்டத்தால் முக்கியமானது என வரையறுக்கப்பட்டது."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"இந்த அறிவிப்பு சிஸ்டத்தால் முக்கியமில்லாதது என வரையறுக்கப்பட்டது."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"இது சரியானதா?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"உங்கள் கருத்துக்கு நன்றி!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"சரி"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 7e7dc37..ccb4fa7 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"బ్యాటరీ మూడు బార్లు."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"బ్యాటరీ నిండింది."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"బ్యాటరీ శాతం తెలియదు."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"ఫోన్ లేదు."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"ఫోన్ ఒక బారు."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"ఫోన్ రెండు బార్లు."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"ఫోన్ మూడు బార్లు."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"ఫోన్ సిగ్నల్ పూర్తిగా ఉంది."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"డేటా లేదు."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"డేటా ఒక బారు."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"డేటా రెండు బార్‌లు."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"డేటా మూడు బార్లు."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"డేటా సిగ్నల్ సంపూర్ణంగా ఉంది."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g>కి కనెక్ట్ చేయబడింది."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>కి కనెక్ట్ చేయబడింది."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>కి కనెక్ట్ చేయబడింది."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX రెండు బార్‌లు కలిగి ఉంది."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX మూడు బార్‌లు కలిగి ఉంది."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX సిగ్నల్ పూర్తిగా ఉంది."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ఈథర్‌నెట్ డిస్‌కనెక్ట్ చేయబడింది."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ఈథర్‌నెట్ కనెక్ట్ చేయబడింది."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"సిగ్నల్ లేదు."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"కనెక్ట్ చేయబడలేదు."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"సున్నా బార్‌లు."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"ఆఫ్‌లో ఉంది."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"కనెక్ట్ చేయబడింది."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"కనెక్ట్ అవుతోంది."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"రోమింగ్"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"సిమ్ లేదు."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"మొబైల్ డేటా"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"మొబైల్ డేటా ఆన్ చేయబడింది"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"మొబైల్ డేటా ఆఫ్‌లో ఉంది"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"డేటాను ఉపయోగించే విధంగా సెట్ చేయలేదు"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ఆఫ్ చేయండి"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"బ్లూటూత్ టెథెరింగ్."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"ఎయిర్‌ప్లేన్ మోడ్."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPNలో."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM కార్డ్ లేదు."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"క్యారియర్ నెట్‌వర్క్ మారుతోంది"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"బ్యాటరీ వివరాలను తెరుస్తుంది"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"బ్యాటరీ <xliff:g id="NUMBER">%d</xliff:g> శాతం."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"బ్యాటరీ <xliff:g id="PERCENTAGE">%1$s</xliff:g> శాతం ఉంది, మీ వినియోగాన్ని బట్టి <xliff:g id="TIME">%2$s</xliff:g> పని చేస్తుంది"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ఫోన్ సెట్టింగ్‌ల ఆధారంగా రింగ్ లేదా వైబ్రేట్ కావచ్చు. <xliff:g id="APP_NAME">%1$s</xliff:g> నుండి సంభాషణలు ఆటోమేటిక్‌గా బబుల్‌గా కనిపిస్తాయి."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ఫ్లోటింగ్ షార్ట్‌కట్‌తో మీ దృష్టిని ఈ కంటెంట్‌పై నిలిపి ఉంచుతుంది."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"ఈ నోటిఫికేషన్ వచ్చినప్పుడు శబ్దం చేయాలా లేదా వైబ్రేట్ చేయాలా అనేది నిర్ణయించడానికి సిస్టమ్‌కు అనుమతి ఇవ్వండి"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"సంభాషణ విభాగం ఎగువన ఉంటుంది, తేలుతున్న బబుల్‌లాగా కనిపిస్తుంది, లాక్ స్క్రీన్‌పై ప్రొఫైల్ ఫోటోను ప్రదర్శిస్తుంది"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"సెట్టింగ్‌లు"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ప్రాధాన్యత"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"ఈ యాప్ మీ స్క్రీన్‌లోని ఇతర యాప్‌లపై ప్రదర్శించబడుతోంది మరియు మైక్రోఫోన్, కెమెరాను ఉపయోగిస్తుంది."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"సెట్టింగ్‌లు"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"సరే"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"ఈ నోటిఫికేషన్‌ను సిస్టమ్ నిశ్శబ్దంగా ఉండేలా చేసింది."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"ఈ నోటిఫికేషన్ స్థాయిని సిస్టమ్ పెంచింది."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"ఈ నోటిఫికేషన్ స్థాయిని సిస్టమ్ తగ్గించింది."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"ఇది సరైనదేనా?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"మీ ఫీడ్‌బ్యాక్‌ను అందించినందుకు ధన్యవాదాలు!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"సరే"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index a18ec8a..9c408e1 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"แบตเตอรี่สามขีด"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"แบตเตอรี่เต็ม"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ไม่ทราบเปอร์เซ็นต์แบตเตอรี่"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"ไม่มีสัญญาณโทรศัพท์"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"สัญญาณโทรศัพท์หนึ่งขีด"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"สัญญาณโทรศัพท์สองขีด"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"สัญญาณโทรศัพท์สามขีด"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"สัญญาณโทรศัพท์เต็ม"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"ไม่มีข้อมูล"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"สัญญาณข้อมูลหนึ่งขีด"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"สัญญาณข้อมูลสองขีด"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"สัญญาณข้อมูลสามขีด"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"สัญญาณข้อมูลเต็ม"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"เชื่อมต่อ <xliff:g id="WIFI">%s</xliff:g> แล้ว"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"เชื่อมต่อกับ <xliff:g id="BLUETOOTH">%s</xliff:g> แล้ว"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"เชื่อมต่อกับ <xliff:g id="CAST">%s</xliff:g>"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"สัญญาณ WiMAX สองขีด"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"สัญญาณ WiMAX สามขีด"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"สัญญาณ WiMAX เต็ม"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ยกเลิกการเชื่อมต่ออีเทอร์เน็ตแล้ว"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"เชื่อมต่ออีเทอร์เน็ตแล้ว"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"ไม่มีสัญญาณ"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"ไม่ได้เชื่อมต่อ"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"ศูนย์ขีด"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"ปิดอยู่"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"เชื่อมต่อแล้ว"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"กำลังเชื่อมต่อ"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"โรมมิ่ง"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"WiFi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"ไม่มีซิมการ์ด"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"เน็ตมือถือ"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"อินเทอร์เน็ตมือถือเปิดอยู่"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"เน็ตมือถือปิดอยู่"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"ไม่ได้ตั้งค่าให้ใช้อินเทอร์เน็ตมือถือ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ปิด"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"การปล่อยสัญญาณบลูทูธ"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"โหมดบนเครื่องบิน"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN เปิดอยู่"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"ไม่มีซิมการ์ด"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"การเปลี่ยนเครือข่ายผู้ให้บริการ"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"เปิดรายละเอียดแบตเตอรี่"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"แบตเตอรี่ <xliff:g id="NUMBER">%d</xliff:g> เปอร์เซ็นต์"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"แบตเตอรี่ <xliff:g id="PERCENTAGE">%1$s</xliff:g> เปอร์เซ็นต์ ใช้ได้อีกประมาณ <xliff:g id="TIME">%2$s</xliff:g> ทั้งนี้ขึ้นอยู่กับการใช้งานของคุณ"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"อาจส่งเสียงหรือสั่นโดยขึ้นอยู่กับการตั้งค่าโทรศัพท์ การสนทนาจาก <xliff:g id="APP_NAME">%1$s</xliff:g> จะแสดงเป็นบับเบิลโดยค่าเริ่มต้น"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ดึงดูดความสนใจของคุณไว้เสมอด้วยทางลัดแบบลอยที่มายังเนื้อหานี้"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"ให้ระบบพิจารณาว่าจะให้การแจ้งเตือนนี้ส่งเสียงหรือสั่นหรือไม่"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"แสดงที่ด้านบนของส่วนการสนทนา ปรากฏเป็นบับเบิลแบบลอย แสดงรูปโปรไฟล์บนหน้าจอล็อก"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"การตั้งค่า"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ลำดับความสำคัญ"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"แอปนี้กำลังแสดงทับแอปอื่นๆ ในหน้าจอและใช้ไมโครโฟนและกล้อง"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"การตั้งค่า"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ตกลง"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"การแจ้งเตือนนี้ถูกปิดเสียงโดยระบบ"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"การแจ้งเตือนนี้ได้รับการเพิ่มระดับโดยระบบ"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"การแจ้งเตือนนี้ถูกลดระดับโดยระบบ"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"การดำเนินการนี้ถูกต้องไหม"</string>
     <string name="feedback_response" msgid="4671729244976641339">"ขอบคุณที่แสดงความคิดเห็น"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ตกลง"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index a68f5ad..9e8aa96 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Baterya na tatlong bar."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Puno na ang baterya."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Hindi alam ang porsyento ng baterya."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Walang telepono."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telepono na isang bar."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telepono na dalawang bar."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telepono na tatlong bar."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Puno ang signal ng telepono."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Walang data."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Data na isang bar."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Data na dalawang bar."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data na tatlong bar."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Puno ang signal ng data."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Nakakonekta sa <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Nakakonekta sa <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Nakakonekta sa <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX na dalawang bar."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX na tatlong bar."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Puno ang signal ng WiMAX."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Nadiskonekta ang Ethernet."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Nakakonekta ang Ethernet."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Walang signal."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Hindi nakakonekta."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Walang mga bar."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Naka-off."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Nakakonekta."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Kumokonekta."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Walang SIM."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobile Data"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Naka-on ang Mobile Data"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Naka-off ang mobile data"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Hindi nakatakdang gumamit ng data"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Naka-off"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Pag-tether ng Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Mode na eroplano."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"Naka-on ang VPN."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Walang SIM card."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Nagpapalit ng carrier network"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Buksan ang mga detalye ng baterya"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Baterya <xliff:g id="NUMBER">%d</xliff:g> (na) porsyento."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> (na) porsyento ang baterya, nasa <xliff:g id="TIME">%2$s</xliff:g> ang natitira batay sa paggamit mo"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Puwedeng mag-ring o mag-vibrate batay sa mga setting ng telepono. Mga pag-uusap mula sa <xliff:g id="APP_NAME">%1$s</xliff:g> bubble bilang default."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Pinapanatili ang iyong atensyon sa pamamagitan ng lumulutang na shortcut sa content na ito."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Ipatukoy sa system kung dapat gumawa ng tunog o pag-vibrate ang notification na ito"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Makikita sa itaas ng seksyon ng pag-uusap, lumalabas bilang floating bubble, ipinapakita sa lock screen ang larawan sa profile"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Mga Setting"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priyoridad"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Ipinapakita ang app na ito sa ibabaw ng iba pang app sa iyong screen at ginagamit nito ang mikropono at camera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Mga Setting"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Ginawang silent ng system ang notification na ito."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Na-promote ng system ang notification na ito."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Na-demote ng system ang notification na ito."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Tama ba ito?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Salamat sa iyong feedback!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index d0d343c..2b89578 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Pil gücü üç çubuk."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Pil tam dolu."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Pil yüzdesi bilinmiyor."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Telefon sinyali yok."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefon sinyali bir çubuk."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefon sinyali iki çubuk."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefon sinyali üç çubuk."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Telefon sinyali tam."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Veri yok."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Veri sinyali bir çubuk."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Veri sinyali iki çubuk."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Veri sinyali üç çubuk."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Veri sinyali tam."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> ile bağlı."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ile bağlı."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> bağlantısı kuruldu."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX iki çubuk."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX üç çubuk."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX sinyali tam."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet bağlantısı kesildi."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet bağlandı."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Sinyal yok."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Bağlanmadı."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Sıfır çubuk."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Kapalı."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Bağlandı."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Bağlanıyor."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Dolaşım"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Kablosuz"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM kart yok."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobil Veri"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobil Veri Açık"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobil veri kapalı"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Veri kullanmak üzere ayarlanmadı"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Kapalı"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth tethering"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Uçak modu."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN açık."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM kart yok."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Operatör ağı değiştiriliyor"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Pil ayrıntılarını aç"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Pil yüzdesi: <xliff:g id="NUMBER">%d</xliff:g>"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Pil yüzde <xliff:g id="PERCENTAGE">%1$s</xliff:g> dolu. Kullanımınıza göre yaklaşık <xliff:g id="TIME">%2$s</xliff:g> süresi kaldı"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Telefon ayarlarına bağlı olarak zili çalabilir veya titreyebilir <xliff:g id="APP_NAME">%1$s</xliff:g> adlı uygulamadan görüşmeler varsayılan olarak baloncukla gösterilir."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Kayan kısayolla dikkatinizi bu içerik üzerinde tutar."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Bu bildirimin ses çıkarması veya titreşmesi gerekip gerekmediğine sistem karar versin"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Görüşme bölümünün üstünde gösterilir, kayan baloncuk olarak görünür, kilit ekranında profil resmini görüntüler"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ayarlar"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Öncelik"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Bu uygulama, ekranınızdaki diğer uygulamaların üzerinde görüntüleniyor ve mikrofon ile kamerayı kullanıyor."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Ayarlar"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"Tamam"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Bu bildirim sistem tarafından sessize alındı."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Bu bildirimin düzeyi sistem tarafından yükseltildi."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Bu bildirimin düzeyi sistem tarafından düşürüldü."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Bu doğru muydu?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Geri bildiriminiz için teşekkürler!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"Tamam"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 26bc662..ec7b85a 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Заряд акумулятора: три смужки."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Акумулятор заряджений."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Відсоток заряду акумулятора невідомий."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Немає сигналу телефону."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Одна смужка сигналу телефону."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Дві смужки сигналу телефону."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Три смужки сигналу телефону."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Максимальний сигнал телефону."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Немає сигналу даних."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Одна смужка сигналу даних."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Дві смужки сигналу даних."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Три смужки сигналу даних."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Максимальний сигнал даних."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Підключено до <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Підключено до <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Під’єднано до пристрою <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Дві смужки сигналу WiMAX."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Три смужки сигналу WiMAX."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Максимальний сигнал WiMAX."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet відключено."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet підключено."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Немає сигналу."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Не з’єднано."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Нуль смужок сигналу."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Вимкнено."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Під’єднано."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"З’єднання."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роумінг"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Немає SIM-карти."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Мобільне передавання даних"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Мобільне передавання даних увімкнено"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Мобільне передавання даних вимкнено"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Не вибрано для використання даних"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Вимкнено"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth-модем"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Режим польоту."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"Мережу VPN увімкнено."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Немає SIM-карти."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Змінення мережі оператора"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Відкрити деталі акумулятора"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Заряд акумулятора у відсотках: <xliff:g id="NUMBER">%d</xliff:g>."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Згідно з даними про використання залишилося <xliff:g id="PERCENTAGE">%1$s</xliff:g> заряду акумулятора – близько <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -729,6 +704,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Може дзвонити або вібрувати залежно від налаштувань телефона. Показує спливаючі розмови з додатка <xliff:g id="APP_NAME">%1$s</xliff:g> за умовчанням."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Привертає увагу до контенту плаваючим ярликом."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Дозволити системі визначати, чи має сповіщення супроводжуватися звуком або вібрацією"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"З\'являється вгорі розділу розмов у спливаючому сповіщенні та показує зображення профілю на заблокованому екрані"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Налаштування"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Пріоритет"</string>
@@ -747,9 +730,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Цей додаток відображається поверх інших додатків на екрані та використовує мікрофон і камеру."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Налаштування"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Система заглушила це сповіщення."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Система підвищила статус цього сповіщення."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Система знизила статус цього сповіщення."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Правильно?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Дякуємо за відгук!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 5307249..15a4f30 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"بیٹری کے تین بارز۔"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"بیٹری بھری ہے۔"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"بیٹری کی فیصد نامعلوم ہے۔"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"کوئی فون نہیں ہے۔"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"فون کا ایک بار۔"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"فون کے دو بارز۔"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"فون کے تین بارز۔"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"فون سگنل پورا ہے۔"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"کوئی ڈیٹا نہیں ہے۔"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"ڈیٹا کا ایک بار۔"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"ڈیٹا کے دو بارز۔"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"ڈیٹا کے تین بارز۔"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"ڈیٹا سگنل بھرا ہوا ہے۔"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> سے منسلک ہیں۔"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> سے منسلک ہیں۔"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> سے منسلک ہے۔"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"‏WiMAX دو بارز۔"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"‏WiMAX تین بارز۔"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"‏WiMAX سگنل پورا ہے۔"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"ایتھرنیٹ منقطع ہے۔"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"ایتھرنیٹ منسلک ہے۔"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"کوئی سگنل نہیں ہے۔"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"مربوط نہیں ہے۔"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"صفر بارز۔"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"آف۔"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"مربوط۔"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"مربوط ہو رہا ہے۔"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+‎"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+‎"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+‎"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X‎"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"رومنگ"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"‏کوئی SIM نہیں ہے۔"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"موبائل ڈیٹا"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"موبائل ڈیٹا آن ہے"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"موبائل ڈیٹا آف ہے"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"ڈیٹا استعمال کرنے کے لیے سیٹ نہیں ہے"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"آف ہے"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"بلوٹوتھ ٹیدرنگ۔"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"ہوائی جہاز وضع۔"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"‏VPN آن ہے۔"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"‏کوئی SIM کارڈ نہیں ہے۔"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"کیریئر نیٹ ورک کی تبدیلی"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"بیٹری کی تفصیلات کھولیں"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"بیٹری <xliff:g id="NUMBER">%d</xliff:g> فیصد۔"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"آپ کے استعمال کی بنیاد پر بیٹری <xliff:g id="PERCENTAGE">%1$s</xliff:g> فیصد، تقریباً <xliff:g id="TIME">%2$s</xliff:g> باقی ہے"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"فون کی ترتیبات کے مطابق وائبریٹ یا گھنٹی بج سکتی ہے۔ بذریعہ ڈیفالٹ <xliff:g id="APP_NAME">%1$s</xliff:g> بلبلہ سے گفتگوئیں۔"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"اس مواد کے فلوٹنگ شارٹ کٹ کے ساتھ آپ کی توجہ دیتی ہے۔"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"سسٹم کو اس بات کا تعین کرنے دیں کہ آیا اس اطلاع کی آواز ہو یا وائبریٹ ہونا چاہیے"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"گفتگو کے سیکشن کے اوپری حصے پر دکھاتا ہے، تیرتے بلبلے کی طرح ظاہر ہوتا ہے، لاک اسکرین پر پروفائل تصویر دکھاتا ہے"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ترتیبات"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ترجیح"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"یہ ایپ آپ کی اسکرین پر دیگر ایپس پر ڈسپلے کر رہی ہے اور مائیکروفون اور کیمرے کا استعمال کر رہی ہے۔"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"ترتیبات"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"ٹھیک ہے"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"سسٹم کے ذریعے اس اطلاع کو خاموش کیا گيا۔"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"سسٹم کے ذریعے اس اطلاع کو پروموٹ کیا گيا۔"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"سسٹم کے ذریعے اس اطلاع کو ڈیموٹ کیا گيا۔"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"کیا یہ درست تھا؟"</string>
     <string name="feedback_response" msgid="4671729244976641339">"آپ کے تاثرات کا شکریہ!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"ٹھیک ہے"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index b2ba26d..9e1387e 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Batareya uchta panelda."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Batareya to‘la."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batareya quvvati foizi nomaʼlum."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Signal yo‘q."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Telefon bitta panelda."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Telefon ikkita panelda."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Telefon uchta panelda."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Telefon signali to‘liq."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Ma’lumotlar yo‘q."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Ma’lumotlar bitta panelda."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Ma’lumotlar ikkita panelda."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Ma’lumotlar uchta panelda."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Internet signali butun."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Ulangan: <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ulangan: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Bunga ulangan: <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Ikkita ustunli WiMAX."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Uchta ustunli WiMAX."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"To‘liq signalli WiMAX."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Qurilma Ethernet tarmog‘idan uzildi."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Qurilma Ethernet tarmog‘iga ulandi."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Signal yo‘q."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Ulanmagan."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Signal ustuni yo‘q."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Yoqilmagan"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Ulangan."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Ulanmoqda…"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Rouming"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM kartasiz."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Mobil internet"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobil internet yoniq"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobil internet yoqilmagan"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Maʼlumotlardan foydalanish uchun sozlanmagan"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Yoqilmagan"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Bluetooth modem"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Parvoz rejimi"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN yoniq."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"SIM karta solinmagan."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Mobil tarmoqni o‘zgartirish"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Quvvat sarfi tafsilotlari"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Batareya <xliff:g id="NUMBER">%d</xliff:g> foiz."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Batareya quvvati <xliff:g id="PERCENTAGE">%1$s</xliff:g> foiz, joriy holatda yana <xliff:g id="TIME">%2$s</xliff:g> qoldi"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Telefon sozlamalari asosida jiringlashi yoki tebranishi mumkin. <xliff:g id="APP_NAME">%1$s</xliff:g> suhbatlari standart holatda bulutcha shaklida chiqadi."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Bu kontentni ochuvchi erkin yorliq diqqatingizda boʻladi."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Bu bildirishnoma jiringlashi yoki tebranishini hal qilsin"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Suhbatlar ruknining tepasida qalqib chiquvchi bulutcha shaklida chiqadi, ekran qulfida profil rasmi chiqadi"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Sozlamalar"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Muhim"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Bu ilova ekranda boshqa ilovalar ustidan ochilgan hamda mikrofon va kameradan foydalanmoqda."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Sozlamalar"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Bu bildirishnoma tizim tomonidan ovozsiz qilindi."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Bu bildirishnoma tizim tomonidan balandlatildi."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Bu bildirishnoma tizim tomonidan pasaytirildi."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Xatolar boʻlmadimi?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Fikr-mulohazangiz uchun tashakkur!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index a5d4900..92929b8 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Mức pin ba vạch."</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Mức pin đầy."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Tỷ lệ phần trăm pin không xác định."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Không có điện thoại nào."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Tín hiệu điện thoại một vạch."</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Tín hiệu điện thoại hai vạch."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Tín hiệu điện thoại ba vạch."</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Tín hiệu điện thoại đầy đủ."</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Không có dữ liệu."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Tín hiệu dữ liệu một vạch."</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Tín hiệu dữ liệu hai vạch."</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Tín hiệu dữ liệu ba vạch."</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Tín hiệu dữ liệu đầy đủ."</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Đã kết nối với <xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Đã kết nối với <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Đã kết nối với <xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX hai vạch."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX ba vạch."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Tín hiệu WiMAX đầy đủ."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Đã ngắt kết nối Ethernet."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Đã kết nối Ethernet."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Không có tín hiệu nào."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Chưa được kết nối."</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"0 vạch."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Tắt."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Đã kết nối."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Đang kết nối."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Chuyển vùng"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Không có SIM nào."</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Dữ liệu di động"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Dữ liệu di động đang bật"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Đã tắt dữ liệu di động"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Chưa được đặt để sử dụng dữ liệu"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Tắt"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Chia sẻ Internet qua Bluetooth"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Chế độ trên máy bay."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN đang bật."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Không có thẻ SIM nào."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Thay đổi mạng của nhà mạng"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Mở chi tiết về pin"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"<xliff:g id="NUMBER">%d</xliff:g> phần trăm pin."</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> phần trăm pin, còn khoảng <xliff:g id="TIME">%2$s</xliff:g> dựa trên mức sử dụng của bạn"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Có thể đổ chuông hoặc rung tùy theo chế độ cài đặt trên điện thoại. Theo mặc định, các cuộc trò chuyện từ <xliff:g id="APP_NAME">%1$s</xliff:g> được phép hiển thị dưới dạng bong bóng."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Luôn chú ý vào nội dung này bằng phím tắt nổi."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Cho phép hệ thống quyết định xem thông báo này phát âm thanh hay rung"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Hiển thị cuộc trò chuyện ở đầu phần cuộc trò chuyện và dưới dạng bong bóng nổi, hiển thị ảnh hồ sơ trên màn hình khóa"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Cài đặt"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Mức độ ưu tiên"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Ứng dụng này đang hiển thị chồng lên các ứng dụng khác trên màn hình, đồng thời đang sử dụng micrô và máy ảnh."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Cài đặt"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"OK"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Hệ thống đã tắt tiếng thông báo này."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Hệ thống đã nâng mức ưu tiên của thông báo này."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Hệ thống đã giảm mức ưu tiên của thông báo này."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Thông tin này có chính xác không?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Cảm ơn bạn đã phản hồi!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"OK"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 10873c5..827ca5f 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"电池电量为三格。"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"电池电量满格。"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"电池电量百分比未知。"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"没有手机信号。"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"手机信号强度为一格。"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"手机信号强度为两格。"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"手机信号强度为三格。"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"手机信号满格。"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"没有数据网络信号。"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"数据信号强度为一格。"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"数据信号强度为两格。"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"数据信号强度为三格。"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"数据信号满格。"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"已连接到“<xliff:g id="WIFI">%s</xliff:g>”。"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"已连接到<xliff:g id="BLUETOOTH">%s</xliff:g>。"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"已连接到 <xliff:g id="CAST">%s</xliff:g>。"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX 信号强度为两格。"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX 信号强度为三格。"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX 信号满格。"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"以太网已断开连接。"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"以太网已连接。"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"无信号。"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"未连接。"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"信号强度为零格。"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"关闭。"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"已连接。"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"正在连接。"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"漫游"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"WLAN"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"无 SIM 卡。"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"移动数据"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"移动数据已开启"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"移动数据网络已关闭"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"未设置为使用移动数据"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"关闭"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"蓝牙网络共享。"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"飞行模式。"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN 已开启。"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"没有 SIM 卡。"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"运营商网络正在更改"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"打开电量详情"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"电池电量为百分之 <xliff:g id="NUMBER">%d</xliff:g>。"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"电池电量为 <xliff:g id="PERCENTAGE">%1$s</xliff:g>,根据您的使用情况,大约还可使用 <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"可能会响铃或振动(取决于手机设置)。默认情况下,来自<xliff:g id="APP_NAME">%1$s</xliff:g>的对话会以对话泡的形式显示。"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"通过可链接到这项内容的浮动快捷方式吸引您的注意。"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"让系统决定是否应让设备在收到此通知时发出提示音或振动"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"以悬浮对话泡形式显示在对话部分顶部,如果设备处于锁定状态,在锁定屏幕上显示个人资料照片"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"设置"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"优先"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"此应用正显示在屏幕上其他应用的上层,并且正在使用麦克风和摄像头。"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"设置"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"确定"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"此通知已被系统静音。"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"此通知已被系统升级。"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"此通知已被系统降级。"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"是否正确?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"感谢您提供反馈!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"确定"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 9abcf10..50bac07 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"電池電量為三格。"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"電池已滿。"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"電量百分比不明。"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"沒有電話訊號。"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"電話訊號強度為一格。"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"電話訊號強度為兩格。"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"電話訊號強度為三格。"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"電話訊號滿格。"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"沒有數據網絡。"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"數據網絡訊號強度為一格。"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"數據網絡訊號強度為兩格。"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"數據網絡訊號強度為三格。"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"數據網絡訊號滿格。"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"已連線至<xliff:g id="WIFI">%s</xliff:g>。"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"已連線至<xliff:g id="BLUETOOTH">%s</xliff:g>。"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"已連接至 <xliff:g id="CAST">%s</xliff:g>。"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX 訊號強度兩格。"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX 訊號強度三格。"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX 訊號滿格。"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"以太網連接中斷。"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"已連接以太網。"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"沒有訊號。"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"未連線。"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"訊號強度為零格。"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"關閉。"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"已連線。"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"連線中。"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"漫遊"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"無 SIM 卡。"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"流動數據"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"開咗流動數據"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"流動數據已關閉"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"未設定至可使用資料"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"關閉"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"藍牙網絡共享。"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"飛航模式。"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"開咗 VPN。"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"沒有 SIM 卡。"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"流動網絡供應商網絡正在變更"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"開啟電池詳細資料"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"電池電量為百分之 <xliff:g id="NUMBER">%d</xliff:g>。"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"電量仲剩番 <xliff:g id="PERCENTAGE">%1$s</xliff:g>。根據你嘅使用情況,仲可以用大約 <xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"可能會根據手機設定發出鈴聲或震動。「<xliff:g id="APP_NAME">%1$s</xliff:g>」的對話會預設以對話氣泡顯示。"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"為此內容建立浮動捷徑以保持注意力。"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"由系統判斷是否要讓此通知發出音效或震動"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"以浮動對話泡顯示在對話部分的頂部,並在上鎖畫面顯示個人檔案相片"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"重要"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"此應用程式目前透過其他應用程式在畫面上顯示內容,且正在使用麥克風和相機。"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"設定"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"確定"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"系統已將此通知設為靜音。"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"系統已將此通知升級。"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"系統已將此通知降級。"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"是否正確?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"多謝您提供意見!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"確定"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index a33146b..0ff8ffa 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"電池電量三格。"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"電池電量已滿。"</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"電池電量不明。"</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"沒有電話訊號。"</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"電話訊號強度一格。"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"電話訊號強度兩格。"</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"電話訊號強度三格。"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"電話訊號滿格。"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"沒有數據網路。"</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"數據網路訊號強度一格。"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"數據網路訊號強度兩格。"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"數據網路訊號強度三格。"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"數據網路訊號滿格。"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"已連線至<xliff:g id="WIFI">%s</xliff:g>。"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"已連線至<xliff:g id="BLUETOOTH">%s</xliff:g>。"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"已連線至 <xliff:g id="CAST">%s</xliff:g>。"</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX 訊號兩格。"</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"WiMAX 訊號三格。"</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"WiMAX 訊號滿格。"</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"未連上乙太網路。"</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"已連上乙太網路。"</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"沒有訊號。"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"尚未連線。"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"訊號強度零格。"</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"關閉。"</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"已連線。"</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"連線中。"</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"漫遊"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"沒有 SIM 卡。"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"行動數據"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"行動數據已開啟"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"行動數據已關閉"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"並未設為使用行動數據"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"已關閉"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"藍牙網路共用"</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"飛行模式。"</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN 已開啟。"</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"沒有 SIM 卡。"</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"電信業者網路正在進行變更"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"開啟電量詳細資料"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"電池電量為百分之 <xliff:g id="NUMBER">%d</xliff:g>。"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"目前的電量為 <xliff:g id="PERCENTAGE">%1$s</xliff:g>。根據你的使用情形,大約還能使用到<xliff:g id="TIME">%2$s</xliff:g>"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"可能會根據手機的設定響鈴或震動。根據預設,來自「<xliff:g id="APP_NAME">%1$s</xliff:g>」的對話會以對話框形式顯示。"</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"利用浮動式捷徑快速存取這項內容。"</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"由系統判斷要讓裝置在收到這則通知時震動還是發出音效"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"以浮動對話框的形式顯示在對話部分的頂端。如果裝置處於鎖定狀態,則在螢幕鎖定畫面上顯示個人資料相片"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"優先"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"這個應用程式顯示在畫面上其他應用程式的上層,且正在使用麥克風和相機。"</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"設定"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"確定"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"系統已將這則通知設為靜音。"</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"系統已提升這則通知的優先順序。"</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"系統已降低這則通知的優先順序。"</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"是否正確?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"感謝你提供意見!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"確定"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 5c8b6cd..321fd20 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -187,16 +187,6 @@
     <string name="accessibility_battery_three_bars" msgid="118341923832368291">"Amabha amathathu ebhethri"</string>
     <string name="accessibility_battery_full" msgid="1480463938961288494">"Ibhethri igcwele."</string>
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Iphesenti lebhethri alaziwa."</string>
-    <string name="accessibility_no_phone" msgid="8828412144430247025">"Ayikho ifoni."</string>
-    <string name="accessibility_phone_one_bar" msgid="8786055123727785588">"Ibha eyodwa yefoni"</string>
-    <string name="accessibility_phone_two_bars" msgid="3316909612598670674">"Amabha amabilil efoni."</string>
-    <string name="accessibility_phone_three_bars" msgid="5670937367300884534">"Amabha amathathu efoni"</string>
-    <string name="accessibility_phone_signal_full" msgid="1103449569988869971">"Isiginali yefoni igcwele"</string>
-    <string name="accessibility_no_data" msgid="2124768255213392359">"Ayikho idatha."</string>
-    <string name="accessibility_data_one_bar" msgid="3226985124149387055">"Idatha enye yebha"</string>
-    <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Amabha amabili edatha"</string>
-    <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Amabha amathathu edatha"</string>
-    <string name="accessibility_data_signal_full" msgid="283507058258113551">"Igcwele i-signal yedatha"</string>
     <string name="accessibility_wifi_name" msgid="4863440268606851734">"Xhuma ku-<xliff:g id="WIFI">%s</xliff:g>."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Xhuma ku-<xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Ixhumeke ku-<xliff:g id="CAST">%s</xliff:g>."</string>
@@ -205,8 +195,6 @@
     <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"Amabha amabili we-WiMAX."</string>
     <string name="accessibility_wimax_three_bars" msgid="2773714362377629938">"Amabha amathathu we-WiMAX."</string>
     <string name="accessibility_wimax_signal_full" msgid="3101861561730624315">"Isiginali ye-WiMAX egcwele."</string>
-    <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"I-Ethernet inqanyuliwe."</string>
-    <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"I-Ethernet ixhunyiwe."</string>
     <string name="accessibility_no_signal" msgid="1115622734914921920">"Ayikho isignali."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Akuxhunyiwe"</string>
     <string name="accessibility_zero_bars" msgid="1364823964848784827">"Amabha ayiqanda."</string>
@@ -218,30 +206,17 @@
     <string name="accessibility_desc_off" msgid="8055389500285421408">"Vala."</string>
     <string name="accessibility_desc_connected" msgid="3082590384032624233">"Ixhunyiwe."</string>
     <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Iyaxhuma."</string>
-    <string name="data_connection_gprs" msgid="2752584037409568435">"I-GPRS"</string>
     <string name="data_connection_hspa" msgid="6096234094857660873">"I-HSPA"</string>
-    <string name="data_connection_3g" msgid="1215807817895516914">"3G"</string>
-    <string name="data_connection_3_5g" msgid="4097346596394846450">"H"</string>
-    <string name="data_connection_3_5g_plus" msgid="8938598386721354697">"H+"</string>
-    <string name="data_connection_4g" msgid="5770196771037980730">"4G"</string>
-    <string name="data_connection_4g_plus" msgid="780615287092000279">"4G+"</string>
-    <string name="data_connection_lte" msgid="557021044282539923">"I-LTE"</string>
-    <string name="data_connection_lte_plus" msgid="4799302403782283178">"I-LTE+"</string>
-    <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Iyazulazula"</string>
-    <string name="data_connection_edge" msgid="6316755666481405762">"I-EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"I-Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="1140839832913084973">"Ayikho i-SIM"</string>
     <string name="accessibility_cell_data" msgid="172950885786007392">"Idatha Yeselula"</string>
     <string name="accessibility_cell_data_on" msgid="691666434519443162">"Idatha yeselula ivuliwe"</string>
-    <string name="cell_data_off_content_description" msgid="9165555931499878044">"Idatha yeselula ivaliwe"</string>
-    <string name="not_default_data_content_description" msgid="6757881730711522517">"Akusethiwe ukuze kusetshenziswe idatha"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Valiwe"</string>
     <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Imodemu nge-Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Imodi yendiza."</string>
     <string name="accessibility_vpn_on" msgid="8037549696057288731">"I-VPN ivuliwe."</string>
     <string name="accessibility_no_sims" msgid="5711270400476534667">"Alikho ikhadi le-SIM."</string>
-    <string name="carrier_network_change_mode" msgid="5174141476991149918">"Inethiwekhi yenkampani yenethiwekhi iyashintsha"</string>
     <string name="accessibility_battery_details" msgid="6184390274150865789">"Vula imininingwane yebhethri"</string>
     <string name="accessibility_battery_level" msgid="5143715405241138822">"Iphesenti <xliff:g id="NUMBER">%d</xliff:g> lebhethri"</string>
     <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Amaphesenti ebhethri ngu-<xliff:g id="PERCENTAGE">%1$s</xliff:g>, cishe kusele okungu-<xliff:g id="TIME">%2$s</xliff:g> kusukela ekusetshenzisweni kwakho"</string>
@@ -723,6 +698,14 @@
     <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Ingase ikhale noma idlidlize kuya ngamasethingi wefoni yakho. Izingxoxo ezivela ku-<xliff:g id="APP_NAME">%1$s</xliff:g> ziba yibhamuza ngokuzenzakalela."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Igcina ukunaka kwakho ngesinqamuleli esintantayo kulokhu okuqukethwe."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Vumela isistimu inqume uma lesi saziso kufanele senze umsindo noma sidlidlize"</string>
+    <!-- no translation found for notification_channel_summary_automatic_alerted (954166812246932240) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_silenced (7403004439649872047) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_promoted (1301710305149590426) -->
+    <skip />
+    <!-- no translation found for notification_channel_summary_automatic_demoted (1831303964660807700) -->
+    <skip />
     <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Iboniswa ngenhla kwesigaba sengxoxo, ivela njengebhamuza elintantayo, ibonisa isithombe sephrofayela kukukhiya isikrini"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Izilungiselelo"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Okubalulekile"</string>
@@ -741,9 +724,14 @@
     <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"Lolu hlelo lokusebenza liboniswa ngaphezulu kwezinye izinhlelo zokusebenza kusikrini sakho futhi kusetshenziswa imakrofoni nekhamera."</string>
     <string name="notification_appops_settings" msgid="5208974858340445174">"Izilungiselelo"</string>
     <string name="notification_appops_ok" msgid="2177609375872784124">"KULUNGILE"</string>
-    <string name="feedback_silenced" msgid="5382212321253328247">"Lesi saziso sithuliswe isistimu."</string>
-    <string name="feedback_promoted" msgid="8075757485407091976">"Lesi saziso siphromothwe isistimu."</string>
-    <string name="feedback_demoted" msgid="5848066008939031913">"Lesi saziso sehliswe isikhundla isistimu."</string>
+    <!-- no translation found for feedback_alerted (5192459808484271208) -->
+    <skip />
+    <!-- no translation found for feedback_silenced (9116540317466126457) -->
+    <skip />
+    <!-- no translation found for feedback_promoted (2125562787759780807) -->
+    <skip />
+    <!-- no translation found for feedback_demoted (951884763467110604) -->
+    <skip />
     <string name="feedback_prompt" msgid="2278631214125128281">"Ingabe kade kulungile lokhu?"</string>
     <string name="feedback_response" msgid="4671729244976641339">"Siyabonga ngempendulo!"</string>
     <string name="feedback_ok" msgid="6481426753298857144">"KULUNGILE"</string>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 6fa4aa1..5435a15 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -231,7 +231,7 @@
     <!-- Notification text displayed when we fail to save a screenshot for unknown reasons. [CHAR LIMIT=100] -->
     <string name="screenshot_failed_to_save_unknown_text">Try taking screenshot again</string>
     <!-- Notification text displayed when we fail to save a screenshot. [CHAR LIMIT=100] -->
-    <string name="screenshot_failed_to_save_text">Can\'t save screenshot due to limited storage space</string>
+    <string name="screenshot_failed_to_save_text">Can\'t save screenshot</string>
     <!-- Notification text displayed when we fail to take a screenshot. [CHAR LIMIT=100] -->
     <string name="screenshot_failed_to_capture_text">Taking screenshots isn\'t allowed by the app or
         your organization</string>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java
index bf88a29..ffd8a08 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java
@@ -23,6 +23,7 @@
  */
 public class ThreadedRendererCompat {
 
+    public static int EGL_CONTEXT_PRIORITY_REALTIME_NV = 0x3357;
     public static int EGL_CONTEXT_PRIORITY_HIGH_IMG = 0x3101;
     public static int EGL_CONTEXT_PRIORITY_MEDIUM_IMG = 0x3102;
     public static int EGL_CONTEXT_PRIORITY_LOW_IMG = 0x3103;
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index bf42a60..036fcf3 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -33,14 +33,15 @@
 import android.provider.Settings;
 import android.util.Log;
 import android.util.TimingsTraceLog;
+import android.view.SurfaceControl;
 
 import com.android.internal.protolog.common.ProtoLog;
 import com.android.systemui.dagger.ContextComponentHelper;
 import com.android.systemui.dagger.GlobalRootComponent;
 import com.android.systemui.dagger.SysUIComponent;
 import com.android.systemui.dump.DumpManager;
-import com.android.systemui.people.PeopleSpaceActivity;
 import com.android.systemui.people.widget.PeopleSpaceWidgetProvider;
+import com.android.systemui.shared.system.ThreadedRendererCompat;
 import com.android.systemui.util.NotificationChannels;
 
 import java.lang.reflect.Constructor;
@@ -98,6 +99,18 @@
         if (Process.myUserHandle().equals(UserHandle.SYSTEM)) {
             IntentFilter bootCompletedFilter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
             bootCompletedFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
+
+            // If SF GPU context priority is set to realtime, then SysUI should run at high.
+            // The priority is defaulted at medium.
+            int sfPriority = SurfaceControl.getGPUContextPriority();
+            Log.i(TAG, "Found SurfaceFlinger's GPU Priority: " + sfPriority);
+            if (sfPriority == ThreadedRendererCompat.EGL_CONTEXT_PRIORITY_REALTIME_NV) {
+                Log.i(TAG, "Setting SysUI's GPU Context priority to: "
+                        + ThreadedRendererCompat.EGL_CONTEXT_PRIORITY_HIGH_IMG);
+                ThreadedRendererCompat.setContextPriority(
+                        ThreadedRendererCompat.EGL_CONTEXT_PRIORITY_HIGH_IMG);
+            }
+
             registerReceiver(new BroadcastReceiver() {
                 @Override
                 public void onReceive(Context context, Intent intent) {
@@ -112,26 +125,12 @@
                             mServices[i].onBootCompleted();
                         }
                     }
-                    // If flag SHOW_PEOPLE_SPACE is true, enable People Space launcher icon.
-                    // TODO(b/170396074): Remove this when we don't need an icon anymore.
-                    try {
-                        int showPeopleSpace = Settings.Global.getInt(context.getContentResolver(),
-                                Settings.Global.SHOW_PEOPLE_SPACE, 0);
-                        context.getPackageManager().setComponentEnabledSetting(
-                                new ComponentName(context, PeopleSpaceActivity.class),
-                                showPeopleSpace == 1
-                                        ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
-                                        : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
-                                PackageManager.DONT_KILL_APP);
-                    } catch (Exception e) {
-                        Log.w(TAG, "Error enabling People Space launch icon:", e);
-                    }
 
                     // If SHOW_PEOPLE_SPACE is true, enable People Space widget provider.
                     // TODO(b/170396074): Remove this when we don't need a widget anymore.
                     try {
                         int showPeopleSpace = Settings.Global.getInt(context.getContentResolver(),
-                                Settings.Global.SHOW_PEOPLE_SPACE, 0);
+                                Settings.Global.SHOW_PEOPLE_SPACE, 1);
                         context.getPackageManager().setComponentEnabledSetting(
                                 new ComponentName(context, PeopleSpaceWidgetProvider.class),
                                 showPeopleSpace == 1
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index 7bb8a84..a15a5aa 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -91,7 +91,7 @@
     private final String mHbmDisableCommand;
     private final boolean mHbmSupported;
     // Brightness in nits in the high-brightness mode.
-    private final float mHbmNits;
+    private final float mMaxNits;
     // A spline mapping from the device's backlight value, normalized to the range [0, 1.0], to a
     // brightness in nits.
     private final Spline mBacklightToNitsSpline;
@@ -211,30 +211,51 @@
         // non-high-brightness mode.
         float[] nitsRange = toFloatArray(resources.obtainTypedArray(
                 com.android.internal.R.array.config_screenBrightnessNits));
+        if (nitsRange.length < 2) {
+            throw new IllegalArgumentException(
+                    String.format("nitsRange.length: %d. Must be >= 2", nitsRange.length));
+        }
 
         // The last value of this range corresponds to the high-brightness mode.
         float[] nitsAutoBrightnessValues = toFloatArray(resources.obtainTypedArray(
                 com.android.internal.R.array.config_autoBrightnessDisplayValuesNits));
+        if (nitsAutoBrightnessValues.length < 2) {
+            throw new IllegalArgumentException(
+                    String.format("nitsAutoBrightnessValues.length: %d. Must be >= 2",
+                            nitsAutoBrightnessValues.length));
+        }
 
-        mHbmNits = nitsAutoBrightnessValues[nitsAutoBrightnessValues.length - 1];
-        float[] hbmNitsRange = {nitsRange[0], mHbmNits};
+        mMaxNits = nitsAutoBrightnessValues[nitsAutoBrightnessValues.length - 1];
+        float[] hbmNitsRange = nitsRange.clone();
+        hbmNitsRange[hbmNitsRange.length - 1] = mMaxNits;
 
         // This range only consists of the minimum and maximum backlight values, which only apply
         // in non-high-brightness mode.
         float[] normalizedBacklightRange = normalizeBacklightRange(
                 resources.getIntArray(
                         com.android.internal.R.array.config_screenBrightnessBacklight));
+        if (normalizedBacklightRange.length < 2) {
+            throw new IllegalArgumentException(
+                    String.format("normalizedBacklightRange.length: %d. Must be >= 2",
+                            normalizedBacklightRange.length));
+        }
+        if (normalizedBacklightRange.length != nitsRange.length) {
+            throw new IllegalArgumentException(
+                    "normalizedBacklightRange.length != nitsRange.length");
+        }
 
         mBacklightToNitsSpline = Spline.createSpline(normalizedBacklightRange, nitsRange);
         mNitsToHbmBacklightSpline = Spline.createSpline(hbmNitsRange, normalizedBacklightRange);
         mDefaultBrightness = obtainDefaultBrightness(powerManager);
 
         // TODO(b/160025856): move to the "dump" method.
-        Log.v(TAG, String.format("ctor | mNitsRange: [%f, %f]", nitsRange[0], nitsRange[1]));
+        Log.v(TAG, String.format("ctor | mNitsRange: [%f, %f]", nitsRange[0],
+                nitsRange[nitsRange.length - 1]));
         Log.v(TAG, String.format("ctor | mHbmNitsRange: [%f, %f]", hbmNitsRange[0],
-                hbmNitsRange[1]));
+                hbmNitsRange[hbmNitsRange.length - 1]));
         Log.v(TAG, String.format("ctor | mNormalizedBacklightRange: [%f, %f]",
-                normalizedBacklightRange[0], normalizedBacklightRange[1]));
+                normalizedBacklightRange[0],
+                normalizedBacklightRange[normalizedBacklightRange.length - 1]));
 
         mFingerprintManager.setUdfpsOverlayController(new UdfpsOverlayController());
         mIsOverlayShowing = false;
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
index e43eb9f..62de939 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
@@ -38,6 +38,8 @@
 
 import androidx.preference.PreferenceManager;
 
+import com.android.internal.logging.UiEventLogger;
+import com.android.internal.logging.UiEventLoggerImpl;
 import com.android.systemui.R;
 import com.android.systemui.people.widget.PeopleSpaceWidgetProvider;
 
@@ -60,6 +62,7 @@
     private AppWidgetManager mAppWidgetManager;
     private int mAppWidgetId;
     private boolean mShowSingleConversation;
+    private UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -149,6 +152,8 @@
 
     /** Finish activity with a successful widget configuration result. */
     private void finishActivity() {
+        if (PeopleSpaceUtils.DEBUG) Log.d(TAG, "Widget added!");
+        mUiEventLogger.log(PeopleSpaceUtils.PeopleSpaceWidgetEvent.PEOPLE_SPACE_WIDGET_ADDED);
         Intent resultValue = new Intent();
         resultValue.putExtra(EXTRA_APPWIDGET_ID, mAppWidgetId);
         setResult(RESULT_OK, resultValue);
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
index d682379..7fc24f6 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
@@ -50,6 +50,8 @@
 import android.widget.RemoteViews;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.logging.UiEvent;
+import com.android.internal.logging.UiEventLogger;
 import com.android.internal.util.ArrayUtils;
 import com.android.systemui.R;
 import com.android.systemui.people.widget.LaunchConversationActivity;
@@ -81,6 +83,29 @@
         REMOVED
     }
 
+    /**
+     * The UiEvent enums that this class can log.
+     */
+    public enum PeopleSpaceWidgetEvent implements UiEventLogger.UiEventEnum {
+        @UiEvent(doc = "People space widget deleted")
+        PEOPLE_SPACE_WIDGET_DELETED(666),
+        @UiEvent(doc = "People space widget added")
+        PEOPLE_SPACE_WIDGET_ADDED(667),
+        @UiEvent(doc = "People space widget clicked to launch conversation")
+        PEOPLE_SPACE_WIDGET_CLICKED(668);
+
+        private final int mId;
+
+        PeopleSpaceWidgetEvent(int id) {
+            mId = id;
+        }
+
+        @Override
+        public int getId() {
+            return mId;
+        }
+    }
+
     /** Returns a list of map entries corresponding to user's conversations. */
     public static List<Map.Entry<Long, PeopleSpaceTile>> getTiles(
             Context context, INotificationManager notificationManager, IPeopleManager peopleManager,
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/LaunchConversationActivity.java b/packages/SystemUI/src/com/android/systemui/people/widget/LaunchConversationActivity.java
index 0b0308f..358f311 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/LaunchConversationActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/LaunchConversationActivity.java
@@ -23,12 +23,15 @@
 import android.os.UserHandle;
 import android.util.Log;
 
+import com.android.internal.logging.UiEventLogger;
+import com.android.internal.logging.UiEventLoggerImpl;
 import com.android.systemui.people.PeopleSpaceUtils;
 
 /** Proxy activity to launch ShortcutInfo's conversation. */
 public class LaunchConversationActivity extends Activity {
     private static final String TAG = "PeopleSpaceLaunchConv";
     private static final boolean DEBUG = PeopleSpaceUtils.DEBUG;
+    private UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -44,6 +47,7 @@
             if (DEBUG) {
                 Log.d(TAG, "Launching conversation with shortcutInfo id " + tileId);
             }
+            mUiEventLogger.log(PeopleSpaceUtils.PeopleSpaceWidgetEvent.PEOPLE_SPACE_WIDGET_CLICKED);
             try {
                 LauncherApps launcherApps =
                         getApplicationContext().getSystemService(LauncherApps.class);
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java
index 1ee9e0e..7f204cc 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java
@@ -27,6 +27,8 @@
 import android.util.Log;
 import android.widget.RemoteViews;
 
+import com.android.internal.logging.UiEventLogger;
+import com.android.internal.logging.UiEventLoggerImpl;
 import com.android.systemui.R;
 import com.android.systemui.people.PeopleSpaceUtils;
 
@@ -39,7 +41,10 @@
     public static final String EXTRA_PACKAGE_NAME = "extra_package_name";
     public static final String EXTRA_UID = "extra_uid";
 
+    public UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
+
     /** Called when widget updates. */
+    @Override
     public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
         super.onUpdate(context, appWidgetManager, appWidgetIds);
 
@@ -79,4 +84,14 @@
             appWidgetManager.updateAppWidget(appWidgetId, views);
         }
     }
+
+    @Override
+    public void onDeleted(Context context, int[] appWidgetIds) {
+        super.onDeleted(context, appWidgetIds);
+        for (int widgetId : appWidgetIds) {
+            if (DEBUG) Log.d(TAG, "Widget removed");
+            mUiEventLogger.log(PeopleSpaceUtils.PeopleSpaceWidgetEvent.PEOPLE_SPACE_WIDGET_DELETED);
+        }
+    }
+
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
index d58895e..d3adc9b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
@@ -321,7 +321,7 @@
         @Override
         public void onTuningChanged(String key, String newValue) {
             if (QS_REMOVE_LABELS.equals(key)) {
-                boolean newShowLabels = "0".equals(newValue);
+                boolean newShowLabels = newValue == null || "0".equals(newValue);
                 if (mShowLabels == newShowLabels) return;
                 mShowLabels = newShowLabels;
                 for (TileRecord t : mRecords) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
index d7933d3..73ab9b0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
@@ -77,11 +77,11 @@
 
         toolbar.getMenu().add(Menu.NONE, MENU_RESET, 0,
                 mContext.getString(com.android.internal.R.string.reset));
-        if (Build.IS_ENG || Build.IS_USERDEBUG) {
-            // Prototype menu item
-            toolbar.getMenu().add(Menu.NONE, MENU_REMOVE_LABELS, Menu.NONE, "Remove labels")
-                    .setCheckable(true);
-        }
+        // Prototype menu item
+        toolbar.getMenu()
+                .add(Menu.NONE, MENU_REMOVE_LABELS, Menu.NONE, "Remove labels")
+                .setCheckable(true)
+                .setVisible(Build.IS_ENG || Build.IS_USERDEBUG);
         toolbar.setTitle(R.string.qs_edit);
         mRecyclerView = findViewById(android.R.id.list);
         mTransparentView = findViewById(R.id.customizer_transparent_view);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java
index 9bf3b8c..2dfac1b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java
@@ -105,7 +105,8 @@
     private final TunerService.Tunable mTunable = new TunerService.Tunable() {
         @Override
         public void onTuningChanged(String key, String newValue) {
-            mToolbar.getMenu().findItem(MENU_REMOVE_LABELS).setChecked(!("0".equals(newValue)));
+            mToolbar.getMenu().findItem(MENU_REMOVE_LABELS)
+                    .setChecked(newValue != null && !("0".equals(newValue)));
         }
     };
 
diff --git a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
index 6afc756..c2ba344 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
@@ -17,6 +17,7 @@
 package com.android.systemui.recents;
 
 import static com.android.systemui.util.leak.RotationUtils.ROTATION_LANDSCAPE;
+import static com.android.systemui.util.leak.RotationUtils.ROTATION_NONE;
 import static com.android.systemui.util.leak.RotationUtils.ROTATION_SEASCAPE;
 
 import android.animation.ArgbEvaluator;
@@ -27,6 +28,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.res.Configuration;
 import android.graphics.PixelFormat;
 import android.graphics.drawable.ColorDrawable;
 import android.os.Binder;
@@ -186,7 +188,7 @@
             DisplayMetrics metrics = new DisplayMetrics();
             mWindowManager.getDefaultDisplay().getMetrics(metrics);
             float density = metrics.density;
-            int rotation = RotationUtils.getRotation(mContext);
+            int rotation = getRotation(mContext);
 
             inflateView(rotation);
             int bgColor = mContext.getColor(
@@ -342,14 +344,23 @@
 
         protected void onConfigurationChanged() {
             removeAllViews();
-            inflateView(RotationUtils.getRotation(mContext));
+            inflateView(getRotation(mContext));
+        }
+
+        private int getRotation(Context context) {
+            Configuration config = context.getResources().getConfiguration();
+            if (config.smallestScreenWidthDp >= 600) {
+                return ROTATION_NONE;
+            }
+
+            return RotationUtils.getRotation(context);
         }
 
         private final Runnable mUpdateLayoutRunnable = new Runnable() {
             @Override
             public void run() {
                 if (mLayout != null && mLayout.getParent() != null) {
-                    mLayout.setLayoutParams(getRequestLayoutParams(RotationUtils.getRotation(mContext)));
+                    mLayout.setLayoutParams(getRequestLayoutParams(getRotation(mContext)));
                 }
             }
         };
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
index f4ce77a..3346935 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
@@ -34,7 +34,6 @@
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.drawable.Icon;
-import android.media.ExifInterface;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Build;
@@ -52,10 +51,13 @@
 import android.text.format.DateUtils;
 import android.util.Log;
 
+import androidx.exifinterface.media.ExifInterface;
+
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
 import com.android.systemui.R;
 import com.android.systemui.SystemUIFactory;
+import com.android.systemui.screenshot.ScreenshotController.SavedImageData.ShareTransition;
 
 import java.io.File;
 import java.io.IOException;
@@ -74,11 +76,12 @@
 import java.util.Random;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
+import java.util.function.Supplier;
 
 /**
  * An AsyncTask that saves an image to the media store in the background.
  */
-class  SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
+class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
     private static final String TAG = logTag(SaveImageInBackgroundTask.class);
 
     private static final String SCREENSHOT_FILE_NAME_TEMPLATE = "Screenshot_%s.png";
@@ -95,12 +98,15 @@
     private final String mScreenshotId;
     private final boolean mSmartActionsEnabled;
     private final Random mRandom = new Random();
+    private final Supplier<ShareTransition> mSharedElementTransition;
 
     SaveImageInBackgroundTask(Context context, ScreenshotSmartActions screenshotSmartActions,
-            ScreenshotController.SaveImageInBackgroundData data) {
+            ScreenshotController.SaveImageInBackgroundData data,
+            Supplier<ShareTransition> sharedElementTransition) {
         mContext = context;
         mScreenshotSmartActions = screenshotSmartActions;
         mImageData = new ScreenshotController.SavedImageData();
+        mSharedElementTransition = sharedElementTransition;
 
         // Prepare all the output metadata
         mParams = data;
@@ -135,7 +141,6 @@
 
         ContentResolver resolver = mContext.getContentResolver();
         Bitmap image = mParams.image;
-        Resources r = mContext.getResources();
 
         try {
             // Save the screenshot to the MediaStore
@@ -233,7 +238,7 @@
 
             mImageData.uri = uri;
             mImageData.smartActions = smartActions;
-            mImageData.shareAction = createShareAction(mContext, mContext.getResources(), uri);
+            mImageData.shareTransition = createShareAction(mContext, mContext.getResources(), uri);
             mImageData.editAction = createEditAction(mContext, mContext.getResources(), uri);
             mImageData.deleteAction = createDeleteAction(mContext, mContext.getResources(), uri);
 
@@ -284,61 +289,68 @@
         mParams.clearImage();
     }
 
+    /**
+     * Assumes that the action intent is sent immediately after being supplied.
+     */
     @VisibleForTesting
-    Notification.Action createShareAction(Context context, Resources r, Uri uri) {
-        // Note: Both the share and edit actions are proxied through ActionProxyReceiver in
-        // order to do some common work like dismissing the keyguard and sending
-        // closeSystemWindows
+    Supplier<ShareTransition> createShareAction(Context context, Resources r, Uri uri) {
+        return () -> {
+            ShareTransition transition = mSharedElementTransition.get();
 
-        // Create a share intent, this will always go through the chooser activity first
-        // which should not trigger auto-enter PiP
-        String subjectDate = DateFormat.getDateTimeInstance().format(new Date(mImageTime));
-        String subject = String.format(SCREENSHOT_SHARE_SUBJECT_TEMPLATE, subjectDate);
-        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
-        sharingIntent.setType("image/png");
-        sharingIntent.putExtra(Intent.EXTRA_STREAM, uri);
-        // 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[]{ClipDescription.MIMETYPE_TEXT_PLAIN}),
-                new ClipData.Item(uri));
-        sharingIntent.setClipData(clipdata);
-        sharingIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
-        sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            // Note: Both the share and edit actions are proxied through ActionProxyReceiver in
+            // order to do some common work like dismissing the keyguard and sending
+            // closeSystemWindows
 
-        // Make sure pending intents for the system user are still unique across users
-        // by setting the (otherwise unused) request code to the current user id.
-        int requestCode = context.getUserId();
+            // Create a share intent, this will always go through the chooser activity first
+            // which should not trigger auto-enter PiP
+            String subjectDate = DateFormat.getDateTimeInstance().format(new Date(mImageTime));
+            String subject = String.format(SCREENSHOT_SHARE_SUBJECT_TEMPLATE, subjectDate);
+            Intent sharingIntent = new Intent(Intent.ACTION_SEND);
+            sharingIntent.setType("image/png");
+            sharingIntent.putExtra(Intent.EXTRA_STREAM, uri);
+            // 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[]{ClipDescription.MIMETYPE_TEXT_PLAIN}),
+                    new ClipData.Item(uri));
+            sharingIntent.setClipData(clipdata);
+            sharingIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
+            sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 
-        Intent sharingChooserIntent =
-                Intent.createChooser(sharingIntent, null)
-                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK)
-                        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            // Make sure pending intents for the system user are still unique across users
+            // by setting the (otherwise unused) request code to the current user id.
+            int requestCode = context.getUserId();
 
-        // cancel current pending intent (if any) since clipData isn't used for matching
-        PendingIntent pendingIntent = PendingIntent.getActivityAsUser(
-                context, 0, sharingChooserIntent,
-                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
-                null, UserHandle.CURRENT);
+            Intent sharingChooserIntent = Intent.createChooser(sharingIntent, null)
+                    .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK)
+                    .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 
-        // Create a share action for the notification
-        PendingIntent shareAction = PendingIntent.getBroadcastAsUser(context, requestCode,
-                new Intent(context, ActionProxyReceiver.class)
-                        .putExtra(ScreenshotController.EXTRA_ACTION_INTENT, pendingIntent)
-                        .putExtra(ScreenshotController.EXTRA_DISALLOW_ENTER_PIP, true)
-                        .putExtra(ScreenshotController.EXTRA_ID, mScreenshotId)
-                        .putExtra(ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED,
-                                mSmartActionsEnabled)
-                        .setAction(Intent.ACTION_SEND)
-                        .addFlags(Intent.FLAG_RECEIVER_FOREGROUND),
-                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
-                UserHandle.SYSTEM);
+            // cancel current pending intent (if any) since clipData isn't used for matching
+            PendingIntent pendingIntent = PendingIntent.getActivityAsUser(
+                    context, 0, sharingChooserIntent,
+                    PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                    transition.bundle, UserHandle.CURRENT);
 
-        Notification.Action.Builder shareActionBuilder = new Notification.Action.Builder(
-                Icon.createWithResource(r, R.drawable.ic_screenshot_share),
-                r.getString(com.android.internal.R.string.share), shareAction);
+            // Create a share action for the notification
+            PendingIntent shareAction = PendingIntent.getBroadcastAsUser(context, requestCode,
+                    new Intent(context, ActionProxyReceiver.class)
+                            .putExtra(ScreenshotController.EXTRA_ACTION_INTENT, pendingIntent)
+                            .putExtra(ScreenshotController.EXTRA_DISALLOW_ENTER_PIP, true)
+                            .putExtra(ScreenshotController.EXTRA_ID, mScreenshotId)
+                            .putExtra(ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED,
+                                    mSmartActionsEnabled)
+                            .setAction(Intent.ACTION_SEND)
+                            .addFlags(Intent.FLAG_RECEIVER_FOREGROUND),
+                    PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                    UserHandle.SYSTEM);
 
-        return shareActionBuilder.build();
+            Notification.Action.Builder shareActionBuilder = new Notification.Action.Builder(
+                    Icon.createWithResource(r, R.drawable.ic_screenshot_share),
+                    r.getString(com.android.internal.R.string.share), shareAction);
+
+            transition.shareAction = shareActionBuilder.build();
+            return transition;
+        };
     }
 
     @VisibleForTesting
@@ -354,8 +366,7 @@
         if (!TextUtils.isEmpty(editorPackage)) {
             editIntent.setComponent(ComponentName.unflattenFromString(editorPackage));
         }
-        editIntent.setType("image/png");
-        editIntent.setData(uri);
+        editIntent.setDataAndType(uri, "image/png");
         editIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
         editIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
         editIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
index 3f163d3..d2fe5d2 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
@@ -34,6 +34,9 @@
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.annotation.Nullable;
+import android.app.ActivityOptions;
+import android.app.ExitTransitionCoordinator;
+import android.app.ExitTransitionCoordinator.ExitTransitionCallbacks;
 import android.app.Notification;
 import android.content.ComponentName;
 import android.content.Context;
@@ -46,6 +49,7 @@
 import android.media.MediaActionSound;
 import android.net.Uri;
 import android.os.Binder;
+import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Looper;
@@ -54,6 +58,7 @@
 import android.provider.Settings;
 import android.util.DisplayMetrics;
 import android.util.Log;
+import android.util.Pair;
 import android.view.Display;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
@@ -67,15 +72,18 @@
 import android.view.accessibility.AccessibilityManager;
 import android.widget.Toast;
 
+import com.android.internal.app.ChooserActivity;
 import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
 import com.android.internal.logging.UiEventLogger;
 import com.android.internal.policy.PhoneWindow;
 import com.android.settingslib.applications.InterestingConfigChanges;
 import com.android.systemui.R;
+import com.android.systemui.screenshot.ScreenshotController.SavedImageData.ShareTransition;
 import com.android.systemui.util.DeviceConfigProxy;
 
 import java.util.List;
 import java.util.function.Consumer;
+import java.util.function.Supplier;
 
 import javax.inject.Inject;
 
@@ -103,17 +111,26 @@
      */
     static class SavedImageData {
         public Uri uri;
-        public Notification.Action shareAction;
+        public Supplier<ShareTransition> shareTransition;
         public Notification.Action editAction;
         public Notification.Action deleteAction;
         public List<Notification.Action> smartActions;
 
         /**
+         * POD for shared element transition to share sheet.
+         */
+        static class ShareTransition {
+            public Bundle bundle;
+            public Notification.Action shareAction;
+            public Runnable onCancelRunnable;
+        }
+
+        /**
          * Used to reset the return data on error
          */
         public void reset() {
             uri = null;
-            shareAction = null;
+            shareTransition = null;
             editAction = null;
             deleteAction = null;
             smartActions = null;
@@ -587,7 +604,8 @@
             mSaveInBgTask.setActionsReadyListener(this::logSuccessOnActionsReady);
         }
 
-        mSaveInBgTask = new SaveImageInBackgroundTask(mContext, mScreenshotSmartActions, data);
+        mSaveInBgTask = new SaveImageInBackgroundTask(mContext, mScreenshotSmartActions, data,
+                getShareTransitionSupplier());
         mSaveInBgTask.execute();
     }
 
@@ -638,6 +656,35 @@
     }
 
     /**
+     * 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.
+     */
+    private Supplier<ShareTransition> getShareTransitionSupplier() {
+        return () -> {
+            ExitTransitionCallbacks cb = new ExitTransitionCallbacks() {
+                @Override
+                public boolean isReturnTransitionAllowed() {
+                    return false;
+                }
+
+                @Override
+                public void onFinish() { }
+            };
+
+            Pair<ActivityOptions, ExitTransitionCoordinator> transition =
+                    ActivityOptions.startSharedElementAnimation(mWindow, cb, null,
+                            Pair.create(mScreenshotView.getScreenshotPreview(),
+                                    ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME));
+            transition.second.startExit();
+
+            ShareTransition supply = new ShareTransition();
+            supply.bundle = transition.first.toBundle();
+            supply.onCancelRunnable = () -> ActivityOptions.stopSharedElementAnimation(mWindow);
+            return supply;
+        };
+    }
+
+    /**
      * Logs success/failure of the screenshot saving task, and shows an error if it failed.
      */
     private void logSuccessOnActionsReady(ScreenshotController.SavedImageData imageData) {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
index 4ca3dcc..357702a 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
@@ -73,6 +73,7 @@
 
 import com.android.internal.logging.UiEventLogger;
 import com.android.systemui.R;
+import com.android.systemui.screenshot.ScreenshotController.SavedImageData.ShareTransition;
 import com.android.systemui.shared.system.QuickStepContract;
 
 import java.util.ArrayList;
@@ -104,6 +105,7 @@
     private static final long SCREENSHOT_DISMISS_Y_DURATION_MS = 350;
     private static final long SCREENSHOT_DISMISS_ALPHA_DURATION_MS = 183;
     private static final long SCREENSHOT_DISMISS_ALPHA_OFFSET_MS = 50; // delay before starting fade
+    private static final long SCREENSHOT_DISMISS_SHARE_OFFSET_MS = 300; // delay after share clicked
     private static final float SCREENSHOT_ACTIONS_START_SCALE_X = .7f;
     private static final float ROUNDED_CORNER_RADIUS = .05f;
     private static final int SWIPE_PADDING_DP = 12; // extra padding around views to allow swipe
@@ -138,6 +140,7 @@
     private UiEventLogger mUiEventLogger;
     private ScreenshotViewCallback mCallbacks;
     private Animator mDismissAnimation;
+    private boolean mIgnoreDismiss;
 
     private final ArrayList<ScreenshotActionChip> mSmartChips = new ArrayList<>();
     private PendingInteraction mPendingInteraction;
@@ -526,13 +529,31 @@
         });
         return animator;
     }
+    protected View getScreenshotPreview() {
+        return mScreenshotPreview;
+    }
 
     void setChipIntents(ScreenshotController.SavedImageData imageData) {
-        mShareChip.setPendingIntent(imageData.shareAction.actionIntent,
-                () -> {
-                    mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SHARE_TAPPED);
+        mShareChip.setOnClickListener(v -> {
+            ShareTransition transition = imageData.shareTransition.get();
+            try {
+                mIgnoreDismiss = true;
+                transition.shareAction.actionIntent.send();
+                mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SHARE_TAPPED);
+
+                // Ensures that we delay dismissing until transition has started.
+                postDelayed(() -> {
+                    mIgnoreDismiss = false;
                     animateDismissal();
-                });
+                }, SCREENSHOT_DISMISS_SHARE_OFFSET_MS);
+            } catch (PendingIntent.CanceledException e) {
+                mIgnoreDismiss = false;
+                if (transition.onCancelRunnable != null) {
+                    transition.onCancelRunnable.run();
+                }
+                Log.e(TAG, "Share intent cancelled", e);
+            }
+        });
         mEditChip.setPendingIntent(imageData.editAction.actionIntent,
                 () -> {
                     mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_EDIT_TAPPED);
@@ -589,6 +610,9 @@
     }
 
     private void animateDismissal(Animator dismissAnimation) {
+        if (mIgnoreDismiss) {
+            return;
+        }
         if (DEBUG_WINDOW) {
             Log.d(TAG, "removing OnComputeInternalInsetsListener");
         }
@@ -759,7 +783,7 @@
         }
 
         @Override
-        public boolean onTouch(View v, MotionEvent event) {
+        public boolean onTouch(View view, MotionEvent event) {
             boolean gestureResult = mGestureDetector.onTouchEvent(event);
             mCallbacks.onUserInteraction();
             if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
@@ -789,6 +813,10 @@
                         createSwipeReturnAnimation().start();
                     }
                     return true;
+                } else {
+                    if (view == mScreenshotPreview) {
+                        mScreenshotPreview.performClick();
+                    }
                 }
             }
             return gestureResult;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
index 4b6d66e..3c549f9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
@@ -485,7 +485,7 @@
                 }
             }
             row.showFeedbackIcon(mAssistantFeedbackController.showFeedbackIndicator(entry),
-                    mAssistantFeedbackController.getFeedbackImageResource(entry));
+                    mAssistantFeedbackController.getFeedbackResources(entry));
             row.setLastAudiblyAlertedMs(entry.getLastAudiblyAlertedMs());
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/AssistantFeedbackController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/AssistantFeedbackController.java
index a350c5d..0465ebf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/AssistantFeedbackController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/AssistantFeedbackController.java
@@ -27,6 +27,7 @@
 import android.os.Looper;
 import android.os.UserHandle;
 import android.provider.Settings;
+import android.util.Pair;
 
 import androidx.annotation.Nullable;
 
@@ -129,24 +130,28 @@
     }
 
     /**
-     * Get the feedback indicator image resource according to assistant's changes on this
-     * notification's rank or importance.
+     * Get the feedback indicator image and content description resources according to assistant's
+     * changes on this notification's rank or importance.
      *
      * @param entry Notification Entry to show feedback for
      */
-    public int getFeedbackImageResource(NotificationEntry entry) {
+    public Pair<Integer, Integer> getFeedbackResources(NotificationEntry entry) {
         int feedbackStatus = getFeedbackStatus(entry);
         switch (feedbackStatus) {
             case STATUS_ALERTED:
-                return R.drawable.ic_feedback_alerted;
+                return new Pair(R.drawable.ic_feedback_alerted,
+                        R.string.notification_feedback_indicator_alerted);
             case STATUS_SILENCED:
-                return R.drawable.ic_feedback_silenced;
+                return new Pair(R.drawable.ic_feedback_silenced,
+                        R.string.notification_feedback_indicator_silenced);
             case STATUS_PROMOTED:
-                return R.drawable.ic_feedback_uprank;
+                return new Pair(R.drawable.ic_feedback_uprank,
+                        R.string.notification_feedback_indicator_promoted);
             case STATUS_DEMOTED:
-                return R.drawable.ic_feedback_downrank;
+                return new Pair(R.drawable.ic_feedback_downrank,
+                        R.string.notification_feedback_indicator_demoted);
             default:
-                return 0;
+                return new Pair(0, 0);
         }
     }
 
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 11b829c..3c437d1 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
@@ -49,6 +49,7 @@
 import android.util.FloatProperty;
 import android.util.Log;
 import android.util.MathUtils;
+import android.util.Pair;
 import android.util.Property;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
@@ -1672,12 +1673,12 @@
         requestLayout();
     }
 
-    public void showFeedbackIcon(boolean show, int resId) {
+    public void showFeedbackIcon(boolean show, Pair<Integer, Integer> resIds) {
         if (mIsSummaryWithChildren) {
-            mChildrenContainer.showFeedbackIcon(show, resId);
+            mChildrenContainer.showFeedbackIcon(show, resIds);
         }
-        mPrivateLayout.showFeedbackIcon(show, resId);
-        mPublicLayout.showFeedbackIcon(show, resId);
+        mPrivateLayout.showFeedbackIcon(show, resIds);
+        mPublicLayout.showFeedbackIcon(show, resIds);
     }
 
     /** Sets the last time the notification being displayed audibly alerted the user. */
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 475f627..d2774df 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
@@ -33,6 +33,7 @@
 import android.util.ArrayMap;
 import android.util.AttributeSet;
 import android.util.Log;
+import android.util.Pair;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.NotificationHeaderView;
@@ -1586,15 +1587,15 @@
         return null;
     }
 
-    public void showFeedbackIcon(boolean show, int resId) {
+    public void showFeedbackIcon(boolean show, Pair<Integer, Integer> resIds) {
         if (mContractedChild != null) {
-            mContractedWrapper.showFeedbackIcon(show, resId);
+            mContractedWrapper.showFeedbackIcon(show, resIds);
         }
         if (mExpandedChild != null) {
-            mExpandedWrapper.showFeedbackIcon(show, resId);
+            mExpandedWrapper.showFeedbackIcon(show, resIds);
         }
         if (mHeadsUpChild != null) {
-            mHeadsUpWrapper.showFeedbackIcon(show, resId);
+            mHeadsUpWrapper.showFeedbackIcon(show, resIds);
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java
index 1034b1f..596aea0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java
@@ -17,6 +17,7 @@
 package com.android.systemui.statusbar.notification.row;
 
 import static android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE;
+import static android.view.HapticFeedbackConstants.CLOCK_TICK;
 
 import static com.android.systemui.SwipeHelper.SWIPED_FAR_ENOUGH_SIZE_FRACTION;
 
@@ -113,6 +114,8 @@
 
     private boolean mIsUserTouching;
 
+    private boolean mSnappingToDismiss;
+
     private final PeopleNotificationIdentifier mPeopleNotificationIdentifier;
 
     public NotificationMenuRow(Context context,
@@ -175,6 +178,11 @@
         return mSnapping;
     }
 
+    @VisibleForTesting
+    protected boolean isSnappingToDismiss() {
+        return mSnappingToDismiss;
+    }
+
     @Override
     public void setMenuClickListener(OnMenuEventListener listener) {
         mMenuListener = listener;
@@ -346,6 +354,14 @@
             mCheckForDrag = new CheckForDrag();
             mHandler.postDelayed(mCheckForDrag, SHOW_MENU_DELAY);
         }
+        if (canBeDismissed()) {
+            final float dismissThreshold = getDismissThreshold();
+            final boolean snappingToDismiss = delta < -dismissThreshold || delta > dismissThreshold;
+            if (mSnappingToDismiss != snappingToDismiss) {
+                getMenuView().performHapticFeedback(CLOCK_TICK);
+            }
+            mSnappingToDismiss = snappingToDismiss;
+        }
     }
 
     @VisibleForTesting
@@ -361,7 +377,8 @@
 
     @Override
     public void onTouchStart() {
-       beginDrag();
+        beginDrag();
+        mSnappingToDismiss = false;
     }
 
     @Override
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 152527f..28ee935 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
@@ -22,6 +22,7 @@
 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;
@@ -132,10 +133,13 @@
 
     /** Shows or hides feedback indicator */
     @Override
-    public void showFeedbackIcon(boolean show, int resId) {
+    public void showFeedbackIcon(boolean show, Pair<Integer, Integer> resIds) {
         mFeedbackIcon.setVisibility(show ? View.VISIBLE : View.GONE);
-        if (show && mFeedbackIcon instanceof ImageButton) {
-            ((ImageButton) mFeedbackIcon).setImageResource(resId);
+        if (show) {
+            if (mFeedbackIcon instanceof ImageButton) {
+                ((ImageButton) mFeedbackIcon).setImageResource(resIds.first);
+            }
+            mFeedbackIcon.setContentDescription(mView.getContext().getString(resIds.second));
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java
index 04cbe87c..7b5c5f6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java
@@ -29,6 +29,7 @@
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
+import android.util.Pair;
 import android.view.ContextThemeWrapper;
 import android.view.NotificationHeaderView;
 import android.view.View;
@@ -103,7 +104,7 @@
     /**
      * Shows or hides feedback icon.
      */
-    public void showFeedbackIcon(boolean show, int resId) {
+    public void showFeedbackIcon(boolean show, Pair<Integer, Integer> resIds) {
     }
 
     public void onReinflated() {
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 a56ae7d..3833637 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
@@ -23,6 +23,7 @@
 import android.graphics.drawable.ColorDrawable;
 import android.service.notification.StatusBarNotification;
 import android.util.AttributeSet;
+import android.util.Pair;
 import android.view.LayoutInflater;
 import android.view.NotificationHeaderView;
 import android.view.View;
@@ -1300,12 +1301,12 @@
     /**
      * Shows or hides feedback icon.
      */
-    public void showFeedbackIcon(boolean show, int resId) {
+    public void showFeedbackIcon(boolean show, Pair<Integer, Integer> resIds) {
         if (mNotificationHeaderWrapper != null) {
-            mNotificationHeaderWrapper.showFeedbackIcon(show, resId);
+            mNotificationHeaderWrapper.showFeedbackIcon(show, resIds);
         }
         if (mNotificationHeaderWrapperLowPriority != null) {
-            mNotificationHeaderWrapperLowPriority.showFeedbackIcon(show, resId);
+            mNotificationHeaderWrapperLowPriority.showFeedbackIcon(show, resIds);
         }
     }
 
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 f8e361f..ab96a6d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -1003,6 +1003,7 @@
     }
 
     private void updateThemeColors() {
+        if (mScrimBehind == null) return;
         int background = Utils.getColorAttr(mScrimBehind.getContext(),
                 android.R.attr.colorBackgroundFloating).getDefaultColor();
         int accent = Utils.getColorAccent(mScrimBehind.getContext()).getDefaultColor();
diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
index a287e57..d9f4744 100644
--- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
@@ -267,6 +267,12 @@
         ColorUtils.RGBToHSL(Color.red(color), Color.green(color), Color.blue(color), hslMain);
         hslMain[0] /= 360f;
 
+        // To close to white or black, let's use the default system theme instead of
+        // applying a colorized one.
+        if (hslMain[2] < 0.05 || hslMain[2] > 0.95) {
+            return Color.TRANSPARENT;
+        }
+
         float minDistance = Float.MAX_VALUE;
         int closestColor = Color.TRANSPARENT;
         for (int candidate: candidates) {
@@ -294,7 +300,7 @@
         final String overlayPackageJson = mSecureSettings.getStringForUser(
                 Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES,
                 currentUser);
-        if (DEBUG) Log.d(TAG, "updateThemeOverlays: " + overlayPackageJson);
+        if (DEBUG) Log.d(TAG, "updateThemeOverlays. Setting: " + overlayPackageJson);
         boolean hasSystemPalette = false;
         boolean hasAccentColor = false;
         final Map<String, String> categoryToPackage = new ArrayMap<>();
@@ -343,6 +349,10 @@
         while (colorString.length() < 6) {
             colorString = "0" + colorString;
         }
+        // Remove alpha component
+        if (colorString.length() > 6) {
+            colorString = colorString.substring(colorString.length() - 6);
+        }
         return colorString;
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/RotationUtils.java b/packages/SystemUI/src/com/android/systemui/util/leak/RotationUtils.java
index 11c72c4..e44981e 100644
--- a/packages/SystemUI/src/com/android/systemui/util/leak/RotationUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/util/leak/RotationUtils.java
@@ -15,7 +15,6 @@
 package com.android.systemui.util.leak;
 
 import android.content.Context;
-import android.content.res.Configuration;
 import android.view.Surface;
 
 public class RotationUtils {
@@ -26,30 +25,26 @@
     public static final int ROTATION_UPSIDE_DOWN = 3;
 
     public static int getRotation(Context context) {
-        Configuration config = context.getResources().getConfiguration();
         int rot = context.getDisplay().getRotation();
-        if (config.smallestScreenWidthDp < 600) {
-            if (rot == Surface.ROTATION_90) {
-                return ROTATION_LANDSCAPE;
-            } else if (rot == Surface.ROTATION_270) {
-                return ROTATION_SEASCAPE;
-            }
+        if (rot == Surface.ROTATION_90) {
+            return ROTATION_LANDSCAPE;
+        } else if (rot == Surface.ROTATION_270) {
+            return ROTATION_SEASCAPE;
+        } else {
+            return ROTATION_NONE;
         }
-        return ROTATION_NONE;
     }
 
     public static int getExactRotation(Context context) {
-        Configuration config = context.getResources().getConfiguration();
         int rot = context.getDisplay().getRotation();
-        if (config.smallestScreenWidthDp < 600) {
-            if (rot == Surface.ROTATION_90) {
-                return ROTATION_LANDSCAPE;
-            } else if (rot == Surface.ROTATION_270) {
-                return ROTATION_SEASCAPE;
-            } else if (rot == Surface.ROTATION_180) {
-                return ROTATION_UPSIDE_DOWN;
-            }
+        if (rot == Surface.ROTATION_90) {
+            return ROTATION_LANDSCAPE;
+        } else if (rot == Surface.ROTATION_270) {
+            return ROTATION_SEASCAPE;
+        } else if (rot == Surface.ROTATION_180) {
+            return ROTATION_UPSIDE_DOWN;
+        } else {
+            return ROTATION_NONE;
         }
-        return ROTATION_NONE;
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 735338f..df54eab 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -259,6 +259,7 @@
                 | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                 | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                 | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
+        mWindow.addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY);
         mWindow.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);
         mWindow.setWindowAnimations(com.android.internal.R.style.Animation_Toast);
         WindowManager.LayoutParams lp = mWindow.getAttributes();
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 2374b82..6759c90 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsTest.java
@@ -43,6 +43,7 @@
 
 import com.android.systemui.SystemUIFactory;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.screenshot.ScreenshotController.SavedImageData.ShareTransition;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -175,10 +176,11 @@
         data.finisher = null;
         data.mActionsReadyListener = null;
         SaveImageInBackgroundTask task =
-                new SaveImageInBackgroundTask(mContext, mScreenshotSmartActions, data);
+                new SaveImageInBackgroundTask(mContext, mScreenshotSmartActions, data,
+                        ShareTransition::new);
 
         Notification.Action shareAction = task.createShareAction(mContext, mContext.getResources(),
-                Uri.parse("Screenshot_123.png"));
+                Uri.parse("Screenshot_123.png")).get().shareAction;
 
         Intent intent = shareAction.actionIntent.getIntent();
         assertNotNull(intent);
@@ -202,7 +204,8 @@
         data.finisher = null;
         data.mActionsReadyListener = null;
         SaveImageInBackgroundTask task =
-                new SaveImageInBackgroundTask(mContext, mScreenshotSmartActions, data);
+                new SaveImageInBackgroundTask(mContext, mScreenshotSmartActions, data,
+                        ShareTransition::new);
 
         Notification.Action editAction = task.createEditAction(mContext, mContext.getResources(),
                 Uri.parse("Screenshot_123.png"));
@@ -229,7 +232,8 @@
         data.finisher = null;
         data.mActionsReadyListener = null;
         SaveImageInBackgroundTask task =
-                new SaveImageInBackgroundTask(mContext, mScreenshotSmartActions, data);
+                new SaveImageInBackgroundTask(mContext, mScreenshotSmartActions, data,
+                        ShareTransition::new);
 
         Notification.Action deleteAction = task.createDeleteAction(mContext,
                 mContext.getResources(),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/AssistantFeedbackControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/AssistantFeedbackControllerTest.java
index 3f1cf83..d131dce 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/AssistantFeedbackControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/AssistantFeedbackControllerTest.java
@@ -41,6 +41,7 @@
 import android.service.notification.StatusBarNotification;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
+import android.util.Pair;
 
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -120,9 +121,9 @@
     }
 
     @Test
-    public void testGetFeedbackImageResource_settingDisabled() {
+    public void testGetFeedbackResources_settingDisabled() {
         switchSetting(OFF);
-        Assert.assertEquals(0, mAssistantFeedbackController.getFeedbackImageResource(
+        Assert.assertEquals(new Pair(0, 0), mAssistantFeedbackController.getFeedbackResources(
                 getEntry(IMPORTANCE_DEFAULT, IMPORTANCE_DEFAULT, RANKING_UNCHANGED)));
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
index ca982a6..2e0827f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
@@ -39,10 +39,12 @@
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
+import android.util.Pair;
 import android.view.View;
 
 import androidx.test.filters.SmallTest;
 
+import com.android.internal.R;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -210,7 +212,7 @@
         // public notification is custom layout - no header
         mGroupRow.setSensitive(true, true);
         mGroupRow.setOnFeedbackClickListener(null);
-        mGroupRow.showFeedbackIcon(false, 0);
+        mGroupRow.showFeedbackIcon(false, null);
     }
 
     @Test
@@ -224,12 +226,13 @@
         mGroupRow.setChildrenContainer(mockContainer);
 
         final boolean show = true;
-        final int resId = 1;
-        mGroupRow.showFeedbackIcon(show, resId);
+        final Pair<Integer, Integer> resIds = new Pair(R.drawable.ic_feedback_alerted,
+                R.string.notification_feedback_indicator_alerted);
+        mGroupRow.showFeedbackIcon(show, resIds);
 
-        verify(mockContainer, times(1)).showFeedbackIcon(show, resId);
-        verify(privateLayout, times(1)).showFeedbackIcon(show, resId);
-        verify(publicLayout, times(1)).showFeedbackIcon(show, resId);
+        verify(mockContainer, times(1)).showFeedbackIcon(show, resIds);
+        verify(privateLayout, times(1)).showFeedbackIcon(show, resIds);
+        verify(publicLayout, times(1)).showFeedbackIcon(show, resIds);
     }
 
     @Test
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 377a69d..4183508 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
@@ -25,6 +25,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.util.Pair;
 import android.view.NotificationHeaderView;
 import android.view.View;
 import android.view.ViewPropertyAnimator;
@@ -33,6 +34,7 @@
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.internal.R;
 import com.android.internal.widget.NotificationExpandButton;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.media.dialog.MediaOutputDialogFactory;
@@ -95,7 +97,8 @@
         mView.setExpandedChild(mockExpanded);
         mView.setHeadsUpChild(mockHeadsUp);
 
-        mView.showFeedbackIcon(true, 1);
+        mView.showFeedbackIcon(true, new Pair(R.drawable.ic_feedback_alerted,
+                R.string.notification_feedback_indicator_alerted));
 
         verify(mockContracted, times(1)).setVisibility(View.VISIBLE);
         verify(mockExpanded, times(1)).setVisibility(View.VISIBLE);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java
index c426c87..e3516f97 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java
@@ -14,8 +14,9 @@
 
 package com.android.systemui.statusbar.notification.row;
 
-import static android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE;
 import static android.provider.Settings.Global.SHOW_NEW_NOTIF_DISMISS;
+import static android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE;
+import static android.view.HapticFeedbackConstants.CLOCK_TICK;
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
@@ -33,6 +34,7 @@
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
 import android.testing.ViewUtils;
+import android.view.View;
 import android.view.ViewGroup;
 
 import androidx.test.filters.SmallTest;
@@ -54,12 +56,14 @@
 public class NotificationMenuRowTest extends LeakCheckedTest {
 
     private ExpandableNotificationRow mRow;
+    private View mView;
     private PeopleNotificationIdentifier mPeopleNotificationIdentifier;
 
     @Before
     public void setup() {
         injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
         mRow = mock(ExpandableNotificationRow.class);
+        mView = mock(View.class);
         mPeopleNotificationIdentifier = mock(PeopleNotificationIdentifier.class);
         NotificationEntry entry = new NotificationEntryBuilder().build();
         when(mRow.getEntry()).thenReturn(entry);
@@ -409,4 +413,61 @@
         row.setMenuAlpha(0.5f);
         assertTrue("when alpha is .5, menu is visible", row.isMenuVisible());
     }
+
+    @Test
+    public void testOnTouchMove() {
+        NotificationMenuRow row = Mockito.spy(
+                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
+        row.createMenu(mRow, null);
+        doReturn(50f).when(row).getDismissThreshold();
+        doReturn(true).when(row).canBeDismissed();
+        doReturn(mView).when(row).getMenuView();
+        row.onTouchMove(30f);
+
+        assertFalse("When moving not farther than threshold, menu is not snapping to dismiss",
+                row.isSnappingToDismiss());
+        verify(mView, times(0)).performHapticFeedback(CLOCK_TICK);
+
+        row.onTouchMove(60f);
+
+        assertTrue("When moving farther than threshold, menu is snapping to dismiss",
+                row.isSnappingToDismiss());
+        verify(mView, times(1)).performHapticFeedback(CLOCK_TICK);
+
+        row.onTouchMove(70f);
+
+        assertTrue("When moving farther than threshold, menu is snapping to dismiss",
+                row.isSnappingToDismiss());
+        verify(mView, times(1)).performHapticFeedback(CLOCK_TICK);
+
+        row.onTouchMove(30f);
+
+        assertFalse("When moving not farther than threshold, menu is not snapping to dismiss",
+                row.isSnappingToDismiss());
+        verify(mView, times(2)).performHapticFeedback(CLOCK_TICK);
+
+        row.onTouchMove(-30f);
+
+        assertFalse("When moving not farther than threshold, menu is not snapping to dismiss",
+                row.isSnappingToDismiss());
+        verify(mView, times(2)).performHapticFeedback(CLOCK_TICK);
+
+        row.onTouchMove(-60f);
+
+        assertTrue("When moving farther than threshold, menu is snapping to dismiss",
+                row.isSnappingToDismiss());
+        verify(mView, times(3)).performHapticFeedback(CLOCK_TICK);
+
+        row.onTouchMove(-70f);
+
+        assertTrue("When moving farther than threshold, menu is snapping to dismiss",
+                row.isSnappingToDismiss());
+        verify(mView, times(3)).performHapticFeedback(CLOCK_TICK);
+
+        row.onTouchMove(-30f);
+
+        assertFalse("When moving not farther than threshold, menu is not snapping to dismiss",
+                row.isSnappingToDismiss());
+        verify(mView, times(4)).performHapticFeedback(CLOCK_TICK);
+    }
 }
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 c826cbc..d33fac0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java
@@ -107,7 +107,7 @@
                 eq(UserHandle.USER_ALL));
         verify(mDumpManager).registerDumpable(any(), any());
 
-        List<Integer> colorList = List.of(Color.RED, Color.BLUE, 0x0CCCCC, 0x000111);
+        List<Integer> colorList = List.of(Color.RED, Color.BLUE, 0x0CCCCC, 0x000CCC);
         when(mThemeOverlayApplier.getAvailableAccentColors()).thenReturn(colorList);
         when(mThemeOverlayApplier.getAvailableSystemColors()).thenReturn(colorList);
     }
@@ -136,11 +136,9 @@
 
         // Assert that we received the colors that we were expecting
         assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_SYSTEM_PALETTE))
-                .isEqualTo(MONET_SYSTEM_PALETTE_PACKAGE
-                        + Integer.toHexString(Color.RED).toUpperCase());
+                .isEqualTo(MONET_SYSTEM_PALETTE_PACKAGE + "FF0000");
         assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_ACCENT_COLOR))
-                .isEqualTo(MONET_ACCENT_COLOR_PACKAGE
-                        + Integer.toHexString(Color.BLUE).toUpperCase());
+                .isEqualTo(MONET_ACCENT_COLOR_PACKAGE + "0000FF");
 
         // Should not ask again if changed to same value
         mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM);
@@ -148,10 +146,36 @@
     }
 
     @Test
+    public void onWallpaperColorsChanged_whiteTheme() {
+        WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.WHITE),
+                Color.valueOf(Color.BLUE), null);
+        mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM);
+        ArgumentCaptor<Map<String, String>> themeOverlays = ArgumentCaptor.forClass(Map.class);
+
+        verify(mThemeOverlayApplier).applyCurrentUserOverlays(themeOverlays.capture(), any());
+
+        // Assert that we received the colors that we were expecting
+        assertThat(themeOverlays.getValue().containsKey(OVERLAY_CATEGORY_SYSTEM_PALETTE)).isFalse();
+    }
+
+    @Test
+    public void onWallpaperColorsChanged_blackTheme() {
+        WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.BLACK),
+                Color.valueOf(Color.BLUE), null);
+        mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM);
+        ArgumentCaptor<Map<String, String>> themeOverlays = ArgumentCaptor.forClass(Map.class);
+
+        verify(mThemeOverlayApplier).applyCurrentUserOverlays(themeOverlays.capture(), any());
+
+        // Assert that we received the colors that we were expecting
+        assertThat(themeOverlays.getValue().containsKey(OVERLAY_CATEGORY_SYSTEM_PALETTE)).isFalse();
+    }
+
+    @Test
     public void onWallpaperColorsChanged_addsLeadingZerosToColors() {
         // Should ask for a new theme when wallpaper colors change
         WallpaperColors mainColors = new WallpaperColors(Color.valueOf(0x0CCCCC),
-                Color.valueOf(0x000111), null);
+                Color.valueOf(0x000CCC), null);
         mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM);
         ArgumentCaptor<Map<String, String>> themeOverlays = ArgumentCaptor.forClass(Map.class);
 
@@ -161,7 +185,7 @@
         assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_SYSTEM_PALETTE))
                 .isEqualTo(MONET_SYSTEM_PALETTE_PACKAGE + "0CCCCC");
         assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_ACCENT_COLOR))
-                .isEqualTo(MONET_ACCENT_COLOR_PACKAGE + "000111");
+                .isEqualTo(MONET_ACCENT_COLOR_PACKAGE + "000CCC");
     }
 
     @Test
diff --git a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml
index 06cb33b..cd53227 100644
--- a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml
+++ b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml
@@ -54,4 +54,6 @@
          show. -->
     <bool name="config_navBarAlwaysShowOnSideEdgeGesture">true</bool>
 
+    <!-- If true, attach the navigation bar to the app during app transition -->
+    <bool name="config_attachNavBarToAppDuringTransition">true</bool>
 </resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml
index d5991f3..88cb74d79 100644
--- a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml
+++ b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml
@@ -54,4 +54,6 @@
          show. -->
     <bool name="config_navBarAlwaysShowOnSideEdgeGesture">true</bool>
 
+    <!-- If true, attach the navigation bar to the app during app transition -->
+    <bool name="config_attachNavBarToAppDuringTransition">true</bool>
 </resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml
index ff507ee..70c41d0 100644
--- a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml
+++ b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml
@@ -54,4 +54,6 @@
          show. -->
     <bool name="config_navBarAlwaysShowOnSideEdgeGesture">true</bool>
 
+    <!-- If true, attach the navigation bar to the app during app transition -->
+    <bool name="config_attachNavBarToAppDuringTransition">true</bool>
 </resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml
index 378756a..de26394 100644
--- a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml
+++ b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml
@@ -54,4 +54,6 @@
          show. -->
     <bool name="config_navBarAlwaysShowOnSideEdgeGesture">true</bool>
 
+    <!-- If true, attach the navigation bar to the app during app transition -->
+    <bool name="config_attachNavBarToAppDuringTransition">true</bool>
 </resources>
diff --git a/services/accessibility/java/com/android/server/accessibility/ActionReplacingCallback.java b/services/accessibility/java/com/android/server/accessibility/ActionReplacingCallback.java
index bafb641..a2c7e4f 100644
--- a/services/accessibility/java/com/android/server/accessibility/ActionReplacingCallback.java
+++ b/services/accessibility/java/com/android/server/accessibility/ActionReplacingCallback.java
@@ -40,10 +40,14 @@
     private final IAccessibilityInteractionConnectionCallback mServiceCallback;
     private final IAccessibilityInteractionConnection mConnectionWithReplacementActions;
     private final int mInteractionId;
+    private final int mNodeWithReplacementActionsInteractionId;
     private final Object mLock = new Object();
 
     @GuardedBy("mLock")
-    List<AccessibilityNodeInfo> mNodesWithReplacementActions;
+    private boolean mRequestForNodeWithReplacementActionFailed;
+
+    @GuardedBy("mLock")
+    AccessibilityNodeInfo mNodeWithReplacementActions;
 
     @GuardedBy("mLock")
     List<AccessibilityNodeInfo> mNodesFromOriginalWindow;
@@ -51,18 +55,8 @@
     @GuardedBy("mLock")
     AccessibilityNodeInfo mNodeFromOriginalWindow;
 
-    // Keep track of whether or not we've been called back for a single node
     @GuardedBy("mLock")
-    boolean mSingleNodeCallbackHappened;
-
-    // Keep track of whether or not we've been called back for multiple node
-    @GuardedBy("mLock")
-    boolean mMultiNodeCallbackHappened;
-
-    // We shouldn't get any more callbacks after we've called back the original service, but
-    // keep track to make sure we catch such strange things
-    @GuardedBy("mLock")
-    boolean mDone;
+    List<AccessibilityNodeInfo> mPrefetchedNodesFromOriginalWindow;
 
     public ActionReplacingCallback(IAccessibilityInteractionConnectionCallback serviceCallback,
             IAccessibilityInteractionConnection connectionWithReplacementActions,
@@ -70,19 +64,20 @@
         mServiceCallback = serviceCallback;
         mConnectionWithReplacementActions = connectionWithReplacementActions;
         mInteractionId = interactionId;
+        mNodeWithReplacementActionsInteractionId = interactionId + 1;
 
         // Request the root node of the replacing window
         final long identityToken = Binder.clearCallingIdentity();
         try {
             mConnectionWithReplacementActions.findAccessibilityNodeInfoByAccessibilityId(
-                    AccessibilityNodeInfo.ROOT_NODE_ID, null, interactionId + 1, this, 0,
+                    AccessibilityNodeInfo.ROOT_NODE_ID, null,
+                    mNodeWithReplacementActionsInteractionId, this, 0,
                     interrogatingPid, interrogatingTid, null, null);
         } catch (RemoteException re) {
             if (DEBUG) {
                 Slog.e(LOG_TAG, "Error calling findAccessibilityNodeInfoByAccessibilityId()");
             }
-            // Pretend we already got a (null) list of replacement nodes
-            mMultiNodeCallbackHappened = true;
+            mRequestForNodeWithReplacementActionFailed = true;
         } finally {
             Binder.restoreCallingIdentity(identityToken);
         }
@@ -90,46 +85,73 @@
 
     @Override
     public void setFindAccessibilityNodeInfoResult(AccessibilityNodeInfo info, int interactionId) {
-        boolean readyForCallback;
-        synchronized(mLock) {
+        synchronized (mLock) {
             if (interactionId == mInteractionId) {
                 mNodeFromOriginalWindow = info;
+            } else if (interactionId == mNodeWithReplacementActionsInteractionId) {
+                mNodeWithReplacementActions = info;
             } else {
                 Slog.e(LOG_TAG, "Callback with unexpected interactionId");
                 return;
             }
-
-            mSingleNodeCallbackHappened = true;
-            readyForCallback = mMultiNodeCallbackHappened;
         }
-        if (readyForCallback) {
-            replaceInfoActionsAndCallService();
-        }
+        replaceInfoActionsAndCallServiceIfReady();
     }
 
     @Override
     public void setFindAccessibilityNodeInfosResult(List<AccessibilityNodeInfo> infos,
             int interactionId) {
-        boolean callbackForSingleNode;
-        boolean callbackForMultipleNodes;
-        synchronized(mLock) {
+        synchronized (mLock) {
             if (interactionId == mInteractionId) {
                 mNodesFromOriginalWindow = infos;
-            } else if (interactionId == mInteractionId + 1) {
-                mNodesWithReplacementActions = infos;
+            } else if (interactionId == mNodeWithReplacementActionsInteractionId) {
+                setNodeWithReplacementActionsFromList(infos);
             } else {
                 Slog.e(LOG_TAG, "Callback with unexpected interactionId");
                 return;
             }
-            callbackForSingleNode = mSingleNodeCallbackHappened;
-            callbackForMultipleNodes = mMultiNodeCallbackHappened;
-            mMultiNodeCallbackHappened = true;
         }
-        if (callbackForSingleNode) {
+        replaceInfoActionsAndCallServiceIfReady();
+    }
+
+    @Override
+    public void setPrefetchAccessibilityNodeInfoResult(List<AccessibilityNodeInfo> infos,
+                                                       int interactionId)
+            throws RemoteException {
+        synchronized (mLock) {
+            if (interactionId == mInteractionId) {
+                mPrefetchedNodesFromOriginalWindow = infos;
+            }  else {
+                Slog.e(LOG_TAG, "Callback with unexpected interactionId");
+                return;
+            }
+        }
+        replaceInfoActionsAndCallServiceIfReady();
+    }
+
+    private void replaceInfoActionsAndCallServiceIfReady() {
+        boolean originalAndReplacementCallsHaveHappened = false;
+        synchronized (mLock) {
+            originalAndReplacementCallsHaveHappened = mNodeWithReplacementActions != null
+                    && (mNodeFromOriginalWindow != null
+                    || mNodesFromOriginalWindow != null
+                    || mPrefetchedNodesFromOriginalWindow != null);
+            originalAndReplacementCallsHaveHappened
+                    |= mRequestForNodeWithReplacementActionFailed;
+        }
+        if (originalAndReplacementCallsHaveHappened) {
             replaceInfoActionsAndCallService();
-        }
-        if (callbackForMultipleNodes) {
             replaceInfosActionsAndCallService();
+            replacePrefetchInfosActionsAndCallService();
+        }
+    }
+
+    private void setNodeWithReplacementActionsFromList(List<AccessibilityNodeInfo> infos) {
+        for (int i = 0; i < infos.size(); i++) {
+            AccessibilityNodeInfo info = infos.get(i);
+            if (info.getSourceNodeId() == AccessibilityNodeInfo.ROOT_NODE_ID) {
+                mNodeWithReplacementActions = info;
+            }
         }
     }
 
@@ -143,18 +165,10 @@
     private void replaceInfoActionsAndCallService() {
         final AccessibilityNodeInfo nodeToReturn;
         synchronized (mLock) {
-            if (mDone) {
-                if (DEBUG) {
-                    Slog.e(LOG_TAG, "Extra callback");
-                }
-                return;
-            }
             if (mNodeFromOriginalWindow != null) {
                 replaceActionsOnInfoLocked(mNodeFromOriginalWindow);
             }
-            recycleReplaceActionNodesLocked();
             nodeToReturn = mNodeFromOriginalWindow;
-            mDone = true;
         }
         try {
             mServiceCallback.setFindAccessibilityNodeInfoResult(nodeToReturn, mInteractionId);
@@ -168,21 +182,7 @@
     private void replaceInfosActionsAndCallService() {
         final List<AccessibilityNodeInfo> nodesToReturn;
         synchronized (mLock) {
-            if (mDone) {
-                if (DEBUG) {
-                    Slog.e(LOG_TAG, "Extra callback");
-                }
-                return;
-            }
-            if (mNodesFromOriginalWindow != null) {
-                for (int i = 0; i < mNodesFromOriginalWindow.size(); i++) {
-                    replaceActionsOnInfoLocked(mNodesFromOriginalWindow.get(i));
-                }
-            }
-            recycleReplaceActionNodesLocked();
-            nodesToReturn = (mNodesFromOriginalWindow == null)
-                    ? null : new ArrayList<>(mNodesFromOriginalWindow);
-            mDone = true;
+            nodesToReturn = replaceActionsLocked(mNodesFromOriginalWindow);
         }
         try {
             mServiceCallback.setFindAccessibilityNodeInfosResult(nodesToReturn, mInteractionId);
@@ -193,6 +193,31 @@
         }
     }
 
+    private void replacePrefetchInfosActionsAndCallService() {
+        final List<AccessibilityNodeInfo> nodesToReturn;
+        synchronized (mLock) {
+            nodesToReturn = replaceActionsLocked(mPrefetchedNodesFromOriginalWindow);
+        }
+        try {
+            mServiceCallback.setPrefetchAccessibilityNodeInfoResult(nodesToReturn, mInteractionId);
+        } catch (RemoteException re) {
+            if (DEBUG) {
+                Slog.e(LOG_TAG, "Failed to setFindAccessibilityNodeInfosResult");
+            }
+        }
+    }
+
+    @GuardedBy("mLock")
+    private List<AccessibilityNodeInfo> replaceActionsLocked(List<AccessibilityNodeInfo> infos) {
+        if (infos != null) {
+            for (int i = 0; i < infos.size(); i++) {
+                replaceActionsOnInfoLocked(infos.get(i));
+            }
+        }
+        return (infos == null)
+                ? null : new ArrayList<>(infos);
+    }
+
     @GuardedBy("mLock")
     private void replaceActionsOnInfoLocked(AccessibilityNodeInfo info) {
         info.removeAllActions();
@@ -204,40 +229,22 @@
         info.setDismissable(false);
         // We currently only replace actions for the root node
         if ((info.getSourceNodeId() == AccessibilityNodeInfo.ROOT_NODE_ID)
-                && mNodesWithReplacementActions != null) {
-            // This list should always contain a single node with the root ID
-            for (int i = 0; i < mNodesWithReplacementActions.size(); i++) {
-                AccessibilityNodeInfo nodeWithReplacementActions =
-                        mNodesWithReplacementActions.get(i);
-                if (nodeWithReplacementActions.getSourceNodeId()
-                        == AccessibilityNodeInfo.ROOT_NODE_ID) {
-                    List<AccessibilityAction> actions = nodeWithReplacementActions.getActionList();
-                    if (actions != null) {
-                        for (int j = 0; j < actions.size(); j++) {
-                            info.addAction(actions.get(j));
-                        }
-                        // The PIP needs to be able to take accessibility focus
-                        info.addAction(AccessibilityAction.ACTION_ACCESSIBILITY_FOCUS);
-                        info.addAction(AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
-                    }
-                    info.setClickable(nodeWithReplacementActions.isClickable());
-                    info.setFocusable(nodeWithReplacementActions.isFocusable());
-                    info.setContextClickable(nodeWithReplacementActions.isContextClickable());
-                    info.setScrollable(nodeWithReplacementActions.isScrollable());
-                    info.setLongClickable(nodeWithReplacementActions.isLongClickable());
-                    info.setDismissable(nodeWithReplacementActions.isDismissable());
+                && mNodeWithReplacementActions != null) {
+            List<AccessibilityAction> actions = mNodeWithReplacementActions.getActionList();
+            if (actions != null) {
+                for (int j = 0; j < actions.size(); j++) {
+                    info.addAction(actions.get(j));
                 }
+                // The PIP needs to be able to take accessibility focus
+                info.addAction(AccessibilityAction.ACTION_ACCESSIBILITY_FOCUS);
+                info.addAction(AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
             }
+            info.setClickable(mNodeWithReplacementActions.isClickable());
+            info.setFocusable(mNodeWithReplacementActions.isFocusable());
+            info.setContextClickable(mNodeWithReplacementActions.isContextClickable());
+            info.setScrollable(mNodeWithReplacementActions.isScrollable());
+            info.setLongClickable(mNodeWithReplacementActions.isLongClickable());
+            info.setDismissable(mNodeWithReplacementActions.isDismissable());
         }
     }
-
-    @GuardedBy("mLock")
-    private void recycleReplaceActionNodesLocked() {
-        if (mNodesWithReplacementActions == null) return;
-        for (int i = mNodesWithReplacementActions.size() - 1; i >= 0; i--) {
-            AccessibilityNodeInfo nodeWithReplacementAction = mNodesWithReplacementActions.get(i);
-            nodeWithReplacementAction.recycle();
-        }
-        mNodesWithReplacementActions = null;
-    }
 }
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index c7fd209..9d8901a 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -422,15 +422,12 @@
         @GuardedBy("mLock")
         private FillRequest mPendingFillRequest;
 
-        void newAutofillRequestLocked(boolean isInlineRequest) {
+        @Nullable Consumer<InlineSuggestionsRequest> newAutofillRequestLocked(ViewState viewState,
+                boolean isInlineRequest) {
             mPendingFillRequest = null;
             mWaitForInlineRequest = isInlineRequest;
             mPendingInlineSuggestionsRequest = null;
-        }
-
-        @NonNull Consumer<InlineSuggestionsRequest> newInlineRequestConsumerLocked(
-                ViewState viewState) {
-            return (inlineSuggestionsRequest) -> {
+            return isInlineRequest ? (inlineSuggestionsRequest) -> {
                 synchronized (mLock) {
                     if (!mWaitForInlineRequest || mPendingInlineSuggestionsRequest != null) {
                         return;
@@ -439,7 +436,7 @@
                     maybeRequestFillLocked();
                     viewState.resetState(ViewState.STATE_PENDING_CREATE_INLINE_REQUEST);
                 }
-            };
+            } : null;
         }
 
         void maybeRequestFillLocked() {
@@ -811,12 +808,32 @@
         // structure is taken. This causes only one fill request per burst of focus changes.
         cancelCurrentRequestLocked();
 
-        final Consumer<InlineSuggestionsRequest> inlineSuggestionsRequestConsumer =
-                mAssistReceiver.newInlineRequestConsumerLocked(viewState);
-        final boolean isInlineRequest = maybeRequestCreateInlineSuggestionsRequestLocked(
-                /* isAugmented= */ false, inlineSuggestionsRequestConsumer, viewState,
-                mCurrentViewId, flags);
-        mAssistReceiver.newAutofillRequestLocked(isInlineRequest);
+        // Only ask IME to create inline suggestions request if Autofill provider supports it and
+        // the render service is available except the autofill is triggered manually and the view
+        // is also not focused.
+        final RemoteInlineSuggestionRenderService remoteRenderService =
+                mService.getRemoteInlineSuggestionRenderServiceLocked();
+        if (mSessionFlags.mInlineSupportedByService
+                && remoteRenderService != null
+                && isViewFocusedLocked(flags)) {
+            Consumer<InlineSuggestionsRequest> inlineSuggestionsRequestConsumer =
+                    mAssistReceiver.newAutofillRequestLocked(viewState,
+                            /* isInlineRequest= */ true);
+            if (inlineSuggestionsRequestConsumer != null) {
+                final AutofillId focusedId = mCurrentViewId;
+                remoteRenderService.getInlineSuggestionsRendererInfo(
+                        new RemoteCallback((extras) -> {
+                            synchronized (mLock) {
+                                mInlineSessionController.onCreateInlineSuggestionsRequestLocked(
+                                        focusedId, inlineSuggestionsRequestConsumer, extras);
+                            }
+                        }, mHandler)
+                );
+                viewState.setState(ViewState.STATE_PENDING_CREATE_INLINE_REQUEST);
+            }
+        } else {
+            mAssistReceiver.newAutofillRequestLocked(viewState, /* isInlineRequest= */ false);
+        }
 
         // Now request the assist structure data.
         try {
@@ -836,60 +853,6 @@
         }
     }
 
-    @GuardedBy("mLock")
-    private boolean maybeRequestCreateInlineSuggestionsRequestLocked(boolean isAugmented,
-            @NonNull Consumer<InlineSuggestionsRequest> requestConsumer,
-            @NonNull ViewState viewState, @NonNull AutofillId focusedId, int flags) {
-        final RemoteInlineSuggestionRenderService remoteRenderService =
-                mService.getRemoteInlineSuggestionRenderServiceLocked();
-        if (remoteRenderService == null || !isViewFocusedLocked(flags)) {
-            return false;
-        }
-
-        // Standard:
-        // Only ask IME to create inline suggestions request if Autofill provider supports it
-        // and the render service is available except the autofill is triggered manually and the
-        // view is also not focused.
-        //
-        // Augmented:
-        // When the inline suggestion render service is available and the view is focused, there
-        // are 3 cases when augmented autofill should ask IME for inline suggestion request,
-        // because standard autofill flow didn't:
-        // 1. the field is augmented autofill only (when standard autofill provider is None or
-        // when it returns null response)
-        // 2. standard autofill provider doesn't support inline suggestion
-        // 3. we re-entered the autofill session and standard autofill was not re-triggered,
-        // this is recognized by seeing mExpiredResponse == true
-        if ((!isAugmented && mSessionFlags.mInlineSupportedByService)
-                || (isAugmented && (mSessionFlags.mAugmentedAutofillOnly
-                || !mSessionFlags.mInlineSupportedByService
-                || mSessionFlags.mExpiredResponse))) {
-            if (sDebug) {
-                Slog.d(TAG, "Create inline request for "
-                        + (isAugmented ? "augmented" : "standard") + " autofill");
-            }
-            requestCreateInlineSuggestionsRequestLocked(remoteRenderService, focusedId,
-                    requestConsumer);
-            viewState.setState(ViewState.STATE_PENDING_CREATE_INLINE_REQUEST);
-            return true;
-        }
-
-        return false;
-    }
-
-    private void requestCreateInlineSuggestionsRequestLocked(
-            @NonNull RemoteInlineSuggestionRenderService remoteRenderService,
-            @NonNull AutofillId focusedId,
-            @NonNull Consumer<InlineSuggestionsRequest> requestConsumer) {
-        remoteRenderService.getInlineSuggestionsRendererInfo(
-                new RemoteCallback((extras) -> {
-                    synchronized (mLock) {
-                        mInlineSessionController.onCreateInlineSuggestionsRequestLocked(
-                                focusedId, requestConsumer, extras);
-                    }
-                }, mHandler));
-    }
-
     Session(@NonNull AutofillManagerServiceImpl service, @NonNull AutoFillUI ui,
             @NonNull Context context, @NonNull Handler handler, int userId, @NonNull Object lock,
             int sessionId, int taskId, int uid, @NonNull IBinder activityToken,
@@ -2607,27 +2570,23 @@
     }
 
     /**
-     * Invokes either regular or augmented autofill process upon entering a view.
+     * Starts (if necessary) a new fill request upon entering a view.
      *
-     * <p> A new standard autofill request will be started in 2 scenarios:
+     * <p>A new request will be started in 2 scenarios:
      * <ol>
-     *   <li> If the user manually requested autofill.
-     *   <li> If the view is part of a new partition.
+     *   <li>If the user manually requested autofill.
+     *   <li>If the view is part of a new partition.
      * </ol>
-     * </p>
-     *
-     * <p> A new augmented autofill request will be started if the autofill id was marked as
-     * uninterested/unfillable by the standard service.
      *
      * @param id The id of the view that is entered.
      * @param viewState The view that is entered.
      * @param flags The flag that was passed by the AutofillManager.
      *
-     * @return {@code true} if either regular or augmented autofill is invoked.
+     * @return {@code true} if a new fill response is requested.
      */
     @GuardedBy("mLock")
-    private boolean maybeRequestFillOnViewEnteredLocked(@NonNull AutofillId id,
-            @NonNull ViewState viewState, boolean isSameViewEntered, int flags) {
+    private boolean requestNewFillResponseOnViewEnteredIfNecessaryLocked(@NonNull AutofillId id,
+            @NonNull ViewState viewState, int flags) {
         if ((flags & FLAG_MANUAL_REQUEST) != 0) {
             mSessionFlags.mAugmentedAutofillOnly = false;
             if (sDebug) Slog.d(TAG, "Re-starting session on view " + id + " and flags " + flags);
@@ -2635,24 +2594,7 @@
             return true;
         }
 
-        if (mAugmentedAutofillableIds != null && mAugmentedAutofillableIds.contains(id)) {
-            // Regular autofill handled the view and returned null response, but it can trigger
-            // augmented autofill.
-            if (!isSameViewEntered) {
-                if (sDebug) Slog.d(TAG, "trigger augmented autofill.");
-                triggerAugmentedAutofillLocked(flags);
-            } else {
-                if (sDebug) Slog.d(TAG, "skip augmented autofill for same view.");
-            }
-            return true;
-        } else if (mSessionFlags.mAugmentedAutofillOnly && isSameViewEntered) {
-            // Regular autofill is disabled.
-            if (sDebug) Slog.d(TAG, "skip augmented autofill for same view.");
-            return true;
-        }
-
-        // If it's not for augmented, then check if it should start a partition for
-        // regular autofill.
+        // If it's not, then check if it it should start a partition.
         if (shouldStartNewPartitionLocked(id)) {
             if (sDebug) {
                 Slog.d(TAG, "Starting partition or augmented request for view id " + id + ": "
@@ -2847,7 +2789,27 @@
                     return;
                 }
 
-                if (maybeRequestFillOnViewEnteredLocked(id, viewState, isSameViewEntered, flags)) {
+                if ((flags & FLAG_MANUAL_REQUEST) == 0) {
+                    // Not a manual request
+                    if (mAugmentedAutofillableIds != null && mAugmentedAutofillableIds.contains(
+                            id)) {
+                        // Regular autofill handled the view and returned null response, but it
+                        // triggered augmented autofill
+                        if (!isSameViewEntered) {
+                            if (sDebug) Slog.d(TAG, "trigger augmented autofill.");
+                            triggerAugmentedAutofillLocked(flags);
+                        } else {
+                            if (sDebug) Slog.d(TAG, "skip augmented autofill for same view.");
+                        }
+                        return;
+                    } else if (mSessionFlags.mAugmentedAutofillOnly && isSameViewEntered) {
+                        // Regular autofill is disabled.
+                        if (sDebug) Slog.d(TAG, "skip augmented autofill for same view.");
+                        return;
+                    }
+                }
+
+                if (requestNewFillResponseOnViewEnteredIfNecessaryLocked(id, viewState, flags)) {
                     return;
                 }
 
@@ -3445,12 +3407,34 @@
                     }
                 };
 
-        if (!maybeRequestCreateInlineSuggestionsRequestLocked(/* isAugmented= */ true,
-                requestAugmentedAutofill, viewState, focusedId, flags)) {
+        // When the inline suggestion render service is available and the view is focused, there
+        // are 3 cases when augmented autofill should ask IME for inline suggestion request,
+        // because standard autofill flow didn't:
+        // 1. the field is augmented autofill only (when standard autofill provider is None or
+        // when it returns null response)
+        // 2. standard autofill provider doesn't support inline suggestion
+        // 3. we re-entered the autofill session and standard autofill was not re-triggered, this is
+        //    recognized by seeing mExpiredResponse == true
+        final RemoteInlineSuggestionRenderService remoteRenderService =
+                mService.getRemoteInlineSuggestionRenderServiceLocked();
+        if (remoteRenderService != null
+                && (mSessionFlags.mAugmentedAutofillOnly
+                || !mSessionFlags.mInlineSupportedByService
+                || mSessionFlags.mExpiredResponse)
+                && isViewFocusedLocked(flags)) {
+            if (sDebug) Slog.d(TAG, "Create inline request for augmented autofill");
+            remoteRenderService.getInlineSuggestionsRendererInfo(new RemoteCallback(
+                    (extras) -> {
+                        synchronized (mLock) {
+                            mInlineSessionController.onCreateInlineSuggestionsRequestLocked(
+                                    focusedId, /*requestConsumer=*/ requestAugmentedAutofill,
+                                    extras);
+                        }
+                    }, mHandler));
+        } else {
             requestAugmentedAutofill.accept(
                     mInlineSessionController.getInlineSuggestionsRequestLocked().orElse(null));
         }
-
         if (mAugmentedAutofillDestroyer == null) {
             mAugmentedAutofillDestroyer = remoteService::onDestroyAutofillWindowsRequest;
         }
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index e6e52de..f3d0a2e 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -18,6 +18,7 @@
 package com.android.server.companion;
 
 import static com.android.internal.util.CollectionUtils.emptyIfNull;
+import static com.android.internal.util.CollectionUtils.find;
 import static com.android.internal.util.CollectionUtils.forEach;
 import static com.android.internal.util.FunctionalUtils.uncheckExceptions;
 import static com.android.internal.util.Preconditions.checkArgument;
@@ -131,9 +132,6 @@
             CompanionDeviceManager.COMPANION_DEVICE_DISCOVERY_PACKAGE_NAME,
             ".DeviceDiscoveryService");
 
-    // 10 min
-    public static final int DEVICE_DISCONNECT_PROFILE_REVOKE_DELAY_MS = 10 * 60 * 1000;
-
     private static final boolean DEBUG = false;
     private static final String LOG_TAG = "CompanionDeviceManagerService";
 
@@ -593,12 +591,45 @@
 
     void removeAssociation(int userId, String pkg, String deviceMacAddress) {
         updateAssociations(associations -> CollectionUtils.filter(associations, association -> {
-            return association.getUserId() != userId
+            boolean notMatch = association.getUserId() != userId
                     || !Objects.equals(association.getDeviceMacAddress(), deviceMacAddress)
                     || !Objects.equals(association.getPackageName(), pkg);
+            if (!notMatch) {
+                onAssociationPreRemove(association);
+            }
+            return notMatch;
         }));
     }
 
+    void onAssociationPreRemove(Association association) {
+        String deviceProfile = association.getDeviceProfile();
+        if (deviceProfile != null) {
+            Association otherAssociationWithDeviceProfile = find(
+                    getAllAssociations(association.getUserId()),
+                    a -> !a.equals(association) && deviceProfile.equals(a.getDeviceProfile()));
+            if (otherAssociationWithDeviceProfile != null) {
+                Log.i(LOG_TAG, "Not revoking " + deviceProfile
+                        + " for " + association
+                        + " - profile still present in " + otherAssociationWithDeviceProfile);
+            } else {
+                mRoleManager.removeRoleHolderAsUser(
+                        association.getDeviceProfile(),
+                        association.getPackageName(),
+                        RoleManager.MANAGE_HOLDERS_FLAG_DONT_KILL_APP,
+                        UserHandle.of(association.getUserId()),
+                        getContext().getMainExecutor(),
+                        success -> {
+                            if (!success) {
+                                Log.e(LOG_TAG, "Failed to revoke device profile role "
+                                        + association.getDeviceProfile()
+                                        + " to " + association.getPackageName()
+                                        + " for user " + association.getUserId());
+                            }
+                        });
+            }
+        }
+    }
+
     private void updateSpecialAccessPermissionForAssociatedPackage(Association association) {
         PackageInfo packageInfo = getPackageInfo(
                 association.getPackageName(),
@@ -636,6 +667,10 @@
         }
 
         exemptFromAutoRevoke(packageInfo.packageName, packageInfo.applicationInfo.uid);
+
+        if (mCurrentlyConnectedDevices.contains(association.getDeviceMacAddress())) {
+            grantDeviceProfile(association);
+        }
     }
 
     private void exemptFromAutoRevoke(String packageName, int uid) {
@@ -817,72 +852,39 @@
     void onDeviceConnected(String address) {
         mCurrentlyConnectedDevices.add(address);
 
-        Handler.getMain().removeCallbacksAndMessages(getDisconnectJobHandlerId(address));
-
         for (UserInfo user : getAllUsers()) {
             for (Association association : getAllAssociations(user.id)) {
                 if (Objects.equals(address, association.getDeviceMacAddress())) {
                     if (association.getDeviceProfile() != null) {
                         Log.i(LOG_TAG, "Granting role " + association.getDeviceProfile()
                                 + " to " + association.getPackageName()
-                                + " due to device connected: " + address);
-                        mRoleManager.addRoleHolderAsUser(
-                                association.getDeviceProfile(),
-                                association.getPackageName(),
-                                RoleManager.MANAGE_HOLDERS_FLAG_DONT_KILL_APP,
-                                UserHandle.of(association.getUserId()),
-                                getContext().getMainExecutor(),
-                                success -> {
-                                    if (!success) {
-                                        Log.e(LOG_TAG, "Failed to grant device profile role "
-                                                + association.getDeviceProfile()
-                                                + " to " + association.getPackageName()
-                                                + " for user " + association.getUserId());
-                                    }
-                                });
+                                + " due to device connected: " + association.getDeviceMacAddress());
+                        grantDeviceProfile(association);
                     }
                 }
             }
         }
     }
 
-    void onDeviceDisconnected(String address) {
-        mCurrentlyConnectedDevices.remove(address);
-
-        Handler.getMain().postDelayed(() -> {
-            if (!mCurrentlyConnectedDevices.contains(address)) {
-                for (UserInfo user : getAllUsers()) {
-                    for (Association association : getAllAssociations(user.id)) {
-                        if (association.getDeviceProfile() != null
-                                && Objects.equals(address, association.getDeviceMacAddress())
-                                && !association.isKeepProfilePrivilegesWhenDeviceAway()) {
-                            Log.i(LOG_TAG, "Revoking role " + association.getDeviceProfile()
-                                    + " to " + association.getPackageName()
-                                    + " due to device disconnected: " + address);
-                            mRoleManager.removeRoleHolderAsUser(
-                                    association.getDeviceProfile(),
-                                    association.getPackageName(),
-                                    RoleManager.MANAGE_HOLDERS_FLAG_DONT_KILL_APP,
-                                    UserHandle.of(association.getUserId()),
-                                    getContext().getMainExecutor(),
-                                    success -> {
-                                        if (!success) {
-                                            Log.e(LOG_TAG, "Failed to revoke device profile role "
-                                                    + association.getDeviceProfile()
-                                                    + " to " + association.getPackageName()
-                                                    + " for user " + association.getUserId());
-                                        }
-                                    });
-                        }
+    private void grantDeviceProfile(Association association) {
+        mRoleManager.addRoleHolderAsUser(
+                association.getDeviceProfile(),
+                association.getPackageName(),
+                RoleManager.MANAGE_HOLDERS_FLAG_DONT_KILL_APP,
+                UserHandle.of(association.getUserId()),
+                getContext().getMainExecutor(),
+                success -> {
+                    if (!success) {
+                        Log.e(LOG_TAG, "Failed to grant device profile role "
+                                + association.getDeviceProfile()
+                                + " to " + association.getPackageName()
+                                + " for user " + association.getUserId());
                     }
-                }
-            }
-        }, getDisconnectJobHandlerId(address), DEVICE_DISCONNECT_PROFILE_REVOKE_DELAY_MS);
+                });
     }
 
-    @NonNull
-    private String getDisconnectJobHandlerId(String address) {
-        return "CDM_onDisconnected_" + address;
+    void onDeviceDisconnected(String address) {
+        mCurrentlyConnectedDevices.remove(address);
     }
 
     private class ShellCmd extends ShellCommand {
@@ -898,34 +900,49 @@
 
         @Override
         public int onCommand(String cmd) {
-            switch (cmd) {
-                case "list": {
-                    forEach(
-                            getAllAssociations(getNextArgInt()),
-                            a -> getOutPrintWriter()
-                                    .println(a.getPackageName() + " " + a.getDeviceMacAddress()));
-                } break;
+            try {
+                switch (cmd) {
+                    case "list": {
+                        forEach(
+                                getAllAssociations(getNextArgInt()),
+                                a -> getOutPrintWriter()
+                                        .println(a.getPackageName() + " "
+                                                + a.getDeviceMacAddress()));
+                    }
+                    break;
 
-                case "associate": {
-                    addAssociation(new Association(getNextArgInt(), getNextArgRequired(),
-                            getNextArgRequired(), null, false));
-                } break;
+                    case "associate": {
+                        String pkg = getNextArgRequired();
+                        String address = getNextArgRequired();
+                        addAssociation(new Association(getNextArgInt(), address, pkg, null, false));
+                    }
+                    break;
 
-                case "disassociate": {
-                    removeAssociation(getNextArgInt(), getNextArgRequired(), getNextArgRequired());
-                } break;
+                    case "disassociate": {
+                        removeAssociation(getNextArgInt(), getNextArgRequired(),
+                                getNextArgRequired());
+                    }
+                    break;
 
-                case "simulate_connect": {
-                    onDeviceConnected(getNextArgRequired());
-                } break;
+                    case "simulate_connect": {
+                        onDeviceConnected(getNextArgRequired());
+                    }
+                    break;
 
-                case "simulate_disconnect": {
-                    onDeviceDisconnected(getNextArgRequired());
-                } break;
+                    case "simulate_disconnect": {
+                        onDeviceDisconnected(getNextArgRequired());
+                    }
+                    break;
 
-                default: return handleDefaultCommands(cmd);
+                    default:
+                        return handleDefaultCommands(cmd);
+                }
+                return 0;
+            } catch (Throwable t) {
+                Log.e(LOG_TAG, "Error running a command: $ " + cmd, t);
+                getErrPrintWriter().println(Log.getStackTraceString(t));
+                return 1;
             }
-            return 0;
         }
 
         private int getNextArgInt() {
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 55c1e08..9b99199 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -876,6 +876,10 @@
      */
     @VisibleForTesting
     public static class Dependencies {
+        public int getCallingUid() {
+            return Binder.getCallingUid();
+        }
+
         /**
          * Get system properties to use in ConnectivityService.
          */
@@ -1408,7 +1412,7 @@
     @Override
     public NetworkInfo getActiveNetworkInfo() {
         enforceAccessPermission();
-        final int uid = Binder.getCallingUid();
+        final int uid = mDeps.getCallingUid();
         final NetworkState state = getUnfilteredActiveNetworkState(uid);
         filterNetworkStateForUid(state, uid, false);
         maybeLogBlockedNetworkInfo(state.networkInfo, uid);
@@ -1418,7 +1422,7 @@
     @Override
     public Network getActiveNetwork() {
         enforceAccessPermission();
-        return getActiveNetworkForUidInternal(Binder.getCallingUid(), false);
+        return getActiveNetworkForUidInternal(mDeps.getCallingUid(), false);
     }
 
     @Override
@@ -1458,7 +1462,7 @@
     // Public because it's used by mLockdownTracker.
     public NetworkInfo getActiveNetworkInfoUnfiltered() {
         enforceAccessPermission();
-        final int uid = Binder.getCallingUid();
+        final int uid = mDeps.getCallingUid();
         NetworkState state = getUnfilteredActiveNetworkState(uid);
         return state.networkInfo;
     }
@@ -1474,7 +1478,7 @@
     @Override
     public NetworkInfo getNetworkInfo(int networkType) {
         enforceAccessPermission();
-        final int uid = Binder.getCallingUid();
+        final int uid = mDeps.getCallingUid();
         if (getVpnUnderlyingNetworks(uid) != null) {
             // A VPN is active, so we may need to return one of its underlying networks. This
             // information is not available in LegacyTypeTracker, so we have to get it from
@@ -1519,7 +1523,7 @@
     @Override
     public Network getNetworkForType(int networkType) {
         enforceAccessPermission();
-        final int uid = Binder.getCallingUid();
+        final int uid = mDeps.getCallingUid();
         NetworkState state = getFilteredNetworkState(networkType, uid);
         if (!isNetworkWithLinkPropertiesBlocked(state.linkProperties, uid, false)) {
             return state.network;
@@ -1566,7 +1570,7 @@
             result.put(
                     nai.network,
                     maybeSanitizeLocationInfoForCaller(
-                            nc, Binder.getCallingUid(), callingPackageName));
+                            nc, mDeps.getCallingUid(), callingPackageName));
         }
 
         synchronized (mVpns) {
@@ -1581,7 +1585,7 @@
                                 result.put(
                                         network,
                                         maybeSanitizeLocationInfoForCaller(
-                                                nc, Binder.getCallingUid(), callingPackageName));
+                                                nc, mDeps.getCallingUid(), callingPackageName));
                             }
                         }
                     }
@@ -1611,7 +1615,7 @@
     @Override
     public LinkProperties getActiveLinkProperties() {
         enforceAccessPermission();
-        final int uid = Binder.getCallingUid();
+        final int uid = mDeps.getCallingUid();
         NetworkState state = getUnfilteredActiveNetworkState(uid);
         if (state.linkProperties == null) return null;
         return linkPropertiesRestrictedForCallerPermissions(state.linkProperties,
@@ -1625,7 +1629,7 @@
         final LinkProperties lp = getLinkProperties(nai);
         if (lp == null) return null;
         return linkPropertiesRestrictedForCallerPermissions(
-                lp, Binder.getCallingPid(), Binder.getCallingUid());
+                lp, Binder.getCallingPid(), mDeps.getCallingUid());
     }
 
     // TODO - this should be ALL networks
@@ -1635,7 +1639,7 @@
         final LinkProperties lp = getLinkProperties(getNetworkAgentInfoForNetwork(network));
         if (lp == null) return null;
         return linkPropertiesRestrictedForCallerPermissions(
-                lp, Binder.getCallingPid(), Binder.getCallingUid());
+                lp, Binder.getCallingPid(), mDeps.getCallingUid());
     }
 
     @Nullable
@@ -1657,17 +1661,17 @@
         synchronized (nai) {
             if (nai.networkCapabilities == null) return null;
             return networkCapabilitiesRestrictedForCallerPermissions(
-                    nai.networkCapabilities, Binder.getCallingPid(), Binder.getCallingUid());
+                    nai.networkCapabilities, Binder.getCallingPid(), mDeps.getCallingUid());
         }
     }
 
     @Override
     public NetworkCapabilities getNetworkCapabilities(Network network, String callingPackageName) {
-        mAppOpsManager.checkPackage(Binder.getCallingUid(), callingPackageName);
+        mAppOpsManager.checkPackage(mDeps.getCallingUid(), callingPackageName);
         enforceAccessPermission();
         return maybeSanitizeLocationInfoForCaller(
                 getNetworkCapabilitiesInternal(network),
-                Binder.getCallingUid(), callingPackageName);
+                mDeps.getCallingUid(), callingPackageName);
     }
 
     @VisibleForTesting
@@ -1755,7 +1759,7 @@
     }
 
     private void restrictBackgroundRequestForCaller(NetworkCapabilities nc) {
-        if (!mPermissionMonitor.hasUseBackgroundNetworksPermission(Binder.getCallingUid())) {
+        if (!mPermissionMonitor.hasUseBackgroundNetworksPermission(mDeps.getCallingUid())) {
             nc.addCapability(NET_CAPABILITY_FOREGROUND);
         }
     }
@@ -1808,7 +1812,7 @@
         // requestRouteToHost. In Q, GnssLocationProvider is changed to not call requestRouteToHost
         // for devices launched with Q and above. However, existing devices upgrading to Q and
         // above must continued to be supported for few more releases.
-        if (isSystem(Binder.getCallingUid()) && SystemProperties.getInt(
+        if (isSystem(mDeps.getCallingUid()) && SystemProperties.getInt(
                 "ro.product.first_api_level", 0) > Build.VERSION_CODES.P) {
             log("This method exists only for app backwards compatibility"
                     + " and must not be called by system services.");
@@ -1874,7 +1878,7 @@
             return false;
         }
 
-        final int uid = Binder.getCallingUid();
+        final int uid = mDeps.getCallingUid();
         final long token = Binder.clearCallingIdentity();
         try {
             LinkProperties lp;
@@ -2294,7 +2298,7 @@
      */
     @Override
     public void systemReady() {
-        if (Binder.getCallingUid() != Process.SYSTEM_UID) {
+        if (mDeps.getCallingUid() != Process.SYSTEM_UID) {
             throw new SecurityException("Calling Uid is not system uid.");
         }
         systemReadyInternal();
@@ -2520,7 +2524,7 @@
         if (context.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
                 != PackageManager.PERMISSION_GRANTED) {
             pw.println("Permission Denial: can't dump " + tag + " from from pid="
-                    + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
+                    + Binder.getCallingPid() + ", uid=" + mDeps.getCallingUid()
                     + " due to missing android.permission.DUMP permission");
             return false;
         } else {
@@ -3900,7 +3904,7 @@
 
             if (request == CaptivePortal.APP_REQUEST_REEVALUATION_REQUIRED) {
                 checkNetworkStackPermission();
-                nm.forceReevaluation(Binder.getCallingUid());
+                nm.forceReevaluation(mDeps.getCallingUid());
             }
         }
 
@@ -4367,7 +4371,7 @@
     public void reportNetworkConnectivity(Network network, boolean hasConnectivity) {
         enforceAccessPermission();
         enforceInternetPermission();
-        final int uid = Binder.getCallingUid();
+        final int uid = mDeps.getCallingUid();
         final int connectivityInfo = encodeBool(hasConnectivity);
 
         // Handle ConnectivityDiagnostics event before attempting to revalidate the network. This
@@ -4437,13 +4441,13 @@
         if (globalProxy != null) return globalProxy;
         if (network == null) {
             // Get the network associated with the calling UID.
-            final Network activeNetwork = getActiveNetworkForUidInternal(Binder.getCallingUid(),
+            final Network activeNetwork = getActiveNetworkForUidInternal(mDeps.getCallingUid(),
                     true);
             if (activeNetwork == null) {
                 return null;
             }
             return getLinkPropertiesProxyInfo(activeNetwork);
-        } else if (mDeps.queryUserAccess(Binder.getCallingUid(), network.getNetId())) {
+        } else if (mDeps.queryUserAccess(mDeps.getCallingUid(), network.getNetId())) {
             // Don't call getLinkProperties() as it requires ACCESS_NETWORK_STATE permission, which
             // caller may not have.
             return getLinkPropertiesProxyInfo(network);
@@ -4612,7 +4616,7 @@
      */
     @Override
     public ParcelFileDescriptor establishVpn(VpnConfig config) {
-        int user = UserHandle.getUserId(Binder.getCallingUid());
+        int user = UserHandle.getUserId(mDeps.getCallingUid());
         synchronized (mVpns) {
             throwIfLockdownEnabled();
             return mVpns.get(user).establish(config);
@@ -4633,7 +4637,7 @@
      */
     @Override
     public boolean provisionVpnProfile(@NonNull VpnProfile profile, @NonNull String packageName) {
-        final int user = UserHandle.getUserId(Binder.getCallingUid());
+        final int user = UserHandle.getUserId(mDeps.getCallingUid());
         synchronized (mVpns) {
             return mVpns.get(user).provisionVpnProfile(packageName, profile, mKeyStore);
         }
@@ -4651,7 +4655,7 @@
      */
     @Override
     public void deleteVpnProfile(@NonNull String packageName) {
-        final int user = UserHandle.getUserId(Binder.getCallingUid());
+        final int user = UserHandle.getUserId(mDeps.getCallingUid());
         synchronized (mVpns) {
             mVpns.get(user).deleteVpnProfile(packageName, mKeyStore);
         }
@@ -4668,7 +4672,7 @@
      */
     @Override
     public void startVpnProfile(@NonNull String packageName) {
-        final int user = UserHandle.getUserId(Binder.getCallingUid());
+        final int user = UserHandle.getUserId(mDeps.getCallingUid());
         synchronized (mVpns) {
             throwIfLockdownEnabled();
             mVpns.get(user).startVpnProfile(packageName, mKeyStore);
@@ -4685,7 +4689,7 @@
      */
     @Override
     public void stopVpnProfile(@NonNull String packageName) {
-        final int user = UserHandle.getUserId(Binder.getCallingUid());
+        final int user = UserHandle.getUserId(mDeps.getCallingUid());
         synchronized (mVpns) {
             mVpns.get(user).stopVpnProfile(packageName);
         }
@@ -4697,7 +4701,7 @@
      */
     @Override
     public void startLegacyVpn(VpnProfile profile) {
-        int user = UserHandle.getUserId(Binder.getCallingUid());
+        int user = UserHandle.getUserId(mDeps.getCallingUid());
         final LinkProperties egress = getActiveLinkProperties();
         if (egress == null) {
             throw new IllegalStateException("Missing active network connection");
@@ -4846,7 +4850,7 @@
 
     @Override
     public boolean updateLockdownVpn() {
-        if (Binder.getCallingUid() != Process.SYSTEM_UID) {
+        if (mDeps.getCallingUid() != Process.SYSTEM_UID) {
             logw("Lockdown VPN only available to AID_SYSTEM");
             return false;
         }
@@ -4868,7 +4872,7 @@
                     setLockdownTracker(null);
                     return true;
                 }
-                int user = UserHandle.getUserId(Binder.getCallingUid());
+                int user = UserHandle.getUserId(mDeps.getCallingUid());
                 Vpn vpn = mVpns.get(user);
                 if (vpn == null) {
                     logw("VPN for user " + user + " not ready yet. Skipping lockdown");
@@ -5433,7 +5437,7 @@
             messenger = null;
             mBinder = null;
             mPid = getCallingPid();
-            mUid = getCallingUid();
+            mUid = mDeps.getCallingUid();
             enforceRequestCountLimit();
         }
 
@@ -5445,7 +5449,7 @@
             ensureAllNetworkRequestsHaveType(mRequests);
             mBinder = binder;
             mPid = getCallingPid();
-            mUid = getCallingUid();
+            mUid = mDeps.getCallingUid();
             mPendingIntent = null;
             enforceRequestCountLimit();
 
@@ -5588,7 +5592,7 @@
     }
 
     private boolean checkUnsupportedStartingFrom(int version, String callingPackageName) {
-        final UserHandle user = UserHandle.getUserHandleForUid(Binder.getCallingUid());
+        final UserHandle user = UserHandle.getUserHandleForUid(mDeps.getCallingUid());
         final PackageManager pm =
                 mContext.createContextAsUser(user, 0 /* flags */).getPackageManager();
         try {
@@ -5608,7 +5612,7 @@
                 throw new SecurityException("Insufficient permissions to specify legacy type");
             }
         }
-        final int callingUid = Binder.getCallingUid();
+        final int callingUid = mDeps.getCallingUid();
         final NetworkRequest.Type type = (networkCapabilities == null)
                 ? NetworkRequest.Type.TRACK_DEFAULT
                 : NetworkRequest.Type.REQUEST;
@@ -5678,7 +5682,7 @@
         if (nai != null) {
             nai.asyncChannel.sendMessage(android.net.NetworkAgent.CMD_REQUEST_BANDWIDTH_UPDATE);
             synchronized (mBandwidthRequests) {
-                final int uid = Binder.getCallingUid();
+                final int uid = mDeps.getCallingUid();
                 Integer uidReqs = mBandwidthRequests.get(uid);
                 if (uidReqs == null) {
                     uidReqs = 0;
@@ -5695,7 +5699,7 @@
     }
 
     private void enforceMeteredApnPolicy(NetworkCapabilities networkCapabilities) {
-        final int uid = Binder.getCallingUid();
+        final int uid = mDeps.getCallingUid();
         if (isSystem(uid)) {
             // Exemption for system uid.
             return;
@@ -5715,7 +5719,7 @@
             PendingIntent operation, @NonNull String callingPackageName,
             @Nullable String callingAttributionTag) {
         Objects.requireNonNull(operation, "PendingIntent cannot be null.");
-        final int callingUid = Binder.getCallingUid();
+        final int callingUid = mDeps.getCallingUid();
         networkCapabilities = new NetworkCapabilities(networkCapabilities);
         enforceNetworkRequestPermissions(networkCapabilities, callingPackageName,
                 callingAttributionTag);
@@ -5774,7 +5778,7 @@
     @Override
     public NetworkRequest listenForNetwork(NetworkCapabilities networkCapabilities,
             Messenger messenger, IBinder binder, @NonNull String callingPackageName) {
-        final int callingUid = Binder.getCallingUid();
+        final int callingUid = mDeps.getCallingUid();
         if (!hasWifiNetworkListenPermission(networkCapabilities)) {
             enforceAccessPermission();
         }
@@ -5804,7 +5808,7 @@
     public void pendingListenForNetwork(NetworkCapabilities networkCapabilities,
             PendingIntent operation, @NonNull String callingPackageName) {
         Objects.requireNonNull(operation, "PendingIntent cannot be null.");
-        final int callingUid = Binder.getCallingUid();
+        final int callingUid = mDeps.getCallingUid();
         if (!hasWifiNetworkListenPermission(networkCapabilities)) {
             enforceAccessPermission();
         }
@@ -5905,7 +5909,7 @@
         } else {
             enforceNetworkFactoryPermission();
         }
-        mHandler.post(() -> handleReleaseNetworkRequest(request, Binder.getCallingUid(), true));
+        mHandler.post(() -> handleReleaseNetworkRequest(request, mDeps.getCallingUid(), true));
     }
 
     // NOTE: Accessed on multiple threads, must be synchronized on itself.
@@ -5999,7 +6003,7 @@
             enforceNetworkFactoryPermission();
         }
 
-        final int uid = Binder.getCallingUid();
+        final int uid = mDeps.getCallingUid();
         final long token = Binder.clearCallingIdentity();
         try {
             return registerNetworkAgentInternal(messenger, networkInfo, linkProperties,
@@ -7653,7 +7657,7 @@
 
     @Override
     public boolean addVpnAddress(String address, int prefixLength) {
-        int user = UserHandle.getUserId(Binder.getCallingUid());
+        int user = UserHandle.getUserId(mDeps.getCallingUid());
         synchronized (mVpns) {
             throwIfLockdownEnabled();
             return mVpns.get(user).addAddress(address, prefixLength);
@@ -7662,7 +7666,7 @@
 
     @Override
     public boolean removeVpnAddress(String address, int prefixLength) {
-        int user = UserHandle.getUserId(Binder.getCallingUid());
+        int user = UserHandle.getUserId(mDeps.getCallingUid());
         synchronized (mVpns) {
             throwIfLockdownEnabled();
             return mVpns.get(user).removeAddress(address, prefixLength);
@@ -7671,7 +7675,7 @@
 
     @Override
     public boolean setUnderlyingNetworksForVpn(Network[] networks) {
-        int user = UserHandle.getUserId(Binder.getCallingUid());
+        int user = UserHandle.getUserId(mDeps.getCallingUid());
         final boolean success;
         synchronized (mVpns) {
             throwIfLockdownEnabled();
@@ -7898,7 +7902,7 @@
 
     @GuardedBy("mVpns")
     private Vpn getVpnIfOwner() {
-        return getVpnIfOwner(Binder.getCallingUid());
+        return getVpnIfOwner(mDeps.getCallingUid());
     }
 
     @GuardedBy("mVpns")
@@ -8376,7 +8380,7 @@
             throw new IllegalArgumentException("ConnectivityManager.TYPE_* are deprecated."
                     + " Please use NetworkCapabilities instead.");
         }
-        final int callingUid = Binder.getCallingUid();
+        final int callingUid = mDeps.getCallingUid();
         mAppOpsManager.checkPackage(callingUid, callingPackageName);
 
         // This NetworkCapabilities is only used for matching to Networks. Clear out its owner uid
@@ -8411,7 +8415,7 @@
                 mConnectivityDiagnosticsHandler.obtainMessage(
                         ConnectivityDiagnosticsHandler
                                 .EVENT_UNREGISTER_CONNECTIVITY_DIAGNOSTICS_CALLBACK,
-                        Binder.getCallingUid(),
+                        mDeps.getCallingUid(),
                         0,
                         callback));
     }
@@ -8427,7 +8431,7 @@
         }
 
         final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
-        if (nai == null || nai.creatorUid != Binder.getCallingUid()) {
+        if (nai == null || nai.creatorUid != mDeps.getCallingUid()) {
             throw new SecurityException("Data Stall simulation is only possible for network "
                 + "creators");
         }
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 6b45b48..c951fd4 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -4475,6 +4475,15 @@
             return mMediaStoreAuthorityAppId == UserHandle.getAppId(uid);
         }
 
+        @Override
+        public void freeCache(String volumeUuid, long freeBytes) {
+            try {
+                mStorageSessionController.freeCache(volumeUuid, freeBytes);
+            } catch (ExternalStorageServiceException e) {
+                Log.e(TAG, "Failed to free cache of vol : " + volumeUuid, e);
+            }
+        }
+
         public boolean hasExternalStorage(int uid, String packageName) {
             // No need to check for system uid. This avoids a deadlock between
             // PackageManagerService and AppOpsService.
diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
index ca20224..6fe934e 100644
--- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
+++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
@@ -15,6 +15,8 @@
  */
 package com.android.server.am;
 
+import static com.android.internal.power.MeasuredEnergyArray.SUBSYSTEM_DISPLAY;
+
 import android.annotation.Nullable;
 import android.bluetooth.BluetoothActivityEnergyInfo;
 import android.bluetooth.BluetoothAdapter;
@@ -34,6 +36,7 @@
 import android.telephony.TelephonyManager;
 import android.util.IntArray;
 import android.util.Slog;
+import android.util.SparseLongArray;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.os.BatteryStatsImpl;
@@ -43,6 +46,8 @@
 
 import libcore.util.EmptyArray;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
@@ -129,9 +134,13 @@
     // WiFi keeps an accumulated total of stats, unlike Bluetooth.
     // Keep the last WiFi stats so we can compute a delta.
     @GuardedBy("mWorkerLock")
-    private WifiActivityEnergyInfo mLastInfo =
+    private WifiActivityEnergyInfo mLastWifiInfo =
             new WifiActivityEnergyInfo(0, 0, 0, 0, 0, 0);
 
+    /** Snapshot of measured energies, or null if no measured energies are supported. */
+    @GuardedBy("mWorkerLock")
+    private final @Nullable MeasuredEnergySnapshot mMeasuredEnergySnapshot;
+
     /**
      * Timestamp at which all external stats were last collected in
      * {@link SystemClock#elapsedRealtime()} time base.
@@ -139,9 +148,13 @@
     @GuardedBy("this")
     private long mLastCollectionTimeStamp;
 
-    BatteryExternalStatsWorker(Context context, BatteryStatsImpl stats) {
+    BatteryExternalStatsWorker(Context context, BatteryStatsImpl stats,
+            @Nullable MeasuredEnergyArray initialMeasuredEnergies) {
         mContext = context;
         mStats = stats;
+
+        mMeasuredEnergySnapshot = initialMeasuredEnergies == null ?
+                null : new MeasuredEnergySnapshot(initialMeasuredEnergies);
     }
 
     @Override
@@ -417,7 +430,6 @@
         SynchronousResultReceiver bluetoothReceiver = null;
         CompletableFuture<ModemActivityInfo> modemFuture = CompletableFuture.completedFuture(null);
         boolean railUpdated = false;
-        MeasuredEnergyArray energyArray = null;
 
         if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI) != 0) {
             // We were asked to fetch WiFi data.
@@ -495,13 +507,6 @@
             }
         }
 
-        if ((updateFlags & UPDATE_ENERGY) != 0) {
-            synchronized (mStats) {
-                // TODO(b/172934873) evaluate a safe way to query the HAL without holding mStats
-                energyArray = mStats.getEnergyConsumptionDataLocked();
-            }
-        }
-
         final WifiActivityEnergyInfo wifiInfo = awaitControllerInfo(wifiReceiver);
         final BluetoothActivityEnergyInfo bluetoothInfo = awaitControllerInfo(bluetoothReceiver);
         ModemActivityInfo modemInfo = null;
@@ -513,6 +518,9 @@
         } catch (ExecutionException e) {
             Slog.w(TAG, "exception reading modem stats: " + e.getCause());
         }
+        final SparseLongArray energyDeltas = mMeasuredEnergySnapshot == null ? null :
+                mMeasuredEnergySnapshot.updateAndGetDelta(getMeasuredEnergyLocked(updateFlags));
+
         final long elapsedRealtime = SystemClock.elapsedRealtime();
         final long uptime = SystemClock.uptimeMillis();
         final long elapsedRealtimeUs = elapsedRealtime * 1000;
@@ -542,6 +550,13 @@
                 mStats.updateRpmStatsLocked(elapsedRealtimeUs);
             }
 
+            // Inform mStats about each applicable measured energy.
+            if (energyDeltas != null) {
+                final long displayEnergy = energyDeltas.get(SUBSYSTEM_DISPLAY, 0L);
+                // Always pass in what BatteryExternalStatsWorker thinks screenState is.
+                mStats.updateDisplayEnergyLocked(displayEnergy, screenState, elapsedRealtime);
+            }
+
             if (bluetoothInfo != null) {
                 if (bluetoothInfo.isValid()) {
                     mStats.updateBluetoothStateLocked(bluetoothInfo, elapsedRealtime, uptime);
@@ -549,11 +564,6 @@
                     Slog.w(TAG, "bluetooth info is invalid: " + bluetoothInfo);
                 }
             }
-
-            if ((updateFlags & UPDATE_ENERGY) != 0 && energyArray != null) {
-                // Always use what BatteryExternalStatsWorker thinks screenState is.
-                mStats.updateMeasuredEnergyStatsLocked(energyArray, screenState);
-            }
         }
 
         // WiFi and Modem state are updated without the mStats lock held, because they
@@ -561,7 +571,9 @@
 
         if (wifiInfo != null) {
             if (wifiInfo.isValid()) {
-                mStats.updateWifiState(extractDeltaLocked(wifiInfo), elapsedRealtime, uptime);
+                // TODO: wifiEnergyDelta = energyDeltas.get(MeasuredEnergyArray.SUBSYSTEM_WIFI, 0L);
+                mStats.updateWifiState(extractDeltaLocked(wifiInfo)
+                        /*, TODO: wifiEnergyDelta */, elapsedRealtime, uptime);
             } else {
                 Slog.w(TAG, "wifi info is invalid: " + wifiInfo);
             }
@@ -570,6 +582,11 @@
         if (modemInfo != null) {
             mStats.updateMobileRadioState(modemInfo, elapsedRealtime, uptime);
         }
+
+        if (updateFlags == UPDATE_ALL) {
+            // This helps mStats deal with ignoring data from prior to resets.
+            mStats.informThatAllExternalStatsAreFlushed();
+        }
     }
 
     /**
@@ -604,12 +621,12 @@
     @GuardedBy("mWorkerLock")
     private WifiActivityEnergyInfo extractDeltaLocked(WifiActivityEnergyInfo latest) {
         final long timePeriodMs = latest.getTimeSinceBootMillis()
-                - mLastInfo.getTimeSinceBootMillis();
-        final long lastScanMs = mLastInfo.getControllerScanDurationMillis();
-        final long lastIdleMs = mLastInfo.getControllerIdleDurationMillis();
-        final long lastTxMs = mLastInfo.getControllerTxDurationMillis();
-        final long lastRxMs = mLastInfo.getControllerRxDurationMillis();
-        final long lastEnergy = mLastInfo.getControllerEnergyUsedMicroJoules();
+                - mLastWifiInfo.getTimeSinceBootMillis();
+        final long lastScanMs = mLastWifiInfo.getControllerScanDurationMillis();
+        final long lastIdleMs = mLastWifiInfo.getControllerIdleDurationMillis();
+        final long lastTxMs = mLastWifiInfo.getControllerTxDurationMillis();
+        final long lastRxMs = mLastWifiInfo.getControllerRxDurationMillis();
+        final long lastEnergy = mLastWifiInfo.getControllerEnergyUsedMicroJoules();
 
         final long deltaTimeSinceBootMillis = latest.getTimeSinceBootMillis();
         final int deltaStackState = latest.getStackState();
@@ -657,7 +674,7 @@
             wasReset = false;
         }
 
-        mLastInfo = latest;
+        mLastWifiInfo = latest;
         WifiActivityEnergyInfo delta = new WifiActivityEnergyInfo(
                 deltaTimeSinceBootMillis,
                 deltaStackState,
@@ -671,4 +688,39 @@
         }
         return delta;
     }
+
+    // TODO(b/172934873): Evaluate a safe way to query the HAL without holding mStats
+    /** Fetch MeasuredEnergyArray for supported subsystems based on the given updateFlags. */
+    @GuardedBy("mWorkerLock")
+    private @Nullable MeasuredEnergyArray getMeasuredEnergyLocked(@ExternalUpdateFlag int flags) {
+        if (mMeasuredEnergySnapshot == null) return null;
+
+        if (flags == UPDATE_ALL) {
+            // Gotta catch 'em all... including custom (non-specific) subsystems
+            synchronized (mStats) {
+                return mStats.getEnergyConsumptionDataLocked();
+            }
+        }
+
+        final List<Integer> energyConsumerIds = new ArrayList<>();
+        if ((flags & UPDATE_DISPLAY) != 0) {
+            addEnergyConsumerIdLocked(energyConsumerIds, SUBSYSTEM_DISPLAY);
+        }
+        // TODO: Wifi, Bluetooth, etc., go here
+        if (energyConsumerIds.isEmpty()) {
+            return null;
+        }
+        synchronized (mStats) {
+            // TODO: Query *specific* subsystems from HAL based on energyConsumerIds.toArray()
+            return mStats.getEnergyConsumptionDataLocked();
+        }
+    }
+
+    @GuardedBy("mWorkerLock")
+    private void addEnergyConsumerIdLocked(List<Integer> energyConsumerIds,
+            @MeasuredEnergyArray.MeasuredEnergySubsystem int consumerId) {
+        if (mMeasuredEnergySnapshot.hasSubsystem(consumerId)) {
+            energyConsumerIds.add(consumerId);
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 0ab3c9e..82e9b46 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -16,6 +16,7 @@
 
 package com.android.server.am;
 
+import android.annotation.Nullable;
 import android.bluetooth.BluetoothActivityEnergyInfo;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -26,6 +27,7 @@
 import android.os.BatteryStats;
 import android.os.BatteryStatsInternal;
 import android.os.BatteryUsageStats;
+import android.os.BatteryUsageStatsQuery;
 import android.os.Binder;
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -64,6 +66,8 @@
 import com.android.internal.os.RailStats;
 import com.android.internal.os.RpmStats;
 import com.android.internal.power.MeasuredEnergyArray;
+import com.android.internal.power.MeasuredEnergyArray.MeasuredEnergySubsystem;
+import com.android.internal.power.MeasuredEnergyStats;
 import com.android.internal.util.DumpUtils;
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.ParseUtils;
@@ -196,7 +200,7 @@
     }
 
     @Override
-    public MeasuredEnergyArray getEnergyConsumptionData() {
+    public @Nullable MeasuredEnergyArray getEnergyConsumptionData() {
         final EnergyConsumerResult[] results = mPowerStatsHALWrapper.getEnergyConsumed(new int[0]);
         if (results == null) return null;
         final int size = results.length;
@@ -254,9 +258,11 @@
         mPowerStatsHALWrapper = new PowerStatsHALWrapper.PowerStatsHALWrapperImpl();
         mPowerStatsHALWrapper.initialize();
 
+        final MeasuredEnergyArray initialEnergies = getEnergyConsumptionData();
+        final boolean[] supportedBuckets = getSupportedEnergyBuckets(initialEnergies);
         mStats = new BatteryStatsImpl(systemDir, handler, this,
-                this, mUserManagerUserInfoProvider);
-        mWorker = new BatteryExternalStatsWorker(context, mStats);
+                this, supportedBuckets, mUserManagerUserInfoProvider);
+        mWorker = new BatteryExternalStatsWorker(context, mStats, initialEnergies);
         mStats.setExternalStatsSyncLocked(mWorker);
         mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger(
                 com.android.internal.R.integer.config_radioScanningTimeout) * 1000L);
@@ -266,6 +272,30 @@
         mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context, mStats);
     }
 
+    /**
+     * Map the {@link MeasuredEnergySubsystem}s in the given energyArray to their corresponding
+     * {@link MeasuredEnergyStats.EnergyBucket}s.
+     *
+     * @return array with true for index i if energy bucket i is supported.
+     */
+    private static @Nullable boolean[] getSupportedEnergyBuckets(MeasuredEnergyArray energyArray) {
+        if (energyArray == null) {
+            return null;
+        }
+        final boolean[] buckets = new boolean[MeasuredEnergyStats.NUMBER_ENERGY_BUCKETS];
+        final int size = energyArray.size();
+        for (int energyIdx = 0; energyIdx < size; energyIdx++) {
+            switch (energyArray.getSubsystem(energyIdx)) {
+                case MeasuredEnergyArray.SUBSYSTEM_DISPLAY:
+                    buckets[MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_ON] = true;
+                    buckets[MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_DOZE] = true;
+                    buckets[MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_OTHER] = true;
+                    break;
+            }
+        }
+        return buckets;
+    }
+
     public void publish() {
         LocalServices.addService(BatteryStatsInternal.class, new LocalService());
         ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
@@ -560,10 +590,10 @@
      * Returns BatteryUsageStats, which contains power attribution data on a per-subsystem
      * and per-UID basis.
      */
-    public BatteryUsageStats getBatteryUsageStats() {
+    public BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
         mContext.enforceCallingPermission(
                 android.Manifest.permission.BATTERY_STATS, null);
-        return mBatteryUsageStatsProvider.getBatteryUsageStats();
+        return mBatteryUsageStatsProvider.getBatteryUsageStats(query);
     }
 
     public byte[] getStatistics() {
@@ -2035,7 +2065,7 @@
     private void dumpMeasuredEnergyStats(PrintWriter pw) {
         // Wait for the completion of pending works if there is any
         awaitCompletion();
-        syncStats("dump", BatteryExternalStatsWorker.UPDATE_ENERGY);
+        syncStats("dump", BatteryExternalStatsWorker.UPDATE_ALL);
         synchronized (mStats) {
             mStats.dumpMeasuredEnergyStatsLocked(pw);
         }
@@ -2135,7 +2165,6 @@
                         pw.println("Battery stats reset.");
                         noOutput = true;
                     }
-                    mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL);
                 } else if ("--write".equals(arg)) {
                     awaitCompletion();
                     syncStats("dump", BatteryExternalStatsWorker.UPDATE_ALL);
@@ -2245,6 +2274,7 @@
                                 in.setDataPosition(0);
                                 BatteryStatsImpl checkinStats = new BatteryStatsImpl(
                                         null, mStats.mHandler, null, null,
+                                        null /* energy buckets not currently in checkin anyway */,
                                         mUserManagerUserInfoProvider);
                                 checkinStats.readSummaryFromParcel(in);
                                 in.recycle();
@@ -2285,6 +2315,7 @@
                                 in.setDataPosition(0);
                                 BatteryStatsImpl checkinStats = new BatteryStatsImpl(
                                         null, mStats.mHandler, null, null,
+                                        null /* energy buckets not currently in checkin anyway */,
                                         mUserManagerUserInfoProvider);
                                 checkinStats.readSummaryFromParcel(in);
                                 in.recycle();
diff --git a/services/core/java/com/android/server/am/MeasuredEnergySnapshot.java b/services/core/java/com/android/server/am/MeasuredEnergySnapshot.java
new file mode 100644
index 0000000..b915c0c
--- /dev/null
+++ b/services/core/java/com/android/server/am/MeasuredEnergySnapshot.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.annotation.Nullable;
+import android.util.Slog;
+import android.util.SparseLongArray;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.power.MeasuredEnergyArray;
+import com.android.internal.power.MeasuredEnergyArray.MeasuredEnergySubsystem;
+
+import java.io.PrintWriter;
+import java.util.Arrays;
+
+/**
+ * Keeps snapshots of data from previously pulled MeasuredEnergyArrays.
+ */
+@VisibleForTesting
+public class MeasuredEnergySnapshot {
+    private static final String TAG = "MeasuredEnergySnapshot";
+
+    private static final long UNAVAILABLE = -1;
+
+    /**
+     * Energy snapshots from the last time each {@link MeasuredEnergySubsystem} was updated.
+     *
+     * Note that the snapshots for different subsystems may have been taken at different times.
+     *
+     * A snapshot is {@link #UNAVAILABLE} if the subsystem has never been updated (ie. unsupported).
+     */
+    private final long[] mMeasuredEnergySnapshots;
+
+    /**
+     * Constructor that initializes to the given energyArray;
+     * all subsystems not mentioned in initialEnergyArray are set to UNAVAILABLE.
+     */
+    public MeasuredEnergySnapshot(MeasuredEnergyArray initialEnergyArray) {
+        this(MeasuredEnergyArray.NUMBER_SUBSYSTEMS, initialEnergyArray);
+    }
+
+    /**
+     * Constructor (for testing) that initializes to the given energyArray and numSubsystems;
+     * all subsystems not mentioned in initialEnergyArray are set to UNAVAILABLE.
+     */
+    @VisibleForTesting
+    MeasuredEnergySnapshot(int numSubsystems, MeasuredEnergyArray initialEnergyArray) {
+        if (initialEnergyArray.size() > numSubsystems) {
+            throw new IllegalArgumentException("Energy array contains " + initialEnergyArray.size()
+                    + " subsystems, which exceeds the maximum allowed of " + numSubsystems);
+        }
+        mMeasuredEnergySnapshots = new long[numSubsystems];
+        Arrays.fill(mMeasuredEnergySnapshots, UNAVAILABLE);
+        fillGivenSubsystems(initialEnergyArray);
+    }
+
+    /**
+     * For the subsystems present in energyArray, overwrites mMeasuredEnergySnapshots with their
+     * energy values from energyArray.
+     */
+    private void fillGivenSubsystems(MeasuredEnergyArray energyArray) {
+        final int size = energyArray.size();
+        for (int i = 0; i < size; i++) {
+            final int subsystem = energyArray.getSubsystem(i);
+            mMeasuredEnergySnapshots[subsystem] = energyArray.getEnergy(i);
+        }
+    }
+
+    /**
+     * Update with the some freshly measured energies and return the difference (delta)
+     * between the previously stored values and the passed-in values.
+     *
+     * @param energyArray measured energy array for some (possibly not all) subsystems.
+     *
+     * @return a map from the updated subsystems to their corresponding energy deltas.
+     *         Subsystems not present in energyArray will not appear.
+     *         Subsystems with no difference in energy will not appear.
+     *         Returns null, if energyArray is null.
+     */
+    public @Nullable SparseLongArray updateAndGetDelta(MeasuredEnergyArray energyArray) {
+        if (energyArray == null) {
+            return null;
+        }
+        final SparseLongArray delta = new SparseLongArray();
+        final int size = energyArray.size();
+        for (int i = 0; i < size; i++) {
+            final int updatedSubsystem = energyArray.getSubsystem(i);
+            final long newEnergyUJ = energyArray.getEnergy(i);
+            final long oldEnergyUJ = mMeasuredEnergySnapshots[updatedSubsystem];
+
+            // If this is the first valid energy, there is no delta to take.
+            if (oldEnergyUJ < 0) continue;
+            final long deltaUJ = newEnergyUJ - oldEnergyUJ;
+            if (deltaUJ == 0) continue;
+            if (deltaUJ < 0) {
+                Slog.e(TAG, "For subsystem " + updatedSubsystem + ", new energy (" + newEnergyUJ
+                        + ") is less than old energy (" + oldEnergyUJ + "). Skipping. ");
+                continue;
+            }
+            delta.put(updatedSubsystem, deltaUJ);
+        }
+
+        fillGivenSubsystems(energyArray);
+
+        return delta;
+    }
+
+    /**
+     * Check if a subsystem's measured energy is available.
+     * @param subsystem which subsystem.
+     * @return true if subsystem is available.
+     */
+    public boolean hasSubsystem(@MeasuredEnergySubsystem int subsystem) {
+        return mMeasuredEnergySnapshots[subsystem] != UNAVAILABLE;
+    }
+
+    /** Dump debug data. */
+    public void dump(PrintWriter pw) {
+        pw.println("Measured energy snapshot (microjoules):");
+        pw.print("   ");
+        for (int i = 0; i < MeasuredEnergyArray.NUMBER_SUBSYSTEMS; i++) {
+            final long energyUJ = mMeasuredEnergySnapshots[i];
+            if (energyUJ == UNAVAILABLE) continue;
+            pw.print(MeasuredEnergyArray.SUBSYSTEM_NAMES[i]);
+            pw.print(" : ");
+            pw.print(energyUJ);
+            if (i != MeasuredEnergyArray.NUMBER_SUBSYSTEMS - 1) {
+                pw.print(", ");
+            }
+        }
+        pw.println();
+    }
+}
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 4da7825..360ed9d 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -93,6 +93,7 @@
 import android.app.AsyncNotedAppOp;
 import android.app.RuntimeAppOpAccessMessage;
 import android.app.SyncNotedAppOp;
+import android.app.admin.DevicePolicyManagerInternal;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -273,6 +274,8 @@
 
     private final AppOpsManagerInternalImpl mAppOpsManagerInternal
             = new AppOpsManagerInternalImpl();
+    @Nullable private final DevicePolicyManagerInternal dpmi =
+            LocalServices.getService(DevicePolicyManagerInternal.class);
 
     private final IPlatformCompat mPlatformCompat = IPlatformCompat.Stub.asInterface(
             ServiceManager.getService(Context.PLATFORM_COMPAT_SERVICE));
@@ -2690,6 +2693,10 @@
                     Ops pkgOps = ent.getValue();
                     for (int j=pkgOps.size()-1; j>=0; j--) {
                         Op curOp = pkgOps.valueAt(j);
+                        if (shouldDeferResetOpToDpm(curOp.op)) {
+                            deferResetOpToDpm(curOp.op, reqPackageName, reqUserId);
+                            continue;
+                        }
                         if (AppOpsManager.opAllowsReset(curOp.op)
                                 && curOp.mode != AppOpsManager.opToDefaultMode(curOp.op)) {
                             int previousMode = curOp.mode;
@@ -2739,16 +2746,27 @@
             }
         }
 
-        if (allChanges != null) {
-            int numChanges = allChanges.size();
-            for (int i = 0; i < numChanges; i++) {
-                ChangeRec change = allChanges.get(i);
-                notifyOpChangedSync(change.op, change.uid, change.pkg,
-                        AppOpsManager.opToDefaultMode(change.op), change.previous_mode);
-            }
+        int numChanges = allChanges.size();
+        for (int i = 0; i < numChanges; i++) {
+            ChangeRec change = allChanges.get(i);
+            notifyOpChangedSync(change.op, change.uid, change.pkg,
+                    AppOpsManager.opToDefaultMode(change.op), change.previous_mode);
         }
     }
 
+    private boolean shouldDeferResetOpToDpm(int op) {
+        // TODO(b/174582385): avoid special-casing app-op resets by migrating app-op permission
+        //  pre-grants to a role-based mechanism or another general-purpose mechanism.
+        return dpmi != null && dpmi.supportsResetOp(op);
+    }
+
+    /** Assumes {@link #shouldDeferResetOpToDpm(int)} is true. */
+    private void deferResetOpToDpm(int op, String packageName, @UserIdInt int userId) {
+        // TODO(b/174582385): avoid special-casing app-op resets by migrating app-op permission
+        //  pre-grants to a role-based mechanism or another general-purpose mechanism.
+        dpmi.resetOp(op, packageName, userId);
+    }
+
     private void evalAllForegroundOpsLocked() {
         for (int uidi = mUidStates.size() - 1; uidi >= 0; uidi--) {
             final UidState uidState = mUidStates.valueAt(uidi);
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 6bc927a..a04184c 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -2108,10 +2108,22 @@
         return getDevicesForAttributesInt(attributes);
     }
 
-    /** @see AudioManager#isMusicActive() */
-    public boolean isMusicActive() {
+    /**
+     * @see AudioManager#isMusicActive()
+     * @param remotely true if query is for remote playback (cast), false for local playback.
+     */
+    public boolean isMusicActive(boolean remotely) {
         // no permission required
-        return AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0);
+        final long token = Binder.clearCallingIdentity();
+        try {
+            if (remotely) {
+                return AudioSystem.isStreamActiveRemotely(AudioSystem.STREAM_MUSIC, 0);
+            } else {
+                return AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0);
+            }
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
     }
 
     protected @NonNull ArrayList<AudioDeviceAttributes> getDevicesForAttributesInt(
@@ -5181,7 +5193,7 @@
     /** only public for mocking/spying, do not call outside of AudioService */
     @VisibleForTesting
     public int getDeviceForStream(int stream) {
-        int device = getDevicesForStream(stream);
+        int device = getDevicesForStreamInt(stream);
         if ((device & (device - 1)) != 0) {
             // Multiple device selection is either:
             //  - speaker + one other device: give priority to speaker in this case.
@@ -5210,14 +5222,23 @@
         return device;
     }
 
-    private int getDevicesForStream(int stream) {
-        return getDevicesForStream(stream, true /*checkOthers*/);
+    /**
+     * @see AudioManager#getDevicesForStream(int)
+     */
+    public int getDevicesForStream(int streamType) {
+        ensureValidStreamType(streamType);
+        final long token = Binder.clearCallingIdentity();
+        try {
+            return mAudioSystem.getDevicesForStream(streamType);
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
     }
 
-    private int getDevicesForStream(int stream, boolean checkOthers) {
+    private int getDevicesForStreamInt(int stream) {
         ensureValidStreamType(stream);
         synchronized (VolumeStreamState.class) {
-            return mStreamStates[stream].observeDevicesForStream_syncVSS(checkOthers);
+            return mStreamStates[stream].observeDevicesForStream_syncVSS(true);
         }
     }
 
@@ -6402,10 +6423,10 @@
             }
             pw.println();
             pw.print("   Devices: ");
-            final int devices = getDevicesForStream(mStreamType);
+            final int devices = getDevicesForStreamInt(mStreamType);
             int device, i = 0, n = 0;
             // iterate all devices from 1 to DEVICE_OUT_DEFAULT exclusive
-            // (the default device is not returned by getDevicesForStream)
+            // (the default device is not returned by getDevicesForStreamInt)
             while ((device = 1 << i) != AudioSystem.DEVICE_OUT_DEFAULT) {
                 if ((devices & device) != 0) {
                     if (n++ > 0) {
@@ -7637,7 +7658,7 @@
                     mDeviceBroker.setForceUse_Async(AudioSystem.FOR_HDMI_SYSTEM_AUDIO, config,
                             "setHdmiSystemAudioSupported");
                 }
-                device = getDevicesForStream(AudioSystem.STREAM_MUSIC);
+                device = getDevicesForStreamInt(AudioSystem.STREAM_MUSIC);
             }
         }
         return device;
@@ -8777,8 +8798,14 @@
         mPlaybackMonitor.playerAttributes(piid, attr, Binder.getCallingUid());
     }
 
-    public void playerEvent(int piid, int event) {
-        mPlaybackMonitor.playerEvent(piid, event, Binder.getCallingUid());
+    /**
+     * Update player event
+     * @param piid Player id to update
+     * @param event The new player event
+     * @param deviceId The new player device id
+     */
+    public void playerEvent(int piid, int event, int deviceId) {
+        mPlaybackMonitor.playerEvent(piid, event, deviceId, Binder.getCallingUid());
     }
 
     public void playerHasOpPlayAudio(int piid, boolean hasOpPlayAudio) {
diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
index a577883..36c67cd 100644
--- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
@@ -233,15 +233,25 @@
         }
     }
 
-    public void playerEvent(int piid, int event, int binderUid) {
-        if (DEBUG) { Log.v(TAG, String.format("playerEvent(piid=%d, event=%d)", piid, event)); }
+    /**
+     * Update player event
+     * @param piid Player id to update
+     * @param event The new player event
+     * @param deviceId The new player device id
+     * @param binderUid Calling binder uid
+     */
+    public void playerEvent(int piid, int event, int deviceId, int binderUid) {
+        if (DEBUG) {
+            Log.v(TAG, String.format("playerEvent(piid=%d, deviceId=%d, event=%d)",
+                    piid, deviceId, event));
+        }
         final boolean change;
         synchronized(mPlayerLock) {
             final AudioPlaybackConfiguration apc = mPlayers.get(new Integer(piid));
             if (apc == null) {
                 return;
             }
-            sEventLogger.log(new PlayerEvent(piid, event));
+            sEventLogger.log(new PlayerEvent(piid, event, deviceId));
             if (event == AudioPlaybackConfiguration.PLAYER_STATE_STARTED) {
                 for (Integer uidInteger: mBannedUids) {
                     if (checkBanPlayer(apc, uidInteger.intValue())) {
@@ -259,7 +269,7 @@
             if (checkConfigurationCaller(piid, apc, binderUid)) {
                 //TODO add generation counter to only update to the latest state
                 checkVolumeForPrivilegedAlarm(apc, event);
-                change = apc.handleStateEvent(event);
+                change = apc.handleStateEvent(event, deviceId);
             } else {
                 Log.e(TAG, "Error handling event " + event);
                 change = false;
@@ -289,7 +299,8 @@
                 mPlayers.remove(new Integer(piid));
                 mDuckingManager.removeReleased(apc);
                 checkVolumeForPrivilegedAlarm(apc, AudioPlaybackConfiguration.PLAYER_STATE_RELEASED);
-                change = apc.handleStateEvent(AudioPlaybackConfiguration.PLAYER_STATE_RELEASED);
+                change = apc.handleStateEvent(AudioPlaybackConfiguration.PLAYER_STATE_RELEASED,
+                        AudioPlaybackConfiguration.PLAYER_DEVICEID_INVALID);
             }
         }
         if (change) {
@@ -868,16 +879,19 @@
         // only keeping the player interface ID as it uniquely identifies the player in the event
         final int mPlayerIId;
         final int mState;
+        final int mDeviceId;
 
-        PlayerEvent(int piid, int state) {
+        PlayerEvent(int piid, int state, int deviceId) {
             mPlayerIId = piid;
             mState = state;
+            mDeviceId = deviceId;
         }
 
         @Override
         public String eventToString() {
             return new StringBuilder("player piid:").append(mPlayerIId).append(" state:")
-                    .append(AudioPlaybackConfiguration.toLogFriendlyPlayerState(mState)).toString();
+                    .append(AudioPlaybackConfiguration.toLogFriendlyPlayerState(mState))
+                    .append(" DeviceId:").append(mDeviceId).toString();
         }
     }
 
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index cabfbc0..228ad588 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -246,7 +246,12 @@
         void checkInterruptAndDelay(boolean sleepLonger) throws InterruptedException;
     }
 
-    static class Dependencies {
+    @VisibleForTesting
+    public static class Dependencies {
+        public boolean isCallerSystem() {
+            return Binder.getCallingUid() == Process.SYSTEM_UID;
+        }
+
         public void startService(final String serviceName) {
             SystemService.start(serviceName);
         }
@@ -267,6 +272,10 @@
             return new File("/data/misc/vpn/state");
         }
 
+        public DeviceIdleInternal getDeviceIdleInternal() {
+            return LocalServices.getService(DeviceIdleInternal.class);
+        }
+
         public void sendArgumentsToDaemon(
                 final String daemon, final LocalSocket socket, final String[] arguments,
                 final RetryScheduler retryScheduler) throws IOException, InterruptedException {
@@ -373,6 +382,14 @@
     }
 
     @VisibleForTesting
+    public Vpn(Looper looper, Context context, Dependencies deps,
+            INetworkManagementService netService, INetd netd, @UserIdInt int userId,
+            @NonNull KeyStore keyStore) {
+        this(looper, context, deps, netService, netd, userId, keyStore,
+                new SystemServices(context), new Ikev2SessionCreator());
+    }
+
+    @VisibleForTesting
     protected Vpn(Looper looper, Context context, Dependencies deps,
             INetworkManagementService netService, INetd netd,
             int userId, @NonNull KeyStore keyStore, SystemServices systemServices,
@@ -772,8 +789,7 @@
 
             // Tell the OS that background services in this app need to be allowed for
             // a short time, so we can bootstrap the VPN service.
-            DeviceIdleInternal idleController =
-                    LocalServices.getService(DeviceIdleInternal.class);
+            DeviceIdleInternal idleController = mDeps.getDeviceIdleInternal();
             idleController.addPowerSaveTempWhitelistApp(Process.myUid(), alwaysOnPackage,
                     VPN_LAUNCH_IDLE_ALLOWLIST_DURATION_MS, mUserId, false, "vpn");
 
@@ -1959,10 +1975,6 @@
             return mContext.createContextAsUser(
                     UserHandle.of(userId), 0 /* flags */).getContentResolver();
         }
-
-        public boolean isCallerSystem() {
-            return Binder.getCallingUid() == Process.SYSTEM_UID;
-        }
     }
 
     private native int jniCreate(int mtu);
@@ -3112,7 +3124,7 @@
     @VisibleForTesting
     @Nullable
     VpnProfile getVpnProfilePrivileged(@NonNull String packageName, @NonNull KeyStore keyStore) {
-        if (!mSystemServices.isCallerSystem()) {
+        if (!mDeps.isCallerSystem()) {
             Log.wtf(TAG, "getVpnProfilePrivileged called as non-System UID ");
             return null;
         }
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
index a8e56a1..574d8c6 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
@@ -21,6 +21,7 @@
 import android.view.DisplayAddress;
 
 import com.android.server.display.config.DisplayConfiguration;
+import com.android.server.display.config.DisplayQuirks;
 import com.android.server.display.config.NitsMap;
 import com.android.server.display.config.Point;
 import com.android.server.display.config.XmlParser;
@@ -32,6 +33,7 @@
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -45,6 +47,8 @@
 
     public static final float HIGH_BRIGHTNESS_MODE_UNSUPPORTED = Float.NaN;
 
+    public static final String QUIRK_CAN_SET_BRIGHTNESS_VIA_HWC = "canSetBrightnessViaHwc";
+
     private static final String ETC_DIR = "etc";
     private static final String DISPLAY_CONFIG_DIR = "displayconfig";
     private static final String CONFIG_FILE_FORMAT = "display_%s.xml";
@@ -55,6 +59,7 @@
 
     private float[] mNits;
     private float[] mBrightness;
+    private List<String> mQuirks;
 
     private DisplayDeviceConfig() {
     }
@@ -134,11 +139,21 @@
         return mBrightness;
     }
 
+    /**
+     * @param quirkValue The quirk to test.
+     * @return {@code true} if the specified quirk is present in this configuration,
+     * {@code false} otherwise.
+     */
+    public boolean hasQuirk(String quirkValue) {
+        return mQuirks != null && mQuirks.contains(quirkValue);
+    }
+
     @Override
     public String toString() {
         String str = "DisplayDeviceConfig{"
                 + "mBrightness=" + Arrays.toString(mBrightness)
                 + ", mNits=" + Arrays.toString(mNits)
+                + ", mQuirks=" + mQuirks
                 + "}";
         return str;
     }
@@ -173,6 +188,7 @@
         try (InputStream in = new BufferedInputStream(new FileInputStream(configFile))) {
             final DisplayConfiguration config = XmlParser.read(in);
             loadBrightnessMap(config);
+            loadQuirks(config);
         } catch (IOException | DatatypeConfigurationException | XmlPullParserException e) {
             Slog.e(TAG, "Encountered an error while reading/parsing display config file: "
                     + configFile, e);
@@ -210,4 +226,11 @@
         mNits = nits;
         mBrightness = backlight;
     }
+
+    private void loadQuirks(DisplayConfiguration config) {
+        final DisplayQuirks quirks = config.getQuirks();
+        if (quirks != null) {
+            mQuirks = new ArrayList<>(quirks.getQuirk());
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 155b246..9b8ed3a 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -185,6 +185,7 @@
         private DisplayDeviceInfo mInfo;
         private boolean mHavePendingChanges;
         private int mState = Display.STATE_UNKNOWN;
+        // This is only set in the runnable returned from requestDisplayStateLocked.
         private float mBrightnessState = PowerManager.BRIGHTNESS_INVALID_FLOAT;
         private int mDefaultModeId;
         private int mDefaultConfigGroup;
@@ -227,7 +228,7 @@
             mDisplayDeviceConfig = null;
             // Defer configuration file loading
             BackgroundThread.getHandler().sendMessage(PooledLambda.obtainMessage(
-                    LocalDisplayDevice::loadDisplayConfigurationBrightnessMapping, this));
+                    LocalDisplayDevice::loadDisplayConfiguration, this));
         }
 
         @Override
@@ -409,7 +410,7 @@
             return mDisplayDeviceConfig;
         }
 
-        private void loadDisplayConfigurationBrightnessMapping() {
+        private void loadDisplayConfiguration() {
             Spline nitsToHal = null;
             Spline sysToNits = null;
 
@@ -419,6 +420,9 @@
                 return;
             }
 
+            mBacklightAdapter.setForceSurfaceControl(mDisplayDeviceConfig.hasQuirk(
+                    DisplayDeviceConfig.QUIRK_CAN_SET_BRIGHTNESS_VIA_HWC));
+
             final float[] halNits = mDisplayDeviceConfig.getNits();
             final float[] halBrightness = mDisplayDeviceConfig.getBrightness();
             if (halNits == null || halBrightness == null) {
@@ -648,10 +652,6 @@
                     updateDeviceInfoLocked();
                 }
 
-                if (brightnessChanged) {
-                    mBrightnessState = brightnessState;
-                }
-
                 // Defer actually setting the display state until after we have exited
                 // the critical section since it can take hundreds of milliseconds
                 // to complete.
@@ -691,6 +691,7 @@
                         // Apply brightness changes given that we are in a non-suspended state.
                         if (brightnessChanged || vrModeChange) {
                             setDisplayBrightness(brightnessState);
+                            mBrightnessState = brightnessState;
                         }
 
                         // Enter the final desired state, possibly suspended.
@@ -1208,6 +1209,14 @@
         private final LogicalLight mBacklight;
         private final boolean mUseSurfaceControlBrightness;
 
+        private boolean mForceSurfaceControl = false;
+
+        /**
+         * @param displayToken Token for display associated with this backlight.
+         * @param isDefaultDisplay {@code true} if it is the default display.
+         * @param forceSurfaceControl {@code true} if brightness should always be
+         *                            set via SurfaceControl API.
+         */
         BacklightAdapter(IBinder displayToken, boolean isDefaultDisplay) {
             mDisplayToken = displayToken;
 
@@ -1222,23 +1231,28 @@
             }
         }
 
-        public void setBrightness(float brightness) {
-            if (mUseSurfaceControlBrightness) {
+        void setBrightness(float brightness) {
+            if (mUseSurfaceControlBrightness || mForceSurfaceControl) {
                 SurfaceControl.setDisplayBrightness(mDisplayToken, brightness);
             } else if (mBacklight != null) {
                 mBacklight.setBrightness(brightness);
             }
         }
 
-        public void setVrMode(boolean isVrModeEnabled) {
+        void setVrMode(boolean isVrModeEnabled) {
             if (mBacklight != null) {
                 mBacklight.setVrMode(isVrModeEnabled);
             }
         }
 
+        void setForceSurfaceControl(boolean forceSurfaceControl) {
+            mForceSurfaceControl = forceSurfaceControl;
+        }
+
         @Override
         public String toString() {
             return "BacklightAdapter [useSurfaceControl=" + mUseSurfaceControlBrightness
+                    + " (force_anyway? " + mForceSurfaceControl + ")"
                     + ", backlight=" + mBacklight + "]";
         }
     }
diff --git a/services/core/java/com/android/server/hdmi/DevicePowerStatusAction.java b/services/core/java/com/android/server/hdmi/DevicePowerStatusAction.java
index b52ab76..1a0a639 100644
--- a/services/core/java/com/android/server/hdmi/DevicePowerStatusAction.java
+++ b/services/core/java/com/android/server/hdmi/DevicePowerStatusAction.java
@@ -20,6 +20,7 @@
 import android.hardware.hdmi.HdmiPlaybackClient;
 import android.hardware.hdmi.HdmiPlaybackClient.DisplayStatusCallback;
 import android.hardware.hdmi.IHdmiControlCallback;
+import android.hardware.tv.cec.V1_0.SendMessageResult;
 import android.os.RemoteException;
 import android.util.Slog;
 
@@ -42,6 +43,10 @@
     private final int mTargetAddress;
     private final List<IHdmiControlCallback> mCallbacks = new ArrayList<>();
 
+    // Retry the power status query as it might happen when the target device is waking up. In
+    // that case a device may be quite busy and can fail to respond within the 2s timeout.
+    private int mRetriesOnTimeout = 1;
+
     static DevicePowerStatusAction create(HdmiCecLocalDevice source,
             int targetAddress, IHdmiControlCallback callback) {
         if (source == null || callback == null) {
@@ -68,13 +73,21 @@
 
     private void queryDevicePowerStatus() {
         sendCommand(HdmiCecMessageBuilder.buildGiveDevicePowerStatus(getSourceAddress(),
-                mTargetAddress));
+                mTargetAddress), error -> {
+                // Don't retry on timeout if the remote device didn't even ACK the message. Assume
+                // the device is not present or not capable of CEC.
+                if (error == SendMessageResult.NACK) {
+                    // Got no response from TV. Report status 'unknown'.
+                    invokeCallback(HdmiControlManager.POWER_STATUS_UNKNOWN);
+                    finish();
+                }
+            });
     }
 
     @Override
     boolean processCommand(HdmiCecMessage cmd) {
         if (mState != STATE_WAITING_FOR_REPORT_POWER_STATUS
-               || mTargetAddress != cmd.getSource()) {
+                || mTargetAddress != cmd.getSource()) {
             return false;
         }
         if (cmd.getOpcode() == Constants.MESSAGE_REPORT_POWER_STATUS) {
@@ -92,6 +105,12 @@
             return;
         }
         if (state == STATE_WAITING_FOR_REPORT_POWER_STATUS) {
+            if (mRetriesOnTimeout > 0) {
+                mRetriesOnTimeout--;
+                start();
+                return;
+            }
+
             // Got no response from TV. Report status 'unknown'.
             invokeCallback(HdmiControlManager.POWER_STATUS_UNKNOWN);
             finish();
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecController.java b/services/core/java/com/android/server/hdmi/HdmiCecController.java
index bbd5ac3..ddb0141 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecController.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecController.java
@@ -26,6 +26,8 @@
 import android.hardware.tv.cec.V1_0.IHdmiCecCallback;
 import android.hardware.tv.cec.V1_0.Result;
 import android.hardware.tv.cec.V1_0.SendMessageResult;
+import android.icu.util.IllformedLocaleException;
+import android.icu.util.ULocale;
 import android.os.Handler;
 import android.os.IHwBinder;
 import android.os.Looper;
@@ -33,6 +35,7 @@
 import android.stats.hdmi.HdmiStatsEnums;
 import android.util.Slog;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.server.hdmi.HdmiAnnotations.IoThreadOnly;
@@ -49,8 +52,6 @@
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.function.Predicate;
 
-import sun.util.locale.LanguageTag;
-
 /**
  * Manages HDMI-CEC command and behaviors. It converts user's command into CEC command
  * and pass it to CEC HAL so that it sends message to other device. For incoming
@@ -352,13 +353,31 @@
     @ServiceThreadOnly
     void setLanguage(String language) {
         assertRunOnServiceThread();
-        if (!LanguageTag.isLanguage(language)) {
+        if (!isLanguage(language)) {
             return;
         }
         mNativeWrapperImpl.nativeSetLanguage(language);
     }
 
     /**
+     * Returns true if the language code is well-formed.
+     */
+    @VisibleForTesting static boolean isLanguage(String language) {
+        // Handle null and empty string because because ULocale.Builder#setLanguage accepts them.
+        if (language == null || language.isEmpty()) {
+            return false;
+        }
+
+        ULocale.Builder builder = new ULocale.Builder();
+        try {
+            builder.setLanguage(language);
+            return true;
+        } catch (IllformedLocaleException e) {
+            return false;
+        }
+    }
+
+    /**
      * Configure ARC circuit in the hardware logic to start or stop the feature.
      *
      * @param port ID of HDMI port to which AVR is connected
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index c943fbc..c15fdca 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -66,6 +66,8 @@
 import android.os.PowerManager;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ShellCallback;
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.os.UserHandle;
@@ -1653,6 +1655,12 @@
         }
 
         @Override
+        public boolean shouldHandleTvPowerKey() {
+            enforceAccessPermission();
+            return HdmiControlService.this.shouldHandleTvPowerKey();
+        }
+
+        @Override
         public void queryDisplayStatus(final IHdmiControlCallback callback) {
             enforceAccessPermission();
             runOnServiceThread(new Runnable() {
@@ -2143,6 +2151,16 @@
         }
 
         @Override
+        public void onShellCommand(@Nullable FileDescriptor in, @Nullable FileDescriptor out,
+                @Nullable FileDescriptor err, String[] args,
+                @Nullable ShellCallback callback, ResultReceiver resultReceiver)
+                throws RemoteException {
+            enforceAccessPermission();
+            new HdmiControlShellCommand(this)
+                    .exec(this, in, out, err, args, callback, resultReceiver);
+        }
+
+        @Override
         protected void dump(FileDescriptor fd, final PrintWriter writer, String[] args) {
             if (!DumpUtils.checkDumpPermission(getContext(), TAG, writer)) return;
             final IndentingPrintWriter pw = new IndentingPrintWriter(writer, "  ");
@@ -2334,6 +2352,24 @@
         source.toggleAndFollowTvPower();
     }
 
+    @VisibleForTesting
+    protected boolean shouldHandleTvPowerKey() {
+        if (isTvDevice()) {
+            return false;
+        }
+        String powerControlMode = getHdmiCecConfig().getStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE);
+        if (powerControlMode.equals(HdmiControlManager.POWER_CONTROL_MODE_NONE)) {
+            return false;
+        }
+        int hdmiCecEnabled = getHdmiCecConfig().getIntValue(
+                HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED);
+        if (hdmiCecEnabled != HdmiControlManager.HDMI_CEC_CONTROL_ENABLED) {
+            return false;
+        }
+        return true;
+    }
+
     @ServiceThreadOnly
     protected void queryDisplayStatus(final IHdmiControlCallback callback) {
         assertRunOnServiceThread();
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlShellCommand.java b/services/core/java/com/android/server/hdmi/HdmiControlShellCommand.java
new file mode 100644
index 0000000..ee3427f
--- /dev/null
+++ b/services/core/java/com/android/server/hdmi/HdmiControlShellCommand.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.hdmi;
+
+
+import android.hardware.hdmi.HdmiControlManager;
+import android.hardware.hdmi.IHdmiControlCallback;
+import android.hardware.hdmi.IHdmiControlService;
+import android.os.RemoteException;
+import android.os.ShellCommand;
+import android.util.Slog;
+
+import java.io.PrintWriter;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+final class HdmiControlShellCommand extends ShellCommand {
+
+    private static final String TAG = "HdmiShellCommand";
+
+    private final IHdmiControlService.Stub mBinderService;
+
+
+    HdmiControlShellCommand(IHdmiControlService.Stub binderService) {
+        mBinderService = binderService;
+    }
+
+    @Override
+    public int onCommand(String cmd) {
+        if (cmd == null) {
+            return handleDefaultCommands(cmd);
+        }
+
+        try {
+            return handleShellCommand(cmd);
+        } catch (Exception e) {
+            getErrPrintWriter().println(
+                    "Caught error for command '" + cmd + "': " + e.getMessage());
+            Slog.e(TAG, "Error handling hdmi_control shell command: " + cmd, e);
+            return 1;
+        }
+    }
+
+    @Override
+    public void onHelp() {
+        PrintWriter pw = getOutPrintWriter();
+
+        pw.println("HdmiControlManager (hdmi_control) commands:");
+        pw.println("  help");
+        pw.println("      Print this help text.");
+        pw.println("  onetouchplay, otp");
+        pw.println("      Send the \"One Touch Play\" feature from a source to the TV");
+        pw.println("  vendorcommand --device_type <originating device type>");
+        pw.println("                --destination <destination device>");
+        pw.println("                --args <vendor specific arguments>");
+        pw.println("                [--id <true if vendor command should be sent with vendor id>]");
+        pw.println("      Send a Vendor Command to the given target device");
+    }
+
+    private int handleShellCommand(String cmd) throws RemoteException {
+        PrintWriter pw = getOutPrintWriter();
+
+        switch (cmd) {
+            case "otp":
+            case "onetouchplay":
+                return oneTouchPlay(pw);
+            case "vendorcommand":
+                return vendorCommand(pw);
+        }
+
+        getErrPrintWriter().println("Unhandled command: " + cmd);
+        return 1;
+    }
+
+    private int oneTouchPlay(PrintWriter pw) throws RemoteException {
+        final CountDownLatch latch = new CountDownLatch(1);
+        AtomicInteger cecResult = new AtomicInteger();
+        pw.print("Sending One Touch Play...");
+        mBinderService.oneTouchPlay(new IHdmiControlCallback.Stub() {
+            @Override
+            public void onComplete(int result) {
+                pw.println(" done (" + result + ")");
+                latch.countDown();
+                cecResult.set(result);
+            }
+        });
+
+        try {
+            if (!latch.await(HdmiConfig.TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+                getErrPrintWriter().println("One Touch Play timed out.");
+                return 1;
+            }
+        } catch (InterruptedException e) {
+            getErrPrintWriter().println("Caught InterruptedException");
+            Thread.currentThread().interrupt();
+        }
+        return cecResult.get() == HdmiControlManager.RESULT_SUCCESS ? 0 : 1;
+    }
+
+    private int vendorCommand(PrintWriter pw) throws RemoteException {
+        if (6 > getRemainingArgsCount()) {
+            throw new IllegalArgumentException("Expected 3 arguments.");
+        }
+
+        int deviceType = -1;
+        int destination = -1;
+        String parameters = "";
+        boolean hasVendorId = false;
+
+        String arg = getNextOption();
+        while (arg != null) {
+            switch (arg) {
+                case "-t":
+                case "--device_type":
+                    deviceType = Integer.parseInt(getNextArgRequired());
+                    break;
+                case "-d":
+                case "--destination":
+                    destination = Integer.parseInt(getNextArgRequired());
+                    break;
+                case "-a":
+                case "--args":
+                    parameters = getNextArgRequired();
+                    break;
+                case "-i":
+                case "--id":
+                    hasVendorId = Boolean.parseBoolean(getNextArgRequired());
+                    break;
+                default:
+                    throw new IllegalArgumentException("Unknown argument: " + arg);
+            }
+            arg = getNextArg();
+        }
+
+        String[] parts = parameters.split(":");
+        byte[] params = new byte[parts.length];
+        for (int i = 0; i < params.length; i++) {
+            params[i] = (byte) Integer.parseInt(parts[i], 16);
+        }
+
+        pw.println("Sending <Vendor Command>");
+        mBinderService.sendVendorCommand(deviceType, destination, params, hasVendorId);
+        return 0;
+    }
+}
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 46ccf1e..bfc751f 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -158,6 +158,9 @@
             "com.snapchat.android" // b/173297887
     };
 
+    /** TODO(b/169067926): Remove this. */
+    private static final boolean UNTRUSTED_TOUCHES_TOAST = false;
+
     // Pointer to native input manager service object.
     private final long mPtr;
 
@@ -285,7 +288,8 @@
     private static native void nativeSetPointerIconType(long ptr, int iconId);
     private static native void nativeReloadPointerIcons(long ptr);
     private static native void nativeSetCustomPointerIcon(long ptr, PointerIcon icon);
-    private static native void nativeSetPointerCapture(long ptr, boolean detached);
+    private static native void nativeRequestPointerCapture(long ptr, IBinder windowToken,
+            boolean enabled);
     private static native boolean nativeCanDispatchToDisplay(long ptr, int deviceId, int displayId);
     private static native void nativeNotifyPortAssociationsChanged(long ptr);
     private static native void nativeSetMotionClassifierEnabled(long ptr, boolean enabled);
@@ -1611,12 +1615,12 @@
     }
 
     @Override
-    public void requestPointerCapture(IBinder windowToken, boolean enabled) {
-        boolean requestConfigurationRefresh =
-                mWindowManagerCallbacks.requestPointerCapture(windowToken, enabled);
-        if (requestConfigurationRefresh) {
-            nativeSetPointerCapture(mPtr, enabled);
+    public void requestPointerCapture(IBinder inputChannelToken, boolean enabled) {
+        if (inputChannelToken == null) {
+            return;
         }
+
+        nativeRequestPointerCapture(mPtr, inputChannelToken, enabled);
     }
 
     public void setInputDispatchMode(boolean enabled, boolean frozen) {
@@ -2189,17 +2193,14 @@
 
     // Native callback
     private void notifyFocusChanged(IBinder oldToken, IBinder newToken) {
-        final boolean requestConfigurationRefresh =
-                mWindowManagerCallbacks.notifyFocusChanged(oldToken, newToken);
-        if (requestConfigurationRefresh) {
-            nativeSetPointerCapture(mPtr, false);
-        }
+        mWindowManagerCallbacks.notifyFocusChanged(oldToken, newToken);
     }
 
     // Native callback
     private void notifyUntrustedTouch(String packageName) {
         // TODO(b/169067926): Remove toast after gathering feedback on dogfood.
-        if (ArrayUtils.contains(PACKAGE_BLOCKLIST_FOR_UNTRUSTED_TOUCHES_TOAST, packageName)) {
+        if (!UNTRUSTED_TOUCHES_TOAST || ArrayUtils.contains(
+                PACKAGE_BLOCKLIST_FOR_UNTRUSTED_TOUCHES_TOAST, packageName)) {
             Log.i(TAG, "Suppressing untrusted touch toast for " + packageName);
             return;
         }
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 6395094..90edd77 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -159,6 +159,7 @@
 import com.android.internal.compat.IPlatformCompat;
 import com.android.internal.content.PackageMonitor;
 import com.android.internal.inputmethod.CallbackUtils;
+import com.android.internal.inputmethod.IBooleanResultCallback;
 import com.android.internal.inputmethod.IInputBindResultResultCallback;
 import com.android.internal.inputmethod.IInputContentUriToken;
 import com.android.internal.inputmethod.IInputMethodPrivilegedOperations;
@@ -3150,41 +3151,44 @@
     }
 
     @Override
-    public boolean showSoftInput(IInputMethodClient client, IBinder windowToken, int flags,
-            ResultReceiver resultReceiver) {
-        Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.showSoftInput");
-        int uid = Binder.getCallingUid();
-        ImeTracing.getInstance().triggerManagerServiceDump(
-                "InputMethodManagerService#showSoftInput");
-        synchronized (mMethodMap) {
-            if (!calledFromValidUserLocked()) {
-                return false;
-            }
-            final long ident = Binder.clearCallingIdentity();
-            try {
-                if (mCurClient == null || client == null
-                        || mCurClient.client.asBinder() != client.asBinder()) {
-                    // We need to check if this is the current client with
-                    // focus in the window manager, to allow this call to
-                    // be made before input is started in it.
-                    final ClientState cs = mClients.get(client.asBinder());
-                    if (cs == null) {
-                        throw new IllegalArgumentException("unknown client " + client.asBinder());
-                    }
-                    if (!mWindowManagerInternal.isInputMethodClientFocus(cs.uid, cs.pid,
-                            cs.selfReportedDisplayId)) {
-                        Slog.w(TAG, "Ignoring showSoftInput of uid " + uid + ": " + client);
-                        return false;
-                    }
+    public void showSoftInput(IInputMethodClient client, IBinder windowToken, int flags,
+            ResultReceiver resultReceiver, IBooleanResultCallback resultCallback) {
+        CallbackUtils.onResult(resultCallback, () -> {
+            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.showSoftInput");
+            int uid = Binder.getCallingUid();
+            ImeTracing.getInstance().triggerManagerServiceDump(
+                    "InputMethodManagerService#showSoftInput");
+            synchronized (mMethodMap) {
+                if (!calledFromValidUserLocked()) {
+                    return false;
                 }
-                if (DEBUG) Slog.v(TAG, "Client requesting input be shown");
-                return showCurrentInputLocked(windowToken, flags, resultReceiver,
-                        SoftInputShowHideReason.SHOW_SOFT_INPUT);
-            } finally {
-                Binder.restoreCallingIdentity(ident);
-                Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+                final long ident = Binder.clearCallingIdentity();
+                try {
+                    if (mCurClient == null || client == null
+                            || mCurClient.client.asBinder() != client.asBinder()) {
+                        // We need to check if this is the current client with
+                        // focus in the window manager, to allow this call to
+                        // be made before input is started in it.
+                        final ClientState cs = mClients.get(client.asBinder());
+                        if (cs == null) {
+                            throw new IllegalArgumentException(
+                                    "unknown client " + client.asBinder());
+                        }
+                        if (!mWindowManagerInternal.isInputMethodClientFocus(cs.uid, cs.pid,
+                                cs.selfReportedDisplayId)) {
+                            Slog.w(TAG, "Ignoring showSoftInput of uid " + uid + ": " + client);
+                            return false;
+                        }
+                    }
+                    if (DEBUG) Slog.v(TAG, "Client requesting input be shown");
+                    return showCurrentInputLocked(windowToken, flags, resultReceiver,
+                                    SoftInputShowHideReason.SHOW_SOFT_INPUT);
+                } finally {
+                    Binder.restoreCallingIdentity(ident);
+                    Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+                }
             }
-        }
+        });
     }
 
     @BinderThread
@@ -3266,44 +3270,49 @@
     }
 
     @Override
-    public boolean hideSoftInput(IInputMethodClient client, IBinder windowToken, int flags,
-            ResultReceiver resultReceiver) {
-        int uid = Binder.getCallingUid();
-        ImeTracing.getInstance().triggerManagerServiceDump(
-                "InputMethodManagerService#hideSoftInput");
-        synchronized (mMethodMap) {
-            if (!calledFromValidUserLocked()) {
-                return false;
-            }
-            final long ident = Binder.clearCallingIdentity();
-            try {
-                Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.hideSoftInput");
-                if (mCurClient == null || client == null
-                        || mCurClient.client.asBinder() != client.asBinder()) {
-                    // We need to check if this is the current client with
-                    // focus in the window manager, to allow this call to
-                    // be made before input is started in it.
-                    final ClientState cs = mClients.get(client.asBinder());
-                    if (cs == null) {
-                        throw new IllegalArgumentException("unknown client " + client.asBinder());
-                    }
-                    if (!mWindowManagerInternal.isInputMethodClientFocus(cs.uid, cs.pid,
-                            cs.selfReportedDisplayId)) {
-                        if (DEBUG) {
-                            Slog.w(TAG, "Ignoring hideSoftInput of uid " + uid + ": " + client);
-                        }
-                        return false;
-                    }
+    public void hideSoftInput(IInputMethodClient client, IBinder windowToken, int flags,
+            ResultReceiver resultReceiver, IBooleanResultCallback resultCallback) {
+        CallbackUtils.onResult(resultCallback, () -> {
+            int uid = Binder.getCallingUid();
+            ImeTracing.getInstance().triggerManagerServiceDump(
+                    "InputMethodManagerService#hideSoftInput");
+            synchronized (mMethodMap) {
+                if (!InputMethodManagerService.this.calledFromValidUserLocked()) {
+                    return false;
                 }
+                final long ident = Binder.clearCallingIdentity();
+                try {
+                    Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.hideSoftInput");
+                    if (mCurClient == null || client == null
+                            || mCurClient.client.asBinder() != client.asBinder()) {
+                        // We need to check if this is the current client with
+                        // focus in the window manager, to allow this call to
+                        // be made before input is started in it.
+                        final ClientState cs = mClients.get(client.asBinder());
+                        if (cs == null) {
+                            throw new IllegalArgumentException(
+                                    "unknown client " + client.asBinder());
+                        }
+                        if (!mWindowManagerInternal.isInputMethodClientFocus(cs.uid, cs.pid,
+                                cs.selfReportedDisplayId)) {
+                            if (DEBUG) {
+                                Slog.w(TAG,
+                                        "Ignoring hideSoftInput of uid " + uid + ": " + client);
+                            }
+                            return false;
+                        }
+                    }
 
-                if (DEBUG) Slog.v(TAG, "Client requesting input be hidden");
-                return hideCurrentInputLocked(windowToken, flags, resultReceiver,
-                        SoftInputShowHideReason.HIDE_SOFT_INPUT);
-            } finally {
-                Binder.restoreCallingIdentity(ident);
-                Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+                    if (DEBUG) Slog.v(TAG, "Client requesting input be hidden");
+                    return InputMethodManagerService.this.hideCurrentInputLocked(windowToken,
+                            flags, resultReceiver,
+                            SoftInputShowHideReason.HIDE_SOFT_INPUT);
+                } finally {
+                    Binder.restoreCallingIdentity(ident);
+                    Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+                }
             }
-        }
+        });
     }
 
     boolean hideCurrentInputLocked(IBinder windowToken, int flags, ResultReceiver resultReceiver,
@@ -3726,9 +3735,15 @@
                 MSG_SHOW_IM_SUBTYPE_PICKER, auxiliarySubtypeMode, displayId));
     }
 
-    public boolean isInputMethodPickerShownForTest() {
+    /**
+     * A test API for CTS to make sure that the input method menu is showing.
+     *
+     * @param resultCallback {@code true} while the input method menu is showing UI.
+     */
+    public void isInputMethodPickerShownForTest(IBooleanResultCallback resultCallback) {
         synchronized(mMethodMap) {
-            return mMenuController.isisInputMethodPickerShownForTestLocked();
+            CallbackUtils.onResult(
+                    resultCallback, mMenuController::isisInputMethodPickerShownForTestLocked);
         }
     }
 
@@ -4120,8 +4135,8 @@
 
     @BinderThread
     @Override
-    public boolean isImeTraceEnabled() {
-        return ImeTracing.getInstance().isEnabled();
+    public void isImeTraceEnabled(IBooleanResultCallback resultCallback) {
+        CallbackUtils.onResult(resultCallback, () -> ImeTracing.getInstance().isEnabled());
     }
 
     @BinderThread
diff --git a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java
index 6bdae63..ccb78a4 100644
--- a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java
@@ -73,6 +73,7 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.inputmethod.CallbackUtils;
+import com.android.internal.inputmethod.IBooleanResultCallback;
 import com.android.internal.inputmethod.IInputBindResultResultCallback;
 import com.android.internal.inputmethod.IMultiClientInputMethod;
 import com.android.internal.inputmethod.IMultiClientInputMethodPrivilegedOperations;
@@ -1501,7 +1502,15 @@
 
         @BinderThread
         @Override
-        public boolean showSoftInput(
+        public void showSoftInput(
+                IInputMethodClient client, IBinder token, int flags,
+                ResultReceiver resultReceiver, IBooleanResultCallback resultCallback) {
+            CallbackUtils.onResult(resultCallback,
+                    () -> showSoftInputInternal(client, token, flags, resultReceiver));
+        }
+
+        @BinderThread
+        private boolean showSoftInputInternal(
                 IInputMethodClient client, IBinder token, int flags,
                 ResultReceiver resultReceiver) {
             final int callingUid = Binder.getCallingUid();
@@ -1548,7 +1557,16 @@
 
         @BinderThread
         @Override
-        public boolean hideSoftInput(
+        public void hideSoftInput(
+                IInputMethodClient client, IBinder windowToken, int flags,
+                ResultReceiver resultReceiver, IBooleanResultCallback resultCallback) {
+            CallbackUtils.onResult(resultCallback,
+                    () -> hideSoftInputInternal(client, windowToken, flags, resultReceiver));
+
+        }
+
+        @BinderThread
+        private boolean hideSoftInputInternal(
                 IInputMethodClient client, IBinder windowToken, int flags,
                 ResultReceiver resultReceiver) {
             final int callingUid = Binder.getCallingUid();
@@ -1768,9 +1786,9 @@
 
         @BinderThread
         @Override
-        public boolean isInputMethodPickerShownForTest() {
+        public void isInputMethodPickerShownForTest(IBooleanResultCallback resultCallback) {
             reportNotSupported();
-            return false;
+            CallbackUtils.onResult(resultCallback, () -> false);
         }
 
         @BinderThread
@@ -1834,8 +1852,8 @@
 
         @BinderThread
         @Override
-        public boolean isImeTraceEnabled() {
-            return false;
+        public void isImeTraceEnabled(IBooleanResultCallback resultCallback) {
+            CallbackUtils.onResult(resultCallback, () -> false);
         }
 
         @BinderThread
diff --git a/services/core/java/com/android/server/location/timezone/BinderLocationTimeZoneProvider.java b/services/core/java/com/android/server/location/timezone/BinderLocationTimeZoneProvider.java
index fd8cf70..b9c23b7 100644
--- a/services/core/java/com/android/server/location/timezone/BinderLocationTimeZoneProvider.java
+++ b/services/core/java/com/android/server/location/timezone/BinderLocationTimeZoneProvider.java
@@ -17,20 +17,17 @@
 package com.android.server.location.timezone;
 
 import static com.android.server.location.timezone.LocationTimeZoneManagerService.debugLog;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_DISABLED;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_ENABLED_CERTAIN;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_ENABLED_INITIALIZING;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_ENABLED_UNCERTAIN;
 import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_PERM_FAILED;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_CERTAIN;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_INITIALIZING;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_UNCERTAIN;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STOPPED;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.util.IndentingPrintWriter;
 import android.util.Slog;
 
-import com.android.internal.location.timezone.LocationTimeZoneEvent;
-import com.android.internal.location.timezone.LocationTimeZoneProviderRequest;
-
 import java.time.Duration;
 import java.util.Objects;
 
@@ -57,9 +54,9 @@
     void onInitialize() {
         mProxy.initialize(new LocationTimeZoneProviderProxy.Listener() {
             @Override
-            public void onReportLocationTimeZoneEvent(
-                    @NonNull LocationTimeZoneEvent locationTimeZoneEvent) {
-                handleLocationTimeZoneEvent(locationTimeZoneEvent);
+            public void onReportTimeZoneProviderEvent(
+                    @NonNull TimeZoneProviderEvent timeZoneProviderEvent) {
+                handleTimeZoneProviderEvent(timeZoneProviderEvent);
             }
 
             @Override
@@ -80,27 +77,27 @@
         synchronized (mSharedLock) {
             ProviderState currentState = mCurrentState.get();
             switch (currentState.stateEnum) {
-                case PROVIDER_STATE_ENABLED_INITIALIZING:
-                case PROVIDER_STATE_ENABLED_UNCERTAIN:
-                case PROVIDER_STATE_ENABLED_CERTAIN: {
+                case PROVIDER_STATE_STARTED_INITIALIZING:
+                case PROVIDER_STATE_STARTED_UNCERTAIN:
+                case PROVIDER_STATE_STARTED_CERTAIN: {
                     // Losing a remote provider is treated as becoming uncertain.
                     String msg = "handleProviderLost reason=" + reason
                             + ", mProviderName=" + mProviderName
                             + ", currentState=" + currentState;
                     debugLog(msg);
-                    // This is an unusual PROVIDER_STATE_ENABLED_UNCERTAIN state because
+                    // This is an unusual PROVIDER_STATE_STARTED_UNCERTAIN state because
                     // event == null
                     ProviderState newState = currentState.newState(
-                            PROVIDER_STATE_ENABLED_UNCERTAIN, null,
+                            PROVIDER_STATE_STARTED_UNCERTAIN, null,
                             currentState.currentUserConfiguration, msg);
                     setCurrentState(newState, true);
                     break;
                 }
-                case PROVIDER_STATE_DISABLED: {
+                case PROVIDER_STATE_STOPPED: {
                     debugLog("handleProviderLost reason=" + reason
                             + ", mProviderName=" + mProviderName
                             + ", currentState=" + currentState
-                            + ": No state change required, provider is disabled.");
+                            + ": No state change required, provider is stopped.");
                     break;
                 }
                 case PROVIDER_STATE_PERM_FAILED: {
@@ -123,16 +120,16 @@
         synchronized (mSharedLock) {
             ProviderState currentState = mCurrentState.get();
             switch (currentState.stateEnum) {
-                case PROVIDER_STATE_ENABLED_INITIALIZING:
-                case PROVIDER_STATE_ENABLED_CERTAIN:
-                case PROVIDER_STATE_ENABLED_UNCERTAIN: {
+                case PROVIDER_STATE_STARTED_INITIALIZING:
+                case PROVIDER_STATE_STARTED_CERTAIN:
+                case PROVIDER_STATE_STARTED_UNCERTAIN: {
                     debugLog("handleOnProviderBound mProviderName=" + mProviderName
-                            + ", currentState=" + currentState + ": Provider is enabled.");
+                            + ", currentState=" + currentState + ": Provider is started.");
                     break;
                 }
-                case PROVIDER_STATE_DISABLED: {
+                case PROVIDER_STATE_STOPPED: {
                     debugLog("handleOnProviderBound mProviderName=" + mProviderName
-                            + ", currentState=" + currentState + ": Provider is disabled.");
+                            + ", currentState=" + currentState + ": Provider is stopped.");
                     break;
                 }
                 case PROVIDER_STATE_PERM_FAILED: {
@@ -150,23 +147,17 @@
     }
 
     @Override
-    void onEnable(@NonNull Duration initializationTimeout) {
+    void onStartUpdates(@NonNull Duration initializationTimeout) {
         // Set a request on the proxy - it will be sent immediately if the service is bound,
         // or will be sent as soon as the service becomes bound.
-        LocationTimeZoneProviderRequest request =
-                new LocationTimeZoneProviderRequest.Builder()
-                        .setReportLocationTimeZone(true)
-                        .setInitializationTimeoutMillis(initializationTimeout.toMillis())
-                        .build();
+        TimeZoneProviderRequest request =
+                TimeZoneProviderRequest.createStartUpdatesRequest(initializationTimeout);
         mProxy.setRequest(request);
     }
 
     @Override
-    void onDisable() {
-        LocationTimeZoneProviderRequest request =
-                new LocationTimeZoneProviderRequest.Builder()
-                        .setReportLocationTimeZone(false)
-                        .build();
+    void onStopUpdates() {
+        TimeZoneProviderRequest request = TimeZoneProviderRequest.createStopUpdatesRequest();
         mProxy.setRequest(request);
     }
 
diff --git a/services/core/java/com/android/server/location/timezone/ControllerImpl.java b/services/core/java/com/android/server/location/timezone/ControllerImpl.java
index 07615ff5..7496168 100644
--- a/services/core/java/com/android/server/location/timezone/ControllerImpl.java
+++ b/services/core/java/com/android/server/location/timezone/ControllerImpl.java
@@ -16,24 +16,24 @@
 
 package com.android.server.location.timezone;
 
-import static com.android.internal.location.timezone.LocationTimeZoneEvent.EVENT_TYPE_PERMANENT_FAILURE;
-import static com.android.internal.location.timezone.LocationTimeZoneEvent.EVENT_TYPE_SUCCESS;
-import static com.android.internal.location.timezone.LocationTimeZoneEvent.EVENT_TYPE_UNCERTAIN;
 import static com.android.server.location.timezone.LocationTimeZoneManagerService.debugLog;
 import static com.android.server.location.timezone.LocationTimeZoneManagerService.warnLog;
 import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_DISABLED;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_ENABLED_CERTAIN;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_ENABLED_INITIALIZING;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_ENABLED_UNCERTAIN;
 import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_PERM_FAILED;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_CERTAIN;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_INITIALIZING;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_UNCERTAIN;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STOPPED;
+import static com.android.server.location.timezone.TimeZoneProviderEvent.EVENT_TYPE_PERMANENT_FAILURE;
+import static com.android.server.location.timezone.TimeZoneProviderEvent.EVENT_TYPE_SUGGESTION;
+import static com.android.server.location.timezone.TimeZoneProviderEvent.EVENT_TYPE_UNCERTAIN;
 
+import android.annotation.DurationMillisLong;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.util.IndentingPrintWriter;
 
 import com.android.internal.annotations.GuardedBy;
-import com.android.internal.location.timezone.LocationTimeZoneEvent;
 import com.android.server.location.timezone.ThreadingDomain.SingleRunnableQueue;
 import com.android.server.timezonedetector.ConfigurationInternal;
 import com.android.server.timezonedetector.GeolocationTimeZoneSuggestion;
@@ -46,9 +46,9 @@
  * A real implementation of {@link LocationTimeZoneProviderController} that supports a primary and a
  * secondary {@link LocationTimeZoneProvider}.
  *
- * <p>The primary is used until it fails or becomes uncertain. The secondary will then be enabled.
+ * <p>The primary is used until it fails or becomes uncertain. The secondary will then be started.
  * The controller will immediately make suggestions based on "certain" {@link
- * LocationTimeZoneEvent}s, i.e. events that demonstrate the provider is certain what the time zone
+ * TimeZoneProviderEvent}s, i.e. events that demonstrate the provider is certain what the time zone
  * is. The controller will not make immediate suggestions based on "uncertain" events, giving
  * providers time to change their mind. This also gives the secondary provider time to initialize
  * when the primary becomes uncertain.
@@ -107,7 +107,7 @@
             mPrimaryProvider.initialize(providerListener);
             mSecondaryProvider.initialize(providerListener);
 
-            alterProvidersEnabledStateIfRequired(
+            alterProvidersStartedStateIfRequired(
                     null /* oldConfiguration */, mCurrentUserConfiguration);
         }
     }
@@ -125,15 +125,15 @@
 
             if (!newConfig.equals(oldConfig)) {
                 if (newConfig.getUserId() != oldConfig.getUserId()) {
-                    // If the user changed, disable the providers if needed. They may be re-enabled
+                    // If the user changed, stop the providers if needed. They may be re-started
                     // for the new user immediately afterwards if their settings allow.
                     debugLog("User changed. old=" + oldConfig.getUserId()
-                            + ", new=" + newConfig.getUserId() + ": Disabling providers");
-                    disableProviders();
+                            + ", new=" + newConfig.getUserId() + ": Stopping providers");
+                    stopProviders();
 
-                    alterProvidersEnabledStateIfRequired(null /* oldConfiguration */, newConfig);
+                    alterProvidersStartedStateIfRequired(null /* oldConfiguration */, newConfig);
                 } else {
-                    alterProvidersEnabledStateIfRequired(oldConfig, newConfig);
+                    alterProvidersStartedStateIfRequired(oldConfig, newConfig);
                 }
             }
         }
@@ -145,43 +145,44 @@
     }
 
     @Override
+    @DurationMillisLong
     long getUncertaintyTimeoutDelayMillis() {
         return mUncertaintyTimeoutQueue.getQueuedDelayMillis();
     }
 
     @GuardedBy("mSharedLock")
-    private void disableProviders() {
-        disableProviderIfEnabled(mPrimaryProvider);
-        disableProviderIfEnabled(mSecondaryProvider);
+    private void stopProviders() {
+        stopProviderIfStarted(mPrimaryProvider);
+        stopProviderIfStarted(mSecondaryProvider);
 
-        // By definition, if both providers are disabled, the controller is uncertain.
+        // By definition, if both providers are stopped, the controller is uncertain.
         cancelUncertaintyTimeout();
     }
 
     @GuardedBy("mSharedLock")
-    private void disableProviderIfEnabled(@NonNull LocationTimeZoneProvider provider) {
-        if (provider.getCurrentState().isEnabled()) {
-            disableProvider(provider);
+    private void stopProviderIfStarted(@NonNull LocationTimeZoneProvider provider) {
+        if (provider.getCurrentState().isStarted()) {
+            stopProvider(provider);
         }
     }
 
     @GuardedBy("mSharedLock")
-    private void disableProvider(@NonNull LocationTimeZoneProvider provider) {
+    private void stopProvider(@NonNull LocationTimeZoneProvider provider) {
         ProviderState providerState = provider.getCurrentState();
         switch (providerState.stateEnum) {
-            case PROVIDER_STATE_DISABLED: {
-                debugLog("No need to disable " + provider + ": already disabled");
+            case PROVIDER_STATE_STOPPED: {
+                debugLog("No need to stop " + provider + ": already stopped");
                 break;
             }
-            case PROVIDER_STATE_ENABLED_INITIALIZING:
-            case PROVIDER_STATE_ENABLED_CERTAIN:
-            case PROVIDER_STATE_ENABLED_UNCERTAIN: {
-                debugLog("Disabling " + provider);
-                provider.disable();
+            case PROVIDER_STATE_STARTED_INITIALIZING:
+            case PROVIDER_STATE_STARTED_CERTAIN:
+            case PROVIDER_STATE_STARTED_UNCERTAIN: {
+                debugLog("Stopping " + provider);
+                provider.stopUpdates();
                 break;
             }
             case PROVIDER_STATE_PERM_FAILED: {
-                debugLog("Unable to disable " + provider + ": it is perm failed");
+                debugLog("Unable to stop " + provider + ": it is perm failed");
                 break;
             }
             default: {
@@ -192,20 +193,20 @@
     }
 
     /**
-     * Sets the providers into the correct enabled/disabled state for the {@code newConfiguration}
+     * Sets the providers into the correct started/stopped state for the {@code newConfiguration}
      * and, if there is a provider state change, makes any suggestions required to inform the
      * downstream time zone detection code.
      *
      * <p>This is a utility method that exists to avoid duplicated logic for the various cases when
-     * provider enabled / disabled state may need to be set or changed, e.g. during initialization
+     * provider started / stopped state may need to be set or changed, e.g. during initialization
      * or when a new configuration has been received.
      */
     @GuardedBy("mSharedLock")
-    private void alterProvidersEnabledStateIfRequired(
+    private void alterProvidersStartedStateIfRequired(
             @Nullable ConfigurationInternal oldConfiguration,
             @NonNull ConfigurationInternal newConfiguration) {
 
-        // Provider enabled / disabled states only need to be changed if geoDetectionEnabled has
+        // Provider started / stopped states only need to be changed if geoDetectionEnabled has
         // changed.
         boolean oldGeoDetectionEnabled = oldConfiguration != null
                 && oldConfiguration.getGeoDetectionEnabledBehavior();
@@ -215,28 +216,28 @@
         }
 
         // The check above ensures that the logic below only executes if providers are going from
-        // {enabled *} -> {disabled}, or {disabled} -> {enabled initializing}. If this changes in
-        // future and there could be {enabled *} -> {enabled *} cases, or cases where the provider
-        // can't be assumed to go straight to the {enabled initializing} state, then the logic below
+        // {started *} -> {stopped}, or {stopped} -> {started initializing}. If this changes in
+        // future and there could be {started *} -> {started *} cases, or cases where the provider
+        // can't be assumed to go straight to the {started initializing} state, then the logic below
         // would need to cover extra conditions, for example:
-        // 1) If the primary is in {enabled uncertain}, the secondary should be enabled.
+        // 1) If the primary is in {started uncertain}, the secondary should be started.
         // 2) If (1), and the secondary instantly enters the {perm failed} state, the uncertainty
-        //    timeout started when the primary entered {enabled uncertain} should be cancelled.
+        //    timeout started when the primary entered {started uncertain} should be cancelled.
 
         if (newGeoDetectionEnabled) {
-            // Try to enable the primary provider.
-            tryEnableProvider(mPrimaryProvider, newConfiguration);
+            // Try to start the primary provider.
+            tryStartProvider(mPrimaryProvider, newConfiguration);
 
-            // The secondary should only ever be enabled if the primary now isn't enabled (i.e. it
-            // couldn't become {enabled initializing} because it is {perm failed}).
+            // The secondary should only ever be started if the primary now isn't started (i.e. it
+            // couldn't become {started initializing} because it is {perm failed}).
             ProviderState newPrimaryState = mPrimaryProvider.getCurrentState();
-            if (!newPrimaryState.isEnabled()) {
-                // If the primary provider is {perm failed} then the controller must try to enable
+            if (!newPrimaryState.isStarted()) {
+                // If the primary provider is {perm failed} then the controller must try to start
                 // the secondary.
-                tryEnableProvider(mSecondaryProvider, newConfiguration);
+                tryStartProvider(mSecondaryProvider, newConfiguration);
 
                 ProviderState newSecondaryState = mSecondaryProvider.getCurrentState();
-                if (!newSecondaryState.isEnabled()) {
+                if (!newSecondaryState.isStarted()) {
                     // If both providers are {perm failed} then the controller immediately
                     // becomes uncertain.
                     GeolocationTimeZoneSuggestion suggestion = createUncertainSuggestion(
@@ -247,7 +248,7 @@
                 }
             }
         } else {
-            disableProviders();
+            stopProviders();
 
             // There can be an uncertainty timeout set if the controller most recently received
             // an uncertain event. This is a no-op if there isn't a timeout set.
@@ -256,34 +257,35 @@
             // If a previous "certain" suggestion has been made, then a new "uncertain"
             // suggestion must now be made to indicate the controller {does not / no longer has}
             // an opinion and will not be sending further updates (until at least the config
-            // changes again and providers are re-enabled).
+            // changes again and providers are re-started).
             if (mLastSuggestion != null && mLastSuggestion.getZoneIds() != null) {
                 GeolocationTimeZoneSuggestion suggestion = createUncertainSuggestion(
-                        "Provider is disabled:"
+                        "Provider is stopped:"
                                 + " primary=" + mPrimaryProvider.getCurrentState());
                 makeSuggestion(suggestion);
             }
         }
     }
 
-    private void tryEnableProvider(@NonNull LocationTimeZoneProvider provider,
+    private void tryStartProvider(@NonNull LocationTimeZoneProvider provider,
             @NonNull ConfigurationInternal configuration) {
         ProviderState providerState = provider.getCurrentState();
         switch (providerState.stateEnum) {
-            case PROVIDER_STATE_DISABLED: {
+            case PROVIDER_STATE_STOPPED: {
                 debugLog("Enabling " + provider);
-                provider.enable(configuration, mEnvironment.getProviderInitializationTimeout(),
+                provider.startUpdates(configuration,
+                        mEnvironment.getProviderInitializationTimeout(),
                         mEnvironment.getProviderInitializationTimeoutFuzz());
                 break;
             }
-            case PROVIDER_STATE_ENABLED_INITIALIZING:
-            case PROVIDER_STATE_ENABLED_CERTAIN:
-            case PROVIDER_STATE_ENABLED_UNCERTAIN: {
-                debugLog("No need to enable " + provider + ": already enabled");
+            case PROVIDER_STATE_STARTED_INITIALIZING:
+            case PROVIDER_STATE_STARTED_CERTAIN:
+            case PROVIDER_STATE_STARTED_UNCERTAIN: {
+                debugLog("No need to start " + provider + ": already started");
                 break;
             }
             case PROVIDER_STATE_PERM_FAILED: {
-                debugLog("Unable to enable " + provider + ": it is perm failed");
+                debugLog("Unable to start " + provider + ": it is perm failed");
                 break;
             }
             default: {
@@ -300,20 +302,20 @@
 
         synchronized (mSharedLock) {
             switch (providerState.stateEnum) {
-                case PROVIDER_STATE_DISABLED: {
-                    // This should never happen: entering disabled does not trigger a state change.
-                    warnLog("onProviderStateChange: Unexpected state change for disabled provider,"
+                case PROVIDER_STATE_STOPPED: {
+                    // This should never happen: entering stopped does not trigger a state change.
+                    warnLog("onProviderStateChange: Unexpected state change for stopped provider,"
                             + " provider=" + provider);
                     break;
                 }
-                case PROVIDER_STATE_ENABLED_INITIALIZING:
-                case PROVIDER_STATE_ENABLED_CERTAIN:
-                case PROVIDER_STATE_ENABLED_UNCERTAIN: {
-                    // Entering enabled does not trigger a state change, so this only happens if an
-                    // event is received while the provider is enabled.
+                case PROVIDER_STATE_STARTED_INITIALIZING:
+                case PROVIDER_STATE_STARTED_CERTAIN:
+                case PROVIDER_STATE_STARTED_UNCERTAIN: {
+                    // Entering started does not trigger a state change, so this only happens if an
+                    // event is received while the provider is started.
                     debugLog("onProviderStateChange: Received notification of a state change while"
-                            + " enabled, provider=" + provider);
-                    handleProviderEnabledStateChange(providerState);
+                            + " started, provider=" + provider);
+                    handleProviderStartedStateChange(providerState);
                     break;
                 }
                 case PROVIDER_STATE_PERM_FAILED: {
@@ -344,18 +346,18 @@
         ProviderState primaryCurrentState = mPrimaryProvider.getCurrentState();
         ProviderState secondaryCurrentState = mSecondaryProvider.getCurrentState();
 
-        // If a provider has failed, the other may need to be enabled.
+        // If a provider has failed, the other may need to be started.
         if (failedProvider == mPrimaryProvider) {
             if (secondaryCurrentState.stateEnum != PROVIDER_STATE_PERM_FAILED) {
-                // The primary must have failed. Try to enable the secondary. This does nothing if
-                // the provider is already enabled, and will leave the provider in
-                // {enabled initializing} if the provider is disabled.
-                tryEnableProvider(mSecondaryProvider, mCurrentUserConfiguration);
+                // The primary must have failed. Try to start the secondary. This does nothing if
+                // the provider is already started, and will leave the provider in
+                // {started initializing} if the provider is stopped.
+                tryStartProvider(mSecondaryProvider, mCurrentUserConfiguration);
             }
         } else if (failedProvider == mSecondaryProvider) {
             // No-op: The secondary will only be active if the primary is uncertain or is failed.
-            // So, there the primary should not need to be enabled when the secondary fails.
-            if (primaryCurrentState.stateEnum != PROVIDER_STATE_ENABLED_UNCERTAIN
+            // So, there the primary should not need to be started when the secondary fails.
+            if (primaryCurrentState.stateEnum != PROVIDER_STATE_STARTED_UNCERTAIN
                     && primaryCurrentState.stateEnum != PROVIDER_STATE_PERM_FAILED) {
                 warnLog("Secondary provider unexpected reported a failure:"
                         + " failed provider=" + failedProvider.getName()
@@ -384,16 +386,16 @@
     }
 
     /**
-     * Called when a provider has changed state but just moved from one enabled state to another
-     * enabled state, usually as a result of a new {@link LocationTimeZoneEvent} being received.
+     * Called when a provider has changed state but just moved from one started state to another
+     * started state, usually as a result of a new {@link TimeZoneProviderEvent} being received.
      * However, there are rare cases where the event can also be null.
      */
     @GuardedBy("mSharedLock")
-    private void handleProviderEnabledStateChange(@NonNull ProviderState providerState) {
+    private void handleProviderStartedStateChange(@NonNull ProviderState providerState) {
         LocationTimeZoneProvider provider = providerState.provider;
-        LocationTimeZoneEvent event = providerState.event;
+        TimeZoneProviderEvent event = providerState.event;
         if (event == null) {
-            // Implicit uncertainty, i.e. where the provider is enabled, but a problem has been
+            // Implicit uncertainty, i.e. where the provider is started, but a problem has been
             // detected without having received an event. For example, if the process has detected
             // the loss of a binder-based provider, or initialization took too long. This is treated
             // the same as explicit uncertainty, i.e. where the provider has explicitly told this
@@ -404,18 +406,18 @@
         }
 
         if (!mCurrentUserConfiguration.getGeoDetectionEnabledBehavior()) {
-            // This should not happen: the provider should not be in an enabled state if the user
+            // This should not happen: the provider should not be in an started state if the user
             // does not have geodetection enabled.
-            warnLog("Provider=" + provider + " is enabled, but"
+            warnLog("Provider=" + provider + " is started, but"
                     + " currentUserConfiguration=" + mCurrentUserConfiguration
                     + " suggests it shouldn't be.");
         }
 
-        switch (event.getEventType()) {
+        switch (event.getType()) {
             case EVENT_TYPE_PERMANENT_FAILURE: {
-                // This shouldn't happen. A provider cannot be enabled and have this event type.
+                // This shouldn't happen. A provider cannot be started and have this event type.
                 warnLog("Provider=" + provider
-                        + " is enabled, but event suggests it shouldn't be");
+                        + " is started, but event suggests it shouldn't be");
                 break;
             }
             case EVENT_TYPE_UNCERTAIN: {
@@ -423,13 +425,13 @@
                         + ", explicit uncertainty. event=" + event);
                 break;
             }
-            case EVENT_TYPE_SUCCESS: {
-                handleProviderCertainty(provider, event.getTimeZoneIds(),
+            case EVENT_TYPE_SUGGESTION: {
+                handleProviderSuggestion(provider, event.getSuggestion().getTimeZoneIds(),
                         "Event received provider=" + provider + ", event=" + event);
                 break;
             }
             default: {
-                warnLog("Unknown eventType=" + event.getEventType());
+                warnLog("Unknown eventType=" + event.getType());
                 break;
             }
         }
@@ -439,7 +441,7 @@
      * Called when a provider has become "certain" about the time zone(s).
      */
     @GuardedBy("mSharedLock")
-    private void handleProviderCertainty(
+    private void handleProviderSuggestion(
             @NonNull LocationTimeZoneProvider provider,
             @Nullable List<String> timeZoneIds,
             @NonNull String reason) {
@@ -447,11 +449,10 @@
         cancelUncertaintyTimeout();
 
         if (provider == mPrimaryProvider) {
-            disableProviderIfEnabled(mSecondaryProvider);
+            stopProviderIfStarted(mSecondaryProvider);
         }
 
-        GeolocationTimeZoneSuggestion suggestion =
-                new GeolocationTimeZoneSuggestion(timeZoneIds);
+        GeolocationTimeZoneSuggestion suggestion = new GeolocationTimeZoneSuggestion(timeZoneIds);
         suggestion.addDebugInfo(reason);
         // Rely on the receiver to dedupe suggestions. It is better to over-communicate.
         makeSuggestion(suggestion);
@@ -503,7 +504,7 @@
      * Called when a provider has become "uncertain" about the time zone.
      *
      * <p>A provider is expected to report its uncertainty as soon as it becomes uncertain, as
-     * this enables the most flexibility for the controller to enable other providers when there are
+     * this enables the most flexibility for the controller to start other providers when there are
      * multiple ones available. The controller is therefore responsible for deciding when to make a
      * "uncertain" suggestion to the downstream time zone detector.
      *
@@ -532,11 +533,11 @@
         }
 
         if (provider == mPrimaryProvider) {
-            // (Try to) enable the secondary. It could already be enabled, or enabling might not
+            // (Try to) start the secondary. It could already be started, or enabling might not
             // succeed if the provider has previously reported it is perm failed. The uncertainty
             // timeout (set above) is used to ensure that an uncertain suggestion will be made if
             // the secondary cannot generate a success event in time.
-            tryEnableProvider(mSecondaryProvider, mCurrentUserConfiguration);
+            tryStartProvider(mSecondaryProvider, mCurrentUserConfiguration);
         }
     }
 
diff --git a/services/core/java/com/android/server/location/timezone/HandlerThreadingDomain.java b/services/core/java/com/android/server/location/timezone/HandlerThreadingDomain.java
index 17e719e..b59898a 100644
--- a/services/core/java/com/android/server/location/timezone/HandlerThreadingDomain.java
+++ b/services/core/java/com/android/server/location/timezone/HandlerThreadingDomain.java
@@ -16,6 +16,7 @@
 
 package com.android.server.location.timezone;
 
+import android.annotation.DurationMillisLong;
 import android.annotation.NonNull;
 import android.os.Handler;
 
@@ -57,12 +58,12 @@
     }
 
     @Override
-    void postDelayed(@NonNull Runnable r, long delayMillis) {
+    void postDelayed(@NonNull Runnable r, @DurationMillisLong long delayMillis) {
         getHandler().postDelayed(r, delayMillis);
     }
 
     @Override
-    void postDelayed(Runnable r, Object token, long delayMillis) {
+    void postDelayed(Runnable r, Object token, @DurationMillisLong long delayMillis) {
         getHandler().postDelayed(r, token, delayMillis);
     }
 
diff --git a/services/core/java/com/android/server/location/timezone/LocationTimeZoneManagerService.java b/services/core/java/com/android/server/location/timezone/LocationTimeZoneManagerService.java
index c8a1db6..98ebec2 100644
--- a/services/core/java/com/android/server/location/timezone/LocationTimeZoneManagerService.java
+++ b/services/core/java/com/android/server/location/timezone/LocationTimeZoneManagerService.java
@@ -24,6 +24,7 @@
 import android.os.ResultReceiver;
 import android.os.ShellCallback;
 import android.os.SystemProperties;
+import android.service.timezone.TimeZoneProviderService;
 import android.util.IndentingPrintWriter;
 import android.util.Log;
 import android.util.Slog;
@@ -44,7 +45,7 @@
  * A service class that acts as a container for the {@link LocationTimeZoneProviderController},
  * which determines what {@link com.android.server.timezonedetector.GeolocationTimeZoneSuggestion}
  * are made to the {@link TimeZoneDetectorInternal}, and the {@link LocationTimeZoneProvider}s that
- * (indirectly) generate {@link com.android.internal.location.timezone.LocationTimeZoneEvent}s.
+ * (indirectly) generate {@link TimeZoneProviderEvent}s.
  *
  * <p>For details of the time zone suggestion behavior, see {@link
  * LocationTimeZoneProviderController}.
@@ -120,9 +121,9 @@
     private static final String ATTRIBUTION_TAG = "LocationTimeZoneService";
 
     private static final String PRIMARY_LOCATION_TIME_ZONE_SERVICE_ACTION =
-            "com.android.location.timezone.service.v1.PrimaryLocationTimeZoneProvider";
+            TimeZoneProviderService.PRIMARY_LOCATION_TIME_ZONE_PROVIDER_SERVICE_INTERFACE;
     private static final String SECONDARY_LOCATION_TIME_ZONE_SERVICE_ACTION =
-            "com.android.location.timezone.service.v1.SecondaryLocationTimeZoneProvider";
+            TimeZoneProviderService.SECONDARY_LOCATION_TIME_ZONE_PROVIDER_SERVICE_INTERFACE;
 
 
     @NonNull private final Context mContext;
diff --git a/services/core/java/com/android/server/location/timezone/LocationTimeZoneProvider.java b/services/core/java/com/android/server/location/timezone/LocationTimeZoneProvider.java
index dc56238..8b51ab4 100644
--- a/services/core/java/com/android/server/location/timezone/LocationTimeZoneProvider.java
+++ b/services/core/java/com/android/server/location/timezone/LocationTimeZoneProvider.java
@@ -16,16 +16,17 @@
 
 package com.android.server.location.timezone;
 
-import static com.android.internal.location.timezone.LocationTimeZoneEvent.EVENT_TYPE_PERMANENT_FAILURE;
-import static com.android.internal.location.timezone.LocationTimeZoneEvent.EVENT_TYPE_SUCCESS;
-import static com.android.internal.location.timezone.LocationTimeZoneEvent.EVENT_TYPE_UNCERTAIN;
 import static com.android.server.location.timezone.LocationTimeZoneManagerService.debugLog;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_DISABLED;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_ENABLED_CERTAIN;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_ENABLED_INITIALIZING;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_ENABLED_UNCERTAIN;
 import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_PERM_FAILED;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_CERTAIN;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_INITIALIZING;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_UNCERTAIN;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STOPPED;
+import static com.android.server.location.timezone.TimeZoneProviderEvent.EVENT_TYPE_PERMANENT_FAILURE;
+import static com.android.server.location.timezone.TimeZoneProviderEvent.EVENT_TYPE_SUGGESTION;
+import static com.android.server.location.timezone.TimeZoneProviderEvent.EVENT_TYPE_UNCERTAIN;
 
+import android.annotation.ElapsedRealtimeLong;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -34,7 +35,6 @@
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.location.timezone.LocationTimeZoneEvent;
 import com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.ProviderStateEnum;
 import com.android.server.location.timezone.ThreadingDomain.SingleRunnableQueue;
 import com.android.server.timezonedetector.ConfigurationInternal;
@@ -50,7 +50,7 @@
  * process, or could be a stubbed instance when no real provider is registered.
  *
  * <p>The provider is supplied with a {@link ProviderListener} via {@link
- * #initialize(ProviderListener)}. This enables it to communicates asynchronous detection / error
+ * #initialize(ProviderListener)}. This starts communication of asynchronous detection / error
  * events back to the {@link LocationTimeZoneProviderController} via the {@link
  * ProviderListener#onProviderStateChange} method. This call must be made on the
  * {@link Handler} thread from the {@link ThreadingDomain} passed to the constructor.
@@ -77,9 +77,10 @@
      */
     static class ProviderState {
 
-        @IntDef({ PROVIDER_STATE_UNKNOWN, PROVIDER_STATE_ENABLED_INITIALIZING,
-                PROVIDER_STATE_ENABLED_CERTAIN, PROVIDER_STATE_ENABLED_UNCERTAIN,
-                PROVIDER_STATE_DISABLED, PROVIDER_STATE_PERM_FAILED })
+        @IntDef(prefix = "PROVIDER_STATE_",
+                value = { PROVIDER_STATE_UNKNOWN, PROVIDER_STATE_STARTED_INITIALIZING,
+                PROVIDER_STATE_STARTED_CERTAIN, PROVIDER_STATE_STARTED_UNCERTAIN,
+                PROVIDER_STATE_STOPPED, PROVIDER_STATE_PERM_FAILED })
         @interface ProviderStateEnum {}
 
         /**
@@ -88,31 +89,31 @@
         static final int PROVIDER_STATE_UNKNOWN = 0;
 
         /**
-         * The provider is enabled and has not reported its first event.
+         * The provider is started and has not reported its first event.
          */
-        static final int PROVIDER_STATE_ENABLED_INITIALIZING = 1;
+        static final int PROVIDER_STATE_STARTED_INITIALIZING = 1;
 
         /**
-         * The provider is enabled and most recently reported a "success" event.
+         * The provider is started and most recently reported a "suggestion" event.
          */
-        static final int PROVIDER_STATE_ENABLED_CERTAIN = 2;
+        static final int PROVIDER_STATE_STARTED_CERTAIN = 2;
 
         /**
-         * The provider is enabled and most recently reported an "uncertain" event.
+         * The provider is started and most recently reported an "uncertain" event.
          */
-        static final int PROVIDER_STATE_ENABLED_UNCERTAIN = 3;
+        static final int PROVIDER_STATE_STARTED_UNCERTAIN = 3;
 
         /**
-         * The provider is disabled.
+         * The provider is stopped.
          *
          * This is the state after {@link #initialize} is called.
          */
-        static final int PROVIDER_STATE_DISABLED = 4;
+        static final int PROVIDER_STATE_STOPPED = 4;
 
         /**
-         * The provider has failed and cannot be re-enabled.
+         * The provider has failed and cannot be re-started.
          *
-         * Providers may enter this state after a provider is enabled.
+         * Providers may enter this state after a provider is started.
          */
         static final int PROVIDER_STATE_PERM_FAILED = 5;
 
@@ -123,16 +124,16 @@
         public final @ProviderStateEnum int stateEnum;
 
         /**
-         * The last {@link LocationTimeZoneEvent} received. Only populated when {@link #stateEnum}
-         * is either {@link #PROVIDER_STATE_ENABLED_CERTAIN} or {@link
-         * #PROVIDER_STATE_ENABLED_UNCERTAIN}, but it can be {@code null} then too if no event has
+         * The last {@link TimeZoneProviderEvent} received. Only populated when {@link #stateEnum}
+         * is either {@link #PROVIDER_STATE_STARTED_CERTAIN} or {@link
+         * #PROVIDER_STATE_STARTED_UNCERTAIN}, but it can be {@code null} then too if no event has
          * yet been received.
          */
-        @Nullable public final LocationTimeZoneEvent event;
+        @Nullable public final TimeZoneProviderEvent event;
 
         /**
          * The user configuration associated with the current state. Only and always present when
-         * {@link #stateEnum} is one of the enabled states.
+         * {@link #stateEnum} is one of the started states.
          */
         @Nullable public final ConfigurationInternal currentUserConfiguration;
 
@@ -140,6 +141,7 @@
          * The time according to the elapsed realtime clock when the provider entered the current
          * state. Included for debugging, not used for equality.
          */
+        @ElapsedRealtimeLong
         private final long mStateEntryTimeMillis;
 
         /**
@@ -151,7 +153,7 @@
 
         private ProviderState(@NonNull LocationTimeZoneProvider provider,
                 @ProviderStateEnum int stateEnum,
-                @Nullable LocationTimeZoneEvent event,
+                @Nullable TimeZoneProviderEvent event,
                 @Nullable ConfigurationInternal currentUserConfiguration,
                 @Nullable String debugInfo) {
             this.provider = Objects.requireNonNull(provider);
@@ -174,25 +176,25 @@
          * and that the required parameters for the new state are present / absent.
          */
         ProviderState newState(@ProviderStateEnum int newStateEnum,
-                @Nullable LocationTimeZoneEvent event,
+                @Nullable TimeZoneProviderEvent event,
                 @Nullable ConfigurationInternal currentUserConfig,
                 @Nullable String debugInfo) {
 
             // Check valid "from" transitions.
             switch (this.stateEnum) {
                 case PROVIDER_STATE_UNKNOWN: {
-                    if (newStateEnum != PROVIDER_STATE_DISABLED) {
+                    if (newStateEnum != PROVIDER_STATE_STOPPED) {
                         throw new IllegalArgumentException(
                                 "Must transition from " + prettyPrintStateEnum(
                                         PROVIDER_STATE_UNKNOWN)
-                                        + " to " + prettyPrintStateEnum(PROVIDER_STATE_DISABLED));
+                                        + " to " + prettyPrintStateEnum(PROVIDER_STATE_STOPPED));
                     }
                     break;
                 }
-                case PROVIDER_STATE_DISABLED:
-                case PROVIDER_STATE_ENABLED_INITIALIZING:
-                case PROVIDER_STATE_ENABLED_CERTAIN:
-                case PROVIDER_STATE_ENABLED_UNCERTAIN: {
+                case PROVIDER_STATE_STOPPED:
+                case PROVIDER_STATE_STARTED_INITIALIZING:
+                case PROVIDER_STATE_STARTED_CERTAIN:
+                case PROVIDER_STATE_STARTED_UNCERTAIN: {
                     // These can go to each other or PROVIDER_STATE_PERM_FAILED.
                     break;
                 }
@@ -211,21 +213,21 @@
                     throw new IllegalArgumentException("Cannot transition to "
                             + prettyPrintStateEnum(PROVIDER_STATE_UNKNOWN));
                 }
-                case PROVIDER_STATE_DISABLED: {
+                case PROVIDER_STATE_STOPPED: {
                     if (event != null || currentUserConfig != null) {
                         throw new IllegalArgumentException(
-                                "Disabled state: event and currentUserConfig must be null"
+                                "Stopped state: event and currentUserConfig must be null"
                                         + ", event=" + event
                                         + ", currentUserConfig=" + currentUserConfig);
                     }
                     break;
                 }
-                case PROVIDER_STATE_ENABLED_INITIALIZING:
-                case PROVIDER_STATE_ENABLED_CERTAIN:
-                case PROVIDER_STATE_ENABLED_UNCERTAIN: {
+                case PROVIDER_STATE_STARTED_INITIALIZING:
+                case PROVIDER_STATE_STARTED_CERTAIN:
+                case PROVIDER_STATE_STARTED_UNCERTAIN: {
                     if (currentUserConfig == null) {
                         throw new IllegalArgumentException(
-                                "Enabled state: currentUserConfig must not be null");
+                                "Started state: currentUserConfig must not be null");
                     }
                     break;
                 }
@@ -245,11 +247,11 @@
             return new ProviderState(provider, newStateEnum, event, currentUserConfig, debugInfo);
         }
 
-        /** Returns {@code true} if {@link #stateEnum} is one of the enabled states. */
-        boolean isEnabled() {
-            return stateEnum == PROVIDER_STATE_ENABLED_INITIALIZING
-                    || stateEnum == PROVIDER_STATE_ENABLED_CERTAIN
-                    || stateEnum == PROVIDER_STATE_ENABLED_UNCERTAIN;
+        /** Returns {@code true} if {@link #stateEnum} is one of the started states. */
+        boolean isStarted() {
+            return stateEnum == PROVIDER_STATE_STARTED_INITIALIZING
+                    || stateEnum == PROVIDER_STATE_STARTED_CERTAIN
+                    || stateEnum == PROVIDER_STATE_STARTED_UNCERTAIN;
         }
 
         @Override
@@ -286,14 +288,14 @@
 
         private static String prettyPrintStateEnum(@ProviderStateEnum int state) {
             switch (state) {
-                case PROVIDER_STATE_DISABLED:
-                    return "Disabled (" + PROVIDER_STATE_DISABLED + ")";
-                case PROVIDER_STATE_ENABLED_INITIALIZING:
-                    return "Enabled initializing (" + PROVIDER_STATE_ENABLED_INITIALIZING + ")";
-                case PROVIDER_STATE_ENABLED_CERTAIN:
-                    return "Enabled certain (" + PROVIDER_STATE_ENABLED_CERTAIN + ")";
-                case PROVIDER_STATE_ENABLED_UNCERTAIN:
-                    return "Enabled uncertain (" + PROVIDER_STATE_ENABLED_UNCERTAIN + ")";
+                case PROVIDER_STATE_STOPPED:
+                    return "Stopped (" + PROVIDER_STATE_STOPPED + ")";
+                case PROVIDER_STATE_STARTED_INITIALIZING:
+                    return "Started initializing (" + PROVIDER_STATE_STARTED_INITIALIZING + ")";
+                case PROVIDER_STATE_STARTED_CERTAIN:
+                    return "Started certain (" + PROVIDER_STATE_STARTED_CERTAIN + ")";
+                case PROVIDER_STATE_STARTED_UNCERTAIN:
+                    return "Started uncertain (" + PROVIDER_STATE_STARTED_UNCERTAIN + ")";
                 case PROVIDER_STATE_PERM_FAILED:
                     return "Perm failure (" + PROVIDER_STATE_PERM_FAILED + ")";
                 case PROVIDER_STATE_UNKNOWN:
@@ -315,7 +317,7 @@
             new ReferenceWithHistory<>(10);
 
     /**
-     * Used for scheduling initialization timeouts, i.e. for providers that have just been enabled.
+     * Used for scheduling initialization timeouts, i.e. for providers that have just been started.
      */
     @NonNull private final SingleRunnableQueue mInitializationTimeoutQueue;
 
@@ -344,7 +346,7 @@
             mProviderListener = Objects.requireNonNull(providerListener);
             ProviderState currentState = ProviderState.createStartingState(this);
             ProviderState newState = currentState.newState(
-                    PROVIDER_STATE_DISABLED, null, null,
+                    PROVIDER_STATE_STOPPED, null, null,
                     "initialize() called");
             setCurrentState(newState, false);
 
@@ -407,28 +409,28 @@
     }
 
     /**
-     * Enables the provider. It is an error to call this method except when the {@link
-     * #getCurrentState()} is at {@link ProviderState#PROVIDER_STATE_DISABLED}. This method must be
+     * Starts the provider. It is an error to call this method except when the {@link
+     * #getCurrentState()} is at {@link ProviderState#PROVIDER_STATE_STOPPED}. This method must be
      * called using the handler thread from the {@link ThreadingDomain}.
      */
-    final void enable(@NonNull ConfigurationInternal currentUserConfiguration,
+    final void startUpdates(@NonNull ConfigurationInternal currentUserConfiguration,
             @NonNull Duration initializationTimeout, @NonNull Duration initializationTimeoutFuzz) {
         mThreadingDomain.assertCurrentThread();
 
         synchronized (mSharedLock) {
-            assertCurrentState(PROVIDER_STATE_DISABLED);
+            assertCurrentState(PROVIDER_STATE_STOPPED);
 
             ProviderState currentState = mCurrentState.get();
             ProviderState newState = currentState.newState(
-                    PROVIDER_STATE_ENABLED_INITIALIZING, null /* event */,
-                    currentUserConfiguration, "enable() called");
+                    PROVIDER_STATE_STARTED_INITIALIZING, null /* event */,
+                    currentUserConfiguration, "startUpdates() called");
             setCurrentState(newState, false);
 
             Duration delay = initializationTimeout.plus(initializationTimeoutFuzz);
             mInitializationTimeoutQueue.runDelayed(
                     this::handleInitializationTimeout, delay.toMillis());
 
-            onEnable(initializationTimeout);
+            onStartUpdates(initializationTimeout);
         }
     }
 
@@ -437,10 +439,10 @@
 
         synchronized (mSharedLock) {
             ProviderState currentState = mCurrentState.get();
-            if (currentState.stateEnum == PROVIDER_STATE_ENABLED_INITIALIZING) {
+            if (currentState.stateEnum == PROVIDER_STATE_STARTED_INITIALIZING) {
                 // On initialization timeout the provider becomes uncertain.
                 ProviderState newState = currentState.newState(
-                        PROVIDER_STATE_ENABLED_UNCERTAIN, null /* event */,
+                        PROVIDER_STATE_STARTED_UNCERTAIN, null /* event */,
                         currentState.currentUserConfiguration, "initialization timeout");
                 setCurrentState(newState, true);
             }
@@ -448,65 +450,64 @@
     }
 
     /**
-     * Implemented by subclasses to do work during {@link #enable}.
+     * Implemented by subclasses to do work during {@link #startUpdates}.
      */
-    abstract void onEnable(@NonNull Duration initializationTimeout);
+    abstract void onStartUpdates(@NonNull Duration initializationTimeout);
 
     /**
-     * Disables the provider. It is an error* to call this method except when the {@link
-     * #getCurrentState()} is one of the enabled states. This method must be
+     * Stops the provider. It is an error* to call this method except when the {@link
+     * #getCurrentState()} is one of the started states. This method must be
      * called using the handler thread from the {@link ThreadingDomain}.
      */
-    final void disable() {
+    final void stopUpdates() {
         mThreadingDomain.assertCurrentThread();
 
         synchronized (mSharedLock) {
-            assertIsEnabled();
+            assertIsStarted();
 
             ProviderState currentState = mCurrentState.get();
             ProviderState newState = currentState.newState(
-                    PROVIDER_STATE_DISABLED, null, null, "disable() called");
+                    PROVIDER_STATE_STOPPED, null, null, "stopUpdates() called");
             setCurrentState(newState, false);
 
             if (mInitializationTimeoutQueue.hasQueued()) {
                 mInitializationTimeoutQueue.cancel();
             }
 
-            onDisable();
+            onStopUpdates();
         }
     }
 
     /**
-     * Implemented by subclasses to do work during {@link #disable}.
+     * Implemented by subclasses to do work during {@link #stopUpdates}.
      */
-    abstract void onDisable();
+    abstract void onStopUpdates();
 
-    /** For subclasses to invoke when a {@link LocationTimeZoneEvent} has been received. */
-    final void handleLocationTimeZoneEvent(
-            @NonNull LocationTimeZoneEvent locationTimeZoneEvent) {
+    /** For subclasses to invoke when a {@link TimeZoneProviderEvent} has been received. */
+    final void handleTimeZoneProviderEvent(@NonNull TimeZoneProviderEvent timeZoneProviderEvent) {
         mThreadingDomain.assertCurrentThread();
-        Objects.requireNonNull(locationTimeZoneEvent);
+        Objects.requireNonNull(timeZoneProviderEvent);
 
         synchronized (mSharedLock) {
-            debugLog("handleLocationTimeZoneEvent: mProviderName=" + mProviderName
-                    + ", locationTimeZoneEvent=" + locationTimeZoneEvent);
+            debugLog("handleTimeZoneProviderEvent: mProviderName=" + mProviderName
+                    + ", timeZoneProviderEvent=" + timeZoneProviderEvent);
 
             ProviderState currentState = mCurrentState.get();
-            int eventType = locationTimeZoneEvent.getEventType();
+            int eventType = timeZoneProviderEvent.getType();
             switch (currentState.stateEnum) {
                 case PROVIDER_STATE_PERM_FAILED: {
                     // After entering perm failed, there is nothing to do. The remote peer is
                     // supposed to stop sending events after it has reported perm failure.
-                    logWarn("handleLocationTimeZoneEvent: Event=" + locationTimeZoneEvent
+                    logWarn("handleTimeZoneProviderEvent: Event=" + timeZoneProviderEvent
                             + " received for provider=" + this + " when in failed state");
                     return;
                 }
-                case PROVIDER_STATE_DISABLED: {
+                case PROVIDER_STATE_STOPPED: {
                     switch (eventType) {
                         case EVENT_TYPE_PERMANENT_FAILURE: {
-                            String msg = "handleLocationTimeZoneEvent:"
-                                    + " Failure event=" + locationTimeZoneEvent
-                                    + " received for disabled provider=" + this
+                            String msg = "handleTimeZoneProviderEvent:"
+                                    + " Failure event=" + timeZoneProviderEvent
+                                    + " received for stopped provider=" + this
                                     + ", entering permanently failed state";
                             logWarn(msg);
                             ProviderState newState = currentState.newState(
@@ -517,30 +518,30 @@
                             }
                             return;
                         }
-                        case EVENT_TYPE_SUCCESS:
+                        case EVENT_TYPE_SUGGESTION:
                         case EVENT_TYPE_UNCERTAIN: {
-                            // Any geolocation-related events received for a disabled provider are
+                            // Any geolocation-related events received for a stopped provider are
                             // ignored: they should not happen.
-                            logWarn("handleLocationTimeZoneEvent:"
-                                    + " event=" + locationTimeZoneEvent
-                                    + " received for disabled provider=" + this
+                            logWarn("handleTimeZoneProviderEvent:"
+                                    + " event=" + timeZoneProviderEvent
+                                    + " received for stopped provider=" + this
                                     + ", ignoring");
 
                             return;
                         }
                         default: {
                             throw new IllegalStateException(
-                                    "Unknown eventType=" + locationTimeZoneEvent);
+                                    "Unknown eventType=" + timeZoneProviderEvent);
                         }
                     }
                 }
-                case PROVIDER_STATE_ENABLED_INITIALIZING:
-                case PROVIDER_STATE_ENABLED_CERTAIN:
-                case PROVIDER_STATE_ENABLED_UNCERTAIN: {
+                case PROVIDER_STATE_STARTED_INITIALIZING:
+                case PROVIDER_STATE_STARTED_CERTAIN:
+                case PROVIDER_STATE_STARTED_UNCERTAIN: {
                     switch (eventType) {
                         case EVENT_TYPE_PERMANENT_FAILURE: {
-                            String msg = "handleLocationTimeZoneEvent:"
-                                    + " Failure event=" + locationTimeZoneEvent
+                            String msg = "handleTimeZoneProviderEvent:"
+                                    + " Failure event=" + timeZoneProviderEvent
                                     + " received for provider=" + this
                                     + ", entering permanently failed state";
                             logWarn(msg);
@@ -554,16 +555,16 @@
                             return;
                         }
                         case EVENT_TYPE_UNCERTAIN:
-                        case EVENT_TYPE_SUCCESS: {
+                        case EVENT_TYPE_SUGGESTION: {
                             @ProviderStateEnum int providerStateEnum;
                             if (eventType == EVENT_TYPE_UNCERTAIN) {
-                                providerStateEnum = PROVIDER_STATE_ENABLED_UNCERTAIN;
+                                providerStateEnum = PROVIDER_STATE_STARTED_UNCERTAIN;
                             } else {
-                                providerStateEnum = PROVIDER_STATE_ENABLED_CERTAIN;
+                                providerStateEnum = PROVIDER_STATE_STARTED_CERTAIN;
                             }
                             ProviderState newState = currentState.newState(providerStateEnum,
-                                    locationTimeZoneEvent, currentState.currentUserConfiguration,
-                                    "handleLocationTimeZoneEvent() when enabled");
+                                    timeZoneProviderEvent, currentState.currentUserConfiguration,
+                                    "handleTimeZoneProviderEvent() when started");
                             setCurrentState(newState, true);
                             if (mInitializationTimeoutQueue.hasQueued()) {
                                 mInitializationTimeoutQueue.cancel();
@@ -572,7 +573,7 @@
                         }
                         default: {
                             throw new IllegalStateException(
-                                    "Unknown eventType=" + locationTimeZoneEvent);
+                                    "Unknown eventType=" + timeZoneProviderEvent);
                         }
                     }
                 }
@@ -589,10 +590,10 @@
     abstract void logWarn(String msg);
 
     @GuardedBy("mSharedLock")
-    private void assertIsEnabled() {
+    private void assertIsStarted() {
         ProviderState currentState = mCurrentState.get();
-        if (!currentState.isEnabled()) {
-            throw new IllegalStateException("Required an enabled state, but was " + currentState);
+        if (!currentState.isStarted()) {
+            throw new IllegalStateException("Required a started state, but was " + currentState);
         }
     }
 
diff --git a/services/core/java/com/android/server/location/timezone/LocationTimeZoneProviderController.java b/services/core/java/com/android/server/location/timezone/LocationTimeZoneProviderController.java
index ace066e..45ec400 100644
--- a/services/core/java/com/android/server/location/timezone/LocationTimeZoneProviderController.java
+++ b/services/core/java/com/android/server/location/timezone/LocationTimeZoneProviderController.java
@@ -16,6 +16,7 @@
 
 package com.android.server.location.timezone;
 
+import android.annotation.DurationMillisLong;
 import android.annotation.NonNull;
 import android.os.Handler;
 
@@ -59,7 +60,7 @@
  * disputed areas and oceans. Distinguishing uncertainty allows the controller to try other
  * providers (or give up), where as certainty means it should not.
  *
- * <p>A provider can fail permanently. A permanent failure will disable the provider until next
+ * <p>A provider can fail permanently. A permanent failure will stop the provider until next
  * boot.
  */
 abstract class LocationTimeZoneProviderController implements Dumpable {
@@ -90,6 +91,7 @@
     abstract boolean isUncertaintyTimeoutSet();
 
     @VisibleForTesting
+    @DurationMillisLong
     abstract long getUncertaintyTimeoutDelayMillis();
 
     /**
diff --git a/services/core/java/com/android/server/location/timezone/LocationTimeZoneProviderProxy.java b/services/core/java/com/android/server/location/timezone/LocationTimeZoneProviderProxy.java
index 8a0259d..91b52f1 100644
--- a/services/core/java/com/android/server/location/timezone/LocationTimeZoneProviderProxy.java
+++ b/services/core/java/com/android/server/location/timezone/LocationTimeZoneProviderProxy.java
@@ -23,17 +23,15 @@
 import android.util.IndentingPrintWriter;
 
 import com.android.internal.annotations.GuardedBy;
-import com.android.internal.location.timezone.LocationTimeZoneEvent;
-import com.android.internal.location.timezone.LocationTimeZoneProviderRequest;
 import com.android.server.timezonedetector.Dumpable;
 
 import java.util.Objects;
 
 /**
- * System server-side proxy for ILocationTimeZoneProvider implementations, i.e. this provides the
- * system server object used to communicate with a remote LocationTimeZoneProvider over Binder,
- * which could be running in a different process. As LocationTimeZoneProviders are bound / unbound
- * this proxy will rebind to the "best" available remote process.
+ * System server-side proxy for ITimeZoneProvider implementations, i.e. this provides the system
+ * server object used to communicate with a remote TimeZoneProvider over Binder, which could be
+ * running in a different process. As TimeZoneProviders are bound / unbound this proxy will rebind
+ * to the "best" available remote process.
  *
  * <p>Threading guarantees provided / required by this interface:
  * <ul>
@@ -41,8 +39,8 @@
  *     from the {@link ThreadingDomain} passed to the constructor, excluding
  *     {@link #dump(IndentingPrintWriter, String[])}</li>
  *     <li>Non-static public methods that make binder calls to remote processes (e.g.
- *     {@link #setRequest(LocationTimeZoneProviderRequest)}) are executed asynchronously and will
- *     return immediately.</li>
+ *     {@link #setRequest(TimeZoneProviderRequest)}) are executed asynchronously and will return
+ *     immediately.</li>
  *     <li>Callbacks received via binder are delivered via {@link Listener} are delivered on the
  *     {@link Handler} thread from the {@link ThreadingDomain} passed to the constructor.
  * </ul>
@@ -93,16 +91,15 @@
     /**
      * Sets a new request for the provider.
      */
-    abstract void setRequest(@NonNull LocationTimeZoneProviderRequest request);
+    abstract void setRequest(@NonNull TimeZoneProviderRequest request);
 
     /**
-     * Handles a {@link LocationTimeZoneEvent} from a remote process.
+     * Handles a {@link TimeZoneProviderEvent} from a remote process.
      */
-    final void handleLocationTimeZoneEvent(
-            @NonNull LocationTimeZoneEvent locationTimeZoneEvent) {
+    final void handleTimeZoneProviderEvent(@NonNull TimeZoneProviderEvent timeZoneProviderEvent) {
         // These calls are invoked on a binder thread. Move to the mThreadingDomain thread as
         // required by the guarantees for this class.
-        mThreadingDomain.post(() -> mListener.onReportLocationTimeZoneEvent(locationTimeZoneEvent));
+        mThreadingDomain.post(() -> mListener.onReportTimeZoneProviderEvent(timeZoneProviderEvent));
     }
 
     /**
@@ -112,9 +109,9 @@
     interface Listener {
 
         /**
-         * Called when a provider receives a {@link LocationTimeZoneEvent}.
+         * Called when a provider receives a {@link TimeZoneProviderEvent}.
          */
-        void onReportLocationTimeZoneEvent(@NonNull LocationTimeZoneEvent locationTimeZoneEvent);
+        void onReportTimeZoneProviderEvent(@NonNull TimeZoneProviderEvent timeZoneProviderEvent);
 
         /**
          * Called when a provider is (re)bound.
diff --git a/services/core/java/com/android/server/location/timezone/NullLocationTimeZoneProvider.java b/services/core/java/com/android/server/location/timezone/NullLocationTimeZoneProvider.java
index fbcc71f..e11a7ce 100644
--- a/services/core/java/com/android/server/location/timezone/NullLocationTimeZoneProvider.java
+++ b/services/core/java/com/android/server/location/timezone/NullLocationTimeZoneProvider.java
@@ -35,11 +35,11 @@
  * and a secondary {@link LocationTimeZoneProvider}, but only a primary is configured, the secondary
  * config will be left null and the {@link LocationTimeZoneProvider} implementation will be
  * defaulted to a {@link NullLocationTimeZoneProvider}. The {@link NullLocationTimeZoneProvider}
- * enters a {@link ProviderState#PROVIDER_STATE_PERM_FAILED} state immediately after being enabled
+ * enters a {@link ProviderState#PROVIDER_STATE_PERM_FAILED} state immediately after being started
  * for the first time and sends the appropriate event, which ensures the {@link
  * LocationTimeZoneProviderController} won't expect any further {@link
- * com.android.internal.location.timezone.LocationTimeZoneEvent}s to come from it, and won't attempt
- * to use it again.
+ * TimeZoneProviderEvent}s to come from it, and won't attempt to use it
+ * again.
  */
 class NullLocationTimeZoneProvider extends LocationTimeZoneProvider {
 
@@ -57,7 +57,7 @@
     }
 
     @Override
-    void onEnable(@NonNull Duration initializationTimeout) {
+    void onStartUpdates(@NonNull Duration initializationTimeout) {
         // Report a failure (asynchronously using the mThreadingDomain thread to avoid recursion).
         mThreadingDomain.post(()-> {
             // Enter the perm-failed state.
@@ -69,8 +69,8 @@
     }
 
     @Override
-    void onDisable() {
-        // Ignored - NullLocationTimeZoneProvider is always permanently failed.
+    void onStopUpdates() {
+        // Ignored - this implementation is always permanently failed.
     }
 
     @Override
diff --git a/services/core/java/com/android/server/location/timezone/RealLocationTimeZoneProviderProxy.java b/services/core/java/com/android/server/location/timezone/RealLocationTimeZoneProviderProxy.java
index 1a01288..1bb5cec 100644
--- a/services/core/java/com/android/server/location/timezone/RealLocationTimeZoneProviderProxy.java
+++ b/services/core/java/com/android/server/location/timezone/RealLocationTimeZoneProviderProxy.java
@@ -22,22 +22,22 @@
 import android.content.Context;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.service.timezone.ITimeZoneProvider;
+import android.service.timezone.ITimeZoneProviderManager;
+import android.service.timezone.TimeZoneProviderSuggestion;
 import android.util.IndentingPrintWriter;
 
 import com.android.internal.annotations.GuardedBy;
-import com.android.internal.location.timezone.ILocationTimeZoneProvider;
-import com.android.internal.location.timezone.ILocationTimeZoneProviderManager;
-import com.android.internal.location.timezone.LocationTimeZoneEvent;
-import com.android.internal.location.timezone.LocationTimeZoneProviderRequest;
 import com.android.server.ServiceWatcher;
 
 import java.util.Objects;
 
 /**
- * System server-side proxy for ILocationTimeZoneProvider implementations, i.e. this provides the
- * system server object used to communicate with a remote LocationTimeZoneProvider over Binder,
- * which could be running in a different process. As "remote" LocationTimeZoneProviders are bound /
- * unbound this proxy will rebind to the "best" available remote process.
+ * System server-side proxy for ITimeZoneProvider implementations, i.e. this provides the
+ * system server object used to communicate with a remote {@link
+ * android.service.timezone.TimeZoneProviderService} over Binder, which could be running in a
+ * different process. As "remote" providers are bound / unbound this proxy will rebind to the "best"
+ * available remote process.
  */
 class RealLocationTimeZoneProviderProxy extends LocationTimeZoneProviderProxy {
 
@@ -47,7 +47,7 @@
     @Nullable private ManagerProxy mManagerProxy;
 
     @GuardedBy("mProxyLock")
-    @NonNull private LocationTimeZoneProviderRequest mRequest;
+    @NonNull private TimeZoneProviderRequest mRequest;
 
     RealLocationTimeZoneProviderProxy(
             @NonNull Context context, @NonNull ThreadingDomain threadingDomain,
@@ -55,7 +55,7 @@
             int nonOverlayPackageResId) {
         super(context, threadingDomain);
         mManagerProxy = null;
-        mRequest = LocationTimeZoneProviderRequest.EMPTY_REQUEST;
+        mRequest = TimeZoneProviderRequest.createStopUpdatesRequest();
         mServiceWatcher = new ServiceWatcher(context, action, this::onBind, this::onUnbind,
                 enableOverlayResId, nonOverlayPackageResId);
     }
@@ -93,12 +93,12 @@
     private void onBindOnHandlerThread(@NonNull IBinder binder) {
         mThreadingDomain.assertCurrentThread();
 
-        ILocationTimeZoneProvider provider = ILocationTimeZoneProvider.Stub.asInterface(binder);
+        ITimeZoneProvider provider = ITimeZoneProvider.Stub.asInterface(binder);
 
         synchronized (mSharedLock) {
             try {
                 mManagerProxy = new ManagerProxy();
-                provider.setLocationTimeZoneProviderManager(mManagerProxy);
+                provider.setTimeZoneProviderManager(mManagerProxy);
                 trySendCurrentRequest();
                 mListener.onProviderBound();
             } catch (RemoteException e) {
@@ -118,7 +118,7 @@
     }
 
     @Override
-    final void setRequest(@NonNull LocationTimeZoneProviderRequest request) {
+    final void setRequest(@NonNull TimeZoneProviderRequest request) {
         mThreadingDomain.assertCurrentThread();
 
         Objects.requireNonNull(request);
@@ -131,11 +131,14 @@
 
     @GuardedBy("mProxyLock")
     private void trySendCurrentRequest() {
-        LocationTimeZoneProviderRequest request = mRequest;
+        TimeZoneProviderRequest request = mRequest;
         mServiceWatcher.runOnBinder(binder -> {
-            ILocationTimeZoneProvider service =
-                    ILocationTimeZoneProvider.Stub.asInterface(binder);
-            service.setRequest(request);
+            ITimeZoneProvider service = ITimeZoneProvider.Stub.asInterface(binder);
+            if (request.sendUpdates()) {
+                service.startUpdates(request.getInitializationTimeout().toMillis());
+            } else {
+                service.stopUpdates();
+            }
         });
     }
 
@@ -148,21 +151,39 @@
     }
 
     /**
-     * A system Server-side proxy for the ILocationTimeZoneProviderManager, i.e. this is a local
-     * binder stub. Each "remote" LocationTimeZoneProvider is passed a binder instance that it
-     * then uses to communicate back with the system server, invoking the logic here.
+     * A system Server-side proxy for the ITimeZoneProviderManager, i.e. this is a local binder stub
+     * Each "remote" TimeZoneProvider is passed a binder instance that it then uses to communicate
+     * back with the system server, invoking the logic here.
      */
-    private class ManagerProxy extends ILocationTimeZoneProviderManager.Stub {
+    private class ManagerProxy extends ITimeZoneProviderManager.Stub {
 
         // executed on binder thread
         @Override
-        public void onLocationTimeZoneEvent(LocationTimeZoneEvent locationTimeZoneEvent) {
+        public void onTimeZoneProviderSuggestion(TimeZoneProviderSuggestion suggestion) {
+            onTimeZoneProviderEvent(TimeZoneProviderEvent.createSuggestionEvent(suggestion));
+        }
+
+        // executed on binder thread
+        @Override
+        public void onTimeZoneProviderUncertain() {
+            onTimeZoneProviderEvent(TimeZoneProviderEvent.createUncertainEvent());
+
+        }
+
+        // executed on binder thread
+        @Override
+        public void onTimeZoneProviderPermanentFailure(String failureReason) {
+            onTimeZoneProviderEvent(
+                    TimeZoneProviderEvent.createPermanentFailureEvent(failureReason));
+        }
+
+        private void onTimeZoneProviderEvent(TimeZoneProviderEvent event) {
             synchronized (mSharedLock) {
                 if (mManagerProxy != this) {
                     return;
                 }
             }
-            handleLocationTimeZoneEvent(locationTimeZoneEvent);
+            handleTimeZoneProviderEvent(event);
         }
     }
 }
diff --git a/services/core/java/com/android/server/location/timezone/SimulatedBinderProviderEvent.java b/services/core/java/com/android/server/location/timezone/SimulatedBinderProviderEvent.java
index 7725309..0987ee5 100644
--- a/services/core/java/com/android/server/location/timezone/SimulatedBinderProviderEvent.java
+++ b/services/core/java/com/android/server/location/timezone/SimulatedBinderProviderEvent.java
@@ -16,9 +16,6 @@
 
 package com.android.server.location.timezone;
 
-import static com.android.internal.location.timezone.LocationTimeZoneEvent.EVENT_TYPE_PERMANENT_FAILURE;
-import static com.android.internal.location.timezone.LocationTimeZoneEvent.EVENT_TYPE_SUCCESS;
-import static com.android.internal.location.timezone.LocationTimeZoneEvent.EVENT_TYPE_UNCERTAIN;
 import static com.android.server.location.timezone.LocationTimeZoneManagerService.PRIMARY_PROVIDER_NAME;
 import static com.android.server.location.timezone.LocationTimeZoneManagerService.SECONDARY_PROVIDER_NAME;
 
@@ -26,8 +23,7 @@
 import android.annotation.Nullable;
 import android.os.ShellCommand;
 import android.os.SystemClock;
-
-import com.android.internal.location.timezone.LocationTimeZoneEvent;
+import android.service.timezone.TimeZoneProviderSuggestion;
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -50,14 +46,14 @@
 
 
     @NonNull private final String mProviderName;
-    private final int mEventType;
-    @Nullable private final LocationTimeZoneEvent mLocationTimeZoneEvent;
+    private final int mType;
+    @Nullable private final TimeZoneProviderEvent mTimeZoneProviderEvent;
 
     private SimulatedBinderProviderEvent(@NonNull String providerName, int eventType,
-            @Nullable LocationTimeZoneEvent locationTimeZoneEvent) {
+            @Nullable TimeZoneProviderEvent timeZoneProviderEvent) {
         this.mProviderName = Objects.requireNonNull(providerName);
-        this.mEventType = eventType;
-        this.mLocationTimeZoneEvent = locationTimeZoneEvent;
+        this.mType = eventType;
+        this.mTimeZoneProviderEvent = timeZoneProviderEvent;
     }
 
     @NonNull
@@ -66,24 +62,24 @@
     }
 
     @Nullable
-    LocationTimeZoneEvent getLocationTimeZoneEvent() {
-        return mLocationTimeZoneEvent;
+    TimeZoneProviderEvent getTimeZoneProviderEvent() {
+        return mTimeZoneProviderEvent;
     }
 
-    int getEventType() {
-        return mEventType;
+    int getType() {
+        return mType;
     }
 
     /** Prints the command line options that {@link #createFromArgs(ShellCommand)} understands. */
     static void printCommandLineOpts(PrintWriter pw) {
         pw.println("Simulated provider binder event:");
         pw.println();
-        pw.println("<provider name> [onBind|onUnbind|locationTimeZoneEvent"
+        pw.println("<provider name> [onBind|onUnbind|timeZoneProviderEvent"
                 + " <location time zone event args>]");
         pw.println();
         pw.println("<provider name> = " + VALID_PROVIDER_NAMES);
-        pw.println("<location time zone event args> ="
-                + " [PERMANENT_FAILURE|UNCERTAIN|SUCCESS <time zone ids>*]");
+        pw.println("<time zone provider event args> ="
+                + " [PERMANENT_FAILURE|UNCERTAIN|SUGGESTION <time zone ids>*]");
     }
 
     /**
@@ -104,8 +100,8 @@
                 return new SimulatedBinderProviderEvent(
                         providerName, INJECTED_EVENT_TYPE_ON_UNBIND, null);
             }
-            case "locationTimeZoneEvent": {
-                LocationTimeZoneEvent event = parseLocationTimeZoneEventArgs(shellCommand);
+            case "timeZoneProviderEvent": {
+                TimeZoneProviderEvent event = parseTimeZoneProviderEventArgs(shellCommand);
                 return new SimulatedBinderProviderEvent(providerName,
                         INJECTED_EVENT_TYPE_LOCATION_TIME_ZONE_EVENT, event);
             }
@@ -115,30 +111,31 @@
         }
     }
 
-    private static LocationTimeZoneEvent parseLocationTimeZoneEventArgs(ShellCommand shellCommand) {
-        LocationTimeZoneEvent.Builder eventBuilder = new LocationTimeZoneEvent.Builder()
-                .setElapsedRealtimeMillis(SystemClock.elapsedRealtime());
-
+    private static TimeZoneProviderEvent parseTimeZoneProviderEventArgs(ShellCommand shellCommand) {
+        TimeZoneProviderEvent event;
         String eventTypeString = shellCommand.getNextArgRequired();
         switch (eventTypeString.toUpperCase()) {
             case "PERMANENT_FAILURE": {
-                eventBuilder.setEventType(EVENT_TYPE_PERMANENT_FAILURE);
+                event = TimeZoneProviderEvent.createPermanentFailureEvent("Simulated");
                 break;
             }
             case "UNCERTAIN": {
-                eventBuilder.setEventType(EVENT_TYPE_UNCERTAIN);
+                event = TimeZoneProviderEvent.createUncertainEvent();
                 break;
             }
-            case "SUCCESS": {
-                eventBuilder.setEventType(EVENT_TYPE_SUCCESS)
-                        .setTimeZoneIds(parseTimeZoneArgs(shellCommand));
+            case "SUGGESTION": {
+                TimeZoneProviderSuggestion suggestion = new TimeZoneProviderSuggestion.Builder()
+                        .setElapsedRealtimeMillis(SystemClock.elapsedRealtime())
+                        .setTimeZoneIds(parseTimeZoneArgs(shellCommand))
+                        .build();
+                event = TimeZoneProviderEvent.createSuggestionEvent(suggestion);
                 break;
             }
             default: {
                 throw new IllegalArgumentException("Error: Unknown eventType: " + eventTypeString);
             }
         }
-        return eventBuilder.build();
+        return event;
     }
 
     private static List<String> parseTimeZoneArgs(ShellCommand shellCommand) {
@@ -154,8 +151,8 @@
     public String toString() {
         return "SimulatedBinderProviderEvent{"
                 + "mProviderName=" + mProviderName
-                + ", mEventType=" + mEventType
-                + ", mLocationTimeZoneEvent=" + mLocationTimeZoneEvent
+                + ", mType=" + mType
+                + ", mTimeZoneProviderEvent=" + mTimeZoneProviderEvent
                 + '}';
     }
 }
diff --git a/services/core/java/com/android/server/location/timezone/SimulatedLocationTimeZoneProviderProxy.java b/services/core/java/com/android/server/location/timezone/SimulatedLocationTimeZoneProviderProxy.java
index 5e66a99..cac5621 100644
--- a/services/core/java/com/android/server/location/timezone/SimulatedLocationTimeZoneProviderProxy.java
+++ b/services/core/java/com/android/server/location/timezone/SimulatedLocationTimeZoneProviderProxy.java
@@ -26,7 +26,6 @@
 import android.util.IndentingPrintWriter;
 
 import com.android.internal.annotations.GuardedBy;
-import com.android.internal.location.timezone.LocationTimeZoneProviderRequest;
 import com.android.server.timezonedetector.ReferenceWithHistory;
 
 import java.util.Objects;
@@ -38,7 +37,7 @@
 class SimulatedLocationTimeZoneProviderProxy extends LocationTimeZoneProviderProxy {
 
     @GuardedBy("mSharedLock")
-    @NonNull private LocationTimeZoneProviderRequest mRequest;
+    @NonNull private TimeZoneProviderRequest mRequest;
 
     @GuardedBy("mSharedLock")
     @NonNull private final ReferenceWithHistory<String> mLastEvent = new ReferenceWithHistory<>(50);
@@ -46,7 +45,7 @@
     SimulatedLocationTimeZoneProviderProxy(
             @NonNull Context context, @NonNull ThreadingDomain threadingDomain) {
         super(context, threadingDomain);
-        mRequest = LocationTimeZoneProviderRequest.EMPTY_REQUEST;
+        mRequest = TimeZoneProviderRequest.createStopUpdatesRequest();
     }
 
     @Override
@@ -60,7 +59,7 @@
         Objects.requireNonNull(event);
 
         synchronized (mSharedLock) {
-            switch (event.getEventType()) {
+            switch (event.getType()) {
                 case INJECTED_EVENT_TYPE_ON_BIND: {
                     mLastEvent.set("Simulating onProviderBound(), event=" + event);
                     mThreadingDomain.post(this::onBindOnHandlerThread);
@@ -72,12 +71,12 @@
                     break;
                 }
                 case INJECTED_EVENT_TYPE_LOCATION_TIME_ZONE_EVENT: {
-                    if (!mRequest.getReportLocationTimeZone()) {
+                    if (!mRequest.sendUpdates()) {
                         mLastEvent.set("Test event=" + event + " is testing an invalid case:"
                                 + " reporting is off. mRequest=" + mRequest);
                     }
-                    mLastEvent.set("Simulating LocationTimeZoneEvent, event=" + event);
-                    handleLocationTimeZoneEvent(event.getLocationTimeZoneEvent());
+                    mLastEvent.set("Simulating TimeZoneProviderResult, event=" + event);
+                    handleTimeZoneProviderEvent(event.getTimeZoneProviderEvent());
                     break;
                 }
                 default: {
@@ -106,7 +105,7 @@
     }
 
     @Override
-    final void setRequest(@NonNull LocationTimeZoneProviderRequest request) {
+    final void setRequest(@NonNull TimeZoneProviderRequest request) {
         mThreadingDomain.assertCurrentThread();
 
         Objects.requireNonNull(request);
diff --git a/services/core/java/com/android/server/location/timezone/ThreadingDomain.java b/services/core/java/com/android/server/location/timezone/ThreadingDomain.java
index d55d3ed..a50f8ad 100644
--- a/services/core/java/com/android/server/location/timezone/ThreadingDomain.java
+++ b/services/core/java/com/android/server/location/timezone/ThreadingDomain.java
@@ -16,6 +16,7 @@
 
 package com.android.server.location.timezone;
 
+import android.annotation.DurationMillisLong;
 import android.annotation.NonNull;
 
 import com.android.internal.util.Preconditions;
@@ -68,9 +69,9 @@
     /**
      * Execute the supplied runnable on the threading domain's thread with a delay.
      */
-    abstract void postDelayed(@NonNull Runnable runnable, long delayMillis);
+    abstract void postDelayed(@NonNull Runnable runnable, @DurationMillisLong long delayMillis);
 
-    abstract void postDelayed(Runnable r, Object token, long delayMillis);
+    abstract void postDelayed(Runnable r, Object token, @DurationMillisLong long delayMillis);
 
     abstract void removeQueuedRunnables(Object token);
 
@@ -90,6 +91,7 @@
     final class SingleRunnableQueue {
 
         private boolean mIsQueued;
+        @DurationMillisLong
         private long mDelayMillis;
 
         /**
@@ -97,7 +99,7 @@
          * handler thread, cancelling any queued but not-yet-executed {@link Runnable} previously
          * added by this. This method must be called from the threading domain's thread.
          */
-        void runDelayed(Runnable r, long delayMillis) {
+        void runDelayed(Runnable r, @DurationMillisLong long delayMillis) {
             cancel();
             mIsQueued = true;
             mDelayMillis = delayMillis;
@@ -122,6 +124,7 @@
          * IllegalStateException} if nothing is currently queued, see {@link #hasQueued()}.
          * This method must be called from the threading domain's thread.
          */
+        @DurationMillisLong
         long getQueuedDelayMillis() {
             assertCurrentThread();
             if (!mIsQueued) {
diff --git a/services/core/java/com/android/server/location/timezone/TimeZoneProviderEvent.java b/services/core/java/com/android/server/location/timezone/TimeZoneProviderEvent.java
new file mode 100644
index 0000000..2d6f8ad
--- /dev/null
+++ b/services/core/java/com/android/server/location/timezone/TimeZoneProviderEvent.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.location.timezone;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.service.timezone.TimeZoneProviderService;
+import android.service.timezone.TimeZoneProviderSuggestion;
+
+import java.util.Objects;
+
+/**
+ * An event from a {@link TimeZoneProviderService}.
+ */
+final class TimeZoneProviderEvent {
+
+    @IntDef(prefix = "EVENT_TYPE_",
+            value = { EVENT_TYPE_PERMANENT_FAILURE, EVENT_TYPE_SUGGESTION, EVENT_TYPE_UNCERTAIN })
+    public @interface EventType {}
+
+    /**
+     * The provider failed permanently. See {@link
+     * TimeZoneProviderService#reportPermanentFailure(Throwable)}
+     */
+    public static final int EVENT_TYPE_PERMANENT_FAILURE = 1;
+
+    /**
+     * The provider made a suggestion. See {@link
+     * TimeZoneProviderService#reportSuggestion(TimeZoneProviderSuggestion)}
+     */
+    public static final int EVENT_TYPE_SUGGESTION = 2;
+
+    /**
+     * The provider was uncertain about the time zone. See {@link
+     * TimeZoneProviderService#reportUncertain()}
+     */
+    public static final int EVENT_TYPE_UNCERTAIN = 3;
+
+    private static final TimeZoneProviderEvent UNCERTAIN_EVENT =
+            new TimeZoneProviderEvent(EVENT_TYPE_UNCERTAIN, null, null);
+
+    @EventType
+    private final int mType;
+
+    @Nullable
+    private final TimeZoneProviderSuggestion mSuggestion;
+
+    @Nullable
+    private final String mFailureCause;
+
+    private TimeZoneProviderEvent(@EventType int type,
+            @Nullable TimeZoneProviderSuggestion suggestion,
+            @Nullable String failureCause) {
+        mType = type;
+        mSuggestion = suggestion;
+        mFailureCause = failureCause;
+    }
+
+    /** Returns a event of type {@link #EVENT_TYPE_SUGGESTION}. */
+    public static TimeZoneProviderEvent createSuggestionEvent(
+            @NonNull TimeZoneProviderSuggestion suggestion) {
+        return new TimeZoneProviderEvent(EVENT_TYPE_SUGGESTION,
+                Objects.requireNonNull(suggestion), null);
+    }
+
+    /** Returns a event of type {@link #EVENT_TYPE_UNCERTAIN}. */
+    public static TimeZoneProviderEvent createUncertainEvent() {
+        return UNCERTAIN_EVENT;
+    }
+
+    /** Returns a event of type {@link #EVENT_TYPE_PERMANENT_FAILURE}. */
+    public static TimeZoneProviderEvent createPermanentFailureEvent(@NonNull String cause) {
+        return new TimeZoneProviderEvent(EVENT_TYPE_PERMANENT_FAILURE, null,
+                Objects.requireNonNull(cause));
+    }
+
+    /**
+     * Returns the event type.
+     */
+    public @EventType int getType() {
+        return mType;
+    }
+
+    /**
+     * Returns the suggestion. Populated when {@link #getType()} is {@link #EVENT_TYPE_SUGGESTION}.
+     */
+    @Nullable
+    public TimeZoneProviderSuggestion getSuggestion() {
+        return mSuggestion;
+    }
+
+    /**
+     * Returns the failure cauese. Populated when {@link #getType()} is {@link
+     * #EVENT_TYPE_PERMANENT_FAILURE}.
+     */
+    @Nullable
+    public String getFailureCause() {
+        return mFailureCause;
+    }
+
+    @Override
+    public String toString() {
+        return "TimeZoneProviderEvent{"
+                + "mType=" + mType
+                + ", mSuggestion=" + mSuggestion
+                + ", mFailureCause=" + mFailureCause
+                + '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        TimeZoneProviderEvent that = (TimeZoneProviderEvent) o;
+        return mType == that.mType
+                && Objects.equals(mSuggestion, that.mSuggestion)
+                && Objects.equals(mFailureCause, that.mFailureCause);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mType, mSuggestion, mFailureCause);
+    }
+}
diff --git a/services/core/java/com/android/server/location/timezone/TimeZoneProviderRequest.java b/services/core/java/com/android/server/location/timezone/TimeZoneProviderRequest.java
new file mode 100644
index 0000000..649a74b
--- /dev/null
+++ b/services/core/java/com/android/server/location/timezone/TimeZoneProviderRequest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.location.timezone;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
+import java.time.Duration;
+import java.util.Objects;
+
+/**
+ * This class encapsulates a request to a provider.
+ */
+final class TimeZoneProviderRequest {
+
+    @NonNull
+    private static final TimeZoneProviderRequest STOP_UPDATES =
+            new TimeZoneProviderRequest(
+                    false /* sendUpdates */,
+                    null /* initializationTimeout */);
+
+    private final boolean mSendUpdates;
+
+    @Nullable
+    private final Duration mInitializationTimeout;
+
+    private TimeZoneProviderRequest(
+            boolean sendUpdates, @Nullable Duration initializationTimeout) {
+        mSendUpdates = sendUpdates;
+        mInitializationTimeout = initializationTimeout;
+    }
+
+    /** Creates a request to start updates with the specified timeout. */
+    public static TimeZoneProviderRequest createStartUpdatesRequest(
+            @NonNull Duration initializationTimeout) {
+        return new TimeZoneProviderRequest(true, Objects.requireNonNull(initializationTimeout));
+    }
+
+    /** Creates a request to stop updates. */
+    public static TimeZoneProviderRequest createStopUpdatesRequest() {
+        return STOP_UPDATES;
+    }
+
+    /**
+     * Returns {@code true} if the provider should send updates related to the device's current
+     * time zone, {@code false} otherwise.
+     */
+    public boolean sendUpdates() {
+        return mSendUpdates;
+    }
+
+    // TODO(b/152744911) - once there are a couple of implementations, decide whether this needs to
+    //  be passed to the TimeZoneProviderService and remove if it is not useful.
+    /**
+     * Returns the maximum time that the provider is allowed to initialize before it is expected to
+     * send an event of any sort. Only valid when {@link #sendUpdates()} is {@code true}. Failure to
+     * send an event in this time (with some fuzz) may be interpreted as if the provider is
+     * uncertain of the time zone, and/or it could lead to the provider being stopped.
+     */
+    @Nullable
+    public Duration getInitializationTimeout() {
+        return mInitializationTimeout;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        TimeZoneProviderRequest
+                that = (TimeZoneProviderRequest) o;
+        return mSendUpdates == that.mSendUpdates
+                && mInitializationTimeout == that.mInitializationTimeout;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mSendUpdates, mInitializationTimeout);
+    }
+
+    @Override
+    public String toString() {
+        return "TimeZoneProviderRequest{"
+                + "mSendUpdates=" + mSendUpdates
+                + ", mInitializationTimeout=" + mInitializationTimeout
+                + "}";
+    }
+}
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 11dbef2..4be7689 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -40,7 +40,6 @@
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.content.pm.ParceledListSlice;
-import android.content.pm.UserInfo;
 import android.media.AudioManager;
 import android.media.AudioPlaybackConfiguration;
 import android.media.IRemoteVolumeControllerCallback;
@@ -393,15 +392,17 @@
         synchronized (mLock) {
             UserManager manager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
             mFullUserIds.clear();
-            List<UserInfo> allUsers = manager.getUsers();
+            List<UserHandle> allUsers = manager.getUserHandles(/*excludeDying=*/false);
             if (allUsers != null) {
-                for (UserInfo userInfo : allUsers) {
-                    if (userInfo.isManagedProfile()) {
-                        mFullUserIds.put(userInfo.id, userInfo.profileGroupId);
+                for (UserHandle user : allUsers) {
+                    UserHandle parent = manager.getProfileParent(user);
+                    if (parent != null) {
+                        mFullUserIds.put(user.getIdentifier(), parent.getIdentifier());
                     } else {
-                        mFullUserIds.put(userInfo.id, userInfo.id);
-                        if (mUserRecords.get(userInfo.id) == null) {
-                            mUserRecords.put(userInfo.id, new FullUserRecord(userInfo.id));
+                        mFullUserIds.put(user.getIdentifier(), user.getIdentifier());
+                        if (mUserRecords.get(user.getIdentifier()) == null) {
+                            mUserRecords.put(user.getIdentifier(),
+                                    new FullUserRecord(user.getIdentifier()));
                         }
                     }
                 }
diff --git a/services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java b/services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java
index a234f5a..1d73abc 100644
--- a/services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java
+++ b/services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java
@@ -14,14 +14,17 @@
  * limitations under the License.
  */
 package com.android.server.pm;
-
+import static android.Manifest.permission.CONFIGURE_INTERACT_ACROSS_PROFILES;
+import static android.Manifest.permission.INTERACT_ACROSS_PROFILES;
+import static android.Manifest.permission.INTERACT_ACROSS_USERS;
+import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
+import static android.Manifest.permission.MANAGE_APP_OPS_MODES;
 import static android.app.AppOpsManager.OP_INTERACT_ACROSS_PROFILES;
 import static android.content.Intent.FLAG_RECEIVER_REGISTERED_ONLY;
 import static android.content.pm.CrossProfileApps.ACTION_CAN_INTERACT_ACROSS_PROFILES_CHANGED;
 import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
 import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
 
-import android.Manifest;
 import android.annotation.UserIdInt;
 import android.app.ActivityManager;
 import android.app.ActivityManagerInternal;
@@ -31,7 +34,6 @@
 import android.app.AppOpsManager.Mode;
 import android.app.IApplicationThread;
 import android.app.admin.DevicePolicyEventLogger;
-import android.app.admin.DevicePolicyManager;
 import android.app.admin.DevicePolicyManagerInternal;
 import android.content.ComponentName;
 import android.content.Context;
@@ -154,15 +156,15 @@
             if (callerUserId != userId) {
                 final int permissionFlag =  PermissionChecker.checkPermissionForPreflight(
                         mContext,
-                        android.Manifest.permission.INTERACT_ACROSS_PROFILES,
+                        INTERACT_ACROSS_PROFILES,
                         callingPid,
                         callingUid,
                         callingPackage);
                 if (permissionFlag != PermissionChecker.PERMISSION_GRANTED
                         || !isSameProfileGroup(callerUserId, userId)) {
                     throw new SecurityException("Attempt to launch activity without required "
-                            + android.Manifest.permission.INTERACT_ACROSS_PROFILES + " permission"
-                            + " or target user is not in the same profile group.");
+                            + INTERACT_ACROSS_PROFILES
+                            + " permission or target user is not in the same profile group.");
                 }
             }
             launchIntent.setComponent(component);
@@ -217,8 +219,8 @@
         if (callerUserId != userId) {
             if (!hasCallerGotInteractAcrossProfilesPermission(callingPackage)) {
                 throw new SecurityException("Attempt to launch activity without required "
-                        + android.Manifest.permission.INTERACT_ACROSS_PROFILES + " permission"
-                        + " or target user is not in the same profile group.");
+                        + INTERACT_ACROSS_PROFILES
+                        + " permission or target user is not in the same profile group.");
             }
         }
 
@@ -294,13 +296,13 @@
                 callingPackage, mInjector.getCallingUid(), mInjector.getCallingPid());
     }
 
-    private boolean isCrossProfilePackageWhitelisted(String packageName) {
+    private boolean isCrossProfilePackageAllowlisted(String packageName) {
         return mInjector.withCleanCallingIdentity(() ->
                 mInjector.getDevicePolicyManagerInternal()
                         .getAllCrossProfilePackages().contains(packageName));
     }
 
-    private boolean isCrossProfilePackageWhitelistedByDefault(String packageName) {
+    private boolean isCrossProfilePackageAllowlistedByDefault(String packageName) {
         return mInjector.withCleanCallingIdentity(() ->
                 mInjector.getDevicePolicyManagerInternal()
                         .getDefaultCrossProfilePackages().contains(packageName));
@@ -388,32 +390,36 @@
     /**
      * See {@link android.content.pm.CrossProfileApps#setInteractAcrossProfilesAppOp(String, int)}.
      *
-     * <p>Logs metrics. Use {@link #setInteractAcrossProfilesAppOpUnchecked(String, int, boolean)}
-     * to avoid permission checks or to specify not to log metrics.
+     * <p>Use {@link #setInteractAcrossProfilesAppOpUnchecked(String, int, int)} to avoid permission
+     * checks.
      */
     @Override
     public void setInteractAcrossProfilesAppOp(String packageName, @Mode int newMode) {
+        setInteractAcrossProfilesAppOp(packageName, newMode, mInjector.getCallingUserId());
+    }
+
+    private void setInteractAcrossProfilesAppOp(
+            String packageName, @Mode int newMode, @UserIdInt int userId) {
         final int callingUid = mInjector.getCallingUid();
-        if (!isPermissionGranted(Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingUid)
-                && !isPermissionGranted(Manifest.permission.INTERACT_ACROSS_USERS, callingUid)) {
+        if (!isPermissionGranted(INTERACT_ACROSS_USERS_FULL, callingUid)
+                && !isPermissionGranted(INTERACT_ACROSS_USERS, callingUid)) {
             throw new SecurityException(
                     "INTERACT_ACROSS_USERS or INTERACT_ACROSS_USERS_FULL is required to set the"
                             + " app-op for interacting across profiles.");
         }
-        if (!isPermissionGranted(Manifest.permission.MANAGE_APP_OPS_MODES, callingUid)
-                && !isPermissionGranted(
-                        Manifest.permission.CONFIGURE_INTERACT_ACROSS_PROFILES, callingUid)) {
+        if (!isPermissionGranted(MANAGE_APP_OPS_MODES, callingUid)
+                && !isPermissionGranted(CONFIGURE_INTERACT_ACROSS_PROFILES, callingUid)) {
             throw new SecurityException(
                     "MANAGE_APP_OPS_MODES or CONFIGURE_INTERACT_ACROSS_PROFILES is required to set"
                             + " the app-op for interacting across profiles.");
         }
-        setInteractAcrossProfilesAppOpUnchecked(packageName, newMode, /* logMetrics= */ true);
+        setInteractAcrossProfilesAppOpUnchecked(packageName, newMode, userId);
     }
 
     private void setInteractAcrossProfilesAppOpUnchecked(
-            String packageName, @Mode int newMode, boolean logMetrics) {
+            String packageName, @Mode int newMode, @UserIdInt int userId) {
         if (newMode == AppOpsManager.MODE_ALLOWED
-                && !canConfigureInteractAcrossProfiles(packageName)) {
+                && !canConfigureInteractAcrossProfiles(packageName, userId)) {
             // The user should not be prompted for apps that cannot request to interact across
             // profiles. However, we return early here if required to avoid race conditions.
             Slog.e(TAG, "Tried to turn on the appop for interacting across profiles for invalid"
@@ -421,56 +427,57 @@
             return;
         }
         final int[] profileIds =
-                mInjector.getUserManager()
-                        .getProfileIds(mInjector.getCallingUserId(), /* enabledOnly= */ false);
+                mInjector.getUserManager().getProfileIds(userId, /* enabledOnly= */ false);
         for (int profileId : profileIds) {
             if (!isPackageInstalled(packageName, profileId)) {
                 continue;
             }
-            setInteractAcrossProfilesAppOpForUser(packageName, newMode, profileId, logMetrics);
+            // Only log once per profile group by checking against the user ID.
+            setInteractAcrossProfilesAppOpForProfile(
+                    packageName, newMode, profileId, /* logMetrics= */ profileId == userId);
         }
     }
 
+    /**
+     * Returns whether the given package name is installed in the given user ID. The calling UID is
+     * used as the filter calling UID, as described at {@link PackageManagerInternal#getPackageInfo(
+     * String, int, int, int)}.
+     */
     private boolean isPackageInstalled(String packageName, @UserIdInt int userId) {
-        final int callingUid = mInjector.getCallingUid();
         return mInjector.withCleanCallingIdentity(() -> {
+            final int flags = MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE;
             final PackageInfo info =
                     mInjector.getPackageManagerInternal()
-                            .getPackageInfo(
-                                    packageName,
-                                    MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE,
-                                    callingUid,
-                                    userId);
+                            .getPackageInfo(packageName, flags, mInjector.getCallingUid(), userId);
             return info != null;
         });
     }
 
-    private void setInteractAcrossProfilesAppOpForUser(
-            String packageName, @Mode int newMode, @UserIdInt int userId, boolean logMetrics) {
+    private void setInteractAcrossProfilesAppOpForProfile(
+            String packageName, @Mode int newMode, @UserIdInt int profileId, boolean logMetrics) {
         try {
-            setInteractAcrossProfilesAppOpForUserOrThrow(packageName, newMode, userId, logMetrics);
+            setInteractAcrossProfilesAppOpForProfileOrThrow(
+                    packageName, newMode, profileId, logMetrics);
         } catch (PackageManager.NameNotFoundException e) {
-            Slog.e(TAG, "Missing package " + packageName + " on user ID " + userId, e);
+            Slog.e(TAG, "Missing package " + packageName + " on profile user ID " + profileId, e);
         }
     }
 
-    private void setInteractAcrossProfilesAppOpForUserOrThrow(
-            String packageName, @Mode int newMode, @UserIdInt int userId, boolean logMetrics)
+    private void setInteractAcrossProfilesAppOpForProfileOrThrow(
+            String packageName, @Mode int newMode, @UserIdInt int profileId, boolean logMetrics)
             throws PackageManager.NameNotFoundException {
         final int uid = mInjector.getPackageManager()
-                .getPackageUidAsUser(packageName, /* flags= */ 0, userId);
+                .getPackageUidAsUser(packageName, /* flags= */ 0, profileId);
         if (currentModeEquals(newMode, packageName, uid)) {
             Slog.i(TAG, "Attempt to set mode to existing value of " + newMode + " for "
-                    + packageName + " on user ID " + userId);
+                    + packageName + " on profile user ID " + profileId);
             return;
         }
 
         final boolean hadPermission = hasInteractAcrossProfilesPermission(
                 packageName, uid, PermissionChecker.PID_UNKNOWN);
 
-        final int callingUid = mInjector.getCallingUid();
-        if (isPermissionGranted(
-                Manifest.permission.CONFIGURE_INTERACT_ACROSS_PROFILES, callingUid)) {
+        if (isPermissionGranted(CONFIGURE_INTERACT_ACROSS_PROFILES, mInjector.getCallingUid())) {
             // Clear calling identity since the CONFIGURE_INTERACT_ACROSS_PROFILES permission allows
             // this particular app-op to be modified without the broader app-op permissions.
             mInjector.withCleanCallingIdentity(() ->
@@ -483,16 +490,15 @@
         // Kill the UID before sending the broadcast to ensure that apps can be informed when
         // their app-op has been revoked.
         maybeKillUid(packageName, uid, hadPermission);
-        sendCanInteractAcrossProfilesChangedBroadcast(packageName, uid, UserHandle.of(userId));
-        maybeLogSetInteractAcrossProfilesAppOp(packageName, newMode, userId, logMetrics, uid);
+        sendCanInteractAcrossProfilesChangedBroadcast(packageName, uid, UserHandle.of(profileId));
+        maybeLogSetInteractAcrossProfilesAppOp(packageName, newMode, logMetrics, uid);
     }
 
     /**
      * Kills the process represented by the given UID if it has lost the permission to
      * interact across profiles.
      */
-    private void maybeKillUid(
-            String packageName, int uid, boolean hadPermission) {
+    private void maybeKillUid(String packageName, int uid, boolean hadPermission) {
         if (!hadPermission) {
             return;
         }
@@ -503,18 +509,10 @@
     }
 
     private void maybeLogSetInteractAcrossProfilesAppOp(
-            String packageName,
-            @Mode int newMode,
-            @UserIdInt int userId,
-            boolean logMetrics,
-            int uid) {
+            String packageName, @Mode int newMode, boolean logMetrics, int uid) {
         if (!logMetrics) {
             return;
         }
-        if (userId != mInjector.getCallingUserId()) {
-            // Only log once per profile group by checking for the calling user ID.
-            return;
-        }
         DevicePolicyEventLogger
                 .createEvent(DevicePolicyEnums.SET_INTERACT_ACROSS_PROFILES_APP_OP)
                 .setStrings(packageName)
@@ -529,8 +527,7 @@
      * any necessary permission checks.
      */
     private boolean currentModeEquals(@Mode int otherMode, String packageName, int uid) {
-        final String op =
-                AppOpsManager.permissionToOp(Manifest.permission.INTERACT_ACROSS_PROFILES);
+        final String op = AppOpsManager.permissionToOp(INTERACT_ACROSS_PROFILES);
         return mInjector.withCleanCallingIdentity(() -> otherMode
                 == mInjector.getAppOpsManager().unsafeCheckOpNoThrow(op, uid, packageName));
     }
@@ -562,37 +559,49 @@
 
     @Override
     public boolean canConfigureInteractAcrossProfiles(String packageName) {
-        if (!canUserAttemptToConfigureInteractAcrossProfiles(packageName)) {
+        return canConfigureInteractAcrossProfiles(packageName, mInjector.getCallingUserId());
+    }
+
+    private boolean canConfigureInteractAcrossProfiles(String packageName, @UserIdInt int userId) {
+        if (!canUserAttemptToConfigureInteractAcrossProfiles(packageName, userId)) {
             return false;
         }
-        if (!hasOtherProfileWithPackageInstalled(packageName, mInjector.getCallingUserId())) {
+        if (!hasOtherProfileWithPackageInstalled(packageName, userId)) {
             return false;
         }
         if (!hasRequestedAppOpPermission(
                 AppOpsManager.opToPermission(OP_INTERACT_ACROSS_PROFILES), packageName)) {
             return false;
         }
-        return isCrossProfilePackageWhitelisted(packageName);
+        return isCrossProfilePackageAllowlisted(packageName);
     }
 
     @Override
     public boolean canUserAttemptToConfigureInteractAcrossProfiles(String packageName) {
-        final int[] profileIds = mInjector.getUserManager().getProfileIds(
-                mInjector.getCallingUserId(), /* enabledOnly= */ false);
+        return canUserAttemptToConfigureInteractAcrossProfiles(
+                packageName, mInjector.getCallingUserId());
+    }
+
+    private boolean canUserAttemptToConfigureInteractAcrossProfiles(
+            String packageName, @UserIdInt int userId) {
+        final int[] profileIds =
+                mInjector.getUserManager().getProfileIds(userId, /* enabledOnly= */ false);
         if (profileIds.length < 2) {
             return false;
         }
         if (isProfileOwner(packageName, profileIds)) {
             return false;
         }
-        return hasRequestedAppOpPermission(
-                AppOpsManager.opToPermission(OP_INTERACT_ACROSS_PROFILES), packageName)
-                && !isPlatformSignedAppWithNonUserConfigurablePermission(packageName, profileIds);
+        if (!hasRequestedAppOpPermission(
+                AppOpsManager.opToPermission(OP_INTERACT_ACROSS_PROFILES), packageName)) {
+            return false;
+        }
+        return !isPlatformSignedAppWithNonUserConfigurablePermission(packageName, profileIds);
     }
 
     private boolean isPlatformSignedAppWithNonUserConfigurablePermission(
             String packageName, int[] profileIds) {
-        return !isCrossProfilePackageWhitelistedByDefault(packageName)
+        return !isCrossProfilePackageAllowlistedByDefault(packageName)
                 && isPlatformSignedAppWithAutomaticProfilesPermission(packageName, profileIds);
     }
 
@@ -610,7 +619,7 @@
             if (uid == -1) {
                 continue;
             }
-            if (isPermissionGranted(Manifest.permission.INTERACT_ACROSS_PROFILES, uid)) {
+            if (isPermissionGranted(INTERACT_ACROSS_PROFILES, uid)) {
                 return true;
             }
         }
@@ -642,7 +651,7 @@
             return;
         }
         final String op =
-                AppOpsManager.permissionToOp(Manifest.permission.INTERACT_ACROSS_PROFILES);
+                AppOpsManager.permissionToOp(INTERACT_ACROSS_PROFILES);
         setInteractAcrossProfilesAppOp(packageName, AppOpsManager.opToDefaultMode(op));
     }
 
@@ -650,7 +659,7 @@
     public void clearInteractAcrossProfilesAppOps() {
         final int defaultMode =
                 AppOpsManager.opToDefaultMode(
-                        AppOpsManager.permissionToOp(Manifest.permission.INTERACT_ACROSS_PROFILES));
+                        AppOpsManager.permissionToOp(INTERACT_ACROSS_PROFILES));
         findAllPackageNames()
                 .forEach(packageName -> setInteractAcrossProfilesAppOp(packageName, defaultMode));
     }
@@ -695,17 +704,13 @@
     }
 
     private boolean hasInteractAcrossProfilesPermission(String packageName, int uid, int pid) {
-        if (isPermissionGranted(Manifest.permission.INTERACT_ACROSS_USERS_FULL, uid)
-                || isPermissionGranted(Manifest.permission.INTERACT_ACROSS_USERS, uid)) {
+        if (isPermissionGranted(INTERACT_ACROSS_USERS_FULL, uid)
+                || isPermissionGranted(INTERACT_ACROSS_USERS, uid)) {
             return true;
         }
         return PermissionChecker.PERMISSION_GRANTED
                 == PermissionChecker.checkPermissionForPreflight(
-                        mContext,
-                        Manifest.permission.INTERACT_ACROSS_PROFILES,
-                        pid,
-                        uid,
-                        packageName);
+                        mContext, INTERACT_ACROSS_PROFILES, pid, uid, packageName);
     }
 
     private boolean isProfileOwner(String packageName, int[] userIds) {
@@ -898,5 +903,12 @@
         public List<UserHandle> getTargetUserProfiles(String packageName, int userId) {
             return getTargetUserProfilesUnchecked(packageName, userId);
         }
+
+        @Override
+        public void setInteractAcrossProfilesAppOp(
+                String packageName, int newMode, @UserIdInt int userId) {
+            CrossProfileAppsServiceImpl.this.setInteractAcrossProfilesAppOpUnchecked(
+                    packageName, newMode, userId);
+        }
     }
 }
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 9e48ddd..2d393c0 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -291,23 +291,23 @@
     }
 
     void restoreAndApplyStagedSessionIfNeeded() {
-        List<PackageInstallerSession> stagedSessionsToRestore = new ArrayList<>();
+        List<StagingManager.StagedSession> stagedSessionsToRestore = new ArrayList<>();
         synchronized (mSessions) {
             for (int i = 0; i < mSessions.size(); i++) {
                 final PackageInstallerSession session = mSessions.valueAt(i);
                 if (session.isStaged()) {
-                    stagedSessionsToRestore.add(session);
+                    stagedSessionsToRestore.add(session.mStagedSession);
                 }
             }
         }
         // Don't hold mSessions lock when calling restoreSession, since it might trigger an APK
         // atomic install which needs to query sessions, which requires lock on mSessions.
         boolean isDeviceUpgrading = mPm.isDeviceUpgrading();
-        for (PackageInstallerSession session : stagedSessionsToRestore) {
-            if (!session.isStagedAndInTerminalState() && session.hasParentSessionId()
+        for (StagingManager.StagedSession session : stagedSessionsToRestore) {
+            if (!session.isInTerminalState() && session.hasParentSessionId()
                     && getSession(session.getParentSessionId()) == null) {
-                session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED,
-                        "An orphan staged session " + session.sessionId + " is found, "
+                session.setSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED,
+                        "An orphan staged session " + session.sessionId() + " is found, "
                                 + "parent " + session.getParentSessionId() + " is missing");
             }
             mStagingManager.restoreSession(session, isDeviceUpgrading);
@@ -1399,7 +1399,7 @@
                 @Override
                 public void run() {
                     if (session.isStaged() && !success) {
-                        mStagingManager.abortSession(session);
+                        mStagingManager.abortSession(session.mStagedSession);
                     }
                     synchronized (mSessions) {
                         if (!session.isStaged() || !success) {
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 2537e1b..f97a5ee 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -429,30 +429,341 @@
     @GuardedBy("mLock")
     private ArrayMap<String, List<CertifiedChecksum>> mChecksums = new ArrayMap<>();
 
-    @GuardedBy("mLock")
-    private boolean mStagedSessionApplied;
-    @GuardedBy("mLock")
-    private boolean mStagedSessionReady;
-    @GuardedBy("mLock")
-    private boolean mStagedSessionFailed;
-    @GuardedBy("mLock")
-    private int mStagedSessionErrorCode = SessionInfo.STAGED_SESSION_NO_ERROR;
-    @GuardedBy("mLock")
-    private String mStagedSessionErrorMessage;
-
-    /**
-     * The callback to run when pre-reboot verification has ended. Used by {@link #abandonStaged()}
-     * to delay session clean-up until it is safe to do so.
-     */
-    @GuardedBy("mLock")
     @Nullable
-    private Runnable mPendingAbandonCallback;
-    /**
-     * {@code true} if pre-reboot verification is ongoing which means it is not safe for
-     * {@link #abandon()} to clean up staging directories.
-     */
-    @GuardedBy("mLock")
-    private boolean mInPreRebootVerification;
+    final StagedSession mStagedSession;
+
+    @VisibleForTesting
+    public class StagedSession implements StagingManager.StagedSession {
+        @GuardedBy("mLock")
+        private boolean mSessionApplied;
+        @GuardedBy("mLock")
+        private boolean mSessionReady;
+        @GuardedBy("mLock")
+        private boolean mSessionFailed;
+        @GuardedBy("mLock")
+        private int mSessionErrorCode = SessionInfo.STAGED_SESSION_NO_ERROR;
+        @GuardedBy("mLock")
+        private String mSessionErrorMessage;
+
+        /**
+         * The callback to run when pre-reboot verification has ended. Used by {@link #abandon()}
+         * to delay session clean-up until it is safe to do so.
+         */
+        @GuardedBy("mLock")
+        @Nullable
+        private Runnable mPendingAbandonCallback;
+        /**
+         * {@code true} if pre-reboot verification is ongoing which means it is not safe for
+         * {@link #abandon()} to clean up staging directories.
+         */
+        @GuardedBy("mLock")
+        private boolean mInPreRebootVerification;
+
+        StagedSession(boolean isReady, boolean isApplied, boolean isFailed, int errorCode,
+                String errorMessage) {
+            mSessionReady = isReady;
+            mSessionApplied = isApplied;
+            mSessionFailed = isFailed;
+            mSessionErrorCode = errorCode;
+            mSessionErrorMessage = errorMessage != null ? errorMessage : "";
+        }
+
+        @Override
+        public List<StagingManager.StagedSession> getChildSessions() {
+            if (!params.isMultiPackage) {
+                return Collections.EMPTY_LIST;
+            }
+            synchronized (mLock) {
+                int size = mChildSessions.size();
+                List<StagingManager.StagedSession> childSessions = new ArrayList<>(size);
+                for (int i = 0; i < size; ++i) {
+                    childSessions.add(mChildSessions.valueAt(i).mStagedSession);
+                }
+                return childSessions;
+            }
+        }
+
+        @Override
+        public SessionParams sessionParams() {
+            return params;
+        }
+
+        @Override
+        public boolean isMultiPackage() {
+            return params.isMultiPackage;
+        }
+
+        @Override
+        public boolean isApexSession() {
+            return (params.installFlags & PackageManager.INSTALL_APEX) != 0;
+        }
+
+        @Override
+        public int sessionId() {
+            return sessionId;
+        }
+
+        @Override
+        public boolean containsApexSession() {
+            return sessionContains((s) -> s.isApexSession());
+        }
+
+        @Override
+        public String getPackageName() {
+            return PackageInstallerSession.this.getPackageName();
+        }
+
+        @Override
+        public void setSessionReady() {
+            synchronized (mLock) {
+                // Do not allow destroyed/failed staged session to change state
+                if (mDestroyed || mSessionFailed) return;
+                mSessionReady = true;
+                mSessionApplied = false;
+                mSessionFailed = false;
+                mSessionErrorCode = SessionInfo.STAGED_SESSION_NO_ERROR;
+                mSessionErrorMessage = "";
+            }
+            mCallback.onStagedSessionChanged(PackageInstallerSession.this);
+        }
+
+        @Override
+        public void setSessionFailed(int errorCode, String errorMessage) {
+            List<PackageInstallerSession> childSessions;
+            synchronized (mLock) {
+                // Do not allow destroyed/failed staged session to change state
+                if (mDestroyed || mSessionFailed) return;
+                mSessionReady = false;
+                mSessionApplied = false;
+                mSessionFailed = true;
+                mSessionErrorCode = errorCode;
+                mSessionErrorMessage = errorMessage;
+                Slog.d(TAG, "Marking session " + sessionId + " as failed: " + errorMessage);
+                childSessions = getChildSessionsLocked();
+            }
+            cleanStageDir(childSessions);
+            mCallback.onStagedSessionChanged(PackageInstallerSession.this);
+        }
+
+        @Override
+        public void setSessionApplied() {
+            List<PackageInstallerSession> childSessions;
+            synchronized (mLock) {
+                // Do not allow destroyed/failed staged session to change state
+                if (mDestroyed || mSessionFailed) return;
+                mSessionReady = false;
+                mSessionApplied = true;
+                mSessionFailed = false;
+                mSessionErrorCode = SessionInfo.STAGED_SESSION_NO_ERROR;
+                mSessionErrorMessage = "";
+                Slog.d(TAG, "Marking session " + sessionId + " as applied");
+                childSessions = getChildSessionsLocked();
+            }
+            cleanStageDir(childSessions);
+            mCallback.onStagedSessionChanged(PackageInstallerSession.this);
+        }
+
+        @Override
+        public boolean containsApkSession() {
+            return PackageInstallerSession.this.containsApkSession();
+        }
+
+        /**
+         * Installs apks of staged session while skipping the verification process for a committed
+         * and ready session.
+         */
+        @Override
+        public void installSession(IntentSender statusReceiver) {
+            assertCallerIsOwnerOrRootOrSystemLocked();
+            assertNotChildLocked("StagedSession#installSession");
+            Preconditions.checkArgument(isCommitted() && isSessionReady());
+
+            // Since staged sessions are installed during boot, the original reference to status
+            // receiver from the owner has already been lost. We can safely replace it with a
+            // status receiver from the system without effecting the flow.
+            updateRemoteStatusReceiver(statusReceiver);
+            install();
+        }
+
+        private void updateRemoteStatusReceiver(IntentSender remoteStatusReceiver) {
+            synchronized (mLock) {
+                mRemoteStatusReceiver = remoteStatusReceiver;
+                if (isMultiPackage()) {
+                    final IntentSender childIntentSender = new ChildStatusIntentReceiver(
+                            mChildSessions.clone(), remoteStatusReceiver).getIntentSender();
+                    for (int i = mChildSessions.size() - 1; i >= 0; --i) {
+                        mChildSessions.valueAt(i).mRemoteStatusReceiver = childIntentSender;
+                    }
+                }
+            }
+        }
+
+        @Override
+        public boolean hasParentSessionId() {
+            return PackageInstallerSession.this.hasParentSessionId();
+        }
+
+        @Override
+        public int getParentSessionId() {
+            return PackageInstallerSession.this.getParentSessionId();
+        }
+
+        @Override
+        public boolean isCommitted() {
+            return PackageInstallerSession.this.isCommitted();
+        }
+
+        @Override
+        public boolean isInTerminalState() {
+            synchronized (mLock) {
+                return mSessionApplied || mSessionFailed;
+            }
+        }
+
+        @Override
+        public boolean isDestroyed() {
+            return PackageInstallerSession.this.isDestroyed();
+        }
+
+        @Override
+        public long getCommittedMillis() {
+            return PackageInstallerSession.this.getCommittedMillis();
+        }
+
+        @Override
+        public boolean sessionContains(Predicate<StagingManager.StagedSession> filter) {
+            return PackageInstallerSession.this.sessionContains(s -> filter.test(s.mStagedSession));
+        }
+
+        @Override
+        public boolean isSessionReady() {
+            synchronized (mLock) {
+                return mSessionReady;
+            }
+        }
+
+        @Override
+        public boolean isSessionApplied() {
+            synchronized (mLock) {
+                return mSessionApplied;
+            }
+        }
+
+        @Override
+        public boolean isSessionFailed() {
+            synchronized (mLock) {
+                return mSessionFailed;
+            }
+        }
+
+        @StagedSessionErrorCode int getSessionErrorCode() {
+            synchronized (mLock) {
+                return mSessionErrorCode;
+            }
+        }
+
+        String getSessionErrorMessage() {
+            synchronized (mLock) {
+                return mSessionErrorMessage;
+            }
+        }
+
+        @Override
+        public void abandon() {
+            final Runnable r;
+            synchronized (mLock) {
+                assertNotChildLocked("StagedSession#abandon");
+                assertCallerIsOwnerOrRootLocked();
+                if (isInTerminalState()) {
+                    // We keep the session in the database if it's in a finalized state. It will be
+                    // removed by PackageInstallerService when the last update time is old enough.
+                    // Also, in such cases cleanStageDir() has already been executed so no need to
+                    // do it now.
+                    return;
+                }
+                mDestroyed = true;
+                boolean isCommitted = mCommitted;
+                List<PackageInstallerSession> childSessions = getChildSessionsLocked();
+                r = () -> {
+                    assertNotLocked("abandonStaged");
+                    if (isCommitted) {
+                        mStagingManager.abortCommittedSession(this);
+                    }
+                    cleanStageDir(childSessions);
+                    destroyInternal();
+                    dispatchSessionFinished(INSTALL_FAILED_ABORTED, "Session was abandoned", null);
+                    maybeCleanUpChildSessions();
+                };
+                if (mInPreRebootVerification) {
+                    // Pre-reboot verification is ongoing, not safe to clean up the session yet.
+                    mPendingAbandonCallback = r;
+                    mCallback.onStagedSessionChanged(PackageInstallerSession.this);
+                    return;
+                }
+            }
+            r.run();
+        }
+
+        /**
+         * Notified by the staging manager that pre-reboot verification is about to start. The
+         * return value should be checked to decide whether it is OK to start pre-reboot
+         * verification. In the case of a destroyed session, {@code false} is returned and there is
+         * no need to start pre-reboot verification.
+         */
+        @Override
+        public boolean notifyStartPreRebootVerification() {
+            synchronized (mLock) {
+                if (mInPreRebootVerification) {
+                    throw new IllegalStateException("Pre-reboot verification has started");
+                }
+                if (mDestroyed) {
+                    return false;
+                }
+                mInPreRebootVerification = true;
+                return true;
+            }
+        }
+
+        /**
+         * Notified by the staging manager that pre-reboot verification has ended. Now it is safe to
+         * clean up the session if {@link #abandon()} has been called previously.
+         */
+        @Override
+        public void notifyEndPreRebootVerification() {
+            synchronized (mLock) {
+                if (!mInPreRebootVerification) {
+                    throw new IllegalStateException("Pre-reboot verification not started");
+                }
+                mInPreRebootVerification = false;
+            }
+            dispatchPendingAbandonCallback();
+        }
+
+        /**
+         * Resumes verification process for non-final committed staged session.
+         *
+         * Useful if a device gets rebooted before verification is complete and we need to restart
+         * the verification.
+         */
+        @Override
+        public void verifySession() {
+            assertCallerIsOwnerOrRootOrSystemLocked();
+            Preconditions.checkArgument(isCommitted());
+            Preconditions.checkArgument(!mSessionApplied && !mSessionFailed);
+            verify();
+        }
+
+        private void dispatchPendingAbandonCallback() {
+            final Runnable callback;
+            synchronized (mLock) {
+                callback = mPendingAbandonCallback;
+                mPendingAbandonCallback = null;
+            }
+            if (callback != null) {
+                callback.run();
+            }
+        }
+    }
 
     /**
      * Path to the validated base APK for this session, which may point at an
@@ -691,12 +1002,8 @@
         mPrepared = prepared;
         mCommitted = committed;
         mDestroyed = destroyed;
-        mStagedSessionReady = isReady;
-        mStagedSessionFailed = isFailed;
-        mStagedSessionApplied = isApplied;
-        mStagedSessionErrorCode = stagedSessionErrorCode;
-        mStagedSessionErrorMessage =
-                stagedSessionErrorMessage != null ? stagedSessionErrorMessage : "";
+        mStagedSession = params.isStaged ? new StagedSession(isReady, isApplied, isFailed,
+                stagedSessionErrorCode, stagedSessionErrorMessage) : null;
 
         if (isDataLoaderInstallation()) {
             if (isApexSession()) {
@@ -789,10 +1096,11 @@
             info.rollbackDataPolicy = params.rollbackDataPolicy;
             info.parentSessionId = mParentSessionId;
             info.childSessionIds = getChildSessionIdsLocked();
-            info.isStagedSessionApplied = mStagedSessionApplied;
-            info.isStagedSessionReady = mStagedSessionReady;
-            info.isStagedSessionFailed = mStagedSessionFailed;
-            info.setStagedSessionErrorCode(mStagedSessionErrorCode, mStagedSessionErrorMessage);
+            info.isStagedSessionApplied = isStagedSessionApplied();
+            info.isStagedSessionReady = isStagedSessionReady();
+            info.isStagedSessionFailed = isStagedSessionFailed();
+            info.setStagedSessionErrorCode(getStagedSessionErrorCode(),
+                    getStagedSessionErrorMessage());
             info.createdMillis = createdMillis;
             info.updatedMillis = updatedMillis;
         }
@@ -827,9 +1135,7 @@
 
     /** Returns true if a staged session has reached a final state and can be forgotten about  */
     public boolean isStagedAndInTerminalState() {
-        synchronized (mLock) {
-            return params.isStaged && (mStagedSessionApplied || mStagedSessionFailed);
-        }
+        return params.isStaged && mStagedSession.isInTerminalState();
     }
 
     private void assertNotLocked(String cookie) {
@@ -1724,11 +2030,11 @@
         // Session is sealed and committed but could not be verified, we need to destroy it.
         destroyInternal();
         if (isStaged()) {
-            setStagedSessionFailed(
+            mStagedSession.setSessionFailed(
                     SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, msgWithErrorCode);
             // TODO(b/136257624): Remove this once all verification logic has been transferred out
             //  of StagingManager.
-            mStagingManager.notifyVerificationComplete(this);
+            mStagingManager.notifyVerificationComplete(mStagedSession);
         } else {
             // Dispatch message to remove session from PackageInstallerService.
             dispatchSessionFinished(error, msg, null);
@@ -1847,7 +2153,7 @@
                     .write();
         }
         if (params.isStaged) {
-            mStagingManager.commitSession(this);
+            mStagingManager.commitSession(mStagedSession);
             // TODO(b/136257624): CTS test fails if we don't send session finished broadcast, even
             //  though ideally, we just need to send session committed broadcast.
             dispatchSessionFinished(INSTALL_SUCCEEDED, "Session staged", null);
@@ -1863,21 +2169,6 @@
         verify();
     }
 
-    /**
-     * Resumes verification process for non-final committed staged session.
-     *
-     * Useful if a device gets rebooted before verification is complete and we need to restart the
-     * verification.
-     */
-    void verifyStagedSession() {
-        assertCallerIsOwnerOrRootOrSystemLocked();
-        Preconditions.checkArgument(isCommitted());
-        Preconditions.checkArgument(isStaged());
-        Preconditions.checkArgument(!mStagedSessionApplied && !mStagedSessionFailed);
-
-        verify();
-    }
-
     private void verify() {
         try {
             verifyNonStaged();
@@ -1932,36 +2223,6 @@
         }
     }
 
-    /**
-     * Installs apks of staged session while skipping the verification process for a committed and
-     * ready session.
-     */
-    void installStagedSession(IntentSender statusReceiver) {
-        assertCallerIsOwnerOrRootOrSystemLocked();
-        Preconditions.checkArgument(!hasParentSessionId()); // Don't allow installing child sessions
-        Preconditions.checkArgument(isCommitted() && isStagedSessionReady());
-
-        // Since staged sessions are installed during boot, the original reference to status
-        // receiver from the owner has already been lost. We can safely replace it with a
-        // status receiver from the system without effecting the flow.
-        updateRemoteStatusReceiver(statusReceiver);
-        install();
-    }
-
-    private void updateRemoteStatusReceiver(IntentSender remoteStatusReceiver) {
-        synchronized (mLock) {
-            mRemoteStatusReceiver = remoteStatusReceiver;
-            if (isMultiPackage()) {
-                final IntentSender childIntentSender =
-                        new ChildStatusIntentReceiver(mChildSessions.clone(), remoteStatusReceiver)
-                                .getIntentSender();
-                for (int i = mChildSessions.size() - 1; i >= 0; --i) {
-                    mChildSessions.valueAt(i).mRemoteStatusReceiver = childIntentSender;
-                }
-            }
-        }
-    }
-
     private void install() {
         try {
             installNonStaged();
@@ -2188,7 +2449,7 @@
         if (isStaged()) {
             // TODO(b/136257624): Remove this once all verification logic has been transferred out
             //  of StagingManager.
-            mStagingManager.notifyPreRebootVerification_Apk_Complete(this);
+            mStagingManager.notifyPreRebootVerification_Apk_Complete(mStagedSession);
             // TODO(b/136257624): We also need to destroy internals for verified staged session,
             //  otherwise file descriptors are never closed for verified staged session until reboot
             return;
@@ -2370,10 +2631,6 @@
         return false;
     }
 
-    boolean containsApexSession() {
-        return sessionContains((s) -> s.isApexSession());
-    }
-
     boolean containsApkSession() {
         return sessionContains((s) -> !s.isApexSession());
     }
@@ -3195,6 +3452,7 @@
 
     private void abandonNonStaged() {
         synchronized (mLock) {
+            assertNotChildLocked("abandonNonStaged");
             assertCallerIsOwnerOrRootLocked();
             if (mRelinquished) {
                 if (LOGD) Slog.d(TAG, "Ignoring abandon after commit relinquished control");
@@ -3206,98 +3464,23 @@
         maybeCleanUpChildSessions();
     }
 
-    private void abandonStaged() {
-        final Runnable r;
-        synchronized (mLock) {
-            assertCallerIsOwnerOrRootLocked();
-            if (isStagedAndInTerminalState()) {
-                // We keep the session in the database if it's in a finalized state. It will be
-                // removed by PackageInstallerService when the last update time is old enough.
-                // Also, in such cases cleanStageDir() has already been executed so no need to
-                // do it now.
-                return;
-            }
-            mDestroyed = true;
-            boolean isCommitted = mCommitted;
-            List<PackageInstallerSession> childSessions = getChildSessionsLocked();
-            r = () -> {
-                assertNotLocked("abandonStaged");
-                if (isCommitted) {
-                    mStagingManager.abortCommittedSession(this);
-                }
-                cleanStageDir(childSessions);
-                destroyInternal();
-                dispatchSessionFinished(INSTALL_FAILED_ABORTED, "Session was abandoned", null);
-                maybeCleanUpChildSessions();
-            };
-            if (mInPreRebootVerification) {
-                // Pre-reboot verification is ongoing. It is not safe to clean up the session yet.
-                mPendingAbandonCallback = r;
-                mCallback.onStagedSessionChanged(this);
-                return;
-            }
+    @GuardedBy("mLock")
+    private void assertNotChildLocked(String cookie) {
+        if (hasParentSessionId()) {
+            throw new IllegalStateException(cookie + " can't be called on a child session, id="
+                    + sessionId + " parentId=" + getParentSessionId());
         }
-        r.run();
     }
 
     @Override
     public void abandon() {
-        if (hasParentSessionId()) {
-            throw new IllegalStateException(
-                    "Session " + sessionId + " is a child of multi-package session "
-                            + getParentSessionId() +  " and may not be abandoned directly.");
-        }
         if (params.isStaged) {
-            abandonStaged();
+            mStagedSession.abandon();
         } else {
             abandonNonStaged();
         }
     }
 
-    /**
-     * Notified by the staging manager that pre-reboot verification is about to start. The return
-     * value should be checked to decide whether it is OK to start pre-reboot verification. In
-     * the case of a destroyed session, {@code false} is returned and there is no need to start
-     * pre-reboot verification.
-     */
-    boolean notifyStagedStartPreRebootVerification() {
-        synchronized (mLock) {
-            if (mInPreRebootVerification) {
-                throw new IllegalStateException("Pre-reboot verification has started");
-            }
-            if (mDestroyed) {
-                return false;
-            }
-            mInPreRebootVerification = true;
-            return true;
-        }
-    }
-
-    private void dispatchPendingAbandonCallback() {
-        final Runnable callback;
-        synchronized (mLock) {
-            callback = mPendingAbandonCallback;
-            mPendingAbandonCallback = null;
-        }
-        if (callback != null) {
-            callback.run();
-        }
-    }
-
-    /**
-     * Notified by the staging manager that pre-reboot verification has ended. Now it is safe to
-     * clean up the session if {@link #abandon()} has been called previously.
-     */
-    void notifyStagedEndPreRebootVerification() {
-        synchronized (mLock) {
-            if (!mInPreRebootVerification) {
-                throw new IllegalStateException("Pre-reboot verification not started");
-            }
-            mInPreRebootVerification = false;
-        }
-        dispatchPendingAbandonCallback();
-    }
-
     @Override
     public boolean isMultiPackage() {
         return params.isMultiPackage;
@@ -3783,88 +3966,29 @@
     }
 
     /** {@hide} */
-    void setStagedSessionReady() {
-        synchronized (mLock) {
-            // Do not allow destroyed/failed staged session to change state
-            if (mDestroyed || mStagedSessionFailed) return;
-            mStagedSessionReady = true;
-            mStagedSessionApplied = false;
-            mStagedSessionFailed = false;
-            mStagedSessionErrorCode = SessionInfo.STAGED_SESSION_NO_ERROR;
-            mStagedSessionErrorMessage = "";
-        }
-        mCallback.onStagedSessionChanged(this);
-    }
-
-    /** {@hide} */
-    void setStagedSessionFailed(@StagedSessionErrorCode int errorCode, String errorMessage) {
-        List<PackageInstallerSession> childSessions;
-        synchronized (mLock) {
-            // Do not allow destroyed/failed staged session to change state
-            if (mDestroyed || mStagedSessionFailed) return;
-            mStagedSessionReady = false;
-            mStagedSessionApplied = false;
-            mStagedSessionFailed = true;
-            mStagedSessionErrorCode = errorCode;
-            mStagedSessionErrorMessage = errorMessage;
-            Slog.d(TAG, "Marking session " + sessionId + " as failed: " + errorMessage);
-            childSessions = getChildSessionsLocked();
-        }
-        cleanStageDir(childSessions);
-        mCallback.onStagedSessionChanged(this);
-    }
-
-    /** {@hide} */
-    void setStagedSessionApplied() {
-        List<PackageInstallerSession> childSessions;
-        synchronized (mLock) {
-            // Do not allow destroyed/failed staged session to change state
-            if (mDestroyed || mStagedSessionFailed) return;
-            mStagedSessionReady = false;
-            mStagedSessionApplied = true;
-            mStagedSessionFailed = false;
-            mStagedSessionErrorCode = SessionInfo.STAGED_SESSION_NO_ERROR;
-            mStagedSessionErrorMessage = "";
-            Slog.d(TAG, "Marking session " + sessionId + " as applied");
-            childSessions = getChildSessionsLocked();
-        }
-        cleanStageDir(childSessions);
-        mCallback.onStagedSessionChanged(this);
-    }
-
-    /** {@hide} */
     boolean isStagedSessionReady() {
-        synchronized (mLock) {
-            return mStagedSessionReady;
-        }
+        return params.isStaged && mStagedSession.isSessionReady();
     }
 
     /** {@hide} */
     boolean isStagedSessionApplied() {
-        synchronized (mLock) {
-            return mStagedSessionApplied;
-        }
+        return params.isStaged && mStagedSession.isSessionApplied();
     }
 
     /** {@hide} */
     boolean isStagedSessionFailed() {
-        synchronized (mLock) {
-            return mStagedSessionFailed;
-        }
+        return params.isStaged && mStagedSession.isSessionFailed();
     }
 
     /** {@hide} */
     @StagedSessionErrorCode int getStagedSessionErrorCode() {
-        synchronized (mLock) {
-            return mStagedSessionErrorCode;
-        }
+        return params.isStaged ? mStagedSession.getSessionErrorCode()
+                : SessionInfo.STAGED_SESSION_NO_ERROR;
     }
 
     /** {@hide} */
     String getStagedSessionErrorMessage() {
-        synchronized (mLock) {
-            return mStagedSessionErrorMessage;
-        }
+        return params.isStaged ? mStagedSession.getSessionErrorMessage() : "";
     }
 
     private void destroyInternal() {
@@ -3961,11 +4085,11 @@
         pw.printPair("params.isStaged", params.isStaged);
         pw.printPair("mParentSessionId", mParentSessionId);
         pw.printPair("mChildSessionIds", getChildSessionIdsLocked());
-        pw.printPair("mStagedSessionApplied", mStagedSessionApplied);
-        pw.printPair("mStagedSessionFailed", mStagedSessionFailed);
-        pw.printPair("mStagedSessionReady", mStagedSessionReady);
-        pw.printPair("mStagedSessionErrorCode", mStagedSessionErrorCode);
-        pw.printPair("mStagedSessionErrorMessage", mStagedSessionErrorMessage);
+        pw.printPair("mStagedSessionApplied", isStagedSessionApplied());
+        pw.printPair("mStagedSessionFailed", isStagedSessionFailed());
+        pw.printPair("mStagedSessionReady", isStagedSessionReady());
+        pw.printPair("mStagedSessionErrorCode", getStagedSessionErrorCode());
+        pw.printPair("mStagedSessionErrorMessage", getStagedSessionErrorMessage());
         pw.println();
 
         pw.decreaseIndent();
@@ -4131,12 +4255,12 @@
 
             writeBooleanAttribute(out, ATTR_MULTI_PACKAGE, params.isMultiPackage);
             writeBooleanAttribute(out, ATTR_STAGED_SESSION, params.isStaged);
-            writeBooleanAttribute(out, ATTR_IS_READY, mStagedSessionReady);
-            writeBooleanAttribute(out, ATTR_IS_FAILED, mStagedSessionFailed);
-            writeBooleanAttribute(out, ATTR_IS_APPLIED, mStagedSessionApplied);
-            out.attributeInt(null, ATTR_STAGED_SESSION_ERROR_CODE, mStagedSessionErrorCode);
+            writeBooleanAttribute(out, ATTR_IS_READY, isStagedSessionReady());
+            writeBooleanAttribute(out, ATTR_IS_FAILED, isStagedSessionFailed());
+            writeBooleanAttribute(out, ATTR_IS_APPLIED, isStagedSessionApplied());
+            out.attributeInt(null, ATTR_STAGED_SESSION_ERROR_CODE, getStagedSessionErrorCode());
             writeStringAttribute(out, ATTR_STAGED_SESSION_ERROR_MESSAGE,
-                    mStagedSessionErrorMessage);
+                    getStagedSessionErrorMessage());
             // TODO(patb,109941548): avoid writing to xml and instead infer / validate this after
             //                       we've read all sessions.
             out.attributeInt(null, ATTR_PARENT_SESSION_ID, mParentSessionId);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 282fb58..4cf9933 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -5417,6 +5417,14 @@
                             InstantAppRegistry.DEFAULT_UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD))) {
                 return;
             }
+
+            // 11. Free storage service cache
+            StorageManagerInternal smInternal =
+                    mInjector.getLocalService(StorageManagerInternal.class);
+            // TODO(b/170481432): Decide what value of bytes needs to be sent instead of
+            // sending the bytes parameter of freeStorage
+            smInternal.freeCache(volumeUuid, bytes);
+            if (file.getUsableSpace() >= bytes) return;
         } else {
             try {
                 mInstaller.freeCache(volumeUuid, bytes, 0, 0);
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index 222874d..545567c 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -32,6 +32,7 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageInstaller;
 import android.content.pm.PackageInstaller.SessionInfo;
+import android.content.pm.PackageInstaller.SessionInfo.StagedSessionErrorCode;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.PackageParser.PackageParserException;
@@ -82,6 +83,7 @@
 import java.util.Set;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
 import java.util.function.Supplier;
 
 /**
@@ -102,7 +104,7 @@
     private String mFailureReason;
 
     @GuardedBy("mStagedSessions")
-    private final SparseArray<PackageInstallerSession> mStagedSessions = new SparseArray<>();
+    private final SparseArray<StagedSession> mStagedSessions = new SparseArray<>();
 
     @GuardedBy("mFailedPackageNames")
     private final List<String> mFailedPackageNames = new ArrayList<>();
@@ -111,6 +113,35 @@
     @GuardedBy("mSuccessfulStagedSessionIds")
     private final List<Integer> mSuccessfulStagedSessionIds = new ArrayList<>();
 
+    interface StagedSession {
+        boolean isMultiPackage();
+        boolean isApexSession();
+        boolean isCommitted();
+        boolean isInTerminalState();
+        boolean isDestroyed();
+        boolean isSessionReady();
+        boolean isSessionApplied();
+        boolean isSessionFailed();
+        List<StagedSession> getChildSessions();
+        String getPackageName();
+        int getParentSessionId();
+        int sessionId();
+        PackageInstaller.SessionParams sessionParams();
+        boolean sessionContains(Predicate<StagedSession> filter);
+        boolean containsApkSession();
+        boolean containsApexSession();
+        void setSessionReady();
+        void setSessionFailed(@StagedSessionErrorCode int errorCode, String errorMessage);
+        void setSessionApplied();
+        void installSession(IntentSender statusReceiver);
+        boolean hasParentSessionId();
+        long getCommittedMillis();
+        void abandon();
+        boolean notifyStartPreRebootVerification();
+        void notifyEndPreRebootVerification();
+        void verifySession();
+    }
+
     StagingManager(Context context, Supplier<PackageParser2> packageParserSupplier) {
         mContext = context;
         mPackageParserSupplier = packageParserSupplier;
@@ -213,20 +244,20 @@
                         + " compatible with the one currently installed on device");
     }
 
-    private List<PackageInfo> submitSessionToApexService(@NonNull PackageInstallerSession session,
+    private List<PackageInfo> submitSessionToApexService(@NonNull StagedSession session,
             int rollbackId) throws PackageManagerException {
         final IntArray childSessionIds = new IntArray();
         if (session.isMultiPackage()) {
-            for (PackageInstallerSession s : session.getChildSessions()) {
+            for (StagedSession s : session.getChildSessions()) {
                 if (s.isApexSession()) {
-                    childSessionIds.add(s.sessionId);
+                    childSessionIds.add(s.sessionId());
                 }
             }
         }
         ApexSessionParams apexSessionParams = new ApexSessionParams();
-        apexSessionParams.sessionId = session.sessionId;
+        apexSessionParams.sessionId = session.sessionId();
         apexSessionParams.childSessionIds = childSessionIds.toArray();
-        if (session.params.installReason == PackageManager.INSTALL_REASON_ROLLBACK) {
+        if (session.sessionParams().installReason == PackageManager.INSTALL_REASON_ROLLBACK) {
             apexSessionParams.isRollback = true;
             apexSessionParams.rollbackId = rollbackId;
         } else {
@@ -269,7 +300,7 @@
             result.add(packageInfo);
             apexPackageNames.add(packageInfo.packageName);
         }
-        Slog.d(TAG, "Session " + session.sessionId + " has following APEX packages: "
+        Slog.d(TAG, "Session " + session.sessionId() + " has following APEX packages: "
                 + apexPackageNames);
         return result;
     }
@@ -288,22 +319,23 @@
                 "Could not find rollback id for commit session: " + sessionId);
     }
 
-    private void checkRequiredVersionCode(final PackageInstallerSession session,
+    private void checkRequiredVersionCode(final StagedSession session,
             final PackageInfo activePackage) throws PackageManagerException {
-        if (session.params.requiredInstalledVersionCode == PackageManager.VERSION_CODE_HIGHEST) {
+        if (session.sessionParams().requiredInstalledVersionCode
+                == PackageManager.VERSION_CODE_HIGHEST) {
             return;
         }
         final long activeVersion = activePackage.applicationInfo.longVersionCode;
-        if (activeVersion != session.params.requiredInstalledVersionCode) {
+        if (activeVersion != session.sessionParams().requiredInstalledVersionCode) {
             throw new PackageManagerException(
                     SessionInfo.STAGED_SESSION_VERIFICATION_FAILED,
                     "Installed version of APEX package " + activePackage.packageName
                             + " does not match required. Active version: " + activeVersion
-                            + " required: " + session.params.requiredInstalledVersionCode);
+                            + " required: " + session.sessionParams().requiredInstalledVersionCode);
         }
     }
 
-    private void checkDowngrade(final PackageInstallerSession session,
+    private void checkDowngrade(final StagedSession session,
             final PackageInfo activePackage, final PackageInfo newPackage)
             throws PackageManagerException {
         final long activeVersion = activePackage.applicationInfo.longVersionCode;
@@ -311,7 +343,7 @@
         final boolean isAppDebuggable = (activePackage.applicationInfo.flags
                 & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
         final boolean allowsDowngrade = PackageManagerServiceUtils.isDowngradePermitted(
-                session.params.installFlags, isAppDebuggable);
+                session.sessionParams().installFlags, isAppDebuggable);
         if (activeVersion > newVersionCode && !allowsDowngrade) {
             throw new PackageManagerException(
                     SessionInfo.STAGED_SESSION_VERIFICATION_FAILED,
@@ -363,10 +395,10 @@
     /**
      * Utility function for extracting apex sessions out of multi-package/single session.
      */
-    private List<PackageInstallerSession> extractApexSessions(PackageInstallerSession session) {
-        List<PackageInstallerSession> apexSessions = new ArrayList<>();
+    private List<StagedSession> extractApexSessions(StagedSession session) {
+        List<StagedSession> apexSessions = new ArrayList<>();
         if (session.isMultiPackage()) {
-            for (PackageInstallerSession s : session.getChildSessions()) {
+            for (StagedSession s : session.getChildSessions()) {
                 if (s.containsApexSession()) {
                     apexSessions.add(s);
                 }
@@ -383,14 +415,14 @@
      *
      * @throws PackageManagerException if any apk-in-apex failed to install
      */
-    private void checkInstallationOfApkInApexSuccessful(PackageInstallerSession session)
+    private void checkInstallationOfApkInApexSuccessful(StagedSession session)
             throws PackageManagerException {
-        final List<PackageInstallerSession> apexSessions = extractApexSessions(session);
+        final List<StagedSession> apexSessions = extractApexSessions(session);
         if (apexSessions.isEmpty()) {
             return;
         }
 
-        for (PackageInstallerSession apexSession : apexSessions) {
+        for (StagedSession apexSession : apexSessions) {
             String packageName = apexSession.getPackageName();
             if (!mApexManager.isApkInApexInstallSuccess(packageName)) {
                 throw new PackageManagerException(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED,
@@ -405,16 +437,16 @@
      * directory directly by PackageManager, as such, RollbackManager need to handle their data
      * separately here.
      */
-    private void snapshotAndRestoreForApexSession(PackageInstallerSession session) {
+    private void snapshotAndRestoreForApexSession(StagedSession session) {
         boolean doSnapshotOrRestore =
-                (session.params.installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) != 0
-                || session.params.installReason == PackageManager.INSTALL_REASON_ROLLBACK;
+                (session.sessionParams().installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) != 0
+                || session.sessionParams().installReason == PackageManager.INSTALL_REASON_ROLLBACK;
         if (!doSnapshotOrRestore) {
             return;
         }
 
         // Find all the apex sessions that needs processing
-        final List<PackageInstallerSession> apexSessions = extractApexSessions(session);
+        final List<StagedSession> apexSessions = extractApexSessions(session);
         if (apexSessions.isEmpty()) {
             return;
         }
@@ -475,7 +507,7 @@
      *  session package names.
      *  Logging needs to wait until the ACTION_BOOT_COMPLETED broadcast is sent.
      */
-    private void prepareForLoggingApexdRevert(@NonNull PackageInstallerSession session,
+    private void prepareForLoggingApexdRevert(@NonNull StagedSession session,
             @NonNull String nativeFailureReason) {
         synchronized (mFailedPackageNames) {
             mNativeFailureReason = nativeFailureReason;
@@ -485,15 +517,15 @@
         }
     }
 
-    private void resumeSession(@NonNull PackageInstallerSession session)
+    private void resumeSession(@NonNull StagedSession session)
             throws PackageManagerException {
-        Slog.d(TAG, "Resuming session " + session.sessionId);
+        Slog.d(TAG, "Resuming session " + session.sessionId());
 
         final boolean hasApex = session.containsApexSession();
         ApexSessionInfo apexSessionInfo = null;
         if (hasApex) {
             // Check with apexservice whether the apex packages have been activated.
-            apexSessionInfo = mApexManager.getStagedSessionInfo(session.sessionId);
+            apexSessionInfo = mApexManager.getStagedSessionInfo(session.sessionId());
 
             // Prepare for logging a native crash during boot, if one occurred.
             if (apexSessionInfo != null && !TextUtils.isEmpty(
@@ -506,7 +538,7 @@
                 // pre-reboot verification, perhaps because the device rebooted in the meantime.
                 // Greedily re-trigger the pre-reboot verification. We want to avoid marking it as
                 // failed when not in checkpoint mode, hence it is being processed separately.
-                Slog.d(TAG, "Found pending staged session " + session.sessionId + " still to "
+                Slog.d(TAG, "Found pending staged session " + session.sessionId() + " still to "
                         + "be verified, resuming pre-reboot verification");
                 mPreRebootVerificationHandler.startPreRebootVerification(session);
                 return;
@@ -523,21 +555,21 @@
             // mode. If not, we fail all sessions.
             if (supportsCheckpoint() && !needsCheckpoint()) {
                 String revertMsg = "Reverting back to safe state. Marking "
-                        + session.sessionId + " as failed.";
+                        + session.sessionId() + " as failed.";
                 final String reasonForRevert = getReasonForRevert();
                 if (!TextUtils.isEmpty(reasonForRevert)) {
                     revertMsg += " Reason for revert: " + reasonForRevert;
                 }
                 Slog.d(TAG, revertMsg);
-                session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_UNKNOWN, revertMsg);
+                session.setSessionFailed(SessionInfo.STAGED_SESSION_UNKNOWN, revertMsg);
                 return;
             }
         } catch (RemoteException e) {
             // Cannot continue staged install without knowing if fs-checkpoint is supported
             Slog.e(TAG, "Checkpoint support unknown. Aborting staged install for session "
-                    + session.sessionId, e);
+                    + session.sessionId(), e);
             // TODO: Mark all staged sessions together and reboot only once
-            session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_UNKNOWN,
+            session.setSessionFailed(SessionInfo.STAGED_SESSION_UNKNOWN,
                     "Checkpoint support unknown. Aborting staged install.");
             if (hasApex) {
                 mApexManager.revertActiveSessions();
@@ -568,7 +600,7 @@
                 // Apexd did not apply the session for some unknown reason. There is no
                 // guarantee that apexd will install it next time. Safer to proactively mark
                 // it as failed.
-                final String errorMsg = "Staged session " + session.sessionId + "at boot "
+                final String errorMsg = "Staged session " + session.sessionId() + "at boot "
                         + "didn't activate nor fail. Marking it as failed anyway.";
                 throw new PackageManagerException(
                         SessionInfo.STAGED_SESSION_ACTIVATION_FAILED, errorMsg);
@@ -580,38 +612,38 @@
             checkInstallationOfApkInApexSuccessful(session);
             checkDuplicateApkInApex(session);
             snapshotAndRestoreForApexSession(session);
-            Slog.i(TAG, "APEX packages in session " + session.sessionId
+            Slog.i(TAG, "APEX packages in session " + session.sessionId()
                     + " were successfully activated. Proceeding with APK packages, if any");
         }
         // The APEX part of the session is activated, proceed with the installation of APKs.
-        Slog.d(TAG, "Installing APK packages in session " + session.sessionId);
+        Slog.d(TAG, "Installing APK packages in session " + session.sessionId());
         installApksInSession(session);
 
-        Slog.d(TAG, "Marking session " + session.sessionId + " as applied");
-        session.setStagedSessionApplied();
+        Slog.d(TAG, "Marking session " + session.sessionId() + " as applied");
+        session.setSessionApplied();
         if (hasApex) {
             try {
                 if (supportsCheckpoint()) {
                     // Store the session ID, which will be marked as successful by ApexManager
                     // upon boot completion.
                     synchronized (mSuccessfulStagedSessionIds) {
-                        mSuccessfulStagedSessionIds.add(session.sessionId);
+                        mSuccessfulStagedSessionIds.add(session.sessionId());
                     }
                 } else {
                     // Mark sessions as successful immediately on non-checkpointing devices.
-                    mApexManager.markStagedSessionSuccessful(session.sessionId);
+                    mApexManager.markStagedSessionSuccessful(session.sessionId());
                 }
             } catch (RemoteException e) {
                 Slog.w(TAG, "Checkpoint support unknown, marking session as successful "
                         + "immediately.");
-                mApexManager.markStagedSessionSuccessful(session.sessionId);
+                mApexManager.markStagedSessionSuccessful(session.sessionId());
             }
         }
     }
 
-    void onInstallationFailure(PackageInstallerSession session, PackageManagerException e) {
-        session.setStagedSessionFailed(e.error, e.getMessage());
-        abortCheckpoint(session.sessionId, e.getMessage());
+    void onInstallationFailure(StagedSession session, PackageManagerException e) {
+        session.setSessionFailed(e.error, e.getMessage());
+        abortCheckpoint(session.sessionId(), e.getMessage());
 
         // If checkpoint is not supported, we have to handle failure for one staged session.
         if (!session.containsApexSession()) {
@@ -641,26 +673,26 @@
     /**
      * Throws a PackageManagerException if there are duplicate packages in apk and apk-in-apex.
      */
-    private void checkDuplicateApkInApex(@NonNull PackageInstallerSession session)
+    private void checkDuplicateApkInApex(@NonNull StagedSession session)
             throws PackageManagerException {
         if (!session.isMultiPackage()) {
             return;
         }
         final Set<String> apkNames = new ArraySet<>();
-        for (PackageInstallerSession s : session.getChildSessions()) {
+        for (StagedSession s : session.getChildSessions()) {
             if (!s.isApexSession()) {
                 apkNames.add(s.getPackageName());
             }
         }
-        final List<PackageInstallerSession> apexSessions = extractApexSessions(session);
-        for (PackageInstallerSession apexSession : apexSessions) {
+        final List<StagedSession> apexSessions = extractApexSessions(session);
+        for (StagedSession apexSession : apexSessions) {
             String packageName = apexSession.getPackageName();
             for (String apkInApex : mApexManager.getApksInApex(packageName)) {
                 if (!apkNames.add(apkInApex)) {
                     throw new PackageManagerException(
                             SessionInfo.STAGED_SESSION_ACTIVATION_FAILED,
                             "Package: " + packageName + " in session: "
-                                    + apexSession.sessionId + " has duplicate apk-in-apex: "
+                                    + apexSession.sessionId() + " has duplicate apk-in-apex: "
                                     + apkInApex, null);
 
                 }
@@ -668,14 +700,14 @@
         }
     }
 
-    private void installApksInSession(PackageInstallerSession session)
+    private void installApksInSession(StagedSession session)
             throws PackageManagerException {
         if (!session.containsApkSession()) {
             return;
         }
 
         final LocalIntentReceiverSync receiver = new LocalIntentReceiverSync();
-        session.installStagedSession(receiver.getIntentSender());
+        session.installSession(receiver.getIntentSender());
         final Intent result = receiver.getResult();
         final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
                 PackageInstaller.STATUS_FAILURE);
@@ -683,31 +715,31 @@
             final String errorMessage = result.getStringExtra(
                     PackageInstaller.EXTRA_STATUS_MESSAGE);
             Slog.e(TAG, "Failure to install APK staged session "
-                    + session.sessionId + " [" + errorMessage + "]");
+                    + session.sessionId() + " [" + errorMessage + "]");
             throw new PackageManagerException(
                     SessionInfo.STAGED_SESSION_ACTIVATION_FAILED, errorMessage);
         }
     }
 
-    void commitSession(@NonNull PackageInstallerSession session) {
+    void commitSession(@NonNull StagedSession session) {
         // Store this parent session which will be used to check overlapping later
         createSession(session);
         mPreRebootVerificationHandler.startPreRebootVerification(session);
     }
 
-    private int getSessionIdForParentOrSelf(PackageInstallerSession session) {
-        return session.hasParentSessionId() ? session.getParentSessionId() : session.sessionId;
+    private int getSessionIdForParentOrSelf(StagedSession session) {
+        return session.hasParentSessionId() ? session.getParentSessionId() : session.sessionId();
     }
 
-    private PackageInstallerSession getParentSessionOrSelf(PackageInstallerSession session) {
+    private StagedSession getParentSessionOrSelf(StagedSession session) {
         return session.hasParentSessionId()
                 ? getStagedSession(session.getParentSessionId())
                 : session;
     }
 
-    private boolean isRollback(PackageInstallerSession session) {
-        final PackageInstallerSession root = getParentSessionOrSelf(session);
-        return root.params.installReason == PackageManager.INSTALL_REASON_ROLLBACK;
+    private boolean isRollback(StagedSession session) {
+        final StagedSession root = getParentSessionOrSelf(session);
+        return root.sessionParams().installReason == PackageManager.INSTALL_REASON_ROLLBACK;
     }
 
     /**
@@ -722,7 +754,7 @@
      * @throws PackageManagerException if session fails the check
      */
     @VisibleForTesting
-    void checkNonOverlappingWithStagedSessions(@NonNull PackageInstallerSession session)
+    void checkNonOverlappingWithStagedSessions(@NonNull StagedSession session)
             throws PackageManagerException {
         if (session.isMultiPackage()) {
             // We cannot say a parent session overlaps until we process its children
@@ -732,7 +764,7 @@
         String packageName = session.getPackageName();
         if (packageName == null) {
             throw new PackageManagerException(SessionInfo.STAGED_SESSION_VERIFICATION_FAILED,
-                    "Cannot stage session " + session.sessionId + " with package name null");
+                    "Cannot stage session " + session.sessionId() + " with package name null");
         }
 
         boolean supportsCheckpoint = ((StorageManager) mContext.getSystemService(
@@ -742,9 +774,9 @@
 
         synchronized (mStagedSessions) {
             for (int i = 0; i < mStagedSessions.size(); i++) {
-                final PackageInstallerSession stagedSession = mStagedSessions.valueAt(i);
+                final StagedSession stagedSession = mStagedSessions.valueAt(i);
                 if (stagedSession.hasParentSessionId() || !stagedSession.isCommitted()
-                        || stagedSession.isStagedAndInTerminalState()
+                        || stagedSession.isInTerminalState()
                         || stagedSession.isDestroyed()) {
                     continue;
                 }
@@ -759,8 +791,8 @@
                 // From here on, stagedSession is a parent active staged session
 
                 // Check if session is one of the active sessions
-                if (getSessionIdForParentOrSelf(session) == stagedSession.sessionId) {
-                    Slog.w(TAG, "Session " + session.sessionId + " is already staged");
+                if (getSessionIdForParentOrSelf(session) == stagedSession.sessionId()) {
+                    Slog.w(TAG, "Session " + session.sessionId() + " is already staged");
                     continue;
                 }
 
@@ -769,24 +801,25 @@
                     if (isRollback) {
                         // If the new session is a rollback, then it gets priority. The existing
                         // session is failed to unblock rollback.
-                        final PackageInstallerSession root = stagedSession;
+                        final StagedSession root = stagedSession;
                         if (!ensureActiveApexSessionIsAborted(root)) {
-                            Slog.e(TAG, "Failed to abort apex session " + root.sessionId);
+                            Slog.e(TAG, "Failed to abort apex session " + root.sessionId());
                             // Safe to ignore active apex session abort failure since session
                             // will be marked failed on next step and staging directory for session
                             // will be deleted.
                         }
-                        root.setStagedSessionFailed(
+                        root.setSessionFailed(
                                 SessionInfo.STAGED_SESSION_CONFLICT,
-                                "Session was blocking rollback session: " + session.sessionId);
-                        Slog.i(TAG, "Session " + root.sessionId + " is marked failed due to "
-                                + "blocking rollback session: " + session.sessionId);
+                                "Session was blocking rollback session: " + session.sessionId());
+                        Slog.i(TAG, "Session " + root.sessionId() + " is marked failed due to "
+                                + "blocking rollback session: " + session.sessionId());
                     } else {
                         throw new PackageManagerException(
                                 SessionInfo.STAGED_SESSION_VERIFICATION_FAILED,
                                 "Package: " + session.getPackageName() + " in session: "
-                                        + session.sessionId + " has been staged already by session:"
-                                        + " " + stagedSession.sessionId, null);
+                                        + session.sessionId()
+                                        + " has been staged already by session: "
+                                        + stagedSession.sessionId(), null);
                     }
                 }
 
@@ -803,24 +836,24 @@
     }
 
     @VisibleForTesting
-    void createSession(@NonNull PackageInstallerSession sessionInfo) {
+    void createSession(@NonNull StagedSession sessionInfo) {
         synchronized (mStagedSessions) {
-            mStagedSessions.append(sessionInfo.sessionId, sessionInfo);
+            mStagedSessions.append(sessionInfo.sessionId(), sessionInfo);
         }
     }
 
-    void abortSession(@NonNull PackageInstallerSession session) {
+    void abortSession(@NonNull StagedSession session) {
         synchronized (mStagedSessions) {
-            mStagedSessions.remove(session.sessionId);
+            mStagedSessions.remove(session.sessionId());
         }
     }
 
     /**
      * <p>Abort committed staged session
      */
-    void abortCommittedSession(@NonNull PackageInstallerSession session) {
-        int sessionId = session.sessionId;
-        if (session.isStagedAndInTerminalState()) {
+    void abortCommittedSession(@NonNull StagedSession session) {
+        int sessionId = session.sessionId();
+        if (session.isInTerminalState()) {
             Slog.w(TAG, "Cannot abort session in final state: " + sessionId);
             return;
         }
@@ -834,12 +867,12 @@
         }
 
         // A session could be marked ready once its pre-reboot verification ends
-        if (session.isStagedSessionReady()) {
+        if (session.isSessionReady()) {
             if (!ensureActiveApexSessionIsAborted(session)) {
                 // Failed to ensure apex session is aborted, so it can still be staged. We can still
                 // safely cleanup the staged session since pre-reboot verification is complete.
                 // Also, cleaning up the stageDir prevents the apex from being activated.
-                Slog.e(TAG, "Failed to abort apex session " + session.sessionId);
+                Slog.e(TAG, "Failed to abort apex session " + session.sessionId());
             }
         }
 
@@ -853,15 +886,15 @@
      *
      * @return returns true if it is ensured that there is no active apex session, otherwise false
      */
-    private boolean ensureActiveApexSessionIsAborted(PackageInstallerSession session) {
+    private boolean ensureActiveApexSessionIsAborted(StagedSession session) {
         if (!session.containsApexSession()) {
             return true;
         }
-        final ApexSessionInfo apexSession = mApexManager.getStagedSessionInfo(session.sessionId);
+        final ApexSessionInfo apexSession = mApexManager.getStagedSessionInfo(session.sessionId());
         if (apexSession == null || isApexSessionFinalized(apexSession)) {
             return true;
         }
-        return mApexManager.abortStagedSession(session.sessionId);
+        return mApexManager.abortStagedSession(session.sessionId());
     }
 
     private boolean isApexSessionFinalized(ApexSessionInfo session) {
@@ -878,7 +911,7 @@
                 || apexSessionInfo.isRevertFailed;
     }
 
-    void restoreSession(@NonNull PackageInstallerSession session, boolean isDeviceUpgrading) {
+    void restoreSession(@NonNull StagedSession session, boolean isDeviceUpgrading) {
         if (session.hasParentSessionId()) {
             // Only parent sessions can be restored
             return;
@@ -887,16 +920,16 @@
         createSession(session);
         // The preconditions used during pre-reboot verification might have changed when device
         // is upgrading. Updated staged sessions to activation failed before we resume the session.
-        PackageInstallerSession sessionToResume = session;
-        if (isDeviceUpgrading && !sessionToResume.isStagedAndInTerminalState()) {
-            sessionToResume.setStagedSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED,
+        StagedSession sessionToResume = session;
+        if (isDeviceUpgrading && !sessionToResume.isInTerminalState()) {
+            sessionToResume.setSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED,
                         "Build fingerprint has changed");
             return;
         }
         checkStateAndResume(sessionToResume);
     }
 
-    private void checkStateAndResume(@NonNull PackageInstallerSession session) {
+    private void checkStateAndResume(@NonNull StagedSession session) {
         // Do not resume session if boot completed already
         if (SystemProperties.getBoolean("sys.boot_completed", false)) {
             return;
@@ -907,7 +940,7 @@
             return;
         }
         // Check the state of the session and decide what to do next.
-        if (session.isStagedSessionFailed() || session.isStagedSessionApplied()) {
+        if (session.isSessionFailed() || session.isSessionApplied()) {
             // Final states, nothing to do.
             return;
         }
@@ -916,7 +949,7 @@
             session.abandon();
             return;
         }
-        if (!session.isStagedSessionReady()) {
+        if (!session.isSessionReady()) {
             // The framework got restarted before the pre-reboot verification could complete,
             // restart the verification.
             mPreRebootVerificationHandler.startPreRebootVerification(session);
@@ -998,8 +1031,8 @@
         }
     }
 
-    private PackageInstallerSession getStagedSession(int sessionId) {
-        PackageInstallerSession session;
+    private StagedSession getStagedSession(int sessionId) {
+        StagedSession session;
         synchronized (mStagedSessions) {
             session = mStagedSessions.get(sessionId);
         }
@@ -1009,20 +1042,20 @@
     // TODO(b/136257624): Temporary API to let PMS communicate with StagingManager. When all
     //  verification logic is extracted out of StagingManager into PMS, we can remove
     //  this.
-    void notifyVerificationComplete(PackageInstallerSession session) {
+    void notifyVerificationComplete(StagedSession session) {
         mPreRebootVerificationHandler.onPreRebootVerificationComplete(session);
     }
 
     // TODO(b/136257624): Temporary API to let PMS communicate with StagingManager. When all
     //  verification logic is extracted out of StagingManager into PMS, we can remove
     //  this.
-    void notifyPreRebootVerification_Apk_Complete(@NonNull PackageInstallerSession session) {
+    void notifyPreRebootVerification_Apk_Complete(@NonNull StagedSession session) {
         mPreRebootVerificationHandler.notifyPreRebootVerification_Apk_Complete(session);
     }
 
     private final class PreRebootVerificationHandler extends Handler {
         // Hold sessions before handler gets ready to do the verification.
-        private List<PackageInstallerSession> mPendingSessions;
+        private List<StagedSession> mPendingSessions;
         private boolean mIsReady;
 
         PreRebootVerificationHandler(Looper looper) {
@@ -1052,8 +1085,8 @@
         public void handleMessage(Message msg) {
             final int sessionId = msg.arg1;
             final int rollbackId = msg.arg2;
-            final PackageInstallerSession session = (PackageInstallerSession) msg.obj;
-            if (session.isDestroyed() || session.isStagedSessionFailed()) {
+            final StagedSession session = (StagedSession) msg.obj;
+            if (session.isDestroyed() || session.isSessionFailed()) {
                 // No point in running verification on a destroyed/failed session
                 onPreRebootVerificationComplete(session);
                 return;
@@ -1086,7 +1119,7 @@
             mIsReady = true;
             if (mPendingSessions != null) {
                 for (int i = 0; i < mPendingSessions.size(); i++) {
-                    PackageInstallerSession session = mPendingSessions.get(i);
+                    StagedSession session = mPendingSessions.get(i);
                     startPreRebootVerification(session);
                 }
                 mPendingSessions = null;
@@ -1095,7 +1128,7 @@
 
         // Method for starting the pre-reboot verification
         private synchronized void startPreRebootVerification(
-                @NonNull PackageInstallerSession session) {
+                @NonNull StagedSession session) {
             if (!mIsReady) {
                 if (mPendingSessions == null) {
                     mPendingSessions = new ArrayList<>();
@@ -1104,47 +1137,47 @@
                 return;
             }
 
-            if (session.notifyStagedStartPreRebootVerification()) {
-                int sessionId = session.sessionId;
+            if (session.notifyStartPreRebootVerification()) {
+                int sessionId = session.sessionId();
                 Slog.d(TAG, "Starting preRebootVerification for session " + sessionId);
                 obtainMessage(MSG_PRE_REBOOT_VERIFICATION_START, sessionId, -1, session)
                         .sendToTarget();
             }
         }
 
-        private void onPreRebootVerificationFailure(PackageInstallerSession session,
+        private void onPreRebootVerificationFailure(StagedSession session,
                 @SessionInfo.StagedSessionErrorCode int errorCode, String errorMessage) {
             if (!ensureActiveApexSessionIsAborted(session)) {
-                Slog.e(TAG, "Failed to abort apex session " + session.sessionId);
+                Slog.e(TAG, "Failed to abort apex session " + session.sessionId());
                 // Safe to ignore active apex session abortion failure since session will be marked
                 // failed on next step and staging directory for session will be deleted.
             }
-            session.setStagedSessionFailed(errorCode, errorMessage);
+            session.setSessionFailed(errorCode, errorMessage);
             onPreRebootVerificationComplete(session);
         }
 
         // Things to do when pre-reboot verification completes for a particular sessionId
-        private void onPreRebootVerificationComplete(PackageInstallerSession session) {
-            int sessionId = session.sessionId;
+        private void onPreRebootVerificationComplete(StagedSession session) {
+            int sessionId = session.sessionId();
             Slog.d(TAG, "Stopping preRebootVerification for session " + sessionId);
-            session.notifyStagedEndPreRebootVerification();
+            session.notifyEndPreRebootVerification();
         }
 
         private void notifyPreRebootVerification_Start_Complete(
-                @NonNull PackageInstallerSession session, int rollbackId) {
-            obtainMessage(MSG_PRE_REBOOT_VERIFICATION_APEX, session.sessionId, rollbackId, session)
-                    .sendToTarget();
+                @NonNull StagedSession session, int rollbackId) {
+            obtainMessage(MSG_PRE_REBOOT_VERIFICATION_APEX, session.sessionId(), rollbackId,
+                    session).sendToTarget();
         }
 
         private void notifyPreRebootVerification_Apex_Complete(
-                @NonNull PackageInstallerSession session) {
-            obtainMessage(MSG_PRE_REBOOT_VERIFICATION_APK, session.sessionId, -1, session)
+                @NonNull StagedSession session) {
+            obtainMessage(MSG_PRE_REBOOT_VERIFICATION_APK, session.sessionId(), -1, session)
                     .sendToTarget();
         }
 
         private void notifyPreRebootVerification_Apk_Complete(
-                @NonNull PackageInstallerSession session) {
-            obtainMessage(MSG_PRE_REBOOT_VERIFICATION_END, session.sessionId, -1, session)
+                @NonNull StagedSession session) {
+            obtainMessage(MSG_PRE_REBOOT_VERIFICATION_END, session.sessionId(), -1, session)
                     .sendToTarget();
         }
 
@@ -1153,10 +1186,10 @@
          *
          * See {@link PreRebootVerificationHandler} to see all nodes of pre reboot verification
          */
-        private void handlePreRebootVerification_Start(@NonNull PackageInstallerSession session) {
+        private void handlePreRebootVerification_Start(@NonNull StagedSession session) {
             try {
                 if (session.isMultiPackage()) {
-                    for (PackageInstallerSession s : session.getChildSessions()) {
+                    for (StagedSession s : session.getChildSessions()) {
                         checkNonOverlappingWithStagedSessions(s);
                     }
                 } else {
@@ -1168,7 +1201,8 @@
             }
 
             int rollbackId = -1;
-            if ((session.params.installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) != 0) {
+            if ((session.sessionParams().installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK)
+                    != 0) {
                 // If rollback is enabled for this session, we call through to the RollbackManager
                 // with the list of sessions it must enable rollback for. Note that
                 // notifyStagedSession is a synchronous operation.
@@ -1177,14 +1211,15 @@
                 try {
                     // NOTE: To stay consistent with the non-staged install flow, we don't fail the
                     // entire install if rollbacks can't be enabled.
-                    rollbackId = rm.notifyStagedSession(session.sessionId);
+                    rollbackId = rm.notifyStagedSession(session.sessionId());
                 } catch (RuntimeException re) {
                     Slog.e(TAG, "Failed to notifyStagedSession for session: "
-                            + session.sessionId, re);
+                            + session.sessionId(), re);
                 }
-            } else if (session.params.installReason == PackageManager.INSTALL_REASON_ROLLBACK) {
+            } else if (session.sessionParams().installReason
+                    == PackageManager.INSTALL_REASON_ROLLBACK) {
                 try {
-                    rollbackId = retrieveRollbackIdForCommitSession(session.sessionId);
+                    rollbackId = retrieveRollbackIdForCommitSession(session.sessionId());
                 } catch (PackageManagerException e) {
                     onPreRebootVerificationFailure(session, e.error, e.getMessage());
                     return;
@@ -1203,7 +1238,7 @@
          * </ul></p>
          */
         private void handlePreRebootVerification_Apex(
-                @NonNull PackageInstallerSession session, int rollbackId) {
+                @NonNull StagedSession session, int rollbackId) {
             final boolean hasApex = session.containsApexSession();
 
             // APEX checks. For single-package sessions, check if they contain an APEX. For
@@ -1233,12 +1268,12 @@
          * {@link PackageManagerService} for verification and it notifies back the result via
          * {@link #notifyPreRebootVerification_Apk_Complete}
          */
-        private void handlePreRebootVerification_Apk(@NonNull PackageInstallerSession session) {
+        private void handlePreRebootVerification_Apk(@NonNull StagedSession session) {
             if (!session.containsApkSession()) {
                 notifyPreRebootVerification_Apk_Complete(session);
                 return;
             }
-            session.verifyStagedSession();
+            session.verifySession();
         }
 
         /**
@@ -1248,7 +1283,7 @@
          *     <li>marks session as ready</li>
          * </ul></p>
          */
-        private void handlePreRebootVerification_End(@NonNull PackageInstallerSession session) {
+        private void handlePreRebootVerification_End(@NonNull StagedSession session) {
             // Before marking the session as ready, start checkpoint service if available
             try {
                 IStorageManager storageManager = PackageHelper.getStorageManager();
@@ -1280,15 +1315,15 @@
             // On the other hand, if the order of the calls was inverted (first call apexd, then
             // mark session as ready), then if a device gets rebooted right after the call to apexd,
             // only apex part of the train will be applied, leaving device in an inconsistent state.
-            Slog.d(TAG, "Marking session " + session.sessionId + " as ready");
-            session.setStagedSessionReady();
-            if (session.isStagedSessionReady()) {
+            Slog.d(TAG, "Marking session " + session.sessionId() + " as ready");
+            session.setSessionReady();
+            if (session.isSessionReady()) {
                 final boolean hasApex = session.containsApexSession();
                 if (hasApex) {
                     try {
-                        mApexManager.markStagedSessionReady(session.sessionId);
+                        mApexManager.markStagedSessionReady(session.sessionId());
                     } catch (PackageManagerException e) {
-                        session.setStagedSessionFailed(e.error, e.getMessage());
+                        session.setSessionFailed(e.error, e.getMessage());
                         return;
                     }
                 }
diff --git a/services/core/java/com/android/server/policy/OWNERS b/services/core/java/com/android/server/policy/OWNERS
index d25ec4a..8887e40 100644
--- a/services/core/java/com/android/server/policy/OWNERS
+++ b/services/core/java/com/android/server/policy/OWNERS
@@ -1,2 +1,3 @@
 include /services/core/java/com/android/server/wm/OWNERS
 include /services/core/java/com/android/server/input/OWNERS
+include /services/core/java/com/android/server/pm/permission/OWNERS
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index 977b31e..1553966 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -496,6 +496,32 @@
      * @return int An arbitrary integer used to order windows, with lower numbers below higher ones.
      */
     default int getWindowLayerFromTypeLw(int type, boolean canAddInternalSystemWindow) {
+        return getWindowLayerFromTypeLw(type, canAddInternalSystemWindow,
+                false /* roundedCornerOverlay */);
+    }
+
+    /**
+     * Returns the layer assignment for the window type. Allows you to control how different
+     * kinds of windows are ordered on-screen.
+     *
+     * @param type The type of window being assigned.
+     * @param canAddInternalSystemWindow If the owner window associated with the type we are
+     *        evaluating can add internal system windows. I.e they have
+     *        {@link Manifest.permission#INTERNAL_SYSTEM_WINDOW}. If true, alert window
+     *        types {@link android.view.WindowManager.LayoutParams#isSystemAlertWindowType(int)}
+     *        can be assigned layers greater than the layer for
+     *        {@link android.view.WindowManager.LayoutParams#TYPE_APPLICATION_OVERLAY} Else, their
+     *        layers would be lesser.
+     * @param roundedCornerOverlay {#code true} to indicate that the owner window is rounded corner
+     *                             overlay.
+     * @return int An arbitrary integer used to order windows, with lower numbers below higher ones.
+     */
+    default int getWindowLayerFromTypeLw(int type, boolean canAddInternalSystemWindow,
+            boolean roundedCornerOverlay) {
+        // Always put the rounded corner layer to the top most.
+        if (roundedCornerOverlay && canAddInternalSystemWindow) {
+            return getMaxWindowLayer();
+        }
         if (type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) {
             return APPLICATION_LAYER;
         }
@@ -598,8 +624,17 @@
         }
     }
 
+    // TODO(b/155340867): consider to remove the logic after using pure Surface for rounded corner
+    //  overlay.
+    /**
+     * Returns the max window layer.
+     * <p>Note that the max window layer should be higher that the maximum value which reported
+     * by {@link #getWindowLayerFromTypeLw(int, boolean)} to contain rounded corner overlay.</p>
+     *
+     * @see WindowManager.LayoutParams#PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY
+     */
     default int getMaxWindowLayer() {
-        return 35;
+        return 36;
     }
 
     /**
diff --git a/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java b/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java
index 017c684..b95c5efc 100644
--- a/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java
+++ b/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java
@@ -33,6 +33,7 @@
 import com.android.internal.telephony.SmsApplication;
 import com.android.internal.util.CollectionUtils;
 import com.android.server.LocalServices;
+import com.android.server.role.LegacyRoleHolderProvider;
 import com.android.server.role.RoleManagerService;
 
 import java.util.Collections;
@@ -48,7 +49,7 @@
  *
  * @see RoleManagerService#migrateRoleIfNecessary
  */
-public class LegacyRoleResolutionPolicy implements RoleManagerService.RoleHoldersResolver {
+public class LegacyRoleResolutionPolicy implements LegacyRoleHolderProvider {
 
     private static final boolean DEBUG = false;
     private static final String LOG_TAG = "LegacyRoleResolutionPol";
@@ -62,7 +63,7 @@
 
     @NonNull
     @Override
-    public List<String> getRoleHolders(@NonNull String roleName, @UserIdInt int userId) {
+    public List<String> getLegacyRoleHolders(@NonNull String roleName, @UserIdInt int userId) {
         switch (roleName) {
             case RoleManager.ROLE_ASSISTANT: {
                 String packageName;
diff --git a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
index e0701e8..990055e 100644
--- a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
+++ b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
@@ -16,8 +16,10 @@
 
 package com.android.server.recoverysystem;
 
+import android.annotation.IntDef;
 import android.content.Context;
 import android.content.IntentSender;
+import android.content.pm.PackageManager;
 import android.net.LocalSocket;
 import android.net.LocalSocketAddress;
 import android.os.Binder;
@@ -32,6 +34,7 @@
 import android.os.SystemProperties;
 import android.util.Slog;
 
+import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.widget.LockSettingsInternal;
 import com.android.internal.widget.RebootEscrowListener;
@@ -46,6 +49,10 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * The recovery system service is responsible for coordinating recovery related
@@ -76,9 +83,53 @@
     private final Injector mInjector;
     private final Context mContext;
 
-    private boolean mPreparedForReboot;
-    private String mUnattendedRebootToken;
-    private IntentSender mPreparedForRebootIntentSender;
+    @GuardedBy("this")
+    private final Map<String, IntentSender> mCallerPendingRequest = new HashMap<>();
+    @GuardedBy("this")
+    private final Set<String> mCallerPreparedForReboot = new HashSet<>();
+
+    /**
+     * Need to prepare for resume on reboot.
+     */
+    private static final int ROR_NEED_PREPARATION = 0;
+    /**
+     * Resume on reboot has been prepared, notify the caller.
+     */
+    private static final int ROR_SKIP_PREPARATION_AND_NOTIFY = 1;
+    /**
+     * Resume on reboot has been requested. Caller won't be notified until the preparation is done.
+     */
+    private static final int ROR_SKIP_PREPARATION_NOT_NOTIFY = 2;
+
+    /**
+     * The caller never requests for resume on reboot, no need for clear.
+     */
+    private static final int ROR_NOT_REQUESTED = 0;
+    /**
+     * Clear the resume on reboot preparation state.
+     */
+    private static final int ROR_REQUESTED_NEED_CLEAR = 1;
+    /**
+     * The caller has requested for resume on reboot. No need for clear since other callers may
+     * exist.
+     */
+    private static final int ROR_REQUESTED_SKIP_CLEAR = 2;
+
+    /**
+     * The action to perform upon new resume on reboot prepare request for a given client.
+     */
+    @IntDef({ ROR_NEED_PREPARATION,
+            ROR_SKIP_PREPARATION_AND_NOTIFY,
+            ROR_SKIP_PREPARATION_NOT_NOTIFY })
+    @interface ResumeOnRebootActionsOnRequest {}
+
+    /**
+     * The action to perform upon resume on reboot clear request for a given client.
+     */
+    @IntDef({ROR_NOT_REQUESTED,
+            ROR_REQUESTED_NEED_CLEAR,
+            ROR_REQUESTED_SKIP_CLEAR})
+    @interface ResumeOnRebootActionsOnClear{}
 
     static class Injector {
         protected final Context mContext;
@@ -286,47 +337,92 @@
         }
     }
 
-    @Override // Binder call
-    public boolean requestLskf(String updateToken, IntentSender intentSender) {
-        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null);
+    private void enforcePermissionForResumeOnReboot() {
+        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.RECOVERY)
+                != PackageManager.PERMISSION_GRANTED
+                && mContext.checkCallingOrSelfPermission(android.Manifest.permission.REBOOT)
+                        != PackageManager.PERMISSION_GRANTED) {
+            throw new SecurityException("Caller or self must have "
+                    + android.Manifest.permission.RECOVERY + " or "
+                    + android.Manifest.permission.REBOOT + " for resume on reboot.");
+        }
+    }
 
-        if (updateToken == null) {
+    @Override // Binder call
+    public boolean requestLskf(String packageName, IntentSender intentSender) {
+        enforcePermissionForResumeOnReboot();
+
+        if (packageName == null) {
+            Slog.w(TAG, "Missing packageName when requesting lskf.");
             return false;
         }
 
-        // No need to prepare again for the same token.
-        if (mPreparedForReboot && updateToken.equals(mUnattendedRebootToken)) {
-            return true;
+        @ResumeOnRebootActionsOnRequest int action = updateRoRPreparationStateOnNewRequest(
+                packageName, intentSender);
+        switch (action) {
+            case ROR_SKIP_PREPARATION_AND_NOTIFY:
+                // We consider the preparation done if someone else has prepared.
+                sendPreparedForRebootIntentIfNeeded(intentSender);
+                return true;
+            case ROR_SKIP_PREPARATION_NOT_NOTIFY:
+                return true;
+            case ROR_NEED_PREPARATION:
+                final long origId = Binder.clearCallingIdentity();
+                try {
+                    mInjector.getLockSettingsService().prepareRebootEscrow();
+                } finally {
+                    Binder.restoreCallingIdentity(origId);
+                }
+                return true;
+            default:
+                throw new IllegalStateException("Unsupported action type on new request " + action);
+        }
+    }
+
+    // Checks and updates the resume on reboot preparation state.
+    private synchronized @ResumeOnRebootActionsOnRequest int updateRoRPreparationStateOnNewRequest(
+            String packageName, IntentSender intentSender) {
+        if (!mCallerPreparedForReboot.isEmpty()) {
+            if (mCallerPreparedForReboot.contains(packageName)) {
+                Slog.i(TAG, "RoR already has prepared for " + packageName);
+            }
+
+            // Someone else has prepared. Consider the preparation done, and send back the intent.
+            mCallerPreparedForReboot.add(packageName);
+            return ROR_SKIP_PREPARATION_AND_NOTIFY;
         }
 
-        mPreparedForReboot = false;
-        mUnattendedRebootToken = updateToken;
-        mPreparedForRebootIntentSender = intentSender;
-
-        final long origId = Binder.clearCallingIdentity();
-        try {
-            mInjector.getLockSettingsService().prepareRebootEscrow();
-        } finally {
-            Binder.restoreCallingIdentity(origId);
+        boolean needPreparation = mCallerPendingRequest.isEmpty();
+        if (mCallerPendingRequest.containsKey(packageName)) {
+            Slog.i(TAG, "Duplicate RoR preparation request for " + packageName);
         }
-
-        return true;
+        // Update the request with the new intentSender.
+        mCallerPendingRequest.put(packageName, intentSender);
+        return needPreparation ? ROR_NEED_PREPARATION : ROR_SKIP_PREPARATION_NOT_NOTIFY;
     }
 
     @Override
     public void onPreparedForReboot(boolean ready) {
-        if (mUnattendedRebootToken == null) {
-            Slog.w(TAG, "onPreparedForReboot called when mUnattendedRebootToken is null");
+        if (!ready) {
+            return;
         }
-
-        mPreparedForReboot = ready;
-        if (ready) {
-            sendPreparedForRebootIntentIfNeeded();
-        }
+        updateRoRPreparationStateOnPreparedForReboot();
     }
 
-    private void sendPreparedForRebootIntentIfNeeded() {
-        final IntentSender intentSender = mPreparedForRebootIntentSender;
+    private synchronized void updateRoRPreparationStateOnPreparedForReboot() {
+        if (!mCallerPreparedForReboot.isEmpty()) {
+            Slog.w(TAG, "onPreparedForReboot called when some clients have prepared.");
+        }
+
+        // Send intents to notify callers
+        for (Map.Entry<String, IntentSender> entry : mCallerPendingRequest.entrySet()) {
+            sendPreparedForRebootIntentIfNeeded(entry.getValue());
+            mCallerPreparedForReboot.add(entry.getKey());
+        }
+        mCallerPendingRequest.clear();
+    }
+
+    private void sendPreparedForRebootIntentIfNeeded(IntentSender intentSender) {
         if (intentSender != null) {
             try {
                 intentSender.sendIntent(null, 0, null, null, null);
@@ -337,37 +433,61 @@
     }
 
     @Override // Binder call
-    public boolean clearLskf() {
-        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null);
-
-        mPreparedForReboot = false;
-        mUnattendedRebootToken = null;
-        mPreparedForRebootIntentSender = null;
-
-        final long origId = Binder.clearCallingIdentity();
-        try {
-            mInjector.getLockSettingsService().clearRebootEscrow();
-        } finally {
-            Binder.restoreCallingIdentity(origId);
+    public boolean clearLskf(String packageName) {
+        enforcePermissionForResumeOnReboot();
+        if (packageName == null) {
+            Slog.w(TAG, "Missing packageName when clearing lskf.");
+            return false;
         }
 
-        return true;
+        @ResumeOnRebootActionsOnClear int action = updateRoRPreparationStateOnClear(packageName);
+        switch (action) {
+            case ROR_NOT_REQUESTED:
+                Slog.w(TAG, "RoR clear called before preparation for caller " + packageName);
+                return true;
+            case ROR_REQUESTED_SKIP_CLEAR:
+                return true;
+            case ROR_REQUESTED_NEED_CLEAR:
+                final long origId = Binder.clearCallingIdentity();
+                try {
+                    mInjector.getLockSettingsService().clearRebootEscrow();
+                } finally {
+                    Binder.restoreCallingIdentity(origId);
+                }
+                return true;
+            default:
+                throw new IllegalStateException("Unsupported action type on clear " + action);
+        }
+    }
+
+    private synchronized @ResumeOnRebootActionsOnClear int updateRoRPreparationStateOnClear(
+            String packageName) {
+        if (!mCallerPreparedForReboot.contains(packageName) && !mCallerPendingRequest.containsKey(
+                packageName)) {
+            Slog.w(TAG, packageName + " hasn't prepared for resume on reboot");
+            return ROR_NOT_REQUESTED;
+        }
+        mCallerPendingRequest.remove(packageName);
+        mCallerPreparedForReboot.remove(packageName);
+
+        // Check if others have prepared ROR.
+        boolean needClear = mCallerPendingRequest.isEmpty() && mCallerPreparedForReboot.isEmpty();
+        return needClear ? ROR_REQUESTED_NEED_CLEAR : ROR_REQUESTED_SKIP_CLEAR;
     }
 
     @Override // Binder call
-    public boolean rebootWithLskf(String updateToken, String reason) {
-        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null);
-
-        if (!mPreparedForReboot) {
-            Slog.i(TAG, "Reboot requested before prepare completed");
+    public boolean rebootWithLskf(String packageName, String reason, boolean slotSwitch) {
+        enforcePermissionForResumeOnReboot();
+        if (packageName == null) {
+            Slog.w(TAG, "Missing packageName when rebooting with lskf.");
+            return false;
+        }
+        if (!isLskfCaptured(packageName)) {
             return false;
         }
 
-        if (updateToken != null && !updateToken.equals(mUnattendedRebootToken)) {
-            Slog.i(TAG, "Reboot requested after preparation, but with mismatching token");
-            return false;
-        }
-
+        // TODO(xunchang) check the slot to boot into, and fail the reboot upon slot mismatch.
+        // TODO(xunchang) write the vbmeta digest along with the escrowKey before reboot.
         if (!mInjector.getLockSettingsService().armRebootEscrow()) {
             Slog.w(TAG, "Failure to escrow key for reboot");
             return false;
@@ -378,6 +498,16 @@
         return true;
     }
 
+    @Override // Binder call
+    public synchronized boolean isLskfCaptured(String packageName) {
+        enforcePermissionForResumeOnReboot();
+        if (!mCallerPreparedForReboot.contains(packageName)) {
+            Slog.i(TAG, "Reboot requested before prepare completed for caller " + packageName);
+            return false;
+        }
+        return true;
+    }
+
     /**
      * Check if any of the init services is still running. If so, we cannot
      * start a new uncrypt/setup-bcb/clear-bcb service right away; otherwise
diff --git a/services/core/java/com/android/server/recoverysystem/RecoverySystemShellCommand.java b/services/core/java/com/android/server/recoverysystem/RecoverySystemShellCommand.java
index c6905b5..f20d80d 100644
--- a/services/core/java/com/android/server/recoverysystem/RecoverySystemShellCommand.java
+++ b/services/core/java/com/android/server/recoverysystem/RecoverySystemShellCommand.java
@@ -56,26 +56,31 @@
     }
 
     private int requestLskf() throws RemoteException {
-        String updateToken = getNextArgRequired();
-        boolean success = mService.requestLskf(updateToken, null);
+        String packageName = getNextArgRequired();
+        boolean success = mService.requestLskf(packageName, null);
         PrintWriter pw = getOutPrintWriter();
-        pw.println("Request LSKF status: " + (success ? "success" : "failure"));
+        pw.printf("Request LSKF for packageName: %s, status: %s\n", packageName,
+                success ? "success" : "failure");
         return 0;
     }
 
     private int clearLskf() throws RemoteException {
-        boolean success = mService.clearLskf();
+        String packageName = getNextArgRequired();
+        boolean success = mService.clearLskf(packageName);
         PrintWriter pw = getOutPrintWriter();
-        pw.println("Clear LSKF: " + (success ? "success" : "failure"));
+        pw.printf("Clear LSKF for packageName: %s, status: %s\n", packageName,
+                success ? "success" : "failure");
         return 0;
     }
 
     private int rebootAndApply() throws RemoteException {
-        String updateToken = getNextArgRequired();
+        String packageName = getNextArgRequired();
         String rebootReason = getNextArgRequired();
-        boolean success = mService.rebootWithLskf(updateToken, rebootReason);
+        boolean success = mService.rebootWithLskf(packageName, rebootReason, true);
         PrintWriter pw = getOutPrintWriter();
-        pw.println("Reboot and apply status: " + (success ? "success" : "failure"));
+        // Keep the old message for cts test.
+        pw.printf("%s Reboot and apply status: %s\n", packageName,
+                success ? "success" : "failure");
         return 0;
     }
 
diff --git a/services/core/java/com/android/server/role/LegacyRoleHolderProvider.java b/services/core/java/com/android/server/role/LegacyRoleHolderProvider.java
new file mode 100644
index 0000000..ed0d675
--- /dev/null
+++ b/services/core/java/com/android/server/role/LegacyRoleHolderProvider.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.role;
+
+import android.annotation.NonNull;
+import android.annotation.UserIdInt;
+
+import java.util.List;
+
+/**
+ * A provider for migrating legacy "role"s to their actual role implementation.
+ */
+//@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+public interface LegacyRoleHolderProvider {
+    /**
+     * Get the list of holders of a legacy "role" before its actual role is introduced.
+     * <p>
+     * This method will only be called for the first time a role is made available in the platform.
+     *
+     * @param roleName the name of the role
+     * @param userId the user ID
+     * @return a list of holders for the given role
+     */
+    @NonNull
+    List<String> getLegacyRoleHolders(@NonNull String roleName, @UserIdInt int userId);
+}
diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java
index 106dc21..d6add78 100644
--- a/services/core/java/com/android/server/role/RoleManagerService.java
+++ b/services/core/java/com/android/server/role/RoleManagerService.java
@@ -103,14 +103,7 @@
     private final Object mLock = new Object();
 
     @NonNull
-    private final RoleHoldersResolver mLegacyRoleResolver;
-
-    /** @see #getRoleHolders(String, int) */
-    public interface RoleHoldersResolver {
-        /** @return a list of packages that hold a given role for a given user */
-        @NonNull
-        List<String> getRoleHolders(@NonNull String roleName, @UserIdInt int userId);
-    }
+    private final LegacyRoleHolderProvider mLegacyRoleHolderProvider;
 
     /**
      * Maps user id to its state.
@@ -146,10 +139,10 @@
             new SparseArray<>();
 
     public RoleManagerService(@NonNull Context context,
-            @NonNull RoleHoldersResolver legacyRoleResolver) {
+            @NonNull LegacyRoleHolderProvider legacyRoleHolderProvider) {
         super(context);
 
-        mLegacyRoleResolver = legacyRoleResolver;
+        mLegacyRoleHolderProvider = legacyRoleHolderProvider;
 
         RoleControllerManager.initializeRemoteServiceComponentName(context);
 
@@ -275,7 +268,7 @@
         // Any role for which we have a record are already migrated
         RoleUserState userState = getOrCreateUserState(userId);
         if (!userState.isRoleAvailable(role)) {
-            List<String> roleHolders = mLegacyRoleResolver.getRoleHolders(role, userId);
+            List<String> roleHolders = mLegacyRoleHolderProvider.getLegacyRoleHolders(role, userId);
             if (roleHolders.isEmpty()) {
                 return;
             }
diff --git a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
index de06c92..da56824 100644
--- a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
+++ b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
@@ -472,8 +472,8 @@
             final CharSequence details = context.getText(
                     com.android.internal.R.string.low_internal_storage_view_text);
 
-            PendingIntent intent = PendingIntent.getActivityAsUser(context, 0, lowMemIntent, 0,
-                    null, UserHandle.CURRENT);
+            PendingIntent intent = PendingIntent.getActivityAsUser(context, 0, lowMemIntent,
+                    PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT);
             Notification notification =
                     new Notification.Builder(context, SystemNotificationChannels.ALERTS)
                             .setSmallIcon(com.android.internal.R.drawable.stat_notify_disk_full)
diff --git a/services/core/java/com/android/server/storage/StorageSessionController.java b/services/core/java/com/android/server/storage/StorageSessionController.java
index 0abeac8..808d130 100644
--- a/services/core/java/com/android/server/storage/StorageSessionController.java
+++ b/services/core/java/com/android/server/storage/StorageSessionController.java
@@ -32,6 +32,7 @@
 import android.os.RemoteException;
 import android.os.ServiceSpecificException;
 import android.os.UserHandle;
+import android.os.storage.StorageVolume;
 import android.os.storage.VolumeInfo;
 import android.provider.MediaStore;
 import android.service.storage.ExternalStorageService;
@@ -133,6 +134,28 @@
         }
     }
 
+    /**
+     * Frees any cache held by ExternalStorageService.
+     *
+     * <p> Blocks until the service frees the cache or fails in doing so.
+     *
+     * @param volumeUuid uuid of the {@link StorageVolume} from which cache needs to be freed
+     * @param bytes number of bytes which need to be freed
+     * @throws ExternalStorageServiceException if it fails to connect to ExternalStorageService
+     */
+    public void freeCache(String volumeUuid, long bytes)
+            throws ExternalStorageServiceException {
+        synchronized (mLock) {
+            int size = mConnections.size();
+            for (int i = 0; i < size; i++) {
+                int key = mConnections.keyAt(i);
+                StorageUserConnection connection = mConnections.get(key);
+                if (connection != null) {
+                    connection.freeCache(volumeUuid, bytes);
+                }
+            }
+        }
+    }
 
     /**
      * Removes and returns the {@link StorageUserConnection} for {@code vol}.
diff --git a/services/core/java/com/android/server/storage/StorageUserConnection.java b/services/core/java/com/android/server/storage/StorageUserConnection.java
index af26289..4a32d0f 100644
--- a/services/core/java/com/android/server/storage/StorageUserConnection.java
+++ b/services/core/java/com/android/server/storage/StorageUserConnection.java
@@ -125,6 +125,26 @@
     }
 
     /**
+     * Frees any cache held by ExternalStorageService.
+     *
+     * <p> Blocks until the service frees the cache or fails in doing so.
+     *
+     * @param volumeUuid uuid of the {@link StorageVolume} from which cache needs to be freed
+     * @param bytes number of bytes which need to be freed
+     * @throws ExternalStorageServiceException if it fails to connect to ExternalStorageService
+     */
+    public void freeCache(String volumeUuid, long bytes)
+            throws ExternalStorageServiceException {
+        Objects.requireNonNull(volumeUuid);
+
+        synchronized (mSessionsLock) {
+            for (String sessionId : mSessions.keySet()) {
+                mActiveConnection.freeCache(sessionId, volumeUuid, bytes);
+            }
+        }
+    }
+
+    /**
      * Removes a session without ending it or waiting for exit.
      *
      * This should only be used if the session has certainly been ended because the volume was
@@ -214,7 +234,7 @@
         // A list of outstanding futures for async calls, for which we are still waiting
         // for a callback. Used to unblock waiters if the service dies.
         @GuardedBy("mLock")
-        private ArrayList<CompletableFuture<Void>> mOutstandingOps = new ArrayList<>();
+        private final ArrayList<CompletableFuture<Void>> mOutstandingOps = new ArrayList<>();
 
         @Override
         public void close() {
@@ -309,6 +329,17 @@
             }
         }
 
+        public void freeCache(String sessionId, String volumeUuid, long bytes)
+                throws ExternalStorageServiceException {
+            try {
+                waitForAsync((service, callback) ->
+                        service.freeCache(sessionId, volumeUuid, bytes, callback));
+            } catch (Exception e) {
+                throw new ExternalStorageServiceException("Failed to free " + bytes
+                        + " bytes for volumeUuid : " + volumeUuid, e);
+            }
+        }
+
         private void setResult(Bundle result, CompletableFuture<Void> future) {
             ParcelableException ex = result.getParcelable(EXTRA_ERROR);
             if (ex != null) {
diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java
index 85fcd3d..1387311 100644
--- a/services/core/java/com/android/server/wm/ActivityClientController.java
+++ b/services/core/java/com/android/server/wm/ActivityClientController.java
@@ -39,12 +39,15 @@
 import static com.android.server.wm.Task.ActivityState.DESTROYED;
 import static com.android.server.wm.Task.ActivityState.DESTROYING;
 
+import android.annotation.NonNull;
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.ActivityOptions;
 import android.app.ActivityTaskManager;
 import android.app.IActivityClientController;
 import android.app.PictureInPictureParams;
+import android.app.servertransaction.ClientTransaction;
+import android.app.servertransaction.EnterPipRequestedItem;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -736,6 +739,38 @@
         return r;
     }
 
+    /**
+     * Requests that an activity should enter picture-in-picture mode if possible. This method may
+     * be used by the implementation of non-phone form factors.
+     */
+    void requestPictureInPictureMode(@NonNull ActivityRecord r) {
+        if (r.inPinnedWindowingMode()) {
+            throw new IllegalStateException("Activity is already in PIP mode");
+        }
+
+        final boolean canEnterPictureInPicture = r.checkEnterPictureInPictureState(
+                "requestPictureInPictureMode", /* beforeStopping */ false);
+        if (!canEnterPictureInPicture) {
+            throw new IllegalStateException(
+                    "Requested PIP on an activity that doesn't support it");
+        }
+
+        if (r.pictureInPictureArgs.isAutoEnterEnabled()) {
+            mService.enterPictureInPictureMode(r, r.pictureInPictureArgs);
+            return;
+        }
+
+        try {
+            final ClientTransaction transaction = ClientTransaction.obtain(
+                    r.app.getThread(), r.token);
+            transaction.addCallback(EnterPipRequestedItem.obtain());
+            mService.getLifecycleManager().scheduleTransaction(transaction);
+        } catch (Exception e) {
+            Slog.w(TAG, "Failed to send enter pip requested 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/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 0b3050a..ce70978 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -148,8 +148,6 @@
 import android.app.admin.DevicePolicyCache;
 import android.app.assist.AssistContent;
 import android.app.assist.AssistStructure;
-import android.app.servertransaction.ClientTransaction;
-import android.app.servertransaction.EnterPipRequestedItem;
 import android.app.usage.UsageStatsManagerInternal;
 import android.content.ActivityNotFoundException;
 import android.content.ComponentName;
@@ -3253,23 +3251,15 @@
         }
     }
 
-    @VisibleForTesting
-    boolean isInPictureInPictureMode(ActivityRecord r) {
-        return r != null
-                && r.getRootTask() != null
-                && r.inPinnedWindowingMode()
-                && r.getRootTask().isInTask(r) != null;
-    }
-
     /**
      * Puts the given activity in picture in picture mode if possible.
      *
      * @return true if the activity is now in picture-in-picture mode, or false if it could not
      * enter picture-in-picture mode.
      */
-    boolean enterPictureInPictureMode(ActivityRecord r, final PictureInPictureParams params) {
+    boolean enterPictureInPictureMode(@NonNull ActivityRecord r, PictureInPictureParams params) {
         // If the activity is already in picture in picture mode, then just return early
-        if (isInPictureInPictureMode(r)) {
+        if (r.inPinnedWindowingMode()) {
             return true;
         }
 
@@ -3754,52 +3744,6 @@
         }
     }
 
-    /**
-     * Requests that an activity should enter picture-in-picture mode if possible.
-     */
-    @Override
-    public void requestPictureInPictureMode(IBinder token) throws RemoteException {
-        enforceTaskPermission("requestPictureInPictureMode");
-        final long origId = Binder.clearCallingIdentity();
-        try {
-            synchronized (mGlobalLock) {
-                final ActivityRecord activity = ActivityRecord.forTokenLocked(token);
-                if (activity == null) {
-                    return;
-                }
-
-                if (isInPictureInPictureMode(activity)) {
-                    throw new IllegalStateException("Activity is already in PIP mode");
-                }
-
-                final boolean canEnterPictureInPicture = activity.checkEnterPictureInPictureState(
-                        "requestPictureInPictureMode", /* beforeStopping */ false);
-                if (!canEnterPictureInPicture) {
-                    throw new IllegalStateException(
-                            "Requested PIP on an activity that doesn't support it");
-                }
-
-                if (activity.pictureInPictureArgs.isAutoEnterEnabled()) {
-                    enterPictureInPictureMode(activity, activity.pictureInPictureArgs);
-                    return;
-                }
-
-                try {
-                    final ClientTransaction transaction = ClientTransaction.obtain(
-                            activity.app.getThread(),
-                            activity.token);
-                    transaction.addCallback(EnterPipRequestedItem.obtain());
-                    getLifecycleManager().scheduleTransaction(transaction);
-                } catch (Exception e) {
-                    Slog.w(TAG, "Failed to send enter pip requested item: "
-                            + activity.intent.getComponent(), e);
-                }
-            }
-        } finally {
-            Binder.restoreCallingIdentity(origId);
-        }
-    }
-
     void dumpLastANRLocked(PrintWriter pw) {
         pw.println("ACTIVITY MANAGER LAST ANR (dumpsys activity lastanr)");
         if (mLastANRState == null) {
diff --git a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java
index c8fadf6..f505daa 100644
--- a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java
+++ b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java
@@ -365,7 +365,7 @@
          */
         private void build(@Nullable List<HierarchyBuilder> displayAreaGroupHierarchyBuilders) {
             final WindowManagerPolicy policy = mRoot.mWmService.mPolicy;
-            final int maxWindowLayerCount = policy.getMaxWindowLayer();
+            final int maxWindowLayerCount = policy.getMaxWindowLayer() + 1;
             final DisplayArea.Tokens[] displayAreaForLayer =
                     new DisplayArea.Tokens[maxWindowLayerCount];
             final Map<Feature, List<DisplayArea<WindowContainer>>> featureAreas =
@@ -560,6 +560,7 @@
             private final int mId;
             private final boolean[] mLayers;
             private NewDisplayAreaSupplier mNewDisplayAreaSupplier = DisplayArea::new;
+            private boolean mExcludeRoundedCorner = true;
 
             /**
              * Builds a new feature that applies to a set of window types as specified by the
@@ -578,7 +579,7 @@
                 mPolicy = policy;
                 mName = name;
                 mId = id;
-                mLayers = new boolean[mPolicy.getMaxWindowLayer()];
+                mLayers = new boolean[mPolicy.getMaxWindowLayer() + 1];
             }
 
             /**
@@ -633,7 +634,18 @@
                 return this;
             }
 
+            // TODO(b/155340867): consider to remove the logic after using pure Surface for rounded
+            // corner overlay.
+            Builder setExcludeRoundedCornerOverlay(boolean excludeRoundedCorner) {
+                mExcludeRoundedCorner = excludeRoundedCorner;
+                return this;
+            }
+
             Feature build() {
+                if (mExcludeRoundedCorner) {
+                    // Always put the rounded corner layer to the top most layer.
+                    mLayers[mPolicy.getMaxWindowLayer()] = false;
+                }
                 return new Feature(mName, mId, mLayers.clone(), mNewDisplayAreaSupplier);
             }
 
diff --git a/services/core/java/com/android/server/wm/RootDisplayArea.java b/services/core/java/com/android/server/wm/RootDisplayArea.java
index 393055e..505af05 100644
--- a/services/core/java/com/android/server/wm/RootDisplayArea.java
+++ b/services/core/java/com/android/server/wm/RootDisplayArea.java
@@ -115,15 +115,11 @@
     @Nullable
     DisplayArea.Tokens findAreaForToken(int windowType, boolean ownerCanManageAppTokens,
             boolean roundedCornerOverlay) {
-        // TODO(b/159767464): cover TYPE_INPUT_METHOD(_DIALOG) case here. mAreaForLayer doesn't
-        // contain IME container.
         int windowLayerFromType = mWmService.mPolicy.getWindowLayerFromTypeLw(windowType,
-                ownerCanManageAppTokens);
+                ownerCanManageAppTokens, roundedCornerOverlay);
         if (windowLayerFromType == APPLICATION_LAYER) {
             throw new IllegalArgumentException(
                     "There shouldn't be WindowToken on APPLICATION_LAYER");
-        } else if (roundedCornerOverlay) {
-            windowLayerFromType = mAreaForLayer.length - 1;
         }
         return mAreaForLayer[windowLayerFromType];
     }
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index d652393..8ca49eb 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -1013,7 +1013,7 @@
         mWmService.scheduleAnimationLocked();
 
         // Send any pending task-info changes that were queued-up during a layout deferment
-        mWmService.mAtmService.mTaskOrganizerController.dispatchPendingTaskInfoChanges();
+        mWmService.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
 
         if (DEBUG_WINDOW_TRACE) Slog.e(TAG, "performSurfacePlacementInner exit");
     }
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index da54732..abd51ee 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -4955,7 +4955,6 @@
             }
         } else {
             // No longer managed by any organizer.
-            mTaskAppearedSent = false;
             setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, false /* set */);
             if (mCreatedByOrganizer) {
                 removeImmediately();
@@ -4980,11 +4979,6 @@
      * @return {@code true} if task organizer changed.
      */
     boolean updateTaskOrganizerState(boolean forceUpdate, boolean skipTaskAppeared) {
-        if (getSurfaceControl() == null) {
-            // Can't call onTaskAppeared without a surfacecontrol, so defer this until after one
-            // is created.
-            return false;
-        }
         if (!canBeOrganized()) {
             return setTaskOrganizer(null);
         }
@@ -4994,6 +4988,10 @@
         final ITaskOrganizer organizer = controller.getTaskOrganizer(windowingMode);
         if (!forceUpdate && mTaskOrganizer == organizer) {
             return false;
+        } else if (organizer != null && getSurfaceControl() == null) {
+            // Can't call onTaskAppeared without a surfacecontrol, so defer this until after one
+            // is created.
+            return false;
         }
         return setTaskOrganizer(organizer, skipTaskAppeared);
     }
@@ -7633,7 +7631,7 @@
 
     void dispatchTaskInfoChangedIfNeeded(boolean force) {
         if (isOrganized()) {
-            mAtmService.mTaskOrganizerController.dispatchTaskInfoChanged(this, force);
+            mAtmService.mTaskOrganizerController.onTaskInfoChanged(this, force);
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index 58aca20..9f8c35b 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -152,27 +152,23 @@
             ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Task appeared taskId=%d", task.mTaskId);
             final boolean visible = task.isVisible();
             final RunningTaskInfo taskInfo = task.getTaskInfo();
-            mDeferTaskOrgCallbacksConsumer.accept(() -> {
-                try {
-                    mTaskOrganizer.onTaskAppeared(taskInfo, prepareLeash(task, visible,
-                            "TaskOrganizerController.onTaskAppeared"));
-                } catch (RemoteException e) {
-                    Slog.e(TAG, "Exception sending onTaskAppeared callback", e);
-                }
-            });
+            try {
+                mTaskOrganizer.onTaskAppeared(taskInfo, prepareLeash(task, visible,
+                        "TaskOrganizerController.onTaskAppeared"));
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Exception sending onTaskAppeared callback", e);
+            }
         }
 
 
         void onTaskVanished(Task task) {
             ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Task vanished taskId=%d", task.mTaskId);
             final RunningTaskInfo taskInfo = task.getTaskInfo();
-            mDeferTaskOrgCallbacksConsumer.accept(() -> {
-                try {
-                    mTaskOrganizer.onTaskVanished(taskInfo);
-                } catch (RemoteException e) {
-                    Slog.e(TAG, "Exception sending onTaskVanished callback", e);
-                }
-            });
+            try {
+                mTaskOrganizer.onTaskVanished(taskInfo);
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Exception sending onTaskVanished callback", e);
+            }
         }
 
         void onTaskInfoChanged(Task task, ActivityManager.RunningTaskInfo taskInfo) {
@@ -181,20 +177,18 @@
                 return;
             }
             ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Task info changed taskId=%d", task.mTaskId);
-            mDeferTaskOrgCallbacksConsumer.accept(() -> {
-                if (!task.isOrganized()) {
-                    // This is safe to ignore if the task is no longer organized
-                    return;
-                }
-                try {
-                    // Purposely notify of task info change immediately instead of deferring (like
-                    // appear and vanish) to allow info changes (such as new PIP params) to flow
-                    // without waiting.
-                    mTaskOrganizer.onTaskInfoChanged(taskInfo);
-                } catch (RemoteException e) {
-                    Slog.e(TAG, "Exception sending onTaskInfoChanged callback", e);
-                }
-            });
+            if (!task.isOrganized()) {
+                // This is safe to ignore if the task is no longer organized
+                return;
+            }
+            try {
+                // Purposely notify of task info change immediately instead of deferring (like
+                // appear and vanish) to allow info changes (such as new PIP params) to flow
+                // without waiting.
+                mTaskOrganizer.onTaskInfoChanged(taskInfo);
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Exception sending onTaskInfoChanged callback", e);
+            }
         }
 
         void onBackPressedOnTaskRoot(Task task) {
@@ -204,17 +198,15 @@
                 // Skip if the task has not yet received taskAppeared().
                 return;
             }
-            mDeferTaskOrgCallbacksConsumer.accept(() -> {
-                if (!task.isOrganized()) {
-                    // This is safe to ignore if the task is no longer organized
-                    return;
-                }
-                try {
-                    mTaskOrganizer.onBackPressedOnTaskRoot(task.getTaskInfo());
-                } catch (Exception e) {
-                    Slog.e(TAG, "Exception sending onBackPressedOnTaskRoot callback", e);
-                }
-            });
+            if (!task.isOrganized()) {
+                // This is safe to ignore if the task is no longer organized
+                return;
+            }
+            try {
+                mTaskOrganizer.onBackPressedOnTaskRoot(task.getTaskInfo());
+            } catch (Exception e) {
+                Slog.e(TAG, "Exception sending onBackPressedOnTaskRoot callback", e);
+            }
         }
     }
 
@@ -259,28 +251,34 @@
             return mOrganizer.prepareLeash(t, t.isVisible(), reason);
         }
 
-        void addTask(Task t) {
-            if (t.mTaskAppearedSent) return;
+        private boolean addTask(Task t) {
+            if (t.mTaskAppearedSent) {
+                return false;
+            }
 
             if (!mOrganizedTasks.contains(t)) {
                 mOrganizedTasks.add(t);
             }
+
             if (t.taskAppearedReady()) {
                 t.mTaskAppearedSent = true;
-                mOrganizer.onTaskAppeared(t);
+                return true;
             }
+            return false;
         }
 
-        void removeTask(Task t) {
+        private boolean removeTask(Task t) {
+            mOrganizedTasks.remove(t);
+            mInterceptBackPressedOnRootTasks.remove(t.mTaskId);
+
             if (t.mTaskAppearedSent) {
                 if (t.getSurfaceControl() != null) {
                     t.migrateToNewSurfaceControl();
                 }
                 t.mTaskAppearedSent = false;
-                mOrganizer.onTaskVanished(t);
+                return true;
             }
-            mOrganizedTasks.remove(t);
-            mInterceptBackPressedOnRootTasks.remove(t.mTaskId);
+            return false;
         }
 
         void dispose() {
@@ -292,7 +290,7 @@
             while (!mOrganizedTasks.isEmpty()) {
                 final Task t = mOrganizedTasks.get(0);
                 if (!t.updateTaskOrganizerState(true /* forceUpdate */)) {
-                    removeTask(t);
+                    TaskOrganizerController.this.onTaskVanished(mOrganizer.mTaskOrganizer, t);
                 }
             }
 
@@ -306,6 +304,33 @@
         }
     }
 
+    static class PendingTaskEvent {
+        static final int EVENT_APPEARED = 0;
+        static final int EVENT_VANISHED = 1;
+        static final int EVENT_INFO_CHANGED = 2;
+        static final int EVENT_ROOT_BACK_PRESSED = 3;
+
+        final int mEventType;
+        final Task mTask;
+        final ITaskOrganizer mTaskOrg;
+        boolean mForce;
+
+        PendingTaskEvent(Task task, int event) {
+            this(task, task.mTaskOrganizer, event);
+        }
+
+        PendingTaskEvent(Task task, ITaskOrganizer taskOrg, int eventType) {
+            mTask = task;
+            mTaskOrg = taskOrg;
+            mEventType = eventType;
+        }
+
+        boolean isLifecycleEvent() {
+            return mEventType == EVENT_APPEARED || mEventType == EVENT_VANISHED
+                    || mEventType == EVENT_INFO_CHANGED;
+        }
+    }
+
     private final ActivityTaskManagerService mService;
     private final WindowManagerGlobalLock mGlobalLock;
 
@@ -313,7 +338,8 @@
     private final LinkedList<ITaskOrganizer> mTaskOrganizers = new LinkedList<>();
     private final HashMap<IBinder, TaskOrganizerState> mTaskOrganizerStates = new HashMap<>();
     private final WeakHashMap<Task, RunningTaskInfo> mLastSentTaskInfos = new WeakHashMap<>();
-    private final ArrayList<Task> mPendingTaskInfoChanges = new ArrayList<>();
+    // Pending task events due to layout deferred.
+    private final ArrayList<PendingTaskEvent> mPendingTaskEvents = new ArrayList<>();
     // Set of organized tasks (by taskId) that dispatch back pressed to their organizers
     private final HashSet<Integer> mInterceptBackPressedOnRootTasks = new HashSet();
 
@@ -338,6 +364,12 @@
     public void setDeferTaskOrgCallbacksConsumer(Consumer<Runnable> consumer) {
         mDeferTaskOrgCallbacksConsumer = consumer;
     }
+
+    @VisibleForTesting
+    ArrayList<PendingTaskEvent> getPendingEventList() {
+        return mPendingTaskEvents;
+    }
+
     /**
      * Register a TaskOrganizer to manage tasks as they enter the a supported windowing mode.
      */
@@ -443,13 +475,33 @@
 
     void onTaskAppeared(ITaskOrganizer organizer, Task task) {
         final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder());
-        state.addTask(task);
+        if (state != null && state.addTask(task)) {
+            PendingTaskEvent pending = getPendingTaskEvent(task, PendingTaskEvent.EVENT_APPEARED);
+            if (pending == null) {
+                pending = new PendingTaskEvent(task, PendingTaskEvent.EVENT_APPEARED);
+                mPendingTaskEvents.add(pending);
+            }
+        }
     }
 
     void onTaskVanished(ITaskOrganizer organizer, Task task) {
         final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder());
-        if (state != null) {
-            state.removeTask(task);
+        if (state != null && state.removeTask(task)) {
+            for (int i = mPendingTaskEvents.size() - 1; i >= 0; i--) {
+                PendingTaskEvent entry = mPendingTaskEvents.get(i);
+                if (task.mTaskId == entry.mTask.mTaskId) {
+                    // This task will vanished so remove all pending event of it.
+                    mPendingTaskEvents.remove(i);
+                    if (entry.mEventType == PendingTaskEvent.EVENT_APPEARED) {
+                        // If task still not appeared, ignore this callback.
+                        return;
+                    }
+                }
+            }
+
+            PendingTaskEvent pending =
+                    new PendingTaskEvent(task, organizer, PendingTaskEvent.EVENT_VANISHED);
+            mPendingTaskEvents.add(pending);
         }
     }
 
@@ -514,30 +566,76 @@
         }
     }
 
-    void dispatchPendingTaskInfoChanges() {
-        if (mService.mWindowManager.mWindowPlacerLocked.isLayoutDeferred()) {
+    void dispatchPendingEvents() {
+        if (mService.mWindowManager.mWindowPlacerLocked.isLayoutDeferred()
+                || mPendingTaskEvents.isEmpty()) {
             return;
         }
-        for (int i = 0, n = mPendingTaskInfoChanges.size(); i < n; ++i) {
-            dispatchTaskInfoChanged(mPendingTaskInfoChanges.get(i), false /* force */);
+
+        for (int i = 0, n = mPendingTaskEvents.size(); i < n; i++) {
+            PendingTaskEvent event = mPendingTaskEvents.get(i);
+            final Task task = event.mTask;
+            final TaskOrganizerState state;
+            switch (event.mEventType) {
+                case PendingTaskEvent.EVENT_APPEARED:
+                    state = mTaskOrganizerStates.get(event.mTaskOrg.asBinder());
+                    if (state != null && task.taskAppearedReady()) {
+                        state.mOrganizer.onTaskAppeared(task);
+                    }
+                    break;
+                case PendingTaskEvent.EVENT_VANISHED:
+                    state = mTaskOrganizerStates.get(event.mTaskOrg.asBinder());
+                    if (state != null) {
+                        state.mOrganizer.onTaskVanished(task);
+                    }
+                    break;
+                case PendingTaskEvent.EVENT_INFO_CHANGED:
+                    dispatchTaskInfoChanged(event.mTask, event.mForce);
+                    break;
+                case PendingTaskEvent.EVENT_ROOT_BACK_PRESSED:
+                    state = mTaskOrganizerStates.get(event.mTaskOrg.asBinder());
+                    if (state != null) {
+                        state.mOrganizer.onBackPressedOnTaskRoot(task);
+                    }
+                    break;
+            }
         }
-        mPendingTaskInfoChanges.clear();
+        mPendingTaskEvents.clear();
     }
 
-    void dispatchTaskInfoChanged(Task task, boolean force) {
-        if (!force && mService.mWindowManager.mWindowPlacerLocked.isLayoutDeferred()) {
-            // Defer task info reporting while layout is deferred. This is because layout defer
-            // blocks tend to do lots of re-ordering which can mess up animations in receivers.
-            mPendingTaskInfoChanges.remove(task);
-            mPendingTaskInfoChanges.add(task);
+    void onTaskInfoChanged(Task task, boolean force) {
+        if (!task.mTaskAppearedSent) {
+            // Skip if task still not appeared.
             return;
         }
+
+        // Defer task info reporting while layout is deferred. This is because layout defer
+        // blocks tend to do lots of re-ordering which can mess up animations in receivers.
+        PendingTaskEvent pending = getPendingLifecycleTaskEvent(task);
+        if (pending == null) {
+            pending = new PendingTaskEvent(task, PendingTaskEvent.EVENT_INFO_CHANGED);
+        } else {
+            if (pending.mEventType != PendingTaskEvent.EVENT_INFO_CHANGED) {
+                // If queued event is appeared, it means task still not appeared so ignore
+                // this info changed. If queued event is vanished, it means task should
+                // will vanished early so do not need this info changed.
+                return;
+            }
+            // Remove and add for re-ordering.
+            mPendingTaskEvents.remove(pending);
+        }
+        pending.mForce = force;
+        mPendingTaskEvents.add(pending);
+    }
+
+    private void dispatchTaskInfoChanged(Task task, boolean force) {
         RunningTaskInfo lastInfo = mLastSentTaskInfos.get(task);
         if (mTmpTaskInfo == null) {
             mTmpTaskInfo = new RunningTaskInfo();
         }
         mTmpTaskInfo.configuration.unset();
         task.fillTaskInfo(mTmpTaskInfo);
+
         boolean changed = !mTmpTaskInfo.equalsForTaskOrganizer(lastInfo);
         if (!changed) {
             int cfgChanges = mTmpTaskInfo.configuration.diff(lastInfo.configuration);
@@ -739,11 +837,48 @@
             return false;
         }
 
-        final TaskOrganizerState state = mTaskOrganizerStates.get(task.mTaskOrganizer.asBinder());
-        state.mOrganizer.onBackPressedOnTaskRoot(task);
+        PendingTaskEvent pendingVanished =
+                getPendingTaskEvent(task, PendingTaskEvent.EVENT_VANISHED);
+        if (pendingVanished != null) {
+            // This task will vanish before this callback so just ignore.
+            return false;
+        }
+
+        PendingTaskEvent pending = getPendingTaskEvent(
+                task, PendingTaskEvent.EVENT_ROOT_BACK_PRESSED);
+        if (pending == null) {
+            pending = new PendingTaskEvent(task, PendingTaskEvent.EVENT_ROOT_BACK_PRESSED);
+        } else {
+            // Pending already exist, remove and add for re-ordering.
+            mPendingTaskEvents.remove(pending);
+        }
+        mPendingTaskEvents.add(pending);
         return true;
     }
 
+    @Nullable
+    private PendingTaskEvent getPendingTaskEvent(Task task, int type) {
+        for (int i = mPendingTaskEvents.size() - 1; i >= 0; i--) {
+            PendingTaskEvent entry = mPendingTaskEvents.get(i);
+            if (task.mTaskId == entry.mTask.mTaskId && type == entry.mEventType) {
+                return entry;
+            }
+        }
+        return null;
+    }
+
+    @VisibleForTesting
+    @Nullable
+    PendingTaskEvent getPendingLifecycleTaskEvent(Task task) {
+        for (int i = mPendingTaskEvents.size() - 1; i >= 0; i--) {
+            PendingTaskEvent entry = mPendingTaskEvents.get(i);
+            if (task.mTaskId == entry.mTask.mTaskId && entry.isLifecycleEvent()) {
+                return entry;
+            }
+        }
+        return null;
+    }
+
     public void dump(PrintWriter pw, String prefix) {
         final String innerPrefix = prefix + "  ";
         pw.print(prefix); pw.println("TaskOrganizerController:");
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 32b84a8..d310260 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -3843,7 +3843,8 @@
         if (task == null) {
             return false;
         }
-        if (!inSplitScreenWindowingMode() && !inFreeformWindowingMode()) {
+        if (!inSplitScreenWindowingMode() && !inFreeformWindowingMode()
+                && !task.getRootTask().mCreatedByOrganizer) {
             return false;
         }
         // TODO(157912944): formalize drag-resizing so that exceptions aren't hardcoded like this
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 068d0df..badfe96 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -611,12 +611,11 @@
         mDsDy = 1;
     }
 
+    private boolean isInBlastSync() {
+        return mService.useBLASTSync() && mWin.useBLASTSync();
+    }
+
     private boolean shouldConsumeMainWindowSizeTransaction() {
-        // If we use BLASTSync we always consume the transaction when finishing
-        // the sync.
-        if (mService.useBLASTSync() && mWin.useBLASTSync()) {
-            return false;
-        }
         // We only consume the transaction when the client is calling relayout
         // because this is the only time we know the frameNumber will be valid
         // due to the client renderer being paused. Put otherwise, only when
@@ -639,22 +638,6 @@
         }
 
         final WindowState w = mWin;
-        final Task task = w.getTask();
-
-        if (shouldConsumeMainWindowSizeTransaction()) {
-            // Use pending transaction here instead of the transaction passed in because we want to
-            // ensure the defer transaction is applied on the main transaction and not on the sync
-            // transaction. This is because the sync transaction could contain the buffer and we'd
-            // defer the transaction that contains the buffer we're deferring on.
-            SurfaceControl.Transaction pendingTransaction = mWin.getPendingTransaction();
-            pendingTransaction.deferTransactionUntil(
-                    task.getMainWindowSizeChangeTask().getSurfaceControl(),
-                    mWin.getClientViewRootSurface(), mWin.getFrameNumber());
-            pendingTransaction.deferTransactionUntil(mSurfaceController.mSurfaceControl,
-                    mWin.getClientViewRootSurface(), mWin.getFrameNumber());
-            pendingTransaction.merge(task.getMainWindowSizeChangeTransaction());
-            task.setMainWindowSizeChangeTransaction(null);
-        }
 
         if (!w.mSeamlesslyRotated) {
             // Used to offset the WSA when stack position changes before a resize.
@@ -673,6 +656,30 @@
                 setWallpaperPositionAndScale(t, xOffset, yOffset, mWallpaperScale);
             }
         }
+
+        final Task task = w.getTask();
+        if (shouldConsumeMainWindowSizeTransaction()) {
+            if (isInBlastSync()) {
+                // If we're in a sync transaction, there's no need to call defer transaction.
+                // The sync transaction will contain the buffer so the bounds change transaction
+                // will only be applied with the buffer.
+                t.merge(task.getMainWindowSizeChangeTransaction());
+            } else {
+                // Use pending transaction here instead of the transaction passed in because we
+                // want to ensure the defer transaction is applied on the main transaction and
+                // not on the sync  transaction. This is because the sync transaction could
+                // contain the buffer and we'd defer the transaction that contains the buffer
+                // we're deferring on.
+                SurfaceControl.Transaction pendingTransaction = mWin.getPendingTransaction();
+                pendingTransaction.deferTransactionUntil(
+                        task.getMainWindowSizeChangeTask().getSurfaceControl(),
+                        mWin.getClientViewRootSurface(), mWin.getFrameNumber());
+                pendingTransaction.deferTransactionUntil(mSurfaceController.mSurfaceControl,
+                        mWin.getClientViewRootSurface(), mWin.getFrameNumber());
+                pendingTransaction.merge(task.getMainWindowSizeChangeTransaction());
+            }
+            task.setMainWindowSizeChangeTransaction(null);
+        }
     }
 
     void prepareSurfaceLocked(SurfaceControl.Transaction t) {
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index 34875ed..9e0fee39 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -827,15 +827,15 @@
      * system bars, or in other words extend outside of the "Decor Frame"
      */
     boolean canLayerAboveSystemBars() {
-        int layer = mWmService.mPolicy.getWindowLayerFromTypeLw(windowType,
-                mOwnerCanManageAppTokens);
+        int layer = getWindowLayerFromType();
         int navLayer = mWmService.mPolicy.getWindowLayerFromTypeLw(TYPE_NAVIGATION_BAR,
                 mOwnerCanManageAppTokens);
         return mOwnerCanManageAppTokens && (layer > navLayer);
     }
 
     int getWindowLayerFromType() {
-        return mWmService.mPolicy.getWindowLayerFromTypeLw(windowType, mOwnerCanManageAppTokens);
+        return mWmService.mPolicy.getWindowLayerFromTypeLw(windowType, mOwnerCanManageAppTokens,
+                mRoundedCornerOverlay);
     }
 
     int getOwnerUid() {
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 404b182..27634bf 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -240,8 +240,8 @@
     void reloadCalibration();
     void setPointerIconType(int32_t iconId);
     void reloadPointerIcons();
+    void requestPointerCapture(const sp<IBinder>& windowToken, bool enabled);
     void setCustomPointerIcon(const SpriteIcon& icon);
-    void setPointerCapture(bool enabled);
     void setMotionClassifierEnabled(bool enabled);
 
     /* --- InputReaderPolicyInterface implementation --- */
@@ -280,6 +280,7 @@
     void pokeUserActivity(nsecs_t eventTime, int32_t eventType) override;
     bool checkInjectEventsPermissionNonReentrant(int32_t injectorPid, int32_t injectorUid) override;
     void onPointerDownOutsideFocus(const sp<IBinder>& touchedToken) override;
+    void setPointerCapture(bool enabled) override;
 
     /* --- PointerControllerPolicyInterface implementation --- */
 
@@ -930,20 +931,8 @@
             InputReaderConfiguration::CHANGE_SHOW_TOUCHES);
 }
 
-void NativeInputManager::setPointerCapture(bool enabled) {
-    { // acquire lock
-        AutoMutex _l(mLock);
-
-        if (mLocked.pointerCapture == enabled) {
-            return;
-        }
-
-        ALOGI("Setting pointer capture to %s.", enabled ? "enabled" : "disabled");
-        mLocked.pointerCapture = enabled;
-    } // release lock
-
-    mInputManager->getReader()->requestRefreshConfiguration(
-            InputReaderConfiguration::CHANGE_POINTER_CAPTURE);
+void NativeInputManager::requestPointerCapture(const sp<IBinder>& windowToken, bool enabled) {
+    mInputManager->getDispatcher()->requestPointerCapture(windowToken, enabled);
 }
 
 void NativeInputManager::setInteractive(bool interactive) {
@@ -1215,7 +1204,6 @@
     android_server_PowerManagerService_userActivity(eventTime, eventType);
 }
 
-
 bool NativeInputManager::checkInjectEventsPermissionNonReentrant(
         int32_t injectorPid, int32_t injectorUid) {
     ATRACE_CALL();
@@ -1238,6 +1226,22 @@
     checkAndClearExceptionFromCallback(env, "onPointerDownOutsideFocus");
 }
 
+void NativeInputManager::setPointerCapture(bool enabled) {
+    { // acquire lock
+        AutoMutex _l(mLock);
+
+        if (mLocked.pointerCapture == enabled) {
+            return;
+        }
+
+        ALOGV("%s pointer capture.", enabled ? "Enabling" : "Disabling");
+        mLocked.pointerCapture = enabled;
+    } // release lock
+
+    mInputManager->getReader()->requestRefreshConfiguration(
+            InputReaderConfiguration::CHANGE_POINTER_CAPTURE);
+}
+
 void NativeInputManager::loadPointerIcon(SpriteIcon* icon, int32_t displayId) {
     ATRACE_CALL();
     JNIEnv* env = jniEnv();
@@ -1631,11 +1635,12 @@
     im->setFocusedDisplay(env, displayId);
 }
 
-static void nativeSetPointerCapture(JNIEnv* env, jclass /* clazz */, jlong ptr,
-        jboolean enabled) {
+static void nativeRequestPointerCapture(JNIEnv* env, jclass /* clazz */, jlong ptr,
+                                        jobject tokenObj, jboolean enabled) {
     NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
+    sp<IBinder> windowToken = ibinderForJavaObject(env, tokenObj);
 
-    im->setPointerCapture(enabled);
+    im->requestPointerCapture(windowToken, enabled);
 }
 
 static void nativeSetInputDispatchMode(JNIEnv* /* env */,
@@ -1941,7 +1946,8 @@
         {"nativeSetFocusedApplication", "(JILandroid/view/InputApplicationHandle;)V",
          (void*)nativeSetFocusedApplication},
         {"nativeSetFocusedDisplay", "(JI)V", (void*)nativeSetFocusedDisplay},
-        {"nativeSetPointerCapture", "(JZ)V", (void*)nativeSetPointerCapture},
+        {"nativeRequestPointerCapture", "(JLandroid/os/IBinder;Z)V",
+         (void*)nativeRequestPointerCapture},
         {"nativeSetInputDispatchMode", "(JZZ)V", (void*)nativeSetInputDispatchMode},
         {"nativeSetSystemUiLightsOut", "(JZ)V", (void*)nativeSetSystemUiLightsOut},
         {"nativeTransferTouchFocus", "(JLandroid/os/IBinder;Landroid/os/IBinder;)Z",
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index 0ec8b3a..066dbce 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -31,6 +31,7 @@
 #include <android/hardware/gnss/2.1/IGnssMeasurement.h>
 #include <android/hardware/gnss/3.0/IGnssPsds.h>
 #include <android/hardware/gnss/BnGnss.h>
+#include <android/hardware/gnss/BnGnssMeasurementCallback.h>
 #include <android/hardware/gnss/BnGnssPowerIndicationCallback.h>
 #include <android/hardware/gnss/BnGnssPsdsCallback.h>
 #include <android/hardware/gnss/measurement_corrections/1.0/IMeasurementCorrections.h>
@@ -1754,7 +1755,15 @@
     // 1.1@IGnss can be paired {1.0, 1.1}@IGnssMeasurement
     // 1.0@IGnss is paired with 1.0@IGnssMeasurement
     gnssMeasurementIface = nullptr;
-    if (gnssHal_V2_1 != nullptr) {
+    if (gnssHalAidl != nullptr) {
+        sp<hardware::gnss::IGnssMeasurementInterface> gnssMeasurement;
+        auto status = gnssHalAidl->getExtensionGnssMeasurement(&gnssMeasurement);
+        if (checkAidlStatus(status, "Unable to get a handle to GnssMeasurement AIDL interface.")) {
+            gnssMeasurementIface =
+                    std::make_unique<android::gnss::GnssMeasurement>(gnssMeasurement);
+        }
+    }
+    if (gnssHal_V2_1 != nullptr && gnssMeasurementIface == nullptr) {
         auto gnssMeasurement = gnssHal_V2_1->getExtensionGnssMeasurement_2_1();
         if (checkHidlReturn(gnssMeasurement, "Unable to get a handle to GnssMeasurement_V2_1")) {
             gnssMeasurementIface =
@@ -2696,7 +2705,8 @@
         return JNI_FALSE;
     }
 
-    return gnssMeasurementIface->setCallback(sp<gnss::GnssMeasurementCallback>::make(mCallbacksObj),
+    return gnssMeasurementIface->setCallback(std::make_unique<gnss::GnssMeasurementCallback>(
+                                                     mCallbacksObj),
                                              enableFullTracking);
 }
 
diff --git a/services/core/jni/gnss/GnssMeasurement.cpp b/services/core/jni/gnss/GnssMeasurement.cpp
index efa8ce74..2261c38 100644
--- a/services/core/jni/gnss/GnssMeasurement.cpp
+++ b/services/core/jni/gnss/GnssMeasurement.cpp
@@ -23,6 +23,7 @@
 using android::hardware::hidl_vec;
 using android::hardware::Return;
 
+using IGnssMeasurementInterface = android::hardware::gnss::IGnssMeasurementInterface;
 using IGnssMeasurement_V1_0 = android::hardware::gnss::V1_0::IGnssMeasurement;
 using IGnssMeasurement_V1_1 = android::hardware::gnss::V1_1::IGnssMeasurement;
 using IGnssMeasurement_V2_0 = android::hardware::gnss::V2_0::IGnssMeasurement;
@@ -43,17 +44,33 @@
 
 namespace android::gnss {
 
+// Implementation of GnssMeasurement
+
+GnssMeasurement::GnssMeasurement(const sp<IGnssMeasurementInterface>& iGnssMeasurement)
+      : mIGnssMeasurement(iGnssMeasurement) {}
+
+jboolean GnssMeasurement::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
+                                      bool enableFullTracking) {
+    auto status = mIGnssMeasurement->setCallback(callback->getAidl(), enableFullTracking);
+    return checkAidlStatus(status, "IGnssMeasurement setCallback() failed.");
+}
+
+jboolean GnssMeasurement::close() {
+    auto status = mIGnssMeasurement->close();
+    return checkAidlStatus(status, "IGnssMeasurement close() failed.");
+}
+
 // Implementation of GnssMeasurement_V1_0
 
 GnssMeasurement_V1_0::GnssMeasurement_V1_0(const sp<IGnssMeasurement_V1_0>& iGnssMeasurement)
       : mIGnssMeasurement_V1_0(iGnssMeasurement) {}
 
-jboolean GnssMeasurement_V1_0::setCallback(const sp<GnssMeasurementCallback>& callback,
+jboolean GnssMeasurement_V1_0::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                                            bool enableFullTracking) {
     if (enableFullTracking == true) {
         ALOGW("Full tracking is mode not supported in 1.0 GNSS HAL.");
     }
-    auto status = mIGnssMeasurement_V1_0->setCallback(callback);
+    auto status = mIGnssMeasurement_V1_0->setCallback(callback->getHidl());
     if (!checkHidlReturn(status, "IGnssMeasurement setCallback() failed.")) {
         return JNI_FALSE;
     }
@@ -71,9 +88,9 @@
 GnssMeasurement_V1_1::GnssMeasurement_V1_1(const sp<IGnssMeasurement_V1_1>& iGnssMeasurement)
       : GnssMeasurement_V1_0{iGnssMeasurement}, mIGnssMeasurement_V1_1(iGnssMeasurement) {}
 
-jboolean GnssMeasurement_V1_1::setCallback(const sp<GnssMeasurementCallback>& callback,
+jboolean GnssMeasurement_V1_1::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                                            bool enableFullTracking) {
-    auto status = mIGnssMeasurement_V1_1->setCallback_1_1(callback, enableFullTracking);
+    auto status = mIGnssMeasurement_V1_1->setCallback_1_1(callback->getHidl(), enableFullTracking);
     if (!checkHidlReturn(status, "IGnssMeasurement setCallback_V1_1() failed.")) {
         return JNI_FALSE;
     }
@@ -86,9 +103,9 @@
 GnssMeasurement_V2_0::GnssMeasurement_V2_0(const sp<IGnssMeasurement_V2_0>& iGnssMeasurement)
       : GnssMeasurement_V1_1{iGnssMeasurement}, mIGnssMeasurement_V2_0(iGnssMeasurement) {}
 
-jboolean GnssMeasurement_V2_0::setCallback(const sp<GnssMeasurementCallback>& callback,
+jboolean GnssMeasurement_V2_0::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                                            bool enableFullTracking) {
-    auto status = mIGnssMeasurement_V2_0->setCallback_2_0(callback, enableFullTracking);
+    auto status = mIGnssMeasurement_V2_0->setCallback_2_0(callback->getHidl(), enableFullTracking);
     if (!checkHidlReturn(status, "IGnssMeasurement setCallback_2_0() failed.")) {
         return JNI_FALSE;
     }
@@ -101,9 +118,9 @@
 GnssMeasurement_V2_1::GnssMeasurement_V2_1(const sp<IGnssMeasurement_V2_1>& iGnssMeasurement)
       : GnssMeasurement_V2_0{iGnssMeasurement}, mIGnssMeasurement_V2_1(iGnssMeasurement) {}
 
-jboolean GnssMeasurement_V2_1::setCallback(const sp<GnssMeasurementCallback>& callback,
+jboolean GnssMeasurement_V2_1::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                                            bool enableFullTracking) {
-    auto status = mIGnssMeasurement_V2_1->setCallback_2_1(callback, enableFullTracking);
+    auto status = mIGnssMeasurement_V2_1->setCallback_2_1(callback->getHidl(), enableFullTracking);
     if (!checkHidlReturn(status, "IGnssMeasurement setCallback_2_1() failed.")) {
         return JNI_FALSE;
     }
diff --git a/services/core/jni/gnss/GnssMeasurement.h b/services/core/jni/gnss/GnssMeasurement.h
index 0e41abb..e64336f 100644
--- a/services/core/jni/gnss/GnssMeasurement.h
+++ b/services/core/jni/gnss/GnssMeasurement.h
@@ -27,6 +27,7 @@
 #include <android/hardware/gnss/1.1/IGnssMeasurement.h>
 #include <android/hardware/gnss/2.0/IGnssMeasurement.h>
 #include <android/hardware/gnss/2.1/IGnssMeasurement.h>
+#include <android/hardware/gnss/BnGnssMeasurementInterface.h>
 #include <log/log.h>
 #include "GnssMeasurementCallback.h"
 #include "jni.h"
@@ -36,16 +37,27 @@
 class GnssMeasurementInterface {
 public:
     virtual ~GnssMeasurementInterface() {}
-    virtual jboolean setCallback(const sp<GnssMeasurementCallback>& callback,
+    virtual jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                                  bool enableFullTracking) = 0;
     virtual jboolean close() = 0;
 };
 
+class GnssMeasurement : public GnssMeasurementInterface {
+public:
+    GnssMeasurement(const sp<android::hardware::gnss::IGnssMeasurementInterface>& iGnssMeasurement);
+    jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
+                         bool enableFullTracking) override;
+    jboolean close() override;
+
+private:
+    const sp<android::hardware::gnss::IGnssMeasurementInterface> mIGnssMeasurement;
+};
+
 class GnssMeasurement_V1_0 : public GnssMeasurementInterface {
 public:
     GnssMeasurement_V1_0(
             const sp<android::hardware::gnss::V1_0::IGnssMeasurement>& iGnssMeasurement);
-    jboolean setCallback(const sp<GnssMeasurementCallback>& callback,
+    jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                          bool enableFullTracking) override;
     jboolean close() override;
 
@@ -57,7 +69,7 @@
 public:
     GnssMeasurement_V1_1(
             const sp<android::hardware::gnss::V1_1::IGnssMeasurement>& iGnssMeasurement);
-    jboolean setCallback(const sp<GnssMeasurementCallback>& callback,
+    jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                          bool enableFullTracking) override;
 
 private:
@@ -68,7 +80,7 @@
 public:
     GnssMeasurement_V2_0(
             const sp<android::hardware::gnss::V2_0::IGnssMeasurement>& iGnssMeasurement);
-    jboolean setCallback(const sp<GnssMeasurementCallback>& callback,
+    jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                          bool enableFullTracking) override;
 
 private:
@@ -79,7 +91,7 @@
 public:
     GnssMeasurement_V2_1(
             const sp<android::hardware::gnss::V2_1::IGnssMeasurement>& iGnssMeasurement);
-    jboolean setCallback(const sp<GnssMeasurementCallback>& callback,
+    jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                          bool enableFullTracking) override;
 
 private:
diff --git a/services/core/jni/gnss/GnssMeasurementCallback.cpp b/services/core/jni/gnss/GnssMeasurementCallback.cpp
index 9f1826c..bb020f3 100644
--- a/services/core/jni/gnss/GnssMeasurementCallback.cpp
+++ b/services/core/jni/gnss/GnssMeasurementCallback.cpp
@@ -20,6 +20,12 @@
 
 namespace android::gnss {
 
+using binder::Status;
+using hardware::gnss::ElapsedRealtime;
+using hardware::gnss::GnssClock;
+using hardware::gnss::GnssData;
+using hardware::gnss::GnssMeasurement;
+
 jclass class_gnssMeasurementsEvent;
 jclass class_gnssMeasurement;
 jclass class_gnssClock;
@@ -47,174 +53,98 @@
     method_gnssClockCtor = env->GetMethodID(class_gnssClock, "<init>", "()V");
 }
 
-hardware::Return<void> GnssMeasurementCallback::gnssMeasurementCb_2_1(
-        const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssData& data) {
-    translateAndSetGnssData(data);
-    return hardware::Void();
+void setMeasurementData(JNIEnv* env, jobject& callbacksObj, jobject clock,
+                        jobjectArray measurementArray) {
+    jobject gnssMeasurementsEvent =
+            env->NewObject(class_gnssMeasurementsEvent, method_gnssMeasurementsEventCtor, clock,
+                           measurementArray);
+
+    env->CallVoidMethod(callbacksObj, method_reportMeasurementData, gnssMeasurementsEvent);
+    checkAndClearExceptionFromCallback(env, __FUNCTION__);
+    env->DeleteLocalRef(gnssMeasurementsEvent);
 }
 
-hardware::Return<void> GnssMeasurementCallback::gnssMeasurementCb_2_0(
-        const hardware::gnss::V2_0::IGnssMeasurementCallback::GnssData& data) {
-    translateAndSetGnssData(data);
-    return hardware::Void();
-}
+template <class T_Measurement, class T_Flags>
+void setMeasurementFields_V1_0(const T_Measurement& measurement, JavaObject& object) {
+    uint32_t flags = static_cast<uint32_t>(measurement.flags);
 
-hardware::Return<void> GnssMeasurementCallback::gnssMeasurementCb(
-        const hardware::gnss::V1_1::IGnssMeasurementCallback::GnssData& data) {
-    translateAndSetGnssData(data);
-    return hardware::Void();
-}
-
-hardware::Return<void> GnssMeasurementCallback::GnssMeasurementCb(
-        const hardware::gnss::V1_0::IGnssMeasurementCallback::GnssData& data) {
-    translateAndSetGnssData(data);
-    return hardware::Void();
-}
-
-template <>
-size_t GnssMeasurementCallback::getMeasurementCount<
-        hardware::gnss::V1_0::IGnssMeasurementCallback::GnssData>(
-        const hardware::gnss::V1_0::IGnssMeasurementCallback::GnssData& data) {
-    return data.measurementCount;
-}
-
-// Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
-template <>
-void GnssMeasurementCallback::translateSingleGnssMeasurement<
-        hardware::gnss::V1_0::IGnssMeasurementCallback::GnssMeasurement>(
-        const hardware::gnss::V1_0::IGnssMeasurementCallback::GnssMeasurement* measurement,
-        JavaObject& object) {
-    uint32_t flags = static_cast<uint32_t>(measurement->flags);
-
-    SET(Svid, static_cast<int32_t>(measurement->svid));
-    SET(ConstellationType, static_cast<int32_t>(measurement->constellation));
-    SET(TimeOffsetNanos, measurement->timeOffsetNs);
-    SET(State, static_cast<int32_t>(measurement->state));
-    SET(ReceivedSvTimeNanos, measurement->receivedSvTimeInNs);
-    SET(ReceivedSvTimeUncertaintyNanos, measurement->receivedSvTimeUncertaintyInNs);
-    SET(Cn0DbHz, measurement->cN0DbHz);
-    SET(PseudorangeRateMetersPerSecond, measurement->pseudorangeRateMps);
-    SET(PseudorangeRateUncertaintyMetersPerSecond, measurement->pseudorangeRateUncertaintyMps);
+    SET(Svid, static_cast<int32_t>(measurement.svid));
+    SET(TimeOffsetNanos, measurement.timeOffsetNs);
+    SET(State, static_cast<int32_t>(measurement.state));
+    SET(ReceivedSvTimeNanos, measurement.receivedSvTimeInNs);
+    SET(ReceivedSvTimeUncertaintyNanos, measurement.receivedSvTimeUncertaintyInNs);
+    SET(PseudorangeRateMetersPerSecond, measurement.pseudorangeRateMps);
+    SET(PseudorangeRateUncertaintyMetersPerSecond, measurement.pseudorangeRateUncertaintyMps);
     SET(AccumulatedDeltaRangeState,
-        (static_cast<int32_t>(measurement->accumulatedDeltaRangeState) &
+        (static_cast<int32_t>(measurement.accumulatedDeltaRangeState) &
          ~ADR_STATE_HALF_CYCLE_REPORTED)); // Half Cycle state not reported from Hardware in V1_0
-    SET(AccumulatedDeltaRangeMeters, measurement->accumulatedDeltaRangeM);
-    SET(AccumulatedDeltaRangeUncertaintyMeters, measurement->accumulatedDeltaRangeUncertaintyM);
-
-    if (flags & static_cast<uint32_t>(GnssMeasurementFlags::HAS_CARRIER_FREQUENCY)) {
-        SET(CarrierFrequencyHz, measurement->carrierFrequencyHz);
-    }
+    SET(AccumulatedDeltaRangeMeters, measurement.accumulatedDeltaRangeM);
+    SET(AccumulatedDeltaRangeUncertaintyMeters, measurement.accumulatedDeltaRangeUncertaintyM);
 
     // Intentionally not copying deprecated fields of carrierCycles,
     // carrierPhase, carrierPhaseUncertainty
 
-    SET(MultipathIndicator, static_cast<int32_t>(measurement->multipathIndicator));
+    SET(MultipathIndicator, static_cast<int32_t>(measurement.multipathIndicator));
 
-    if (flags & static_cast<uint32_t>(GnssMeasurementFlags::HAS_SNR)) {
-        SET(SnrInDb, measurement->snrDb);
+    if (flags & static_cast<uint32_t>(T_Flags::HAS_SNR)) {
+        SET(SnrInDb, measurement.snrDb);
     }
 
-    if (flags & static_cast<uint32_t>(GnssMeasurementFlags::HAS_AUTOMATIC_GAIN_CONTROL)) {
-        SET(AutomaticGainControlLevelInDb, measurement->agcLevelDb);
+    if (flags & static_cast<uint32_t>(T_Flags::HAS_AUTOMATIC_GAIN_CONTROL)) {
+        SET(AutomaticGainControlLevelInDb, measurement.agcLevelDb);
     }
 }
 
-// Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
-template <>
-void GnssMeasurementCallback::translateSingleGnssMeasurement<
-        hardware::gnss::V1_1::IGnssMeasurementCallback::GnssMeasurement>(
-        const hardware::gnss::V1_1::IGnssMeasurementCallback::GnssMeasurement* measurement_V1_1,
-        JavaObject& object) {
-    translateSingleGnssMeasurement(&(measurement_V1_1->v1_0), object);
+template <class T_Measurement, class T_Flags>
+void setMeasurementFields_V2_1(const T_Measurement& measurement, JavaObject& object) {
+    SET(BasebandCn0DbHz, measurement.basebandCN0DbHz);
 
-    // Set the V1_1 flag, and mark that new field has valid information for Java Layer
-    SET(AccumulatedDeltaRangeState,
-        (static_cast<int32_t>(measurement_V1_1->accumulatedDeltaRangeState) |
-         ADR_STATE_HALF_CYCLE_REPORTED));
-}
-
-// Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
-template <>
-void GnssMeasurementCallback::translateSingleGnssMeasurement<
-        hardware::gnss::V2_0::IGnssMeasurementCallback::GnssMeasurement>(
-        const hardware::gnss::V2_0::IGnssMeasurementCallback::GnssMeasurement* measurement_V2_0,
-        JavaObject& object) {
-    JNIEnv* env = getJniEnv();
-    translateSingleGnssMeasurement(&(measurement_V2_0->v1_1), object);
-
-    jstring codeType = env->NewStringUTF(measurement_V2_0->codeType.c_str());
-    SET(CodeType, codeType);
-
-    // Overwrite with v2_0.state since v2_0->v1_1->v1_0.state is deprecated.
-    SET(State, static_cast<int32_t>(measurement_V2_0->state));
-
-    // Overwrite with v2_0.constellation since v2_0->v1_1->v1_0.constellation is deprecated.
-    SET(ConstellationType, static_cast<int32_t>(measurement_V2_0->constellation));
-
-    if (codeType) {
-        env->DeleteLocalRef(codeType);
-    }
-}
-
-// Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
-template <>
-void GnssMeasurementCallback::translateSingleGnssMeasurement<
-        hardware::gnss::V2_1::IGnssMeasurementCallback::GnssMeasurement>(
-        const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssMeasurement* measurement_V2_1,
-        JavaObject& object) {
-    translateSingleGnssMeasurement(&(measurement_V2_1->v2_0), object);
-
-    SET(BasebandCn0DbHz, measurement_V2_1->basebandCN0DbHz);
-
-    if (measurement_V2_1->flags & GnssMeasurementFlags::HAS_FULL_ISB) {
-        SET(FullInterSignalBiasNanos, measurement_V2_1->fullInterSignalBiasNs);
+    if (measurement.flags & T_Flags::HAS_FULL_ISB) {
+        SET(FullInterSignalBiasNanos, measurement.fullInterSignalBiasNs);
     }
 
-    if (measurement_V2_1->flags & GnssMeasurementFlags::HAS_FULL_ISB_UNCERTAINTY) {
-        SET(FullInterSignalBiasUncertaintyNanos,
-            measurement_V2_1->fullInterSignalBiasUncertaintyNs);
+    if (measurement.flags & T_Flags::HAS_FULL_ISB_UNCERTAINTY) {
+        SET(FullInterSignalBiasUncertaintyNanos, measurement.fullInterSignalBiasUncertaintyNs);
     }
 
-    if (measurement_V2_1->flags & GnssMeasurementFlags::HAS_SATELLITE_ISB) {
-        SET(SatelliteInterSignalBiasNanos, measurement_V2_1->satelliteInterSignalBiasNs);
+    if (measurement.flags & T_Flags::HAS_SATELLITE_ISB) {
+        SET(SatelliteInterSignalBiasNanos, measurement.satelliteInterSignalBiasNs);
     }
 
-    if (measurement_V2_1->flags & GnssMeasurementFlags::HAS_SATELLITE_ISB_UNCERTAINTY) {
+    if (measurement.flags & T_Flags::HAS_SATELLITE_ISB_UNCERTAINTY) {
         SET(SatelliteInterSignalBiasUncertaintyNanos,
-            measurement_V2_1->satelliteInterSignalBiasUncertaintyNs);
+            measurement.satelliteInterSignalBiasUncertaintyNs);
     }
 }
 
-template <>
-void GnssMeasurementCallback::translateGnssClock(
-        JavaObject& object,
-        const hardware::gnss::V1_0::IGnssMeasurementCallback::GnssClock& clock) {
+template <class T_Clock, class T_Flags>
+void setClockFields_V1_0(const T_Clock& clock, JavaObject& object) {
     uint32_t flags = static_cast<uint32_t>(clock.gnssClockFlags);
-    if (flags & static_cast<uint32_t>(GnssClockFlags::HAS_LEAP_SECOND)) {
+    if (flags & static_cast<uint32_t>(T_Flags::HAS_LEAP_SECOND)) {
         SET(LeapSecond, static_cast<int32_t>(clock.leapSecond));
     }
 
-    if (flags & static_cast<uint32_t>(GnssClockFlags::HAS_TIME_UNCERTAINTY)) {
+    if (flags & static_cast<uint32_t>(T_Flags::HAS_TIME_UNCERTAINTY)) {
         SET(TimeUncertaintyNanos, clock.timeUncertaintyNs);
     }
 
-    if (flags & static_cast<uint32_t>(GnssClockFlags::HAS_FULL_BIAS)) {
+    if (flags & static_cast<uint32_t>(T_Flags::HAS_FULL_BIAS)) {
         SET(FullBiasNanos, clock.fullBiasNs);
     }
 
-    if (flags & static_cast<uint32_t>(GnssClockFlags::HAS_BIAS)) {
+    if (flags & static_cast<uint32_t>(T_Flags::HAS_BIAS)) {
         SET(BiasNanos, clock.biasNs);
     }
 
-    if (flags & static_cast<uint32_t>(GnssClockFlags::HAS_BIAS_UNCERTAINTY)) {
+    if (flags & static_cast<uint32_t>(T_Flags::HAS_BIAS_UNCERTAINTY)) {
         SET(BiasUncertaintyNanos, clock.biasUncertaintyNs);
     }
 
-    if (flags & static_cast<uint32_t>(GnssClockFlags::HAS_DRIFT)) {
+    if (flags & static_cast<uint32_t>(T_Flags::HAS_DRIFT)) {
         SET(DriftNanosPerSecond, clock.driftNsps);
     }
 
-    if (flags & static_cast<uint32_t>(GnssClockFlags::HAS_DRIFT_UNCERTAINTY)) {
+    if (flags & static_cast<uint32_t>(T_Flags::HAS_DRIFT_UNCERTAINTY)) {
         SET(DriftUncertaintyNanosPerSecond, clock.driftUncertaintyNsps);
     }
 
@@ -222,10 +152,8 @@
     SET(HardwareClockDiscontinuityCount, clock.hwClockDiscontinuityCount);
 }
 
-template <>
-void GnssMeasurementCallback::translateGnssClock(
-        JavaObject& object,
-        const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssClock& clock) {
+template <class T_Clock, class T_Flags>
+void setClockFields_V2_1(const T_Clock& clock, JavaObject& object) {
     JNIEnv* env = getJniEnv();
     SET(ReferenceConstellationTypeForIsb,
         static_cast<int32_t>(clock.referenceSignalTypeForIsb.constellation));
@@ -234,17 +162,216 @@
     jstring referenceCodeTypeForIsb =
             env->NewStringUTF(clock.referenceSignalTypeForIsb.codeType.c_str());
     SET(ReferenceCodeTypeForIsb, referenceCodeTypeForIsb);
+    env->DeleteLocalRef(referenceCodeTypeForIsb);
+}
 
-    translateGnssClock(object, clock.v1_0);
-
-    if (referenceCodeTypeForIsb) {
-        env->DeleteLocalRef(referenceCodeTypeForIsb);
+template <class T_ElapsedRealtime, class T_Flags>
+void setElapsedRealtimeFields(const T_ElapsedRealtime& elapsedRealtime, JavaObject& object) {
+    uint32_t flags = static_cast<uint32_t>(elapsedRealtime.flags);
+    if (flags & T_Flags::HAS_TIMESTAMP_NS) {
+        SET(ElapsedRealtimeNanos, static_cast<uint64_t>(elapsedRealtime.timestampNs));
+    }
+    if (flags & T_Flags::HAS_TIME_UNCERTAINTY_NS) {
+        SET(ElapsedRealtimeUncertaintyNanos,
+            static_cast<double>(elapsedRealtime.timeUncertaintyNs));
     }
 }
 
+// Implementation of GnssMeasurementCallbackAidl class.
+
+Status GnssMeasurementCallbackAidl::gnssMeasurementCb(const GnssData& data) {
+    ALOGD("%s", __func__);
+    translateAndSetGnssData(data);
+    return Status::ok();
+}
+
+void GnssMeasurementCallbackAidl::translateAndSetGnssData(const GnssData& data) {
+    JNIEnv* env = getJniEnv();
+
+    JavaObject gnssClockJavaObject(env, class_gnssClock, method_gnssClockCtor);
+    translateGnssClock(env, data, gnssClockJavaObject);
+    jobject clock = gnssClockJavaObject.get();
+
+    jobjectArray measurementArray = translateAllGnssMeasurements(env, data.measurements);
+    setMeasurementData(env, mCallbacksObj, clock, measurementArray);
+
+    env->DeleteLocalRef(clock);
+    env->DeleteLocalRef(measurementArray);
+}
+
+void GnssMeasurementCallbackAidl::translateSingleGnssMeasurement(JNIEnv* env,
+                                                                 const GnssMeasurement& measurement,
+                                                                 JavaObject& object) {
+    setMeasurementFields_V1_0<GnssMeasurement, GnssMeasurement>(measurement, object);
+    setMeasurementFields_V2_1<GnssMeasurement, GnssMeasurement>(measurement, object);
+
+    SET(Cn0DbHz, measurement.antennaCN0DbHz);
+    SET(ConstellationType, static_cast<int32_t>(measurement.signalType.constellation));
+
+    if (measurement.flags & static_cast<uint32_t>(GnssMeasurement::HAS_CARRIER_FREQUENCY)) {
+        SET(CarrierFrequencyHz, static_cast<float>(measurement.signalType.carrierFrequencyHz));
+    }
+
+    jstring codeType = env->NewStringUTF(measurement.signalType.codeType.c_str());
+    SET(CodeType, codeType);
+    env->DeleteLocalRef(codeType);
+}
+
+jobjectArray GnssMeasurementCallbackAidl::translateAllGnssMeasurements(
+        JNIEnv* env, const std::vector<GnssMeasurement>& measurements) {
+    if (measurements.size() == 0) {
+        return nullptr;
+    }
+
+    jobjectArray gnssMeasurementArray =
+            env->NewObjectArray(measurements.size(), class_gnssMeasurement,
+                                nullptr /* initialElement */);
+
+    for (uint16_t i = 0; i < measurements.size(); ++i) {
+        JavaObject object(env, class_gnssMeasurement, method_gnssMeasurementCtor);
+        translateSingleGnssMeasurement(env, measurements[i], object);
+        jobject gnssMeasurement = object.get();
+        env->SetObjectArrayElement(gnssMeasurementArray, i, gnssMeasurement);
+        env->DeleteLocalRef(gnssMeasurement);
+    }
+
+    return gnssMeasurementArray;
+}
+
+void GnssMeasurementCallbackAidl::translateGnssClock(JNIEnv* env, const GnssData& data,
+                                                     JavaObject& object) {
+    setElapsedRealtimeFields<ElapsedRealtime, ElapsedRealtime>(data.elapsedRealtime, object);
+    setClockFields_V1_0<GnssClock, GnssClock>(data.clock, object);
+    setClockFields_V2_1<GnssClock, GnssClock>(data.clock, object);
+}
+
+// Implementation of GnssMeasurementCallbackHidl class.
+
+hardware::Return<void> GnssMeasurementCallbackHidl::gnssMeasurementCb_2_1(
+        const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssData& data) {
+    translateAndSetGnssData(data);
+    return hardware::Void();
+}
+
+hardware::Return<void> GnssMeasurementCallbackHidl::gnssMeasurementCb_2_0(
+        const hardware::gnss::V2_0::IGnssMeasurementCallback::GnssData& data) {
+    translateAndSetGnssData(data);
+    return hardware::Void();
+}
+
+hardware::Return<void> GnssMeasurementCallbackHidl::gnssMeasurementCb(
+        const hardware::gnss::V1_1::IGnssMeasurementCallback::GnssData& data) {
+    translateAndSetGnssData(data);
+    return hardware::Void();
+}
+
+hardware::Return<void> GnssMeasurementCallbackHidl::GnssMeasurementCb(
+        const hardware::gnss::V1_0::IGnssMeasurementCallback::GnssData& data) {
+    translateAndSetGnssData(data);
+    return hardware::Void();
+}
+
 template <>
-void GnssMeasurementCallback::translateGnssClock(
-        JavaObject& object, const hardware::gnss::V2_0::IGnssMeasurementCallback::GnssData& data) {
+size_t GnssMeasurementCallbackHidl::getMeasurementCount<
+        hardware::gnss::V1_0::IGnssMeasurementCallback::GnssData>(
+        const hardware::gnss::V1_0::IGnssMeasurementCallback::GnssData& data) {
+    return data.measurementCount;
+}
+
+// Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
+template <>
+void GnssMeasurementCallbackHidl::translateSingleGnssMeasurement<
+        hardware::gnss::V1_0::IGnssMeasurementCallback::GnssMeasurement>(
+        const hardware::gnss::V1_0::IGnssMeasurementCallback::GnssMeasurement& measurement,
+        JavaObject& object) {
+    setMeasurementFields_V1_0<hardware::gnss::V1_0::IGnssMeasurementCallback::GnssMeasurement,
+                              GnssMeasurementFlags>(measurement, object);
+
+    SET(ConstellationType, static_cast<int32_t>(measurement.constellation));
+    SET(Cn0DbHz, measurement.cN0DbHz);
+    if (measurement.flags & static_cast<uint32_t>(GnssMeasurementFlags::HAS_CARRIER_FREQUENCY)) {
+        SET(CarrierFrequencyHz, measurement.carrierFrequencyHz);
+    }
+}
+
+// Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
+template <>
+void GnssMeasurementCallbackHidl::translateSingleGnssMeasurement<
+        hardware::gnss::V1_1::IGnssMeasurementCallback::GnssMeasurement>(
+        const hardware::gnss::V1_1::IGnssMeasurementCallback::GnssMeasurement& measurement_V1_1,
+        JavaObject& object) {
+    translateSingleGnssMeasurement(measurement_V1_1.v1_0, object);
+
+    // Set the V1_1 flag, and mark that new field has valid information for Java Layer
+    SET(AccumulatedDeltaRangeState,
+        (static_cast<int32_t>(measurement_V1_1.accumulatedDeltaRangeState) |
+         ADR_STATE_HALF_CYCLE_REPORTED));
+}
+
+// Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
+template <>
+void GnssMeasurementCallbackHidl::translateSingleGnssMeasurement<
+        hardware::gnss::V2_0::IGnssMeasurementCallback::GnssMeasurement>(
+        const hardware::gnss::V2_0::IGnssMeasurementCallback::GnssMeasurement& measurement_V2_0,
+        JavaObject& object) {
+    JNIEnv* env = getJniEnv();
+    translateSingleGnssMeasurement(measurement_V2_0.v1_1, object);
+
+    jstring codeType = env->NewStringUTF(measurement_V2_0.codeType.c_str());
+    SET(CodeType, codeType);
+
+    // Overwrite with v2_0.state since V2_0.v1_1.v1_0.state is deprecated.
+    SET(State, static_cast<int32_t>(measurement_V2_0.state));
+
+    // Overwrite with v2_0.constellation since V2_0.v1_1.v1_0.constellation is deprecated.
+    SET(ConstellationType, static_cast<int32_t>(measurement_V2_0.constellation));
+
+    if (codeType) {
+        env->DeleteLocalRef(codeType);
+    }
+}
+
+// Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
+template <>
+void GnssMeasurementCallbackHidl::translateSingleGnssMeasurement<
+        hardware::gnss::V2_1::IGnssMeasurementCallback::GnssMeasurement>(
+        const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssMeasurement& measurement_V2_1,
+        JavaObject& object) {
+    translateSingleGnssMeasurement(measurement_V2_1.v2_0, object);
+
+    setMeasurementFields_V2_1<hardware::gnss::V2_1::IGnssMeasurementCallback::GnssMeasurement,
+                              GnssMeasurementFlags>(measurement_V2_1, object);
+}
+
+template <>
+void GnssMeasurementCallbackHidl::translateGnssClock(
+        const hardware::gnss::V1_0::IGnssMeasurementCallback::GnssClock& clock,
+        JavaObject& object) {
+    setClockFields_V1_0<hardware::gnss::V1_0::IGnssMeasurementCallback::GnssClock,
+                        GnssClockFlags>(clock, object);
+}
+
+template <>
+void GnssMeasurementCallbackHidl::translateGnssClock(
+        const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssClock& clock,
+        JavaObject& object) {
+    setClockFields_V2_1<hardware::gnss::V2_1::IGnssMeasurementCallback::GnssClock,
+                        GnssClockFlags>(clock, object);
+    translateGnssClock(clock.v1_0, object);
+}
+
+template <>
+void GnssMeasurementCallbackHidl::translateGnssClock(
+        const hardware::gnss::V2_0::IGnssMeasurementCallback::GnssData& data, JavaObject& object) {
+    setElapsedRealtimeFields<hardware::gnss::V2_0::ElapsedRealtime,
+                             hardware::gnss::V2_0::ElapsedRealtimeFlags>(data.elapsedRealtime,
+                                                                         object);
+    translateGnssClock(data.clock, object);
+}
+
+template <>
+void GnssMeasurementCallbackHidl::translateGnssClock(
+        const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssData& data, JavaObject& object) {
     auto elapsedRealtime = data.elapsedRealtime;
     uint16_t flags = static_cast<uint16_t>(elapsedRealtime.flags);
     if (flags & hardware::gnss::V2_0::ElapsedRealtimeFlags::HAS_TIMESTAMP_NS) {
@@ -254,33 +381,7 @@
         SET(ElapsedRealtimeUncertaintyNanos,
             static_cast<double>(elapsedRealtime.timeUncertaintyNs));
     }
-    translateGnssClock(object, data.clock);
-}
-
-template <>
-void GnssMeasurementCallback::translateGnssClock(
-        JavaObject& object, const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssData& data) {
-    auto elapsedRealtime = data.elapsedRealtime;
-    uint16_t flags = static_cast<uint16_t>(elapsedRealtime.flags);
-    if (flags & hardware::gnss::V2_0::ElapsedRealtimeFlags::HAS_TIMESTAMP_NS) {
-        SET(ElapsedRealtimeNanos, static_cast<uint64_t>(elapsedRealtime.timestampNs));
-    }
-    if (flags & hardware::gnss::V2_0::ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS) {
-        SET(ElapsedRealtimeUncertaintyNanos,
-            static_cast<double>(elapsedRealtime.timeUncertaintyNs));
-    }
-    translateGnssClock(object, data.clock);
-}
-
-void GnssMeasurementCallback::setMeasurementData(JNIEnv* env, jobject clock,
-                                                 jobjectArray measurementArray) {
-    jobject gnssMeasurementsEvent =
-            env->NewObject(class_gnssMeasurementsEvent, method_gnssMeasurementsEventCtor, clock,
-                           measurementArray);
-
-    env->CallVoidMethod(mCallbacksObj, method_reportMeasurementData, gnssMeasurementsEvent);
-    checkAndClearExceptionFromCallback(env, __FUNCTION__);
-    env->DeleteLocalRef(gnssMeasurementsEvent);
+    translateGnssClock(data.clock, object);
 }
 
 } // namespace android::gnss
diff --git a/services/core/jni/gnss/GnssMeasurementCallback.h b/services/core/jni/gnss/GnssMeasurementCallback.h
index 71c33a7..26f1243 100644
--- a/services/core/jni/gnss/GnssMeasurementCallback.h
+++ b/services/core/jni/gnss/GnssMeasurementCallback.h
@@ -27,6 +27,7 @@
 #include <android/hardware/gnss/1.1/IGnssMeasurement.h>
 #include <android/hardware/gnss/2.0/IGnssMeasurement.h>
 #include <android/hardware/gnss/2.1/IGnssMeasurement.h>
+#include <android/hardware/gnss/BnGnssMeasurementCallback.h>
 #include <log/log.h>
 #include "Utils.h"
 #include "jni.h"
@@ -44,12 +45,36 @@
 
 void GnssMeasurement_class_init_once(JNIEnv* env, jclass& clazz);
 
+void setMeasurementData(JNIEnv* env, jobject& callbacksObj, jobject clock,
+                        jobjectArray measurementArray);
+
+class GnssMeasurementCallbackAidl : public hardware::gnss::BnGnssMeasurementCallback {
+public:
+    GnssMeasurementCallbackAidl(jobject& callbacksObj) : mCallbacksObj(callbacksObj) {}
+    android::binder::Status gnssMeasurementCb(const hardware::gnss::GnssData& data) override;
+
+private:
+    void translateSingleGnssMeasurement(JNIEnv* env,
+                                        const hardware::gnss::GnssMeasurement& measurement,
+                                        JavaObject& object);
+
+    jobjectArray translateAllGnssMeasurements(
+            JNIEnv* env, const std::vector<hardware::gnss::GnssMeasurement>& measurements);
+
+    void translateAndSetGnssData(const hardware::gnss::GnssData& data);
+
+    void translateGnssClock(JNIEnv* env, const hardware::gnss::GnssData& data, JavaObject& object);
+
+    jobject& mCallbacksObj;
+};
+
 /*
  * GnssMeasurementCallback implements the callback methods required for the
  * GnssMeasurement interface.
  */
-struct GnssMeasurementCallback : public hardware::gnss::V2_1::IGnssMeasurementCallback {
-    GnssMeasurementCallback(jobject& callbacksObj) : mCallbacksObj(callbacksObj) {}
+class GnssMeasurementCallbackHidl : public hardware::gnss::V2_1::IGnssMeasurementCallback {
+public:
+    GnssMeasurementCallbackHidl(jobject& callbacksObj) : mCallbacksObj(callbacksObj) {}
     hardware::Return<void> gnssMeasurementCb_2_1(
             const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssData& data) override;
     hardware::Return<void> gnssMeasurementCb_2_0(
@@ -61,7 +86,7 @@
 
 private:
     template <class T>
-    void translateSingleGnssMeasurement(const T* measurement, JavaObject& object);
+    void translateSingleGnssMeasurement(const T& measurement, JavaObject& object);
 
     template <class T>
     jobjectArray translateAllGnssMeasurements(JNIEnv* env, const T* measurements, size_t count);
@@ -73,93 +98,114 @@
     size_t getMeasurementCount(const T& data);
 
     template <class T>
-    void translateGnssClock(JavaObject& object, const T& data);
-
-    void setMeasurementData(JNIEnv* env, jobject clock, jobjectArray measurementArray);
+    void translateGnssClock(const T& data, JavaObject& object);
 
     jobject& mCallbacksObj;
 };
 
+class GnssMeasurementCallback {
+public:
+    GnssMeasurementCallback(jobject& callbacksObj) : mCallbacksObj(callbacksObj) {}
+    sp<GnssMeasurementCallbackAidl> getAidl() {
+        if (callbackAidl == nullptr) {
+            callbackAidl = sp<GnssMeasurementCallbackAidl>::make(mCallbacksObj);
+        }
+        return callbackAidl;
+    }
+
+    sp<GnssMeasurementCallbackHidl> getHidl() {
+        if (callbackHidl == nullptr) {
+            callbackHidl = sp<GnssMeasurementCallbackHidl>::make(mCallbacksObj);
+        }
+        return callbackHidl;
+    }
+
+private:
+    jobject& mCallbacksObj;
+    sp<GnssMeasurementCallbackAidl> callbackAidl;
+    sp<GnssMeasurementCallbackHidl> callbackHidl;
+};
+
 template <class T>
-void GnssMeasurementCallback::translateAndSetGnssData(const T& data) {
+void GnssMeasurementCallbackHidl::translateAndSetGnssData(const T& data) {
     JNIEnv* env = getJniEnv();
 
     JavaObject gnssClockJavaObject(env, class_gnssClock, method_gnssClockCtor);
-    translateGnssClock(gnssClockJavaObject, data);
+    translateGnssClock(data, gnssClockJavaObject);
     jobject clock = gnssClockJavaObject.get();
 
     size_t count = getMeasurementCount(data);
     jobjectArray measurementArray =
             translateAllGnssMeasurements(env, data.measurements.data(), count);
-    setMeasurementData(env, clock, measurementArray);
+    setMeasurementData(env, mCallbacksObj, clock, measurementArray);
 
     env->DeleteLocalRef(clock);
     env->DeleteLocalRef(measurementArray);
 }
 
 template <>
-size_t GnssMeasurementCallback::getMeasurementCount<
+size_t GnssMeasurementCallbackHidl::getMeasurementCount<
         hardware::gnss::V1_0::IGnssMeasurementCallback::GnssData>(
         const hardware::gnss::V1_0::IGnssMeasurementCallback::GnssData& data);
 
 template <class T>
-size_t GnssMeasurementCallback::getMeasurementCount(const T& data) {
+size_t GnssMeasurementCallbackHidl::getMeasurementCount(const T& data) {
     return data.measurements.size();
 }
 
 // Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
 template <>
-void GnssMeasurementCallback::translateSingleGnssMeasurement<
+void GnssMeasurementCallbackHidl::translateSingleGnssMeasurement<
         hardware::gnss::V1_0::IGnssMeasurementCallback::GnssMeasurement>(
-        const hardware::gnss::V1_0::IGnssMeasurementCallback::GnssMeasurement* measurement,
+        const hardware::gnss::V1_0::IGnssMeasurementCallback::GnssMeasurement& measurement,
         JavaObject& object);
 
 // Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
 template <>
-void GnssMeasurementCallback::translateSingleGnssMeasurement<
+void GnssMeasurementCallbackHidl::translateSingleGnssMeasurement<
         hardware::gnss::V1_1::IGnssMeasurementCallback::GnssMeasurement>(
-        const hardware::gnss::V1_1::IGnssMeasurementCallback::GnssMeasurement* measurement_V1_1,
+        const hardware::gnss::V1_1::IGnssMeasurementCallback::GnssMeasurement& measurement_V1_1,
         JavaObject& object);
 
 // Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
 template <>
-void GnssMeasurementCallback::translateSingleGnssMeasurement<
+void GnssMeasurementCallbackHidl::translateSingleGnssMeasurement<
         hardware::gnss::V2_0::IGnssMeasurementCallback::GnssMeasurement>(
-        const hardware::gnss::V2_0::IGnssMeasurementCallback::GnssMeasurement* measurement_V2_0,
+        const hardware::gnss::V2_0::IGnssMeasurementCallback::GnssMeasurement& measurement_V2_0,
         JavaObject& object);
 
 // Preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
 template <>
-void GnssMeasurementCallback::translateSingleGnssMeasurement<
+void GnssMeasurementCallbackHidl::translateSingleGnssMeasurement<
         hardware::gnss::V2_1::IGnssMeasurementCallback::GnssMeasurement>(
-        const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssMeasurement* measurement_V2_1,
+        const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssMeasurement& measurement_V2_1,
         JavaObject& object);
 
 template <class T>
-void GnssMeasurementCallback::translateGnssClock(JavaObject& object, const T& data) {
-    translateGnssClock(object, data.clock);
+void GnssMeasurementCallbackHidl::translateGnssClock(const T& data, JavaObject& object) {
+    translateGnssClock(data.clock, object);
 }
 
 template <>
-void GnssMeasurementCallback::translateGnssClock(
-        JavaObject& object, const hardware::gnss::V1_0::IGnssMeasurementCallback::GnssClock& clock);
+void GnssMeasurementCallbackHidl::translateGnssClock(
+        const hardware::gnss::V1_0::IGnssMeasurementCallback::GnssClock& clock, JavaObject& object);
 
 template <>
-void GnssMeasurementCallback::translateGnssClock(
-        JavaObject& object, const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssClock& clock);
+void GnssMeasurementCallbackHidl::translateGnssClock(
+        const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssClock& clock, JavaObject& object);
 
 template <>
-void GnssMeasurementCallback::translateGnssClock(
-        JavaObject& object, const hardware::gnss::V2_0::IGnssMeasurementCallback::GnssData& data);
+void GnssMeasurementCallbackHidl::translateGnssClock(
+        const hardware::gnss::V2_0::IGnssMeasurementCallback::GnssData& data, JavaObject& object);
 
 template <>
-void GnssMeasurementCallback::translateGnssClock(
-        JavaObject& object, const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssData& data);
+void GnssMeasurementCallbackHidl::translateGnssClock(
+        const hardware::gnss::V2_1::IGnssMeasurementCallback::GnssData& data, JavaObject& object);
 
 template <class T>
-jobjectArray GnssMeasurementCallback::translateAllGnssMeasurements(JNIEnv* env,
-                                                                   const T* measurements,
-                                                                   size_t count) {
+jobjectArray GnssMeasurementCallbackHidl::translateAllGnssMeasurements(JNIEnv* env,
+                                                                       const T* measurements,
+                                                                       size_t count) {
     if (count == 0) {
         return nullptr;
     }
@@ -169,7 +215,7 @@
 
     for (uint16_t i = 0; i < count; ++i) {
         JavaObject object(env, class_gnssMeasurement, method_gnssMeasurementCtor);
-        translateSingleGnssMeasurement(&(measurements[i]), object);
+        translateSingleGnssMeasurement(measurements[i], object);
         jobject gnssMeasurement = object.get();
         env->SetObjectArrayElement(gnssMeasurementArray, i, gnssMeasurement);
         env->DeleteLocalRef(gnssMeasurement);
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 bbd8de2..d670991 100644
--- a/services/core/xsd/display-device-config/display-device-config.xsd
+++ b/services/core/xsd/display-device-config/display-device-config.xsd
@@ -29,12 +29,19 @@
                     <xs:annotation name="nonnull"/>
                     <xs:annotation name="final"/>
                 </xs:element>
+                <xs:element type="displayQuirks" name="quirks" minOccurs="0" maxOccurs="1" />
             </xs:sequence>
         </xs:complexType>
     </xs:element>
 
     <!-- Type definitions -->
 
+    <xs:complexType name="displayQuirks">
+        <xs:sequence>
+            <xs:element name="quirk" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
+        </xs:sequence>
+    </xs:complexType>
+
     <xs:complexType name="nitsMap">
         <xs:sequence>
             <xs:element name="point" type="point" maxOccurs="unbounded" minOccurs="2">
diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt
index 7a35642..e68ca26 100644
--- a/services/core/xsd/display-device-config/schema/current.txt
+++ b/services/core/xsd/display-device-config/schema/current.txt
@@ -3,10 +3,17 @@
 
   public class DisplayConfiguration {
     ctor public DisplayConfiguration();
+    method public com.android.server.display.config.DisplayQuirks getQuirks();
     method @NonNull public final com.android.server.display.config.NitsMap getScreenBrightnessMap();
+    method public void setQuirks(com.android.server.display.config.DisplayQuirks);
     method public final void setScreenBrightnessMap(@NonNull com.android.server.display.config.NitsMap);
   }
 
+  public class DisplayQuirks {
+    ctor public DisplayQuirks();
+    method public java.util.List<java.lang.String> getQuirk();
+  }
+
   public class NitsMap {
     ctor public NitsMap();
     method @NonNull public final java.util.List<com.android.server.display.config.Point> getPoint();
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index d0c2c79..174cc64 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -124,6 +124,7 @@
 import android.app.AlarmManager;
 import android.app.AppGlobals;
 import android.app.AppOpsManager;
+import android.app.AppOpsManager.Mode;
 import android.app.BroadcastOptions;
 import android.app.IActivityManager;
 import android.app.IActivityTaskManager;
@@ -3356,6 +3357,18 @@
                 PREVENT_SETTING_PASSWORD_QUALITY_ON_PARENT, packageName, userId);
     }
 
+    private boolean isPasswordLimitingAdminTargetingP(CallerIdentity caller) {
+        if (!caller.hasAdminComponent()) {
+            return false;
+        }
+
+        synchronized (getLockObject()) {
+            return getActiveAdminWithPolicyForUidLocked(
+                    caller.getComponentName(), DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD,
+                    caller.getUid()) != null;
+        }
+    }
+
     @Override
     public void setPasswordQuality(ComponentName who, int quality, boolean parent) {
         if (!mHasFeature) {
@@ -3366,7 +3379,8 @@
 
         final CallerIdentity caller = getCallerIdentity(who);
         Preconditions.checkCallAuthorization(
-                isProfileOwner(caller) || isDeviceOwner(caller) || isSystemUid(caller));
+                isProfileOwner(caller) || isDeviceOwner(caller) || isSystemUid(caller)
+                || isPasswordLimitingAdminTargetingP(caller));
 
         final boolean qualityMayApplyToParent =
                 canSetPasswordQualityOnParent(who.getPackageName(), caller.getUserId());
@@ -11778,6 +11792,28 @@
             return profileOwnerInCallingUser != null
                     && packageName.equals(profileOwnerInCallingUser.getPackageName());
         }
+
+        @Override
+        public boolean supportsResetOp(int op) {
+            return op == AppOpsManager.OP_INTERACT_ACROSS_PROFILES
+                    && LocalServices.getService(CrossProfileAppsInternal.class) != null;
+        }
+
+        @Override
+        public void resetOp(int op, String packageName, @UserIdInt int userId) {
+            if (op != AppOpsManager.OP_INTERACT_ACROSS_PROFILES) {
+                throw new IllegalArgumentException("Unsupported op for DPM reset: " + op);
+            }
+            LocalServices.getService(CrossProfileAppsInternal.class)
+                    .setInteractAcrossProfilesAppOp(
+                            packageName, findInteractAcrossProfilesResetMode(packageName), userId);
+        }
+
+        private @Mode int findInteractAcrossProfilesResetMode(String packageName) {
+            return getDefaultCrossProfilePackages().contains(packageName)
+                    ? AppOpsManager.MODE_ALLOWED
+                    : AppOpsManager.opToDefaultMode(AppOpsManager.OP_INTERACT_ACROSS_PROFILES);
+        }
     }
 
     private Intent createShowAdminSupportIntent(ComponentName admin, int userId) {
diff --git a/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerPerUserService.java b/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerPerUserService.java
index e258ef0..3531512 100644
--- a/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerPerUserService.java
+++ b/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerPerUserService.java
@@ -113,7 +113,8 @@
 
             mRemoteService = new RemoteMusicRecognitionService(getContext(),
                     serviceComponent, mUserId, this,
-                    mRemoteServiceCallback, mMaster.isBindInstantServiceAllowed(), mMaster.verbose);
+                    mRemoteServiceCallback, mMaster.isBindInstantServiceAllowed(),
+                    mMaster.verbose);
         }
 
         return mRemoteService;
@@ -167,7 +168,8 @@
                         recognitionRequest.getIgnoreBeginningFrames() * BYTES_PER_SAMPLE;
                 audioRecord.startRecording();
                 while (bytesRead >= 0 && totalBytesRead
-                        < audioRecord.getBufferSizeInFrames() * BYTES_PER_SAMPLE) {
+                        < audioRecord.getBufferSizeInFrames() * BYTES_PER_SAMPLE
+                        && mRemoteService != null) {
                     bytesRead = audioRecord.read(byteBuffer, 0, byteBuffer.length);
                     if (bytesRead > 0) {
                         totalBytesRead += bytesRead;
@@ -215,6 +217,7 @@
             } catch (RemoteException ignored) {
                 // Ignored.
             }
+            destroyService();
         }
 
         @Override
@@ -224,6 +227,7 @@
             } catch (RemoteException ignored) {
                 // Ignored.
             }
+            destroyService();
         }
     }
 
@@ -235,6 +239,17 @@
             // Ignored.
         }
         Slog.w(TAG, "remote service died: " + service);
+        destroyService();
+    }
+
+    @GuardedBy("mLock")
+    private void destroyService() {
+        synchronized (mLock) {
+            if (mRemoteService != null) {
+                mRemoteService.destroy();
+                mRemoteService = null;
+            }
+        }
     }
 
     /** Establishes an audio stream from the DSP audio source. */
diff --git a/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerService.java b/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerService.java
index b4cb337..9123daf 100644
--- a/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerService.java
+++ b/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerService.java
@@ -16,6 +16,7 @@
 
 package com.android.server.musicrecognition;
 
+import static android.Manifest.permission.MANAGE_MUSIC_RECOGNITION;
 import static android.content.PermissionChecker.PERMISSION_GRANTED;
 import static android.media.musicrecognition.MusicRecognitionManager.RECOGNITION_FAILED_SERVICE_UNAVAILABLE;
 
@@ -28,11 +29,14 @@
 import android.os.Binder;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ShellCallback;
 import android.os.UserHandle;
 
 import com.android.server.infra.AbstractMasterSystemService;
 import com.android.server.infra.FrameworkResourcesServiceNameResolver;
 
+import java.io.FileDescriptor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -45,6 +49,7 @@
                 MusicRecognitionManagerPerUserService> {
 
     private static final String TAG = MusicRecognitionManagerService.class.getSimpleName();
+    private static final int MAX_TEMP_SERVICE_SUBSTITUTION_DURATION_MS = 60_000;
 
     private MusicRecognitionManagerStub mMusicRecognitionManagerStub;
     final ExecutorService mExecutorService = Executors.newCachedThreadPool();
@@ -90,6 +95,16 @@
         throw new SecurityException(msg);
     }
 
+    @Override
+    protected void enforceCallingPermissionForManagement() {
+        getContext().enforceCallingPermission(MANAGE_MUSIC_RECOGNITION, TAG);
+    }
+
+    @Override
+    protected int getMaximumTemporaryServiceDurationMs() {
+        return MAX_TEMP_SERVICE_SUBSTITUTION_DURATION_MS;
+    }
+
     final class MusicRecognitionManagerStub extends IMusicRecognitionManager.Stub {
         @Override
         public void beginRecognition(
@@ -112,5 +127,17 @@
                 }
             }
         }
+
+        @Override
+        public void onShellCommand(@Nullable FileDescriptor in,
+                @Nullable FileDescriptor out,
+                @Nullable FileDescriptor err,
+                @NonNull String[] args,
+                @Nullable ShellCallback callback,
+                @NonNull ResultReceiver resultReceiver) throws RemoteException {
+            new MusicRecognitionManagerServiceShellCommand(
+                    MusicRecognitionManagerService.this).exec(this, in, out, err, args, callback,
+                    resultReceiver);
+        }
     }
 }
diff --git a/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerServiceShellCommand.java b/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerServiceShellCommand.java
new file mode 100644
index 0000000..b020a24
--- /dev/null
+++ b/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerServiceShellCommand.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.musicrecognition;
+
+import android.os.ShellCommand;
+
+import java.io.PrintWriter;
+
+/** Handles adb shell commands send to MusicRecognitionManagerService. */
+class MusicRecognitionManagerServiceShellCommand extends ShellCommand {
+
+    private final MusicRecognitionManagerService mService;
+
+    MusicRecognitionManagerServiceShellCommand(MusicRecognitionManagerService service) {
+        mService = service;
+    }
+
+    @Override
+    public int onCommand(String cmd) {
+        if (cmd == null) {
+            return handleDefaultCommands(cmd);
+        }
+        final PrintWriter pw = getOutPrintWriter();
+        if ("set".equals(cmd)) {
+            return requestSet(pw);
+        }
+        return handleDefaultCommands(cmd);
+    }
+
+    private int requestSet(PrintWriter pw) {
+        final String what = getNextArgRequired();
+        if ("temporary-service".equals(what)) {
+            return setTemporaryService(pw);
+        }
+        pw.println("Invalid set: " + what);
+        return -1;
+    }
+
+    private int setTemporaryService(PrintWriter pw) {
+        final int userId = Integer.parseInt(getNextArgRequired());
+        final String serviceName = getNextArg();
+        if (serviceName == null) {
+            mService.resetTemporaryService(userId);
+            return 0;
+        }
+        final int duration = Integer.parseInt(getNextArgRequired());
+        mService.setTemporaryService(userId, serviceName, duration);
+        pw.println("MusicRecognitionService temporarily set to " + serviceName + " for "
+                + duration + "ms");
+        return 0;
+    }
+
+    @Override
+    public void onHelp() {
+        try (PrintWriter pw = getOutPrintWriter();) {
+            pw.println("MusicRecognition Service (music_recognition) commands:");
+            pw.println("  help");
+            pw.println("    Prints this help text.");
+            pw.println("");
+            pw.println("  set temporary-service USER_ID [COMPONENT_NAME DURATION]");
+            pw.println("    Temporarily (for DURATION ms) changes the service implementation.");
+            pw.println("    To reset, call with just the USER_ID argument.");
+            pw.println("");
+        }
+    }
+}
diff --git a/services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java b/services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java
index 5fa809f..adf892a 100644
--- a/services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java
+++ b/services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java
@@ -37,7 +37,6 @@
 import android.app.ActivityManagerInternal;
 import android.app.AppOpsManager;
 import android.app.AppOpsManager.Mode;
-import android.app.admin.DevicePolicyManager;
 import android.app.admin.DevicePolicyManagerInternal;
 import android.content.ComponentName;
 import android.content.ContextWrapper;
@@ -94,12 +93,15 @@
     private static final int CALLING_PID = 1000;
     private static final String CROSS_PROFILE_APP_PACKAGE_NAME =
             "com.android.server.pm.crossprofileappsserviceimplrobotest.crossprofileapp";
-    private static final int PERSONAL_PROFILE_USER_ID = 0;
+    @UserIdInt private static final int PERSONAL_PROFILE_USER_ID = 0;
     private static final int PERSONAL_PROFILE_UID = 2222;
-    private static final int WORK_PROFILE_USER_ID = 10;
+    @UserIdInt private static final int WORK_PROFILE_USER_ID = 10;
     private static final int WORK_PROFILE_UID = 3333;
     private static final int OTHER_PROFILE_WITHOUT_CROSS_PROFILE_APP_USER_ID = 20;
-    private static final int OUTSIDE_PROFILE_GROUP_USER_ID = 30;
+    @UserIdInt private static final int OTHER_PROFILE_GROUP_USER_ID = 30;
+    private static final int OTHER_PROFILE_GROUP_UID = 4444;
+    @UserIdInt private static final int OTHER_PROFILE_GROUP_2_USER_ID = 31;
+    private static final int OTHER_PROFILE_GROUP_2_UID = 5555;
 
     private final ContextWrapper mContext = ApplicationProvider.getApplicationContext();
     private final UserManager mUserManager = mContext.getSystemService(UserManager.class);
@@ -138,6 +140,10 @@
         mockCrossProfileAppInstalledOnProfile(
                 packageInfo, PERSONAL_PROFILE_USER_ID, PERSONAL_PROFILE_UID);
         mockCrossProfileAppInstalledOnProfile(packageInfo, WORK_PROFILE_USER_ID, WORK_PROFILE_UID);
+        mockCrossProfileAppInstalledOnProfile(
+                packageInfo, OTHER_PROFILE_GROUP_USER_ID, OTHER_PROFILE_GROUP_UID);
+        mockCrossProfileAppInstalledOnProfile(
+                packageInfo, OTHER_PROFILE_GROUP_2_USER_ID, OTHER_PROFILE_GROUP_2_UID);
     }
 
     private void mockCrossProfileAppInstalledOnProfile(
@@ -200,16 +206,22 @@
 
     @Before
     public void setUpCrossProfileAppUidsAndPackageNames() {
+        setUpCrossProfileAppUidAndPackageName(
+                PERSONAL_PROFILE_UID, PERSONAL_PROFILE_USER_ID);
+        setUpCrossProfileAppUidAndPackageName(
+                WORK_PROFILE_UID, WORK_PROFILE_USER_ID);
+        setUpCrossProfileAppUidAndPackageName(
+                OTHER_PROFILE_GROUP_UID, OTHER_PROFILE_GROUP_USER_ID);
+        setUpCrossProfileAppUidAndPackageName(
+                OTHER_PROFILE_GROUP_2_UID, OTHER_PROFILE_GROUP_2_USER_ID);
+    }
+
+    private void setUpCrossProfileAppUidAndPackageName(int uid, @UserIdInt int userId) {
         ShadowApplicationPackageManager.setPackageUidAsUser(
-                CROSS_PROFILE_APP_PACKAGE_NAME, PERSONAL_PROFILE_UID, PERSONAL_PROFILE_USER_ID);
-        ShadowApplicationPackageManager.setPackageUidAsUser(
-                CROSS_PROFILE_APP_PACKAGE_NAME, WORK_PROFILE_UID, WORK_PROFILE_USER_ID);
-        when(mPackageManagerInternal.getPackageUid(
-                CROSS_PROFILE_APP_PACKAGE_NAME, /* flags= */ 0, PERSONAL_PROFILE_USER_ID))
-                .thenReturn(PERSONAL_PROFILE_UID);
-        when(mPackageManagerInternal.getPackageUid(
-                CROSS_PROFILE_APP_PACKAGE_NAME, /* flags= */ 0, WORK_PROFILE_USER_ID))
-                .thenReturn(WORK_PROFILE_UID);
+                CROSS_PROFILE_APP_PACKAGE_NAME, uid, userId);
+        when(mPackageManagerInternal
+                .getPackageUid(CROSS_PROFILE_APP_PACKAGE_NAME, /* flags= */ 0, userId))
+                .thenReturn(uid);
     }
 
     @Before
@@ -229,7 +241,9 @@
                 PERSONAL_PROFILE_USER_ID,
                 WORK_PROFILE_USER_ID,
                 OTHER_PROFILE_WITHOUT_CROSS_PROFILE_APP_USER_ID);
-        shadowUserManager.addProfileIds(OUTSIDE_PROFILE_GROUP_USER_ID);
+        shadowUserManager.addProfileIds(
+                OTHER_PROFILE_GROUP_USER_ID,
+                OTHER_PROFILE_GROUP_2_USER_ID);
     }
 
     @Before
@@ -239,6 +253,8 @@
         final int defaultMode = AppOpsManager.opToDefaultMode(OP_INTERACT_ACROSS_PROFILES);
         explicitlySetInteractAcrossProfilesAppOp(PERSONAL_PROFILE_UID, defaultMode);
         explicitlySetInteractAcrossProfilesAppOp(WORK_PROFILE_UID, defaultMode);
+        explicitlySetInteractAcrossProfilesAppOp(OTHER_PROFILE_GROUP_UID, defaultMode);
+        explicitlySetInteractAcrossProfilesAppOp(OTHER_PROFILE_GROUP_2_UID, defaultMode);
     }
 
     @Test
@@ -422,6 +438,27 @@
     }
 
     @Test
+    public void setInteractAcrossProfilesAppOp_userToSetInDifferentProfileGroupToCaller_setsAppOp() {
+        mCrossProfileAppsServiceImpl.getLocalService().setInteractAcrossProfilesAppOp(
+                CROSS_PROFILE_APP_PACKAGE_NAME, MODE_ALLOWED, OTHER_PROFILE_GROUP_USER_ID);
+        assertThat(getCrossProfileAppOp(OTHER_PROFILE_GROUP_UID)).isEqualTo(MODE_ALLOWED);
+    }
+
+    @Test
+    public void setInteractAcrossProfilesAppOp_userToSetInDifferentProfileGroupToCaller_setsAppOpOnOtherProfile() {
+        mCrossProfileAppsServiceImpl.getLocalService().setInteractAcrossProfilesAppOp(
+                CROSS_PROFILE_APP_PACKAGE_NAME, MODE_ALLOWED, OTHER_PROFILE_GROUP_USER_ID);
+        assertThat(getCrossProfileAppOp(OTHER_PROFILE_GROUP_2_UID)).isEqualTo(MODE_ALLOWED);
+    }
+
+    @Test
+    public void setInteractAcrossProfilesAppOp_userToSetInDifferentProfileGroupToCaller_doesNotSetCallerAppOp() {
+        mCrossProfileAppsServiceImpl.getLocalService().setInteractAcrossProfilesAppOp(
+                CROSS_PROFILE_APP_PACKAGE_NAME, MODE_ALLOWED, OTHER_PROFILE_GROUP_USER_ID);
+        assertThat(getCrossProfileAppOp()).isEqualTo(MODE_DEFAULT);
+    }
+
+    @Test
     public void canConfigureInteractAcrossProfiles_packageNotInstalledInProfile_returnsFalse() {
         mockUninstallCrossProfileAppFromWorkProfile();
         assertThat(mCrossProfileAppsServiceImpl
@@ -530,7 +567,7 @@
 
     @Test
     public void canUserAttemptToConfigureInteractAcrossProfiles_profileOwnerOutsideProfileGroup_returnsTrue() {
-        when(mDevicePolicyManagerInternal.getProfileOwnerAsUser(OUTSIDE_PROFILE_GROUP_USER_ID))
+        when(mDevicePolicyManagerInternal.getProfileOwnerAsUser(OTHER_PROFILE_GROUP_USER_ID))
                 .thenReturn(buildCrossProfileComponentName());
         assertThat(mCrossProfileAppsServiceImpl
                 .canUserAttemptToConfigureInteractAcrossProfiles(CROSS_PROFILE_APP_PACKAGE_NAME))
@@ -601,8 +638,14 @@
     private void mockCrossProfileAndroidPackage(AndroidPackage androidPackage) {
         when(mPackageManagerInternal.getPackage(CROSS_PROFILE_APP_PACKAGE_NAME))
                 .thenReturn(androidPackage);
-        when(mPackageManagerInternal.getPackage(PERSONAL_PROFILE_UID)).thenReturn(androidPackage);
-        when(mPackageManagerInternal.getPackage(WORK_PROFILE_UID)).thenReturn(androidPackage);
+        when(mPackageManagerInternal.getPackage(PERSONAL_PROFILE_UID))
+                .thenReturn(androidPackage);
+        when(mPackageManagerInternal.getPackage(WORK_PROFILE_UID))
+                .thenReturn(androidPackage);
+        when(mPackageManagerInternal.getPackage(OTHER_PROFILE_GROUP_UID))
+                .thenReturn(androidPackage);
+        when(mPackageManagerInternal.getPackage(OTHER_PROFILE_GROUP_2_UID))
+                .thenReturn(androidPackage);
     }
 
     private void mockCrossProfileAppNotWhitelisted() {
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
index 5f6f61c..344a19a 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
@@ -1960,6 +1960,79 @@
                 .set(anyInt(), eq(expectedAlarmTime), eq(TAG_QUOTA_CHECK), any(), any());
     }
 
+    /**
+     * Test that QC handles invalid cases where an app is in the NEVER bucket but has still run
+     * jobs.
+     */
+    @Test
+    public void testMaybeScheduleStartAlarmLocked_Never_EffectiveNotNever() {
+        // saveTimingSession calls maybeScheduleCleanupAlarmLocked which interferes with these tests
+        // because it schedules an alarm too. Prevent it from doing so.
+        spyOn(mQuotaController);
+        doNothing().when(mQuotaController).maybeScheduleCleanupAlarmLocked();
+
+        // The app is really in the NEVER bucket but is elevated somehow (eg via uidActive).
+        setStandbyBucket(NEVER_INDEX);
+        final int effectiveStandbyBucket = FREQUENT_INDEX;
+
+        // No sessions saved yet.
+        synchronized (mQuotaController.mLock) {
+            mQuotaController.maybeScheduleStartAlarmLocked(
+                    SOURCE_USER_ID, SOURCE_PACKAGE, effectiveStandbyBucket);
+        }
+        verify(mAlarmManager, never()).set(anyInt(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
+
+        // Test with timing sessions out of window.
+        final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
+        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
+                createTimingSession(now - 10 * HOUR_IN_MILLIS, 5 * MINUTE_IN_MILLIS, 1), false);
+        synchronized (mQuotaController.mLock) {
+            mQuotaController.maybeScheduleStartAlarmLocked(
+                    SOURCE_USER_ID, SOURCE_PACKAGE, effectiveStandbyBucket);
+        }
+        verify(mAlarmManager, never()).set(anyInt(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
+
+        // Test with timing sessions in window but still in quota.
+        final long start = now - (6 * HOUR_IN_MILLIS);
+        final long expectedAlarmTime = start + 8 * HOUR_IN_MILLIS + mQcConstants.IN_QUOTA_BUFFER_MS;
+        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
+                createTimingSession(start, 5 * MINUTE_IN_MILLIS, 1), false);
+        synchronized (mQuotaController.mLock) {
+            mQuotaController.maybeScheduleStartAlarmLocked(
+                    SOURCE_USER_ID, SOURCE_PACKAGE, effectiveStandbyBucket);
+        }
+        verify(mAlarmManager, never()).set(anyInt(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
+
+        // Add some more sessions, but still in quota.
+        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
+                createTimingSession(now - 3 * HOUR_IN_MILLIS, MINUTE_IN_MILLIS, 1), false);
+        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
+                createTimingSession(now - HOUR_IN_MILLIS, 3 * MINUTE_IN_MILLIS, 1), false);
+        synchronized (mQuotaController.mLock) {
+            mQuotaController.maybeScheduleStartAlarmLocked(
+                    SOURCE_USER_ID, SOURCE_PACKAGE, effectiveStandbyBucket);
+        }
+        verify(mAlarmManager, never()).set(anyInt(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
+
+        // Test when out of quota.
+        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
+                createTimingSession(now - HOUR_IN_MILLIS, MINUTE_IN_MILLIS, 1), false);
+        synchronized (mQuotaController.mLock) {
+            mQuotaController.maybeScheduleStartAlarmLocked(
+                    SOURCE_USER_ID, SOURCE_PACKAGE, effectiveStandbyBucket);
+        }
+        verify(mAlarmManager, times(1))
+                .set(anyInt(), eq(expectedAlarmTime), eq(TAG_QUOTA_CHECK), any(), any());
+
+        // Alarm already scheduled, so make sure it's not scheduled again.
+        synchronized (mQuotaController.mLock) {
+            mQuotaController.maybeScheduleStartAlarmLocked(
+                    SOURCE_USER_ID, SOURCE_PACKAGE, effectiveStandbyBucket);
+        }
+        verify(mAlarmManager, times(1))
+                .set(anyInt(), eq(expectedAlarmTime), eq(TAG_QUOTA_CHECK), any(), any());
+    }
+
     @Test
     public void testMaybeScheduleStartAlarmLocked_Rare() {
         // saveTimingSession calls maybeScheduleCleanupAlarmLocked which interferes with these tests
diff --git a/services/tests/servicestests/src/com/android/server/am/MeasuredEnergySnapshotTest.java b/services/tests/servicestests/src/com/android/server/am/MeasuredEnergySnapshotTest.java
new file mode 100644
index 0000000..67d379a
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/am/MeasuredEnergySnapshotTest.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import android.util.SparseLongArray;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.internal.power.MeasuredEnergyArray;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test class for {@link MeasuredEnergySnapshot}.
+ *
+ * To run the tests, use
+ * atest FrameworksServicesTests:com.android.server.am.MeasuredEnergySnapshotTest
+ */
+@SmallTest
+public final class MeasuredEnergySnapshotTest {
+    private static final int NUMBER_SUBSYSTEMS = 3;
+    private static final int SUBSYSTEM_DISPLAY = 0;
+    private static final int SUBSYSTEM_NEVER_USED = 1;
+    private static final int SUBSYSTEM_CATAPULT = 2;
+
+    private MeasuredEnergySnapshot mSnapshot;
+
+    // Basic MeasuredEnergyArray that supports all the subsystems. Out of order on purpose.
+    private final int[] mAllSubsystems =
+            {SUBSYSTEM_DISPLAY, SUBSYSTEM_CATAPULT, SUBSYSTEM_NEVER_USED};
+    // E.g. mAllSubsystems[mSubsystemIndices[SUBSYSTEM_CATAPULT]]=SUBSYSTEM_CATAPULT
+    private final int[] mSubsystemIndices = {0, 2, 1};
+    private final long[] mCurrentSubsystemEnergyUJ = {111, 0, 0};
+    private final MeasuredEnergyArray mOmniEnergyArray = new MeasuredEnergyArray() {
+        @Override
+        public int getSubsystem(int index) {
+            return mAllSubsystems[index];
+        }
+
+        @Override
+        public long getEnergy(int index) {
+            return mCurrentSubsystemEnergyUJ[index];
+        }
+
+        @Override
+        public int size() {
+            return mAllSubsystems.length;
+        }
+    };
+    private final MeasuredEnergyArray mJustDisplayEnergyArray = new MeasuredEnergyArray() {
+        @Override
+        public int getSubsystem(int index) {
+            return mAllSubsystems[0];
+        }
+
+        @Override
+        public long getEnergy(int index) {
+            return mCurrentSubsystemEnergyUJ[0];
+        }
+
+        @Override
+        public int size() {
+            return 1;
+        }
+    };
+
+    @Before
+    public void setUp() {
+        mSnapshot = new MeasuredEnergySnapshot(NUMBER_SUBSYSTEMS, mOmniEnergyArray);
+    }
+
+    @Test
+    public void testUpdateAndGetDelta() {
+        SparseLongArray result;
+
+        // Increment DISPLAY by 15
+        incrementEnergyOfSubsystem(SUBSYSTEM_DISPLAY, 15);
+        result = mSnapshot.updateAndGetDelta(mOmniEnergyArray);
+        assertEquals(1, result.size());
+        assertEquals(15, result.get(SUBSYSTEM_DISPLAY));
+
+        // Increment DISPLAY by 7
+        // Increment CATAPULT by 5. But do NOT include (pull) it in the passed in energy array.
+        incrementEnergyOfSubsystem(SUBSYSTEM_DISPLAY, 7);
+        incrementEnergyOfSubsystem(SUBSYSTEM_CATAPULT, 5);
+        result = mSnapshot.updateAndGetDelta(mJustDisplayEnergyArray); // Just pull display.
+        assertEquals(1, result.size());
+        assertEquals(7, result.get(SUBSYSTEM_DISPLAY));
+
+        // Increment CATAPULT by 64 (in addition to the previous increase of 5)
+        incrementEnergyOfSubsystem(SUBSYSTEM_CATAPULT, 64);
+        result = mSnapshot.updateAndGetDelta(mOmniEnergyArray);
+        assertEquals(1, result.size());
+        assertEquals(5 + 64, result.get(SUBSYSTEM_CATAPULT));
+
+        // Do nothing
+        result = mSnapshot.updateAndGetDelta(mOmniEnergyArray);
+        assertEquals("0 results should not appear at all", 0, result.size());
+
+        // Increment DISPLAY by 42
+        incrementEnergyOfSubsystem(SUBSYSTEM_DISPLAY, 42);
+        result = mSnapshot.updateAndGetDelta(mOmniEnergyArray);
+        assertEquals(1, result.size());
+        assertEquals(42, result.get(SUBSYSTEM_DISPLAY));
+
+        // Increment DISPLAY by 106 and CATAPULT by 13
+        incrementEnergyOfSubsystem(SUBSYSTEM_DISPLAY, 106);
+        incrementEnergyOfSubsystem(SUBSYSTEM_CATAPULT, 13);
+        result = mSnapshot.updateAndGetDelta(mOmniEnergyArray);
+        assertEquals(2, result.size());
+        assertEquals(106, result.get(SUBSYSTEM_DISPLAY));
+        assertEquals(13, result.get(SUBSYSTEM_CATAPULT));
+    }
+
+    private void incrementEnergyOfSubsystem(int subsystem, long energy) {
+        mCurrentSubsystemEnergyUJ[mSubsystemIndices[subsystem]] += energy;
+    }
+
+    @Test
+    public void testUpdateAndGetDelta_null() {
+        assertNull(mSnapshot.updateAndGetDelta(null));
+    }
+
+    @Test
+    public void testHasSubsystem() {
+        // Setup MeasuredEnergySnapshot which reported some of the subsystems.
+        final int[] subsystems = {SUBSYSTEM_DISPLAY, SUBSYSTEM_CATAPULT};
+        MeasuredEnergyArray measuredEnergyArray = new MeasuredEnergyArray() {
+            @Override
+            public int getSubsystem(int index) {
+                return subsystems[index];
+            }
+
+            @Override
+            public long getEnergy(int index) {
+                return 0; // Irrelevant for this test.
+            }
+
+            @Override
+            public int size() {
+                return subsystems.length;
+            }
+        };
+        final MeasuredEnergySnapshot snapshot =
+                new MeasuredEnergySnapshot(NUMBER_SUBSYSTEMS, measuredEnergyArray);
+
+        assertTrue(snapshot.hasSubsystem(SUBSYSTEM_DISPLAY));
+        assertTrue(snapshot.hasSubsystem(SUBSYSTEM_CATAPULT));
+        assertFalse(snapshot.hasSubsystem(SUBSYSTEM_NEVER_USED));
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/DevicePowerStatusActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/DevicePowerStatusActionTest.java
new file mode 100644
index 0000000..da9dcb7
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/hdmi/DevicePowerStatusActionTest.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.hdmi;
+
+import static com.android.server.hdmi.Constants.ADDR_TV;
+import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.hardware.hdmi.HdmiControlManager;
+import android.hardware.hdmi.IHdmiControlCallback;
+import android.hardware.tv.cec.V1_0.SendMessageResult;
+import android.media.AudioManager;
+import android.os.Handler;
+import android.os.IPowerManager;
+import android.os.IThermalService;
+import android.os.Looper;
+import android.os.PowerManager;
+import android.os.test.TestLooper;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+
+/** Tests for {@link DevicePowerStatusAction} */
+@SmallTest
+@RunWith(JUnit4.class)
+public class DevicePowerStatusActionTest {
+
+    private static final int TIMEOUT_MS = HdmiConfig.TIMEOUT_MS + 1;
+
+    private Context mContextSpy;
+    private HdmiControlService mHdmiControlService;
+    private HdmiCecLocalDevice mPlaybackDevice;
+    private FakeNativeWrapper mNativeWrapper;
+
+    private TestLooper mTestLooper = new TestLooper();
+    private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
+    private int mPhysicalAddress;
+
+    private DevicePowerStatusAction mDevicePowerStatusAction;
+
+    @Mock private IHdmiControlCallback mCallbackMock;
+    @Mock private IPowerManager mIPowerManagerMock;
+    @Mock private IThermalService mIThermalServiceMock;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+
+        mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext()));
+
+        PowerManager powerManager = new PowerManager(mContextSpy, mIPowerManagerMock,
+                mIThermalServiceMock, new Handler(mTestLooper.getLooper()));
+        when(mContextSpy.getSystemService(Context.POWER_SERVICE)).thenReturn(powerManager);
+        when(mContextSpy.getSystemService(PowerManager.class)).thenReturn(powerManager);
+        when(mIPowerManagerMock.isInteractive()).thenReturn(true);
+
+        HdmiCecConfig hdmiCecConfig = new FakeHdmiCecConfig(mContextSpy);
+
+        mHdmiControlService = new HdmiControlService(mContextSpy) {
+            @Override
+            AudioManager getAudioManager() {
+                return new AudioManager() {
+                    @Override
+                    public void setWiredDeviceConnectionState(
+                            int type, int state, String address, String name) {
+                        // Do nothing.
+                    }
+                };
+            }
+
+            @Override
+            void wakeUp() {
+            }
+
+            @Override
+            boolean isPowerStandby() {
+                return false;
+            }
+
+            @Override
+            protected PowerManager getPowerManager() {
+                return powerManager;
+            }
+
+            @Override
+            protected void writeStringSystemProperty(String key, String value) {
+                // do nothing
+            }
+
+            @Override
+            protected HdmiCecConfig getHdmiCecConfig() {
+                return hdmiCecConfig;
+            }
+        };
+
+        Looper looper = mTestLooper.getLooper();
+        mHdmiControlService.setIoLooper(looper);
+        mNativeWrapper = new FakeNativeWrapper();
+        HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper(
+                this.mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter());
+        mHdmiControlService.setCecController(hdmiCecController);
+        mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
+        mHdmiControlService.setMessageValidator(new HdmiCecMessageValidator(mHdmiControlService));
+        mHdmiControlService.initService();
+        mPhysicalAddress = 0x2000;
+        mNativeWrapper.setPhysicalAddress(mPhysicalAddress);
+        mPlaybackDevice = new HdmiCecLocalDevicePlayback(
+                mHdmiControlService);
+        mPlaybackDevice.init();
+        mLocalDevices.add(mPlaybackDevice);
+        mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
+        mDevicePowerStatusAction = DevicePowerStatusAction.create(mPlaybackDevice, ADDR_TV,
+                mCallbackMock);
+        mTestLooper.dispatchAll();
+    }
+
+    @Test
+    public void queryDisplayStatus_sendsRequestAndHandlesResponse() throws Exception {
+        mPlaybackDevice.addAndStartAction(mDevicePowerStatusAction);
+        mTestLooper.dispatchAll();
+
+        HdmiCecMessage expected = HdmiCecMessageBuilder.buildGiveDevicePowerStatus(
+                mPlaybackDevice.mAddress, ADDR_TV);
+        assertThat(mNativeWrapper.getResultMessages()).contains(expected);
+
+        HdmiCecMessage response = HdmiCecMessageBuilder.buildReportPowerStatus(
+                ADDR_TV, mPlaybackDevice.mAddress, HdmiControlManager.POWER_STATUS_STANDBY);
+        mNativeWrapper.onCecMessage(response);
+        mTestLooper.dispatchAll();
+
+        verify(mCallbackMock).onComplete(HdmiControlManager.POWER_STATUS_STANDBY);
+    }
+
+    @Test
+    public void queryDisplayStatus_sendsRequest_nack() throws Exception {
+        mNativeWrapper.setMessageSendResult(Constants.MESSAGE_GIVE_DEVICE_POWER_STATUS,
+                SendMessageResult.NACK);
+
+        mPlaybackDevice.addAndStartAction(mDevicePowerStatusAction);
+        mTestLooper.dispatchAll();
+
+        verify(mCallbackMock).onComplete(HdmiControlManager.POWER_STATUS_UNKNOWN);
+    }
+
+    @Test
+    public void queryDisplayStatus_sendsRequest_timeout_retriesSuccessfully() throws Exception {
+        mPlaybackDevice.addAndStartAction(mDevicePowerStatusAction);
+
+        HdmiCecMessage expected = HdmiCecMessageBuilder.buildGiveDevicePowerStatus(
+                mPlaybackDevice.mAddress, ADDR_TV);
+        mTestLooper.dispatchAll();
+
+        assertThat(mNativeWrapper.getResultMessages()).contains(expected);
+        mNativeWrapper.clearResultMessages();
+        mTestLooper.moveTimeForward(TIMEOUT_MS);
+        mTestLooper.dispatchAll();
+
+        assertThat(mNativeWrapper.getResultMessages()).contains(expected);
+
+        HdmiCecMessage response = HdmiCecMessageBuilder.buildReportPowerStatus(
+                ADDR_TV, mPlaybackDevice.mAddress, HdmiControlManager.POWER_STATUS_STANDBY);
+        mNativeWrapper.onCecMessage(response);
+        mTestLooper.dispatchAll();
+
+        verify(mCallbackMock).onComplete(HdmiControlManager.POWER_STATUS_STANDBY);
+    }
+
+    @Test
+    public void queryDisplayStatus_sendsRequest_timeout_retriesFailure() throws Exception {
+        mPlaybackDevice.addAndStartAction(mDevicePowerStatusAction);
+        mTestLooper.dispatchAll();
+
+        HdmiCecMessage expected = HdmiCecMessageBuilder.buildGiveDevicePowerStatus(
+                mPlaybackDevice.mAddress, ADDR_TV);
+        assertThat(mNativeWrapper.getResultMessages()).contains(expected);
+        mNativeWrapper.clearResultMessages();
+        mTestLooper.moveTimeForward(TIMEOUT_MS);
+        mTestLooper.dispatchAll();
+
+        assertThat(mNativeWrapper.getResultMessages()).contains(expected);
+        mNativeWrapper.clearResultMessages();
+        mTestLooper.moveTimeForward(TIMEOUT_MS);
+        mTestLooper.dispatchAll();
+
+        verify(mCallbackMock).onComplete(HdmiControlManager.POWER_STATUS_UNKNOWN);
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java b/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java
index 227e8c7..e5bcedb 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java
@@ -77,6 +77,15 @@
                     + "    </allowed-values>"
                     + "    <default-value int-value=\"1\" />"
                     + "  </setting>"
+                    + "  <setting name=\"hdmi_cec_enabled\""
+                    + "           value-type=\"int\""
+                    + "           user-configurable=\"true\">"
+                    + "    <allowed-values>"
+                    + "      <value int-value=\"0\" />"
+                    + "      <value int-value=\"1\" />"
+                    + "    </allowed-values>"
+                    + "    <default-value int-value=\"1\" />"
+                    + "  </setting>"
                     + "</cec-settings>";
 
     FakeHdmiCecConfig(@NonNull Context context) {
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
index 42f88dc..2f2e97c 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
@@ -30,6 +30,8 @@
 import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED;
 
 import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
 
 import android.content.Context;
 import android.hardware.hdmi.HdmiControlManager;
@@ -257,4 +259,19 @@
         mTestLooper.dispatchAll();
         assertEquals(ADDR_UNREGISTERED, mLogicalAddress);
     }
+
+    @Test
+    public void testIsLanguage() {
+        assertTrue(HdmiCecController.isLanguage("en"));
+        assertTrue(HdmiCecController.isLanguage("eng"));
+        assertTrue(HdmiCecController.isLanguage("ger"));
+        assertTrue(HdmiCecController.isLanguage("zh"));
+        assertTrue(HdmiCecController.isLanguage("zhi"));
+        assertTrue(HdmiCecController.isLanguage("zho"));
+
+        assertFalse(HdmiCecController.isLanguage(null));
+        assertFalse(HdmiCecController.isLanguage(""));
+        assertFalse(HdmiCecController.isLanguage("e"));
+        assertFalse(HdmiCecController.isLanguage("一")); // language code must be ASCII
+    }
 }
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 f7d52b6..7aea4ff 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
@@ -1334,4 +1334,31 @@
         assertThat(mNativeWrapper.getResultMessages()).contains(userControlReleased);
         assertThat(mStandby).isFalse();
     }
+
+    @Test
+    public void shouldHandleTvPowerKey_CecDisabled() {
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setIntValue(
+                HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
+                HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
+        assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isFalse();
+    }
+
+    @Test
+    public void shouldHandleTvPowerKey_PowerControlModeNone() {
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
+                HdmiControlManager.POWER_CONTROL_MODE_NONE);
+        assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isFalse();
+    }
+
+    @Test
+    public void shouldHandleTvPowerKey_CecEnabled_PowerControlModeTv() {
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setIntValue(
+                HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
+                HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
+                HdmiControlManager.POWER_CONTROL_MODE_TV);
+        assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isTrue();
+    }
 }
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 d24b376..81f55d8 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
@@ -192,4 +192,15 @@
         assertThat(mHdmiControlService.getActiveSource().getPhysicalAddress()).isEqualTo(
                 externalDevice.getPhysicalAddress());
     }
+
+    @Test
+    public void shouldHandleTvPowerKey_CecEnabled_PowerControlModeTv() {
+        mHdmiCecLocalDeviceTv.mService.getHdmiCecConfig().setIntValue(
+                HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
+                HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
+        mHdmiCecLocalDeviceTv.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
+                HdmiControlManager.POWER_CONTROL_MODE_TV);
+        assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isFalse();
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/location/timezone/ControllerImplTest.java b/services/tests/servicestests/src/com/android/server/location/timezone/ControllerImplTest.java
index 00cef8f..dc81237 100644
--- a/services/tests/servicestests/src/com/android/server/location/timezone/ControllerImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/location/timezone/ControllerImplTest.java
@@ -15,17 +15,16 @@
  */
 package com.android.server.location.timezone;
 
-import static com.android.internal.location.timezone.LocationTimeZoneEvent.EVENT_TYPE_PERMANENT_FAILURE;
-import static com.android.internal.location.timezone.LocationTimeZoneEvent.EVENT_TYPE_SUCCESS;
-import static com.android.internal.location.timezone.LocationTimeZoneEvent.EVENT_TYPE_UNCERTAIN;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_DISABLED;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_ENABLED_CERTAIN;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_ENABLED_INITIALIZING;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_ENABLED_UNCERTAIN;
 import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_PERM_FAILED;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_CERTAIN;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_INITIALIZING;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_UNCERTAIN;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STOPPED;
 import static com.android.server.location.timezone.TestSupport.USER1_CONFIG_GEO_DETECTION_DISABLED;
 import static com.android.server.location.timezone.TestSupport.USER1_CONFIG_GEO_DETECTION_ENABLED;
 import static com.android.server.location.timezone.TestSupport.USER2_CONFIG_GEO_DETECTION_ENABLED;
+import static com.android.server.location.timezone.TimeZoneProviderEvent.createPermanentFailureEvent;
+import static com.android.server.location.timezone.TimeZoneProviderEvent.createUncertainEvent;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -37,9 +36,9 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.platform.test.annotations.Presubmit;
+import android.service.timezone.TimeZoneProviderSuggestion;
 import android.util.IndentingPrintWriter;
 
-import com.android.internal.location.timezone.LocationTimeZoneEvent;
 import com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.ProviderStateEnum;
 import com.android.server.timezonedetector.ConfigurationInternal;
 import com.android.server.timezonedetector.GeolocationTimeZoneSuggestion;
@@ -61,14 +60,14 @@
 
     private static final long ARBITRARY_TIME_MILLIS = 12345L;
 
-    private static final LocationTimeZoneEvent USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1 =
-            createLocationTimeZoneEvent(EVENT_TYPE_SUCCESS, asList("Europe/London"));
-    private static final LocationTimeZoneEvent USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2 =
-            createLocationTimeZoneEvent(EVENT_TYPE_SUCCESS, asList("Europe/Paris"));
-    private static final LocationTimeZoneEvent USER1_UNCERTAIN_LOCATION_TIME_ZONE_EVENT =
-            createLocationTimeZoneEvent(EVENT_TYPE_UNCERTAIN, null);
-    private static final LocationTimeZoneEvent USER1_PERM_FAILURE_LOCATION_TIME_ZONE_EVENT =
-            createLocationTimeZoneEvent(EVENT_TYPE_PERMANENT_FAILURE, null);
+    private static final TimeZoneProviderEvent USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1 =
+            createSuggestionEvent(asList("Europe/London"));
+    private static final TimeZoneProviderEvent USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2 =
+            createSuggestionEvent(asList("Europe/Paris"));
+    private static final TimeZoneProviderEvent USER1_UNCERTAIN_LOCATION_TIME_ZONE_EVENT =
+            createUncertainEvent();
+    private static final TimeZoneProviderEvent USER1_PERM_FAILURE_LOCATION_TIME_ZONE_EVENT =
+            createPermanentFailureEvent("Test");
 
     private TestThreadingDomain mTestThreadingDomain;
     private TestCallback mTestCallback;
@@ -89,7 +88,7 @@
     }
 
     @Test
-    public void initialState_enabled() {
+    public void initialState_started() {
         ControllerImpl controllerImpl = new ControllerImpl(mTestThreadingDomain,
                 mTestPrimaryLocationTimeZoneProvider, mTestSecondaryLocationTimeZoneProvider);
         TestEnvironment testEnvironment = new TestEnvironment(
@@ -98,16 +97,16 @@
                 .plus(testEnvironment.getProviderInitializationTimeoutFuzz());
 
         // Initialize. After initialization the providers must be initialized and one should be
-        // enabled.
+        // started.
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertInitialized();
         mTestSecondaryLocationTimeZoneProvider.assertInitialized();
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestPrimaryLocationTimeZoneProvider.assertInitializationTimeoutSet(expectedInitTimeout);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
@@ -120,14 +119,14 @@
                 mTestThreadingDomain, controllerImpl, USER1_CONFIG_GEO_DETECTION_DISABLED);
 
         // Initialize. After initialization the providers must be initialized but neither should be
-        // enabled.
+        // started.
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertInitialized();
         mTestSecondaryLocationTimeZoneProvider.assertInitialized();
 
-        mTestPrimaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+        mTestPrimaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
@@ -143,8 +142,8 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
@@ -152,11 +151,11 @@
         mTestThreadingDomain.executeNext();
 
         // The primary should have reported uncertainty, which should trigger the controller to
-        // start the uncertainty timeout and enable the secondary.
+        // start the uncertainty timeout and start the secondary.
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
 
@@ -167,9 +166,9 @@
         // Now both initialization timeouts should have triggered. The uncertainty timeout should
         // still not be triggered.
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
 
@@ -178,9 +177,9 @@
         mTestThreadingDomain.executeNext();
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertUncertainSuggestionMadeAndCommit();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
@@ -196,21 +195,21 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate a location event being received from the primary provider. This should cause a
         // suggestion to be made.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
 
@@ -225,8 +224,8 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
@@ -234,22 +233,22 @@
         mTestThreadingDomain.executeNext();
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
 
         // Simulate a location event being received from the primary provider. This should cause a
         // suggestion to be made and the secondary to be shut down.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
 
@@ -264,8 +263,8 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
@@ -273,23 +272,23 @@
         mTestThreadingDomain.executeNext();
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
 
         // Simulate a location event being received from the secondary provider. This should cause a
         // suggestion to be made.
-        mTestSecondaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestSecondaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
 
@@ -304,42 +303,42 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate a location event being received from the primary provider. This should cause a
         // suggestion to be made.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // A second, identical event should not cause another suggestion.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // And a third, different event should cause another suggestion.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
 
@@ -354,8 +353,8 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
@@ -363,46 +362,46 @@
         mTestThreadingDomain.executeNext();
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
 
         // Simulate a location event being received from the secondary provider. This should cause a
         // suggestion to be made.
-        mTestSecondaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestSecondaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // A second, identical event should not cause another suggestion.
-        mTestSecondaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestSecondaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // And a third, different event should cause another suggestion.
-        mTestSecondaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestSecondaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
 
@@ -417,60 +416,60 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate a location event being received from the primary provider. This should cause a
         // suggestion to be made and ensure the primary is considered initialized.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate an uncertain event being received from the primary provider. This should not
         // cause a suggestion to be made straight away, but the uncertainty timeout should be
-        // started and the secondary should be enabled.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        // started and the secondary should be started.
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_UNCERTAIN_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
 
         // Simulate a location event being received from the secondary provider. This should cause a
         // suggestion to be made, cancel the uncertainty timeout and ensure the secondary is
         // considered initialized.
-        mTestSecondaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestSecondaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate an uncertain event being received from the secondary provider. This should not
         // cause a suggestion to be made straight away, but the uncertainty timeout should be
-        // started. Both providers are now enabled, with no initialization timeout set.
-        mTestSecondaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        // started. Both providers are now started, with no initialization timeout set.
+        mTestSecondaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_UNCERTAIN_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
 
@@ -479,9 +478,9 @@
         mTestThreadingDomain.executeNext();
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertUncertainSuggestionMadeAndCommit();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
@@ -497,46 +496,46 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate a location event being received from the primary provider. This should cause a
         // suggestion to be made.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Uncertainty should not cause a suggestion to be made straight away, but the uncertainty
-        // timeout should be started and the secondary should be enabled.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        // timeout should be started and the secondary should be started.
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_UNCERTAIN_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
 
         // And a success event from the primary provider should cause the controller to make another
         // suggestion, the uncertainty timeout should be cancelled and the secondary should be
-        // disabled again.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        // stopped again.
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
 
@@ -550,8 +549,8 @@
         // Initialize and check initial state.
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
-        mTestPrimaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+        mTestPrimaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
@@ -559,16 +558,16 @@
         testEnvironment.simulateConfigChange(USER1_CONFIG_GEO_DETECTION_ENABLED);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Now signal a config change so that geo detection is disabled.
         testEnvironment.simulateConfigChange(USER1_CONFIG_GEO_DETECTION_DISABLED);
 
-        mTestPrimaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+        mTestPrimaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
@@ -583,8 +582,8 @@
         // Initialize and check initial state.
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
-        mTestPrimaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+        mTestPrimaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
@@ -592,20 +591,20 @@
         testEnvironment.simulateConfigChange(USER1_CONFIG_GEO_DETECTION_ENABLED);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate a success event being received from the primary provider.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Now signal a config change so that geo detection is disabled.
@@ -614,8 +613,8 @@
         // of the time zone.
         testEnvironment.simulateConfigChange(USER1_CONFIG_GEO_DETECTION_DISABLED);
 
-        mTestPrimaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+        mTestPrimaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertUncertainSuggestionMadeAndCommit();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
@@ -631,35 +630,35 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate the primary provider suggesting a time zone.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1);
 
         // Receiving a "success" provider event should cause a suggestion to be made synchronously,
         // and also clear the scheduled uncertainty suggestion.
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT1.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate the user change (but geo detection still enabled).
         testEnvironment.simulateConfigChange(USER2_CONFIG_GEO_DETECTION_ENABLED);
 
-        // We expect the provider to end up in PROVIDER_STATE_ENABLED, but it should have been
-        // disabled when the user changed.
+        // We expect the provider to end up in PROVIDER_STATE_STARTED_INITIALIZING, but it should
+        // have been stopped when the user changed.
         int[] expectedStateTransitions =
-                { PROVIDER_STATE_DISABLED, PROVIDER_STATE_ENABLED_INITIALIZING };
+                { PROVIDER_STATE_STOPPED, PROVIDER_STATE_STARTED_INITIALIZING };
         mTestPrimaryLocationTimeZoneProvider.assertStateChangesAndCommit(expectedStateTransitions);
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfig(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER2_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER2_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
 
@@ -674,51 +673,51 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate a failure location event being received from the primary provider. This should
-        // cause the secondary to be enabled.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        // cause the secondary to be started.
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_PERM_FAILURE_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate uncertainty from the secondary.
-        mTestSecondaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestSecondaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_UNCERTAIN_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
 
         // And a success event from the secondary provider should cause the controller to make
         // another suggestion, the uncertainty timeout should be cancelled.
-        mTestSecondaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestSecondaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2);
 
         mTestPrimaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate uncertainty from the secondary.
-        mTestSecondaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestSecondaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_UNCERTAIN_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
     }
@@ -734,19 +733,19 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate a failure location event being received from the primary provider. This should
-        // cause the secondary to be enabled.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        // cause the secondary to be started.
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_PERM_FAILURE_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
@@ -754,7 +753,7 @@
         testEnvironment.simulateConfigChange(USER1_CONFIG_GEO_DETECTION_DISABLED);
 
         mTestPrimaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
@@ -763,7 +762,7 @@
 
         mTestPrimaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
     }
@@ -779,52 +778,52 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
-        // Simulate an uncertain event from the primary. This will enable the secondary, which will
+        // Simulate an uncertain event from the primary. This will start the secondary, which will
         // give this test the opportunity to simulate its failure. Then it will be possible to
         // demonstrate controller behavior with only the primary working.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_UNCERTAIN_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
 
         // Simulate failure event from the secondary. This should just affect the secondary's state.
-        mTestSecondaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestSecondaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_PERM_FAILURE_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
 
         // And a success event from the primary provider should cause the controller to make
         // a suggestion, the uncertainty timeout should be cancelled.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_CERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
         mTestCallback.assertSuggestionMadeAndCommit(
-                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2.getTimeZoneIds());
+                USER1_SUCCESS_LOCATION_TIME_ZONE_EVENT2.getSuggestion().getTimeZoneIds());
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
-        // Simulate uncertainty from the primary. The secondary cannot be enabled.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        // Simulate uncertainty from the primary. The secondary cannot be started.
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_UNCERTAIN_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
@@ -841,30 +840,30 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
-        // Simulate an uncertain event from the primary. This will enable the secondary, which will
+        // Simulate an uncertain event from the primary. This will start the secondary, which will
         // give this test the opportunity to simulate its failure. Then it will be possible to
         // demonstrate controller behavior with only the primary working.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_UNCERTAIN_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
 
         // Simulate failure event from the secondary. This should just affect the secondary's state.
-        mTestSecondaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestSecondaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_PERM_FAILURE_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_UNCERTAIN, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertUncertaintyTimeoutSet(testEnvironment, controllerImpl);
@@ -872,17 +871,17 @@
         // Now signal a config change so that geo detection is disabled.
         testEnvironment.simulateConfigChange(USER1_CONFIG_GEO_DETECTION_DISABLED);
 
-        mTestPrimaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+        mTestPrimaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestSecondaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Now signal a config change so that geo detection is enabled. Only the primary can be
-        // enabled.
+        // started.
         testEnvironment.simulateConfigChange(USER1_CONFIG_GEO_DETECTION_ENABLED);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestSecondaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
@@ -899,23 +898,23 @@
         controllerImpl.initialize(testEnvironment, mTestCallback);
 
         mTestPrimaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
-        mTestSecondaryLocationTimeZoneProvider.assertIsDisabledAndCommit();
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+        mTestSecondaryLocationTimeZoneProvider.assertIsStoppedAndCommit();
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
-        // Simulate a failure event from the primary. This will enable the secondary.
-        mTestPrimaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        // Simulate a failure event from the primary. This will start the secondary.
+        mTestPrimaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_PERM_FAILURE_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
         mTestSecondaryLocationTimeZoneProvider.assertStateEnumAndConfigAndCommit(
-                PROVIDER_STATE_ENABLED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
+                PROVIDER_STATE_STARTED_INITIALIZING, USER1_CONFIG_GEO_DETECTION_ENABLED);
         mTestCallback.assertNoSuggestionMade();
         assertFalse(controllerImpl.isUncertaintyTimeoutSet());
 
         // Simulate failure event from the secondary.
-        mTestSecondaryLocationTimeZoneProvider.simulateLocationTimeZoneEvent(
+        mTestSecondaryLocationTimeZoneProvider.simulateTimeZoneProviderEvent(
                 USER1_PERM_FAILURE_LOCATION_TIME_ZONE_EVENT);
 
         mTestPrimaryLocationTimeZoneProvider.assertIsPermFailedAndCommit();
@@ -932,18 +931,14 @@
                 controller.getUncertaintyTimeoutDelayMillis());
     }
 
-    private static LocationTimeZoneEvent createLocationTimeZoneEvent(
-            int eventType, @Nullable List<String> timeZoneIds) {
-        LocationTimeZoneEvent.Builder builder = new LocationTimeZoneEvent.Builder()
-                .setElapsedRealtimeMillis(ARBITRARY_TIME_MILLIS)
-                .setEventType(eventType);
-        if (timeZoneIds != null) {
-            builder.setTimeZoneIds(timeZoneIds);
-        }
-        return builder.build();
+    private static TimeZoneProviderEvent createSuggestionEvent(@NonNull List<String> timeZoneIds) {
+        return TimeZoneProviderEvent.createSuggestionEvent(
+                new TimeZoneProviderSuggestion.Builder()
+                        .setElapsedRealtimeMillis(ARBITRARY_TIME_MILLIS)
+                        .setTimeZoneIds(timeZoneIds)
+                        .build());
     }
 
-
     private static class TestEnvironment extends LocationTimeZoneProviderController.Environment {
 
         // These timeouts are set deliberately so that:
@@ -1048,12 +1043,12 @@
         }
 
         @Override
-        void onEnable(Duration initializationTimeout) {
+        void onStartUpdates(Duration initializationTimeout) {
             // Nothing needed for tests.
         }
 
         @Override
-        void onDisable() {
+        void onStopUpdates() {
             // Nothing needed for tests.
         }
 
@@ -1078,9 +1073,9 @@
             mTestProviderState.commitLatest();
         }
 
-        void assertIsDisabledAndCommit() {
-            // A disabled provider doesn't hold config.
-            assertStateEnumAndConfig(PROVIDER_STATE_DISABLED, null /* config */);
+        void assertIsStoppedAndCommit() {
+            // A stopped provider doesn't hold config.
+            assertStateEnumAndConfig(PROVIDER_STATE_STOPPED, null /* config */);
             mTestProviderState.commitLatest();
         }
 
@@ -1107,7 +1102,7 @@
 
             // If and only if the controller is initializing, the initialization timeout must be
             // set.
-            assertEquals(expectedStateEnum == PROVIDER_STATE_ENABLED_INITIALIZING,
+            assertEquals(expectedStateEnum == PROVIDER_STATE_STARTED_INITIALIZING,
                     isInitializationTimeoutSet());
 
             assertConfig(expectedConfig);
@@ -1123,8 +1118,8 @@
             assertEquals(expectedTimeout, getInitializationTimeoutDelay());
         }
 
-        void simulateLocationTimeZoneEvent(@NonNull LocationTimeZoneEvent event) {
-            handleLocationTimeZoneEvent(event);
+        void simulateTimeZoneProviderEvent(@NonNull TimeZoneProviderEvent event) {
+            handleTimeZoneProviderEvent(event);
         }
 
         /**
diff --git a/services/tests/servicestests/src/com/android/server/location/timezone/NullLocationTimeZoneProviderTest.java b/services/tests/servicestests/src/com/android/server/location/timezone/NullLocationTimeZoneProviderTest.java
index 5403a65..e4a3ebd 100644
--- a/services/tests/servicestests/src/com/android/server/location/timezone/NullLocationTimeZoneProviderTest.java
+++ b/services/tests/servicestests/src/com/android/server/location/timezone/NullLocationTimeZoneProviderTest.java
@@ -15,9 +15,9 @@
  */
 package com.android.server.location.timezone;
 
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_DISABLED;
-import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_ENABLED_INITIALIZING;
 import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_PERM_FAILED;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_INITIALIZING;
+import static com.android.server.location.timezone.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STOPPED;
 import static com.android.server.location.timezone.TestSupport.USER1_CONFIG_GEO_DETECTION_ENABLED;
 
 import static org.junit.Assert.assertEquals;
@@ -61,14 +61,14 @@
         provider.initialize(providerState -> mTestController.onProviderStateChange(providerState));
 
         ProviderState currentState = provider.getCurrentState();
-        assertEquals(PROVIDER_STATE_DISABLED, currentState.stateEnum);
+        assertEquals(PROVIDER_STATE_STOPPED, currentState.stateEnum);
         assertNull(currentState.currentUserConfiguration);
         assertSame(provider, currentState.provider);
         mTestThreadingDomain.assertQueueEmpty();
     }
 
     @Test
-    public void enableSchedulesPermFailure() {
+    public void startSchedulesPermFailure() {
         String providerName = "primary";
         NullLocationTimeZoneProvider provider =
                 new NullLocationTimeZoneProvider(mTestThreadingDomain, providerName);
@@ -77,13 +77,14 @@
         ConfigurationInternal config = USER1_CONFIG_GEO_DETECTION_ENABLED;
         Duration arbitraryInitializationTimeout = Duration.ofMinutes(5);
         Duration arbitraryInitializationTimeoutFuzz = Duration.ofMinutes(2);
-        provider.enable(config, arbitraryInitializationTimeout, arbitraryInitializationTimeoutFuzz);
+        provider.startUpdates(config, arbitraryInitializationTimeout,
+                arbitraryInitializationTimeoutFuzz);
 
         // The NullProvider should enter the enabled state, but have schedule an immediate runnable
         // to switch to perm failure.
         ProviderState currentState = provider.getCurrentState();
         assertSame(provider, currentState.provider);
-        assertEquals(PROVIDER_STATE_ENABLED_INITIALIZING, currentState.stateEnum);
+        assertEquals(PROVIDER_STATE_STARTED_INITIALIZING, currentState.stateEnum);
         assertEquals(config, currentState.currentUserConfiguration);
         mTestThreadingDomain.assertNextQueueItemIsImmediate();
         // Entering enabled() does not trigger an onProviderStateChanged() as it is requested by the
diff --git a/services/tests/servicestests/src/com/android/server/pm/StagingManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/StagingManagerTest.java
index 4870c9e..79935c2 100644
--- a/services/tests/servicestests/src/com/android/server/pm/StagingManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/StagingManagerTest.java
@@ -33,8 +33,11 @@
 import org.mockito.MockitoAnnotations;
 
 import java.io.File;
+import java.util.function.Predicate;
 
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
@@ -70,8 +73,8 @@
     public void checkNonOverlappingWithStagedSessions_laterSessionShouldNotFailEarlierOnes()
             throws Exception {
         // Create 2 sessions with overlapping packages
-        PackageInstallerSession session1 = createSession(111, "com.foo", 1);
-        PackageInstallerSession session2 = createSession(222, "com.foo", 2);
+        StagingManager.StagedSession session1 = createSession(111, "com.foo", 1);
+        StagingManager.StagedSession session2 = createSession(222, "com.foo", 2);
 
         mStagingManager.createSession(session1);
         mStagingManager.createSession(session2);
@@ -82,7 +85,7 @@
                 () -> mStagingManager.checkNonOverlappingWithStagedSessions(session2));
     }
 
-    private PackageInstallerSession createSession(int sessionId, String packageName,
+    private StagingManager.StagedSession createSession(int sessionId, String packageName,
             long committedMillis) {
         PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
                 PackageInstaller.SessionParams.MODE_FULL_INSTALL);
@@ -121,8 +124,12 @@
                 /* stagedSessionErrorCode */ PackageInstaller.SessionInfo.STAGED_SESSION_NO_ERROR,
                 /* stagedSessionErrorMessage */ "no error");
 
-        session = spy(session);
-        doReturn(packageName).when(session).getPackageName();
-        return session;
+        StagingManager.StagedSession stagedSession = spy(session.mStagedSession);
+        doReturn(packageName).when(stagedSession).getPackageName();
+        doAnswer(invocation -> {
+            Predicate<StagingManager.StagedSession> filter = invocation.getArgument(0);
+            return filter.test(stagedSession);
+        }).when(stagedSession).sessionContains(any());
+        return stagedSession;
     }
 }
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 035a2f1..b07b8fa 100644
--- a/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java
@@ -21,6 +21,7 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doThrow;
@@ -33,6 +34,7 @@
 
 import android.content.Context;
 import android.content.IntentSender;
+import android.content.pm.PackageManager;
 import android.os.Handler;
 import android.os.IPowerManager;
 import android.os.IRecoverySystemProgressListener;
@@ -67,6 +69,9 @@
     private FileWriter mUncryptUpdateFileWriter;
     private LockSettingsInternal mLockSettingsInternal;
 
+    private static final String FAKE_OTA_PACKAGE_NAME = "fake.ota.package";
+    private static final String FAKE_OTHER_PACKAGE_NAME = "fake.other.package";
+
     @Before
     public void setup() {
         mContext = mock(Context.class);
@@ -209,65 +214,99 @@
 
     @Test(expected = SecurityException.class)
     public void requestLskf_protected() {
-        doThrow(SecurityException.class).when(mContext).enforceCallingOrSelfPermission(
-                eq(android.Manifest.permission.RECOVERY), any());
-        mRecoverySystemService.requestLskf("test", null);
-    }
-
-
-    @Test
-    public void requestLskf_nullToken_failure() {
-        assertThat(mRecoverySystemService.requestLskf(null, null), is(false));
+        when(mContext.checkCallingOrSelfPermission(anyString())).thenReturn(
+                PackageManager.PERMISSION_DENIED);
+        mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null);
     }
 
     @Test
     public void requestLskf_success() throws Exception {
         IntentSender intentSender = mock(IntentSender.class);
-        assertThat(mRecoverySystemService.requestLskf("test", intentSender), is(true));
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+                is(true));
         mRecoverySystemService.onPreparedForReboot(true);
         verify(intentSender).sendIntent(any(), anyInt(), any(), any(), any());
     }
 
     @Test
-    public void requestLskf_subsequentRequestClearsPrepared() throws Exception {
+    public void requestLskf_subsequentRequestNotClearPrepared() throws Exception {
         IntentSender intentSender = mock(IntentSender.class);
-        assertThat(mRecoverySystemService.requestLskf("test", intentSender), is(true));
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+                is(true));
         mRecoverySystemService.onPreparedForReboot(true);
         verify(intentSender).sendIntent(any(), anyInt(), any(), any(), any());
 
-        assertThat(mRecoverySystemService.requestLskf("test2", null), is(true));
-        assertThat(mRecoverySystemService.rebootWithLskf("test", null), is(false));
-        assertThat(mRecoverySystemService.rebootWithLskf("test2", "foobar"), is(false));
-
-        mRecoverySystemService.onPreparedForReboot(true);
-        assertThat(mRecoverySystemService.rebootWithLskf("test2", "foobar"), is(true));
-        verify(intentSender).sendIntent(any(), anyInt(), any(), any(), any());
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null), is(true));
+        assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "foobar", true),
+                is(true));
         verify(mIPowerManager).reboot(anyBoolean(), eq("foobar"), anyBoolean());
     }
 
-
     @Test
     public void requestLskf_requestedButNotPrepared() throws Exception {
         IntentSender intentSender = mock(IntentSender.class);
-        assertThat(mRecoverySystemService.requestLskf("test", intentSender), is(true));
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+                is(true));
         verify(intentSender, never()).sendIntent(any(), anyInt(), any(), any(), any());
     }
 
+    @Test
+    public void isLskfCaptured_requestedButNotPrepared() throws Exception {
+        IntentSender intentSender = mock(IntentSender.class);
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+                is(true));
+        assertThat(mRecoverySystemService.isLskfCaptured(FAKE_OTA_PACKAGE_NAME), is(false));
+    }
+
+    @Test
+    public void isLskfCaptured_Prepared() throws Exception {
+        IntentSender intentSender = mock(IntentSender.class);
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+                is(true));
+        mRecoverySystemService.onPreparedForReboot(true);
+        verify(intentSender).sendIntent(any(), anyInt(), any(), any(), any());
+        assertThat(mRecoverySystemService.isLskfCaptured(FAKE_OTA_PACKAGE_NAME), is(true));
+    }
+
     @Test(expected = SecurityException.class)
     public void clearLskf_protected() {
-        doThrow(SecurityException.class).when(mContext).enforceCallingOrSelfPermission(
-                eq(android.Manifest.permission.RECOVERY), any());
-        mRecoverySystemService.clearLskf();
+        when(mContext.checkCallingOrSelfPermission(anyString())).thenReturn(
+                PackageManager.PERMISSION_DENIED);
+        mRecoverySystemService.clearLskf(FAKE_OTA_PACKAGE_NAME);
     }
 
     @Test
     public void clearLskf_requestedThenCleared() throws Exception {
         IntentSender intentSender = mock(IntentSender.class);
-        assertThat(mRecoverySystemService.requestLskf("test", intentSender), is(true));
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+                is(true));
         mRecoverySystemService.onPreparedForReboot(true);
         verify(intentSender).sendIntent(any(), anyInt(), any(), any(), any());
 
-        assertThat(mRecoverySystemService.clearLskf(), is(true));
+        assertThat(mRecoverySystemService.clearLskf(FAKE_OTA_PACKAGE_NAME), is(true));
+        verify(mLockSettingsInternal).clearRebootEscrow();
+    }
+
+    @Test
+    public void clearLskf_callerNotRequested_Success() throws Exception {
+        IntentSender intentSender = mock(IntentSender.class);
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+                is(true));
+        assertThat(mRecoverySystemService.clearLskf(FAKE_OTHER_PACKAGE_NAME), is(true));
+        verify(mLockSettingsInternal, never()).clearRebootEscrow();
+    }
+
+    @Test
+    public void clearLskf_multiClient_BothClientsClear() throws Exception {
+        IntentSender intentSender = mock(IntentSender.class);
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+                is(true));
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTHER_PACKAGE_NAME, intentSender),
+                is(true));
+
+        assertThat(mRecoverySystemService.clearLskf(FAKE_OTA_PACKAGE_NAME), is(true));
+        verify(mLockSettingsInternal, never()).clearRebootEscrow();
+        assertThat(mRecoverySystemService.clearLskf(FAKE_OTHER_PACKAGE_NAME), is(true));
         verify(mLockSettingsInternal).clearRebootEscrow();
     }
 
@@ -279,27 +318,84 @@
 
     @Test(expected = SecurityException.class)
     public void rebootWithLskf_protected() {
-        doThrow(SecurityException.class).when(mContext).enforceCallingOrSelfPermission(
-                eq(android.Manifest.permission.RECOVERY), any());
-        mRecoverySystemService.rebootWithLskf("test1", null);
+        when(mContext.checkCallingOrSelfPermission(anyString())).thenReturn(
+                PackageManager.PERMISSION_DENIED);
+        mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true);
     }
 
     @Test
     public void rebootWithLskf_Success() throws Exception {
-        assertThat(mRecoverySystemService.requestLskf("test", null), is(true));
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null), is(true));
         mRecoverySystemService.onPreparedForReboot(true);
-        assertThat(mRecoverySystemService.rebootWithLskf("test", "ab-update"), is(true));
+        assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "ab-update", true),
+                is(true));
         verify(mIPowerManager).reboot(anyBoolean(), eq("ab-update"), anyBoolean());
     }
 
     @Test
     public void rebootWithLskf_withoutPrepare_Failure() throws Exception {
-        assertThat(mRecoverySystemService.rebootWithLskf("test1", null), is(false));
+        assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true),
+                is(false));
     }
 
     @Test
-    public void rebootWithLskf_withNullUpdateToken_Failure() throws Exception {
-        assertThat(mRecoverySystemService.rebootWithLskf(null, null), is(false));
+    public void rebootWithLskf_withNullCallerId_Failure() throws Exception {
+        assertThat(mRecoverySystemService.rebootWithLskf(null, null, true), is(false));
         verifyNoMoreInteractions(mIPowerManager);
     }
+
+    @Test
+    public void rebootWithLskf_multiClient_ClientASuccess() throws Exception {
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null), is(true));
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTHER_PACKAGE_NAME, null), is(true));
+        mRecoverySystemService.onPreparedForReboot(true);
+
+        // Client B's clear won't affect client A's preparation.
+        assertThat(mRecoverySystemService.clearLskf(FAKE_OTHER_PACKAGE_NAME), is(true));
+        assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "ab-update", true),
+                is(true));
+        verify(mIPowerManager).reboot(anyBoolean(), eq("ab-update"), anyBoolean());
+    }
+
+
+    @Test
+    public void rebootWithLskf_multiClient_ClientBSuccess() throws Exception {
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null), is(true));
+        mRecoverySystemService.onPreparedForReboot(true);
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTHER_PACKAGE_NAME, null), is(true));
+
+        assertThat(mRecoverySystemService.clearLskf(FAKE_OTA_PACKAGE_NAME), is(true));
+        assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true),
+                is(false));
+        verifyNoMoreInteractions(mIPowerManager);
+
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTHER_PACKAGE_NAME, null), is(true));
+        assertThat(
+                mRecoverySystemService.rebootWithLskf(FAKE_OTHER_PACKAGE_NAME, "ab-update", true),
+                is(true));
+        verify(mIPowerManager).reboot(anyBoolean(), eq("ab-update"), anyBoolean());
+    }
+
+    @Test
+    public void rebootWithLskf_multiClient_BothClientsClear_Failure() throws Exception {
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null), is(true));
+        mRecoverySystemService.onPreparedForReboot(true);
+        assertThat(mRecoverySystemService.requestLskf(FAKE_OTHER_PACKAGE_NAME, null), is(true));
+
+        // Client A clears
+        assertThat(mRecoverySystemService.clearLskf(FAKE_OTA_PACKAGE_NAME), is(true));
+        assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true),
+                is(false));
+        verifyNoMoreInteractions(mIPowerManager);
+
+        // Client B clears
+        assertThat(mRecoverySystemService.clearLskf(FAKE_OTHER_PACKAGE_NAME), is(true));
+        verify(mLockSettingsInternal).clearRebootEscrow();
+        assertThat(
+                mRecoverySystemService.rebootWithLskf(FAKE_OTHER_PACKAGE_NAME, "ab-update", true),
+                is(false));
+        verifyNoMoreInteractions(mIPowerManager);
+    }
+
+    // TODO(xunchang) add more multi client tests
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
index d34e2c4..285d887 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
@@ -98,7 +98,7 @@
         doReturn(mockLifecycleManager).when(mAtm).getLifecycleManager();
         doReturn(true).when(activity).checkEnterPictureInPictureState(anyString(), anyBoolean());
 
-        mAtm.requestPictureInPictureMode(activity.token);
+        mAtm.mActivityClientController.requestPictureInPictureMode(activity);
 
         verify(mockLifecycleManager).scheduleTransaction(mClientTransactionCaptor.capture());
         final ClientTransaction transaction = mClientTransactionCaptor.getValue();
@@ -117,7 +117,7 @@
         doReturn(false).when(activity).inPinnedWindowingMode();
         doReturn(false).when(activity).checkEnterPictureInPictureState(anyString(), anyBoolean());
 
-        mAtm.requestPictureInPictureMode(activity.token);
+        mAtm.mActivityClientController.requestPictureInPictureMode(activity);
 
         // Check enter no transactions with enter pip requests are made.
         verify(lifecycleManager, times(0)).scheduleTransaction(any());
@@ -130,7 +130,7 @@
         ClientLifecycleManager lifecycleManager = mAtm.getLifecycleManager();
         doReturn(true).when(activity).inPinnedWindowingMode();
 
-        mAtm.requestPictureInPictureMode(activity.token);
+        mAtm.mActivityClientController.requestPictureInPictureMode(activity);
 
         // Check that no transactions with enter pip requests are made.
         verify(lifecycleManager, times(0)).scheduleTransaction(any());
@@ -219,7 +219,7 @@
         //mock other operations
         doReturn(true).when(record)
                 .checkEnterPictureInPictureState("enterPictureInPictureMode", false);
-        doReturn(false).when(mAtm).isInPictureInPictureMode(any());
+        doReturn(false).when(record).inPinnedWindowingMode();
         doReturn(false).when(mAtm).isKeyguardLocked();
 
         //to simulate NPE
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 8e78dce..fb585ed 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java
@@ -22,6 +22,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
 import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
 import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
+import static android.view.WindowManager.LayoutParams.TYPE_POINTER;
 import static android.view.WindowManager.LayoutParams.TYPE_PRESENTATION;
 import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
 import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
@@ -669,6 +670,15 @@
         assertThat(token2.isDescendantOf(mGroupRoot2)).isTrue();
     }
 
+    @Test
+    public void testFeatureNotThrowArrayIndexOutOfBoundsException() {
+        final Feature feature1 = new Feature.Builder(mWms.mPolicy, "feature1",
+                FEATURE_VENDOR_FIRST + 5)
+                .all()
+                .except(TYPE_POINTER)
+                .build();
+    }
+
     private static Resources resourcesWithProvider(String provider) {
         Resources mock = mock(Resources.class);
         when(mock.getString(
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 3c82685..6b9993a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
@@ -79,6 +79,8 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.server.wm.TaskOrganizerController.PendingTaskEvent;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -149,10 +151,14 @@
         final ITaskOrganizer organizer = registerMockOrganizer();
         final Task stack = createStack();
         final Task task = createTask(stack);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
 
         verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
 
         stack.removeImmediately();
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         verify(organizer).onTaskVanished(any());
     }
 
@@ -161,15 +167,21 @@
         final ITaskOrganizer organizer = registerMockOrganizer();
         final Task stack = createStack();
         final Task task = createTask(stack, false);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
 
         verify(organizer, never())
                 .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
         stack.setHasBeenVisible(true);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         assertTrue(stack.getHasBeenVisible());
 
         verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
 
         stack.removeImmediately();
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         verify(organizer).onTaskVanished(any());
     }
 
@@ -194,12 +206,16 @@
         final ITaskOrganizer organizer = registerMockOrganizer();
         final Task stack = createStack();
         final Task task = createTask(stack, false /* fakeDraw */);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
 
         verify(organizer, never())
                 .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
         assertTrue(stack.isOrganized());
 
         mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         assertTaskVanished(organizer, false /* expectVanished */, stack);
         assertFalse(stack.isOrganized());
     }
@@ -209,11 +225,16 @@
         final ITaskOrganizer organizer = registerMockOrganizer();
         final Task stack = createStack();
         final Task task = createTask(stack);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
 
         verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
         assertTrue(stack.isOrganized());
 
         stack.setTaskOrganizer(null);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
+
         verify(organizer).onTaskVanished(any());
         assertFalse(stack.isOrganized());
     }
@@ -223,11 +244,16 @@
         final ITaskOrganizer organizer = registerMockOrganizer();
         final Task stack = createStack();
         final Task task = createTask(stack);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
 
         verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
         assertTrue(stack.isOrganized());
 
         mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
+
         assertTaskVanished(organizer, true /* expectVanished */, stack);
         assertFalse(stack.isOrganized());
     }
@@ -242,6 +268,8 @@
         final Task task3 = createTask(stack3);
         final ArrayList<TaskAppearedInfo> existingTasks = new ArrayList<>();
         final ITaskOrganizer organizer = registerMockOrganizer(existingTasks);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
 
         // verify that tasks are returned and taskAppeared is not called
         assertContainsTasks(existingTasks, stack, stack2, stack3);
@@ -253,6 +281,8 @@
         // Now we replace the registration and verify the new organizer receives existing tasks
         final ArrayList<TaskAppearedInfo> existingTasks2 = new ArrayList<>();
         final ITaskOrganizer organizer2 = registerMockOrganizer(existingTasks2);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         assertContainsTasks(existingTasks2, stack, stack2, stack3);
         verify(organizer2, times(0)).onTaskAppeared(any(RunningTaskInfo.class),
                 any(SurfaceControl.class));
@@ -264,6 +294,8 @@
         // Now we unregister the second one, the first one should automatically be reregistered
         // so we verify that it's now seeing changes.
         mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer2);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         verify(organizer, times(3))
                 .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
         assertTaskVanished(organizer2, true /* expectVanished */, stack, stack2, stack3);
@@ -855,6 +887,8 @@
                 .setAspectRatio(new Rational(3, 4)).build();
         mWm.mAtmService.mActivityClientController.setPictureInPictureParams(record.token, p2);
         waitUntilHandlersIdle();
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         assertNotNull(o.mChangedInfo);
         assertNotNull(o.mChangedInfo.pictureInPictureParams);
         final Rational ratio = o.mChangedInfo.pictureInPictureParams.getAspectRatioRational();
@@ -894,16 +928,24 @@
         stack.setTaskOrganizer(organizer);
         // setHasBeenVisible was already called once by the set-up code.
         stack.setHasBeenVisible(true);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         verify(organizer, times(1))
                 .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
 
         stack.setTaskOrganizer(null);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         verify(organizer, times(1)).onTaskVanished(any());
         stack.setTaskOrganizer(organizer);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         verify(organizer, times(2))
                 .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
 
         stack.removeImmediately();
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         verify(organizer, times(2)).onTaskVanished(any());
     }
 
@@ -922,6 +964,8 @@
 
         // Verify a back pressed does not call the organizer
         mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(activity.token);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         verify(organizer, never()).onBackPressedOnTaskRoot(any());
 
         // Enable intercepting back
@@ -930,6 +974,8 @@
 
         // Verify now that the back press does call the organizer
         mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(activity.token);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         verify(organizer, times(1)).onBackPressedOnTaskRoot(any());
 
         // Disable intercepting back
@@ -938,6 +984,8 @@
 
         // Verify now that the back press no longer calls the organizer
         mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(activity.token);
+        // Ensure events dispatch to organizer.
+        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
         verify(organizer, times(1)).onBackPressedOnTaskRoot(any());
     }
 
@@ -1018,6 +1066,151 @@
         assertTrue(task2.isOrganized());
     }
 
+    @Test
+    public void testAppearDeferThenInfoChange() {
+        final ITaskOrganizer organizer = registerMockOrganizer();
+        final Task stack = createStack();
+
+        // Assume layout defer
+        mWm.mWindowPlacerLocked.deferLayout();
+
+        final Task task = createTask(stack);
+        final ActivityRecord record = createActivityRecord(stack.mDisplayContent, task);
+
+        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+        record.setTaskDescription(new ActivityManager.TaskDescription("TestDescription"));
+        waitUntilHandlersIdle();
+
+        ArrayList<PendingTaskEvent> pendingEvents = getTaskPendingEvent(stack);
+        assertEquals(1, pendingEvents.size());
+        assertEquals(PendingTaskEvent.EVENT_APPEARED, pendingEvents.get(0).mEventType);
+        assertEquals("TestDescription",
+                pendingEvents.get(0).mTask.getTaskInfo().taskDescription.getLabel());
+    }
+
+    @Test
+    public void testAppearDeferThenVanish() {
+        final ITaskOrganizer organizer = registerMockOrganizer();
+        final Task stack = createStack();
+
+        // Assume layout defer
+        mWm.mWindowPlacerLocked.deferLayout();
+
+        final Task task = createTask(stack);
+
+        stack.removeImmediately();
+        waitUntilHandlersIdle();
+
+        ArrayList<PendingTaskEvent> pendingEvents = getTaskPendingEvent(stack);
+        assertEquals(0, pendingEvents.size());
+    }
+
+    @Test
+    public void testInfoChangeDeferMultiple() {
+        final ITaskOrganizer organizer = registerMockOrganizer();
+        final Task stack = createStack();
+        final Task task = createTask(stack);
+        final ActivityRecord record = createActivityRecord(stack.mDisplayContent, task);
+
+        // Assume layout defer
+        mWm.mWindowPlacerLocked.deferLayout();
+
+        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+        record.setTaskDescription(new ActivityManager.TaskDescription("TestDescription"));
+        waitUntilHandlersIdle();
+
+        ArrayList<PendingTaskEvent> pendingEvents = getTaskPendingEvent(stack);
+        assertEquals(1, pendingEvents.size());
+        assertEquals(PendingTaskEvent.EVENT_INFO_CHANGED, pendingEvents.get(0).mEventType);
+        assertEquals("TestDescription",
+                pendingEvents.get(0).mTask.getTaskInfo().taskDescription.getLabel());
+
+        record.setTaskDescription(new ActivityManager.TaskDescription("TestDescription2"));
+        waitUntilHandlersIdle();
+
+        pendingEvents = getTaskPendingEvent(stack);
+        assertEquals(1, pendingEvents.size());
+        assertEquals(PendingTaskEvent.EVENT_INFO_CHANGED, pendingEvents.get(0).mEventType);
+        assertEquals("TestDescription2",
+                pendingEvents.get(0).mTask.getTaskInfo().taskDescription.getLabel());
+    }
+
+    @Test
+    public void testInfoChangDeferThenVanish() {
+        final ITaskOrganizer organizer = registerMockOrganizer();
+        final Task stack = createStack();
+        final Task task = createTask(stack);
+        final ActivityRecord record = createActivityRecord(stack.mDisplayContent, task);
+
+        // Assume layout defer
+        mWm.mWindowPlacerLocked.deferLayout();
+
+        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+        record.setTaskDescription(new ActivityManager.TaskDescription("TestDescription"));
+
+        stack.removeImmediately();
+        waitUntilHandlersIdle();
+
+        ArrayList<PendingTaskEvent> pendingEvents = getTaskPendingEvent(stack);
+        assertEquals(1, pendingEvents.size());
+        assertEquals(PendingTaskEvent.EVENT_VANISHED, pendingEvents.get(0).mEventType);
+        assertEquals("TestDescription",
+                pendingEvents.get(0).mTask.getTaskInfo().taskDescription.getLabel());
+    }
+
+    @Test
+    public void testVanishDeferThenInfoChange() {
+        final ITaskOrganizer organizer = registerMockOrganizer();
+        final Task stack = createStack();
+        final Task task = createTask(stack);
+        final ActivityRecord record = createActivityRecord(stack.mDisplayContent, task);
+
+        // Assume layout defer
+        mWm.mWindowPlacerLocked.deferLayout();
+
+        stack.removeImmediately();
+        stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+        waitUntilHandlersIdle();
+
+        ArrayList<PendingTaskEvent> pendingEvents = getTaskPendingEvent(stack);
+        assertEquals(1, pendingEvents.size());
+        assertEquals(PendingTaskEvent.EVENT_VANISHED, pendingEvents.get(0).mEventType);
+    }
+
+    @Test
+    public void testVanishDeferThenBackOnRoot() {
+        final ITaskOrganizer organizer = registerMockOrganizer();
+        final Task stack = createStack();
+        final Task task = createTask(stack);
+        final ActivityRecord record = createActivityRecord(stack.mDisplayContent, task);
+
+        // Assume layout defer
+        mWm.mWindowPlacerLocked.deferLayout();
+
+        stack.removeImmediately();
+        mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(record.token);
+        waitUntilHandlersIdle();
+
+        ArrayList<PendingTaskEvent> pendingEvents = getTaskPendingEvent(stack);
+        assertEquals(1, pendingEvents.size());
+        assertEquals(PendingTaskEvent.EVENT_VANISHED, pendingEvents.get(0).mEventType);
+    }
+
+    private ArrayList<PendingTaskEvent> getTaskPendingEvent(Task task) {
+        ArrayList<PendingTaskEvent> total =
+                mWm.mAtmService.mTaskOrganizerController.getPendingEventList();
+        ArrayList<PendingTaskEvent> result = new ArrayList();
+
+        for (int i = 0; i < total.size(); i++) {
+            PendingTaskEvent entry = total.get(i);
+            if (entry.mTask.mTaskId == task.mTaskId) {
+                result.add(entry);
+            }
+        }
+
+        return result;
+    }
+
     /**
      * Verifies that task vanished is called for a specific task.
      */
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index b5bb2a8..ec371bf 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -420,8 +420,9 @@
                         + interactorInfo + ")");
             }
 
-            // Initializing settings, look for an interactor first (but only on non-svelte).
-            if (curInteractorInfo == null && mEnableService) {
+            // Initializing settings. Look for an interactor first, but only on non-svelte and only
+            // if the user hasn't explicitly unset it.
+            if (curInteractorInfo == null && mEnableService && !"".equals(curInteractorStr)) {
                 curInteractorInfo = findAvailInteractor(userHandle, null);
             }
 
@@ -1751,8 +1752,13 @@
                 if (isPackageAppearing(pkgName) != PACKAGE_UNCHANGED) {
                     return;
                 }
+                final String curInteractorStr = Settings.Secure.getStringForUser(
+                        mContext.getContentResolver(),
+                        Settings.Secure.VOICE_INTERACTION_SERVICE, mCurUser);
                 final ComponentName curInteractor = getCurInteractor(mCurUser);
-                if (curInteractor == null) {
+                // If there's no interactor and the user hasn't explicitly unset it, check if the
+                // modified package offers one.
+                if (curInteractor == null && !"".equals(curInteractorStr)) {
                     final VoiceInteractionServiceInfo availInteractorInfo
                             = findAvailInteractor(mCurUser, pkgName);
                     if (availInteractorInfo != null) {
diff --git a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
index 556df88..515d329 100644
--- a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
+++ b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
@@ -683,4 +683,23 @@
 
         throw new SecurityException(message + ": Only shell user can call it");
     }
+
+    /**
+     * Returns the target SDK version number for a given package name.
+     *
+     * This call MUST be invoked before clearing the calling UID.
+     *
+     * @return target SDK if the package is found or INT_MAX.
+     */
+    public static int getTargetSdk(Context c, String packageName) {
+        try {
+            final ApplicationInfo ai = c.getPackageManager().getApplicationInfoAsUser(
+                    packageName, 0, UserHandle.getUserHandleForUid(Binder.getCallingUid()));
+            if (ai != null) return ai.targetSdkVersion;
+        } catch (PackageManager.NameNotFoundException unexpected) {
+            Log.e(LOG_TAG, "Failed to get package info for pkg="
+                    + packageName + ", uid=" + Binder.getCallingUid());
+        }
+        return Integer.MAX_VALUE;
+    }
 }
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 0939bf0..d645e86 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -17,6 +17,7 @@
 package android.telephony;
 
 import android.Manifest;
+import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
@@ -3884,6 +3885,507 @@
     }
 
     /**
+     * Configs used for epdg tunnel bring up.
+     *
+     * @see <a href="https://tools.ietf.org/html/rfc7296">RFC 7296, Internet Key Exchange Protocol
+     *     Version 2 (IKEv2)</a>
+     */
+    public static final class Iwlan {
+        /** Prefix of all Epdg.KEY_* constants. */
+        public static final String KEY_PREFIX = "iwlan.";
+
+        /**
+         * Time in seconds after which the child security association session is terminated if rekey
+         * procedure is not successful. If not set or set to <= 0, the default value is 3600
+         * seconds.
+         */
+        public static final String KEY_CHILD_SA_REKEY_HARD_TIMER_SEC_INT =
+                KEY_PREFIX + "child_sa_rekey_hard_timer_sec_int";
+
+        /**
+         * Time in seconds after which the child session rekey procedure is started. If not set or
+         * set to <= 0, default value is 3000 seconds.
+         */
+        public static final String KEY_CHILD_SA_REKEY_SOFT_TIMER_SEC_INT =
+                KEY_PREFIX + "child_sa_rekey_soft_timer_sec_int";
+
+        /**
+         * Supported DH groups for IKE negotiation. Possible values are {@link #DH_GROUP_NONE},
+         * {@link #DH_GROUP_1024_BIT_MODP}, {@link #DH_GROUP_1536_BIT_MODP}, {@link
+         * #DH_GROUP_2048_BIT_MODP}
+         */
+        public static final String KEY_DIFFIE_HELLMAN_GROUPS_INT_ARRAY =
+                KEY_PREFIX + "diffie_hellman_groups_int_array";
+
+        /**
+         * Time in seconds after which a dead peer detection (DPD) request is sent. If not set or
+         * set to <= 0, default value is 120 seconds.
+         */
+        public static final String KEY_DPD_TIMER_SEC_INT = KEY_PREFIX + "dpd_timer_sec_int";
+
+        /**
+         * Method used to authenticate epdg server. Possible values are {@link
+         * #AUTHENTICATION_METHOD_EAP_ONLY}, {@link #AUTHENTICATION_METHOD_CERT}
+         */
+        public static final String KEY_EPDG_AUTHENTICATION_METHOD_INT =
+                KEY_PREFIX + "epdg_authentication_method_int";
+
+        /**
+         * A priority list of ePDG addresses to be used. Possible values are {@link
+         * #EPDG_ADDRESS_STATIC}, {@link #EPDG_ADDRESS_PLMN}, {@link #EPDG_ADDRESS_PCO}, {@link
+         * #EPDG_ADDRESS_CELLULAR_LOC}
+         */
+        public static final String KEY_EPDG_ADDRESS_PRIORITY_INT_ARRAY =
+                KEY_PREFIX + "epdg_address_priority_int_array";
+
+        /** Epdg static IP address or FQDN */
+        public static final String KEY_EPDG_STATIC_ADDRESS_STRING =
+                KEY_PREFIX + "epdg_static_address_string";
+
+        /** Epdg static IP address or FQDN for roaming */
+        public static final String KEY_EPDG_STATIC_ADDRESS_ROAMING_STRING =
+                KEY_PREFIX + "epdg_static_address_roaming_string";
+
+        /**
+         * List of supported key sizes for AES Cipher Block Chaining (CBC) encryption mode of child
+         * session. Possible values are {@link #KEY_LEN_UNUSED}, {@link #KEY_LEN_AES_128}, {@link
+         * #KEY_LEN_AES_192}, {@link #KEY_LEN_AES_256}
+         */
+        public static final String KEY_CHILD_SESSION_AES_CBC_KEY_SIZE_INT_ARRAY =
+                KEY_PREFIX + "child_session_aes_cbc_key_size_int_array";
+
+        /**
+         * List of supported key sizes for AES Counter (CTR) encryption mode of child session.
+         * Possible values are {@link #KEY_LEN_UNUSED},
+         * {@link #KEY_LEN_AES_128}, {@link #KEY_LEN_AES_192}, {@link #KEY_LEN_AES_256}
+         */
+        public static final String KEY_CHILD_SESSION_AES_CTR_KEY_SIZE_INT_ARRAY =
+                KEY_PREFIX + "child_session_aes_ctr_key_size_int_array";
+
+        /**
+         * List of supported encryption algorithms for child session. Possible values are
+         * {@link #ENCRYPTION_ALGORITHM_AES_CBC}
+         */
+        public static final String KEY_SUPPORTED_CHILD_SESSION_ENCRYPTION_ALGORITHMS_INT_ARRAY =
+                KEY_PREFIX + "supported_child_session_encryption_algorithms_int_array";
+
+        /**
+         * Time in seconds after which the IKE session is terminated if rekey procedure is not
+         * successful. If not set or set to <= 0, default value is 3600 seconds.
+         */
+        public static final String KEY_IKE_REKEY_HARD_TIMER_SEC_INT =
+                KEY_PREFIX + "ike_rekey_hard_timer_in_sec";
+
+        /**
+         * Time in seconds after which the IKE session rekey procedure is started. If not set or set
+         * to <= 0, default value is 3000 seconds.
+         */
+        public static final String KEY_IKE_REKEY_SOFT_TIMER_SEC_INT =
+                KEY_PREFIX + "ike_rekey_soft_timer_sec_int";
+
+        /**
+         * List of supported key sizes for AES Cipher Block Chaining (CBC) encryption mode of IKE
+         * session. Possible values - {@link #KEY_LEN_UNUSED}, {@link #KEY_LEN_AES_128}, {@link
+         * #KEY_LEN_AES_192}, {@link #KEY_LEN_AES_256}
+         */
+        public static final String KEY_IKE_SESSION_AES_CBC_KEY_SIZE_INT_ARRAY =
+                KEY_PREFIX + "ike_session_encryption_aes_cbc_key_size_int_array";
+
+
+        /**
+         * List of supported key sizes for AES Counter (CTR) encryption mode of IKE session.
+         * Possible values - {@link #KEY_LEN_UNUSED}, {@link #KEY_LEN_AES_128},
+         * {@link #KEY_LEN_AES_192}, {@link #KEY_LEN_AES_256}
+         */
+         public static final String KEY_IKE_SESSION_AES_CTR_KEY_SIZE_INT_ARRAY =
+                 KEY_PREFIX + "ike_session_encryption_aes_ctr_key_size_int_array";
+
+        /**
+         * List of supported encryption algorithms for IKE session. Possible values are
+         * {@link #ENCRYPTION_ALGORITHM_AES_CBC}, {@link #ENCRYPTION_ALGORITHM_AES_CTR}
+         */
+        public static final String KEY_SUPPORTED_IKE_SESSION_ENCRYPTION_ALGORITHMS_INT_ARRAY =
+                KEY_PREFIX + "supported_ike_session_encryption_algorithms_int_array";
+
+        /**
+         * List of supported integrity algorithms for IKE session Possible values are {@link
+         * #INTEGRITY_ALGORITHM_NONE}, {@link #INTEGRITY_ALGORITHM_HMAC_SHA1_96}, {@link
+         * #INTEGRITY_ALGORITHM_AES_XCBC_96}, {@link #INTEGRITY_ALGORITHM_HMAC_SHA2_256_128}, {@link
+         * #INTEGRITY_ALGORITHM_HMAC_SHA2_384_192}, {@link #INTEGRITY_ALGORITHM_HMAC_SHA2_512_256}
+         */
+        public static final String KEY_SUPPORTED_INTEGRITY_ALGORITHMS_INT_ARRAY =
+                KEY_PREFIX + "supported_integrity_algorithms_int_array";
+
+        /** Maximum number of retries for tunnel establishment. */
+        public static final String KEY_MAX_RETRIES_INT = KEY_PREFIX + "max_retries_int";
+
+        /**
+         * Time in seconds after which a NATT keep alive message is sent. If not set or set to <= 0,
+         * default value is 20 seconds.
+         */
+        public static final String KEY_NATT_KEEP_ALIVE_TIMER_SEC_INT =
+                KEY_PREFIX + "natt_keep_alive_timer_sec_int";
+
+        /** List of '-' separated MCC/MNCs used to create ePDG FQDN as per 3GPP TS 23.003 */
+        public static final String KEY_MCC_MNCS_STRING_ARRAY = KEY_PREFIX + "mcc_mncs_string_array";
+
+        /**
+         * List of supported pseudo random function algorithms for IKE session. Possible values are
+         * {@link #PSEUDORANDOM_FUNCTION_HMAC_SHA1}, {@link #PSEUDORANDOM_FUNCTION_AES128_XCBC},
+         * {@link #PSEUDORANDOM_FUNCTION_SHA2_256}, {@link #PSEUDORANDOM_FUNCTION_SHA2_384},
+         * {@link #PSEUDORANDOM_FUNCTION_SHA2_512}
+         */
+        public static final String KEY_SUPPORTED_PRF_ALGORITHMS_INT_ARRAY =
+                KEY_PREFIX + "supported_prf_algorithms_int_array";
+
+        /**
+         * List of IKE message retransmission timeouts in milliseconds, where each timeout
+         * is the waiting time before next retry, except the last timeout which is the waiting time
+         * before terminating the IKE Session. Min list length = 1, Max
+         * list length = 10 Min timeout = 500 ms, Max timeout = 1800000 ms
+         */
+        public static final String KEY_RETRANSMIT_TIMER_MSEC_INT_ARRAY =
+                KEY_PREFIX + "retransmit_timer_sec_int_array";
+
+        /** Controls if wifi mac Id should be added to network access identifier(NAI) */
+        public static final String KEY_ADD_WIFI_MAC_ADDR_TO_NAI_BOOL =
+                KEY_PREFIX + "add_wifi_mac_addr_to_nai_bool";
+
+        /**
+         * Specifies the local identity type for IKE negotiations. Possible values are {@link
+         * #ID_TYPE_FQDN}, {@link #ID_TYPE_RFC822_ADDR}, {@link #ID_TYPE_KEY_ID}
+         */
+        public static final String KEY_IKE_LOCAL_ID_TYPE_INT = KEY_PREFIX + "ike_local_id_type_int";
+
+        /**
+         * Specifies the remote identity type for IKE negotiations. Possible values are {@link
+         * #ID_TYPE_FQDN}, {@link #ID_TYPE_RFC822_ADDR}, {@link #ID_TYPE_KEY_ID}
+         */
+        public static final String KEY_IKE_REMOTE_ID_TYPE_INT =
+                KEY_PREFIX + "ike_remote_id_type_int";
+
+        /** Controls if KE payload should be added during child session local rekey procedure. */
+        public static final String KEY_ADD_KE_TO_CHILD_SESSION_REKEY_BOOL =
+                KEY_PREFIX + "add_ke_to_child_session_rekey_bool";
+
+        /** Specifies the PCO id for IPv6 Epdg server address */
+        public static final String KEY_EPDG_PCO_ID_IPV6_INT = KEY_PREFIX + "epdg_pco_id_ipv6_int";
+
+        /** Specifies the PCO id for IPv4 Epdg server address */
+        public static final String KEY_EPDG_PCO_ID_IPV4_INT = KEY_PREFIX + "epdg_pco_id_ipv4_int";
+
+        /** @hide */
+        @IntDef({AUTHENTICATION_METHOD_EAP_ONLY, AUTHENTICATION_METHOD_CERT})
+        public @interface AuthenticationMethodType {}
+
+        /**
+         * Certificate sent from the server is ignored. Only Extensible Authentication Protocol
+         * (EAP) is used to authenticate the server. EAP_ONLY_AUTH payload is added to IKE_AUTH
+         * request if supported.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc5998">RFC 5998</a>
+         */
+        public static final int AUTHENTICATION_METHOD_EAP_ONLY = 0;
+        /** Server is authenticated using its certificate. */
+        public static final int AUTHENTICATION_METHOD_CERT = 1;
+
+        /** @hide */
+        @IntDef({
+            EPDG_ADDRESS_STATIC,
+            EPDG_ADDRESS_PLMN,
+            EPDG_ADDRESS_PCO,
+            EPDG_ADDRESS_CELLULAR_LOC
+        })
+        public @interface EpdgAddressType {}
+
+        /** Use static epdg address. */
+        public static final int EPDG_ADDRESS_STATIC = 0;
+        /** Construct the epdg address using plmn. */
+        public static final int EPDG_ADDRESS_PLMN = 1;
+        /**
+         * Use the epdg address received in protocol configuration options (PCO) from the network.
+         */
+        public static final int EPDG_ADDRESS_PCO = 2;
+        /** Use cellular location to chose epdg server */
+        public static final int EPDG_ADDRESS_CELLULAR_LOC = 3;
+
+        /** @hide */
+        @IntDef({KEY_LEN_UNUSED, KEY_LEN_AES_128, KEY_LEN_AES_192, KEY_LEN_AES_256})
+        public @interface EncrpytionKeyLengthType {}
+
+        public static final int KEY_LEN_UNUSED = 0;
+        /** AES Encryption/Ciphering Algorithm key length 128 bits. */
+        public static final int KEY_LEN_AES_128 = 128;
+        /** AES Encryption/Ciphering Algorithm key length 192 bits. */
+        public static final int KEY_LEN_AES_192 = 192;
+        /** AES Encryption/Ciphering Algorithm key length 256 bits. */
+        public static final int KEY_LEN_AES_256 = 256;
+
+        /** @hide */
+        @IntDef({
+            DH_GROUP_NONE,
+            DH_GROUP_1024_BIT_MODP,
+            DH_GROUP_1536_BIT_MODP,
+            DH_GROUP_2048_BIT_MODP,
+            DH_GROUP_3072_BIT_MODP,
+            DH_GROUP_4096_BIT_MODP
+        })
+        public @interface DhGroup {}
+
+        /** None Diffie-Hellman Group. */
+        public static final int DH_GROUP_NONE = 0;
+        /**
+         * 1024-bit MODP Diffie-Hellman Group.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int DH_GROUP_1024_BIT_MODP = 2;
+        /**
+         * 1536-bit MODP Diffie-Hellman Group.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int DH_GROUP_1536_BIT_MODP = 5;
+        /**
+         * 2048-bit MODP Diffie-Hellman Group.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int DH_GROUP_2048_BIT_MODP = 14;
+        /**
+         * 3072-bit MODP Diffie-Hellman Group.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int DH_GROUP_3072_BIT_MODP = 15;
+        /**
+         * 4096-bit MODP Diffie-Hellman Group.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int DH_GROUP_4096_BIT_MODP = 16;
+
+        /** @hide */
+        @IntDef({ENCRYPTION_ALGORITHM_AES_CBC, ENCRYPTION_ALGORITHM_AES_CTR})
+        public @interface EncryptionAlgorithm {}
+
+        /**
+         * AES-CBC Encryption/Ciphering Algorithm.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int ENCRYPTION_ALGORITHM_AES_CBC = 12;
+
+        /**
+         * AES-CTR Encryption/Ciphering Algorithm.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int ENCRYPTION_ALGORITHM_AES_CTR = 13;
+
+        /** @hide */
+        @IntDef({
+            INTEGRITY_ALGORITHM_NONE,
+            INTEGRITY_ALGORITHM_HMAC_SHA1_96,
+            INTEGRITY_ALGORITHM_AES_XCBC_96,
+            INTEGRITY_ALGORITHM_HMAC_SHA2_256_128,
+            INTEGRITY_ALGORITHM_HMAC_SHA2_384_192,
+            INTEGRITY_ALGORITHM_HMAC_SHA2_512_256
+        })
+        public @interface IntegrityAlgorithm {}
+
+        /** None Authentication/Integrity Algorithm. */
+        public static final int INTEGRITY_ALGORITHM_NONE = 0;
+        /**
+         * HMAC-SHA1 Authentication/Integrity Algorithm.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int INTEGRITY_ALGORITHM_HMAC_SHA1_96 = 2;
+        /**
+         * AES-XCBC-96 Authentication/Integrity Algorithm.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int INTEGRITY_ALGORITHM_AES_XCBC_96 = 5;
+        /**
+         * HMAC-SHA256 Authentication/Integrity Algorithm with 128-bit truncation.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int INTEGRITY_ALGORITHM_HMAC_SHA2_256_128 = 12;
+        /**
+         * HMAC-SHA384 Authentication/Integrity Algorithm with 192-bit truncation.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int INTEGRITY_ALGORITHM_HMAC_SHA2_384_192 = 13;
+        /**
+         * HMAC-SHA512 Authentication/Integrity Algorithm with 256-bit truncation.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int INTEGRITY_ALGORITHM_HMAC_SHA2_512_256 = 14;
+
+        /** @hide */
+        @IntDef({
+            PSEUDORANDOM_FUNCTION_HMAC_SHA1,
+            PSEUDORANDOM_FUNCTION_AES128_XCBC,
+            PSEUDORANDOM_FUNCTION_SHA2_256,
+            PSEUDORANDOM_FUNCTION_SHA2_384,
+            PSEUDORANDOM_FUNCTION_SHA2_512
+        })
+        public @interface PseudorandomFunction {}
+
+        /**
+         * HMAC-SHA1 Pseudorandom Function.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int PSEUDORANDOM_FUNCTION_HMAC_SHA1 = 2;
+        /**
+         * AES128-XCBC Pseudorandom Function.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int PSEUDORANDOM_FUNCTION_AES128_XCBC = 4;
+        /**
+         * HMAC-SHA2-256 Pseudorandom Function.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int PSEUDORANDOM_FUNCTION_SHA2_256 = 5;
+        /**
+         * HMAC-SHA2-384 Pseudorandom Function.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int PSEUDORANDOM_FUNCTION_SHA2_384 = 6;
+        /**
+         * HMAC-SHA2-384 Pseudorandom Function.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.3">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int PSEUDORANDOM_FUNCTION_SHA2_512 = 7;
+
+        /** @hide */
+        @IntDef({ID_TYPE_FQDN, ID_TYPE_RFC822_ADDR, ID_TYPE_KEY_ID})
+        public @interface IkeIdType {}
+
+        /**
+         * Ike Identification Fully Qualified Domain Name
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.5">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int ID_TYPE_FQDN = 2;
+        /**
+         * Ike Identification Fully Qualified RFC 822 email address.
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.5">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int ID_TYPE_RFC822_ADDR = 3;
+        /**
+         * Ike Identification opaque octet stream for vendor specific information
+         *
+         * @see <a href="https://tools.ietf.org/html/rfc7296#section-3.5">RFC 7296, Internet Key
+         *     Exchange Protocol Version 2 (IKEv2)</a>
+         */
+        public static final int ID_TYPE_KEY_ID = 11;
+
+        private Iwlan() {}
+
+        private static PersistableBundle getDefaults() {
+            PersistableBundle defaults = new PersistableBundle();
+            defaults.putInt(KEY_IKE_REKEY_SOFT_TIMER_SEC_INT, 7200);
+            defaults.putInt(KEY_IKE_REKEY_HARD_TIMER_SEC_INT, 14400);
+            defaults.putInt(KEY_CHILD_SA_REKEY_SOFT_TIMER_SEC_INT, 3600);
+            defaults.putInt(KEY_CHILD_SA_REKEY_HARD_TIMER_SEC_INT, 7200);
+            defaults.putIntArray(
+                    KEY_RETRANSMIT_TIMER_MSEC_INT_ARRAY, new int[] {500, 1000, 2000, 4000, 8000});
+            defaults.putInt(KEY_DPD_TIMER_SEC_INT, 120);
+            defaults.putInt(KEY_MAX_RETRIES_INT, 3);
+            defaults.putIntArray(
+                    KEY_DIFFIE_HELLMAN_GROUPS_INT_ARRAY,
+                    new int[] {
+                        DH_GROUP_1024_BIT_MODP, DH_GROUP_1536_BIT_MODP, DH_GROUP_2048_BIT_MODP
+                    });
+            defaults.putIntArray(
+                    KEY_SUPPORTED_IKE_SESSION_ENCRYPTION_ALGORITHMS_INT_ARRAY,
+                    new int[] {ENCRYPTION_ALGORITHM_AES_CBC});
+            defaults.putIntArray(
+                    KEY_SUPPORTED_CHILD_SESSION_ENCRYPTION_ALGORITHMS_INT_ARRAY,
+                    new int[] {ENCRYPTION_ALGORITHM_AES_CBC});
+            defaults.putIntArray(
+                    KEY_SUPPORTED_INTEGRITY_ALGORITHMS_INT_ARRAY,
+                    new int[] {
+                        INTEGRITY_ALGORITHM_AES_XCBC_96,
+                        INTEGRITY_ALGORITHM_HMAC_SHA1_96,
+                        INTEGRITY_ALGORITHM_HMAC_SHA2_256_128,
+                        INTEGRITY_ALGORITHM_HMAC_SHA2_384_192,
+                        INTEGRITY_ALGORITHM_HMAC_SHA2_512_256,
+                    });
+            defaults.putIntArray(
+                    KEY_SUPPORTED_PRF_ALGORITHMS_INT_ARRAY,
+                    new int[] {
+                        PSEUDORANDOM_FUNCTION_HMAC_SHA1,
+                        PSEUDORANDOM_FUNCTION_AES128_XCBC,
+                        PSEUDORANDOM_FUNCTION_SHA2_256,
+                        PSEUDORANDOM_FUNCTION_SHA2_384,
+                        PSEUDORANDOM_FUNCTION_SHA2_512
+                    });
+
+            defaults.putInt(KEY_EPDG_AUTHENTICATION_METHOD_INT, AUTHENTICATION_METHOD_EAP_ONLY);
+            defaults.putString(KEY_EPDG_STATIC_ADDRESS_STRING, "");
+            defaults.putString(KEY_EPDG_STATIC_ADDRESS_ROAMING_STRING, "");
+            // will be used after b/158036773 is fixed
+            defaults.putInt(KEY_NATT_KEEP_ALIVE_TIMER_SEC_INT, 20);
+            defaults.putIntArray(
+                    KEY_IKE_SESSION_AES_CBC_KEY_SIZE_INT_ARRAY,
+                    new int[] {KEY_LEN_AES_128, KEY_LEN_AES_192, KEY_LEN_AES_256});
+            defaults.putIntArray(
+                    KEY_CHILD_SESSION_AES_CBC_KEY_SIZE_INT_ARRAY,
+                    new int[] {KEY_LEN_AES_128, KEY_LEN_AES_192, KEY_LEN_AES_256});
+            defaults.putIntArray(
+                    KEY_IKE_SESSION_AES_CTR_KEY_SIZE_INT_ARRAY,
+                    new int[] {KEY_LEN_AES_128, KEY_LEN_AES_192, KEY_LEN_AES_256});
+            defaults.putIntArray(
+                    KEY_CHILD_SESSION_AES_CTR_KEY_SIZE_INT_ARRAY,
+                    new int[] {KEY_LEN_AES_128, KEY_LEN_AES_192, KEY_LEN_AES_256});
+            defaults.putIntArray(
+                    KEY_EPDG_ADDRESS_PRIORITY_INT_ARRAY,
+                    new int[] {EPDG_ADDRESS_PLMN, EPDG_ADDRESS_STATIC});
+            defaults.putStringArray(KEY_MCC_MNCS_STRING_ARRAY, new String[] {});
+            defaults.putBoolean(KEY_ADD_WIFI_MAC_ADDR_TO_NAI_BOOL, false);
+            defaults.putInt(KEY_IKE_LOCAL_ID_TYPE_INT, ID_TYPE_RFC822_ADDR);
+            defaults.putInt(KEY_IKE_REMOTE_ID_TYPE_INT, ID_TYPE_FQDN);
+            defaults.putBoolean(KEY_ADD_KE_TO_CHILD_SESSION_REKEY_BOOL, false);
+            defaults.putInt(KEY_EPDG_PCO_ID_IPV6_INT, 0);
+            defaults.putInt(KEY_EPDG_PCO_ID_IPV4_INT, 0);
+
+            return defaults;
+        }
+    }
+
+    /**
      * A list of 4 GSM RSSI thresholds above which a signal level is considered POOR,
      * MODERATE, GOOD, or EXCELLENT, to be used in SignalStrength reporting.
      *
@@ -4032,6 +4534,12 @@
     public static final String KEY_USE_LOWER_MTU_VALUE_IF_BOTH_RECEIVED =
             "use_lower_mtu_value_if_both_received";
 
+    /**
+     * Indicates if auto-configuration server is used for the RCS config
+     * Reference: GSMA RCC.14
+     */
+    public static final String KEY_USE_ACS_FOR_RCS_BOOL = "use_acs_for_rcs_bool";
+
     /** The default value for every variable. */
     private final static PersistableBundle sDefaults;
 
@@ -4551,6 +5059,7 @@
                 });
         sDefaults.putBoolean(KEY_SUPPORT_WPS_OVER_IMS_BOOL, true);
         sDefaults.putAll(Ims.getDefaults());
+        sDefaults.putAll(Iwlan.getDefaults());
         sDefaults.putStringArray(KEY_CARRIER_CERTIFICATE_STRING_ARRAY, new String[0]);
          sDefaults.putBoolean(KEY_FORMAT_INCOMING_NUMBER_TO_NATIONAL_FOR_JP_BOOL, false);
         sDefaults.putIntArray(KEY_DISCONNECT_CAUSE_PLAY_BUSYTONE_INT_ARRAY,
@@ -4577,6 +5086,7 @@
         sDefaults.putBoolean(KEY_SUPPORTS_CALL_COMPOSER_BOOL, false);
         sDefaults.putString(KEY_CALL_COMPOSER_PICTURE_SERVER_URL_STRING, "");
         sDefaults.putBoolean(KEY_USE_LOWER_MTU_VALUE_IF_BOTH_RECEIVED, false);
+        sDefaults.putBoolean(KEY_USE_ACS_FOR_RCS_BOOL, false);
     }
 
     /**
diff --git a/telephony/java/android/telephony/CellSignalStrengthLte.java b/telephony/java/android/telephony/CellSignalStrengthLte.java
index db7d10a..7addf33 100644
--- a/telephony/java/android/telephony/CellSignalStrengthLte.java
+++ b/telephony/java/android/telephony/CellSignalStrengthLte.java
@@ -443,10 +443,12 @@
     /**
      * Get table index for channel quality indicator
      *
+     * Reference: 3GPP TS 136.213 section 7.2.3.
+     *
      * @return the CQI table index if available or
      *         {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
      */
-    /** @hide */
+    @IntRange(from = 1, to = 6)
     public int getCqiTableIndex() {
         return mCqiTableIndex;
     }
@@ -454,9 +456,12 @@
     /**
      * Get channel quality indicator
      *
+     * Reference: 3GPP TS 136.213 section 7.2.3.
+     *
      * @return the CQI if available or
      *         {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
      */
+    @IntRange(from = 0, to = 15)
     public int getCqi() {
         return mCqi;
     }
diff --git a/telephony/java/android/telephony/CellSignalStrengthNr.java b/telephony/java/android/telephony/CellSignalStrengthNr.java
index 1518190..bde62fb 100644
--- a/telephony/java/android/telephony/CellSignalStrengthNr.java
+++ b/telephony/java/android/telephony/CellSignalStrengthNr.java
@@ -294,9 +294,10 @@
      *
      * Reference: 3GPP TS 138.214 section 5.2.2.1.
      *
-     * Range [1, 3].
+     * @return the CQI table index if available or
+     *         {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
      */
-    /** @hide */
+    @IntRange(from = 1, to = 3)
     public int getCsiCqiTableIndex() {
         return mCsiCqiTableIndex;
     }
@@ -310,10 +311,10 @@
      *
      * Reference: 3GPP TS 138.214 section 5.2.2.1.
      *
-     * Range [0, 15] for each CQI.
+     * @return the CQIs for all subbands if available or empty list if unavailable.
      */
-    /** @hide */
     @NonNull
+    @IntRange(from = 0, to = 15)
     public List<Integer> getCsiCqiReport() {
         return mCsiCqiReport;
     }
diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java
index 572aed3..e145fcf 100644
--- a/telephony/java/android/telephony/SmsManager.java
+++ b/telephony/java/android/telephony/SmsManager.java
@@ -3134,26 +3134,20 @@
 
     /**
      * Reset all cell broadcast ranges. Previously enabled ranges will become invalid after this.
-     *
-     * @return {@code true} if succeeded, otherwise {@code false}.
-     *
-     * // TODO: Unhide the API in S.
      * @hide
      */
-    public boolean resetAllCellBroadcastRanges() {
-        boolean success = false;
-
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.MODIFY_CELL_BROADCASTS)
+    public void resetAllCellBroadcastRanges() {
         try {
             ISms iSms = getISmsService();
             if (iSms != null) {
                 // If getSubscriptionId() returns INVALID or an inactive subscription, we will use
                 // the default phone internally.
-                success = iSms.resetAllCellBroadcastRanges(getSubscriptionId());
+                iSms.resetAllCellBroadcastRanges(getSubscriptionId());
             }
         } catch (RemoteException ex) {
-            // ignore it
+            ex.rethrowFromSystemServer();
         }
-
-        return success;
     }
 }
diff --git a/telephony/java/android/telephony/ims/ProvisioningManager.java b/telephony/java/android/telephony/ims/ProvisioningManager.java
index 24ae979..f444c62 100644
--- a/telephony/java/android/telephony/ims/ProvisioningManager.java
+++ b/telephony/java/android/telephony/ims/ProvisioningManager.java
@@ -21,6 +21,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
+import android.annotation.SdkConstant;
 import android.annotation.StringDef;
 import android.annotation.SystemApi;
 import android.annotation.WorkerThread;
@@ -31,6 +32,7 @@
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyFrameworkInitializer;
 import android.telephony.ims.aidl.IImsConfigCallback;
+import android.telephony.ims.aidl.IRcsConfigCallback;
 import android.telephony.ims.feature.MmTelFeature;
 import android.telephony.ims.feature.RcsFeature;
 import android.telephony.ims.stub.ImsConfigImplBase;
@@ -936,6 +938,115 @@
     private int mSubId;
 
     /**
+     * The callback for RCS provisioning changes.
+     */
+    public static class RcsProvisioningCallback {
+        private static class CallbackBinder extends IRcsConfigCallback.Stub {
+
+            private final RcsProvisioningCallback mLocalCallback;
+            private Executor mExecutor;
+
+            private CallbackBinder(RcsProvisioningCallback localCallback) {
+                mLocalCallback = localCallback;
+            }
+
+            @Override
+            public void onConfigurationChanged(byte[] configXml) {
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    mExecutor.execute(() -> mLocalCallback.onConfigurationChanged(configXml));
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+
+            @Override
+            public void onAutoConfigurationErrorReceived(int errorCode, String errorString) {
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    mExecutor.execute(() -> mLocalCallback.onAutoConfigurationErrorReceived(
+                            errorCode, errorString));
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+
+            @Override
+            public void onConfigurationReset() {
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    mExecutor.execute(() -> mLocalCallback.onConfigurationReset());
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+
+            @Override
+            public void onRemoved() {
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    mExecutor.execute(() -> mLocalCallback.onRemoved());
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+
+            private void setExecutor(Executor executor) {
+                mExecutor = executor;
+            }
+        }
+
+        private final CallbackBinder mBinder = new CallbackBinder(this);
+
+        /**
+         * RCS configuration received via OTA provisioning. Configuration may change
+         * due to various triggers defined in GSMA RCC.14 for ACS(auto configuration
+         * server) or other operator defined triggers. If RCS provisioning is already
+         * completed at the time of callback registration, then this method shall be
+         * invoked with the current configuration
+         * @param configXml The RCS configurationXML received OTA.
+         */
+        public void onConfigurationChanged(@NonNull byte[] configXml) {}
+
+        /**
+         * Errors during autoconfiguration connection setup are notified by the
+         * ACS(auto configuration server) client using this interface.
+         * @param errorCode HTTP error received during connection setup defined in
+         * GSMA RCC.14 2.4.3, like {@link java.net.HttpURLConnection#HTTP_UNAUTHORIZED},
+         * {@link java.net.HttpURLConnection#HTTP_FORBIDDEN}, etc.
+         * @param errorString reason phrase received with the error
+         */
+        public void onAutoConfigurationErrorReceived(int errorCode,
+                @NonNull String errorString) {}
+
+        /**
+         * When the previously valid RCS configuration is cleaned up by telephony for
+         * any case like SIM removed, default messaging application changed, etc.,
+         * this method will be invoked to notify the application regarding this change.
+         */
+        public void onConfigurationReset() {}
+
+        /**
+         * When the RCS application is no longer the Default messaging application,
+         * or when the subscription associated with this callback is removed (SIM
+         * removed, ESIM swap,etc...), callback will automatically be removed and
+         * the below method is invoked. There is a possibility that the method is
+         * invoked after the subscription has become inactive
+         */
+        public void onRemoved() {}
+
+        /**@hide*/
+        public final IRcsConfigCallback getBinder() {
+            return mBinder;
+        }
+
+        /**@hide*/
+        public void setExecutor(Executor executor) {
+            mBinder.setExecutor(executor);
+        }
+    }
+
+    /**
      * Create a new {@link ProvisioningManager} for the subscription specified.
      *
      * @param subId The ID of the subscription that this ProvisioningManager will use.
@@ -1207,6 +1318,174 @@
 
     }
 
+    /**
+     * Provides the single registration capability of the device and the carrier.
+     *
+     * <p>This intent only provides the capability and not the current provisioning status of
+     * the RCS VoLTE single registration feature. Only default messaging application may receive
+     * the intent.
+     *
+     * <p>Contains {@link #EXTRA_SUBSCRIPTION_INDEX} to specify the subscription index for which
+     * the intent is valid. and {@link #EXTRA_STATUS} to specify RCS VoLTE single registration
+     * status.
+     */
+    @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+    @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
+    public static final String ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE =
+            "android.telephony.ims.action.RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE";
+
+    /**
+     * Integer extra to specify subscription index.
+     */
+    public static final String EXTRA_SUBSCRIPTION_ID =
+            "android.telephony.ims.extra.SUBSCRIPTION_ID";
+
+    /**
+     * Integer extra to specify RCS single registration status
+     *
+     * <p>The value can be {@link #STATUS_CAPABLE}, {@link #STATUS_DEVICE_NOT_CAPABLE},
+     * {@link #STATUS_CARRIER_NOT_CAPABLE}, or bitwise OR of
+     * {@link #STATUS_DEVICE_NOT_CAPABLE} and {@link #STATUS_CARRIER_NOT_CAPABLE}.
+     */
+    public static final String EXTRA_STATUS = "android.telephony.ims.extra.STATUS";
+
+    /**
+     * RCS VoLTE single registration is supported by the device and carrier.
+     */
+    public static final int STATUS_CAPABLE                       = 0;
+
+    /**
+     * RCS VoLTE single registration is not supported by the device.
+     */
+    public static final int STATUS_DEVICE_NOT_CAPABLE            = 0x01;
+
+    /**
+     * RCS VoLTE single registration is not supported by the carrier
+     */
+    public static final int STATUS_CARRIER_NOT_CAPABLE           = 0x01 << 1;
+
+    /**
+     * Provide the client configuration parameters of the RCS application.
+     *
+     * <p>When this application is also the default messaging application, and RCS
+     * provisioning is done using autoconfiguration, then these parameters shall be
+     * sent in the HTTP get request to fetch the RCS provisioning. RCS client
+     * configuration must be provided by the application before registering for the
+     * provisioning status events {@link #registerRcsProvisioningChangedCallback()}
+     * @param rcc RCS client configuration {@link RcsClientConfiguration}
+     */
+    @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
+    public void setRcsClientConfiguration(
+            @NonNull RcsClientConfiguration rcc) throws ImsException {
+        try {
+            getITelephony().setRcsClientConfiguration(mSubId, rcc);
+        } catch (ServiceSpecificException e) {
+            throw new ImsException(e.getMessage(), e.errorCode);
+        } catch (RemoteException | IllegalStateException e) {
+            throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+        }
+    }
+
+    /**
+     * Returns a flag to indicate if the device software and the carrier
+     * have the capability to support RCS Volte single IMS registration.
+     * @return true if this single registration is capable, false otherwise
+     * @throws ImsException If the remote ImsService is not available for
+     * any reason or the subscription associated with this instance is no
+     * longer active. See {@link ImsException#getCode()} for more
+     * information.
+     */
+    @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+    public boolean isRcsVolteSingleRegistrationCapable() throws ImsException {
+        try {
+            return getITelephony().isRcsVolteSingleRegistrationCapable(mSubId);
+        } catch (RemoteException | IllegalStateException e) {
+            throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+        }
+    }
+
+   /**
+     * Registers a new {@link RcsProvisioningCallback} to listen to changes to
+     * RCS provisioning xml.
+     *
+     * <p>RCS application must be the default messaging application and must
+     * have already registered its {@link RcsClientConfiguration} by using
+     * {@link #setRcsClientConfiguration} before it registers the provisioning
+     * callback. If ProvisioningManager has a valid RCS configuration at the
+     * time of callback registration and a reconfiguration is not required
+     * due to RCS client parameters change, then the callback shall be invoked
+     * immediately with the xml.
+     * When the subscription associated with this callback is removed (SIM removed,
+     * ESIM swap,etc...), this callback will automatically be removed.
+     *
+     * @param executor The {@link Executor} to call the callback methods on
+     * @param callback The rcs provisioning callback to be registered.
+     * @see #unregisterRcsProvisioningChangedCallback(RcsProvisioningCallback)
+     * @see SubscriptionManager.OnSubscriptionsChangedListener
+     * @throws IllegalArgumentException if the subscription associated with this
+     * callback is not active (SIM is not inserted, ESIM inactive) or the
+     * subscription is invalid.
+     * @throws ImsException if the subscription associated with this callback is
+     * valid, but the {@link ImsService} associated with the subscription is not
+     * available. This can happen if the service crashed, for example.
+     * It shall also throw this exception when the RCS client parameters for the
+     * application are not valid. In that case application must set the client
+     * params (See {@link #setRcsClientConfiguration()}) and re register the
+     * callback.
+     * See {@link ImsException#getCode()} for a more detailed reason.
+     */
+    @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+    public void registerRcsProvisioningChangedCallback(
+            @NonNull @CallbackExecutor Executor executor,
+            @NonNull RcsProvisioningCallback callback) throws ImsException {
+        callback.setExecutor(executor);
+        try {
+            getITelephony().registerRcsProvisioningChangedCallback(mSubId, callback.getBinder());
+        } catch (ServiceSpecificException e) {
+            throw new ImsException(e.getMessage(), e.errorCode);
+        } catch (RemoteException | IllegalStateException e) {
+            throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+        }
+    }
+
+    /**
+     * Unregister an existing {@link RcsProvisioningCallback}. Application can
+     * unregister when its no longer interested in the provisioning updates
+     * like when a user disables RCS from the UI/settings.
+     * When the subscription associated with this callback is removed (SIM
+     * removed, ESIM swap, etc...), this callback will automatically be
+     * removed. If this method is called for an inactive subscription, it
+     * will result in a no-op.
+     * @param callback The existing {@link RcsProvisioningCallback} to be
+     * removed.
+     * @see #registerRcsProvisioningChangedCallback(RcsClientConfiguration,
+     * Executor, RcsProvisioningCallback) @throws IllegalArgumentException
+     * if the subscription associated with this callback is invalid.
+     */
+    @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+    public void unregisterRcsProvisioningChangedCallback(
+            @NonNull RcsProvisioningCallback callback) {
+        try {
+            getITelephony().unregisterRcsProvisioningChangedCallback(
+                    mSubId, callback.getBinder());
+        } catch (RemoteException e) {
+            throw e.rethrowAsRuntimeException();
+        }
+    }
+
+    /**
+     * Reconfiguration triggered by the RCS application. Most likely cause
+     * is the 403 forbidden to a HTTP request.
+     */
+    @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+    public void triggerRcsReconfiguration() {
+        try {
+            getITelephony().triggerRcsReconfiguration(mSubId);
+        } catch (RemoteException e) {
+            throw e.rethrowAsRuntimeException();
+        }
+    }
+
     private static ITelephony getITelephony() {
         ITelephony binder = ITelephony.Stub.asInterface(
                 TelephonyFrameworkInitializer
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java b/telephony/java/android/telephony/ims/RcsClientConfiguration.aidl
similarity index 62%
copy from media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java
copy to telephony/java/android/telephony/ims/RcsClientConfiguration.aidl
index 52f2787..a702f0f 100644
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java
+++ b/telephony/java/android/telephony/ims/RcsClientConfiguration.aidl
@@ -14,19 +14,6 @@
  * limitations under the License.
  */
 
-package com.android.mediatranscodingtest;
+package android.telephony.ims;
 
-/**
- *
- * This class has the names of the all the activity name and variables in the
- * instrumentation test.
- *
- */
-public class MediaConstants {
-    /*
-     * Source test files.
-     */
-    public static final String[] SOURCE_HEVC_VIDEO_ONLY_TEST_FILES = {
-        "/sdcard/media_api/video/VideoOnlyHEVC.mp4",
-    };
-}
+parcelable RcsClientConfiguration;
diff --git a/telephony/java/android/telephony/ims/RcsClientConfiguration.java b/telephony/java/android/telephony/ims/RcsClientConfiguration.java
new file mode 100644
index 0000000..793c377
--- /dev/null
+++ b/telephony/java/android/telephony/ims/RcsClientConfiguration.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.ims;
+
+import android.annotation.NonNull;
+import android.annotation.StringDef;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+/**
+ * The container of RCS application related configs.
+ *
+ * @hide
+ */
+@SystemApi
+public final class RcsClientConfiguration implements Parcelable {
+
+    /**@hide*/
+    @StringDef(prefix = "RCS_PROFILE_",
+            value = {RCS_PROFILE_1_0, RCS_PROFILE_2_3})
+    public @interface StringRcsProfile {}
+
+    /**
+     * RCS profile UP 1.0
+     */
+    public static final String RCS_PROFILE_1_0 = "UP_1.0";
+    /**
+     * RCS profile UP 2.3
+     */
+    public static final String RCS_PROFILE_2_3 = "UP_2.3";
+
+    private String mRcsVersion;
+    private String mRcsProfile;
+    private String mClientVendor;
+    private String mClientVersion;
+
+    /**
+     * Create a RcsClientConfiguration object.
+     * Default messaging application must pass a valid configuration object
+     * @param rcsVersion The parameter identifies the RCS version supported
+     * by the client. Refer to GSMA RCC.07 "rcs_version" parameter.
+     * @param rcsProfile Identifies a fixed set of RCS services that are
+     * supported by the client. See {@link #RCS_PROFILE_1_0 } or
+     * {@link #RCS_PROFILE_2_3 }
+     * @param clientVendor Identifies the vendor providing the RCS client.
+     * @param clientVersion Identifies the RCS client version. Refer to GSMA
+     * RCC.07 "client_version" parameter.
+     * Example:client_version=RCSAndrd-1.0
+     */
+    public RcsClientConfiguration(@NonNull String rcsVersion,
+            @NonNull @StringRcsProfile String rcsProfile,
+            @NonNull String clientVendor, @NonNull String clientVersion) {
+        mRcsVersion = rcsVersion;
+        mRcsProfile = rcsProfile;
+        mClientVendor = clientVendor;
+        mClientVersion = clientVersion;
+    }
+
+    /**
+     * Returns RCS version supported.
+     */
+    public @NonNull String getRcsVersion() {
+        return mRcsVersion;
+    }
+
+    /**
+     * Returns RCS profile supported.
+     */
+    public @NonNull @StringRcsProfile String getRcsProfile() {
+        return mRcsProfile;
+    }
+
+    /**
+     * Returns the name of the vendor providing the RCS client.
+     */
+    public @NonNull String getClientVendor() {
+        return mClientVendor;
+    }
+
+    /**
+     * Returns the RCS client version.
+     */
+    public @NonNull String getClientVersion() {
+        return mClientVersion;
+    }
+
+    /**
+     * {@link Parcelable#writeToParcel}
+     */
+    @Override
+    public void writeToParcel(@NonNull Parcel out, int flags) {
+        out.writeString(mRcsVersion);
+        out.writeString(mRcsProfile);
+        out.writeString(mClientVendor);
+        out.writeString(mClientVersion);
+    }
+
+    /**
+     * {@link Parcelable.Creator}
+     *
+     */
+    public static final @android.annotation.NonNull Parcelable.Creator<
+            RcsClientConfiguration> CREATOR = new Creator<RcsClientConfiguration>() {
+                @Override
+                public RcsClientConfiguration createFromParcel(Parcel in) {
+                    String rcsVersion = in.readString();
+                    String rcsProfile = in.readString();
+                    String clientVendor = in.readString();
+                    String clientVersion = in.readString();
+                    return new RcsClientConfiguration(rcsVersion, rcsProfile,
+                            clientVendor, clientVersion);
+                }
+
+                @Override
+                public RcsClientConfiguration[] newArray(int size) {
+                    return new RcsClientConfiguration[size];
+                }
+            };
+
+    /**
+     * {@link Parcelable#describeContents}
+     */
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof RcsClientConfiguration)) {
+            return false;
+        }
+
+        RcsClientConfiguration other = (RcsClientConfiguration) obj;
+
+        return mRcsVersion.equals(other.mRcsVersion) && mRcsProfile.equals(other.mRcsProfile)
+                && mClientVendor.equals(other.mClientVendor)
+                && mClientVersion.equals(other.mClientVersion);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mRcsVersion, mRcsProfile, mClientVendor, mClientVersion);
+    }
+}
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java b/telephony/java/android/telephony/ims/RcsConfig.aidl
similarity index 62%
copy from media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java
copy to telephony/java/android/telephony/ims/RcsConfig.aidl
index 52f2787..cfd93fb 100644
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaConstants.java
+++ b/telephony/java/android/telephony/ims/RcsConfig.aidl
@@ -14,19 +14,6 @@
  * limitations under the License.
  */
 
-package com.android.mediatranscodingtest;
+package android.telephony.ims;
 
-/**
- *
- * This class has the names of the all the activity name and variables in the
- * instrumentation test.
- *
- */
-public class MediaConstants {
-    /*
-     * Source test files.
-     */
-    public static final String[] SOURCE_HEVC_VIDEO_ONLY_TEST_FILES = {
-        "/sdcard/media_api/video/VideoOnlyHEVC.mp4",
-    };
-}
+parcelable RcsConfig;
diff --git a/telephony/java/android/telephony/ims/RcsConfig.java b/telephony/java/android/telephony/ims/RcsConfig.java
new file mode 100644
index 0000000..07e95cc
--- /dev/null
+++ b/telephony/java/android/telephony/ims/RcsConfig.java
@@ -0,0 +1,306 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.NonNull;
+import android.annotation.Nullable;
+import android.content.ContentValues;
+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 com.android.telephony.Rlog;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlPullParserFactory;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+/**
+ * RCS config data and methods to process the config
+ * @hide
+ */
+public final class RcsConfig implements Parcelable {
+    private static final String LOG_TAG = "RcsConfig";
+    private static final boolean DBG = Build.IS_ENG;
+
+    private final HashMap<String, String> mValues = new HashMap<>();
+
+    private RcsConfig(HashMap<String, String> values) {
+        mValues.putAll(values);
+    }
+
+    public RcsConfig(byte[] data) throws IllegalArgumentException {
+        if (data == null || data.length == 0) {
+            throw new IllegalArgumentException("Empty data");
+        }
+        ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
+        try {
+            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
+            factory.setNamespaceAware(true);
+            XmlPullParser xpp = factory.newPullParser();
+            xpp.setInput(inputStream, null);
+            int eventType = xpp.getEventType();
+            String tag = null;
+            while (eventType != XmlPullParser.END_DOCUMENT) {
+                if (eventType == XmlPullParser.START_TAG) {
+                    tag = xpp.getName().trim();
+                } 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);
+                    }
+                }
+                eventType = xpp.next();
+            }
+        } catch (IOException | XmlPullParserException e) {
+            throw new IllegalArgumentException(e);
+        } finally {
+            try {
+                inputStream.close();
+            } catch (IOException e) {
+                loge("error to close input stream, skip.");
+            }
+        }
+    }
+
+    /**
+     * Retrieve a String value of the config item with the tag
+     *
+     * @param tag The name of the config to retrieve.
+     * @param defaultVal Value to return if the config does not exist.
+     *
+     * @return Returns the config value if it exists, or defaultVal.
+     */
+    public @Nullable String getString(@NonNull String tag, @Nullable String defaultVal) {
+        return mValues.containsKey(tag) ? mValues.get(tag) : defaultVal;
+    }
+
+    /**
+     * Retrieve a int value of the config item with the tag
+     *
+     * @param tag The name of the config to retrieve.
+     * @param defaultVal Value to return if the config does not exist or not valid.
+     *
+     * @return Returns the config value if it exists and is a valid int, or defaultVal.
+     */
+    public int getInteger(@NonNull String tag, int defaultVal) {
+        try {
+            return Integer.parseInt(mValues.get(tag));
+        } catch (NumberFormatException e) {
+            logd("error to getInteger for " + tag + " due to " + e);
+        }
+        return defaultVal;
+    }
+
+    /**
+     * Retrieve a boolean value of the config item with the tag
+     *
+     * @param tag The name of the config to retrieve.
+     * @param defaultVal Value to return if the config does not exist.
+     *
+     * @return Returns the config value if it exists, or defaultVal.
+     */
+    public boolean getBoolean(@NonNull String tag, boolean defaultVal) {
+        if (!mValues.containsKey(tag)) {
+            return defaultVal;
+        }
+        return Boolean.parseBoolean(mValues.get(tag));
+    }
+
+    /**
+     * Check whether the config item exists
+     *
+     * @param tag The name of the config to retrieve.
+     *
+     * @return Returns true if it exists, or false.
+     */
+    public boolean hasConfig(@NonNull String tag) {
+        return mValues.containsKey(tag);
+    }
+
+    @Override
+    public String toString() {
+        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);
+            });
+        }
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof RcsConfig)) {
+            return false;
+        }
+
+        RcsConfig other = (RcsConfig) obj;
+
+        return mValues.equals(other.mValues);
+    }
+
+    @Override
+    public int hashCode() {
+        return mValues.hashCode();
+    }
+
+    /**
+     * compress the gzip format data
+     */
+    public static @Nullable byte[] compressGzip(@NonNull byte[] data) {
+        if (data == null || data.length == 0) {
+            return data;
+        }
+        byte[] out = null;
+        try {
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
+            GZIPOutputStream gzipCompressingStream =
+                    new GZIPOutputStream(outputStream);
+            gzipCompressingStream.write(data);
+            gzipCompressingStream.close();
+            out = outputStream.toByteArray();
+            outputStream.close();
+        } catch (IOException e) {
+            loge("Error to compressGzip due to " + e);
+        }
+        return out;
+    }
+
+    /**
+     * decompress the gzip format data
+     */
+    public static @Nullable byte[] decompressGzip(@NonNull byte[] data) {
+        if (data == null || data.length == 0) {
+            return data;
+        }
+        byte[] out = null;
+        try {
+            ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            GZIPInputStream gzipDecompressingStream =
+                    new GZIPInputStream(inputStream);
+            byte[] buf = new byte[1024];
+            int size = gzipDecompressingStream.read(buf);
+            while (size >= 0) {
+                outputStream.write(buf, 0, size);
+                size = gzipDecompressingStream.read(buf);
+            }
+            gzipDecompressingStream.close();
+            inputStream.close();
+            out = outputStream.toByteArray();
+            outputStream.close();
+        } catch (IOException e) {
+            loge("Error to decompressGzip due to " + e);
+        }
+        return out;
+    }
+
+    /**
+     * save the config to siminfo db. It is only used internally.
+     */
+    public static void updateConfigForSub(@NonNull Context cxt, int subId,
+            @NonNull byte[] config, boolean isCompressed) {
+        //always store gzip compressed data
+        byte[] data = isCompressed ? config : compressGzip(config);
+        ContentValues values = new ContentValues();
+        values.put(SimInfo.COLUMN_RCS_CONFIG, data);
+        cxt.getContentResolver().update(SimInfo.CONTENT_URI, values,
+                SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID + "=" + subId, null);
+    }
+
+    /**
+     * load the config from siminfo db. It is only used internally.
+     */
+    public static @Nullable byte[] loadRcsConfigForSub(@NonNull Context cxt,
+            int subId, boolean isCompressed) {
+
+        byte[] data = null;
+
+        Cursor cursor = cxt.getContentResolver().query(SimInfo.CONTENT_URI, null,
+                SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID + "=" + subId, null, null);
+        try {
+            if (cursor != null && cursor.moveToFirst()) {
+                data = cursor.getBlob(cursor.getColumnIndexOrThrow(SimInfo.COLUMN_RCS_CONFIG));
+            }
+        } catch (Exception e) {
+            loge("error to load rcs config for sub:" + subId + " due to " + e);
+        } finally {
+            if (cursor != null) {
+                cursor.close();
+            }
+        }
+        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);
+    }
+
+    private static void loge(String msg) {
+        Rlog.e(LOG_TAG, msg);
+    }
+}
diff --git a/telephony/java/android/telephony/ims/SipDelegateManager.java b/telephony/java/android/telephony/ims/SipDelegateManager.java
index 2ec88ff..2e9eb94 100644
--- a/telephony/java/android/telephony/ims/SipDelegateManager.java
+++ b/telephony/java/android/telephony/ims/SipDelegateManager.java
@@ -18,7 +18,9 @@
 
 import android.Manifest;
 import android.annotation.IntDef;
+import android.annotation.IntRange;
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
 import android.annotation.SystemApi;
 import android.content.Context;
@@ -372,4 +374,37 @@
                     + " into this method");
         }
     }
+
+    /**
+     * Trigger a full network registration as required by receiving a SIP message containing a
+     * permanent error from the network or never receiving a response to a SIP transaction request.
+     *
+     * @param connection The {@link SipDelegateConnection} that was being used when this error was
+     *         received.
+     * @param sipCode The SIP code response associated with the SIP message request that
+     *         triggered this condition.
+     * @param sipReason The SIP reason code associated with the SIP message request that triggered
+     *         this condition. May be {@code null} if there was no reason String provided from the
+     *         network.
+     */
+    public void triggerFullNetworkRegistration(@NonNull SipDelegateConnection connection,
+            @IntRange(from = 100, to = 699) int sipCode, @Nullable String sipReason) {
+        if (connection == null) {
+            throw new IllegalArgumentException("invalid connection.");
+        }
+        if (connection instanceof SipDelegateConnectionAidlWrapper) {
+            SipDelegateConnectionAidlWrapper w = (SipDelegateConnectionAidlWrapper) connection;
+            try {
+                IImsRcsController controller = mBinderCache.getBinder();
+                controller.triggerNetworkRegistration(mSubId, w.getSipDelegateBinder(), sipCode,
+                        sipReason);
+            } catch (RemoteException e) {
+                // Connection to telephony died, but this will signal destruction of SipDelegate
+                // eventually anyway, so return.
+            }
+        } else {
+            throw new IllegalArgumentException("Unknown SipDelegateConnection implementation passed"
+                    + " into this method");
+        }
+    }
 }
diff --git a/telephony/java/android/telephony/ims/aidl/IImsConfig.aidl b/telephony/java/android/telephony/ims/aidl/IImsConfig.aidl
index 57206c9..5eee389 100644
--- a/telephony/java/android/telephony/ims/aidl/IImsConfig.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IImsConfig.aidl
@@ -18,8 +18,9 @@
 package android.telephony.ims.aidl;
 
 import android.os.PersistableBundle;
-
 import android.telephony.ims.aidl.IImsConfigCallback;
+import android.telephony.ims.aidl.IRcsConfigCallback;
+import android.telephony.ims.RcsClientConfiguration;
 
 import com.android.ims.ImsConfigListener;
 
@@ -41,4 +42,9 @@
     int setConfigString(int item, String value);
     void updateImsCarrierConfigs(in PersistableBundle bundle);
     void notifyRcsAutoConfigurationReceived(in byte[] config, boolean isCompressed);
+    void notifyRcsAutoConfigurationRemoved();
+    void addRcsConfigCallback(IRcsConfigCallback c);
+    void removeRcsConfigCallback(IRcsConfigCallback c);
+    void triggerRcsReconfiguration();
+    void setRcsClientConfiguration(in RcsClientConfiguration rcc);
 }
diff --git a/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl b/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl
index c6d9a86..3634989 100644
--- a/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl
@@ -67,6 +67,8 @@
             ISipDelegateConnectionStateCallback delegateState,
             ISipDelegateMessageCallback delegateMessage);
     void destroySipDelegate(int subId, ISipDelegate connection, int reason);
+    void triggerNetworkRegistration(int subId, ISipDelegate connection, int sipCode,
+            String sipReason);
 
     // Internal commands that should not be made public
     void registerRcsFeatureCallback(int slotId, in IImsServiceFeatureCallback callback);
diff --git a/telephony/java/android/telephony/ims/aidl/IImsRegistration.aidl b/telephony/java/android/telephony/ims/aidl/IImsRegistration.aidl
index 4ae0a75..4fd9040 100644
--- a/telephony/java/android/telephony/ims/aidl/IImsRegistration.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IImsRegistration.aidl
@@ -28,4 +28,7 @@
    int getRegistrationTechnology();
    oneway void addRegistrationCallback(IImsRegistrationCallback c);
    oneway void removeRegistrationCallback(IImsRegistrationCallback c);
-}
\ No newline at end of file
+   oneway void triggerFullNetworkRegistration(int sipCode, String sipReason);
+   oneway void triggerUpdateSipDelegateRegistration();
+   oneway void triggerSipDelegateDeregistration();
+}
diff --git a/telephony/java/android/telephony/ims/aidl/IRcsConfigCallback.aidl b/telephony/java/android/telephony/ims/aidl/IRcsConfigCallback.aidl
new file mode 100644
index 0000000..5a8973e
--- /dev/null
+++ b/telephony/java/android/telephony/ims/aidl/IRcsConfigCallback.aidl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.ims.aidl;
+
+/**
+ * The callback for RCS provisioning changes.
+ * {@hide}
+ */
+oneway interface IRcsConfigCallback {
+    void onConfigurationChanged(in byte[] config);
+    void onAutoConfigurationErrorReceived(int errorCode, String errorString);
+    void onConfigurationReset();
+    void onRemoved();
+}
+
diff --git a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java
index e757d9f..cc050be 100644
--- a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java
+++ b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java
@@ -23,8 +23,11 @@
 import android.os.PersistableBundle;
 import android.os.RemoteException;
 import android.telephony.ims.ProvisioningManager;
+import android.telephony.ims.RcsClientConfiguration;
+import android.telephony.ims.RcsConfig;
 import android.telephony.ims.aidl.IImsConfig;
 import android.telephony.ims.aidl.IImsConfigCallback;
+import android.telephony.ims.aidl.IRcsConfigCallback;
 import android.util.Log;
 
 import com.android.ims.ImsConfig;
@@ -202,7 +205,13 @@
         @Override
         public void notifyRcsAutoConfigurationReceived(byte[] config, boolean isCompressed)
                 throws RemoteException {
-            getImsConfigImpl().notifyRcsAutoConfigurationReceived(config, isCompressed);
+            getImsConfigImpl().onNotifyRcsAutoConfigurationReceived(config, isCompressed);
+        }
+
+        @Override
+        public void notifyRcsAutoConfigurationRemoved()
+                throws RemoteException {
+            getImsConfigImpl().onNotifyRcsAutoConfigurationRemoved();
         }
 
         private void notifyImsConfigChanged(int item, int value) throws RemoteException {
@@ -228,6 +237,26 @@
                 notifyImsConfigChanged(item, value);
             }
         }
+
+        @Override
+        public void addRcsConfigCallback(IRcsConfigCallback c) throws RemoteException {
+            getImsConfigImpl().addRcsConfigCallback(c);
+        }
+
+        @Override
+        public void removeRcsConfigCallback(IRcsConfigCallback c) throws RemoteException {
+            getImsConfigImpl().removeRcsConfigCallback(c);
+        }
+
+        @Override
+        public void triggerRcsReconfiguration() throws RemoteException {
+            getImsConfigImpl().triggerAutoConfiguration();
+        }
+
+        @Override
+        public void setRcsClientConfiguration(RcsClientConfiguration rcc) throws RemoteException {
+            getImsConfigImpl().setRcsClientConfiguration(rcc);
+        }
     }
 
     /**
@@ -257,6 +286,9 @@
 
     private final RemoteCallbackListExt<IImsConfigCallback> mCallbacks =
             new RemoteCallbackListExt<>();
+    private final RemoteCallbackListExt<IRcsConfigCallback> mRcsCallbacks =
+            new RemoteCallbackListExt<>();
+    private byte[] mRcsConfigData;
     ImsConfigStub mImsConfigStub;
 
     /**
@@ -320,6 +352,50 @@
         });
     }
 
+    private void addRcsConfigCallback(IRcsConfigCallback c) {
+        mRcsCallbacks.register(c);
+        if (mRcsConfigData != null) {
+            try {
+                c.onConfigurationChanged(mRcsConfigData);
+            } catch (RemoteException e) {
+                Log.w(TAG, "dead binder to call onConfigurationChanged, skipping.");
+            }
+        }
+    }
+
+    private void removeRcsConfigCallback(IRcsConfigCallback c) {
+        mRcsCallbacks.unregister(c);
+    }
+
+    private void onNotifyRcsAutoConfigurationReceived(byte[] config, boolean isCompressed) {
+        mRcsConfigData = isCompressed ? RcsConfig.decompressGzip(config) : config;
+        // can be null in testing
+        if (mRcsCallbacks != null) {
+            mRcsCallbacks.broadcastAction(c -> {
+                try {
+                    c.onConfigurationChanged(mRcsConfigData);
+                } catch (RemoteException e) {
+                    Log.w(TAG, "dead binder in notifyRcsAutoConfigurationReceived, skipping.");
+                }
+            });
+        }
+        notifyRcsAutoConfigurationReceived(config, isCompressed);
+    }
+
+    private void onNotifyRcsAutoConfigurationRemoved() {
+        mRcsConfigData = null;
+        if (mRcsCallbacks != null) {
+            mRcsCallbacks.broadcastAction(c -> {
+                try {
+                    c.onConfigurationReset();
+                } catch (RemoteException e) {
+                    Log.w(TAG, "dead binder in notifyRcsAutoConfigurationRemoved, skipping.");
+                }
+            });
+        }
+        notifyRcsAutoConfigurationRemoved();
+    }
+
     /**
      * @hide
      */
@@ -369,6 +445,12 @@
     }
 
     /**
+     * The RCS autoconfiguration XML file is removed or invalid.
+     */
+    public void notifyRcsAutoConfigurationRemoved() {
+    }
+
+    /**
      * Sets the configuration value for this ImsService.
      *
      * @param item an integer key.
@@ -421,4 +503,43 @@
     public void updateImsCarrierConfigs(PersistableBundle bundle) {
         // Base Implementation - Should be overridden
     }
+
+    /**
+     * Default messaging application parameters are sent to the ACS client
+     * using this interface.
+     * @param rcc RCS client configuration {@link RcsClientConfiguration}
+     */
+    public void setRcsClientConfiguration(@NonNull RcsClientConfiguration rcc) {
+        // Base Implementation - Should be overridden
+    }
+
+    /**
+     * Reconfiguration triggered by the RCS application. Most likely cause
+     * is the 403 forbidden to a SIP/HTTP request
+     */
+    public void triggerAutoConfiguration() {
+        // Base Implementation - Should be overridden
+    }
+
+    /**
+     * Errors during autoconfiguration connection setup are notified by the
+     * ACS client using this interface.
+     * @param errorCode HTTP error received during connection setup.
+     * @param errorString reason phrase received with the error
+     */
+    public final void notifyAutoConfigurationErrorReceived(int errorCode,
+            @NonNull String errorString) {
+        // can be null in testing
+        if (mRcsCallbacks == null) {
+            return;
+        }
+        mRcsCallbacks.broadcastAction(c -> {
+            try {
+                //TODO compressed by default?
+                c.onAutoConfigurationErrorReceived(errorCode, errorString);
+            } catch (RemoteException e) {
+                Log.w(TAG, "dead binder in notifyAutoConfigurationErrorReceived, skipping.");
+            }
+        });
+    }
 }
diff --git a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
index 153d687..088a7e2 100644
--- a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
+++ b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
@@ -38,6 +38,9 @@
 /**
  * Controls IMS registration for this ImsService and notifies the framework when the IMS
  * registration for this ImsService has changed status.
+ * <p>
+ * Note: There is no guarantee on the thread that the calls from the framework will be called on. It
+ * is the implementors responsibility to handle moving the calls to a working thread if required.
  * @hide
  */
 @SystemApi
@@ -92,6 +95,21 @@
         public void removeRegistrationCallback(IImsRegistrationCallback c) throws RemoteException {
             ImsRegistrationImplBase.this.removeRegistrationCallback(c);
         }
+
+        @Override
+        public void triggerFullNetworkRegistration(int sipCode, String sipReason) {
+            ImsRegistrationImplBase.this.triggerFullNetworkRegistration(sipCode, sipReason);
+        }
+
+        @Override
+        public void triggerUpdateSipDelegateRegistration() {
+            ImsRegistrationImplBase.this.updateSipDelegateRegistration();
+        }
+
+        @Override
+        public void triggerSipDelegateDeregistration() {
+            ImsRegistrationImplBase.this.triggerSipDelegateDeregistration();
+        }
     };
 
     private final RemoteCallbackListExt<IImsRegistrationCallback> mCallbacks =
@@ -133,7 +151,6 @@
      * If the SIP delegate feature tag configuration has changed, then this method will be
      * called in order to let the ImsService know that it can pick up these changes in the IMS
      * registration.
-     * @hide
      */
     public void updateSipDelegateRegistration() {
         // Stub implementation, ImsService should implement this
@@ -150,7 +167,6 @@
      * <p>
      * This should not affect the registration of features managed by the ImsService itself, such as
      * feature tags related to MMTEL registration.
-     * @hide
      */
     public void triggerSipDelegateDeregistration() {
         // Stub implementation, ImsService should implement this
@@ -169,9 +185,8 @@
      *    be carrier specific.
      * @param sipReason The reason associated with the SIP error code. {@code null} if there was no
      *    reason associated with the error.
-     * @hide
      */
-    public void triggerNetworkReregistration(@IntRange(from = 100, to = 699) int sipCode,
+    public void triggerFullNetworkRegistration(@IntRange(from = 100, to = 699) int sipCode,
             @Nullable String sipReason) {
         // Stub implementation, ImsService should implement this
     }
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 2da45ca..ff240a0 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -52,6 +52,7 @@
 import android.telephony.TelephonyHistogram;
 import android.telephony.VisualVoicemailSmsFilterSettings;
 import android.telephony.emergency.EmergencyNumber;
+import android.telephony.ims.RcsClientConfiguration;
 import android.telephony.ims.aidl.IImsCapabilityCallback;
 import android.telephony.ims.aidl.IImsConfig;
 import android.telephony.ims.aidl.IImsConfigCallback;
@@ -59,6 +60,7 @@
 import android.telephony.ims.aidl.IImsRcsFeature;
 import android.telephony.ims.aidl.IImsRegistration;
 import android.telephony.ims.aidl.IImsRegistrationCallback;
+import android.telephony.ims.aidl.IRcsConfigCallback;
 import com.android.ims.internal.IImsServiceFeatureCallback;
 import com.android.internal.telephony.CellNetworkScanResult;
 import com.android.internal.telephony.IBooleanConsumer;
@@ -2311,4 +2313,51 @@
      * Return the release time for telephony to unbind GbaService.
      */
     int getGbaReleaseTime(int subId);
+
+    /**
+     * Provide the client configuration parameters of the RCS application.
+     */
+    void setRcsClientConfiguration(int subId, in RcsClientConfiguration rcc);
+
+    /**
+     * return value to indicate whether the device and the carrier can support RCS VoLTE
+     * single registration.
+     */
+    boolean isRcsVolteSingleRegistrationCapable(int subId);
+
+    /**
+     * Register RCS provisioning callback.
+     */
+    void registerRcsProvisioningChangedCallback(int subId,
+            IRcsConfigCallback callback);
+
+    /**
+     * Unregister RCS provisioning callback.
+     */
+    void unregisterRcsProvisioningChangedCallback(int subId, IRcsConfigCallback callback);
+
+    /**
+     * trigger RCS reconfiguration.
+     */
+    void triggerRcsReconfiguration(int subId);
+
+    /**
+     * Overrides the config of RCS VoLTE single registration enabled for the device.
+     */
+    void setDeviceSingleRegistrationEnabledOverride(String enabled);
+
+    /**
+     * Gets the config of RCS VoLTE single registration enabled for the device.
+     */
+    boolean getDeviceSingleRegistrationEnabled();
+
+    /**
+     * Overrides the config of RCS VoLTE single registration enabled for the carrier/subscription.
+     */
+    boolean setCarrierSingleRegistrationEnabledOverride(int subId, String enabled);
+
+    /**
+     * Gets the config of RCS VoLTE single registration enabled for the carrier/subscription.
+     */
+    boolean getCarrierSingleRegistrationEnabled(int subId);
 }
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index 42dee0e..76243a5 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -522,6 +522,8 @@
     int RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS = 219;
     int RIL_REQUEST_GET_HAL_DEVICE_CAPABILITIES = 220;
     int RIL_REQUEST_SET_DATA_THROTTLING = 221;
+    int RIL_REQUEST_SET_ALLOWED_NETWORK_TYPE_BITMAP = 222;
+    int RIL_REQUEST_GET_ALLOWED_NETWORK_TYPE_BITMAP = 223;
 
     /* Responses begin */
     int RIL_RESPONSE_ACKNOWLEDGEMENT = 800;
diff --git a/test-mock/src/android/test/mock/OWNERS b/test-mock/src/android/test/mock/OWNERS
index 9551245..72e8ffc 100644
--- a/test-mock/src/android/test/mock/OWNERS
+++ b/test-mock/src/android/test/mock/OWNERS
@@ -1,3 +1 @@
-set noparent
-
 *
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index b3bdd60..20b05b5 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -39,6 +39,7 @@
 import static android.net.ConnectivityManager.TYPE_MOBILE_FOTA;
 import static android.net.ConnectivityManager.TYPE_MOBILE_MMS;
 import static android.net.ConnectivityManager.TYPE_MOBILE_SUPL;
+import static android.net.ConnectivityManager.TYPE_VPN;
 import static android.net.ConnectivityManager.TYPE_WIFI;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_DNS;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_FALLBACK;
@@ -101,6 +102,8 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.mockito.AdditionalMatchers.aryEq;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.argThat;
@@ -132,6 +135,7 @@
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.ContentProvider;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -140,6 +144,8 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
 import android.location.LocationManager;
@@ -176,6 +182,7 @@
 import android.net.NetworkCapabilities;
 import android.net.NetworkFactory;
 import android.net.NetworkInfo;
+import android.net.NetworkInfo.DetailedState;
 import android.net.NetworkRequest;
 import android.net.NetworkSpecifier;
 import android.net.NetworkStack;
@@ -332,12 +339,13 @@
     private static final String WIFI_WOL_IFNAME = "test_wlan_wol";
     private static final String VPN_IFNAME = "tun10042";
     private static final String TEST_PACKAGE_NAME = "com.android.test.package";
-    private static final String[] EMPTY_STRING_ARRAY = new String[0];
+    private static final String ALWAYS_ON_PACKAGE = "com.android.test.alwaysonvpn";
 
     private static final String INTERFACE_NAME = "interface";
 
     private MockContext mServiceContext;
     private HandlerThread mCsHandlerThread;
+    private ConnectivityService.Dependencies mDeps;
     private ConnectivityService mService;
     private WrappedConnectivityManager mCm;
     private TestNetworkAgentWrapper mWiFiNetworkAgent;
@@ -353,6 +361,7 @@
     @Mock IIpConnectivityMetrics mIpConnectivityMetrics;
     @Mock IpConnectivityMetrics.Logger mMetricsService;
     @Mock DefaultNetworkMetrics mDefaultNetworkMetrics;
+    @Mock DeviceIdleInternal mDeviceIdleInternal;
     @Mock INetworkManagementService mNetworkManagementService;
     @Mock INetworkStatsService mStatsService;
     @Mock IBatteryStats mBatteryStatsService;
@@ -450,6 +459,15 @@
         }
 
         @Override
+        public ComponentName startService(Intent service) {
+            final String action = service.getAction();
+            if (!VpnConfig.SERVICE_INTERFACE.equals(action)) {
+                fail("Attempt to start unknown service, action=" + action);
+            }
+            return new ComponentName(service.getPackage(), "com.android.test.Service");
+        }
+
+        @Override
         public Object getSystemService(String name) {
             if (Context.CONNECTIVITY_SERVICE.equals(name)) return mCm;
             if (Context.NOTIFICATION_SERVICE.equals(name)) return mNotificationManager;
@@ -1055,9 +1073,19 @@
         private VpnInfo mVpnInfo;
 
         public MockVpn(int userId) {
-            super(startHandlerThreadAndReturnLooper(), mServiceContext, mNetworkManagementService,
-                    mMockNetd, userId, mock(KeyStore.class));
-            mConfig = new VpnConfig();
+            super(startHandlerThreadAndReturnLooper(), mServiceContext,
+                    new Dependencies() {
+                        @Override
+                        public boolean isCallerSystem() {
+                            return true;
+                        }
+
+                        @Override
+                        public DeviceIdleInternal getDeviceIdleInternal() {
+                            return mDeviceIdleInternal;
+                        }
+                    },
+                    mNetworkManagementService, mMockNetd, userId, mock(KeyStore.class));
         }
 
         public void setUids(Set<UidRange> uids) {
@@ -1086,9 +1114,16 @@
             return mVpnType;
         }
 
+        private LinkProperties makeLinkProperties() {
+            final LinkProperties lp = new LinkProperties();
+            lp.setInterfaceName(VPN_IFNAME);
+            return lp;
+        }
+
         private void registerAgent(boolean isAlwaysMetered, Set<UidRange> uids, LinkProperties lp)
                 throws Exception {
             if (mAgentRegistered) throw new IllegalStateException("already registered");
+            mConfig = new VpnConfig();
             setUids(uids);
             if (!isAlwaysMetered) mNetworkCapabilities.addCapability(NET_CAPABILITY_NOT_METERED);
             mInterface = VPN_IFNAME;
@@ -1101,12 +1136,13 @@
             verify(mMockNetd, never())
                     .networkRemoveUidRanges(eq(mMockVpn.getNetId()), any());
             mAgentRegistered = true;
+            updateState(NetworkInfo.DetailedState.CONNECTED, "registerAgent");
             mNetworkCapabilities.set(mMockNetworkAgent.getNetworkCapabilities());
             mNetworkAgent = mMockNetworkAgent.getNetworkAgent();
         }
 
         private void registerAgent(Set<UidRange> uids) throws Exception {
-            registerAgent(false /* isAlwaysMetered */, uids, new LinkProperties());
+            registerAgent(false /* isAlwaysMetered */, uids, makeLinkProperties());
         }
 
         private void connect(boolean validated, boolean hasInternet, boolean isStrictMode) {
@@ -1142,12 +1178,12 @@
         public void establishForMyUid(boolean validated, boolean hasInternet, boolean isStrictMode)
                 throws Exception {
             final int uid = Process.myUid();
-            establish(new LinkProperties(), uid, uidRangesForUid(uid), validated, hasInternet,
+            establish(makeLinkProperties(), uid, uidRangesForUid(uid), validated, hasInternet,
                     isStrictMode);
         }
 
         public void establishForMyUid() throws Exception {
-            establishForMyUid(new LinkProperties());
+            establishForMyUid(makeLinkProperties());
         }
 
         public void sendLinkProperties(LinkProperties lp) {
@@ -1155,7 +1191,10 @@
         }
 
         public void disconnect() {
-            if (mMockNetworkAgent != null) mMockNetworkAgent.disconnect();
+            if (mMockNetworkAgent != null) {
+                mMockNetworkAgent.disconnect();
+                updateState(NetworkInfo.DetailedState.DISCONNECTED, "disconnect");
+            }
             mAgentRegistered = false;
         }
 
@@ -1229,6 +1268,17 @@
         fail("ConditionVariable was blocked for more than " + TIMEOUT_MS + "ms");
     }
 
+    private void registerNetworkCallbackAsUid(NetworkRequest request, NetworkCallback callback,
+            int uid) {
+        when(mDeps.getCallingUid()).thenReturn(uid);
+        try {
+            mCm.registerNetworkCallback(request, callback);
+            waitForIdle();
+        } finally {
+            returnRealCallingUid();
+        }
+    }
+
     private static final int VPN_USER = 0;
     private static final int APP1_UID = UserHandle.getUid(VPN_USER, 10100);
     private static final int APP2_UID = UserHandle.getUid(VPN_USER, 10101);
@@ -1271,7 +1321,8 @@
         initAlarmManager(mAlarmManager, mAlarmManagerThread.getThreadHandler());
 
         mCsHandlerThread = new HandlerThread("TestConnectivityService");
-        final ConnectivityService.Dependencies deps = makeDependencies();
+        mDeps = makeDependencies();
+        returnRealCallingUid();
         mService = new ConnectivityService(mServiceContext,
                 mNetworkManagementService,
                 mStatsService,
@@ -1279,9 +1330,9 @@
                 mMockDnsResolver,
                 mock(IpConnectivityLog.class),
                 mMockNetd,
-                deps);
+                mDeps);
         mService.mLingerDelayMs = TEST_LINGER_DELAY_MS;
-        verify(deps).makeMultinetworkPolicyTracker(any(), any(), any());
+        verify(mDeps).makeMultinetworkPolicyTracker(any(), any(), any());
 
         final ArgumentCaptor<INetworkPolicyListener> policyListenerCaptor =
                 ArgumentCaptor.forClass(INetworkPolicyListener.class);
@@ -1301,6 +1352,10 @@
         setPrivateDnsSettings(PRIVATE_DNS_MODE_OFF, "ignored.example.com");
     }
 
+    private void returnRealCallingUid() {
+        doAnswer((invocationOnMock) -> Binder.getCallingUid()).when(mDeps).getCallingUid();
+    }
+
     private ConnectivityService.Dependencies makeDependencies() {
         doReturn(TEST_TCP_INIT_RWND).when(mSystemProperties)
                 .getInt("net.tcp.default_init_rwnd", 0);
@@ -1376,13 +1431,13 @@
     }
 
     private void mockDefaultPackages() throws Exception {
-        final String testPackageName = mContext.getPackageName();
-        final PackageInfo testPackageInfo = mContext.getPackageManager().getPackageInfo(
-                testPackageName, PackageManager.GET_PERMISSIONS);
+        final String myPackageName = mContext.getPackageName();
+        final PackageInfo myPackageInfo = mContext.getPackageManager().getPackageInfo(
+                myPackageName, PackageManager.GET_PERMISSIONS);
         when(mPackageManager.getPackagesForUid(Binder.getCallingUid())).thenReturn(
-                new String[] {testPackageName});
-        when(mPackageManager.getPackageInfoAsUser(eq(testPackageName), anyInt(),
-                eq(UserHandle.getCallingUserId()))).thenReturn(testPackageInfo);
+                new String[] {myPackageName});
+        when(mPackageManager.getPackageInfoAsUser(eq(myPackageName), anyInt(),
+                eq(UserHandle.getCallingUserId()))).thenReturn(myPackageInfo);
 
         when(mPackageManager.getInstalledPackages(eq(GET_PERMISSIONS | MATCH_ANY_USER))).thenReturn(
                 Arrays.asList(new PackageInfo[] {
@@ -1390,6 +1445,25 @@
                         buildPackageInfo(/* SYSTEM */ false, APP2_UID),
                         buildPackageInfo(/* SYSTEM */ false, VPN_UID)
                 }));
+
+        // Create a fake always-on VPN package.
+        final int userId = UserHandle.getCallingUserId();
+        final ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.targetSdkVersion = Build.VERSION_CODES.R;  // Always-on supported in N+.
+        when(mPackageManager.getApplicationInfoAsUser(eq(ALWAYS_ON_PACKAGE), anyInt(),
+                eq(userId))).thenReturn(applicationInfo);
+
+        // Minimal mocking to keep Vpn#isAlwaysOnPackageSupported happy.
+        ResolveInfo rInfo = new ResolveInfo();
+        rInfo.serviceInfo = new ServiceInfo();
+        rInfo.serviceInfo.metaData = new Bundle();
+        final List<ResolveInfo> services = Arrays.asList(new ResolveInfo[]{rInfo});
+        when(mPackageManager.queryIntentServicesAsUser(any(), eq(PackageManager.GET_META_DATA),
+                eq(userId))).thenReturn(services);
+        when(mPackageManager.getPackageUidAsUser(TEST_PACKAGE_NAME, userId))
+                .thenReturn(Process.myUid());
+        when(mPackageManager.getPackageUidAsUser(ALWAYS_ON_PACKAGE, userId))
+                .thenReturn(VPN_UID);
     }
 
     private void verifyActiveNetwork(int transport) {
@@ -2252,10 +2326,10 @@
     }
 
     private void grantUsingBackgroundNetworksPermissionForUid(final int uid) throws Exception {
-        final String testPackageName = mContext.getPackageName();
-        when(mPackageManager.getPackageInfo(eq(testPackageName), eq(GET_PERMISSIONS)))
+        final String myPackageName = mContext.getPackageName();
+        when(mPackageManager.getPackageInfo(eq(myPackageName), eq(GET_PERMISSIONS)))
                 .thenReturn(buildPackageInfo(true, uid));
-        mService.mPermissionMonitor.onPackageAdded(testPackageName, uid);
+        mService.mPermissionMonitor.onPackageAdded(myPackageName, uid);
     }
 
     @Test
@@ -5831,10 +5905,21 @@
         assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
     }
 
+    private void assertDefaultNetworkCapabilities(int userId, NetworkAgentWrapper... networks) {
+        final NetworkCapabilities[] defaultCaps = mService.getDefaultNetworkCapabilitiesForUser(
+                userId, "com.android.calling.package");
+        final String defaultCapsString = Arrays.toString(defaultCaps);
+        assertEquals(defaultCapsString, defaultCaps.length, networks.length);
+        final Set<NetworkCapabilities> defaultCapsSet = new ArraySet<>(defaultCaps);
+        for (NetworkAgentWrapper network : networks) {
+            final NetworkCapabilities nc = mCm.getNetworkCapabilities(network.getNetwork());
+            final String msg = "Did not find " + nc + " in " + Arrays.toString(defaultCaps);
+            assertTrue(msg, defaultCapsSet.contains(nc));
+        }
+    }
+
     @Test
     public void testVpnSetUnderlyingNetworks() throws Exception {
-        final int uid = Process.myUid();
-
         final TestNetworkCallback vpnNetworkCallback = new TestNetworkCallback();
         final NetworkRequest vpnNetworkRequest = new NetworkRequest.Builder()
                 .removeCapability(NET_CAPABILITY_NOT_VPN)
@@ -5857,6 +5942,9 @@
         // A VPN without underlying networks is not suspended.
         assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
 
+        final int userId = UserHandle.getUserId(Process.myUid());
+        assertDefaultNetworkCapabilities(userId /* no networks */);
+
         // Connect cell and use it as an underlying network.
         mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
         mCellNetworkAgent.addCapability(NET_CAPABILITY_NOT_SUSPENDED);
@@ -5870,6 +5958,7 @@
                 && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI)
                 && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)
                 && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
+        assertDefaultNetworkCapabilities(userId, mCellNetworkAgent);
 
         mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
         mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED);
@@ -5884,6 +5973,7 @@
                 && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI)
                 && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)
                 && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
+        assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
 
         // Don't disconnect, but note the VPN is not using wifi any more.
         mService.setUnderlyingNetworksForVpn(
@@ -5894,6 +5984,9 @@
                 && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI)
                 && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)
                 && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
+        // The return value of getDefaultNetworkCapabilitiesForUser always includes the default
+        // network (wifi) as well as the underlying networks (cell).
+        assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
 
         // Remove NOT_SUSPENDED from the only network and observe VPN is now suspended.
         mCellNetworkAgent.removeCapability(NET_CAPABILITY_NOT_SUSPENDED);
@@ -5922,6 +6015,7 @@
                 && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI)
                 && caps.hasCapability(NET_CAPABILITY_NOT_METERED)
                 && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
+        assertDefaultNetworkCapabilities(userId, mWiFiNetworkAgent);
 
         // Use both again.
         mService.setUnderlyingNetworksForVpn(
@@ -5932,6 +6026,7 @@
                 && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI)
                 && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)
                 && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
+        assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
 
         // Cell is suspended again. As WiFi is not, this should not cause a callback.
         mCellNetworkAgent.removeCapability(NET_CAPABILITY_NOT_SUSPENDED);
@@ -5949,6 +6044,7 @@
         // a bug in ConnectivityService, but as the SUSPENDED and RESUMED callbacks have never
         // been public and are deprecated and slated for removal, there is no sense in spending
         // resources fixing this bug now.
+        assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
 
         // Use both again.
         mService.setUnderlyingNetworksForVpn(
@@ -5961,6 +6057,7 @@
                 && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
         // As above, the RESUMED callback not being sent here is a bug, but not a bug that's
         // worth anybody's time to fix.
+        assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
 
         // Disconnect cell. Receive update without even removing the dead network from the
         // underlying networks – it's dead anyway. Not metered any more.
@@ -5969,6 +6066,7 @@
                 (caps) -> caps.hasTransport(TRANSPORT_VPN)
                 && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI)
                 && caps.hasCapability(NET_CAPABILITY_NOT_METERED));
+        assertDefaultNetworkCapabilities(userId, mWiFiNetworkAgent);
 
         // Disconnect wifi too. No underlying networks means this is now metered.
         mWiFiNetworkAgent.disconnect();
@@ -5976,6 +6074,11 @@
                 (caps) -> caps.hasTransport(TRANSPORT_VPN)
                 && !caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI)
                 && !caps.hasCapability(NET_CAPABILITY_NOT_METERED));
+        // When a network disconnects, the callbacks are fired before all state is updated, so for a
+        // short time, synchronous calls will behave as if the network is still connected. Wait for
+        // things to settle.
+        waitForIdle();
+        assertDefaultNetworkCapabilities(userId /* no networks */);
 
         mMockVpn.disconnect();
     }
@@ -6276,6 +6379,7 @@
         // Despite VPN using WiFi (which is unmetered), VPN itself is marked as always metered.
         assertTrue(mCm.isActiveNetworkMetered());
 
+
         // VPN explicitly declares WiFi as its underlying network.
         mService.setUnderlyingNetworksForVpn(
                 new Network[] { mWiFiNetworkAgent.getNetwork() });
@@ -6389,6 +6493,189 @@
         mCm.unregisterNetworkCallback(defaultCallback);
     }
 
+    private void expectNetworkRejectNonSecureVpn(InOrder inOrder, boolean add,
+            UidRangeParcel... expected) throws Exception {
+        inOrder.verify(mMockNetd).networkRejectNonSecureVpn(eq(add), aryEq(expected));
+    }
+
+    private void checkNetworkInfo(NetworkInfo ni, int type, DetailedState state) {
+        assertNotNull(ni);
+        assertEquals(type, ni.getType());
+        assertEquals(ConnectivityManager.getNetworkTypeName(type), state, ni.getDetailedState());
+    }
+
+    private void assertActiveNetworkInfo(int type, DetailedState state) {
+        checkNetworkInfo(mCm.getActiveNetworkInfo(), type, state);
+    }
+    private void assertNetworkInfo(int type, DetailedState state) {
+        checkNetworkInfo(mCm.getNetworkInfo(type), type, state);
+    }
+
+    @Test
+    public void testNetworkBlockedStatusAlwaysOnVpn() throws Exception {
+        mServiceContext.setPermission(
+                Manifest.permission.CONTROL_ALWAYS_ON_VPN, PERMISSION_GRANTED);
+        mServiceContext.setPermission(
+                Manifest.permission.CONTROL_VPN, PERMISSION_GRANTED);
+        mServiceContext.setPermission(
+                Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED);
+
+        final TestNetworkCallback callback = new TestNetworkCallback();
+        final NetworkRequest request = new NetworkRequest.Builder()
+                .removeCapability(NET_CAPABILITY_NOT_VPN)
+                .build();
+        mCm.registerNetworkCallback(request, callback);
+
+        final TestNetworkCallback defaultCallback = new TestNetworkCallback();
+        mCm.registerDefaultNetworkCallback(defaultCallback);
+
+        final TestNetworkCallback vpnUidCallback = new TestNetworkCallback();
+        final NetworkRequest vpnUidRequest = new NetworkRequest.Builder().build();
+        registerNetworkCallbackAsUid(vpnUidRequest, vpnUidCallback, VPN_UID);
+
+        final int uid = Process.myUid();
+        final int userId = UserHandle.getUserId(uid);
+        final ArrayList<String> allowList = new ArrayList<>();
+        mService.setAlwaysOnVpnPackage(userId, ALWAYS_ON_PACKAGE, true /* lockdown */, allowList);
+
+        UidRangeParcel firstHalf = new UidRangeParcel(1, VPN_UID - 1);
+        UidRangeParcel secondHalf = new UidRangeParcel(VPN_UID + 1, 99999);
+        InOrder inOrder = inOrder(mMockNetd);
+        expectNetworkRejectNonSecureVpn(inOrder, true, firstHalf, secondHalf);
+
+        // Connect a network when lockdown is active, expect to see it blocked.
+        mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
+        mWiFiNetworkAgent.connect(false /* validated */);
+        callback.expectAvailableCallbacksUnvalidatedAndBlocked(mWiFiNetworkAgent);
+        defaultCallback.expectAvailableCallbacksUnvalidatedAndBlocked(mWiFiNetworkAgent);
+        vpnUidCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+        assertNull(mCm.getActiveNetwork());
+        assertActiveNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
+        // Mobile is BLOCKED even though it's not actually connected.
+        assertNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
+        assertNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
+
+        // Disable lockdown, expect to see the network unblocked.
+        // There are no callbacks because they are not implemented yet.
+        mService.setAlwaysOnVpnPackage(userId, null, false /* lockdown */, allowList);
+        expectNetworkRejectNonSecureVpn(inOrder, false, firstHalf, secondHalf);
+        vpnUidCallback.assertNoCallback();
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
+        assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+        assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+        assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+        // Add our UID to the allowlist and re-enable lockdown, expect network is not blocked.
+        allowList.add(TEST_PACKAGE_NAME);
+        mService.setAlwaysOnVpnPackage(userId, ALWAYS_ON_PACKAGE, true /* lockdown */, allowList);
+        callback.assertNoCallback();
+        defaultCallback.assertNoCallback();
+        vpnUidCallback.assertNoCallback();
+
+        // The following requires that the UID of this test package is greater than VPN_UID. This
+        // is always true in practice because a plain AOSP build with no apps installed has almost
+        // 200 packages installed.
+        final UidRangeParcel piece1 = new UidRangeParcel(1, VPN_UID - 1);
+        final UidRangeParcel piece2 = new UidRangeParcel(VPN_UID + 1, uid - 1);
+        final UidRangeParcel piece3 = new UidRangeParcel(uid + 1, 99999);
+        expectNetworkRejectNonSecureVpn(inOrder, true, piece1, piece2, piece3);
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
+        assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+        assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+        assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+        // Connect a new network, expect it to be unblocked.
+        mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
+        mCellNetworkAgent.connect(false /* validated */);
+        callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent);
+        defaultCallback.assertNoCallback();
+        vpnUidCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent);
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
+        assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+        // Cellular is DISCONNECTED because it's not the default and there are no requests for it.
+        assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+        assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+        // Disable lockdown, remove our UID from the allowlist, and re-enable lockdown.
+        // Everything should now be blocked.
+        mService.setAlwaysOnVpnPackage(userId, null, false /* lockdown */, allowList);
+        expectNetworkRejectNonSecureVpn(inOrder, false, piece1, piece2, piece3);
+        allowList.clear();
+        mService.setAlwaysOnVpnPackage(userId, ALWAYS_ON_PACKAGE, true /* lockdown */, allowList);
+        expectNetworkRejectNonSecureVpn(inOrder, true, firstHalf, secondHalf);
+        vpnUidCallback.assertNoCallback();
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+        assertNull(mCm.getActiveNetwork());
+        assertActiveNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
+        assertNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
+        assertNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
+
+        // Disable lockdown. Everything is unblocked.
+        mService.setAlwaysOnVpnPackage(userId, null, false /* lockdown */, allowList);
+        vpnUidCallback.assertNoCallback();
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
+        assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+        assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+        assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+        // Enable and disable an always-on VPN package without lockdown. Expect no changes.
+        reset(mMockNetd);
+        mService.setAlwaysOnVpnPackage(userId, ALWAYS_ON_PACKAGE, false /* lockdown */, allowList);
+        inOrder.verify(mMockNetd, never()).networkRejectNonSecureVpn(anyBoolean(), any());
+        callback.assertNoCallback();
+        defaultCallback.assertNoCallback();
+        vpnUidCallback.assertNoCallback();
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
+        assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+        assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+        assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+        mService.setAlwaysOnVpnPackage(userId, null, false /* lockdown */, allowList);
+        inOrder.verify(mMockNetd, never()).networkRejectNonSecureVpn(anyBoolean(), any());
+        callback.assertNoCallback();
+        defaultCallback.assertNoCallback();
+        vpnUidCallback.assertNoCallback();
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
+        assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+        assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+        assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+        // Enable lockdown and connect a VPN. The VPN is not blocked.
+        mService.setAlwaysOnVpnPackage(userId, ALWAYS_ON_PACKAGE, true /* lockdown */, allowList);
+        vpnUidCallback.assertNoCallback();
+        assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+        assertNull(mCm.getActiveNetwork());
+        assertActiveNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
+        assertNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
+        assertNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
+
+        mMockVpn.establishForMyUid();
+        defaultCallback.expectAvailableThenValidatedCallbacks(mMockVpn);
+        vpnUidCallback.assertNoCallback();  // vpnUidCallback has NOT_VPN capability.
+        assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork());
+        assertEquals(null, mCm.getActiveNetworkForUid(VPN_UID));  // BUG?
+        assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+        assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+        assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED);
+        assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+        mMockVpn.disconnect();
+        defaultCallback.expectCallback(CallbackEntry.LOST, mMockVpn);
+        defaultCallback.expectAvailableCallbacksUnvalidatedAndBlocked(mWiFiNetworkAgent);
+        assertNull(mCm.getActiveNetwork());
+
+        mCm.unregisterNetworkCallback(callback);
+        mCm.unregisterNetworkCallback(defaultCallback);
+        mCm.unregisterNetworkCallback(vpnUidCallback);
+    }
+
     @Test
     public final void testLoseTrusted() throws Exception {
         final NetworkRequest trustedRequest = new NetworkRequest.Builder()
diff --git a/tests/net/java/com/android/server/connectivity/VpnTest.java b/tests/net/java/com/android/server/connectivity/VpnTest.java
index 6e380be..cc47317 100644
--- a/tests/net/java/com/android/server/connectivity/VpnTest.java
+++ b/tests/net/java/com/android/server/connectivity/VpnTest.java
@@ -228,7 +228,6 @@
                         R.string.config_customVpnAlwaysOnDisconnectedDialogComponent));
         when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_IPSEC_TUNNELS))
                 .thenReturn(true);
-        when(mSystemServices.isCallerSystem()).thenReturn(true);
 
         // Used by {@link Notification.Builder}
         ApplicationInfo applicationInfo = new ApplicationInfo();
@@ -1102,6 +1101,11 @@
         }
 
         @Override
+        public boolean isCallerSystem() {
+            return true;
+        }
+
+        @Override
         public void startService(final String serviceName) {
             mRunningServices.put(serviceName, true);
         }
diff --git a/wifi/java/android/net/wifi/nl80211/WifiNl80211Manager.java b/wifi/java/android/net/wifi/nl80211/WifiNl80211Manager.java
index 91d25f9..db2eb99 100644
--- a/wifi/java/android/net/wifi/nl80211/WifiNl80211Manager.java
+++ b/wifi/java/android/net/wifi/nl80211/WifiNl80211Manager.java
@@ -588,7 +588,7 @@
     public boolean setupInterfaceForClientMode(@NonNull String ifaceName,
             @NonNull @CallbackExecutor Executor executor,
             @NonNull ScanEventCallback scanCallback, @NonNull ScanEventCallback pnoScanCallback) {
-        Log.d(TAG, "Setting up interface for client mode");
+        Log.d(TAG, "Setting up interface for client mode: " + ifaceName);
         if (!retrieveWificondAndRegisterForDeath()) {
             return false;
         }
@@ -646,7 +646,7 @@
      */
     public boolean tearDownClientInterface(@NonNull String ifaceName) {
         if (getClientInterface(ifaceName) == null) {
-            Log.e(TAG, "No valid wificond client interface handler");
+            Log.e(TAG, "No valid wificond client interface handler for iface=" + ifaceName);
             return false;
         }
         try {
@@ -661,7 +661,7 @@
         }
 
         if (mWificond == null) {
-            Log.e(TAG, "Reference to wifiCond is null");
+            Log.e(TAG, "tearDownClientInterface: mWificond binder is null! Did wificond die?");
             return false;
         }
 
@@ -691,7 +691,7 @@
      * @return true on success.
      */
     public boolean setupInterfaceForSoftApMode(@NonNull String ifaceName) {
-        Log.d(TAG, "Setting up interface for soft ap mode");
+        Log.d(TAG, "Setting up interface for soft ap mode for iface=" + ifaceName);
         if (!retrieveWificondAndRegisterForDeath()) {
             return false;
         }
@@ -725,12 +725,12 @@
      */
     public boolean tearDownSoftApInterface(@NonNull String ifaceName) {
         if (getApInterface(ifaceName) == null) {
-            Log.e(TAG, "No valid wificond ap interface handler");
+            Log.e(TAG, "No valid wificond ap interface handler for iface=" + ifaceName);
             return false;
         }
 
         if (mWificond == null) {
-            Log.e(TAG, "Reference to wifiCond is null");
+            Log.e(TAG, "tearDownSoftApInterface: mWificond binder is null! Did wificond die?");
             return false;
         }
 
@@ -797,7 +797,7 @@
     @Nullable public SignalPollResult signalPoll(@NonNull String ifaceName) {
         IClientInterface iface = getClientInterface(ifaceName);
         if (iface == null) {
-            Log.e(TAG, "No valid wificond client interface handler");
+            Log.e(TAG, "No valid wificond client interface handler for iface=" + ifaceName);
             return null;
         }
 
@@ -828,7 +828,7 @@
     @Nullable public TxPacketCounters getTxPacketCounters(@NonNull String ifaceName) {
         IClientInterface iface = getClientInterface(ifaceName);
         if (iface == null) {
-            Log.e(TAG, "No valid wificond client interface handler");
+            Log.e(TAG, "No valid wificond client interface handler for iface=" + ifaceName);
             return null;
         }
 
@@ -871,7 +871,7 @@
             @ScanResultType int scanType) {
         IWifiScannerImpl scannerImpl = getScannerImpl(ifaceName);
         if (scannerImpl == null) {
-            Log.e(TAG, "No valid wificond scanner interface handler");
+            Log.e(TAG, "No valid wificond scanner interface handler for iface=" + ifaceName);
             return new ArrayList<>();
         }
         List<NativeScanResult> results = null;
@@ -936,7 +936,7 @@
             @Nullable Set<Integer> freqs, @Nullable List<byte[]> hiddenNetworkSSIDs) {
         IWifiScannerImpl scannerImpl = getScannerImpl(ifaceName);
         if (scannerImpl == null) {
-            Log.e(TAG, "No valid wificond scanner interface handler");
+            Log.e(TAG, "No valid wificond scanner interface handler for iface=" + ifaceName);
             return false;
         }
         SingleScanSettings settings = new SingleScanSettings();
@@ -1002,7 +1002,7 @@
             @NonNull PnoScanRequestCallback callback) {
         IWifiScannerImpl scannerImpl = getScannerImpl(ifaceName);
         if (scannerImpl == null) {
-            Log.e(TAG, "No valid wificond scanner interface handler");
+            Log.e(TAG, "No valid wificond scanner interface handler for iface=" + ifaceName);
             return false;
         }
 
@@ -1040,7 +1040,7 @@
     public boolean stopPnoScan(@NonNull String ifaceName) {
         IWifiScannerImpl scannerImpl = getScannerImpl(ifaceName);
         if (scannerImpl == null) {
-            Log.e(TAG, "No valid wificond scanner interface handler");
+            Log.e(TAG, "No valid wificond scanner interface handler for iface=" + ifaceName);
             return false;
         }
         try {
@@ -1065,7 +1065,7 @@
     public void abortScan(@NonNull String ifaceName) {
         IWifiScannerImpl scannerImpl = getScannerImpl(ifaceName);
         if (scannerImpl == null) {
-            Log.e(TAG, "No valid wificond scanner interface handler");
+            Log.e(TAG, "No valid wificond scanner interface handler for iface=" + ifaceName);
             return;
         }
         try {
@@ -1091,7 +1091,7 @@
      */
     public @NonNull int[] getChannelsMhzForBand(@WifiAnnotations.WifiBandBasic int band) {
         if (mWificond == null) {
-            Log.e(TAG, "No valid wificond scanner interface handler");
+            Log.e(TAG, "getChannelsMhzForBand: mWificond binder is null! Did wificond die?");
             return new int[0];
         }
         int[] result = null;
@@ -1141,7 +1141,7 @@
      */
     @Nullable public DeviceWiphyCapabilities getDeviceWiphyCapabilities(@NonNull String ifaceName) {
         if (mWificond == null) {
-            Log.e(TAG, "Can not query for device wiphy capabilities at this time");
+            Log.e(TAG, "getDeviceWiphyCapabilities: mWificond binder is null! Did wificond die?");
             return null;
         }
 
@@ -1176,7 +1176,7 @@
             @NonNull SoftApCallback callback) {
         IApInterface iface = getApInterface(ifaceName);
         if (iface == null) {
-            Log.e(TAG, "No valid ap interface handler");
+            Log.e(TAG, "No valid ap interface handler for iface=" + ifaceName);
             return false;
         }
 
@@ -1234,7 +1234,7 @@
         // TODO (b/112029045) validate mcs
         IClientInterface clientInterface = getClientInterface(ifaceName);
         if (clientInterface == null) {
-            Log.e(TAG, "No valid wificond client interface handler");
+            Log.e(TAG, "No valid wificond client interface handler for iface=" + ifaceName);
             executor.execute(() -> callback.onFailure(SEND_MGMT_FRAME_ERROR_UNKNOWN));
             return;
         }