Merge "Use PipBoundsState to access current bounds"
diff --git a/Android.bp b/Android.bp
index bbaeea5..27378d4 100644
--- a/Android.bp
+++ b/Android.bp
@@ -515,6 +515,8 @@
         "android.hardware.usb-V1.1-java-constants",
         "android.hardware.usb-V1.2-java-constants",
         "android.hardware.usb.gadget-V1.0-java",
+        "android.hardware.usb.gadget-V1.1-java",
+        "android.hardware.usb.gadget-V1.2-java",
         "android.hardware.vibrator-V1.0-java",
         "android.hardware.vibrator-V1.1-java",
         "android.hardware.vibrator-V1.2-java",
@@ -1093,6 +1095,14 @@
     path: "core/java",
 }
 
+filegroup {
+    name: "activity_manager_procstate_aidl",
+    srcs: [
+        "core/java/android/app/ProcessStateEnum.aidl",
+    ],
+    path: "core/java",
+}
+
 aidl_interface {
     name: "libincremental_aidl",
     unstable: true,
diff --git a/StubLibraries.bp b/StubLibraries.bp
index 8fca23f..b46d179 100644
--- a/StubLibraries.bp
+++ b/StubLibraries.bp
@@ -115,37 +115,9 @@
 }
 
 /////////////////////////////////////////////////////////////////////
-// *-api-stubs-docs modules providing source files for the stub libraries
+// These modules provide source files for the stub libraries
 /////////////////////////////////////////////////////////////////////
 
-// api-stubs-docs, system-api-stubs-docs, and test-api-stubs-docs have APIs
-// from the non-updatable part of the platform as well as from the updatable
-// modules
-droidstubs {
-    name: "api-stubs-docs",
-    defaults: ["metalava-full-api-stubs-default"],
-    arg_files: [
-        "core/res/AndroidManifest.xml",
-    ],
-    args: metalava_framework_docs_args,
-    check_api: {
-        current: {
-            api_file: "api/current.txt",
-            removed_api_file: "api/removed.txt",
-        },
-        last_released: {
-            api_file: ":android.api.public.latest",
-            removed_api_file: ":removed.api.public.latest",
-            baseline_file: ":public-api-incompatibilities-with-last-released",
-        },
-        api_lint: {
-            enabled: true,
-            new_since: ":android.api.public.latest",
-            baseline_file: "api/lint-baseline.txt",
-        },
-    },
-}
-
 droidstubs {
     name: "api-stubs-docs-non-updatable",
     defaults: ["metalava-non-updatable-api-stubs-default"],
@@ -182,31 +154,6 @@
     "\\) "
 
 droidstubs {
-    name: "system-api-stubs-docs",
-    defaults: ["metalava-full-api-stubs-default"],
-    arg_files: [
-        "core/res/AndroidManifest.xml",
-    ],
-    args: metalava_framework_docs_args + priv_apps,
-    check_api: {
-        current: {
-            api_file: "api/system-current.txt",
-            removed_api_file: "api/system-removed.txt",
-        },
-        last_released: {
-            api_file: ":android.api.system.latest",
-            removed_api_file: ":removed.api.system.latest",
-            baseline_file: ":system-api-incompatibilities-with-last-released"
-        },
-        api_lint: {
-            enabled: true,
-            new_since: ":android.api.system.latest",
-            baseline_file: "api/system-lint-baseline.txt",
-        },
-    },
-}
-
-droidstubs {
     name: "system-api-stubs-docs-non-updatable",
     defaults: ["metalava-non-updatable-api-stubs-default"],
     arg_files: ["core/res/AndroidManifest.xml"],
diff --git a/apct-tests/perftests/core/src/android/util/CharsetUtilsPerfTest.java b/apct-tests/perftests/core/src/android/util/CharsetUtilsPerfTest.java
index 2a538b2..e2c580c 100644
--- a/apct-tests/perftests/core/src/android/util/CharsetUtilsPerfTest.java
+++ b/apct-tests/perftests/core/src/android/util/CharsetUtilsPerfTest.java
@@ -70,7 +70,7 @@
 
         final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
         while (state.keepRunning()) {
-            CharsetUtils.toUtf8Bytes(mValue, destPtr, 0, dest.length);
+            CharsetUtils.toModifiedUtf8Bytes(mValue, destPtr, 0, dest.length);
         }
     }
 
@@ -85,7 +85,7 @@
 
         final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
         while (state.keepRunning()) {
-            CharsetUtils.toUtf8Bytes(mValue, destPtr, 0, dest.length);
+            CharsetUtils.toModifiedUtf8Bytes(mValue, destPtr, 0, dest.length);
        }
     }
 }
diff --git a/apct-tests/perftests/core/src/android/view/InputStageBenchmark.java b/apct-tests/perftests/core/src/android/view/InputStageBenchmark.java
new file mode 100644
index 0000000..b45dbcf
--- /dev/null
+++ b/apct-tests/perftests/core/src/android/view/InputStageBenchmark.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import static android.view.Display.DEFAULT_DISPLAY;
+
+import static org.junit.Assert.assertTrue;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.content.Context;
+import android.graphics.Rect;
+import android.os.SystemClock;
+import android.perftests.utils.BenchmarkState;
+import android.perftests.utils.PerfStatusReporter;
+import android.perftests.utils.PerfTestActivity;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.rule.ActivityTestRule;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+@LargeTest
+@RunWith(Parameterized.class)
+public class InputStageBenchmark {
+    @Parameterized.Parameters(name = "mShowIme({0}), mHandlePreIme({1})")
+    public static Collection cases() {
+        return Arrays.asList(new Object[][] {
+                { false /* no ime */, false /* skip preime */},
+                { true /* show ime */, false /* skip preime */},
+                { true /* show ime */, true /* handle preime */}
+        });
+    }
+
+    @Rule
+    public final ActivityTestRule<PerfTestActivity> mActivityRule =
+            new ActivityTestRule<>(PerfTestActivity.class);
+    @Rule
+    public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
+
+    @Parameterized.Parameter(0)
+    public boolean mShowIme;
+    @Parameterized.Parameter(1)
+    public boolean mHandlePreIme;
+
+    private Instrumentation mInstrumentation;
+    private Window mWindow;
+    private CountDownLatch mWaitForReceiveInput;
+    private static final long TIMEOUT_MS = 5000;
+
+    class InstrumentedView extends View {
+        InstrumentedView(Context context) {
+            super(context);
+            setFocusable(true);
+        }
+
+        @Override
+        public boolean dispatchKeyEventPreIme(KeyEvent event) {
+            if (mHandlePreIme) {
+                mWaitForReceiveInput.countDown();
+            }
+            return mHandlePreIme;
+        }
+
+        @Override
+        public boolean dispatchTouchEvent(MotionEvent event) {
+            mWaitForReceiveInput.countDown();
+            return true;
+        }
+
+        @Override
+        public boolean dispatchKeyEvent(KeyEvent event) {
+            mWaitForReceiveInput.countDown();
+            return true;
+        }
+    }
+
+    class InstrumentedEditText extends EditText {
+        InstrumentedEditText(Context context) {
+            super(context);
+            setFocusable(true);
+        }
+
+        @Override
+        public boolean dispatchKeyEventPreIme(KeyEvent event) {
+            if (mHandlePreIme) {
+                mWaitForReceiveInput.countDown();
+            }
+            return mHandlePreIme;
+        }
+
+        @Override
+        public boolean dispatchTouchEvent(MotionEvent event) {
+            mWaitForReceiveInput.countDown();
+            return true;
+        }
+
+        @Override
+        public boolean dispatchKeyEvent(KeyEvent event) {
+            mWaitForReceiveInput.countDown();
+            return true;
+        }
+    }
+
+    private CountDownLatch showSoftKeyboard(View view) {
+        final CountDownLatch waitForIme = new CountDownLatch(1);
+        view.setOnApplyWindowInsetsListener((v, insets) -> {
+            if (insets.isVisible(WindowInsets.Type.ime())) {
+                waitForIme.countDown();
+            }
+            return insets;
+        });
+
+        assertTrue("Failed to request focus.", view.requestFocus());
+        final InputMethodManager imm =
+                mActivityRule.getActivity().getSystemService(InputMethodManager.class);
+        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
+
+        return waitForIme;
+    }
+
+    @Before
+    public void setUp() {
+        mInstrumentation = InstrumentationRegistry.getInstrumentation();
+        final Activity activity = mActivityRule.getActivity();
+
+        final CountDownLatch[] waitForIme = new CountDownLatch[1];
+        mInstrumentation.runOnMainSync(() -> {
+            mWindow = mActivityRule.getActivity().getWindow();
+
+            if (mShowIme) {
+                final EditText edit = new InstrumentedEditText(activity);
+                mWindow.setContentView(edit);
+                waitForIme[0] = showSoftKeyboard(edit);
+            } else {
+                final View v = new InstrumentedView(activity);
+                // set FLAG_LOCAL_FOCUS_MODE to prevent delivering input events to the ime
+                // in ImeInputStage.
+                mWindow.addFlags(WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE);
+                mWindow.setContentView(v);
+                assertTrue("Failed to request focus.", v.requestFocus());
+            }
+        });
+        if (waitForIme[0] != null) {
+            try {
+                assertTrue("Failed to show InputMethod.",
+                        waitForIme[0].await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        mInstrumentation.waitForIdleSync();
+    }
+
+    private void injectInputEvent(InputEvent event) {
+        mWaitForReceiveInput = new CountDownLatch(1);
+        mInstrumentation.runOnMainSync(() -> mWindow.injectInputEvent(event));
+        try {
+            mWaitForReceiveInput.await(TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Test
+    public void testKeyEvent() {
+        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+        while (state.keepRunning()) {
+            final KeyEvent eventDown =
+                    new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACKSLASH);
+            injectInputEvent(eventDown);
+
+            state.pauseTiming();
+            final KeyEvent eventUp =
+                    new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACKSLASH);
+            injectInputEvent(eventUp);
+            state.resumeTiming();
+        }
+    }
+
+    @Test
+    public void testMotionEvent() {
+        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+        final Rect contentFrame = new Rect();
+        mInstrumentation.runOnMainSync(() ->
+                mWindow.getDecorView().getBoundsOnScreen(contentFrame));
+        final int x = contentFrame.centerX();
+        final int y = contentFrame.centerY();
+        final long eventTime = SystemClock.uptimeMillis();
+
+        while (state.keepRunning()) {
+            final MotionEvent eventDown = MotionEvent.obtain(eventTime, eventTime,
+                    MotionEvent.ACTION_DOWN, x, y,
+                    1.0f /* pressure */, 1.0f /* size */, 0 /* metaState */,
+                    1.0f /* xPrecision */, 1.0f /* yPrecision */,
+                    0 /* deviceId */, 0 /* edgeFlags */,
+                    InputDevice.SOURCE_TOUCHSCREEN, DEFAULT_DISPLAY);
+            injectInputEvent(eventDown);
+
+            state.pauseTiming();
+            final MotionEvent eventUp = MotionEvent.obtain(eventTime, eventTime,
+                    MotionEvent.ACTION_UP, x, y,
+                    1.0f /* pressure */, 1.0f /* size */, 0 /* metaState */,
+                    1.0f /* xPrecision */, 1.0f /* yPrecision */,
+                    0 /* deviceId */, 0 /* edgeFlags */,
+                    InputDevice.SOURCE_TOUCHSCREEN, DEFAULT_DISPLAY);
+            injectInputEvent(eventUp);
+            state.resumeTiming();
+        }
+    }
+}
diff --git a/packages/CarSystemUI/samples/sample3/rro/Android.bp b/apct-tests/perftests/inputmethod/Android.bp
similarity index 63%
rename from packages/CarSystemUI/samples/sample3/rro/Android.bp
rename to apct-tests/perftests/inputmethod/Android.bp
index 0eae7c2..463ac9b 100644
--- a/packages/CarSystemUI/samples/sample3/rro/Android.bp
+++ b/apct-tests/perftests/inputmethod/Android.bp
@@ -1,4 +1,3 @@
-//
 // Copyright (C) 2020 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,16 +11,20 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
-android_app {
-    name: "CarSystemUISampleThreeRRO",
-    resource_dirs: ["res"],
-    certificate: "platform",
+android_test {
+    name: "ImePerfTests",
+    srcs: ["src/**/*.java"],
+    static_libs: [
+        "androidx.test.rules",
+        "androidx.annotation_annotation",
+        "apct-perftests-utils",
+        "collector-device-lib",
+        "compatibility-device-util-axt",
+        "platform-test-annotations",
+    ],
+    test_suites: ["device-tests"],
+    data: [":perfetto_artifacts"],
     platform_apis: true,
-    manifest: "AndroidManifest.xml",
-    aaptflags: [
-        "--no-resource-deduping",
-        "--no-resource-removal",
-     ]
-}
\ No newline at end of file
+    certificate: "platform",
+}
diff --git a/apct-tests/perftests/inputmethod/AndroidManifest.xml b/apct-tests/perftests/inputmethod/AndroidManifest.xml
new file mode 100644
index 0000000..1fb0b88
--- /dev/null
+++ b/apct-tests/perftests/inputmethod/AndroidManifest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.perftests.inputmethod">
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+        <activity android:name="android.perftests.utils.PerfTestActivity"
+            android:exported="true">
+          <intent-filter>
+            <action android:name="com.android.perftests.core.PERFTEST" />
+          </intent-filter>
+        </activity>
+        <service android:name="android.inputmethod.ImePerfTest$BaselineIme"
+                 android:process=":BaselineIME"
+                 android:label="Baseline IME"
+                 android:permission="android.permission.BIND_INPUT_METHOD"
+                 android:exported="true">
+            <intent-filter>
+                <action android:name="android.view.InputMethod"/>
+            </intent-filter>
+            <meta-data android:name="android.view.im"
+                       android:resource="@xml/simple_method"/>
+        </service>
+    </application>
+
+    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+        android:targetPackage="com.android.perftests.inputmethod">
+        <meta-data android:name="listener" android:value="android.inputmethod.ImePerfRunPrecondition" />
+    </instrumentation>
+</manifest>
diff --git a/apct-tests/perftests/inputmethod/AndroidTest.xml b/apct-tests/perftests/inputmethod/AndroidTest.xml
new file mode 100644
index 0000000..1ec0cba
--- /dev/null
+++ b/apct-tests/perftests/inputmethod/AndroidTest.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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 ImePerfTests metric instrumentation.">
+    <option name="test-suite-tag" value="apct" />
+    <option name="test-suite-tag" value="apct-metric-instrumentation" />
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="ImePerfTests.apk" />
+    </target_preparer>
+
+    <target_preparer class="com.android.tradefed.targetprep.DeviceSetup">
+        <option name="force-skip-system-props" value="true" />
+        <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
+        <option name="run-command" value="cmd window dismiss-keyguard" />
+        <option name="run-command" value="cmd package compile -m speed com.android.perftests.inputmethod" />
+    </target_preparer>
+
+    <!-- Needed for pushing the trace config file -->
+    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
+    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
+        <option name="push-file" key="trace_config_detailed.textproto" value="/data/misc/perfetto-traces/trace_config.textproto" />
+        <!--Install the content provider automatically when we push some file in sdcard folder.-->
+        <!--Needed to avoid the installation during the test suite.-->
+        <option name="push-file" key="trace_config_detailed.textproto" value="/sdcard/sample.textproto" />
+    </target_preparer>
+
+    <!-- Needed for storing the perfetto trace files in the sdcard/test_results-->
+    <option name="isolated-storage" value="false" />
+
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="com.android.perftests.inputmethod" />
+        <option name="hidden-api-checks" value="false"/>
+
+        <!-- Listener related args for collecting the traces and waiting for the device to stabilize. -->
+        <option name="device-listeners" value="android.device.collectors.ProcLoadListener,android.device.collectors.PerfettoListener" />
+
+        <!-- Guarantee that user defined RunListeners will be running before any of the default listeners defined in this runner. -->
+        <option name="instrumentation-arg" key="newRunListenerMode" value="true" />
+
+        <!-- Kill background operations -->
+        <option name="instrumentation-arg" key="kill-bg" value="true" />
+
+        <!-- ProcLoadListener related arguments -->
+        <!-- Wait for device last minute threshold to reach 3 with 2 minute timeout before starting the test run -->
+        <option name="instrumentation-arg" key="procload-collector:per_run" value="true" />
+        <option name="instrumentation-arg" key="proc-loadavg-threshold" value="3" />
+        <option name="instrumentation-arg" key="proc-loadavg-timeout" value="120000" />
+        <option name="instrumentation-arg" key="proc-loadavg-interval" value="10000" />
+
+        <!-- PerfettoListener related arguments -->
+        <option name="instrumentation-arg" key="perfetto_config_text_proto" value="true" />
+        <option name="instrumentation-arg" key="perfetto_config_file" value="trace_config.textproto" />
+    </test>
+
+    <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
+        <option name="directory-keys" value="/data/local/tmp/ImePerfTests" />
+        <!-- Needed for pulling the collected trace config on to the host -->
+        <option name="pull-pattern-keys" value="perfetto_file_path" />
+    </metrics_collector>
+</configuration>
diff --git a/apct-tests/perftests/inputmethod/README.md b/apct-tests/perftests/inputmethod/README.md
new file mode 100644
index 0000000..8ba2087
--- /dev/null
+++ b/apct-tests/perftests/inputmethod/README.md
@@ -0,0 +1,40 @@
+## IMF performance tests
+
+These tests are adaptation of Window Manager perf tests (apct-tests/perftests/windowmanager).
+
+### Precondition
+To reduce the variance of the test, if `perf-setup` (platform_testing/scripts/perf-setup)
+is available, it is better to use the following instructions to lock CPU and GPU frequencies.
+```
+m perf-setup
+PERF_SETUP_PATH=/data/local/tmp/perf-setup.sh
+adb push $OUT/$PERF_SETUP_PATH $PERF_SETUP_PATH
+adb shell chmod +x $PERF_SETUP_PATH
+adb shell $PERF_SETUP_PATH
+```
+
+### Example to run
+Use `atest`
+```
+atest ImePerfTests:ImePerfTest -- \
+      --module-arg ImePerfTests:instrumentation-arg:profiling-iterations:=20
+
+```
+Note: `instrumentation-arg:kill-bg:=true` is already defined in the AndroidText.xml
+
+Use `am instrument`
+```
+adb shell am instrument -w -r -e class android.inputmethod.ImePerfTest \
+          -e listener android.inputmethod.ImePerfRunPrecondition \
+          -e kill-bg true \
+          com.android.perftests.inputmethod/androidx.test.runner.AndroidJUnitRunner
+```
+* `kill-bg` is optional.
+
+Test arguments
+ - kill-bg
+   * boolean: Kill background process before running test.
+ - profiling-iterations
+   * int: Run the extra iterations with enabling method profiling.
+ - profiling-sampling
+   * int: The interval (0=trace each method, default is 10) of sample profiling in microseconds.
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/values/colors.xml b/apct-tests/perftests/inputmethod/res/xml/simple_method.xml
similarity index 81%
rename from packages/CarSystemUI/samples/sample3/rro/res/values/colors.xml
rename to apct-tests/perftests/inputmethod/res/xml/simple_method.xml
index f98cb96..87cb1ad 100644
--- a/packages/CarSystemUI/samples/sample3/rro/res/values/colors.xml
+++ b/apct-tests/perftests/inputmethod/res/xml/simple_method.xml
@@ -14,6 +14,6 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-    <color name="car_nav_icon_fill_color">#8F8F8F</color>
-</resources>
+
+<!-- Configuration info for an input method -->
+<input-method xmlns:android="http://schemas.android.com/apk/res/android" />
diff --git a/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfRunPrecondition.java b/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfRunPrecondition.java
new file mode 100644
index 0000000..fc48fd5
--- /dev/null
+++ b/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfRunPrecondition.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.inputmethod;
+
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
+import static android.inputmethod.ImePerfTestBase.executeShellCommand;
+import static android.inputmethod.ImePerfTestBase.runWithShellPermissionIdentity;
+
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningAppProcessInfo;
+import android.app.ActivityTaskManager;
+import android.content.Context;
+import android.inputmethod.ImePerfTestBase.SettingsSession;
+import android.os.BatteryManager;
+import android.os.Bundle;
+import android.os.SystemClock;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.WindowManagerPolicyConstants;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.internal.policy.PhoneWindow;
+
+import org.junit.runner.Description;
+import org.junit.runner.Result;
+import org.junit.runner.notification.RunListener;
+
+import java.util.List;
+
+/** Prepare the preconditions before running performance test. */
+public class ImePerfRunPrecondition extends RunListener {
+    private static final String TAG = ImePerfRunPrecondition.class.getSimpleName();
+
+    private static final String ARGUMENT_LOG_ONLY = "log";
+    private static final String ARGUMENT_KILL_BACKGROUND = "kill-bg";
+    private static final String ARGUMENT_PROFILING_ITERATIONS = "profiling-iterations";
+    private static final String ARGUMENT_PROFILING_SAMPLING = "profiling-sampling";
+    private static final String DEFAULT_PROFILING_ITERATIONS = "10";
+    private static final String DEFAULT_PROFILING_SAMPLING_US = "10";
+    private static final long KILL_BACKGROUND_WAIT_MS = 3000;
+
+    /** The requested iterations to run with method profiling. */
+    static int sProfilingIterations;
+
+    /** The interval of sample profiling in microseconds. */
+    static int sSamplingIntervalUs;
+
+    private final Context mContext = InstrumentationRegistry.getInstrumentation().getContext();
+    private long mWaitPreconditionDoneMs = 500;
+
+    private final SettingsSession<Integer> mStayOnWhilePluggedInSetting = new SettingsSession<>(
+            Settings.Global.getInt(mContext.getContentResolver(),
+                    Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0),
+            value -> executeShellCommand(String.format("settings put global %s %d",
+                    Settings.Global.STAY_ON_WHILE_PLUGGED_IN, value)));
+
+    private final SettingsSession<Integer> mNavigationModeSetting = new SettingsSession<>(
+            mContext.getResources().getInteger(
+                    com.android.internal.R.integer.config_navBarInteractionMode),
+            value -> {
+                final String navOverlay;
+                switch (value) {
+                    case WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL:
+                    default:
+                        navOverlay = WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY;
+                        break;
+                }
+                executeShellCommand("cmd overlay enable-exclusive " + navOverlay);
+            });
+
+    /** It only executes once before all tests. */
+    @Override
+    public void testRunStarted(Description description) {
+        final Bundle arguments = InstrumentationRegistry.getArguments();
+        // If true, it only logs the method names without running.
+        final boolean skip = Boolean.parseBoolean(arguments.getString(ARGUMENT_LOG_ONLY, "false"));
+        Log.i(TAG, "arguments=" + arguments);
+        if (skip) {
+            return;
+        }
+        sProfilingIterations = Integer.parseInt(
+                arguments.getString(ARGUMENT_PROFILING_ITERATIONS, DEFAULT_PROFILING_ITERATIONS));
+        sSamplingIntervalUs = Integer.parseInt(
+                arguments.getString(ARGUMENT_PROFILING_SAMPLING, DEFAULT_PROFILING_SAMPLING_US));
+
+        // Use same navigation mode (gesture navigation) across all devices and tests
+        // for consistency.
+        mNavigationModeSetting.set(WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL);
+        // Keep the device awake during testing.
+        mStayOnWhilePluggedInSetting.set(BatteryManager.BATTERY_PLUGGED_ANY);
+
+        runWithShellPermissionIdentity(() -> {
+            final ActivityTaskManager atm = mContext.getSystemService(ActivityTaskManager.class);
+            atm.removeAllVisibleRecentTasks();
+            atm.removeRootTasksWithActivityTypes(new int[] { ACTIVITY_TYPE_STANDARD,
+                    ACTIVITY_TYPE_ASSISTANT, ACTIVITY_TYPE_RECENTS, ACTIVITY_TYPE_UNDEFINED });
+        });
+        PhoneWindow.sendCloseSystemWindows(mContext, "ImePerfTests");
+
+        if (Boolean.parseBoolean(arguments.getString(ARGUMENT_KILL_BACKGROUND))) {
+            runWithShellPermissionIdentity(this::killBackgroundProcesses);
+            mWaitPreconditionDoneMs = KILL_BACKGROUND_WAIT_MS;
+        }
+        // Wait a while for the precondition setup to complete.
+        SystemClock.sleep(mWaitPreconditionDoneMs);
+    }
+
+    private void killBackgroundProcesses() {
+        Log.i(TAG, "Killing background processes...");
+        final ActivityManager am = mContext.getSystemService(ActivityManager.class);
+        final List<RunningAppProcessInfo> processes = am.getRunningAppProcesses();
+        if (processes == null) {
+            return;
+        }
+        for (RunningAppProcessInfo processInfo : processes) {
+            if (processInfo.importanceReasonCode == RunningAppProcessInfo.REASON_UNKNOWN
+                    && processInfo.importance > RunningAppProcessInfo.IMPORTANCE_SERVICE) {
+                for (String pkg : processInfo.pkgList) {
+                    am.forceStopPackage(pkg);
+                }
+            }
+        }
+    }
+
+    /** It only executes once after all tests. */
+    @Override
+    public void testRunFinished(Result result) {
+        mNavigationModeSetting.close();
+        mStayOnWhilePluggedInSetting.close();
+    }
+}
diff --git a/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java b/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java
new file mode 100644
index 0000000..303c667
--- /dev/null
+++ b/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java
@@ -0,0 +1,380 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.inputmethod;
+
+import static android.perftests.utils.ManualBenchmarkState.StatsReport;
+import static android.perftests.utils.PerfTestActivity.ID_EDITOR;
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static android.view.WindowInsetsAnimation.Callback.DISPATCH_MODE_STOP;
+
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.inputmethodservice.InputMethodService;
+import android.os.ParcelFileDescriptor;
+import android.os.SystemClock;
+import android.perftests.utils.ManualBenchmarkState;
+import android.perftests.utils.ManualBenchmarkState.ManualBenchmarkTest;
+import android.perftests.utils.PerfManualStatusReporter;
+import android.perftests.utils.TraceMarkParser;
+import android.perftests.utils.TraceMarkParser.TraceMarkSlice;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowInsets;
+import android.view.WindowInsetsAnimation;
+import android.view.WindowInsetsController;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.test.filters.LargeTest;
+
+import com.android.compatibility.common.util.PollingCheck;
+
+import junit.framework.Assert;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
+
+/** Measure the performance of internal methods in Input Method framework by trace tag. */
+@LargeTest
+public class ImePerfTest extends ImePerfTestBase
+        implements ManualBenchmarkState.CustomizedIterationListener {
+    private static final String TAG = ImePerfTest.class.getSimpleName();
+
+    @Rule
+    public final PerfManualStatusReporter mPerfStatusReporter = new PerfManualStatusReporter();
+
+    @Rule
+    public final PerfTestActivityRule mActivityRule = new PerfTestActivityRule();
+
+    /**
+     * IMF common methods to log for show/hide in trace.
+     */
+    private String[] mCommonMethods = {
+            "IC.pendingAnim",
+            "IMMS.applyImeVisibility",
+            "applyPostLayoutPolicy",
+            "applyWindowSurfaceChanges",
+            "ISC.onPostLayout"
+    };
+
+     /** IMF show methods to log in trace. */
+    private String[] mShowMethods = {
+            "IC.showRequestFromIme",
+            "IC.showRequestFromApi",
+            "IC.showRequestFromApiToImeReady",
+            "IC.pendingAnim",
+            "IMMS.applyImeVisibility",
+            "IMMS.showMySoftInput",
+            "IMMS.showSoftInput",
+            "IMS.showSoftInput",
+            "IMS.startInput",
+            "WMS.showImePostLayout"
+    };
+
+    /** IMF hide lifecycle methods to log in trace. */
+    private String[] mHideMethods = {
+            "IC.hideRequestFromIme",
+            "IC.hideRequestFromApi",
+            "IMMS.hideMySoftInput",
+            "IMMS.hideSoftInput",
+            "IMS.hideSoftInput",
+            "WMS.hideIme"
+    };
+
+    /**
+     * IMF methods to log in trace.
+     */
+    private TraceMarkParser mTraceMethods;
+
+    private boolean mIsTraceStarted;
+
+    /**
+     * Ime Session for {@link BaselineIme}.
+     */
+    private static class ImeSession implements AutoCloseable {
+
+        private static final long TIMEOUT = 2000;
+        private final ComponentName mImeName;
+        private Context mContext = getInstrumentation().getContext();
+
+        ImeSession(ComponentName ime) throws Exception {
+            mImeName = ime;
+            // using adb, enable and set Baseline IME.
+            executeShellCommand("ime reset");
+            executeShellCommand("ime enable " + ime.flattenToShortString());
+            executeShellCommand("ime set " + ime.flattenToShortString());
+            PollingCheck.check("Make sure that BaselineIme becomes available "
+                    + getCurrentInputMethodId(), TIMEOUT,
+                    () -> ime.equals(getCurrentInputMethodId()));
+        }
+
+        @Override
+        public void close() throws Exception {
+            executeShellCommand("ime reset");
+            PollingCheck.check("Make sure that Baseline IME becomes unavailable", TIMEOUT, () ->
+                    mContext.getSystemService(InputMethodManager.class)
+                            .getEnabledInputMethodList()
+                            .stream()
+                            .noneMatch(info -> mImeName.equals(info.getComponent())));
+        }
+
+        @Nullable
+        private ComponentName getCurrentInputMethodId() {
+            return ComponentName.unflattenFromString(
+                    Settings.Secure.getString(mContext.getContentResolver(),
+                            Settings.Secure.DEFAULT_INPUT_METHOD));
+        }
+    }
+
+    /**
+     * A minimal baseline IME (that has a single static view) used to measure IMF latency.
+     */
+    public static class BaselineIme extends InputMethodService {
+
+        public static final int HEIGHT_DP = 100;
+
+        @Override
+        public View onCreateInputView() {
+            final ViewGroup view = new FrameLayout(this);
+            final View inner = new View(this);
+            final float density = getResources().getDisplayMetrics().density;
+            final int height = (int) (HEIGHT_DP * density);
+            view.setPadding(0, 0, 0, 0);
+            view.addView(inner, new FrameLayout.LayoutParams(MATCH_PARENT, height));
+            inner.setBackgroundColor(0xff01fe10); // green
+            return view;
+        }
+
+        static ComponentName getName(Context context) {
+            return new ComponentName(context, BaselineIme.class);
+        }
+    }
+
+    @Test
+    @ManualBenchmarkTest(
+            targetTestDurationNs = 10 * TIME_1_S_IN_NS,
+            statsReport = @StatsReport(
+                    flags = StatsReport.FLAG_ITERATION | StatsReport.FLAG_MEAN
+                            | StatsReport.FLAG_MIN | StatsReport.FLAG_MAX
+                            | StatsReport.FLAG_COEFFICIENT_VAR))
+    public void testShowIme() throws Throwable {
+        testShowOrHideIme(true /* show */);
+    }
+
+    @Test
+    @ManualBenchmarkTest(
+            targetTestDurationNs = 10 * TIME_1_S_IN_NS,
+            statsReport = @StatsReport(
+                    flags = StatsReport.FLAG_ITERATION | StatsReport.FLAG_MEAN
+                            | StatsReport.FLAG_MIN | StatsReport.FLAG_MAX
+                            | StatsReport.FLAG_COEFFICIENT_VAR))
+    public void testHideIme() throws Throwable {
+        testShowOrHideIme(false /* show */);
+    }
+
+    private void testShowOrHideIme(final boolean show) throws Throwable {
+        mTraceMethods = new TraceMarkParser(buildArray(
+                mCommonMethods, show ? mShowMethods : mHideMethods));
+        final ManualBenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+        state.setCustomizedIterations(getProfilingIterations(), this);
+        long measuredTimeNs = 0;
+        try (ImeSession imeSession = new ImeSession(BaselineIme.getName(
+                getInstrumentation().getContext()))) {
+            final AtomicReference<CountDownLatch> latchStart = new AtomicReference<>();
+            final AtomicReference<CountDownLatch> latchEnd = new AtomicReference<>();
+            final Activity activity = getActivityWithFocus();
+
+            // call IME show/hide
+            final WindowInsetsController controller =
+                    activity.getWindow().getDecorView().getWindowInsetsController();
+
+            while (state.keepRunning(measuredTimeNs)) {
+                setImeListener(activity, latchStart, latchEnd);
+                latchStart.set(new CountDownLatch(show ? 1 : 2));
+                latchEnd.set(new CountDownLatch(2));
+                // For measuring hide, lets show IME first.
+                if (!show) {
+                    activity.runOnUiThread(() -> {
+                        controller.show(WindowInsets.Type.ime());
+                    });
+                    PollingCheck.check("IME show animation should finish ", TIMEOUT_1_S_IN_MS,
+                            () -> latchStart.get().getCount() == 1
+                                    && latchEnd.get().getCount() == 1);
+                }
+                if (!mIsTraceStarted && !state.isWarmingUp()) {
+                    startAsyncAtrace();
+                    mIsTraceStarted = true;
+                }
+
+                AtomicLong startTime = new AtomicLong();
+                activity.runOnUiThread(() -> {
+                    startTime.set(SystemClock.elapsedRealtimeNanos());
+                    if (show) {
+                        controller.show(WindowInsets.Type.ime());
+                    } else {
+                        controller.hide(WindowInsets.Type.ime());
+                    }
+                });
+
+                measuredTimeNs = waitForAnimationStart(latchStart, startTime);
+
+                // hide IME before next iteration.
+                if (show) {
+                    activity.runOnUiThread(() -> controller.hide(WindowInsets.Type.ime()));
+                    try {
+                        latchEnd.get().await(TIMEOUT_1_S_IN_MS * 5, TimeUnit.MILLISECONDS);
+                        if (latchEnd.get().getCount() != 0) {
+                            Assert.fail("IME hide animation should finish.");
+                        }
+                    } catch (InterruptedException e) {
+                    }
+                }
+            }
+        } finally {
+            if (mIsTraceStarted) {
+                stopAsyncAtrace();
+            }
+        }
+        mActivityRule.finishActivity();
+
+        addResultToState(state);
+    }
+
+    private long waitForAnimationStart(
+            AtomicReference<CountDownLatch> latchStart, AtomicLong startTime) {
+        try {
+            latchStart.get().await(TIMEOUT_1_S_IN_MS * 5, TimeUnit.MILLISECONDS);
+            if (latchStart.get().getCount() != 0) {
+                Assert.fail("IME animation should start " + latchStart.get().getCount());
+            }
+        } catch (InterruptedException e) { }
+
+        return SystemClock.elapsedRealtimeNanos() - startTime.get();
+    }
+
+    private void addResultToState(ManualBenchmarkState state) {
+        mTraceMethods.forAllSlices((key, slices) -> {
+            for (TraceMarkSlice slice : slices) {
+                state.addExtraResult(key, (long) (slice.getDurationInSeconds() * NANOS_PER_S));
+            }
+        });
+        Log.i(TAG, String.valueOf(mTraceMethods));
+    }
+
+    private Activity getActivityWithFocus() throws Exception {
+        final Activity activity = mActivityRule.launchActivity();
+        PollingCheck.check("Activity onResume()", TIMEOUT_1_S_IN_MS,
+                () -> activity.isResumed());
+
+        View editor = activity.findViewById(ID_EDITOR);
+        editor.requestFocus();
+
+        // wait till editor is focused so we don't count activity/view latency.
+        PollingCheck.check("Editor is focused", TIMEOUT_1_S_IN_MS,
+                () -> editor.isFocused());
+        getInstrumentation().waitForIdleSync();
+
+        return activity;
+    }
+
+    private void setImeListener(Activity activity,
+            @NonNull AtomicReference<CountDownLatch> latchStart,
+            @Nullable AtomicReference<CountDownLatch> latchEnd) {
+        // set IME animation listener
+        activity.getWindow().getDecorView().setWindowInsetsAnimationCallback(
+                new WindowInsetsAnimation.Callback(DISPATCH_MODE_STOP) {
+                    @NonNull
+                    @Override
+                    public WindowInsetsAnimation.Bounds onStart(
+                            @NonNull WindowInsetsAnimation animation,
+                            @NonNull WindowInsetsAnimation.Bounds bounds) {
+                        latchStart.get().countDown();
+                        return super.onStart(animation, bounds);
+                    }
+
+                    @NonNull
+                    @Override
+                    public WindowInsets onProgress(@NonNull WindowInsets insets,
+                            @NonNull List<WindowInsetsAnimation> runningAnimations) {
+                        return insets;
+                    }
+
+                    @Override
+                    public void onEnd(@NonNull WindowInsetsAnimation animation) {
+                        super.onEnd(animation);
+                        if (latchEnd != null) {
+                            latchEnd.get().countDown();
+                        }
+                    }
+                });
+    }
+
+    private void startAsyncAtrace() throws IOException {
+        mIsTraceStarted = true;
+        // IMF uses 'wm' component for trace in InputMethodService, InputMethodManagerService,
+        // WindowManagerService and 'view' for client window (InsetsController).
+        // TODO(b/167947940): Consider a separate input_method atrace
+        UI_AUTOMATION.executeShellCommand("atrace -b 32768 --async_start wm view");
+        // Avoid atrace isn't ready immediately.
+        SystemClock.sleep(TimeUnit.NANOSECONDS.toMillis(TIME_1_S_IN_NS));
+    }
+
+    private void stopAsyncAtrace() {
+        if (!mIsTraceStarted) {
+            return;
+        }
+        final ParcelFileDescriptor pfd = UI_AUTOMATION.executeShellCommand("atrace --async_stop");
+        mIsTraceStarted = false;
+        final InputStream inputStream = new ParcelFileDescriptor.AutoCloseInputStream(pfd);
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                mTraceMethods.visit(line);
+            }
+        } catch (IOException e) {
+            Log.w(TAG, "Failed to read the result of stopped atrace", e);
+        }
+    }
+
+    @Override
+    public void onStart(int iteration) {
+        // Do not capture trace when profiling because the result will be much slower.
+        stopAsyncAtrace();
+    }
+
+    @Override
+    public void onFinished(int iteration) {
+        // do nothing.
+    }
+}
diff --git a/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTestBase.java b/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTestBase.java
new file mode 100644
index 0000000..1a861d7
--- /dev/null
+++ b/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTestBase.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.inputmethod;
+
+import static android.perftests.utils.PerfTestActivity.INTENT_EXTRA_ADD_EDIT_TEXT;
+
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import android.app.KeyguardManager;
+import android.app.UiAutomation;
+import android.content.Context;
+import android.content.Intent;
+import android.os.ParcelFileDescriptor;
+import android.os.PowerManager;
+import android.perftests.utils.PerfTestActivity;
+
+
+import androidx.test.rule.ActivityTestRule;
+
+import org.junit.BeforeClass;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Objects;
+import java.util.function.Consumer;
+
+public class ImePerfTestBase {
+    static final UiAutomation UI_AUTOMATION = getInstrumentation().getUiAutomation();
+    static final long NANOS_PER_S = 1000L * 1000 * 1000;
+    static final long TIME_1_S_IN_NS = 1 * NANOS_PER_S;
+    static final long TIMEOUT_1_S_IN_MS = 1 * 1000L;
+
+    @BeforeClass
+    public static void setUpOnce() {
+        final Context context = getInstrumentation().getContext();
+
+        if (!context.getSystemService(PowerManager.class).isInteractive()
+                || context.getSystemService(KeyguardManager.class).isKeyguardLocked()) {
+            executeShellCommand("input keyevent KEYCODE_WAKEUP");
+            executeShellCommand("wm dismiss-keyguard");
+        }
+        context.startActivity(new Intent(Intent.ACTION_MAIN)
+                .addCategory(Intent.CATEGORY_HOME).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+    }
+
+    /**
+     * Executes shell command with reading the output. It may also used to block until the current
+     * command is completed.
+     */
+    static ByteArrayOutputStream executeShellCommand(String command) {
+        final ParcelFileDescriptor pfd = UI_AUTOMATION.executeShellCommand(command);
+        final byte[] buf = new byte[512];
+        final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+        int bytesRead;
+        try (FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd)) {
+            while ((bytesRead = fis.read(buf)) != -1) {
+                bytes.write(buf, 0, bytesRead);
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return bytes;
+    }
+
+    /** Returns how many iterations should run with method tracing. */
+    static int getProfilingIterations() {
+        return ImePerfRunPrecondition.sProfilingIterations;
+    }
+
+    static void runWithShellPermissionIdentity(Runnable runnable) {
+        UI_AUTOMATION.adoptShellPermissionIdentity();
+        try {
+            runnable.run();
+        } finally {
+            UI_AUTOMATION.dropShellPermissionIdentity();
+        }
+    }
+
+    static class SettingsSession<T> implements AutoCloseable {
+        private final Consumer<T> mSetter;
+        private final T mOriginalValue;
+        private boolean mChanged;
+
+        SettingsSession(T originalValue, Consumer<T> setter) {
+            mOriginalValue = originalValue;
+            mSetter = setter;
+        }
+
+        void set(T value) {
+            if (Objects.equals(value, mOriginalValue)) {
+                mChanged = false;
+                return;
+            }
+            mSetter.accept(value);
+            mChanged = true;
+        }
+
+        @Override
+        public void close() {
+            if (mChanged) {
+                mSetter.accept(mOriginalValue);
+            }
+        }
+    }
+
+    /**
+     * Provides an activity that keeps screen on and is able to wait for a stable lifecycle stage.
+     */
+    static class PerfTestActivityRule extends ActivityTestRule<PerfTestActivity> {
+        private final Intent mStartIntent =
+                new Intent(getInstrumentation().getTargetContext(), PerfTestActivity.class);
+
+        PerfTestActivityRule() {
+            this(false /* launchActivity */);
+        }
+
+        PerfTestActivityRule(boolean launchActivity) {
+            super(PerfTestActivity.class, false /* initialTouchMode */, launchActivity);
+        }
+
+        @Override
+        protected Intent getActivityIntent() {
+            return mStartIntent;
+        }
+
+        @Override
+        public PerfTestActivity launchActivity(Intent intent) {
+            intent.putExtra(INTENT_EXTRA_ADD_EDIT_TEXT, true);
+            return super.launchActivity(intent);
+        }
+
+        PerfTestActivity launchActivity() {
+            return launchActivity(mStartIntent);
+        }
+    }
+
+    static String[] buildArray(String[]... arrays) {
+        int length = 0;
+        for (String[] array : arrays) {
+            length += array.length;
+        }
+        String[] newArray = new String[length];
+        int offset = 0;
+        for (String[] array : arrays) {
+            System.arraycopy(array, 0, newArray, offset, array.length);
+            offset += array.length;
+        }
+        return newArray;
+    }
+}
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/PerfTestActivity.java b/apct-tests/perftests/utils/src/android/perftests/utils/PerfTestActivity.java
index e934feb..f3bea17 100644
--- a/apct-tests/perftests/utils/src/android/perftests/utils/PerfTestActivity.java
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/PerfTestActivity.java
@@ -21,6 +21,8 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.WindowManager;
+import android.widget.EditText;
+import android.widget.LinearLayout;
 
 /**
  * A simple activity used for testing, e.g. performance of activity switching, or as a base
@@ -28,6 +30,8 @@
  */
 public class PerfTestActivity extends Activity {
     public static final String INTENT_EXTRA_KEEP_SCREEN_ON = "keep_screen_on";
+    public static final String INTENT_EXTRA_ADD_EDIT_TEXT = "add_edit_text";
+    public static final int ID_EDITOR = 3252356;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -35,6 +39,15 @@
         if (getIntent().getBooleanExtra(INTENT_EXTRA_KEEP_SCREEN_ON, false)) {
             getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
         }
+        if (getIntent().getBooleanExtra(INTENT_EXTRA_ADD_EDIT_TEXT, false)) {
+            final LinearLayout layout = new LinearLayout(this);
+            layout.setOrientation(LinearLayout.VERTICAL);
+
+            final EditText editText = new EditText(this);
+            editText.setId(ID_EDITOR);
+            layout.addView(editText);
+            setContentView(layout);
+        }
     }
 
     public static Intent createLaunchIntent(Context context) {
diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java
index 18bc59b..f2c9942 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java
@@ -267,14 +267,14 @@
             searchResultsFuture.completeExceptionally(e);
         }
 
-        // Translate the list of Bundle into a list of SearchResult
-        AppSearchResult<SearchResults> searchResultsResult = getFutureOrThrow(searchResultsFuture);
-        if (!searchResultsResult.isSuccess()) {
-            return AppSearchResult.newFailedResult(
-                    searchResultsResult.getResultCode(), searchResultsResult.getErrorMessage());
+        // Translate the Bundle into a searchResultPage.
+        AppSearchResult<Bundle> bundleResult = getFutureOrThrow(searchResultsFuture);
+        if (!bundleResult.isSuccess()) {
+            return AppSearchResult.newFailedResult(bundleResult.getResultCode(),
+                    bundleResult.getErrorMessage());
         }
-        SearchResults searchResults = searchResultsResult.getResultValue();
-        return AppSearchResult.newSuccessfulResult(searchResults.mResults);
+        SearchResultPage searchResultPage = new SearchResultPage(bundleResult.getResultValue());
+        return AppSearchResult.newSuccessfulResult(searchResultPage.getResults());
     }
 
     /**
@@ -294,39 +294,7 @@
         List<String> uris = new ArrayList<>(request.getUris());
         AndroidFuture<AppSearchBatchResult> future = new AndroidFuture<>();
         try {
-            mService.delete(DEFAULT_DATABASE, request.getNamespace(), uris, future);
-        } catch (RemoteException e) {
-            future.completeExceptionally(e);
-        }
-        return getFutureOrThrow(future);
-    }
-
-    /**
-     * Deletes {@link android.app.appsearch.GenericDocument}s by schema type.
-     *
-     * <p>You should not call this method directly; instead, use the
-     * {@code AppSearch#deleteByType()} API provided by JetPack.
-     *
-     * @param schemaTypes Schema types whose documents to delete.
-     * @return An {@link AppSearchBatchResult} mapping each schema type to a {@code null} success if
-     *     deletion was successful, to a {@code null} failure if the type did not exist, or to a
-     *     {@code throwable} failure if deletion failed for another reason.
-     */
-    public AppSearchBatchResult<String, Void> deleteByTypes(@NonNull List<String> schemaTypes) {
-        AndroidFuture<AppSearchBatchResult> future = new AndroidFuture<>();
-        try {
-            mService.deleteByTypes(DEFAULT_DATABASE, schemaTypes, future);
-        } catch (RemoteException e) {
-            future.completeExceptionally(e);
-        }
-        return getFutureOrThrow(future);
-    }
-
-    /** Deletes all documents owned by the calling app. */
-    public AppSearchResult<Void> deleteAll() {
-        AndroidFuture<AppSearchResult> future = new AndroidFuture<>();
-        try {
-            mService.deleteAll(DEFAULT_DATABASE, future);
+            mService.removeByUri(DEFAULT_DATABASE, request.getNamespace(), uris, future);
         } catch (RemoteException e) {
             future.completeExceptionally(e);
         }
diff --git a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl
index 352a980..01260ea 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl
+++ b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl
@@ -92,7 +92,7 @@
         in AndroidFuture<AppSearchResult> callback);
 
     /**
-     * Deletes documents by URI.
+     * Removes documents by URI.
      *
      * @param databaseName The databaseName the document is in.
      * @param namespace    Namespace of the document to remove.
@@ -105,36 +105,23 @@
      *     where the keys are document URIs. If a document doesn't exist, it will be reported as a
      *     failure where the {@code throwable} is {@code null}.
      */
-    void delete(
+    void removeByUri(
         in String databaseName,
         in String namespace,
         in List<String> uris,
         in AndroidFuture<AppSearchBatchResult> callback);
 
     /**
-     * Deletes documents by schema type.
+     * Removes documents by given query.
      *
-     * @param databaseName The databaseName the document is in.
-     * @param schemaTypes The schema types of the documents to delete
-     * @param callback
-     *     {@link AndroidFuture}&lt;{@link AppSearchBatchResult}&lt;{@link String}, {@link Void}&gt;&gt;.
-     *     If the call fails to start, {@code callback} will be completed exceptionally. Otherwise,
-     *     {@code callback} will be completed with an
-     *     {@link AppSearchBatchResult}&lt;{@link String}, {@link Void}&gt;
-     *     where the keys are schema types. If a schema type doesn't exist, it will be reported as a
-     *     failure where the {@code throwable} is {@code null}.
+     * @param databaseName The databaseName this query for.
+     * @param queryExpression String to search for
+     * @param searchSpecBundle SearchSpec bundle
+     * @param callback {@link AndroidFuture}&lt;{@link AppSearchResult}&lt;{@link SearchResults}&gt;&gt;
      */
-    void deleteByTypes(
+    void removeByQuery(
         in String databaseName,
-        in List<String> schemaTypes,
-        in AndroidFuture<AppSearchBatchResult> callback);
-
-    /**
-     * Deletes all documents belonging to the calling app.
-     *
-     * @param databaseName The databaseName to remove all documents from.
-     * @param callback {@link AndroidFuture}&lt;{@link AppSearchResult}&lt;{@link Void}&gt;&gt;.
-     *     Will be completed with the result of the call.
-     */
-    void deleteAll(in String databaseName, in AndroidFuture<AppSearchResult> callback);
+        in String queryExpression,
+        in Bundle searchSpecBundle,
+        in AndroidFuture<AppSearchResult> callback);
 }
diff --git a/apex/appsearch/framework/java/android/app/appsearch/SearchResultPage.java b/apex/appsearch/framework/java/android/app/appsearch/SearchResultPage.java
new file mode 100644
index 0000000..756d1b5
--- /dev/null
+++ b/apex/appsearch/framework/java/android/app/appsearch/SearchResultPage.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 android.app.appsearch;
+
+import android.os.Bundle;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * This class represents a page of {@link SearchResult}s
+ * @hide
+ */
+
+public class SearchResultPage {
+    public static final String RESULTS_FIELD = "results";
+    public static final String NEXT_PAGE_TOKEN_FIELD = "nextPageToken";
+    private final long mNextPageToken;
+
+    @Nullable
+    private List<SearchResult> mResults;
+
+    @NonNull
+    private final Bundle mBundle;
+
+    public SearchResultPage(@NonNull Bundle bundle) {
+        mBundle = Preconditions.checkNotNull(bundle);
+        mNextPageToken = mBundle.getLong(NEXT_PAGE_TOKEN_FIELD);
+    }
+
+    /** Returns the {@link Bundle} of this class. */
+    @NonNull
+    public Bundle getBundle() {
+        return mBundle;
+    }
+
+    /** Returns the Token to get next {@link SearchResultPage}. */
+    public long getNextPageToken() {
+        return mNextPageToken;
+    }
+
+    /** Returns all {@link android.app.appsearch.SearchResult}s of this page */
+    @NonNull
+    public List<SearchResult> getResults() {
+        if (mResults == null) {
+            ArrayList<Bundle> resultBundles = mBundle.getParcelableArrayList(RESULTS_FIELD);
+            if (resultBundles == null) {
+                mResults = Collections.emptyList();
+            } else {
+                mResults = new ArrayList<>(resultBundles.size());
+                for (int i = 0; i < resultBundles.size(); i++) {
+                    mResults.add(new SearchResult(resultBundles.get(i)));
+                }
+            }
+        }
+        return mResults;
+    }
+}
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
index f2830e5..1dfde52 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
@@ -21,33 +21,23 @@
 import android.app.appsearch.AppSearchSchema;
 import android.app.appsearch.GenericDocument;
 import android.app.appsearch.IAppSearchManager;
-import android.app.appsearch.SearchResult;
-import android.app.appsearch.SearchResults;
+import android.app.appsearch.SearchResultPage;
 import android.app.appsearch.SearchSpec;
 import android.app.appsearch.exceptions.AppSearchException;
 import android.content.Context;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.UserHandle;
+import android.util.ArraySet;
 
 import com.android.internal.infra.AndroidFuture;
 import com.android.internal.util.Preconditions;
 import com.android.server.SystemService;
 import com.android.server.appsearch.external.localstorage.AppSearchImpl;
-import com.android.server.appsearch.external.localstorage.converter.GenericDocumentToProtoConverter;
-import com.android.server.appsearch.external.localstorage.converter.SchemaToProtoConverter;
-import com.android.server.appsearch.external.localstorage.converter.SearchResultToProtoConverter;
-import com.android.server.appsearch.external.localstorage.converter.SearchSpecToProtoConverter;
-
-import com.google.android.icing.proto.DocumentProto;
-import com.google.android.icing.proto.SchemaProto;
-import com.google.android.icing.proto.SchemaTypeConfigProto;
-import com.google.android.icing.proto.SearchResultProto;
-import com.google.android.icing.proto.SearchSpecProto;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
 /**
  * TODO(b/142567528): add comments when implement this class
@@ -72,21 +62,20 @@
                 @NonNull List<Bundle> schemaBundles,
                 boolean forceOverride,
                 @NonNull AndroidFuture<AppSearchResult> callback) {
+            Preconditions.checkNotNull(databaseName);
             Preconditions.checkNotNull(schemaBundles);
             Preconditions.checkNotNull(callback);
             int callingUid = Binder.getCallingUidOrThrow();
             int callingUserId = UserHandle.getUserId(callingUid);
             final long callingIdentity = Binder.clearCallingIdentity();
             try {
-                SchemaProto.Builder schemaProtoBuilder = SchemaProto.newBuilder();
+                Set<AppSearchSchema> schemas = new ArraySet<>(schemaBundles.size());
                 for (int i = 0; i < schemaBundles.size(); i++) {
-                    AppSearchSchema schema = new AppSearchSchema(schemaBundles.get(i));
-                    SchemaTypeConfigProto schemaTypeProto = SchemaToProtoConverter.convert(schema);
-                    schemaProtoBuilder.addTypes(schemaTypeProto);
+                    schemas.add(new AppSearchSchema(schemaBundles.get(i)));
                 }
                 AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                 databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid);
-                impl.setSchema(databaseName, schemaProtoBuilder.build(), forceOverride);
+                impl.setSchema(databaseName, schemas, forceOverride);
                 callback.complete(AppSearchResult.newSuccessfulResult(/*result=*/ null));
             } catch (Throwable t) {
                 callback.complete(throwableToFailedResult(t));
@@ -100,6 +89,7 @@
                 @NonNull String databaseName,
                 @NonNull List<Bundle> documentBundles,
                 @NonNull AndroidFuture<AppSearchBatchResult> callback) {
+            Preconditions.checkNotNull(databaseName);
             Preconditions.checkNotNull(documentBundles);
             Preconditions.checkNotNull(callback);
             int callingUid = Binder.getCallingUidOrThrow();
@@ -112,9 +102,8 @@
                         new AppSearchBatchResult.Builder<>();
                 for (int i = 0; i < documentBundles.size(); i++) {
                     GenericDocument document = new GenericDocument(documentBundles.get(i));
-                    DocumentProto documentProto = GenericDocumentToProtoConverter.convert(document);
                     try {
-                        impl.putDocument(databaseName, documentProto);
+                        impl.putDocument(databaseName, document);
                         resultBuilder.setSuccess(document.getUri(), /*result=*/ null);
                     } catch (Throwable t) {
                         resultBuilder.setResult(document.getUri(), throwableToFailedResult(t));
@@ -131,6 +120,8 @@
         @Override
         public void getDocuments(@NonNull String databaseName, @NonNull String namespace,
                 @NonNull List<String> uris, @NonNull AndroidFuture<AppSearchBatchResult> callback) {
+            Preconditions.checkNotNull(databaseName);
+            Preconditions.checkNotNull(namespace);
             Preconditions.checkNotNull(uris);
             Preconditions.checkNotNull(callback);
             int callingUid = Binder.getCallingUidOrThrow();
@@ -144,16 +135,8 @@
                 for (int i = 0; i < uris.size(); i++) {
                     String uri = uris.get(i);
                     try {
-                        DocumentProto documentProto = impl.getDocument(
-                                databaseName, namespace, uri);
-                        if (documentProto == null) {
-                            resultBuilder.setFailure(
-                                    uri, AppSearchResult.RESULT_NOT_FOUND, /*errorMessage=*/ null);
-                        } else {
-                            GenericDocument genericDocument =
-                                    GenericDocumentToProtoConverter.convert(documentProto);
-                            resultBuilder.setSuccess(uri, genericDocument.getBundle());
-                        }
+                        GenericDocument document = impl.getDocument(databaseName, namespace, uri);
+                        resultBuilder.setSuccess(uri, document.getBundle());
                     } catch (Throwable t) {
                         resultBuilder.setResult(uri, throwableToFailedResult(t));
                     }
@@ -167,12 +150,14 @@
         }
 
         // TODO(sidchhabra): Do this in a threadpool.
+        // TODO(b/162450968) handle pagination after getNextPage and SearchResults is ready.
         @Override
         public void query(
                 @NonNull String databaseName,
                 @NonNull String queryExpression,
                 @NonNull Bundle searchSpecBundle,
                 @NonNull AndroidFuture<AppSearchResult> callback) {
+            Preconditions.checkNotNull(databaseName);
             Preconditions.checkNotNull(queryExpression);
             Preconditions.checkNotNull(searchSpecBundle);
             Preconditions.checkNotNull(callback);
@@ -180,29 +165,14 @@
             int callingUserId = UserHandle.getUserId(callingUid);
             final long callingIdentity = Binder.clearCallingIdentity();
             try {
-                SearchSpec searchSpec = new SearchSpec(searchSpecBundle);
-                SearchSpecProto searchSpecProto =
-                        SearchSpecToProtoConverter.toSearchSpecProto(searchSpec);
-                searchSpecProto = searchSpecProto.toBuilder()
-                        .setQuery(queryExpression).build();
                 AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                 databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid);
-                // TODO(adorokhine): handle pagination
-                SearchResultProto searchResultProto = impl.query(
+                SearchResultPage searchResultPage = impl.query(
                         databaseName,
-                        searchSpecProto,
-                        SearchSpecToProtoConverter.toResultSpecProto(searchSpec),
-                        SearchSpecToProtoConverter.toScoringSpecProto(searchSpec));
-                List<SearchResult> searchResultList =
-                        new ArrayList<>(searchResultProto.getResultsCount());
-                for (int i = 0; i < searchResultProto.getResultsCount(); i++) {
-                    SearchResult result = SearchResultToProtoConverter.convertSearchResult(
-                            searchResultProto.getResults(i));
-                    searchResultList.add(result);
-                }
-                SearchResults searchResults =
-                        new SearchResults(searchResultList, searchResultProto.getNextPageToken());
-                callback.complete(AppSearchResult.newSuccessfulResult(searchResults));
+                        queryExpression,
+                        new SearchSpec(searchSpecBundle));
+                callback.complete(
+                        AppSearchResult.newSuccessfulResult(searchResultPage.getBundle()));
             } catch (Throwable t) {
                 callback.complete(throwableToFailedResult(t));
             } finally {
@@ -211,8 +181,10 @@
         }
 
         @Override
-        public void delete(@NonNull String databaseName, @NonNull String namespace,
+        public void removeByUri(@NonNull String databaseName, @NonNull String namespace,
                 List<String> uris, AndroidFuture<AppSearchBatchResult> callback) {
+            Preconditions.checkNotNull(databaseName);
+            Preconditions.checkNotNull(namespace);
             Preconditions.checkNotNull(uris);
             Preconditions.checkNotNull(callback);
             int callingUid = Binder.getCallingUidOrThrow();
@@ -241,38 +213,14 @@
         }
 
         @Override
-        public void deleteByTypes(@NonNull String databaseName,
-                List<String> schemaTypes, AndroidFuture<AppSearchBatchResult> callback) {
-            Preconditions.checkNotNull(schemaTypes);
-            Preconditions.checkNotNull(callback);
-            int callingUid = Binder.getCallingUidOrThrow();
-            int callingUserId = UserHandle.getUserId(callingUid);
-            final long callingIdentity = Binder.clearCallingIdentity();
-            try {
-                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
-                databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid);
-                AppSearchBatchResult.Builder<String, Void> resultBuilder =
-                        new AppSearchBatchResult.Builder<>();
-                for (int i = 0; i < schemaTypes.size(); i++) {
-                    String schemaType = schemaTypes.get(i);
-                    try {
-                        impl.removeByType(databaseName, schemaType);
-                        resultBuilder.setSuccess(schemaType, /*result=*/ null);
-                    } catch (Throwable t) {
-                        resultBuilder.setResult(schemaType, throwableToFailedResult(t));
-                    }
-                }
-                callback.complete(resultBuilder.build());
-            } catch (Throwable t) {
-                callback.completeExceptionally(t);
-            } finally {
-                Binder.restoreCallingIdentity(callingIdentity);
-            }
-        }
-
-        @Override
-        public void deleteAll(@NonNull String databaseName,
+        public void removeByQuery(
+                @NonNull String databaseName,
+                @NonNull String queryExpression,
+                @NonNull Bundle searchSpecBundle,
                 @NonNull AndroidFuture<AppSearchResult> callback) {
+            Preconditions.checkNotNull(databaseName);
+            Preconditions.checkNotNull(queryExpression);
+            Preconditions.checkNotNull(searchSpecBundle);
             Preconditions.checkNotNull(callback);
             int callingUid = Binder.getCallingUidOrThrow();
             int callingUserId = UserHandle.getUserId(callingUid);
@@ -280,8 +228,8 @@
             try {
                 AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                 databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid);
-                impl.removeAll(databaseName);
-                callback.complete(AppSearchResult.newSuccessfulResult(null));
+                impl.removeByQuery(databaseName, queryExpression, new SearchSpec(searchSpecBundle));
+                callback.complete(AppSearchResult.newSuccessfulResult(/*result= */null));
             } catch (Throwable t) {
                 callback.complete(throwableToFailedResult(t));
             } finally {
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java
index b1a79f8..e0215449 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java
@@ -16,21 +16,27 @@
 
 package com.android.server.appsearch.external.localstorage;
 
+import android.os.Bundle;
 import android.util.Log;
 
 import com.android.internal.annotations.GuardedBy;
 import android.annotation.NonNull;
-import android.annotation.Nullable;
 
 import com.android.internal.annotations.VisibleForTesting;
 import android.annotation.WorkerThread;
 import android.app.appsearch.AppSearchResult;
+import android.app.appsearch.AppSearchSchema;
+import android.app.appsearch.GenericDocument;
+import android.app.appsearch.SearchResultPage;
+import android.app.appsearch.SearchSpec;
 import android.app.appsearch.exceptions.AppSearchException;
 import com.android.internal.util.Preconditions;
+import com.android.server.appsearch.external.localstorage.converter.GenericDocumentToProtoConverter;
+import com.android.server.appsearch.external.localstorage.converter.SchemaToProtoConverter;
+import com.android.server.appsearch.external.localstorage.converter.SearchResultToProtoConverter;
+import com.android.server.appsearch.external.localstorage.converter.SearchSpecToProtoConverter;
 
 import com.google.android.icing.IcingSearchEngine;
-import com.google.android.icing.proto.DeleteByNamespaceResultProto;
-import com.google.android.icing.proto.DeleteBySchemaTypeResultProto;
 import com.google.android.icing.proto.DeleteResultProto;
 import com.google.android.icing.proto.DocumentProto;
 import com.google.android.icing.proto.GetAllNamespacesResultProto;
@@ -54,8 +60,10 @@
 import com.google.android.icing.proto.StatusProto;
 
 import java.io.File;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.locks.ReadWriteLock;
@@ -89,12 +97,14 @@
  * </ul>
  *
  * <p>This class is thread safe.
+ *
  * @hide
  */
 
 @WorkerThread
 public final class AppSearchImpl {
     private static final String TAG = "AppSearchImpl";
+    private static final char DATABASE_DELIMITER = '/';
 
     @VisibleForTesting
     static final int OPTIMIZE_THRESHOLD_DOC_COUNT = 1000;
@@ -173,20 +183,27 @@
      * <p>This method belongs to mutate group.
      *
      * @param databaseName  The name of the database where this schema lives.
-     * @param origSchema    The schema to set for this app.
+     * @param schemas       Schemas to set for this app.
      * @param forceOverride Whether to force-apply the schema even if it is incompatible. Documents
      *                      which do not comply with the new schema will be deleted.
      * @throws AppSearchException on IcingSearchEngine error.
      */
-    public void setSchema(@NonNull String databaseName, @NonNull SchemaProto origSchema,
+    public void setSchema(@NonNull String databaseName, @NonNull Set<AppSearchSchema> schemas,
             boolean forceOverride) throws AppSearchException {
         SchemaProto schemaProto = getSchemaProto();
 
         SchemaProto.Builder existingSchemaBuilder = schemaProto.toBuilder();
 
+        SchemaProto.Builder newSchemaBuilder = SchemaProto.newBuilder();
+        for (AppSearchSchema schema : schemas) {
+            SchemaTypeConfigProto schemaTypeProto = SchemaToProtoConverter.convert(schema);
+            newSchemaBuilder.addTypes(schemaTypeProto);
+        }
+
         // Combine the existing schema (which may have types from other databases) with this
         // database's new schema. Modifies the existingSchemaBuilder.
-        Set<String> newTypeNames = rewriteSchema(databaseName, existingSchemaBuilder, origSchema);
+        Set<String> newTypeNames = rewriteSchema(databaseName, existingSchemaBuilder,
+                newSchemaBuilder.build());
 
         SetSchemaResultProto setSchemaResultProto;
         mReadWriteLock.writeLock().lock();
@@ -220,7 +237,7 @@
             if (setSchemaResultProto.getDeletedSchemaTypesCount() > 0
                     || (setSchemaResultProto.getIncompatibleSchemaTypesCount() > 0
                     && forceOverride)) {
-                // Any existing schemas which is not in origSchema will be deleted, and all
+                // Any existing schemas which is not in 'schemas' will be deleted, and all
                 // documents of these types were also deleted. And so well if we force override
                 // incompatible schemas.
                 checkForOptimize(/* force= */true);
@@ -239,10 +256,11 @@
      * @param document     The document to index.
      * @throws AppSearchException on IcingSearchEngine error.
      */
-    public void putDocument(@NonNull String databaseName, @NonNull DocumentProto document)
+    public void putDocument(@NonNull String databaseName, @NonNull GenericDocument document)
             throws AppSearchException {
-        DocumentProto.Builder documentBuilder = document.toBuilder();
-        rewriteDocumentTypes(getDatabasePrefix(databaseName), documentBuilder, /*add=*/ true);
+        DocumentProto.Builder documentBuilder = GenericDocumentToProtoConverter.convert(
+                document).toBuilder();
+        addPrefixToDocument(documentBuilder, getDatabasePrefix(databaseName));
 
         PutResultProto putResultProto;
         mReadWriteLock.writeLock().lock();
@@ -266,11 +284,11 @@
      * @param databaseName The databaseName this document resides in.
      * @param namespace    The namespace this document resides in.
      * @param uri          The URI of the document to get.
-     * @return The Document contents, or {@code null} if no such URI exists in the system.
+     * @return The Document contents
      * @throws AppSearchException on IcingSearchEngine error.
      */
-    @Nullable
-    public DocumentProto getDocument(@NonNull String databaseName, @NonNull String namespace,
+    @NonNull
+    public GenericDocument getDocument(@NonNull String databaseName, @NonNull String namespace,
             @NonNull String uri) throws AppSearchException {
         GetResultProto getResultProto;
         mReadWriteLock.readLock().lock();
@@ -283,8 +301,8 @@
         checkSuccess(getResultProto.getStatus());
 
         DocumentProto.Builder documentBuilder = getResultProto.getDocument().toBuilder();
-        rewriteDocumentTypes(getDatabasePrefix(databaseName), documentBuilder, /*add=*/ false);
-        return documentBuilder.build();
+        removeDatabasesFromDocument(documentBuilder);
+        return GenericDocumentToProtoConverter.convert(documentBuilder.build());
     }
 
     /**
@@ -292,33 +310,60 @@
      *
      * <p>This method belongs to query group.
      *
-     * @param databaseName The databaseName this query for.
-     * @param searchSpec   Defines what and how to search
-     * @param resultSpec   Defines what results to show
-     * @param scoringSpec  Defines how to order results
-     * @return The results of performing this search  The proto might have no {@code results} if no
-     * documents matched the query.
+     * @param databaseName    The databaseName this query for.
+     * @param queryExpression Query String to search.
+     * @param searchSpec      Spec for setting filters, raw query etc.
+     * @return The results of performing this search. It may contain an empty list of results if
+     * no documents matched the query.
      * @throws AppSearchException on IcingSearchEngine error.
      */
     @NonNull
-    public SearchResultProto query(
+    public SearchResultPage query(
             @NonNull String databaseName,
-            @NonNull SearchSpecProto searchSpec,
-            @NonNull ResultSpecProto resultSpec,
-            @NonNull ScoringSpecProto scoringSpec) throws AppSearchException {
-        SearchSpecProto.Builder searchSpecBuilder = searchSpec.toBuilder();
+            @NonNull String queryExpression,
+            @NonNull SearchSpec searchSpec) throws AppSearchException {
+        return doQuery(Collections.singleton(databaseName), queryExpression, searchSpec);
+    }
+
+    /**
+     * Executes a global query, i.e. over all permitted databases, against the AppSearch index and
+     * returns results.
+     *
+     * <p>This method belongs to query group.
+     *
+     * @param queryExpression Query String to search.
+     * @param searchSpec      Spec for setting filters, raw query etc.
+     * @return The results of performing this search. It may contain an empty list of results if
+     * no documents matched the query.
+     * @throws AppSearchException on IcingSearchEngine error.
+     */
+    @NonNull
+    public SearchResultPage globalQuery(
+            @NonNull String queryExpression,
+            @NonNull SearchSpec searchSpec) throws AppSearchException {
+        return doQuery(mNamespaceMap.keySet(), queryExpression, searchSpec);
+    }
+
+    private SearchResultPage doQuery(
+            @NonNull Set<String> databases, @NonNull String queryExpression,
+            @NonNull SearchSpec searchSpec)
+            throws AppSearchException {
+        SearchSpecProto searchSpecProto =
+                SearchSpecToProtoConverter.toSearchSpecProto(searchSpec);
+        SearchSpecProto.Builder searchSpecBuilder = searchSpecProto.toBuilder()
+                .setQuery(queryExpression);
+
+        ResultSpecProto resultSpec = SearchSpecToProtoConverter.toResultSpecProto(searchSpec);
+        ScoringSpecProto scoringSpec = SearchSpecToProtoConverter.toScoringSpecProto(searchSpec);
         SearchResultProto searchResultProto;
         mReadWriteLock.readLock().lock();
         try {
-            // Only rewrite SearchSpec for non empty database.
-            // rewriteSearchSpecForNonEmptyDatabase will return false for empty database, we
-            // should just return an empty SearchResult and skip sending request to Icing.
-            if (!rewriteSearchSpecForNonEmptyDatabase(databaseName, searchSpecBuilder)) {
-                return SearchResultProto.newBuilder()
-                        .setStatus(StatusProto.newBuilder()
-                                .setCode(StatusProto.Code.OK)
-                                .build())
-                        .build();
+            // rewriteSearchSpecForDatabases will return false if none of the databases have
+            // documents, so we can return an empty SearchResult and skip sending request to Icing.
+            // We use the mNamespaceMap.keySet here because it's the smaller set of valid databases
+            // that could exist.
+            if (!rewriteSearchSpecForDatabases(searchSpecBuilder, databases)) {
+                return new SearchResultPage(Bundle.EMPTY);
             }
             searchResultProto = mIcingSearchEngine.search(
                     searchSpecBuilder.build(), scoringSpec, resultSpec);
@@ -326,34 +371,32 @@
             mReadWriteLock.readLock().unlock();
         }
         checkSuccess(searchResultProto.getStatus());
-        if (searchResultProto.getResultsCount() == 0) {
-            return searchResultProto;
-        }
-        return rewriteSearchResultProto(databaseName, searchResultProto);
+        return rewriteSearchResultProto(searchResultProto);
     }
 
     /**
      * Fetches the next page of results of a previously executed query. Results can be empty if
      * next-page token is invalid or all pages have been returned.
      *
-     * @param databaseName The databaseName of the previously executed query.
+     * <p>This method belongs to query group.
+     *
      * @param nextPageToken The token of pre-loaded results of previously executed query.
      * @return The next page of results of previously executed query.
      * @throws AppSearchException on IcingSearchEngine error.
      */
     @NonNull
-    public SearchResultProto getNextPage(@NonNull String databaseName, long nextPageToken)
+    public SearchResultPage getNextPage(long nextPageToken)
             throws AppSearchException {
         SearchResultProto searchResultProto = mIcingSearchEngine.getNextPage(nextPageToken);
         checkSuccess(searchResultProto.getStatus());
-        if (searchResultProto.getResultsCount() == 0) {
-            return searchResultProto;
-        }
-        return rewriteSearchResultProto(databaseName, searchResultProto);
+        return rewriteSearchResultProto(searchResultProto);
     }
 
     /**
      * Invalidates the next-page token so that no more results of the related query can be returned.
+     *
+     * <p>This method belongs to query group.
+     *
      * @param nextPageToken The token of pre-loaded results of previously executed query to be
      *                      Invalidated.
      */
@@ -386,93 +429,43 @@
     }
 
     /**
-     * Removes all documents having the given {@code schemaType} in given database.
+     * Removes documents by given query.
      *
      * <p>This method belongs to mutate group.
      *
-     * @param databaseName The databaseName that contains documents of schemaType.
-     * @param schemaType   The schemaType of documents to remove.
+     * @param databaseName    The databaseName the document is in.
+     * @param queryExpression Query String to search.
+     * @param searchSpec      Defines what and how to remove
      * @throws AppSearchException on IcingSearchEngine error.
      */
-    public void removeByType(@NonNull String databaseName, @NonNull String schemaType)
+    public void removeByQuery(@NonNull String databaseName, @NonNull String queryExpression,
+            @NonNull SearchSpec searchSpec)
             throws AppSearchException {
-        String qualifiedType = getDatabasePrefix(databaseName) + schemaType;
-        DeleteBySchemaTypeResultProto deleteBySchemaTypeResultProto;
-        mReadWriteLock.writeLock().lock();
-        try {
-            Set<String> existingSchemaTypes = mSchemaMap.get(databaseName);
-            if (existingSchemaTypes == null || !existingSchemaTypes.contains(qualifiedType)) {
-                return;
-            }
-            deleteBySchemaTypeResultProto = mIcingSearchEngine.deleteBySchemaType(qualifiedType);
-            checkForOptimize(/* force= */true);
-        } finally {
-            mReadWriteLock.writeLock().unlock();
-        }
-        checkSuccess(deleteBySchemaTypeResultProto.getStatus());
-    }
 
-    /**
-     * Removes all documents having the given {@code namespace} in given database.
-     *
-     * <p>This method belongs to mutate group.
-     *
-     * @param databaseName The databaseName that contains documents of namespace.
-     * @param namespace    The namespace of documents to remove.
-     * @throws AppSearchException on IcingSearchEngine error.
-     */
-    public void removeByNamespace(@NonNull String databaseName, @NonNull String namespace)
-            throws AppSearchException {
-        String qualifiedNamespace = getDatabasePrefix(databaseName) + namespace;
-        DeleteByNamespaceResultProto deleteByNamespaceResultProto;
+        SearchSpecProto searchSpecProto =
+                SearchSpecToProtoConverter.toSearchSpecProto(searchSpec);
+        SearchSpecProto.Builder searchSpecBuilder = searchSpecProto.toBuilder()
+                .setQuery(queryExpression);
+        DeleteResultProto deleteResultProto;
         mReadWriteLock.writeLock().lock();
         try {
-            Set<String> existingNamespaces = mNamespaceMap.get(databaseName);
-            if (existingNamespaces == null || !existingNamespaces.contains(qualifiedNamespace)) {
+            // Only rewrite SearchSpec for non empty database.
+            // rewriteSearchSpecForNonEmptyDatabase will return false for empty database, we
+            // should skip sending request to Icing and return in here.
+            if (!rewriteSearchSpecForDatabases(searchSpecBuilder,
+                    Collections.singleton(databaseName))) {
                 return;
             }
-            deleteByNamespaceResultProto = mIcingSearchEngine.deleteByNamespace(qualifiedNamespace);
+            deleteResultProto = mIcingSearchEngine.deleteByQuery(
+                    searchSpecBuilder.build());
             checkForOptimize(/* force= */true);
         } finally {
             mReadWriteLock.writeLock().unlock();
         }
-        checkSuccess(deleteByNamespaceResultProto.getStatus());
-    }
-
-    /**
-     * Clears the given database by removing all documents and types.
-     *
-     * <p>The schemas will remain. To clear everything including schemas, please call
-     * {@link #setSchema} with an empty schema and {@code forceOverride} set to true.
-     *
-     * <p>This method belongs to mutate group.
-     *
-     * @param databaseName The databaseName to remove all documents from.
-     * @throws AppSearchException on IcingSearchEngine error.
-     */
-    public void removeAll(@NonNull String databaseName)
-            throws AppSearchException {
-        mReadWriteLock.writeLock().lock();
-        try {
-            Set<String> existingNamespaces = mNamespaceMap.get(databaseName);
-            if (existingNamespaces == null) {
-                return;
-            }
-            for (String namespace : existingNamespaces) {
-                DeleteByNamespaceResultProto deleteByNamespaceResultProto =
-                        mIcingSearchEngine.deleteByNamespace(namespace);
-                // There's no way for AppSearch to know that all documents in a particular
-                // namespace have been deleted, but if you try to delete an empty namespace, Icing
-                // returns NOT_FOUND. Just ignore that code.
-                checkCodeOneOf(
-                        deleteByNamespaceResultProto.getStatus(),
-                        StatusProto.Code.OK, StatusProto.Code.NOT_FOUND);
-            }
-            mNamespaceMap.remove(databaseName);
-            checkForOptimize(/* force= */true);
-        } finally {
-            mReadWriteLock.writeLock().unlock();
-        }
+        // It seems that the caller wants to get success if the data matching the query is not in
+        // the DB because it was not there or was successfully deleted.
+        checkCodeOneOf(deleteResultProto.getStatus(),
+                StatusProto.Code.OK, StatusProto.Code.NOT_FOUND);
     }
 
     /**
@@ -565,36 +558,63 @@
     }
 
     /**
-     * Rewrites all types and namespaces mentioned anywhere in {@code documentBuilder} to prepend
-     * or remove {@code prefix}.
+     * Prepends {@code prefix} to all types and namespaces mentioned anywhere in
+     * {@code documentBuilder}.
      *
-     * @param prefix          The prefix to add or remove
      * @param documentBuilder The document to mutate
-     * @param add             Whether to add prefix to the types and namespaces. If {@code false},
-     *                        prefix will be removed.
-     * @throws IllegalStateException If {@code add=false} and the document has a type or namespace
-     *                               that doesn't start with {@code prefix}.
+     * @param prefix          The prefix to add
      */
     @VisibleForTesting
-    void rewriteDocumentTypes(
-            @NonNull String prefix,
+    void addPrefixToDocument(
             @NonNull DocumentProto.Builder documentBuilder,
-            boolean add) {
+            @NonNull String prefix) {
         // Rewrite the type name to include/remove the prefix.
-        String newSchema;
-        if (add) {
-            newSchema = prefix + documentBuilder.getSchema();
-        } else {
-            newSchema = removePrefix(prefix, "schemaType", documentBuilder.getSchema());
-        }
+        String newSchema = prefix + documentBuilder.getSchema();
         documentBuilder.setSchema(newSchema);
 
         // Rewrite the namespace to include/remove the prefix.
-        if (add) {
-            documentBuilder.setNamespace(prefix + documentBuilder.getNamespace());
-        } else {
-            documentBuilder.setNamespace(
-                    removePrefix(prefix, "namespace", documentBuilder.getNamespace()));
+        documentBuilder.setNamespace(prefix + documentBuilder.getNamespace());
+
+        // Recurse into derived documents
+        for (int propertyIdx = 0;
+                propertyIdx < documentBuilder.getPropertiesCount();
+                propertyIdx++) {
+            int documentCount = documentBuilder.getProperties(propertyIdx).getDocumentValuesCount();
+            if (documentCount > 0) {
+                PropertyProto.Builder propertyBuilder =
+                        documentBuilder.getProperties(propertyIdx).toBuilder();
+                for (int documentIdx = 0; documentIdx < documentCount; documentIdx++) {
+                    DocumentProto.Builder derivedDocumentBuilder =
+                            propertyBuilder.getDocumentValues(documentIdx).toBuilder();
+                    addPrefixToDocument(derivedDocumentBuilder, prefix);
+                    propertyBuilder.setDocumentValues(documentIdx, derivedDocumentBuilder);
+                }
+                documentBuilder.setProperties(propertyIdx, propertyBuilder);
+            }
+        }
+    }
+
+    /**
+     * Removes any database names from types and namespaces mentioned anywhere in
+     * {@code documentBuilder}.
+     *
+     * @param documentBuilder The document to mutate
+     */
+    @VisibleForTesting
+    void removeDatabasesFromDocument(@NonNull DocumentProto.Builder documentBuilder) {
+        int delimiterIndex;
+        if ((delimiterIndex = documentBuilder.getSchema().indexOf(DATABASE_DELIMITER)) != -1) {
+            // Rewrite the type name to remove the prefix.
+            // Add 1 to include the char size of the DATABASE_DELIMITER
+            String newSchema = documentBuilder.getSchema().substring(delimiterIndex + 1);
+            documentBuilder.setSchema(newSchema);
+        }
+
+        if ((delimiterIndex = documentBuilder.getNamespace().indexOf(DATABASE_DELIMITER)) != -1) {
+            // Rewrite the namespace to remove the prefix.
+            // Add 1 to include the char size of the DATABASE_DELIMITER
+            String newNamespace = documentBuilder.getNamespace().substring(delimiterIndex + 1);
+            documentBuilder.setNamespace(newNamespace);
         }
 
         // Recurse into derived documents
@@ -608,7 +628,7 @@
                 for (int documentIdx = 0; documentIdx < documentCount; documentIdx++) {
                     DocumentProto.Builder derivedDocumentBuilder =
                             propertyBuilder.getDocumentValues(documentIdx).toBuilder();
-                    rewriteDocumentTypes(prefix, derivedDocumentBuilder, add);
+                    removeDatabasesFromDocument(derivedDocumentBuilder);
                     propertyBuilder.setDocumentValues(documentIdx, derivedDocumentBuilder);
                 }
                 documentBuilder.setProperties(propertyIdx, propertyBuilder);
@@ -617,51 +637,68 @@
     }
 
     /**
-     * Rewrites searchSpec by adding schemaTypeFilter and namespacesFilter
+     * Rewrites the schemaTypeFilters and namespacesFilters that exist in {@code databaseNames}.
      *
-     * <p>If user input empty filter lists, will look up {@link #mSchemaMap} and
-     * {@link #mNamespaceMap} and put all values belong to current database to narrow down Icing
-     * search area.
+     * <p>If the searchSpec has empty filter lists, all existing databases from
+     * {@code databaseNames} will be added.
      * <p>This method should be only called in query methods and get the READ lock to keep thread
      * safety.
-     * @return false if the current database is brand new and contains nothing. We should just
-     * return an empty query result to user.
+     *
+     * @return false if none of the requested databases exist.
      */
     @VisibleForTesting
     @GuardedBy("mReadWriteLock")
-    boolean rewriteSearchSpecForNonEmptyDatabase(@NonNull String databaseName,
-            @NonNull SearchSpecProto.Builder searchSpecBuilder) {
-        Set<String> existingSchemaTypes = mSchemaMap.get(databaseName);
-        Set<String> existingNamespaces = mNamespaceMap.get(databaseName);
-        if (existingSchemaTypes == null || existingSchemaTypes.isEmpty()
-                || existingNamespaces == null || existingNamespaces.isEmpty()) {
+    boolean rewriteSearchSpecForDatabases(
+            @NonNull SearchSpecProto.Builder searchSpecBuilder,
+            @NonNull Set<String> databaseNames) {
+        // Create a copy since retainAll() modifies the original set.
+        Set<String> existingDatabases = new HashSet<>(mNamespaceMap.keySet());
+        existingDatabases.retainAll(databaseNames);
+
+        if (existingDatabases.isEmpty()) {
+            // None of the databases exist, empty query.
             return false;
         }
-        // Rewrite any existing schema types specified in the searchSpec, or add schema types to
-        // limit the search to this database instance.
-        if (searchSpecBuilder.getSchemaTypeFiltersCount() > 0) {
-            for (int i = 0; i < searchSpecBuilder.getSchemaTypeFiltersCount(); i++) {
-                String qualifiedType = getDatabasePrefix(databaseName)
-                        + searchSpecBuilder.getSchemaTypeFilters(i);
-                if (existingSchemaTypes.contains(qualifiedType)) {
-                    searchSpecBuilder.setSchemaTypeFilters(i, qualifiedType);
+
+        // Cache the schema type filters and namespaces before clearing everything.
+        List<String> schemaTypeFilters = searchSpecBuilder.getSchemaTypeFiltersList();
+        searchSpecBuilder.clearSchemaTypeFilters();
+
+        List<String> namespaceFilters = searchSpecBuilder.getNamespaceFiltersList();
+        searchSpecBuilder.clearNamespaceFilters();
+
+        // Rewrite filters to include a database prefix.
+        for (String databaseName : existingDatabases) {
+            Set<String> existingSchemaTypes = mSchemaMap.get(databaseName);
+            if (schemaTypeFilters.isEmpty()) {
+                // Include all schema types
+                searchSpecBuilder.addAllSchemaTypeFilters(existingSchemaTypes);
+            } else {
+                // Qualify the given schema types
+                for (String schemaType : schemaTypeFilters) {
+                    String qualifiedType = getDatabasePrefix(databaseName) + schemaType;
+                    if (existingSchemaTypes.contains(qualifiedType)) {
+                        searchSpecBuilder.addSchemaTypeFilters(qualifiedType);
+                    }
+
                 }
             }
-        } else {
-            searchSpecBuilder.addAllSchemaTypeFilters(existingSchemaTypes);
+
+            Set<String> existingNamespaces = mNamespaceMap.get(databaseName);
+            if (namespaceFilters.isEmpty()) {
+                // Include all namespaces
+                searchSpecBuilder.addAllNamespaceFilters(existingNamespaces);
+            } else {
+                // Qualify the given namespaces.
+                for (String namespace : namespaceFilters) {
+                    String qualifiedNamespace = getDatabasePrefix(databaseName) + namespace;
+                    if (existingNamespaces.contains(qualifiedNamespace)) {
+                        searchSpecBuilder.addNamespaceFilters(qualifiedNamespace);
+                    }
+                }
+            }
         }
 
-        // Rewrite any existing namespaces specified in the searchSpec, or add namespaces to
-        // limit the search to this database instance.
-        if (searchSpecBuilder.getNamespaceFiltersCount() > 0) {
-            for (int i = 0; i < searchSpecBuilder.getNamespaceFiltersCount(); i++) {
-                String qualifiedNamespace = getDatabasePrefix(databaseName)
-                        + searchSpecBuilder.getNamespaceFilters(i);
-                searchSpecBuilder.setNamespaceFilters(i, qualifiedNamespace);
-            }
-        } else {
-            searchSpecBuilder.addAllNamespaceFilters(existingNamespaces);
-        }
         return true;
     }
 
@@ -676,12 +713,13 @@
 
     @NonNull
     private String getDatabasePrefix(@NonNull String databaseName) {
-        return databaseName + "/";
+        // TODO(b/170370381): Reconsider the way we separate database names for security reasons.
+        return databaseName + DATABASE_DELIMITER;
     }
 
     @NonNull
     private String getDatabaseName(@NonNull String prefixedValue) throws AppSearchException {
-        int delimiterIndex = prefixedValue.indexOf('/');
+        int delimiterIndex = prefixedValue.indexOf(DATABASE_DELIMITER);
         if (delimiterIndex == -1) {
             throw new AppSearchException(AppSearchResult.RESULT_UNKNOWN_ERROR,
                     "The databaseName prefixed value doesn't contains a valid database name.");
@@ -689,17 +727,6 @@
         return prefixedValue.substring(0, delimiterIndex);
     }
 
-    @NonNull
-    private static String removePrefix(@NonNull String prefix, @NonNull String inputType,
-            @NonNull String input) {
-        if (!input.startsWith(prefix)) {
-            throw new IllegalStateException(
-                    "Unexpected " + inputType + " \"" + input
-                            + "\" does not start with \"" + prefix + "\"");
-        }
-        return input.substring(prefix.length());
-    }
-
     @GuardedBy("mReadWriteLock")
     private void addToMap(Map<String, Set<String>> map, String databaseName, String prefixedValue) {
         Set<String> values = map.get(databaseName);
@@ -733,7 +760,7 @@
         }
 
         if (statusProto.getCode() == StatusProto.Code.WARNING_DATA_LOSS) {
-            // TODO: May want to propagate WARNING_DATA_LOSS up to AppSearchManager so they can
+            // TODO: May want to propagate WARNING_DATA_LOSS up to AppSearchSession so they can
             //  choose to log the error or potentially pass it on to clients.
             Log.w(TAG, "Encountered WARNING_DATA_LOSS: " + statusProto.getMessage());
             return;
@@ -776,22 +803,21 @@
         }
     }
 
-    /** Remove the rewritten schema types from any result documents.*/
-    private SearchResultProto rewriteSearchResultProto(@NonNull String databaseName,
+    /** Remove the rewritten schema types from any result documents. */
+    private SearchResultPage rewriteSearchResultProto(
             @NonNull SearchResultProto searchResultProto) {
-        SearchResultProto.Builder searchResultsBuilder = searchResultProto.toBuilder();
-        for (int i = 0; i < searchResultsBuilder.getResultsCount(); i++) {
+        SearchResultProto.Builder resultsBuilder = searchResultProto.toBuilder();
+        for (int i = 0; i < searchResultProto.getResultsCount(); i++) {
             if (searchResultProto.getResults(i).hasDocument()) {
                 SearchResultProto.ResultProto.Builder resultBuilder =
-                        searchResultsBuilder.getResults(i).toBuilder();
+                        searchResultProto.getResults(i).toBuilder();
                 DocumentProto.Builder documentBuilder = resultBuilder.getDocument().toBuilder();
-                rewriteDocumentTypes(
-                        getDatabasePrefix(databaseName), documentBuilder, /*add=*/false);
+                removeDatabasesFromDocument(documentBuilder);
                 resultBuilder.setDocument(documentBuilder);
-                searchResultsBuilder.setResults(i, resultBuilder);
+                resultsBuilder.setResults(i, resultBuilder);
             }
         }
-        return searchResultsBuilder.build();
+        return SearchResultToProtoConverter.convertToSearchResultPage(resultsBuilder);
     }
 
     @VisibleForTesting
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SearchResultToProtoConverter.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SearchResultToProtoConverter.java
index 9f7c696..4310b42 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SearchResultToProtoConverter.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SearchResultToProtoConverter.java
@@ -22,8 +22,10 @@
 
 import android.app.appsearch.GenericDocument;
 import android.app.appsearch.SearchResult;
+import android.app.appsearch.SearchResultPage;
 
 import com.google.android.icing.proto.SearchResultProto;
+import com.google.android.icing.proto.SearchResultProtoOrBuilder;
 import com.google.android.icing.proto.SnippetMatchProto;
 import com.google.android.icing.proto.SnippetProto;
 
@@ -38,9 +40,24 @@
 public class SearchResultToProtoConverter {
     private SearchResultToProtoConverter() {}
 
+
+    /** Translate a {@link SearchResultProto} into {@link SearchResultPage}. */
+    @NonNull
+    public static SearchResultPage convertToSearchResultPage(
+            @NonNull SearchResultProtoOrBuilder proto) {
+        Bundle bundle = new Bundle();
+        bundle.putLong(SearchResultPage.NEXT_PAGE_TOKEN_FIELD, proto.getNextPageToken());
+        ArrayList<Bundle> resultBundles = new ArrayList<>(proto.getResultsCount());
+        for (int i = 0; i < proto.getResultsCount(); i++) {
+            resultBundles.add(convertToSearchResultBundle(proto.getResults(i)));
+        }
+        bundle.putParcelableArrayList(SearchResultPage.RESULTS_FIELD, resultBundles);
+        return new SearchResultPage(bundle);
+    }
+
     /** Translate a {@link SearchResultProto.ResultProto} into {@link SearchResult}. */
     @NonNull
-    public static SearchResult convertSearchResult(
+    private static Bundle convertToSearchResultBundle(
             @NonNull SearchResultProto.ResultProtoOrBuilder proto) {
         Bundle bundle = new Bundle();
         GenericDocument document = GenericDocumentToProtoConverter.convert(proto.getDocument());
@@ -59,7 +76,7 @@
         }
         bundle.putParcelableArrayList(SearchResult.MATCHES_FIELD, matchList);
 
-        return new SearchResult(bundle);
+        return bundle;
     }
 
     private static Bundle convertToMatchInfoBundle(
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobParameters.java b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
index 62c90dfa..e251ff0 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
@@ -21,6 +21,7 @@
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.ClipData;
 import android.net.Network;
+import android.net.NetworkRequest;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.IBinder;
@@ -242,8 +243,9 @@
      *
      * @return the network that should be used to perform any network requests
      *         for this job, or {@code null} if this job didn't set any required
-     *         network type.
+     *         network type or if the job executed when there was no available network to use.
      * @see JobInfo.Builder#setRequiredNetworkType(int)
+     * @see JobInfo.Builder#setRequiredNetwork(NetworkRequest)
      */
     public @Nullable Network getNetwork() {
         return network;
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java b/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java
index bf5781b..361325d 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java
@@ -169,6 +169,7 @@
      * @param tag Debugging tag for dumps associated with this job (instead of the service class)
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
     public abstract @Result int scheduleAsPackage(@NonNull JobInfo job, @NonNull String packageName,
@@ -211,6 +212,7 @@
      * Returns a list of all currently-executing jobs.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract List<JobInfo> getStartedJobs();
 
     /**
@@ -220,5 +222,6 @@
      * <p class="note">This is a slow operation, so it should be called sparingly.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract List<JobSnapshot> getAllJobSnapshots();
 }
\ No newline at end of file
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
index ba2a8a3..d4ea7af 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -439,7 +439,7 @@
         private static final int DEFAULT_APP_STANDBY_RESTRICTED_QUOTA = 1;
         private static final long DEFAULT_APP_STANDBY_RESTRICTED_WINDOW = MILLIS_IN_DAY;
 
-        private static final boolean DEFAULT_LAZY_BATCHING = false;
+        private static final boolean DEFAULT_LAZY_BATCHING = true;
 
         // Minimum futurity of a new alarm
         public long MIN_FUTURITY = DEFAULT_MIN_FUTURITY;
diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
index 6f7dde2..1157ee9 100644
--- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
+++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
@@ -2390,7 +2390,8 @@
                     false, this);
             mInjector.registerDeviceConfigPropertiesChangedListener(this);
             // Load all the constants.
-            onPropertiesChanged(mInjector.getDeviceConfigProperties());
+            // postOneTimeCheckIdleStates() doesn't need to be called on boot.
+            processProperties(mInjector.getDeviceConfigProperties());
             updateSettings();
         }
 
@@ -2402,6 +2403,11 @@
 
         @Override
         public void onPropertiesChanged(DeviceConfig.Properties properties) {
+            processProperties(properties);
+            postOneTimeCheckIdleStates();
+        }
+
+        private void processProperties(DeviceConfig.Properties properties) {
             boolean timeThresholdsUpdated = false;
             synchronized (mAppIdleLock) {
                 for (String name : properties.getKeyset()) {
@@ -2482,7 +2488,6 @@
                     }
                 }
             }
-            postOneTimeCheckIdleStates();
         }
 
         private void updateTimeThresholds() {
diff --git a/apex/permission/Android.bp b/apex/permission/Android.bp
index 71a52bb..e30df05 100644
--- a/apex/permission/Android.bp
+++ b/apex/permission/Android.bp
@@ -21,7 +21,7 @@
 apex_defaults {
     name: "com.android.permission-defaults",
     updatable: true,
-    min_sdk_version: "R",
+    min_sdk_version: "30",
     key: "com.android.permission.key",
     certificate: ":com.android.permission.certificate",
     java_libs: [
diff --git a/apex/statsd/Android.bp b/apex/statsd/Android.bp
index ede8852..f13861e 100644
--- a/apex/statsd/Android.bp
+++ b/apex/statsd/Android.bp
@@ -35,7 +35,7 @@
     prebuilts: ["com.android.os.statsd.init.rc"],
     name: "com.android.os.statsd-defaults",
     updatable: true,
-    min_sdk_version: "R",
+    min_sdk_version: "30",
     key: "com.android.os.statsd.key",
     certificate: ":com.android.os.statsd.certificate",
 }
diff --git a/api/current.txt b/api/current.txt
index 344e93b..1a0db28 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -6950,6 +6950,7 @@
     method @Nullable public java.util.List<java.lang.String> getPermittedCrossProfileNotificationListeners(@NonNull android.content.ComponentName);
     method @Nullable public java.util.List<java.lang.String> getPermittedInputMethods(@NonNull android.content.ComponentName);
     method public int getPersonalAppsSuspendedReasons(@NonNull android.content.ComponentName);
+    method public int getRequiredPasswordComplexity();
     method public long getRequiredStrongAuthTimeout(@Nullable android.content.ComponentName);
     method public boolean getScreenCaptureDisabled(@Nullable android.content.ComponentName);
     method public java.util.List<android.os.UserHandle> getSecondaryUsers(@NonNull android.content.ComponentName);
@@ -7081,6 +7082,7 @@
     method public void setProfileEnabled(@NonNull android.content.ComponentName);
     method public void setProfileName(@NonNull android.content.ComponentName, String);
     method public void setRecommendedGlobalProxy(@NonNull android.content.ComponentName, @Nullable android.net.ProxyInfo);
+    method public void setRequiredPasswordComplexity(int);
     method public void setRequiredStrongAuthTimeout(@NonNull android.content.ComponentName, long);
     method public boolean setResetPasswordToken(android.content.ComponentName, byte[]);
     method public void setRestrictionsProvider(@NonNull android.content.ComponentName, @Nullable android.content.ComponentName);
@@ -7403,6 +7405,12 @@
     field public static final int ERROR_UNKNOWN = 1; // 0x1
   }
 
+  public final class UnsafeStateException extends java.lang.IllegalStateException implements android.os.Parcelable {
+    method public int describeContents();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.app.admin.UnsafeStateException> CREATOR;
+  }
+
 }
 
 package android.app.assist {
@@ -11400,7 +11408,7 @@
     field public static final int CONFIG_COLOR_MODE = 16384; // 0x4000
     field public static final int CONFIG_DENSITY = 4096; // 0x1000
     field public static final int CONFIG_FONT_SCALE = 1073741824; // 0x40000000
-    field public static final int CONFIG_FORCE_BOLD_TEXT = 268435456; // 0x10000000
+    field public static final int CONFIG_FONT_WEIGHT_ADJUSTMENT = 268435456; // 0x10000000
     field public static final int CONFIG_KEYBOARD = 16; // 0x10
     field public static final int CONFIG_KEYBOARD_HIDDEN = 32; // 0x20
     field public static final int CONFIG_LAYOUT_DIRECTION = 8192; // 0x2000
@@ -11736,7 +11744,7 @@
     method public long getFirstInstallTime();
     method public android.graphics.drawable.Drawable getIcon(int);
     method public CharSequence getLabel();
-    method public float getLoadingProgress();
+    method @FloatRange(from=0.0, to=1.0) public float getLoadingProgress();
     method public String getName();
     method public android.os.UserHandle getUser();
   }
@@ -12728,9 +12736,7 @@
     field public static final int COLOR_MODE_WIDE_COLOR_GAMUT_YES = 2; // 0x2
     field @NonNull public static final android.os.Parcelable.Creator<android.content.res.Configuration> CREATOR;
     field public static final int DENSITY_DPI_UNDEFINED = 0; // 0x0
-    field public static final int FORCE_BOLD_TEXT_NO = 1; // 0x1
-    field public static final int FORCE_BOLD_TEXT_UNDEFINED = 0; // 0x0
-    field public static final int FORCE_BOLD_TEXT_YES = 2; // 0x2
+    field public static final int FONT_WEIGHT_ADJUSTMENT_UNDEFINED = 2147483647; // 0x7fffffff
     field public static final int HARDKEYBOARDHIDDEN_NO = 1; // 0x1
     field public static final int HARDKEYBOARDHIDDEN_UNDEFINED = 0; // 0x0
     field public static final int HARDKEYBOARDHIDDEN_YES = 2; // 0x2
@@ -12797,7 +12803,7 @@
     field public int colorMode;
     field public int densityDpi;
     field public float fontScale;
-    field public int forceBoldText;
+    field public int fontWeightAdjustment;
     field public int hardKeyboardHidden;
     field public int keyboard;
     field public int keyboardHidden;
@@ -24184,6 +24190,25 @@
 
 package android.media {
 
+  public final class ApplicationMediaCapabilities implements android.os.Parcelable {
+    method public int describeContents();
+    method @NonNull public java.util.List<java.lang.String> getSupportedHdrTypes();
+    method @NonNull public java.util.List<java.lang.String> getSupportedVideoMimeTypes();
+    method public boolean isHdrTypeSupported(@NonNull String);
+    method public boolean isSlowMotionSupported();
+    method public boolean isVideoMimeTypeSupported(@NonNull String);
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.media.ApplicationMediaCapabilities> CREATOR;
+  }
+
+  public static final class ApplicationMediaCapabilities.Builder {
+    ctor public ApplicationMediaCapabilities.Builder();
+    method @NonNull public android.media.ApplicationMediaCapabilities.Builder addSupportedHdrType(@NonNull String);
+    method @NonNull public android.media.ApplicationMediaCapabilities.Builder addSupportedVideoMimeType(@NonNull String);
+    method @NonNull public android.media.ApplicationMediaCapabilities build();
+    method @NonNull public android.media.ApplicationMediaCapabilities.Builder setSlowMotionSupported(boolean);
+  }
+
   public class AsyncPlayer {
     ctor public AsyncPlayer(String);
     method @Deprecated public void play(android.content.Context, android.net.Uri, boolean, int);
@@ -24382,6 +24407,8 @@
     field public static final int ENCODING_MP3 = 9; // 0x9
     field public static final int ENCODING_OPUS = 20; // 0x14
     field public static final int ENCODING_PCM_16BIT = 2; // 0x2
+    field public static final int ENCODING_PCM_24BIT_PACKED = 21; // 0x15
+    field public static final int ENCODING_PCM_32BIT = 22; // 0x16
     field public static final int ENCODING_PCM_8BIT = 3; // 0x3
     field public static final int ENCODING_PCM_FLOAT = 4; // 0x4
     field public static final int SAMPLE_RATE_UNSPECIFIED = 0; // 0x0
@@ -26303,6 +26330,17 @@
     field public static final String TRACKS = "android.media.mediaextractor.ntrk";
   }
 
+  public final class MediaFeature {
+    ctor public MediaFeature();
+  }
+
+  public static final class MediaFeature.HdrType {
+    field public static final String DOLBY_VISION = "android.media.feature.hdr.dolby_vision";
+    field public static final String HDR10 = "android.media.feature.hdr.hdr10";
+    field public static final String HDR10_PLUS = "android.media.feature.hdr.hdr10_plus";
+    field public static final String HLG = "android.media.feature.hdr.hlg";
+  }
+
   public final class MediaFormat {
     ctor public MediaFormat();
     ctor public MediaFormat(@NonNull android.media.MediaFormat);
@@ -31672,6 +31710,7 @@
     method public android.net.DhcpInfo getDhcpInfo();
     method public int getMaxNumberOfNetworkSuggestionsPerApp();
     method @IntRange(from=0) public int getMaxSignalLevel();
+    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public int getNetworkSuggestionUserApprovalStatus();
     method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public java.util.List<android.net.wifi.WifiNetworkSuggestion> getNetworkSuggestions();
     method @Deprecated @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", "android.permission.NETWORK_SETUP_WIZARD"}) public java.util.List<android.net.wifi.hotspot2.PasspointConfiguration> getPasspointConfigurations();
     method public java.util.List<android.net.wifi.ScanResult> getScanResults();
@@ -31742,6 +31781,11 @@
     field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_INTERNAL = 1; // 0x1
     field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID = 5; // 0x5
     field public static final int STATUS_NETWORK_SUGGESTIONS_SUCCESS = 0; // 0x0
+    field public static final int STATUS_SUGGESTION_APPROVAL_APPROVED_BY_CARRIER_PRIVILEGE = 4; // 0x4
+    field public static final int STATUS_SUGGESTION_APPROVAL_APPROVED_BY_USER = 2; // 0x2
+    field public static final int STATUS_SUGGESTION_APPROVAL_PENDING = 1; // 0x1
+    field public static final int STATUS_SUGGESTION_APPROVAL_REJECTED_BY_USER = 3; // 0x3
+    field public static final int STATUS_SUGGESTION_APPROVAL_UNKNOWN = 0; // 0x0
     field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_ASSOCIATION = 1; // 0x1
     field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_AUTHENTICATION = 2; // 0x2
     field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_IP_PROVISIONING = 3; // 0x3
@@ -31848,6 +31892,7 @@
     method @Nullable public String getSsid();
     method public int getSubscriptionId();
     method public boolean isAppInteractionRequired();
+    method public boolean isCarrierMerged();
     method public boolean isCredentialSharedWithUser();
     method public boolean isEnhancedOpen();
     method public boolean isHiddenSsid();
@@ -31863,6 +31908,7 @@
     ctor public WifiNetworkSuggestion.Builder();
     method @NonNull public android.net.wifi.WifiNetworkSuggestion build();
     method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setBssid(@NonNull android.net.MacAddress);
+    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setCarrierMerged(boolean);
     method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setCredentialSharedWithUser(boolean);
     method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsAppInteractionRequired(boolean);
     method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsEnhancedMacRandomizationEnabled(boolean);
@@ -43126,10 +43172,11 @@
     method public String getKeystoreAlias();
     method public int getOrigin();
     method public int getPurposes();
+    method public int getSecurityLevel();
     method @NonNull public String[] getSignaturePaddings();
     method public int getUserAuthenticationType();
     method public int getUserAuthenticationValidityDurationSeconds();
-    method public boolean isInsideSecureHardware();
+    method @Deprecated public boolean isInsideSecureHardware();
     method public boolean isInvalidatedByBiometricEnrollment();
     method public boolean isTrustedUserPresenceRequired();
     method public boolean isUserAuthenticationRequired();
@@ -46131,6 +46178,8 @@
     field public static final String EXTRA_ANSWERING_DROPS_FG_CALL = "android.telecom.extra.ANSWERING_DROPS_FG_CALL";
     field public static final String EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME = "android.telecom.extra.ANSWERING_DROPS_FG_CALL_APP_NAME";
     field public static final String EXTRA_AUDIO_CODEC = "android.telecom.extra.AUDIO_CODEC";
+    field public static final String EXTRA_AUDIO_CODEC_BANDWIDTH_KHZ = "android.telecom.extra.AUDIO_CODEC_BANDWIDTH_KHZ";
+    field public static final String EXTRA_AUDIO_CODEC_BITRATE_KBPS = "android.telecom.extra.AUDIO_CODEC_BITRATE_KBPS";
     field public static final String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT";
     field public static final String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS";
     field public static final String EXTRA_IS_RTT_AUDIO_PRESENT = "android.telecom.extra.IS_RTT_AUDIO_PRESENT";
@@ -53847,16 +53896,17 @@
     field public int toolType;
   }
 
-  public interface OnReceiveContentCallback<T extends android.view.View> {
-    method public boolean onReceiveContent(@NonNull T, @NonNull android.view.OnReceiveContentCallback.Payload);
+  public interface OnReceiveContentListener {
+    method @Nullable public android.view.OnReceiveContentListener.Payload onReceiveContent(@NonNull android.view.View, @NonNull android.view.OnReceiveContentListener.Payload);
   }
 
-  public static final class OnReceiveContentCallback.Payload {
+  public static final class OnReceiveContentListener.Payload {
     method @NonNull public android.content.ClipData getClip();
     method @Nullable public android.os.Bundle getExtras();
     method public int getFlags();
     method @Nullable public android.net.Uri getLinkUri();
     method public int getSource();
+    method @NonNull public java.util.Map<java.lang.Boolean,android.view.OnReceiveContentListener.Payload> 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
@@ -53866,12 +53916,15 @@
     field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
   }
 
-  public static final class OnReceiveContentCallback.Payload.Builder {
-    ctor public OnReceiveContentCallback.Payload.Builder(@NonNull android.content.ClipData, int);
-    method @NonNull public android.view.OnReceiveContentCallback.Payload build();
-    method @NonNull public android.view.OnReceiveContentCallback.Payload.Builder setExtras(@Nullable android.os.Bundle);
-    method @NonNull public android.view.OnReceiveContentCallback.Payload.Builder setFlags(int);
-    method @NonNull public android.view.OnReceiveContentCallback.Payload.Builder setLinkUri(@Nullable android.net.Uri);
+  public static final class OnReceiveContentListener.Payload.Builder {
+    ctor public OnReceiveContentListener.Payload.Builder(@NonNull android.view.OnReceiveContentListener.Payload);
+    ctor public OnReceiveContentListener.Payload.Builder(@NonNull android.content.ClipData, int);
+    method @NonNull public android.view.OnReceiveContentListener.Payload build();
+    method @NonNull public android.view.OnReceiveContentListener.Payload.Builder setClip(@NonNull android.content.ClipData);
+    method @NonNull public android.view.OnReceiveContentListener.Payload.Builder setExtras(@Nullable android.os.Bundle);
+    method @NonNull public android.view.OnReceiveContentListener.Payload.Builder setFlags(int);
+    method @NonNull public android.view.OnReceiveContentListener.Payload.Builder setLinkUri(@Nullable android.net.Uri);
+    method @NonNull public android.view.OnReceiveContentListener.Payload.Builder setSource(int);
   }
 
   public abstract class OrientationEventListener {
@@ -54620,7 +54673,7 @@
     method public void onProvideContentCaptureStructure(@NonNull android.view.ViewStructure, int);
     method public void onProvideStructure(android.view.ViewStructure);
     method public void onProvideVirtualStructure(android.view.ViewStructure);
-    method public boolean onReceiveContent(@NonNull android.view.OnReceiveContentCallback.Payload);
+    method @Nullable public android.view.OnReceiveContentListener.Payload onReceiveContent(@NonNull android.view.OnReceiveContentListener.Payload);
     method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
     method @CallSuper protected void onRestoreInstanceState(android.os.Parcelable);
     method public void onRtlPropertiesChanged(int);
@@ -54778,7 +54831,7 @@
     method public void setOnHoverListener(android.view.View.OnHoverListener);
     method public void setOnKeyListener(android.view.View.OnKeyListener);
     method public void setOnLongClickListener(@Nullable android.view.View.OnLongClickListener);
-    method public void setOnReceiveContentCallback(@Nullable String[], @Nullable android.view.OnReceiveContentCallback);
+    method public void setOnReceiveContentListener(@Nullable String[], @Nullable android.view.OnReceiveContentListener);
     method public void setOnScrollChangeListener(android.view.View.OnScrollChangeListener);
     method @Deprecated public void setOnSystemUiVisibilityChangeListener(android.view.View.OnSystemUiVisibilityChangeListener);
     method public void setOnTouchListener(android.view.View.OnTouchListener);
@@ -61795,11 +61848,6 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.widget.TextView.SavedState> CREATOR;
   }
 
-  public class TextViewOnReceiveContentCallback implements android.view.OnReceiveContentCallback<android.widget.TextView> {
-    ctor public TextViewOnReceiveContentCallback();
-    method public boolean onReceiveContent(@NonNull android.widget.TextView, @NonNull android.view.OnReceiveContentCallback.Payload);
-  }
-
   public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
     method @Nullable public android.content.res.Resources.Theme getDropDownViewTheme();
     method public void setDropDownViewTheme(@Nullable android.content.res.Resources.Theme);
diff --git a/api/system-current.txt b/api/system-current.txt
deleted file mode 100644
index 0eaebce..0000000
--- a/api/system-current.txt
+++ /dev/null
@@ -1,13874 +0,0 @@
-// Signature format: 2.0
-package android {
-
-  public static final class Manifest.permission {
-    field public static final String ACCESS_AMBIENT_LIGHT_STATS = "android.permission.ACCESS_AMBIENT_LIGHT_STATS";
-    field public static final String ACCESS_BROADCAST_RADIO = "android.permission.ACCESS_BROADCAST_RADIO";
-    field public static final String ACCESS_CACHE_FILESYSTEM = "android.permission.ACCESS_CACHE_FILESYSTEM";
-    field public static final String ACCESS_CONTEXT_HUB = "android.permission.ACCESS_CONTEXT_HUB";
-    field public static final String ACCESS_DRM_CERTIFICATES = "android.permission.ACCESS_DRM_CERTIFICATES";
-    field @Deprecated public static final String ACCESS_FM_RADIO = "android.permission.ACCESS_FM_RADIO";
-    field public static final String ACCESS_INSTANT_APPS = "android.permission.ACCESS_INSTANT_APPS";
-    field public static final String ACCESS_LOCUS_ID_USAGE_STATS = "android.permission.ACCESS_LOCUS_ID_USAGE_STATS";
-    field public static final String ACCESS_MOCK_LOCATION = "android.permission.ACCESS_MOCK_LOCATION";
-    field public static final String ACCESS_MTP = "android.permission.ACCESS_MTP";
-    field public static final String ACCESS_NETWORK_CONDITIONS = "android.permission.ACCESS_NETWORK_CONDITIONS";
-    field public static final String ACCESS_NOTIFICATIONS = "android.permission.ACCESS_NOTIFICATIONS";
-    field public static final String ACCESS_SHARED_LIBRARIES = "android.permission.ACCESS_SHARED_LIBRARIES";
-    field public static final String ACCESS_SHORTCUTS = "android.permission.ACCESS_SHORTCUTS";
-    field public static final String ACCESS_SURFACE_FLINGER = "android.permission.ACCESS_SURFACE_FLINGER";
-    field public static final String ACCESS_TV_DESCRAMBLER = "android.permission.ACCESS_TV_DESCRAMBLER";
-    field public static final String ACCESS_TV_TUNER = "android.permission.ACCESS_TV_TUNER";
-    field public static final String ACCESS_VIBRATOR_STATE = "android.permission.ACCESS_VIBRATOR_STATE";
-    field public static final String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING";
-    field public static final String ADJUST_RUNTIME_PERMISSIONS_POLICY = "android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY";
-    field public static final String ALLOCATE_AGGRESSIVE = "android.permission.ALLOCATE_AGGRESSIVE";
-    field public static final String ALLOW_ANY_CODEC_FOR_PLAYBACK = "android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK";
-    field public static final String AMBIENT_WALLPAPER = "android.permission.AMBIENT_WALLPAPER";
-    field public static final String APPROVE_INCIDENT_REPORTS = "android.permission.APPROVE_INCIDENT_REPORTS";
-    field public static final String BACKUP = "android.permission.BACKUP";
-    field public static final String BIND_ATTENTION_SERVICE = "android.permission.BIND_ATTENTION_SERVICE";
-    field public static final String BIND_AUGMENTED_AUTOFILL_SERVICE = "android.permission.BIND_AUGMENTED_AUTOFILL_SERVICE";
-    field public static final String BIND_CELL_BROADCAST_SERVICE = "android.permission.BIND_CELL_BROADCAST_SERVICE";
-    field @Deprecated public static final String BIND_CONNECTION_SERVICE = "android.permission.BIND_CONNECTION_SERVICE";
-    field public static final String BIND_CONTENT_CAPTURE_SERVICE = "android.permission.BIND_CONTENT_CAPTURE_SERVICE";
-    field public static final String BIND_CONTENT_SUGGESTIONS_SERVICE = "android.permission.BIND_CONTENT_SUGGESTIONS_SERVICE";
-    field public static final String BIND_DIRECTORY_SEARCH = "android.permission.BIND_DIRECTORY_SEARCH";
-    field public static final String BIND_EUICC_SERVICE = "android.permission.BIND_EUICC_SERVICE";
-    field public static final String BIND_EXTERNAL_STORAGE_SERVICE = "android.permission.BIND_EXTERNAL_STORAGE_SERVICE";
-    field public static final String BIND_IMS_SERVICE = "android.permission.BIND_IMS_SERVICE";
-    field public static final String BIND_KEYGUARD_APPWIDGET = "android.permission.BIND_KEYGUARD_APPWIDGET";
-    field public static final String BIND_MUSIC_RECOGNITION_SERVICE = "android.permission.BIND_MUSIC_RECOGNITION_SERVICE";
-    field public static final String BIND_NETWORK_RECOMMENDATION_SERVICE = "android.permission.BIND_NETWORK_RECOMMENDATION_SERVICE";
-    field public static final String BIND_NOTIFICATION_ASSISTANT_SERVICE = "android.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE";
-    field public static final String BIND_PHONE_ACCOUNT_SUGGESTION_SERVICE = "android.permission.BIND_PHONE_ACCOUNT_SUGGESTION_SERVICE";
-    field public static final String BIND_PRINT_RECOMMENDATION_SERVICE = "android.permission.BIND_PRINT_RECOMMENDATION_SERVICE";
-    field public static final String BIND_RESOLVER_RANKER_SERVICE = "android.permission.BIND_RESOLVER_RANKER_SERVICE";
-    field public static final String BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE = "android.permission.BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE";
-    field public static final String BIND_SETTINGS_SUGGESTIONS_SERVICE = "android.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE";
-    field public static final String BIND_SOUND_TRIGGER_DETECTION_SERVICE = "android.permission.BIND_SOUND_TRIGGER_DETECTION_SERVICE";
-    field public static final String BIND_TELEPHONY_DATA_SERVICE = "android.permission.BIND_TELEPHONY_DATA_SERVICE";
-    field public static final String BIND_TELEPHONY_NETWORK_SERVICE = "android.permission.BIND_TELEPHONY_NETWORK_SERVICE";
-    field public static final String BIND_TEXTCLASSIFIER_SERVICE = "android.permission.BIND_TEXTCLASSIFIER_SERVICE";
-    field public static final String BIND_TRUST_AGENT = "android.permission.BIND_TRUST_AGENT";
-    field public static final String BIND_TV_REMOTE_SERVICE = "android.permission.BIND_TV_REMOTE_SERVICE";
-    field public static final String BRICK = "android.permission.BRICK";
-    field public static final String BRIGHTNESS_SLIDER_USAGE = "android.permission.BRIGHTNESS_SLIDER_USAGE";
-    field @Deprecated public static final String BROADCAST_NETWORK_PRIVILEGED = "android.permission.BROADCAST_NETWORK_PRIVILEGED";
-    field public static final String CAMERA_DISABLE_TRANSMIT_LED = "android.permission.CAMERA_DISABLE_TRANSMIT_LED";
-    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_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";
-    field public static final String CHANGE_DEVICE_IDLE_TEMP_WHITELIST = "android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST";
-    field public static final String CLEAR_APP_USER_DATA = "android.permission.CLEAR_APP_USER_DATA";
-    field public static final String COMPANION_APPROVE_WIFI_CONNECTIONS = "android.permission.COMPANION_APPROVE_WIFI_CONNECTIONS";
-    field public static final String CONFIGURE_DISPLAY_BRIGHTNESS = "android.permission.CONFIGURE_DISPLAY_BRIGHTNESS";
-    field public static final String CONFIGURE_WIFI_DISPLAY = "android.permission.CONFIGURE_WIFI_DISPLAY";
-    field @Deprecated public static final String CONNECTIVITY_INTERNAL = "android.permission.CONNECTIVITY_INTERNAL";
-    field public static final String CONNECTIVITY_USE_RESTRICTED_NETWORKS = "android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS";
-    field public static final String CONTROL_DEVICE_LIGHTS = "android.permission.CONTROL_DEVICE_LIGHTS";
-    field public static final String CONTROL_DISPLAY_COLOR_TRANSFORMS = "android.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS";
-    field public static final String CONTROL_DISPLAY_SATURATION = "android.permission.CONTROL_DISPLAY_SATURATION";
-    field public static final String CONTROL_INCALL_EXPERIENCE = "android.permission.CONTROL_INCALL_EXPERIENCE";
-    field public static final String CONTROL_KEYGUARD_SECURE_NOTIFICATIONS = "android.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS";
-    field public static final String CONTROL_VPN = "android.permission.CONTROL_VPN";
-    field public static final String CREATE_USERS = "android.permission.CREATE_USERS";
-    field public static final String CRYPT_KEEPER = "android.permission.CRYPT_KEEPER";
-    field public static final String DEVICE_POWER = "android.permission.DEVICE_POWER";
-    field public static final String DISPATCH_PROVISIONING_MESSAGE = "android.permission.DISPATCH_PROVISIONING_MESSAGE";
-    field public static final String ENTER_CAR_MODE_PRIORITIZED = "android.permission.ENTER_CAR_MODE_PRIORITIZED";
-    field public static final String EXEMPT_FROM_AUDIO_RECORD_RESTRICTIONS = "android.permission.EXEMPT_FROM_AUDIO_RECORD_RESTRICTIONS";
-    field public static final String FORCE_BACK = "android.permission.FORCE_BACK";
-    field public static final String FORCE_STOP_PACKAGES = "android.permission.FORCE_STOP_PACKAGES";
-    field public static final String GET_APP_OPS_STATS = "android.permission.GET_APP_OPS_STATS";
-    field public static final String GET_PROCESS_STATE_AND_OOM_SCORE = "android.permission.GET_PROCESS_STATE_AND_OOM_SCORE";
-    field public static final String GET_RUNTIME_PERMISSIONS = "android.permission.GET_RUNTIME_PERMISSIONS";
-    field public static final String GET_TOP_ACTIVITY_INFO = "android.permission.GET_TOP_ACTIVITY_INFO";
-    field @Deprecated public static final String GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS = "android.permission.GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS";
-    field public static final String GRANT_RUNTIME_PERMISSIONS = "android.permission.GRANT_RUNTIME_PERMISSIONS";
-    field public static final String GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS = "android.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS";
-    field public static final String HANDLE_CAR_MODE_CHANGES = "android.permission.HANDLE_CAR_MODE_CHANGES";
-    field public static final String HARDWARE_TEST = "android.permission.HARDWARE_TEST";
-    field public static final String HDMI_CEC = "android.permission.HDMI_CEC";
-    field public static final String HIDE_NON_SYSTEM_OVERLAY_WINDOWS = "android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS";
-    field public static final String INJECT_EVENTS = "android.permission.INJECT_EVENTS";
-    field public static final String INSTALL_DYNAMIC_SYSTEM = "android.permission.INSTALL_DYNAMIC_SYSTEM";
-    field public static final String INSTALL_GRANT_RUNTIME_PERMISSIONS = "android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS";
-    field public static final String INSTALL_LOCATION_TIME_ZONE_PROVIDER = "android.permission.INSTALL_LOCATION_TIME_ZONE_PROVIDER";
-    field public static final String INSTALL_PACKAGE_UPDATES = "android.permission.INSTALL_PACKAGE_UPDATES";
-    field public static final String INSTALL_SELF_UPDATES = "android.permission.INSTALL_SELF_UPDATES";
-    field public static final String INTENT_FILTER_VERIFICATION_AGENT = "android.permission.INTENT_FILTER_VERIFICATION_AGENT";
-    field public static final String INTERACT_ACROSS_USERS = "android.permission.INTERACT_ACROSS_USERS";
-    field public static final String INTERACT_ACROSS_USERS_FULL = "android.permission.INTERACT_ACROSS_USERS_FULL";
-    field public static final String INTERNAL_SYSTEM_WINDOW = "android.permission.INTERNAL_SYSTEM_WINDOW";
-    field public static final String INVOKE_CARRIER_SETUP = "android.permission.INVOKE_CARRIER_SETUP";
-    field public static final String KILL_UID = "android.permission.KILL_UID";
-    field public static final String LOCAL_MAC_ADDRESS = "android.permission.LOCAL_MAC_ADDRESS";
-    field public static final String LOCK_DEVICE = "android.permission.LOCK_DEVICE";
-    field public static final String LOOP_RADIO = "android.permission.LOOP_RADIO";
-    field public static final String MANAGE_ACCESSIBILITY = "android.permission.MANAGE_ACCESSIBILITY";
-    field @Deprecated public static final String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS";
-    field public static final String MANAGE_ACTIVITY_TASKS = "android.permission.MANAGE_ACTIVITY_TASKS";
-    field public static final String MANAGE_APP_OPS_RESTRICTIONS = "android.permission.MANAGE_APP_OPS_RESTRICTIONS";
-    field public static final String MANAGE_APP_PREDICTIONS = "android.permission.MANAGE_APP_PREDICTIONS";
-    field public static final String MANAGE_APP_TOKENS = "android.permission.MANAGE_APP_TOKENS";
-    field public static final String MANAGE_AUTO_FILL = "android.permission.MANAGE_AUTO_FILL";
-    field public static final String MANAGE_CARRIER_OEM_UNLOCK_STATE = "android.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE";
-    field public static final String MANAGE_CA_CERTIFICATES = "android.permission.MANAGE_CA_CERTIFICATES";
-    field public static final String MANAGE_CONTENT_CAPTURE = "android.permission.MANAGE_CONTENT_CAPTURE";
-    field public static final String MANAGE_CONTENT_SUGGESTIONS = "android.permission.MANAGE_CONTENT_SUGGESTIONS";
-    field public static final String MANAGE_DEBUGGING = "android.permission.MANAGE_DEBUGGING";
-    field public static final String MANAGE_FACTORY_RESET_PROTECTION = "android.permission.MANAGE_FACTORY_RESET_PROTECTION";
-    field public static final String MANAGE_IPSEC_TUNNELS = "android.permission.MANAGE_IPSEC_TUNNELS";
-    field public static final String MANAGE_MUSIC_RECOGNITION = "android.permission.MANAGE_MUSIC_RECOGNITION";
-    field public static final String MANAGE_NOTIFICATION_LISTENERS = "android.permission.MANAGE_NOTIFICATION_LISTENERS";
-    field public static final String MANAGE_ONE_TIME_PERMISSION_SESSIONS = "android.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS";
-    field public static final String MANAGE_ROLE_HOLDERS = "android.permission.MANAGE_ROLE_HOLDERS";
-    field public static final String MANAGE_ROLLBACKS = "android.permission.MANAGE_ROLLBACKS";
-    field public static final String MANAGE_SENSOR_PRIVACY = "android.permission.MANAGE_SENSOR_PRIVACY";
-    field public static final String MANAGE_SOUND_TRIGGER = "android.permission.MANAGE_SOUND_TRIGGER";
-    field public static final String MANAGE_SUBSCRIPTION_PLANS = "android.permission.MANAGE_SUBSCRIPTION_PLANS";
-    field public static final String MANAGE_TIME_AND_ZONE_DETECTION = "android.permission.MANAGE_TIME_AND_ZONE_DETECTION";
-    field public static final String MANAGE_USB = "android.permission.MANAGE_USB";
-    field public static final String MANAGE_USERS = "android.permission.MANAGE_USERS";
-    field public static final String MANAGE_USER_OEM_UNLOCK_STATE = "android.permission.MANAGE_USER_OEM_UNLOCK_STATE";
-    field public static final String MODIFY_APPWIDGET_BIND_PERMISSIONS = "android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS";
-    field public static final String MODIFY_AUDIO_ROUTING = "android.permission.MODIFY_AUDIO_ROUTING";
-    field public static final String MODIFY_CELL_BROADCASTS = "android.permission.MODIFY_CELL_BROADCASTS";
-    field public static final String MODIFY_DAY_NIGHT_MODE = "android.permission.MODIFY_DAY_NIGHT_MODE";
-    field @Deprecated public static final String MODIFY_NETWORK_ACCOUNTING = "android.permission.MODIFY_NETWORK_ACCOUNTING";
-    field public static final String MODIFY_PARENTAL_CONTROLS = "android.permission.MODIFY_PARENTAL_CONTROLS";
-    field public static final String MODIFY_QUIET_MODE = "android.permission.MODIFY_QUIET_MODE";
-    field public static final String MODIFY_SETTINGS_OVERRIDEABLE_BY_RESTORE = "android.permission.MODIFY_SETTINGS_OVERRIDEABLE_BY_RESTORE";
-    field public static final String MOVE_PACKAGE = "android.permission.MOVE_PACKAGE";
-    field public static final String NETWORK_AIRPLANE_MODE = "android.permission.NETWORK_AIRPLANE_MODE";
-    field public static final String NETWORK_CARRIER_PROVISIONING = "android.permission.NETWORK_CARRIER_PROVISIONING";
-    field public static final String NETWORK_FACTORY = "android.permission.NETWORK_FACTORY";
-    field public static final String NETWORK_MANAGED_PROVISIONING = "android.permission.NETWORK_MANAGED_PROVISIONING";
-    field public static final String NETWORK_SCAN = "android.permission.NETWORK_SCAN";
-    field public static final String NETWORK_SETTINGS = "android.permission.NETWORK_SETTINGS";
-    field public static final String NETWORK_SETUP_WIZARD = "android.permission.NETWORK_SETUP_WIZARD";
-    field public static final String NETWORK_SIGNAL_STRENGTH_WAKEUP = "android.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP";
-    field public static final String NETWORK_STACK = "android.permission.NETWORK_STACK";
-    field public static final String NETWORK_STATS_PROVIDER = "android.permission.NETWORK_STATS_PROVIDER";
-    field public static final String NOTIFICATION_DURING_SETUP = "android.permission.NOTIFICATION_DURING_SETUP";
-    field public static final String NOTIFY_TV_INPUTS = "android.permission.NOTIFY_TV_INPUTS";
-    field public static final String OBSERVE_APP_USAGE = "android.permission.OBSERVE_APP_USAGE";
-    field public static final String OBSERVE_NETWORK_POLICY = "android.permission.OBSERVE_NETWORK_POLICY";
-    field public static final String OBSERVE_ROLE_HOLDERS = "android.permission.OBSERVE_ROLE_HOLDERS";
-    field public static final String OPEN_ACCESSIBILITY_DETAILS_SETTINGS = "android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS";
-    field public static final String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG";
-    field public static final String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT";
-    field public static final String PACKET_KEEPALIVE_OFFLOAD = "android.permission.PACKET_KEEPALIVE_OFFLOAD";
-    field public static final String PEERS_MAC_ADDRESS = "android.permission.PEERS_MAC_ADDRESS";
-    field public static final String PERFORM_CDMA_PROVISIONING = "android.permission.PERFORM_CDMA_PROVISIONING";
-    field public static final String PERFORM_SIM_ACTIVATION = "android.permission.PERFORM_SIM_ACTIVATION";
-    field public static final String POWER_SAVER = "android.permission.POWER_SAVER";
-    field public static final String PROVIDE_RESOLVER_RANKER_SERVICE = "android.permission.PROVIDE_RESOLVER_RANKER_SERVICE";
-    field public static final String PROVIDE_TRUST_AGENT = "android.permission.PROVIDE_TRUST_AGENT";
-    field public static final String QUERY_TIME_ZONE_RULES = "android.permission.QUERY_TIME_ZONE_RULES";
-    field public static final String RADIO_SCAN_WITHOUT_LOCATION = "android.permission.RADIO_SCAN_WITHOUT_LOCATION";
-    field public static final String READ_ACTIVE_EMERGENCY_SESSION = "android.permission.READ_ACTIVE_EMERGENCY_SESSION";
-    field public static final String READ_CARRIER_APP_INFO = "android.permission.READ_CARRIER_APP_INFO";
-    field public static final String READ_CELL_BROADCASTS = "android.permission.READ_CELL_BROADCASTS";
-    field public static final String READ_CONTENT_RATING_SYSTEMS = "android.permission.READ_CONTENT_RATING_SYSTEMS";
-    field public static final String READ_DEVICE_CONFIG = "android.permission.READ_DEVICE_CONFIG";
-    field public static final String READ_DREAM_STATE = "android.permission.READ_DREAM_STATE";
-    field public static final String READ_INSTALL_SESSIONS = "android.permission.READ_INSTALL_SESSIONS";
-    field public static final String READ_NETWORK_USAGE_HISTORY = "android.permission.READ_NETWORK_USAGE_HISTORY";
-    field public static final String READ_OEM_UNLOCK_STATE = "android.permission.READ_OEM_UNLOCK_STATE";
-    field public static final String READ_PRINT_SERVICES = "android.permission.READ_PRINT_SERVICES";
-    field public static final String READ_PRINT_SERVICE_RECOMMENDATIONS = "android.permission.READ_PRINT_SERVICE_RECOMMENDATIONS";
-    field public static final String READ_PRIVILEGED_PHONE_STATE = "android.permission.READ_PRIVILEGED_PHONE_STATE";
-    field public static final String READ_PROJECTION_STATE = "android.permission.READ_PROJECTION_STATE";
-    field public static final String READ_RUNTIME_PROFILES = "android.permission.READ_RUNTIME_PROFILES";
-    field public static final String READ_SEARCH_INDEXABLES = "android.permission.READ_SEARCH_INDEXABLES";
-    field public static final String READ_SYSTEM_UPDATE_INFO = "android.permission.READ_SYSTEM_UPDATE_INFO";
-    field public static final String READ_WALLPAPER_INTERNAL = "android.permission.READ_WALLPAPER_INTERNAL";
-    field public static final String READ_WIFI_CREDENTIAL = "android.permission.READ_WIFI_CREDENTIAL";
-    field public static final String REAL_GET_TASKS = "android.permission.REAL_GET_TASKS";
-    field public static final String RECEIVE_DATA_ACTIVITY_CHANGE = "android.permission.RECEIVE_DATA_ACTIVITY_CHANGE";
-    field public static final String RECEIVE_DEVICE_CUSTOMIZATION_READY = "android.permission.RECEIVE_DEVICE_CUSTOMIZATION_READY";
-    field public static final String RECEIVE_EMERGENCY_BROADCAST = "android.permission.RECEIVE_EMERGENCY_BROADCAST";
-    field public static final String RECEIVE_WIFI_CREDENTIAL_CHANGE = "android.permission.RECEIVE_WIFI_CREDENTIAL_CHANGE";
-    field public static final String RECOVERY = "android.permission.RECOVERY";
-    field public static final String RECOVER_KEYSTORE = "android.permission.RECOVER_KEYSTORE";
-    field public static final String REGISTER_CALL_PROVIDER = "android.permission.REGISTER_CALL_PROVIDER";
-    field public static final String REGISTER_CONNECTION_MANAGER = "android.permission.REGISTER_CONNECTION_MANAGER";
-    field public static final String REGISTER_SIM_SUBSCRIPTION = "android.permission.REGISTER_SIM_SUBSCRIPTION";
-    field public static final String REGISTER_STATS_PULL_ATOM = "android.permission.REGISTER_STATS_PULL_ATOM";
-    field public static final String REMOTE_DISPLAY_PROVIDER = "android.permission.REMOTE_DISPLAY_PROVIDER";
-    field public static final String REMOVE_DRM_CERTIFICATES = "android.permission.REMOVE_DRM_CERTIFICATES";
-    field public static final String REMOVE_TASKS = "android.permission.REMOVE_TASKS";
-    field public static final String REQUEST_NETWORK_SCORES = "android.permission.REQUEST_NETWORK_SCORES";
-    field public static final String REQUEST_NOTIFICATION_ASSISTANT_SERVICE = "android.permission.REQUEST_NOTIFICATION_ASSISTANT_SERVICE";
-    field public static final String RESET_PASSWORD = "android.permission.RESET_PASSWORD";
-    field public static final String RESTORE_RUNTIME_PERMISSIONS = "android.permission.RESTORE_RUNTIME_PERMISSIONS";
-    field public static final String RESTRICTED_VR_ACCESS = "android.permission.RESTRICTED_VR_ACCESS";
-    field public static final String RETRIEVE_WINDOW_CONTENT = "android.permission.RETRIEVE_WINDOW_CONTENT";
-    field public static final String REVIEW_ACCESSIBILITY_SERVICES = "android.permission.REVIEW_ACCESSIBILITY_SERVICES";
-    field public static final String REVOKE_RUNTIME_PERMISSIONS = "android.permission.REVOKE_RUNTIME_PERMISSIONS";
-    field public static final String SCORE_NETWORKS = "android.permission.SCORE_NETWORKS";
-    field public static final String SECURE_ELEMENT_PRIVILEGED_OPERATION = "android.permission.SECURE_ELEMENT_PRIVILEGED_OPERATION";
-    field public static final String SEND_CATEGORY_CAR_NOTIFICATIONS = "android.permission.SEND_CATEGORY_CAR_NOTIFICATIONS";
-    field public static final String SEND_DEVICE_CUSTOMIZATION_READY = "android.permission.SEND_DEVICE_CUSTOMIZATION_READY";
-    field public static final String SEND_SHOW_SUSPENDED_APP_DETAILS = "android.permission.SEND_SHOW_SUSPENDED_APP_DETAILS";
-    field public static final String SEND_SMS_NO_CONFIRMATION = "android.permission.SEND_SMS_NO_CONFIRMATION";
-    field public static final String SERIAL_PORT = "android.permission.SERIAL_PORT";
-    field public static final String SET_ACTIVITY_WATCHER = "android.permission.SET_ACTIVITY_WATCHER";
-    field public static final String SET_HARMFUL_APP_WARNINGS = "android.permission.SET_HARMFUL_APP_WARNINGS";
-    field public static final String SET_MEDIA_KEY_LISTENER = "android.permission.SET_MEDIA_KEY_LISTENER";
-    field public static final String SET_ORIENTATION = "android.permission.SET_ORIENTATION";
-    field public static final String SET_POINTER_SPEED = "android.permission.SET_POINTER_SPEED";
-    field public static final String SET_SCREEN_COMPATIBILITY = "android.permission.SET_SCREEN_COMPATIBILITY";
-    field public static final String SET_VOLUME_KEY_LONG_PRESS_LISTENER = "android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER";
-    field public static final String SET_WALLPAPER_COMPONENT = "android.permission.SET_WALLPAPER_COMPONENT";
-    field public static final String SHOW_KEYGUARD_MESSAGE = "android.permission.SHOW_KEYGUARD_MESSAGE";
-    field public static final String SHUTDOWN = "android.permission.SHUTDOWN";
-    field public static final String START_ACTIVITIES_FROM_BACKGROUND = "android.permission.START_ACTIVITIES_FROM_BACKGROUND";
-    field public static final String STATUS_BAR_SERVICE = "android.permission.STATUS_BAR_SERVICE";
-    field public static final String STOP_APP_SWITCHES = "android.permission.STOP_APP_SWITCHES";
-    field public static final String SUBSTITUTE_NOTIFICATION_APP_NAME = "android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME";
-    field public static final String SUBSTITUTE_SHARE_TARGET_APP_NAME_AND_ICON = "android.permission.SUBSTITUTE_SHARE_TARGET_APP_NAME_AND_ICON";
-    field public static final String SUSPEND_APPS = "android.permission.SUSPEND_APPS";
-    field public static final String SYSTEM_CAMERA = "android.permission.SYSTEM_CAMERA";
-    field public static final String TETHER_PRIVILEGED = "android.permission.TETHER_PRIVILEGED";
-    field public static final String TOGGLE_AUTOMOTIVE_PROJECTION = "android.permission.TOGGLE_AUTOMOTIVE_PROJECTION";
-    field public static final String TV_INPUT_HARDWARE = "android.permission.TV_INPUT_HARDWARE";
-    field public static final String TV_VIRTUAL_REMOTE_CONTROLLER = "android.permission.TV_VIRTUAL_REMOTE_CONTROLLER";
-    field public static final String UNLIMITED_SHORTCUTS_API_CALLS = "android.permission.UNLIMITED_SHORTCUTS_API_CALLS";
-    field public static final String UPDATE_APP_OPS_STATS = "android.permission.UPDATE_APP_OPS_STATS";
-    field public static final String UPDATE_LOCK = "android.permission.UPDATE_LOCK";
-    field public static final String UPDATE_TIME_ZONE_RULES = "android.permission.UPDATE_TIME_ZONE_RULES";
-    field public static final String UPGRADE_RUNTIME_PERMISSIONS = "android.permission.UPGRADE_RUNTIME_PERMISSIONS";
-    field public static final String USER_ACTIVITY = "android.permission.USER_ACTIVITY";
-    field public static final String USE_RESERVED_DISK = "android.permission.USE_RESERVED_DISK";
-    field public static final String WHITELIST_AUTO_REVOKE_PERMISSIONS = "android.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS";
-    field public static final String WHITELIST_RESTRICTED_PERMISSIONS = "android.permission.WHITELIST_RESTRICTED_PERMISSIONS";
-    field public static final String WIFI_SET_DEVICE_MOBILITY_STATE = "android.permission.WIFI_SET_DEVICE_MOBILITY_STATE";
-    field public static final String WIFI_UPDATE_USABILITY_STATS_SCORE = "android.permission.WIFI_UPDATE_USABILITY_STATS_SCORE";
-    field public static final String WRITE_DEVICE_CONFIG = "android.permission.WRITE_DEVICE_CONFIG";
-    field public static final String WRITE_DREAM_STATE = "android.permission.WRITE_DREAM_STATE";
-    field public static final String WRITE_EMBEDDED_SUBSCRIPTIONS = "android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS";
-    field @Deprecated public static final String WRITE_MEDIA_STORAGE = "android.permission.WRITE_MEDIA_STORAGE";
-    field public static final String WRITE_OBB = "android.permission.WRITE_OBB";
-  }
-
-  public static final class Manifest.permission_group {
-    field public static final String UNDEFINED = "android.permission-group.UNDEFINED";
-  }
-
-  public static final class R.array {
-    field public static final int config_keySystemUuidMapping = 17235973; // 0x1070005
-  }
-
-  public static final class R.attr {
-    field public static final int allowClearUserDataOnFailedRestore = 16844288; // 0x1010600
-    field public static final int isVrOnly = 16844152; // 0x1010578
-    field public static final int minExtensionVersion = 16844305; // 0x1010611
-    field public static final int requiredSystemPropertyName = 16844133; // 0x1010565
-    field public static final int requiredSystemPropertyValue = 16844134; // 0x1010566
-    field public static final int sdkVersion = 16844304; // 0x1010610
-    field public static final int supportsAmbientMode = 16844173; // 0x101058d
-    field public static final int userRestriction = 16844164; // 0x1010584
-  }
-
-  public static final class R.bool {
-    field public static final int config_sendPackageName = 17891328; // 0x1110000
-    field public static final int config_showDefaultAssistant = 17891329; // 0x1110001
-    field public static final int config_showDefaultEmergency = 17891330; // 0x1110002
-    field public static final int config_showDefaultHome = 17891331; // 0x1110003
-  }
-
-  public static final class R.color {
-    field public static final int system_notification_accent_color = 17170460; // 0x106001c
-  }
-
-  public static final class R.dimen {
-    field public static final int config_restrictedIconSize = 17104903; // 0x1050007
-  }
-
-  public static final class R.drawable {
-    field public static final int ic_info = 17301684; // 0x10800b4
-  }
-
-  public static final class R.raw {
-    field public static final int loaderror = 17825792; // 0x1100000
-    field public static final int nodomain = 17825793; // 0x1100001
-  }
-
-  public static final class R.string {
-    field public static final int config_defaultAssistant = 17039393; // 0x1040021
-    field public static final int config_defaultBrowser = 17039394; // 0x1040022
-    field public static final int config_defaultCallRedirection = 17039397; // 0x1040025
-    field public static final int config_defaultCallScreening = 17039398; // 0x1040026
-    field public static final int config_defaultDialer = 17039395; // 0x1040023
-    field public static final int config_defaultSms = 17039396; // 0x1040024
-    field public static final int config_feedbackIntentExtraKey = 17039391; // 0x104001f
-    field public static final int config_feedbackIntentNameKey = 17039392; // 0x1040020
-    field public static final int config_helpIntentExtraKey = 17039389; // 0x104001d
-    field public static final int config_helpIntentNameKey = 17039390; // 0x104001e
-    field public static final int config_helpPackageNameKey = 17039387; // 0x104001b
-    field public static final int config_helpPackageNameValue = 17039388; // 0x104001c
-    field public static final int config_systemAutomotiveCluster = 17039400; // 0x1040028
-    field public static final int config_systemAutomotiveProjection = 17039402; // 0x104002a
-    field public static final int config_systemGallery = 17039399; // 0x1040027
-    field public static final int config_systemVideoCall = 17039401; // 0x1040029
-  }
-
-  public static final class R.style {
-    field public static final int Theme_DeviceDefault_DocumentsUI = 16974562; // 0x10302e2
-    field public static final int Theme_Leanback_FormWizard = 16974544; // 0x10302d0
-  }
-
-}
-
-package android.accounts {
-
-  public class AccountManager {
-    method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public android.accounts.AccountManagerFuture<android.os.Bundle> finishSessionAsUser(android.os.Bundle, android.app.Activity, android.os.UserHandle, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
-  }
-
-}
-
-package android.app {
-
-  public class Activity extends android.view.ContextThemeWrapper implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback android.view.LayoutInflater.Factory2 android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
-    method public void convertFromTranslucent();
-    method public boolean convertToTranslucent(android.app.Activity.TranslucentConversionListener, android.app.ActivityOptions);
-    method @Deprecated public boolean isBackgroundVisibleBehind();
-    method @Deprecated public void onBackgroundVisibleBehindChanged(boolean);
-  }
-
-  public static interface Activity.TranslucentConversionListener {
-    method public void onTranslucentConversionComplete(boolean);
-  }
-
-  public class ActivityManager {
-    method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int);
-    method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void forceStopPackage(String);
-    method @RequiresPermission(anyOf={"android.permission.INTERACT_ACROSS_USERS", "android.permission.INTERACT_ACROSS_USERS_FULL"}) public static int getCurrentUser();
-    method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getPackageImportance(String);
-    method @NonNull public java.util.Collection<java.util.Locale> getSupportedLocales();
-    method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidImportance(int);
-    method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void killProcessesWhenImperceptible(@NonNull int[], @NonNull String);
-    method @RequiresPermission(android.Manifest.permission.KILL_UID) public void killUid(int, String);
-    method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
-    method public void setDeviceLocales(@NonNull android.os.LocaleList);
-    method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public static void setPersistentVrThread(int);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean switchUser(@NonNull android.os.UserHandle);
-  }
-
-  public static interface ActivityManager.OnUidImportanceListener {
-    method public void onUidImportance(int, int);
-  }
-
-  public class AlarmManager {
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void set(int, long, long, long, android.app.PendingIntent, android.os.WorkSource);
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void set(int, long, long, long, android.app.AlarmManager.OnAlarmListener, android.os.Handler, android.os.WorkSource);
-  }
-
-  public class AppOpsManager {
-    method @Nullable @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public android.app.RuntimeAppOpAccessMessage collectRuntimeAppOpAccessMessage();
-    method @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public void getHistoricalOps(@NonNull android.app.AppOpsManager.HistoricalOpsRequest, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.AppOpsManager.HistoricalOps>);
-    method public static String[] getOpStrs();
-    method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.app.AppOpsManager.PackageOps> getOpsForPackage(int, @NonNull String, @Nullable java.lang.String...);
-    method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.app.AppOpsManager.PackageOps> getPackagesForOps(@Nullable String[]);
-    method public static int opToDefaultMode(@NonNull String);
-    method @Nullable public static String opToPermission(@NonNull String);
-    method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setMode(@NonNull String, int, @Nullable String, int);
-    method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setUidMode(@NonNull String, int, int);
-    field public static final String OPSTR_ACCEPT_HANDOVER = "android:accept_handover";
-    field public static final String OPSTR_ACCESS_ACCESSIBILITY = "android:access_accessibility";
-    field public static final String OPSTR_ACCESS_NOTIFICATIONS = "android:access_notifications";
-    field public static final String OPSTR_ACTIVATE_PLATFORM_VPN = "android:activate_platform_vpn";
-    field public static final String OPSTR_ACTIVATE_VPN = "android:activate_vpn";
-    field public static final String OPSTR_ASSIST_SCREENSHOT = "android:assist_screenshot";
-    field public static final String OPSTR_ASSIST_STRUCTURE = "android:assist_structure";
-    field public static final String OPSTR_AUDIO_ACCESSIBILITY_VOLUME = "android:audio_accessibility_volume";
-    field public static final String OPSTR_AUDIO_ALARM_VOLUME = "android:audio_alarm_volume";
-    field public static final String OPSTR_AUDIO_BLUETOOTH_VOLUME = "android:audio_bluetooth_volume";
-    field public static final String OPSTR_AUDIO_MASTER_VOLUME = "android:audio_master_volume";
-    field public static final String OPSTR_AUDIO_MEDIA_VOLUME = "android:audio_media_volume";
-    field public static final String OPSTR_AUDIO_NOTIFICATION_VOLUME = "android:audio_notification_volume";
-    field public static final String OPSTR_AUDIO_RING_VOLUME = "android:audio_ring_volume";
-    field public static final String OPSTR_AUDIO_VOICE_VOLUME = "android:audio_voice_volume";
-    field public static final String OPSTR_AUTO_REVOKE_MANAGED_BY_INSTALLER = "android:auto_revoke_managed_by_installer";
-    field public static final String OPSTR_AUTO_REVOKE_PERMISSIONS_IF_UNUSED = "android:auto_revoke_permissions_if_unused";
-    field public static final String OPSTR_BIND_ACCESSIBILITY_SERVICE = "android:bind_accessibility_service";
-    field public static final String OPSTR_CHANGE_WIFI_STATE = "android:change_wifi_state";
-    field public static final String OPSTR_GET_ACCOUNTS = "android:get_accounts";
-    field public static final String OPSTR_GPS = "android:gps";
-    field public static final String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground";
-    field public static final String OPSTR_INTERACT_ACROSS_PROFILES = "android:interact_across_profiles";
-    field public static final String OPSTR_LEGACY_STORAGE = "android:legacy_storage";
-    field public static final String OPSTR_LOADER_USAGE_STATS = "android:loader_usage_stats";
-    field public static final String OPSTR_MANAGE_EXTERNAL_STORAGE = "android:manage_external_storage";
-    field public static final String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels";
-    field public static final String OPSTR_MANAGE_ONGOING_CALLS = "android:manage_ongoing_calls";
-    field public static final String OPSTR_MUTE_MICROPHONE = "android:mute_microphone";
-    field public static final String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells";
-    field public static final String OPSTR_PLAY_AUDIO = "android:play_audio";
-    field public static final String OPSTR_POST_NOTIFICATION = "android:post_notification";
-    field public static final String OPSTR_PROJECT_MEDIA = "android:project_media";
-    field public static final String OPSTR_READ_CLIPBOARD = "android:read_clipboard";
-    field public static final String OPSTR_READ_ICC_SMS = "android:read_icc_sms";
-    field public static final String OPSTR_READ_MEDIA_AUDIO = "android:read_media_audio";
-    field public static final String OPSTR_READ_MEDIA_IMAGES = "android:read_media_images";
-    field public static final String OPSTR_READ_MEDIA_VIDEO = "android:read_media_video";
-    field public static final String OPSTR_RECEIVE_EMERGENCY_BROADCAST = "android:receive_emergency_broadcast";
-    field public static final String OPSTR_REQUEST_DELETE_PACKAGES = "android:request_delete_packages";
-    field public static final String OPSTR_REQUEST_INSTALL_PACKAGES = "android:request_install_packages";
-    field public static final String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background";
-    field public static final String OPSTR_RUN_IN_BACKGROUND = "android:run_in_background";
-    field public static final String OPSTR_START_FOREGROUND = "android:start_foreground";
-    field public static final String OPSTR_TAKE_AUDIO_FOCUS = "android:take_audio_focus";
-    field public static final String OPSTR_TAKE_MEDIA_BUTTONS = "android:take_media_buttons";
-    field public static final String OPSTR_TOAST_WINDOW = "android:toast_window";
-    field public static final String OPSTR_TURN_SCREEN_ON = "android:turn_screen_on";
-    field public static final String OPSTR_VIBRATE = "android:vibrate";
-    field public static final String OPSTR_WAKE_LOCK = "android:wake_lock";
-    field public static final String OPSTR_WIFI_SCAN = "android:wifi_scan";
-    field public static final String OPSTR_WRITE_CLIPBOARD = "android:write_clipboard";
-    field public static final String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms";
-    field public static final String OPSTR_WRITE_MEDIA_AUDIO = "android:write_media_audio";
-    field public static final String OPSTR_WRITE_MEDIA_IMAGES = "android:write_media_images";
-    field public static final String OPSTR_WRITE_MEDIA_VIDEO = "android:write_media_video";
-    field public static final String OPSTR_WRITE_SMS = "android:write_sms";
-    field public static final String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper";
-    field public static final int OP_FLAGS_ALL = 31; // 0x1f
-    field public static final int OP_FLAGS_ALL_TRUSTED = 13; // 0xd
-    field public static final int OP_FLAG_SELF = 1; // 0x1
-    field public static final int OP_FLAG_TRUSTED_PROXIED = 8; // 0x8
-    field public static final int OP_FLAG_TRUSTED_PROXY = 2; // 0x2
-    field public static final int OP_FLAG_UNTRUSTED_PROXIED = 16; // 0x10
-    field public static final int OP_FLAG_UNTRUSTED_PROXY = 4; // 0x4
-    field public static final int UID_STATE_BACKGROUND = 600; // 0x258
-    field public static final int UID_STATE_CACHED = 700; // 0x2bc
-    field public static final int UID_STATE_FOREGROUND = 500; // 0x1f4
-    field public static final int UID_STATE_FOREGROUND_SERVICE = 400; // 0x190
-    field @Deprecated public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; // 0x12c
-    field public static final int UID_STATE_PERSISTENT = 100; // 0x64
-    field public static final int UID_STATE_TOP = 200; // 0xc8
-  }
-
-  public static final class AppOpsManager.AttributedHistoricalOps implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public android.app.AppOpsManager.HistoricalOp getOp(@NonNull String);
-    method @NonNull public android.app.AppOpsManager.HistoricalOp getOpAt(@IntRange(from=0) int);
-    method @IntRange(from=0) public int getOpCount();
-    method @Nullable public String getTag();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.AttributedHistoricalOps> CREATOR;
-  }
-
-  public static final class AppOpsManager.AttributedOpEntry implements android.os.Parcelable {
-    method public int describeContents();
-    method public long getLastAccessBackgroundTime(int);
-    method public long getLastAccessForegroundTime(int);
-    method public long getLastAccessTime(int);
-    method public long getLastAccessTime(int, int, int);
-    method public long getLastBackgroundDuration(int);
-    method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastBackgroundProxyInfo(int);
-    method public long getLastDuration(int);
-    method public long getLastDuration(int, int, int);
-    method public long getLastForegroundDuration(int);
-    method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastForegroundProxyInfo(int);
-    method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastProxyInfo(int);
-    method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastProxyInfo(int, int, int);
-    method public long getLastRejectBackgroundTime(int);
-    method public long getLastRejectForegroundTime(int);
-    method public long getLastRejectTime(int);
-    method public long getLastRejectTime(int, int, int);
-    method public boolean isRunning();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.AttributedOpEntry> CREATOR;
-  }
-
-  public static final class AppOpsManager.HistoricalOp implements android.os.Parcelable {
-    method public int describeContents();
-    method public long getAccessCount(int, int, int);
-    method public long getAccessDuration(int, int, int);
-    method public long getBackgroundAccessCount(int);
-    method public long getBackgroundAccessDuration(int);
-    method public long getBackgroundRejectCount(int);
-    method public long getForegroundAccessCount(int);
-    method public long getForegroundAccessDuration(int);
-    method public long getForegroundRejectCount(int);
-    method @NonNull public String getOpName();
-    method public long getRejectCount(int, int, int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOp> CREATOR;
-  }
-
-  public static final class AppOpsManager.HistoricalOps implements android.os.Parcelable {
-    method public int describeContents();
-    method public long getBeginTimeMillis();
-    method public long getEndTimeMillis();
-    method @IntRange(from=0) public int getUidCount();
-    method @Nullable public android.app.AppOpsManager.HistoricalUidOps getUidOps(int);
-    method @NonNull public android.app.AppOpsManager.HistoricalUidOps getUidOpsAt(@IntRange(from=0) int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOps> CREATOR;
-  }
-
-  public static final class AppOpsManager.HistoricalOpsRequest {
-  }
-
-  public static final class AppOpsManager.HistoricalOpsRequest.Builder {
-    ctor public AppOpsManager.HistoricalOpsRequest.Builder(long, long);
-    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest build();
-    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setAttributionTag(@Nullable String);
-    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setFlags(int);
-    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setOpNames(@Nullable java.util.List<java.lang.String>);
-    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setPackageName(@Nullable String);
-    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setUid(int);
-  }
-
-  public static final class AppOpsManager.HistoricalPackageOps implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public android.app.AppOpsManager.AttributedHistoricalOps getAttributedOps(@NonNull String);
-    method @NonNull public android.app.AppOpsManager.AttributedHistoricalOps getAttributedOpsAt(@IntRange(from=0) int);
-    method @IntRange(from=0) public int getAttributedOpsCount();
-    method @Nullable public android.app.AppOpsManager.HistoricalOp getOp(@NonNull String);
-    method @NonNull public android.app.AppOpsManager.HistoricalOp getOpAt(@IntRange(from=0) int);
-    method @IntRange(from=0) public int getOpCount();
-    method @NonNull public String getPackageName();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalPackageOps> CREATOR;
-  }
-
-  public static final class AppOpsManager.HistoricalUidOps implements android.os.Parcelable {
-    method public int describeContents();
-    method @IntRange(from=0) public int getPackageCount();
-    method @Nullable public android.app.AppOpsManager.HistoricalPackageOps getPackageOps(@NonNull String);
-    method @NonNull public android.app.AppOpsManager.HistoricalPackageOps getPackageOpsAt(@IntRange(from=0) int);
-    method public int getUid();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalUidOps> CREATOR;
-  }
-
-  public static final class AppOpsManager.OpEntry implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public java.util.Map<java.lang.String,android.app.AppOpsManager.AttributedOpEntry> getAttributedOpEntries();
-    method @Deprecated public long getDuration();
-    method public long getLastAccessBackgroundTime(int);
-    method public long getLastAccessForegroundTime(int);
-    method public long getLastAccessTime(int);
-    method public long getLastAccessTime(int, int, int);
-    method public long getLastBackgroundDuration(int);
-    method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastBackgroundProxyInfo(int);
-    method public long getLastDuration(int);
-    method public long getLastDuration(int, int, int);
-    method public long getLastForegroundDuration(int);
-    method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastForegroundProxyInfo(int);
-    method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastProxyInfo(int);
-    method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastProxyInfo(int, int, int);
-    method public long getLastRejectBackgroundTime(int);
-    method public long getLastRejectForegroundTime(int);
-    method public long getLastRejectTime(int);
-    method public long getLastRejectTime(int, int, int);
-    method public int getMode();
-    method @NonNull public String getOpStr();
-    method @Deprecated @Nullable public String getProxyPackageName();
-    method @Deprecated @Nullable public String getProxyPackageName(int, int);
-    method @Deprecated public int getProxyUid();
-    method @Deprecated public int getProxyUid(int, int);
-    method public boolean isRunning();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.OpEntry> CREATOR;
-  }
-
-  public static final class AppOpsManager.OpEventProxyInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public String getAttributionTag();
-    method @Nullable public String getPackageName();
-    method @IntRange(from=0) public int getUid();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.OpEventProxyInfo> CREATOR;
-  }
-
-  public static final class AppOpsManager.PackageOps implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public java.util.List<android.app.AppOpsManager.OpEntry> getOps();
-    method @NonNull public String getPackageName();
-    method public int getUid();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.PackageOps> CREATOR;
-  }
-
-  public class BroadcastOptions {
-    method public static android.app.BroadcastOptions makeBasic();
-    method @RequiresPermission(android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND) public void setBackgroundActivityStartsAllowed(boolean);
-    method public void setDontSendToRestrictedApps(boolean);
-    method @RequiresPermission(android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST) public void setTemporaryAppWhitelistDuration(long);
-    method public android.os.Bundle toBundle();
-  }
-
-  public class DownloadManager {
-    method @RequiresPermission(android.Manifest.permission.WRITE_MEDIA_STORAGE) public void onMediaStoreDownloadsDeleted(@NonNull android.util.LongSparseArray<java.lang.String>);
-    field public static final String ACTION_DOWNLOAD_COMPLETED = "android.intent.action.DOWNLOAD_COMPLETED";
-  }
-
-  public abstract class InstantAppResolverService extends android.app.Service {
-    ctor public InstantAppResolverService();
-    method public final void attachBaseContext(android.content.Context);
-    method public final android.os.IBinder onBind(android.content.Intent);
-    method @Deprecated public void onGetInstantAppIntentFilter(@Nullable int[], @NonNull String, @NonNull android.app.InstantAppResolverService.InstantAppResolutionCallback);
-    method @Deprecated public void onGetInstantAppIntentFilter(@NonNull android.content.Intent, @Nullable int[], @NonNull String, @NonNull android.app.InstantAppResolverService.InstantAppResolutionCallback);
-    method @Deprecated public void onGetInstantAppIntentFilter(@NonNull android.content.Intent, @Nullable int[], @NonNull android.os.UserHandle, @NonNull String, @NonNull android.app.InstantAppResolverService.InstantAppResolutionCallback);
-    method @MainThread public void onGetInstantAppIntentFilter(@NonNull android.content.pm.InstantAppRequestInfo, @NonNull android.app.InstantAppResolverService.InstantAppResolutionCallback);
-    method @Deprecated public void onGetInstantAppResolveInfo(@Nullable int[], @NonNull String, @NonNull android.app.InstantAppResolverService.InstantAppResolutionCallback);
-    method @Deprecated public void onGetInstantAppResolveInfo(@NonNull android.content.Intent, @Nullable int[], @NonNull String, @NonNull android.app.InstantAppResolverService.InstantAppResolutionCallback);
-    method @Deprecated public void onGetInstantAppResolveInfo(@NonNull android.content.Intent, @Nullable int[], @NonNull android.os.UserHandle, @NonNull String, @NonNull android.app.InstantAppResolverService.InstantAppResolutionCallback);
-    method @MainThread public void onGetInstantAppResolveInfo(@NonNull android.content.pm.InstantAppRequestInfo, @NonNull android.app.InstantAppResolverService.InstantAppResolutionCallback);
-  }
-
-  public static final class InstantAppResolverService.InstantAppResolutionCallback {
-    method public void onInstantAppResolveInfo(java.util.List<android.content.pm.InstantAppResolveInfo>);
-  }
-
-  public class KeyguardManager {
-    method public android.content.Intent createConfirmFactoryResetCredentialIntent(CharSequence, CharSequence, CharSequence);
-    method @RequiresPermission("android.permission.SET_INITIAL_LOCK") public int getMinLockLength(boolean, int);
-    method @RequiresPermission(android.Manifest.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS) public boolean getPrivateNotificationsAllowed();
-    method @RequiresPermission("android.permission.SET_INITIAL_LOCK") public boolean isValidLockPasswordComplexity(int, @NonNull byte[], int);
-    method @RequiresPermission(android.Manifest.permission.SHOW_KEYGUARD_MESSAGE) public void requestDismissKeyguard(@NonNull android.app.Activity, @Nullable CharSequence, @Nullable android.app.KeyguardManager.KeyguardDismissCallback);
-    method @RequiresPermission("android.permission.SET_INITIAL_LOCK") public boolean setLock(int, @NonNull byte[], int);
-    method @RequiresPermission(android.Manifest.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS) public void setPrivateNotificationsAllowed(boolean);
-  }
-
-  public class Notification implements android.os.Parcelable {
-    field public static final String CATEGORY_CAR_EMERGENCY = "car_emergency";
-    field public static final String CATEGORY_CAR_INFORMATION = "car_information";
-    field public static final String CATEGORY_CAR_WARNING = "car_warning";
-    field @RequiresPermission(android.Manifest.permission.NOTIFICATION_DURING_SETUP) public static final String EXTRA_ALLOW_DURING_SETUP = "android.allowDuringSetup";
-    field @RequiresPermission(android.Manifest.permission.SUBSTITUTE_NOTIFICATION_APP_NAME) public static final String EXTRA_SUBSTITUTE_APP_NAME = "android.substName";
-    field public static final int FLAG_AUTOGROUP_SUMMARY = 1024; // 0x400
-  }
-
-  public static final class Notification.TvExtender implements android.app.Notification.Extender {
-    ctor public Notification.TvExtender();
-    ctor public Notification.TvExtender(android.app.Notification);
-    method public android.app.Notification.Builder extend(android.app.Notification.Builder);
-    method public String getChannelId();
-    method public android.app.PendingIntent getContentIntent();
-    method public android.app.PendingIntent getDeleteIntent();
-    method public boolean getSuppressShowOverApps();
-    method public boolean isAvailableOnTv();
-    method public android.app.Notification.TvExtender setChannel(String);
-    method public android.app.Notification.TvExtender setChannelId(String);
-    method public android.app.Notification.TvExtender setContentIntent(android.app.PendingIntent);
-    method public android.app.Notification.TvExtender setDeleteIntent(android.app.PendingIntent);
-    method public android.app.Notification.TvExtender setSuppressShowOverApps(boolean);
-  }
-
-  public final class NotificationChannel implements android.os.Parcelable {
-    method public int getUserLockedFields();
-    method public boolean isDeleted();
-    method public void populateFromXml(org.xmlpull.v1.XmlPullParser);
-    method public void setBlockable(boolean);
-    method public org.json.JSONObject toJson() throws org.json.JSONException;
-    method public void writeXml(org.xmlpull.v1.XmlSerializer) throws java.io.IOException;
-    field public static final int USER_LOCKED_SOUND = 32; // 0x20
-  }
-
-  public final class NotificationChannelGroup implements android.os.Parcelable {
-    method public org.json.JSONObject toJson() throws org.json.JSONException;
-  }
-
-  public class NotificationManager {
-    method @NonNull public java.util.List<java.lang.String> getAllowedAssistantAdjustments();
-    method @Nullable public android.content.ComponentName getAllowedNotificationAssistant();
-    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_NOTIFICATION_LISTENERS) public java.util.List<android.content.ComponentName> getEnabledNotificationListeners();
-    method public boolean isNotificationAssistantAccessGranted(@NonNull android.content.ComponentName);
-    method public void setNotificationAssistantAccessGranted(@Nullable android.content.ComponentName, boolean);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_NOTIFICATION_LISTENERS) public void setNotificationListenerAccessGranted(@NonNull android.content.ComponentName, boolean, boolean);
-    field @RequiresPermission(android.Manifest.permission.STATUS_BAR_SERVICE) public static final String ACTION_CLOSE_NOTIFICATION_HANDLER_PANEL = "android.app.action.CLOSE_NOTIFICATION_HANDLER_PANEL";
-    field @RequiresPermission(android.Manifest.permission.STATUS_BAR_SERVICE) public static final String ACTION_OPEN_NOTIFICATION_HANDLER_PANEL = "android.app.action.OPEN_NOTIFICATION_HANDLER_PANEL";
-    field @RequiresPermission(android.Manifest.permission.STATUS_BAR_SERVICE) public static final String ACTION_TOGGLE_NOTIFICATION_HANDLER_PANEL = "android.app.action.TOGGLE_NOTIFICATION_HANDLER_PANEL";
-  }
-
-  public final class RuntimeAppOpAccessMessage implements android.os.Parcelable {
-    ctor public RuntimeAppOpAccessMessage(@IntRange(from=0L) int, @IntRange(from=0L) int, @NonNull String, @Nullable String, @NonNull String, int);
-    method public int describeContents();
-    method @Nullable public String getAttributionTag();
-    method @NonNull public String getMessage();
-    method @NonNull public String getOp();
-    method @NonNull public String getPackageName();
-    method public int getSamplingStrategy();
-    method @IntRange(from=0L) public int getUid();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.RuntimeAppOpAccessMessage> CREATOR;
-  }
-
-  public class SearchManager implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
-    method public void launchAssist(@Nullable android.os.Bundle);
-  }
-
-  public final class StatsManager {
-    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void addConfig(long, byte[]) throws android.app.StatsManager.StatsUnavailableException;
-    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean addConfiguration(long, byte[]);
-    method @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void clearPullAtomCallback(int);
-    method @Deprecated @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getData(long);
-    method @Deprecated @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getMetadata();
-    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] getRegisteredExperimentIds() throws android.app.StatsManager.StatsUnavailableException;
-    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getReports(long) throws android.app.StatsManager.StatsUnavailableException;
-    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getStatsMetadata() throws android.app.StatsManager.StatsUnavailableException;
-    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void removeConfig(long) throws android.app.StatsManager.StatsUnavailableException;
-    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean removeConfiguration(long);
-    method @NonNull @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] setActiveConfigsChangedOperation(@Nullable android.app.PendingIntent) throws android.app.StatsManager.StatsUnavailableException;
-    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setBroadcastSubscriber(android.app.PendingIntent, long, long) throws android.app.StatsManager.StatsUnavailableException;
-    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
-    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setDataFetchOperation(long, android.app.PendingIntent);
-    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setFetchReportsOperation(android.app.PendingIntent, long) throws android.app.StatsManager.StatsUnavailableException;
-    method @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void setPullAtomCallback(int, @Nullable android.app.StatsManager.PullAtomMetadata, @NonNull java.util.concurrent.Executor, @NonNull android.app.StatsManager.StatsPullAtomCallback);
-    field public static final String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED";
-    field public static final String EXTRA_STATS_ACTIVE_CONFIG_KEYS = "android.app.extra.STATS_ACTIVE_CONFIG_KEYS";
-    field public static final String EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES = "android.app.extra.STATS_BROADCAST_SUBSCRIBER_COOKIES";
-    field public static final String EXTRA_STATS_CONFIG_KEY = "android.app.extra.STATS_CONFIG_KEY";
-    field public static final String EXTRA_STATS_CONFIG_UID = "android.app.extra.STATS_CONFIG_UID";
-    field public static final String EXTRA_STATS_DIMENSIONS_VALUE = "android.app.extra.STATS_DIMENSIONS_VALUE";
-    field public static final String EXTRA_STATS_SUBSCRIPTION_ID = "android.app.extra.STATS_SUBSCRIPTION_ID";
-    field public static final String EXTRA_STATS_SUBSCRIPTION_RULE_ID = "android.app.extra.STATS_SUBSCRIPTION_RULE_ID";
-    field public static final int PULL_SKIP = 1; // 0x1
-    field public static final int PULL_SUCCESS = 0; // 0x0
-  }
-
-  public static class StatsManager.PullAtomMetadata {
-    method @Nullable public int[] getAdditiveFields();
-    method public long getCoolDownMillis();
-    method public long getTimeoutMillis();
-  }
-
-  public static class StatsManager.PullAtomMetadata.Builder {
-    ctor public StatsManager.PullAtomMetadata.Builder();
-    method @NonNull public android.app.StatsManager.PullAtomMetadata build();
-    method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setAdditiveFields(@NonNull int[]);
-    method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setCoolDownMillis(long);
-    method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setTimeoutMillis(long);
-  }
-
-  public static interface StatsManager.StatsPullAtomCallback {
-    method public int onPullAtom(int, @NonNull java.util.List<android.util.StatsEvent>);
-  }
-
-  public static class StatsManager.StatsUnavailableException extends android.util.AndroidException {
-    ctor public StatsManager.StatsUnavailableException(String);
-    ctor public StatsManager.StatsUnavailableException(String, Throwable);
-  }
-
-  public class StatusBarManager {
-    method @NonNull @RequiresPermission(android.Manifest.permission.STATUS_BAR) public android.app.StatusBarManager.DisableInfo getDisableInfo();
-    method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSetup(boolean);
-  }
-
-  public static final class StatusBarManager.DisableInfo {
-    method public boolean areAllComponentsEnabled();
-    method public boolean isNavigateToHomeDisabled();
-    method public boolean isNotificationPeekingDisabled();
-    method public boolean isRecentsDisabled();
-    method public boolean isSearchDisabled();
-    method public boolean isStatusBarExpansionDisabled();
-  }
-
-  public final class SystemServiceRegistry {
-    method public static <TServiceClass> void registerContextAwareService(@NonNull String, @NonNull Class<TServiceClass>, @NonNull android.app.SystemServiceRegistry.ContextAwareServiceProducerWithBinder<TServiceClass>);
-    method public static <TServiceClass> void registerContextAwareService(@NonNull String, @NonNull Class<TServiceClass>, @NonNull android.app.SystemServiceRegistry.ContextAwareServiceProducerWithoutBinder<TServiceClass>);
-    method public static <TServiceClass> void registerStaticService(@NonNull String, @NonNull Class<TServiceClass>, @NonNull android.app.SystemServiceRegistry.StaticServiceProducerWithBinder<TServiceClass>);
-    method public static <TServiceClass> void registerStaticService(@NonNull String, @NonNull Class<TServiceClass>, @NonNull android.app.SystemServiceRegistry.StaticServiceProducerWithoutBinder<TServiceClass>);
-  }
-
-  public static interface SystemServiceRegistry.ContextAwareServiceProducerWithBinder<TServiceClass> {
-    method @NonNull public TServiceClass createService(@NonNull android.content.Context, @NonNull android.os.IBinder);
-  }
-
-  public static interface SystemServiceRegistry.ContextAwareServiceProducerWithoutBinder<TServiceClass> {
-    method @NonNull public TServiceClass createService(@NonNull android.content.Context);
-  }
-
-  public static interface SystemServiceRegistry.StaticServiceProducerWithBinder<TServiceClass> {
-    method @NonNull public TServiceClass createService(@NonNull android.os.IBinder);
-  }
-
-  public static interface SystemServiceRegistry.StaticServiceProducerWithoutBinder<TServiceClass> {
-    method @NonNull public TServiceClass createService();
-  }
-
-  public class UiModeManager {
-    method @RequiresPermission(android.Manifest.permission.READ_PROJECTION_STATE) public void addOnProjectionStateChangeListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.app.UiModeManager.OnProjectionStateChangeListener);
-    method @RequiresPermission(android.Manifest.permission.ENTER_CAR_MODE_PRIORITIZED) public void enableCarMode(@IntRange(from=0) int, int);
-    method @RequiresPermission(android.Manifest.permission.READ_PROJECTION_STATE) public int getActiveProjectionTypes();
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PROJECTION_STATE) public java.util.Set<java.lang.String> getProjectingPackages(int);
-    method @RequiresPermission(value=android.Manifest.permission.TOGGLE_AUTOMOTIVE_PROJECTION, conditional=true) public boolean releaseProjection(int);
-    method @RequiresPermission(android.Manifest.permission.READ_PROJECTION_STATE) public void removeOnProjectionStateChangeListener(@NonNull android.app.UiModeManager.OnProjectionStateChangeListener);
-    method @RequiresPermission(value=android.Manifest.permission.TOGGLE_AUTOMOTIVE_PROJECTION, conditional=true) public boolean requestProjection(int);
-    field public static final String ACTION_ENTER_CAR_MODE_PRIORITIZED = "android.app.action.ENTER_CAR_MODE_PRIORITIZED";
-    field public static final String ACTION_EXIT_CAR_MODE_PRIORITIZED = "android.app.action.EXIT_CAR_MODE_PRIORITIZED";
-    field public static final int DEFAULT_PRIORITY = 0; // 0x0
-    field public static final String EXTRA_CALLING_PACKAGE = "android.app.extra.CALLING_PACKAGE";
-    field public static final String EXTRA_PRIORITY = "android.app.extra.PRIORITY";
-    field public static final int PROJECTION_TYPE_ALL = 65535; // 0xffff
-    field public static final int PROJECTION_TYPE_AUTOMOTIVE = 1; // 0x1
-    field public static final int PROJECTION_TYPE_NONE = 0; // 0x0
-  }
-
-  public static interface UiModeManager.OnProjectionStateChangeListener {
-    method public void onProjectionStateChanged(int, @NonNull java.util.Set<java.lang.String>);
-  }
-
-  public final class Vr2dDisplayProperties implements android.os.Parcelable {
-    ctor public Vr2dDisplayProperties(int, int, int);
-    method public int describeContents();
-    method public void dump(@NonNull java.io.PrintWriter, @NonNull String);
-    method public int getAddedFlags();
-    method public int getDpi();
-    method public int getHeight();
-    method public int getRemovedFlags();
-    method public int getWidth();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.Vr2dDisplayProperties> CREATOR;
-    field public static final int FLAG_VIRTUAL_DISPLAY_ENABLED = 1; // 0x1
-  }
-
-  public static final class Vr2dDisplayProperties.Builder {
-    ctor public Vr2dDisplayProperties.Builder();
-    method @NonNull public android.app.Vr2dDisplayProperties.Builder addFlags(int);
-    method @NonNull public android.app.Vr2dDisplayProperties build();
-    method @NonNull public android.app.Vr2dDisplayProperties.Builder removeFlags(int);
-    method @NonNull public android.app.Vr2dDisplayProperties.Builder setDimensions(int, int, int);
-    method @NonNull public android.app.Vr2dDisplayProperties.Builder setEnabled(boolean);
-  }
-
-  public class VrManager {
-    method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public int getVr2dDisplayId();
-    method @RequiresPermission(anyOf={android.Manifest.permission.RESTRICTED_VR_ACCESS, "android.permission.ACCESS_VR_STATE"}) public boolean isPersistentVrModeEnabled();
-    method @RequiresPermission(anyOf={android.Manifest.permission.RESTRICTED_VR_ACCESS, "android.permission.ACCESS_VR_STATE"}) public boolean isVrModeEnabled();
-    method @RequiresPermission(anyOf={android.Manifest.permission.RESTRICTED_VR_ACCESS, "android.permission.ACCESS_VR_STATE"}) public void registerVrStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.app.VrStateCallback);
-    method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public void setAndBindVrCompositor(android.content.ComponentName);
-    method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public void setPersistentVrModeEnabled(boolean);
-    method @RequiresPermission("android.permission.ACCESS_VR_MANAGER") public void setStandbyEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public void setVr2dDisplayProperties(@NonNull android.app.Vr2dDisplayProperties);
-    method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public void setVrInputMethod(@Nullable android.content.ComponentName);
-    method @RequiresPermission(anyOf={android.Manifest.permission.RESTRICTED_VR_ACCESS, "android.permission.ACCESS_VR_STATE"}) public void unregisterVrStateCallback(@NonNull android.app.VrStateCallback);
-  }
-
-  public abstract class VrStateCallback {
-    ctor public VrStateCallback();
-    method public void onPersistentVrStateChanged(boolean);
-    method public void onVrStateChanged(boolean);
-  }
-
-  public final class WallpaperColors implements android.os.Parcelable {
-    ctor public WallpaperColors(@NonNull android.graphics.Color, @Nullable android.graphics.Color, @Nullable android.graphics.Color, int);
-    method public int getColorHints();
-    field public static final int HINT_SUPPORTS_DARK_TEXT = 1; // 0x1
-    field public static final int HINT_SUPPORTS_DARK_THEME = 2; // 0x2
-  }
-
-  public final class WallpaperInfo implements android.os.Parcelable {
-    method public boolean supportsAmbientMode();
-  }
-
-  public class WallpaperManager {
-    method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public void clearWallpaper(int, int);
-    method public void setDisplayOffset(android.os.IBinder, int, int);
-    method @RequiresPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT) public boolean setWallpaperComponent(android.content.ComponentName);
-  }
-
-}
-
-package android.app.admin {
-
-  public class DevicePolicyKeyguardService extends android.app.Service {
-    ctor public DevicePolicyKeyguardService();
-    method @Nullable public void dismiss();
-    method @Nullable public final android.os.IBinder onBind(@Nullable android.content.Intent);
-    method @Nullable public android.view.SurfaceControlViewHost.SurfacePackage onCreateKeyguardSurface(@NonNull android.os.IBinder);
-  }
-
-  public class DevicePolicyManager {
-    method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public boolean getBluetoothContactSharingDisabled(@NonNull android.os.UserHandle);
-    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public String getDeviceOwner();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public android.content.ComponentName getDeviceOwnerComponentOnAnyUser();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public String getDeviceOwnerNameOnAnyUser();
-    method @Nullable public CharSequence getDeviceOwnerOrganizationName();
-    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public android.os.UserHandle getDeviceOwnerUser();
-    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public java.util.List<java.lang.String> getPermittedAccessibilityServices(int);
-    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public java.util.List<java.lang.String> getPermittedInputMethodsForCurrentUser();
-    method @Nullable public android.content.ComponentName getProfileOwner() throws java.lang.IllegalArgumentException;
-    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public String getProfileOwnerNameAsUser(int) throws java.lang.IllegalArgumentException;
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public int getUserProvisioningState();
-    method public boolean isDeviceManaged();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isDeviceProvisioned();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isDeviceProvisioningConfigApplied();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isManagedKiosk();
-    method public boolean isSecondaryLockscreenEnabled(@NonNull android.os.UserHandle);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isUnattendedManagedKiosk();
-    method @RequiresPermission("android.permission.NOTIFY_PENDING_SYSTEM_UPDATE") public void notifyPendingSystemUpdate(long);
-    method @RequiresPermission("android.permission.NOTIFY_PENDING_SYSTEM_UPDATE") public void notifyPendingSystemUpdate(long, boolean);
-    method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public boolean packageHasActiveAdmins(String);
-    method @Deprecated @RequiresPermission("android.permission.MANAGE_DEVICE_ADMINS") public boolean setActiveProfileOwner(@NonNull android.content.ComponentName, String) throws java.lang.IllegalArgumentException;
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setDeviceProvisioningConfigApplied();
-    method @Deprecated @RequiresPermission(value=android.Manifest.permission.GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS, conditional=true) public void setProfileOwnerCanAccessDeviceIds(@NonNull android.content.ComponentName);
-    method public void setSecondaryLockscreenEnabled(@NonNull android.content.ComponentName, boolean);
-    field public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED";
-    field public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED";
-    field public static final String ACTION_BIND_SECONDARY_LOCKSCREEN_SERVICE = "android.app.action.BIND_SECONDARY_LOCKSCREEN_SERVICE";
-    field public static final String ACTION_PROVISION_FINALIZATION = "android.app.action.PROVISION_FINALIZATION";
-    field public static final String ACTION_PROVISION_FINANCED_DEVICE = "android.app.action.PROVISION_FINANCED_DEVICE";
-    field public static final String ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE = "android.app.action.PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE";
-    field @RequiresPermission(android.Manifest.permission.MANAGE_FACTORY_RESET_PROTECTION) public static final String ACTION_RESET_PROTECTION_POLICY_CHANGED = "android.app.action.RESET_PROTECTION_POLICY_CHANGED";
-    field public static final String ACTION_SET_PROFILE_OWNER = "android.app.action.SET_PROFILE_OWNER";
-    field public static final String ACTION_STATE_USER_SETUP_COMPLETE = "android.app.action.STATE_USER_SETUP_COMPLETE";
-    field public static final String EXTRA_PROFILE_OWNER_NAME = "android.app.extra.PROFILE_OWNER_NAME";
-    field public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_ICON_URI = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_ICON_URI";
-    field public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL";
-    field public static final String EXTRA_PROVISIONING_ORGANIZATION_NAME = "android.app.extra.PROVISIONING_ORGANIZATION_NAME";
-    field public static final String EXTRA_PROVISIONING_SUPPORT_URL = "android.app.extra.PROVISIONING_SUPPORT_URL";
-    field public static final String EXTRA_PROVISIONING_TRIGGER = "android.app.extra.PROVISIONING_TRIGGER";
-    field public static final String EXTRA_RESTRICTION = "android.app.extra.RESTRICTION";
-    field public static final int PROVISIONING_TRIGGER_CLOUD_ENROLLMENT = 1; // 0x1
-    field public static final int PROVISIONING_TRIGGER_PERSISTENT_DEVICE_OWNER = 3; // 0x3
-    field public static final int PROVISIONING_TRIGGER_QR_CODE = 2; // 0x2
-    field public static final int PROVISIONING_TRIGGER_UNSPECIFIED = 0; // 0x0
-    field public static final int STATE_USER_PROFILE_COMPLETE = 4; // 0x4
-    field public static final int STATE_USER_PROFILE_FINALIZED = 5; // 0x5
-    field public static final int STATE_USER_SETUP_COMPLETE = 2; // 0x2
-    field public static final int STATE_USER_SETUP_FINALIZED = 3; // 0x3
-    field public static final int STATE_USER_SETUP_INCOMPLETE = 1; // 0x1
-    field public static final int STATE_USER_UNMANAGED = 0; // 0x0
-  }
-
-  public final class SystemUpdatePolicy implements android.os.Parcelable {
-    method public android.app.admin.SystemUpdatePolicy.InstallationOption getInstallationOptionAt(long);
-    field public static final int TYPE_PAUSE = 4; // 0x4
-  }
-
-  public static class SystemUpdatePolicy.InstallationOption {
-    method public long getEffectiveTime();
-    method public int getType();
-  }
-
-}
-
-package android.app.appsearch {
-
-  public class AppSearchManagerFrameworkInitializer {
-    method public static void initialize();
-  }
-
-}
-
-package android.app.assist {
-
-  public static class AssistStructure.ViewNode {
-    ctor public AssistStructure.ViewNode();
-  }
-
-}
-
-package android.app.backup {
-
-  public class BackupDataInput {
-    ctor public BackupDataInput(java.io.FileDescriptor);
-  }
-
-  public class BackupDataOutput {
-    ctor public BackupDataOutput(java.io.FileDescriptor);
-    ctor public BackupDataOutput(java.io.FileDescriptor, long);
-  }
-
-  public class BackupManager {
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public void backupNow();
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public android.app.backup.RestoreSession beginRestoreSession();
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public void cancelBackups();
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public void excludeKeysFromRestore(@NonNull String, @NonNull java.util.List<java.lang.String>);
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public long getAvailableRestoreToken(String);
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public android.content.Intent getConfigurationIntent(String);
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public String getCurrentTransport();
-    method @Nullable @RequiresPermission(android.Manifest.permission.BACKUP) public android.content.ComponentName getCurrentTransportComponent();
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public android.content.Intent getDataManagementIntent(String);
-    method @Nullable @RequiresPermission(android.Manifest.permission.BACKUP) public CharSequence getDataManagementIntentLabel(@NonNull String);
-    method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.BACKUP) public String getDataManagementLabel(@NonNull String);
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public String getDestinationString(String);
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isAppEligibleForBackup(String);
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isBackupEnabled();
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isBackupServiceActive(android.os.UserHandle);
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public String[] listAllTransports();
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public int requestBackup(String[], android.app.backup.BackupObserver);
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public int requestBackup(String[], android.app.backup.BackupObserver, android.app.backup.BackupManagerMonitor, int);
-    method @Deprecated public int requestRestore(android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.BACKUP) public String selectBackupTransport(String);
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public void selectBackupTransport(android.content.ComponentName, android.app.backup.SelectBackupTransportCallback);
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public void setAncestralSerialNumber(long);
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public void setAutoRestore(boolean);
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public void setBackupEnabled(boolean);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.BACKUP) public void updateTransportAttributes(@NonNull android.content.ComponentName, @NonNull String, @Nullable android.content.Intent, @NonNull String, @Nullable android.content.Intent, @Nullable String);
-    method @RequiresPermission(android.Manifest.permission.BACKUP) public void updateTransportAttributes(@NonNull android.content.ComponentName, @NonNull String, @Nullable android.content.Intent, @NonNull String, @Nullable android.content.Intent, @Nullable CharSequence);
-    field public static final int ERROR_AGENT_FAILURE = -1003; // 0xfffffc15
-    field public static final int ERROR_BACKUP_CANCELLED = -2003; // 0xfffff82d
-    field public static final int ERROR_BACKUP_NOT_ALLOWED = -2001; // 0xfffff82f
-    field public static final int ERROR_PACKAGE_NOT_FOUND = -2002; // 0xfffff82e
-    field public static final int ERROR_TRANSPORT_ABORTED = -1000; // 0xfffffc18
-    field public static final int ERROR_TRANSPORT_INVALID = -2; // 0xfffffffe
-    field public static final int ERROR_TRANSPORT_PACKAGE_REJECTED = -1002; // 0xfffffc16
-    field public static final int ERROR_TRANSPORT_QUOTA_EXCEEDED = -1005; // 0xfffffc13
-    field public static final int ERROR_TRANSPORT_UNAVAILABLE = -1; // 0xffffffff
-    field public static final int FLAG_NON_INCREMENTAL_BACKUP = 1; // 0x1
-    field public static final String PACKAGE_MANAGER_SENTINEL = "@pm@";
-    field public static final int SUCCESS = 0; // 0x0
-  }
-
-  public class BackupManagerMonitor {
-    ctor public BackupManagerMonitor();
-    method public void onEvent(android.os.Bundle);
-    field public static final String EXTRA_LOG_CANCEL_ALL = "android.app.backup.extra.LOG_CANCEL_ALL";
-    field public static final String EXTRA_LOG_EVENT_CATEGORY = "android.app.backup.extra.LOG_EVENT_CATEGORY";
-    field public static final String EXTRA_LOG_EVENT_ID = "android.app.backup.extra.LOG_EVENT_ID";
-    field public static final String EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION = "android.app.backup.extra.LOG_EVENT_PACKAGE_FULL_VERSION";
-    field public static final String EXTRA_LOG_EVENT_PACKAGE_NAME = "android.app.backup.extra.LOG_EVENT_PACKAGE_NAME";
-    field @Deprecated public static final String EXTRA_LOG_EVENT_PACKAGE_VERSION = "android.app.backup.extra.LOG_EVENT_PACKAGE_VERSION";
-    field public static final String EXTRA_LOG_EXCEPTION_FULL_BACKUP = "android.app.backup.extra.LOG_EXCEPTION_FULL_BACKUP";
-    field public static final String EXTRA_LOG_ILLEGAL_KEY = "android.app.backup.extra.LOG_ILLEGAL_KEY";
-    field public static final String EXTRA_LOG_MANIFEST_PACKAGE_NAME = "android.app.backup.extra.LOG_MANIFEST_PACKAGE_NAME";
-    field public static final String EXTRA_LOG_OLD_VERSION = "android.app.backup.extra.LOG_OLD_VERSION";
-    field public static final String EXTRA_LOG_POLICY_ALLOW_APKS = "android.app.backup.extra.LOG_POLICY_ALLOW_APKS";
-    field public static final String EXTRA_LOG_PREFLIGHT_ERROR = "android.app.backup.extra.LOG_PREFLIGHT_ERROR";
-    field public static final String EXTRA_LOG_RESTORE_ANYWAY = "android.app.backup.extra.LOG_RESTORE_ANYWAY";
-    field public static final String EXTRA_LOG_RESTORE_VERSION = "android.app.backup.extra.LOG_RESTORE_VERSION";
-    field public static final String EXTRA_LOG_WIDGET_PACKAGE_NAME = "android.app.backup.extra.LOG_WIDGET_PACKAGE_NAME";
-    field public static final int LOG_EVENT_CATEGORY_AGENT = 2; // 0x2
-    field public static final int LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY = 3; // 0x3
-    field public static final int LOG_EVENT_CATEGORY_TRANSPORT = 1; // 0x1
-    field public static final int LOG_EVENT_ID_APK_NOT_INSTALLED = 40; // 0x28
-    field public static final int LOG_EVENT_ID_APP_HAS_NO_AGENT = 28; // 0x1c
-    field public static final int LOG_EVENT_ID_BACKUP_DISABLED = 13; // 0xd
-    field public static final int LOG_EVENT_ID_CANNOT_RESTORE_WITHOUT_APK = 41; // 0x29
-    field public static final int LOG_EVENT_ID_CANT_FIND_AGENT = 30; // 0x1e
-    field public static final int LOG_EVENT_ID_CORRUPT_MANIFEST = 46; // 0x2e
-    field public static final int LOG_EVENT_ID_DEVICE_NOT_PROVISIONED = 14; // 0xe
-    field public static final int LOG_EVENT_ID_ERROR_PREFLIGHT = 16; // 0x10
-    field public static final int LOG_EVENT_ID_EXCEPTION_FULL_BACKUP = 19; // 0x13
-    field public static final int LOG_EVENT_ID_EXPECTED_DIFFERENT_PACKAGE = 43; // 0x2b
-    field public static final int LOG_EVENT_ID_FULL_BACKUP_CANCEL = 4; // 0x4
-    field public static final int LOG_EVENT_ID_FULL_RESTORE_ALLOW_BACKUP_FALSE = 39; // 0x27
-    field public static final int LOG_EVENT_ID_FULL_RESTORE_SIGNATURE_MISMATCH = 37; // 0x25
-    field public static final int LOG_EVENT_ID_FULL_RESTORE_TIMEOUT = 45; // 0x2d
-    field public static final int LOG_EVENT_ID_ILLEGAL_KEY = 5; // 0x5
-    field public static final int LOG_EVENT_ID_KEY_VALUE_BACKUP_CANCEL = 21; // 0x15
-    field public static final int LOG_EVENT_ID_KEY_VALUE_RESTORE_TIMEOUT = 31; // 0x1f
-    field public static final int LOG_EVENT_ID_LOST_TRANSPORT = 25; // 0x19
-    field public static final int LOG_EVENT_ID_MISSING_SIGNATURE = 42; // 0x2a
-    field public static final int LOG_EVENT_ID_NO_DATA_TO_SEND = 7; // 0x7
-    field public static final int LOG_EVENT_ID_NO_PACKAGES = 49; // 0x31
-    field public static final int LOG_EVENT_ID_NO_PM_METADATA_RECEIVED = 23; // 0x17
-    field public static final int LOG_EVENT_ID_NO_RESTORE_METADATA_AVAILABLE = 22; // 0x16
-    field public static final int LOG_EVENT_ID_PACKAGE_INELIGIBLE = 9; // 0x9
-    field public static final int LOG_EVENT_ID_PACKAGE_KEY_VALUE_PARTICIPANT = 10; // 0xa
-    field public static final int LOG_EVENT_ID_PACKAGE_NOT_FOUND = 12; // 0xc
-    field public static final int LOG_EVENT_ID_PACKAGE_NOT_PRESENT = 26; // 0x1a
-    field public static final int LOG_EVENT_ID_PACKAGE_STOPPED = 11; // 0xb
-    field public static final int LOG_EVENT_ID_PACKAGE_TRANSPORT_NOT_PRESENT = 15; // 0xf
-    field public static final int LOG_EVENT_ID_PM_AGENT_HAS_NO_METADATA = 24; // 0x18
-    field public static final int LOG_EVENT_ID_QUOTA_HIT_PREFLIGHT = 18; // 0x12
-    field public static final int LOG_EVENT_ID_RESTORE_ANY_VERSION = 34; // 0x22
-    field public static final int LOG_EVENT_ID_RESTORE_VERSION_HIGHER = 27; // 0x1b
-    field public static final int LOG_EVENT_ID_SIGNATURE_MISMATCH = 29; // 0x1d
-    field public static final int LOG_EVENT_ID_SYSTEM_APP_NO_AGENT = 38; // 0x26
-    field public static final int LOG_EVENT_ID_TRANSPORT_IS_NULL = 50; // 0x32
-    field public static final int LOG_EVENT_ID_TRANSPORT_NON_INCREMENTAL_BACKUP_REQUIRED = 51; // 0x33
-    field public static final int LOG_EVENT_ID_UNKNOWN_VERSION = 44; // 0x2c
-    field public static final int LOG_EVENT_ID_VERSIONS_MATCH = 35; // 0x23
-    field public static final int LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER = 36; // 0x24
-    field public static final int LOG_EVENT_ID_WIDGET_METADATA_MISMATCH = 47; // 0x2f
-    field public static final int LOG_EVENT_ID_WIDGET_UNKNOWN_VERSION = 48; // 0x30
-  }
-
-  public abstract class BackupObserver {
-    ctor public BackupObserver();
-    method public void backupFinished(int);
-    method public void onResult(String, int);
-    method public void onUpdate(String, android.app.backup.BackupProgress);
-  }
-
-  public class BackupProgress implements android.os.Parcelable {
-    ctor public BackupProgress(long, long);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.backup.BackupProgress> CREATOR;
-    field public final long bytesExpected;
-    field public final long bytesTransferred;
-  }
-
-  public class BackupTransport {
-    ctor public BackupTransport();
-    method public int abortFullRestore();
-    method public void cancelFullBackup();
-    method public int checkFullBackupSize(long);
-    method public int clearBackupData(android.content.pm.PackageInfo);
-    method public android.content.Intent configurationIntent();
-    method public String currentDestinationString();
-    method public android.content.Intent dataManagementIntent();
-    method @Nullable public CharSequence dataManagementIntentLabel();
-    method @Deprecated @Nullable public String dataManagementLabel();
-    method public int finishBackup();
-    method public void finishRestore();
-    method public android.app.backup.RestoreSet[] getAvailableRestoreSets();
-    method public long getBackupQuota(String, boolean);
-    method public android.os.IBinder getBinder();
-    method public long getCurrentRestoreSet();
-    method public int getNextFullRestoreDataChunk(android.os.ParcelFileDescriptor);
-    method public int getRestoreData(android.os.ParcelFileDescriptor);
-    method public int getTransportFlags();
-    method public int initializeDevice();
-    method public boolean isAppEligibleForBackup(android.content.pm.PackageInfo, boolean);
-    method public String name();
-    method public android.app.backup.RestoreDescription nextRestorePackage();
-    method public int performBackup(android.content.pm.PackageInfo, android.os.ParcelFileDescriptor, int);
-    method public int performBackup(android.content.pm.PackageInfo, android.os.ParcelFileDescriptor);
-    method public int performFullBackup(android.content.pm.PackageInfo, android.os.ParcelFileDescriptor, int);
-    method public int performFullBackup(android.content.pm.PackageInfo, android.os.ParcelFileDescriptor);
-    method public long requestBackupTime();
-    method public long requestFullBackupTime();
-    method public int sendBackupData(int);
-    method public int startRestore(long, android.content.pm.PackageInfo[]);
-    method public String transportDirName();
-    field public static final int AGENT_ERROR = -1003; // 0xfffffc15
-    field public static final int AGENT_UNKNOWN = -1004; // 0xfffffc14
-    field public static final String EXTRA_TRANSPORT_REGISTRATION = "android.app.backup.extra.TRANSPORT_REGISTRATION";
-    field public static final int FLAG_DATA_NOT_CHANGED = 8; // 0x8
-    field public static final int FLAG_INCREMENTAL = 2; // 0x2
-    field public static final int FLAG_NON_INCREMENTAL = 4; // 0x4
-    field public static final int FLAG_USER_INITIATED = 1; // 0x1
-    field public static final int NO_MORE_DATA = -1; // 0xffffffff
-    field public static final int TRANSPORT_ERROR = -1000; // 0xfffffc18
-    field public static final int TRANSPORT_NON_INCREMENTAL_BACKUP_REQUIRED = -1006; // 0xfffffc12
-    field public static final int TRANSPORT_NOT_INITIALIZED = -1001; // 0xfffffc17
-    field public static final int TRANSPORT_OK = 0; // 0x0
-    field public static final int TRANSPORT_PACKAGE_REJECTED = -1002; // 0xfffffc16
-    field public static final int TRANSPORT_QUOTA_EXCEEDED = -1005; // 0xfffffc13
-  }
-
-  public class RestoreDescription implements android.os.Parcelable {
-    ctor public RestoreDescription(String, int);
-    method public int describeContents();
-    method public int getDataType();
-    method public String getPackageName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.backup.RestoreDescription> CREATOR;
-    field public static final android.app.backup.RestoreDescription NO_MORE_PACKAGES;
-    field public static final int TYPE_FULL_STREAM = 2; // 0x2
-    field public static final int TYPE_KEY_VALUE = 1; // 0x1
-  }
-
-  public abstract class RestoreObserver {
-    method public void restoreSetsAvailable(android.app.backup.RestoreSet[]);
-  }
-
-  public class RestoreSession {
-    method public void endRestoreSession();
-    method public int getAvailableRestoreSets(android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor);
-    method public int getAvailableRestoreSets(android.app.backup.RestoreObserver);
-    method public int restoreAll(long, android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor);
-    method public int restoreAll(long, android.app.backup.RestoreObserver);
-    method public int restorePackage(String, android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor);
-    method public int restorePackage(String, android.app.backup.RestoreObserver);
-    method public int restorePackages(long, @Nullable android.app.backup.RestoreObserver, @NonNull java.util.Set<java.lang.String>, @Nullable android.app.backup.BackupManagerMonitor);
-    method public int restorePackages(long, @Nullable android.app.backup.RestoreObserver, @NonNull java.util.Set<java.lang.String>);
-  }
-
-  public class RestoreSet implements android.os.Parcelable {
-    ctor public RestoreSet();
-    ctor public RestoreSet(String, String, long);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.backup.RestoreSet> CREATOR;
-    field public String device;
-    field public String name;
-    field public long token;
-  }
-
-  public abstract class SelectBackupTransportCallback {
-    ctor public SelectBackupTransportCallback();
-    method public void onFailure(int);
-    method public void onSuccess(String);
-  }
-
-}
-
-package android.app.compat {
-
-  public final class CompatChanges {
-    method public static boolean isChangeEnabled(long);
-    method @RequiresPermission(allOf={"android.permission.READ_COMPAT_CHANGE_CONFIG", "android.permission.LOG_COMPAT_CHANGE"}) public static boolean isChangeEnabled(long, @NonNull String, @NonNull android.os.UserHandle);
-    method @RequiresPermission(allOf={"android.permission.READ_COMPAT_CHANGE_CONFIG", "android.permission.LOG_COMPAT_CHANGE"}) public static boolean isChangeEnabled(long, int);
-  }
-
-}
-
-package android.app.contentsuggestions {
-
-  public final class ClassificationsRequest implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.os.Bundle getExtras();
-    method @NonNull public java.util.List<android.app.contentsuggestions.ContentSelection> getSelections();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.contentsuggestions.ClassificationsRequest> CREATOR;
-  }
-
-  public static final class ClassificationsRequest.Builder {
-    ctor public ClassificationsRequest.Builder(@NonNull java.util.List<android.app.contentsuggestions.ContentSelection>);
-    method @NonNull public android.app.contentsuggestions.ClassificationsRequest build();
-    method @NonNull public android.app.contentsuggestions.ClassificationsRequest.Builder setExtras(@NonNull android.os.Bundle);
-  }
-
-  public final class ContentClassification implements android.os.Parcelable {
-    ctor public ContentClassification(@NonNull String, @NonNull android.os.Bundle);
-    method public int describeContents();
-    method @NonNull public android.os.Bundle getExtras();
-    method @NonNull public String getId();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.contentsuggestions.ContentClassification> CREATOR;
-  }
-
-  public final class ContentSelection implements android.os.Parcelable {
-    ctor public ContentSelection(@NonNull String, @NonNull android.os.Bundle);
-    method public int describeContents();
-    method @NonNull public android.os.Bundle getExtras();
-    method @NonNull public String getId();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.contentsuggestions.ContentSelection> CREATOR;
-  }
-
-  public final class ContentSuggestionsManager {
-    method public void classifyContentSelections(@NonNull android.app.contentsuggestions.ClassificationsRequest, @NonNull java.util.concurrent.Executor, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.ClassificationsCallback);
-    method public boolean isEnabled();
-    method public void notifyInteraction(@NonNull String, @NonNull android.os.Bundle);
-    method public void provideContextImage(@NonNull android.graphics.Bitmap, @NonNull android.os.Bundle);
-    method public void provideContextImage(int, @NonNull android.os.Bundle);
-    method public void suggestContentSelections(@NonNull android.app.contentsuggestions.SelectionsRequest, @NonNull java.util.concurrent.Executor, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.SelectionsCallback);
-  }
-
-  public static interface ContentSuggestionsManager.ClassificationsCallback {
-    method public void onContentClassificationsAvailable(int, @NonNull java.util.List<android.app.contentsuggestions.ContentClassification>);
-  }
-
-  public static interface ContentSuggestionsManager.SelectionsCallback {
-    method public void onContentSelectionsAvailable(int, @NonNull java.util.List<android.app.contentsuggestions.ContentSelection>);
-  }
-
-  public final class SelectionsRequest implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.os.Bundle getExtras();
-    method @Nullable public android.graphics.Point getInterestPoint();
-    method public int getTaskId();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.contentsuggestions.SelectionsRequest> CREATOR;
-  }
-
-  public static final class SelectionsRequest.Builder {
-    ctor public SelectionsRequest.Builder(int);
-    method @NonNull public android.app.contentsuggestions.SelectionsRequest build();
-    method @NonNull public android.app.contentsuggestions.SelectionsRequest.Builder setExtras(@NonNull android.os.Bundle);
-    method @NonNull public android.app.contentsuggestions.SelectionsRequest.Builder setInterestPoint(@NonNull android.graphics.Point);
-  }
-
-}
-
-package android.app.job {
-
-  public abstract class JobScheduler {
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public abstract int scheduleAsPackage(@NonNull android.app.job.JobInfo, @NonNull String, int, String);
-  }
-
-  public class JobSchedulerFrameworkInitializer {
-    method public static void registerServiceWrappers();
-  }
-
-}
-
-package android.app.prediction {
-
-  public final class AppPredictionContext implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public android.os.Bundle getExtras();
-    method @NonNull public String getPackageName();
-    method @IntRange(from=0) public int getPredictedTargetCount();
-    method @NonNull public String getUiSurface();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionContext> CREATOR;
-  }
-
-  public static final class AppPredictionContext.Builder {
-    ctor public AppPredictionContext.Builder(@NonNull android.content.Context);
-    method @NonNull public android.app.prediction.AppPredictionContext build();
-    method @NonNull public android.app.prediction.AppPredictionContext.Builder setExtras(@Nullable android.os.Bundle);
-    method @NonNull public android.app.prediction.AppPredictionContext.Builder setPredictedTargetCount(@IntRange(from=0) int);
-    method @NonNull public android.app.prediction.AppPredictionContext.Builder setUiSurface(@NonNull String);
-  }
-
-  public final class AppPredictionManager {
-    method @NonNull public android.app.prediction.AppPredictor createAppPredictionSession(@NonNull android.app.prediction.AppPredictionContext);
-  }
-
-  public final class AppPredictionSessionId implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionSessionId> CREATOR;
-  }
-
-  public final class AppPredictor {
-    method public void destroy();
-    method public void notifyAppTargetEvent(@NonNull android.app.prediction.AppTargetEvent);
-    method public void notifyLaunchLocationShown(@NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>);
-    method public void registerPredictionUpdates(@NonNull java.util.concurrent.Executor, @NonNull android.app.prediction.AppPredictor.Callback);
-    method public void requestPredictionUpdate();
-    method @Nullable public void sortTargets(@NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>);
-    method public void unregisterPredictionUpdates(@NonNull android.app.prediction.AppPredictor.Callback);
-  }
-
-  public static interface AppPredictor.Callback {
-    method public void onTargetsAvailable(@NonNull java.util.List<android.app.prediction.AppTarget>);
-  }
-
-  public final class AppTarget implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public String getClassName();
-    method @NonNull public android.app.prediction.AppTargetId getId();
-    method @NonNull public String getPackageName();
-    method @IntRange(from=0) public int getRank();
-    method @Nullable public android.content.pm.ShortcutInfo getShortcutInfo();
-    method @NonNull public android.os.UserHandle getUser();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppTarget> CREATOR;
-  }
-
-  public static final class AppTarget.Builder {
-    ctor public AppTarget.Builder(@NonNull android.app.prediction.AppTargetId, @NonNull String, @NonNull android.os.UserHandle);
-    ctor public AppTarget.Builder(@NonNull android.app.prediction.AppTargetId, @NonNull android.content.pm.ShortcutInfo);
-    method @NonNull public android.app.prediction.AppTarget build();
-    method @NonNull public android.app.prediction.AppTarget.Builder setClassName(@NonNull String);
-    method @NonNull public android.app.prediction.AppTarget.Builder setRank(@IntRange(from=0) int);
-  }
-
-  public final class AppTargetEvent implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getAction();
-    method @Nullable public String getLaunchLocation();
-    method @Nullable public android.app.prediction.AppTarget getTarget();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int ACTION_DISMISS = 2; // 0x2
-    field public static final int ACTION_LAUNCH = 1; // 0x1
-    field public static final int ACTION_PIN = 3; // 0x3
-    field public static final int ACTION_UNPIN = 4; // 0x4
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetEvent> CREATOR;
-  }
-
-  public static final class AppTargetEvent.Builder {
-    ctor public AppTargetEvent.Builder(@Nullable android.app.prediction.AppTarget, int);
-    method @NonNull public android.app.prediction.AppTargetEvent build();
-    method @NonNull public android.app.prediction.AppTargetEvent.Builder setLaunchLocation(@Nullable String);
-  }
-
-  public final class AppTargetId implements android.os.Parcelable {
-    ctor public AppTargetId(@NonNull String);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetId> CREATOR;
-  }
-
-}
-
-package android.app.role {
-
-  public interface OnRoleHoldersChangedListener {
-    method public void onRoleHoldersChanged(@NonNull String, @NonNull android.os.UserHandle);
-  }
-
-  public abstract class RoleControllerService extends android.app.Service {
-    ctor public RoleControllerService();
-    method @WorkerThread public abstract boolean onAddRoleHolder(@NonNull String, @NonNull String, int);
-    method @Nullable public final android.os.IBinder onBind(@Nullable android.content.Intent);
-    method @WorkerThread public abstract boolean onClearRoleHolders(@NonNull String, int);
-    method @WorkerThread public abstract boolean onGrantDefaultRoles();
-    method @Deprecated public abstract boolean onIsApplicationQualifiedForRole(@NonNull String, @NonNull String);
-    method public boolean onIsApplicationVisibleForRole(@NonNull String, @NonNull String);
-    method public abstract boolean onIsRoleVisible(@NonNull String);
-    method @WorkerThread public abstract boolean onRemoveRoleHolder(@NonNull String, @NonNull String, int);
-    field public static final String SERVICE_INTERFACE = "android.app.role.RoleControllerService";
-  }
-
-  public final class RoleManager {
-    method @RequiresPermission(android.Manifest.permission.OBSERVE_ROLE_HOLDERS) public void addOnRoleHoldersChangedListenerAsUser(@NonNull java.util.concurrent.Executor, @NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void addRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
-    method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public boolean addRoleHolderFromController(@NonNull String, @NonNull String);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void clearRoleHoldersAsUser(@NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
-    method @NonNull @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public java.util.List<java.lang.String> getHeldRolesFromController(@NonNull String);
-    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public java.util.List<java.lang.String> getRoleHolders(@NonNull String);
-    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public java.util.List<java.lang.String> getRoleHoldersAsUser(@NonNull String, @NonNull android.os.UserHandle);
-    method @RequiresPermission(android.Manifest.permission.OBSERVE_ROLE_HOLDERS) public void removeOnRoleHoldersChangedListenerAsUser(@NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void removeRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
-    method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public boolean removeRoleHolderFromController(@NonNull String, @NonNull String);
-    method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public void setRoleNamesFromController(@NonNull java.util.List<java.lang.String>);
-    field public static final int MANAGE_HOLDERS_FLAG_DONT_KILL_APP = 1; // 0x1
-  }
-
-}
-
-package android.app.time {
-
-  public final class TimeManager {
-    method @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION) public void addTimeZoneDetectorListener(@NonNull java.util.concurrent.Executor, @NonNull android.app.time.TimeManager.TimeZoneDetectorListener);
-    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION) public android.app.time.TimeZoneCapabilitiesAndConfig getTimeZoneCapabilitiesAndConfig();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION) public void removeTimeZoneDetectorListener(@NonNull android.app.time.TimeManager.TimeZoneDetectorListener);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_TIME_AND_ZONE_DETECTION) public boolean updateTimeZoneConfiguration(@NonNull android.app.time.TimeZoneConfiguration);
-  }
-
-  @java.lang.FunctionalInterface public static interface TimeManager.TimeZoneDetectorListener {
-    method public void onChange();
-  }
-
-  public final class TimeZoneCapabilities implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getConfigureAutoDetectionEnabledCapability();
-    method public int getConfigureGeoDetectionEnabledCapability();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field public static final int CAPABILITY_NOT_ALLOWED = 20; // 0x14
-    field public static final int CAPABILITY_NOT_APPLICABLE = 30; // 0x1e
-    field public static final int CAPABILITY_NOT_SUPPORTED = 10; // 0xa
-    field public static final int CAPABILITY_POSSESSED = 40; // 0x28
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.time.TimeZoneCapabilities> CREATOR;
-  }
-
-  public final class TimeZoneCapabilitiesAndConfig implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.app.time.TimeZoneCapabilities getCapabilities();
-    method @NonNull public android.app.time.TimeZoneConfiguration getConfiguration();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.time.TimeZoneCapabilitiesAndConfig> CREATOR;
-  }
-
-  public final class TimeZoneConfiguration implements android.os.Parcelable {
-    method public int describeContents();
-    method public boolean isAutoDetectionEnabled();
-    method public boolean isGeoDetectionEnabled();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.time.TimeZoneConfiguration> CREATOR;
-  }
-
-  public static final class TimeZoneConfiguration.Builder {
-    ctor public TimeZoneConfiguration.Builder();
-    ctor public TimeZoneConfiguration.Builder(@NonNull android.app.time.TimeZoneConfiguration);
-    method @NonNull public android.app.time.TimeZoneConfiguration build();
-    method @NonNull public android.app.time.TimeZoneConfiguration.Builder setAutoDetectionEnabled(boolean);
-    method @NonNull public android.app.time.TimeZoneConfiguration.Builder setGeoDetectionEnabled(boolean);
-  }
-
-}
-
-package android.app.usage {
-
-  public final class CacheQuotaHint implements android.os.Parcelable {
-    ctor public CacheQuotaHint(@NonNull android.app.usage.CacheQuotaHint.Builder);
-    method public int describeContents();
-    method public long getQuota();
-    method public int getUid();
-    method @Nullable public android.app.usage.UsageStats getUsageStats();
-    method @Nullable public String getVolumeUuid();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.usage.CacheQuotaHint> CREATOR;
-    field public static final long QUOTA_NOT_SET = -1L; // 0xffffffffffffffffL
-  }
-
-  public static final class CacheQuotaHint.Builder {
-    ctor public CacheQuotaHint.Builder();
-    ctor public CacheQuotaHint.Builder(@NonNull android.app.usage.CacheQuotaHint);
-    method @NonNull public android.app.usage.CacheQuotaHint build();
-    method @NonNull public android.app.usage.CacheQuotaHint.Builder setQuota(long);
-    method @NonNull public android.app.usage.CacheQuotaHint.Builder setUid(int);
-    method @NonNull public android.app.usage.CacheQuotaHint.Builder setUsageStats(@Nullable android.app.usage.UsageStats);
-    method @NonNull public android.app.usage.CacheQuotaHint.Builder setVolumeUuid(@Nullable String);
-  }
-
-  public abstract class CacheQuotaService extends android.app.Service {
-    ctor public CacheQuotaService();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public abstract java.util.List<android.app.usage.CacheQuotaHint> onComputeCacheQuotaHints(java.util.List<android.app.usage.CacheQuotaHint>);
-    field public static final String SERVICE_INTERFACE = "android.app.usage.CacheQuotaService";
-  }
-
-  public class NetworkStatsManager {
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STATS_PROVIDER, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void registerNetworkStatsProvider(@NonNull String, @NonNull android.net.netstats.provider.NetworkStatsProvider);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STATS_PROVIDER, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void unregisterNetworkStatsProvider(@NonNull android.net.netstats.provider.NetworkStatsProvider);
-  }
-
-  public static final class UsageEvents.Event {
-    method public int getInstanceId();
-    method @Nullable public String getNotificationChannelId();
-    method @Nullable public String getTaskRootClassName();
-    method @Nullable public String getTaskRootPackageName();
-    method public boolean isInstantApp();
-    field public static final int NOTIFICATION_INTERRUPTION = 12; // 0xc
-    field public static final int NOTIFICATION_SEEN = 10; // 0xa
-    field public static final int SLICE_PINNED = 14; // 0xe
-    field public static final int SLICE_PINNED_PRIV = 13; // 0xd
-    field public static final int SYSTEM_INTERACTION = 6; // 0x6
-  }
-
-  public final class UsageStats implements android.os.Parcelable {
-    method public int getAppLaunchCount();
-  }
-
-  public final class UsageStatsManager {
-    method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getAppStandbyBucket(String);
-    method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public java.util.Map<java.lang.String,java.lang.Integer> getAppStandbyBuckets();
-    method public int getUsageSource();
-    method @RequiresPermission(android.Manifest.permission.BIND_CARRIER_SERVICES) public void onCarrierPrivilegedAppsChanged();
-    method @RequiresPermission(allOf={android.Manifest.permission.SUSPEND_APPS, android.Manifest.permission.OBSERVE_APP_USAGE}) public void registerAppUsageLimitObserver(int, @NonNull String[], @NonNull java.time.Duration, @NonNull java.time.Duration, @Nullable android.app.PendingIntent);
-    method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerAppUsageObserver(int, @NonNull String[], long, @NonNull java.util.concurrent.TimeUnit, @NonNull android.app.PendingIntent);
-    method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerUsageSessionObserver(int, @NonNull String[], @NonNull java.time.Duration, @NonNull java.time.Duration, @NonNull android.app.PendingIntent, @Nullable android.app.PendingIntent);
-    method public void reportUsageStart(@NonNull android.app.Activity, @NonNull String);
-    method public void reportUsageStart(@NonNull android.app.Activity, @NonNull String, long);
-    method public void reportUsageStop(@NonNull android.app.Activity, @NonNull String);
-    method @RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE) public void setAppStandbyBucket(String, int);
-    method @RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE) public void setAppStandbyBuckets(java.util.Map<java.lang.String,java.lang.Integer>);
-    method @RequiresPermission(allOf={android.Manifest.permission.SUSPEND_APPS, android.Manifest.permission.OBSERVE_APP_USAGE}) public void unregisterAppUsageLimitObserver(int);
-    method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void unregisterAppUsageObserver(int);
-    method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void unregisterUsageSessionObserver(int);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST) public void whitelistAppTemporarily(String, long, android.os.UserHandle);
-    field public static final String EXTRA_OBSERVER_ID = "android.app.usage.extra.OBSERVER_ID";
-    field public static final String EXTRA_TIME_LIMIT = "android.app.usage.extra.TIME_LIMIT";
-    field public static final String EXTRA_TIME_USED = "android.app.usage.extra.TIME_USED";
-    field public static final int STANDBY_BUCKET_EXEMPTED = 5; // 0x5
-    field public static final int STANDBY_BUCKET_NEVER = 50; // 0x32
-    field public static final int USAGE_SOURCE_CURRENT_ACTIVITY = 2; // 0x2
-    field public static final int USAGE_SOURCE_TASK_ROOT_ACTIVITY = 1; // 0x1
-  }
-
-}
-
-package android.bluetooth {
-
-  public final class BluetoothA2dp implements android.bluetooth.BluetoothProfile {
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
-    field public static final int OPTIONAL_CODECS_NOT_SUPPORTED = 0; // 0x0
-    field public static final int OPTIONAL_CODECS_PREF_DISABLED = 0; // 0x0
-    field public static final int OPTIONAL_CODECS_PREF_ENABLED = 1; // 0x1
-    field public static final int OPTIONAL_CODECS_PREF_UNKNOWN = -1; // 0xffffffff
-    field public static final int OPTIONAL_CODECS_SUPPORTED = 1; // 0x1
-    field public static final int OPTIONAL_CODECS_SUPPORT_UNKNOWN = -1; // 0xffffffff
-  }
-
-  public final class BluetoothA2dpSink implements android.bluetooth.BluetoothProfile {
-    method public void finalize();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean isAudioPlaying(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
-    field @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.a2dp-sink.profile.action.CONNECTION_STATE_CHANGED";
-  }
-
-  public final class BluetoothAdapter {
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean addOnMetadataChangedListener(@NonNull android.bluetooth.BluetoothDevice, @NonNull java.util.concurrent.Executor, @NonNull android.bluetooth.BluetoothAdapter.OnMetadataChangedListener);
-    method public boolean disableBLE();
-    method public boolean enableBLE();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean enableNoAutoConnect();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public long getDiscoveryEndMillis();
-    method public boolean isBleScanAlwaysAvailable();
-    method public boolean isLeEnabled();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean removeActiveDevice(int);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean removeOnMetadataChangedListener(@NonNull android.bluetooth.BluetoothDevice, @NonNull android.bluetooth.BluetoothAdapter.OnMetadataChangedListener);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setActiveDevice(@NonNull android.bluetooth.BluetoothDevice, int);
-    field public static final String ACTION_BLE_STATE_CHANGED = "android.bluetooth.adapter.action.BLE_STATE_CHANGED";
-    field public static final String ACTION_REQUEST_BLE_SCAN_ALWAYS_AVAILABLE = "android.bluetooth.adapter.action.REQUEST_BLE_SCAN_ALWAYS_AVAILABLE";
-    field public static final int ACTIVE_DEVICE_ALL = 2; // 0x2
-    field public static final int ACTIVE_DEVICE_AUDIO = 0; // 0x0
-    field public static final int ACTIVE_DEVICE_PHONE_CALL = 1; // 0x1
-  }
-
-  public static interface BluetoothAdapter.OnMetadataChangedListener {
-    method public void onMetadataChanged(@NonNull android.bluetooth.BluetoothDevice, int, @Nullable byte[]);
-  }
-
-  public final class BluetoothDevice implements android.os.Parcelable {
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean cancelBondProcess();
-    method @Nullable @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public byte[] getMetadata(int);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getSimAccessPermission();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isConnected();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isEncrypted();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean isInSilenceMode();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean removeBond();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setMessageAccessPermission(int);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setMetadata(int, @NonNull byte[]);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setPhonebookAccessPermission(int);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setSilenceMode(boolean);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setSimAccessPermission(int);
-    field public static final int ACCESS_ALLOWED = 1; // 0x1
-    field public static final int ACCESS_REJECTED = 2; // 0x2
-    field public static final int ACCESS_UNKNOWN = 0; // 0x0
-    field public static final String ACTION_SILENCE_MODE_CHANGED = "android.bluetooth.device.action.SILENCE_MODE_CHANGED";
-    field public static final int METADATA_COMPANION_APP = 4; // 0x4
-    field public static final int METADATA_ENHANCED_SETTINGS_UI_URI = 16; // 0x10
-    field public static final int METADATA_HARDWARE_VERSION = 3; // 0x3
-    field public static final int METADATA_IS_UNTETHERED_HEADSET = 6; // 0x6
-    field public static final int METADATA_MAIN_ICON = 5; // 0x5
-    field public static final int METADATA_MANUFACTURER_NAME = 0; // 0x0
-    field public static final int METADATA_MAX_LENGTH = 2048; // 0x800
-    field public static final int METADATA_MODEL_NAME = 1; // 0x1
-    field public static final int METADATA_SOFTWARE_VERSION = 2; // 0x2
-    field public static final int METADATA_UNTETHERED_CASE_BATTERY = 12; // 0xc
-    field public static final int METADATA_UNTETHERED_CASE_CHARGING = 15; // 0xf
-    field public static final int METADATA_UNTETHERED_CASE_ICON = 9; // 0x9
-    field public static final int METADATA_UNTETHERED_LEFT_BATTERY = 10; // 0xa
-    field public static final int METADATA_UNTETHERED_LEFT_CHARGING = 13; // 0xd
-    field public static final int METADATA_UNTETHERED_LEFT_ICON = 7; // 0x7
-    field public static final int METADATA_UNTETHERED_RIGHT_BATTERY = 11; // 0xb
-    field public static final int METADATA_UNTETHERED_RIGHT_CHARGING = 14; // 0xe
-    field public static final int METADATA_UNTETHERED_RIGHT_ICON = 8; // 0x8
-  }
-
-  public final class BluetoothHeadset implements android.bluetooth.BluetoothProfile {
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean connect(android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean disconnect(android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setPriority(android.bluetooth.BluetoothDevice, int);
-  }
-
-  public final class BluetoothHearingAid implements android.bluetooth.BluetoothProfile {
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public long getHiSyncId(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
-  }
-
-  public final class BluetoothHidDevice implements android.bluetooth.BluetoothProfile {
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
-  }
-
-  public final class BluetoothHidHost implements android.bluetooth.BluetoothProfile {
-    method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionState(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
-    field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.input.profile.action.CONNECTION_STATE_CHANGED";
-  }
-
-  public final class BluetoothMap implements java.lang.AutoCloseable android.bluetooth.BluetoothProfile {
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public void close();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) protected void finalize();
-    method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
-    field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.map.profile.action.CONNECTION_STATE_CHANGED";
-  }
-
-  public final class BluetoothPan implements android.bluetooth.BluetoothProfile {
-    method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionState(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean isTetheringOn();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public void setBluetoothTethering(boolean);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
-    field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED";
-    field public static final String ACTION_TETHERING_STATE_CHANGED = "android.bluetooth.action.TETHERING_STATE_CHANGED";
-    field public static final String EXTRA_LOCAL_ROLE = "android.bluetooth.pan.extra.LOCAL_ROLE";
-    field public static final String EXTRA_TETHERING_STATE = "android.bluetooth.extra.TETHERING_STATE";
-    field public static final int LOCAL_NAP_ROLE = 1; // 0x1
-    field public static final int LOCAL_PANU_ROLE = 2; // 0x2
-    field public static final int PAN_ROLE_NONE = 0; // 0x0
-    field public static final int REMOTE_NAP_ROLE = 1; // 0x1
-    field public static final int REMOTE_PANU_ROLE = 2; // 0x2
-    field public static final int TETHERING_STATE_OFF = 1; // 0x1
-    field public static final int TETHERING_STATE_ON = 2; // 0x2
-  }
-
-  public class BluetoothPbap implements android.bluetooth.BluetoothProfile {
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionState(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
-    field @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED";
-  }
-
-  public interface BluetoothProfile {
-    field public static final int A2DP_SINK = 11; // 0xb
-    field public static final int AVRCP_CONTROLLER = 12; // 0xc
-    field public static final int CONNECTION_POLICY_ALLOWED = 100; // 0x64
-    field public static final int CONNECTION_POLICY_FORBIDDEN = 0; // 0x0
-    field public static final int CONNECTION_POLICY_UNKNOWN = -1; // 0xffffffff
-    field public static final int HEADSET_CLIENT = 16; // 0x10
-    field public static final int PAN = 5; // 0x5
-    field public static final int PBAP_CLIENT = 17; // 0x11
-    field @Deprecated public static final int PRIORITY_OFF = 0; // 0x0
-    field @Deprecated public static final int PRIORITY_ON = 100; // 0x64
-  }
-
-  public final class BluetoothUuid {
-    method public static boolean containsAnyUuid(@Nullable android.os.ParcelUuid[], @Nullable android.os.ParcelUuid[]);
-    method @NonNull public static android.os.ParcelUuid parseUuidFrom(@Nullable byte[]);
-    field @NonNull public static final android.os.ParcelUuid A2DP_SINK;
-    field @NonNull public static final android.os.ParcelUuid A2DP_SOURCE;
-    field @NonNull public static final android.os.ParcelUuid ADV_AUDIO_DIST;
-    field @NonNull public static final android.os.ParcelUuid AVRCP_CONTROLLER;
-    field @NonNull public static final android.os.ParcelUuid AVRCP_TARGET;
-    field @NonNull public static final android.os.ParcelUuid BASE_UUID;
-    field @NonNull public static final android.os.ParcelUuid BNEP;
-    field @NonNull public static final android.os.ParcelUuid HEARING_AID;
-    field @NonNull public static final android.os.ParcelUuid HFP;
-    field @NonNull public static final android.os.ParcelUuid HFP_AG;
-    field @NonNull public static final android.os.ParcelUuid HID;
-    field @NonNull public static final android.os.ParcelUuid HOGP;
-    field @NonNull public static final android.os.ParcelUuid HSP;
-    field @NonNull public static final android.os.ParcelUuid HSP_AG;
-    field @NonNull public static final android.os.ParcelUuid MAP;
-    field @NonNull public static final android.os.ParcelUuid MAS;
-    field @NonNull public static final android.os.ParcelUuid MNS;
-    field @NonNull public static final android.os.ParcelUuid NAP;
-    field @NonNull public static final android.os.ParcelUuid OBEX_OBJECT_PUSH;
-    field @NonNull public static final android.os.ParcelUuid PANU;
-    field @NonNull public static final android.os.ParcelUuid PBAP_PCE;
-    field @NonNull public static final android.os.ParcelUuid PBAP_PSE;
-    field @NonNull public static final android.os.ParcelUuid SAP;
-    field public static final int UUID_BYTES_128_BIT = 16; // 0x10
-    field public static final int UUID_BYTES_16_BIT = 2; // 0x2
-    field public static final int UUID_BYTES_32_BIT = 4; // 0x4
-  }
-
-}
-
-package android.bluetooth.le {
-
-  public final class BluetoothLeScanner {
-    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_ADMIN, android.Manifest.permission.UPDATE_DEVICE_STATS}) public void startScanFromSource(android.os.WorkSource, android.bluetooth.le.ScanCallback);
-    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_ADMIN, android.Manifest.permission.UPDATE_DEVICE_STATS}) public void startScanFromSource(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.os.WorkSource, android.bluetooth.le.ScanCallback);
-    method public void startTruncatedScan(java.util.List<android.bluetooth.le.TruncatedFilter>, android.bluetooth.le.ScanSettings, android.bluetooth.le.ScanCallback);
-  }
-
-  public final class ResultStorageDescriptor implements android.os.Parcelable {
-    ctor public ResultStorageDescriptor(int, int, int);
-    method public int describeContents();
-    method public int getLength();
-    method public int getOffset();
-    method public int getType();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.bluetooth.le.ResultStorageDescriptor> CREATOR;
-  }
-
-  public final class ScanSettings implements android.os.Parcelable {
-    field public static final int SCAN_RESULT_TYPE_ABBREVIATED = 1; // 0x1
-    field public static final int SCAN_RESULT_TYPE_FULL = 0; // 0x0
-  }
-
-  public static final class ScanSettings.Builder {
-    method public android.bluetooth.le.ScanSettings.Builder setScanResultType(int);
-  }
-
-  public final class TruncatedFilter {
-    ctor public TruncatedFilter(android.bluetooth.le.ScanFilter, java.util.List<android.bluetooth.le.ResultStorageDescriptor>);
-    method public android.bluetooth.le.ScanFilter getFilter();
-    method public java.util.List<android.bluetooth.le.ResultStorageDescriptor> getStorageDescriptors();
-  }
-
-}
-
-package android.companion {
-
-  public final class CompanionDeviceManager {
-    method @RequiresPermission("android.permission.MANAGE_COMPANION_DEVICES") public boolean isDeviceAssociatedForWifiConnection(@NonNull String, @NonNull android.net.MacAddress, @NonNull android.os.UserHandle);
-  }
-
-}
-
-package android.content {
-
-  public class ApexEnvironment {
-    method @NonNull public static android.content.ApexEnvironment getApexEnvironment(@NonNull String);
-    method @NonNull public java.io.File getCredentialProtectedDataDirForUser(@NonNull android.os.UserHandle);
-    method @NonNull public java.io.File getDeviceProtectedDataDir();
-    method @NonNull public java.io.File getDeviceProtectedDataDirForUser(@NonNull android.os.UserHandle);
-  }
-
-  public abstract class BroadcastReceiver {
-    method @NonNull public final android.os.UserHandle getSendingUser();
-  }
-
-  public abstract class ContentProvider implements android.content.ComponentCallbacks2 {
-    method public int checkUriPermission(@NonNull android.net.Uri, int, int);
-  }
-
-  public class ContentProviderClient implements java.lang.AutoCloseable {
-    method @RequiresPermission(android.Manifest.permission.REMOVE_TASKS) public void setDetectNotResponding(long);
-  }
-
-  public abstract class ContentResolver {
-    method public int checkUriPermission(@NonNull android.net.Uri, int, int);
-    method @NonNull public static android.net.Uri decodeFromFile(@NonNull java.io.File);
-    method @NonNull public static java.io.File encodeToFile(@NonNull android.net.Uri);
-    method @Nullable @RequiresPermission("android.permission.CACHE_CONTENT") public android.os.Bundle getCache(@NonNull android.net.Uri);
-    method @RequiresPermission("android.permission.CACHE_CONTENT") public void putCache(@NonNull android.net.Uri, @Nullable android.os.Bundle);
-  }
-
-  public abstract class Context {
-    method @NonNull public android.content.Context createContextAsUser(@NonNull android.os.UserHandle, int);
-    method public abstract android.content.Context createCredentialProtectedStorageContext();
-    method @NonNull public android.content.Context createPackageContextAsUser(@NonNull String, int, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
-    method @Nullable public abstract java.io.File getPreloadsFileCache();
-    method public abstract boolean isCredentialProtectedStorage();
-    method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public android.content.Intent registerReceiverForAllUsers(@Nullable android.content.BroadcastReceiver, @NonNull android.content.IntentFilter, @Nullable String, @Nullable android.os.Handler);
-    method public abstract void sendBroadcast(android.content.Intent, @Nullable String, @Nullable android.os.Bundle);
-    method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public abstract void sendBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle, @Nullable String, @Nullable android.os.Bundle);
-    method public abstract void sendOrderedBroadcast(@NonNull android.content.Intent, @Nullable String, @Nullable android.os.Bundle, @Nullable android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle);
-    method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public void startActivityAsUser(@NonNull @RequiresPermission android.content.Intent, @NonNull android.os.UserHandle);
-    field public static final String APP_INTEGRITY_SERVICE = "app_integrity";
-    field public static final String APP_PREDICTION_SERVICE = "app_prediction";
-    field public static final String BACKUP_SERVICE = "backup";
-    field public static final String BATTERY_STATS_SERVICE = "batterystats";
-    field public static final int BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS = 1048576; // 0x100000
-    field public static final String BUGREPORT_SERVICE = "bugreport";
-    field public static final String CONTENT_SUGGESTIONS_SERVICE = "content_suggestions";
-    field public static final String CONTEXTHUB_SERVICE = "contexthub";
-    field public static final String ETHERNET_SERVICE = "ethernet";
-    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 NETD_SERVICE = "netd";
-    field public static final String NETWORK_SCORE_SERVICE = "network_score";
-    field public static final String OEM_LOCK_SERVICE = "oem_lock";
-    field public static final String PERMISSION_SERVICE = "permission";
-    field public static final String PERSISTENT_DATA_BLOCK_SERVICE = "persistent_data_block";
-    field public static final String ROLLBACK_SERVICE = "rollback";
-    field public static final String SECURE_ELEMENT_SERVICE = "secure_element";
-    field public static final String STATS_MANAGER = "stats";
-    field public static final String STATUS_BAR_SERVICE = "statusbar";
-    field public static final String SYSTEM_CONFIG_SERVICE = "system_config";
-    field public static final String SYSTEM_UPDATE_SERVICE = "system_update";
-    field public static final String TETHERING_SERVICE = "tethering";
-    field public static final String VR_SERVICE = "vrmanager";
-    field public static final String WIFI_NL80211_SERVICE = "wifinl80211";
-    field @Deprecated public static final String WIFI_RTT_SERVICE = "rttmanager";
-    field public static final String WIFI_SCANNING_SERVICE = "wifiscanner";
-  }
-
-  public class ContextWrapper extends android.content.Context {
-    method public android.content.Context createCredentialProtectedStorageContext();
-    method public java.io.File getPreloadsFileCache();
-    method public boolean isCredentialProtectedStorage();
-    method public void sendBroadcast(android.content.Intent, String, android.os.Bundle);
-    method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, String, android.os.Bundle);
-    method public void sendOrderedBroadcast(android.content.Intent, String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
-  }
-
-  public class Intent implements java.lang.Cloneable android.os.Parcelable {
-    field public static final String ACTION_BATTERY_LEVEL_CHANGED = "android.intent.action.BATTERY_LEVEL_CHANGED";
-    field public static final String ACTION_CALL_EMERGENCY = "android.intent.action.CALL_EMERGENCY";
-    field public static final String ACTION_CALL_PRIVILEGED = "android.intent.action.CALL_PRIVILEGED";
-    field public static final String ACTION_DEVICE_CUSTOMIZATION_READY = "android.intent.action.DEVICE_CUSTOMIZATION_READY";
-    field public static final String ACTION_DIAL_EMERGENCY = "android.intent.action.DIAL_EMERGENCY";
-    field public static final String ACTION_FACTORY_RESET = "android.intent.action.FACTORY_RESET";
-    field public static final String ACTION_GLOBAL_BUTTON = "android.intent.action.GLOBAL_BUTTON";
-    field public static final String ACTION_INCIDENT_REPORT_READY = "android.intent.action.INCIDENT_REPORT_READY";
-    field public static final String ACTION_INSTALL_INSTANT_APP_PACKAGE = "android.intent.action.INSTALL_INSTANT_APP_PACKAGE";
-    field public static final String ACTION_INSTANT_APP_RESOLVER_SETTINGS = "android.intent.action.INSTANT_APP_RESOLVER_SETTINGS";
-    field public static final String ACTION_INTENT_FILTER_NEEDS_VERIFICATION = "android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION";
-    field public static final String ACTION_LOAD_DATA = "android.intent.action.LOAD_DATA";
-    field @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public static final String ACTION_MANAGE_APP_PERMISSION = "android.intent.action.MANAGE_APP_PERMISSION";
-    field public static final String ACTION_MANAGE_APP_PERMISSIONS = "android.intent.action.MANAGE_APP_PERMISSIONS";
-    field @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public static final String ACTION_MANAGE_DEFAULT_APP = "android.intent.action.MANAGE_DEFAULT_APP";
-    field public static final String ACTION_MANAGE_PERMISSIONS = "android.intent.action.MANAGE_PERMISSIONS";
-    field public static final String ACTION_MANAGE_PERMISSION_APPS = "android.intent.action.MANAGE_PERMISSION_APPS";
-    field @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public static final String ACTION_MANAGE_SPECIAL_APP_ACCESSES = "android.intent.action.MANAGE_SPECIAL_APP_ACCESSES";
-    field public static final String ACTION_MASTER_CLEAR_NOTIFICATION = "android.intent.action.MASTER_CLEAR_NOTIFICATION";
-    field public static final String ACTION_PACKAGE_NEEDS_INTEGRITY_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_INTEGRITY_VERIFICATION";
-    field public static final String ACTION_PACKAGE_UNSUSPENDED_MANUALLY = "android.intent.action.PACKAGE_UNSUSPENDED_MANUALLY";
-    field public static final String ACTION_PENDING_INCIDENT_REPORTS_CHANGED = "android.intent.action.PENDING_INCIDENT_REPORTS_CHANGED";
-    field public static final String ACTION_PRE_BOOT_COMPLETED = "android.intent.action.PRE_BOOT_COMPLETED";
-    field public static final String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART";
-    field public static final String ACTION_RESOLVE_INSTANT_APP_PACKAGE = "android.intent.action.RESOLVE_INSTANT_APP_PACKAGE";
-    field @RequiresPermission(android.Manifest.permission.REVIEW_ACCESSIBILITY_SERVICES) public static final String ACTION_REVIEW_ACCESSIBILITY_SERVICES = "android.intent.action.REVIEW_ACCESSIBILITY_SERVICES";
-    field @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public static final String ACTION_REVIEW_ONGOING_PERMISSION_USAGE = "android.intent.action.REVIEW_ONGOING_PERMISSION_USAGE";
-    field public static final String ACTION_REVIEW_PERMISSIONS = "android.intent.action.REVIEW_PERMISSIONS";
-    field @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public static final String ACTION_REVIEW_PERMISSION_USAGE = "android.intent.action.REVIEW_PERMISSION_USAGE";
-    field public static final String ACTION_ROLLBACK_COMMITTED = "android.intent.action.ROLLBACK_COMMITTED";
-    field public static final String ACTION_SHOW_SUSPENDED_APP_DETAILS = "android.intent.action.SHOW_SUSPENDED_APP_DETAILS";
-    field @Deprecated public static final String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";
-    field public static final String ACTION_SPLIT_CONFIGURATION_CHANGED = "android.intent.action.SPLIT_CONFIGURATION_CHANGED";
-    field public static final String ACTION_UPGRADE_SETUP = "android.intent.action.UPGRADE_SETUP";
-    field public static final String ACTION_USER_ADDED = "android.intent.action.USER_ADDED";
-    field public static final String ACTION_USER_REMOVED = "android.intent.action.USER_REMOVED";
-    field public static final String ACTION_VOICE_ASSIST = "android.intent.action.VOICE_ASSIST";
-    field public static final String CATEGORY_LEANBACK_SETTINGS = "android.intent.category.LEANBACK_SETTINGS";
-    field public static final String EXTRA_CALLING_PACKAGE = "android.intent.extra.CALLING_PACKAGE";
-    field public static final String EXTRA_FORCE_FACTORY_RESET = "android.intent.extra.FORCE_FACTORY_RESET";
-    field public static final String EXTRA_INSTANT_APP_ACTION = "android.intent.extra.INSTANT_APP_ACTION";
-    field public static final String EXTRA_INSTANT_APP_BUNDLES = "android.intent.extra.INSTANT_APP_BUNDLES";
-    field public static final String EXTRA_INSTANT_APP_EXTRAS = "android.intent.extra.INSTANT_APP_EXTRAS";
-    field public static final String EXTRA_INSTANT_APP_FAILURE = "android.intent.extra.INSTANT_APP_FAILURE";
-    field public static final String EXTRA_INSTANT_APP_HOSTNAME = "android.intent.extra.INSTANT_APP_HOSTNAME";
-    field public static final String EXTRA_INSTANT_APP_SUCCESS = "android.intent.extra.INSTANT_APP_SUCCESS";
-    field public static final String EXTRA_INSTANT_APP_TOKEN = "android.intent.extra.INSTANT_APP_TOKEN";
-    field public static final String EXTRA_LONG_VERSION_CODE = "android.intent.extra.LONG_VERSION_CODE";
-    field public static final String EXTRA_ORIGINATING_UID = "android.intent.extra.ORIGINATING_UID";
-    field public static final String EXTRA_PACKAGES = "android.intent.extra.PACKAGES";
-    field public static final String EXTRA_PERMISSION_GROUP_NAME = "android.intent.extra.PERMISSION_GROUP_NAME";
-    field public static final String EXTRA_PERMISSION_NAME = "android.intent.extra.PERMISSION_NAME";
-    field public static final String EXTRA_REASON = "android.intent.extra.REASON";
-    field public static final String EXTRA_REMOTE_CALLBACK = "android.intent.extra.REMOTE_CALLBACK";
-    field public static final String EXTRA_RESULT_NEEDED = "android.intent.extra.RESULT_NEEDED";
-    field public static final String EXTRA_ROLE_NAME = "android.intent.extra.ROLE_NAME";
-    field public static final String EXTRA_UNKNOWN_INSTANT_APP = "android.intent.extra.UNKNOWN_INSTANT_APP";
-    field public static final String EXTRA_VERIFICATION_BUNDLE = "android.intent.extra.VERIFICATION_BUNDLE";
-    field public static final int FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT = 67108864; // 0x4000000
-    field public static final String METADATA_SETUP_VERSION = "android.SETUP_VERSION";
-  }
-
-  public class IntentFilter implements android.os.Parcelable {
-    method public final int getOrder();
-    method public final void setOrder(int);
-  }
-
-}
-
-package android.content.integrity {
-
-  public class AppIntegrityManager {
-    method @NonNull public String getCurrentRuleSetProvider();
-    method @NonNull public String getCurrentRuleSetVersion();
-    method public void updateRuleSet(@NonNull android.content.integrity.RuleSet, @NonNull android.content.IntentSender);
-    field public static final String EXTRA_STATUS = "android.content.integrity.extra.STATUS";
-    field public static final int STATUS_FAILURE = 1; // 0x1
-    field public static final int STATUS_SUCCESS = 0; // 0x0
-  }
-
-  public abstract class IntegrityFormula {
-    method @NonNull public static android.content.integrity.IntegrityFormula all(@NonNull android.content.integrity.IntegrityFormula...);
-    method @NonNull public static android.content.integrity.IntegrityFormula any(@NonNull android.content.integrity.IntegrityFormula...);
-    method @NonNull public static android.content.integrity.IntegrityFormula not(@NonNull android.content.integrity.IntegrityFormula);
-  }
-
-  public static final class IntegrityFormula.Application {
-    method @NonNull public static android.content.integrity.IntegrityFormula certificatesContain(@NonNull String);
-    method @NonNull public static android.content.integrity.IntegrityFormula isPreInstalled();
-    method @NonNull public static android.content.integrity.IntegrityFormula packageNameEquals(@NonNull String);
-    method @NonNull public static android.content.integrity.IntegrityFormula versionCodeEquals(@NonNull long);
-    method @NonNull public static android.content.integrity.IntegrityFormula versionCodeGreaterThan(@NonNull long);
-    method @NonNull public static android.content.integrity.IntegrityFormula versionCodeGreaterThanOrEqualTo(@NonNull long);
-  }
-
-  public static final class IntegrityFormula.Installer {
-    method @NonNull public static android.content.integrity.IntegrityFormula certificatesContain(@NonNull String);
-    method @NonNull public static android.content.integrity.IntegrityFormula notAllowedByManifest();
-    method @NonNull public static android.content.integrity.IntegrityFormula packageNameEquals(@NonNull String);
-  }
-
-  public static final class IntegrityFormula.SourceStamp {
-    method @NonNull public static android.content.integrity.IntegrityFormula notTrusted();
-    method @NonNull public static android.content.integrity.IntegrityFormula stampCertificateHashEquals(@NonNull String);
-  }
-
-  public final class Rule implements android.os.Parcelable {
-    ctor public Rule(@NonNull android.content.integrity.IntegrityFormula, int);
-    method public int describeContents();
-    method public int getEffect();
-    method @NonNull public android.content.integrity.IntegrityFormula getFormula();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.content.integrity.Rule> CREATOR;
-    field public static final int DENY = 0; // 0x0
-    field public static final int FORCE_ALLOW = 1; // 0x1
-  }
-
-  public class RuleSet {
-    method @NonNull public java.util.List<android.content.integrity.Rule> getRules();
-    method @NonNull public String getVersion();
-  }
-
-  public static class RuleSet.Builder {
-    ctor public RuleSet.Builder();
-    method @NonNull public android.content.integrity.RuleSet.Builder addRules(@NonNull java.util.List<android.content.integrity.Rule>);
-    method @NonNull public android.content.integrity.RuleSet build();
-    method @NonNull public android.content.integrity.RuleSet.Builder setVersion(@NonNull String);
-  }
-
-}
-
-package android.content.om {
-
-  public final class OverlayInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public String getCategory();
-    method @NonNull public String getPackageName();
-    method @Nullable public String getTargetOverlayableName();
-    method @NonNull public String getTargetPackageName();
-    method public int getUserId();
-    method public boolean isEnabled();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.content.om.OverlayInfo> CREATOR;
-  }
-
-  public class OverlayManager {
-    method @Nullable public android.content.om.OverlayInfo getOverlayInfo(@NonNull String, @NonNull android.os.UserHandle);
-    method @NonNull @RequiresPermission(anyOf={"android.permission.INTERACT_ACROSS_USERS", "android.permission.INTERACT_ACROSS_USERS_FULL"}) public java.util.List<android.content.om.OverlayInfo> getOverlayInfosForTarget(@NonNull String, @NonNull android.os.UserHandle);
-    method @RequiresPermission(anyOf={"android.permission.INTERACT_ACROSS_USERS", "android.permission.INTERACT_ACROSS_USERS_FULL"}) public void setEnabled(@NonNull String, boolean, @NonNull android.os.UserHandle) throws java.lang.IllegalStateException, java.lang.SecurityException;
-    method @RequiresPermission(anyOf={"android.permission.INTERACT_ACROSS_USERS", "android.permission.INTERACT_ACROSS_USERS_FULL"}) public void setEnabledExclusiveInCategory(@NonNull String, @NonNull android.os.UserHandle) throws java.lang.IllegalStateException, java.lang.SecurityException;
-  }
-
-}
-
-package android.content.pm {
-
-  public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
-    method public boolean isEncryptionAware();
-    method public boolean isInstantApp();
-    field public String credentialProtectedDataDir;
-    field public int targetSandboxVersion;
-  }
-
-  public class CrossProfileApps {
-    method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_PROFILES) public void startActivity(@NonNull android.content.ComponentName, @NonNull android.os.UserHandle);
-  }
-
-  public class DataLoaderParams {
-    method @NonNull public static final android.content.pm.DataLoaderParams forIncremental(@NonNull android.content.ComponentName, @NonNull String);
-    method @NonNull public static final android.content.pm.DataLoaderParams forStreaming(@NonNull android.content.ComponentName, @NonNull String);
-    method @NonNull public final String getArguments();
-    method @NonNull public final android.content.ComponentName getComponentName();
-    method @NonNull public final int getType();
-  }
-
-  public final class InstallationFile {
-    method public long getLengthBytes();
-    method public int getLocation();
-    method @Nullable public byte[] getMetadata();
-    method @NonNull public String getName();
-    method @Nullable public byte[] getSignature();
-  }
-
-  public final class InstantAppInfo implements android.os.Parcelable {
-    ctor public InstantAppInfo(android.content.pm.ApplicationInfo, String[], String[]);
-    ctor public InstantAppInfo(String, CharSequence, String[], String[]);
-    method public int describeContents();
-    method @Nullable public android.content.pm.ApplicationInfo getApplicationInfo();
-    method @Nullable public String[] getGrantedPermissions();
-    method @NonNull public String getPackageName();
-    method @Nullable public String[] getRequestedPermissions();
-    method @NonNull public android.graphics.drawable.Drawable loadIcon(@NonNull android.content.pm.PackageManager);
-    method @NonNull public CharSequence loadLabel(@NonNull android.content.pm.PackageManager);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.InstantAppInfo> CREATOR;
-  }
-
-  public final class InstantAppIntentFilter implements android.os.Parcelable {
-    ctor public InstantAppIntentFilter(@Nullable String, @NonNull java.util.List<android.content.IntentFilter>);
-    method public int describeContents();
-    method public java.util.List<android.content.IntentFilter> getFilters();
-    method public String getSplitName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.InstantAppIntentFilter> CREATOR;
-  }
-
-  public final class InstantAppRequestInfo implements android.os.Parcelable {
-    ctor public InstantAppRequestInfo(@NonNull android.content.Intent, @Nullable int[], @NonNull android.os.UserHandle, boolean, @NonNull String);
-    method public int describeContents();
-    method @Nullable public int[] getHostDigestPrefix();
-    method @NonNull public android.content.Intent getIntent();
-    method @NonNull public String getToken();
-    method @NonNull public android.os.UserHandle getUserHandle();
-    method public boolean isRequesterInstantApp();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.InstantAppRequestInfo> CREATOR;
-  }
-
-  public final class InstantAppResolveInfo implements android.os.Parcelable {
-    ctor public InstantAppResolveInfo(@NonNull android.content.pm.InstantAppResolveInfo.InstantAppDigest, @Nullable String, @Nullable java.util.List<android.content.pm.InstantAppIntentFilter>, int);
-    ctor public InstantAppResolveInfo(@NonNull android.content.pm.InstantAppResolveInfo.InstantAppDigest, @Nullable String, @Nullable java.util.List<android.content.pm.InstantAppIntentFilter>, long, @Nullable android.os.Bundle);
-    ctor public InstantAppResolveInfo(@NonNull String, @Nullable String, @Nullable java.util.List<android.content.pm.InstantAppIntentFilter>);
-    ctor public InstantAppResolveInfo(@Nullable android.os.Bundle);
-    method public int describeContents();
-    method public byte[] getDigestBytes();
-    method public int getDigestPrefix();
-    method @Nullable public android.os.Bundle getExtras();
-    method public java.util.List<android.content.pm.InstantAppIntentFilter> getIntentFilters();
-    method public long getLongVersionCode();
-    method public String getPackageName();
-    method @Deprecated public int getVersionCode();
-    method public boolean shouldLetInstallerDecide();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.InstantAppResolveInfo> CREATOR;
-  }
-
-  public static final class InstantAppResolveInfo.InstantAppDigest implements android.os.Parcelable {
-    ctor public InstantAppResolveInfo.InstantAppDigest(@NonNull String);
-    method public int describeContents();
-    method public byte[][] getDigestBytes();
-    method public int[] getDigestPrefix();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.InstantAppResolveInfo.InstantAppDigest> CREATOR;
-    field public static final android.content.pm.InstantAppResolveInfo.InstantAppDigest UNDEFINED;
-  }
-
-  public final class IntentFilterVerificationInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method public java.util.Set<java.lang.String> getDomains();
-    method public String getPackageName();
-    method public int getStatus();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.IntentFilterVerificationInfo> CREATOR;
-  }
-
-  public class LauncherApps {
-    method @Nullable public android.content.pm.LauncherApps.AppUsageLimit getAppUsageLimit(@NonNull String, @NonNull android.os.UserHandle);
-  }
-
-  public static final class LauncherApps.AppUsageLimit implements android.os.Parcelable {
-    method public int describeContents();
-    method public long getTotalUsageLimit();
-    method public long getUsageRemaining();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.LauncherApps.AppUsageLimit> CREATOR;
-  }
-
-  public class PackageInstaller {
-    method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setPermissionsResult(int, boolean);
-    field public static final int DATA_LOADER_TYPE_INCREMENTAL = 2; // 0x2
-    field public static final int DATA_LOADER_TYPE_NONE = 0; // 0x0
-    field public static final int DATA_LOADER_TYPE_STREAMING = 1; // 0x1
-    field public static final String EXTRA_DATA_LOADER_TYPE = "android.content.pm.extra.DATA_LOADER_TYPE";
-    field public static final int LOCATION_DATA_APP = 0; // 0x0
-    field public static final int LOCATION_MEDIA_DATA = 2; // 0x2
-    field public static final int LOCATION_MEDIA_OBB = 1; // 0x1
-  }
-
-  public static class PackageInstaller.Session implements java.io.Closeable {
-    method @RequiresPermission("com.android.permission.USE_INSTALLER_V2") public void addFile(int, @NonNull String, long, @NonNull byte[], @Nullable byte[]);
-    method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void commitTransferred(@NonNull android.content.IntentSender);
-    method @Nullable @RequiresPermission("com.android.permission.USE_INSTALLER_V2") public android.content.pm.DataLoaderParams getDataLoaderParams();
-    method @RequiresPermission("com.android.permission.USE_INSTALLER_V2") public void removeFile(int, @NonNull String);
-  }
-
-  public static class PackageInstaller.SessionInfo implements android.os.Parcelable {
-    method public boolean getAllocateAggressive();
-    method @Deprecated public boolean getAllowDowngrade();
-    method public int getAutoRevokePermissionsMode();
-    method public boolean getDontKillApp();
-    method public boolean getEnableRollback();
-    method @Nullable public String[] getGrantedRuntimePermissions();
-    method public boolean getInstallAsFullApp(boolean);
-    method public boolean getInstallAsInstantApp(boolean);
-    method public boolean getInstallAsVirtualPreload();
-    method public boolean getRequestDowngrade();
-    method public int getRollbackDataPolicy();
-    method @NonNull public java.util.Set<java.lang.String> getWhitelistedRestrictedPermissions();
-  }
-
-  public static class PackageInstaller.SessionParams implements android.os.Parcelable {
-    method @RequiresPermission(android.Manifest.permission.ALLOCATE_AGGRESSIVE) public void setAllocateAggressive(boolean);
-    method @Deprecated public void setAllowDowngrade(boolean);
-    method @RequiresPermission(allOf={android.Manifest.permission.INSTALL_PACKAGES, "com.android.permission.USE_INSTALLER_V2"}) public void setDataLoaderParams(@NonNull android.content.pm.DataLoaderParams);
-    method public void setDontKillApp(boolean);
-    method public void setEnableRollback(boolean);
-    method public void setEnableRollback(boolean, int);
-    method @RequiresPermission(android.Manifest.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS) public void setGrantedRuntimePermissions(String[]);
-    method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setInstallAsApex();
-    method public void setInstallAsInstantApp(boolean);
-    method public void setInstallAsVirtualPreload();
-    method public void setRequestDowngrade(boolean);
-    method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setStaged();
-  }
-
-  public class PackageItemInfo {
-    method public static void forceSafeLabels();
-    method @Deprecated @NonNull public CharSequence loadSafeLabel(@NonNull android.content.pm.PackageManager);
-    method @NonNull public CharSequence loadSafeLabel(@NonNull android.content.pm.PackageManager, @FloatRange(from=0) float, int);
-  }
-
-  public abstract class PackageManager {
-    method @RequiresPermission("android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS") public abstract void addOnPermissionsChangeListener(@NonNull android.content.pm.PackageManager.OnPermissionsChangedListener);
-    method public abstract boolean arePermissionsIndividuallyControlled();
-    method @NonNull public abstract java.util.List<android.content.IntentFilter> getAllIntentFilters(@NonNull String);
-    method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.pm.ApplicationInfo getApplicationInfoAsUser(@NonNull String, int, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
-    method @NonNull public android.content.pm.dex.ArtManager getArtManager();
-    method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_SHARED_LIBRARIES) public java.util.List<android.content.pm.SharedLibraryInfo> getDeclaredSharedLibraries(@NonNull String, int);
-    method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract String getDefaultBrowserPackageNameAsUser(int);
-    method @Nullable @RequiresPermission(android.Manifest.permission.SET_HARMFUL_APP_WARNINGS) public CharSequence getHarmfulAppWarning(@NonNull String);
-    method @Nullable public String getIncidentReportApproverPackageName();
-    method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
-    method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public abstract android.graphics.drawable.Drawable getInstantAppIcon(String);
-    method @Nullable public abstract android.content.ComponentName getInstantAppInstallerComponent();
-    method @Nullable public abstract android.content.ComponentName getInstantAppResolverSettingsComponent();
-    method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public abstract java.util.List<android.content.pm.InstantAppInfo> getInstantApps();
-    method @NonNull public abstract java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(@NonNull String);
-    method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract int getIntentVerificationStatusAsUser(@NonNull String, int);
-    method @android.content.pm.PackageManager.PermissionFlags @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, android.Manifest.permission.GET_RUNTIME_PERMISSIONS}) public abstract int getPermissionFlags(@NonNull String, @NonNull String, @NonNull android.os.UserHandle);
-    method @NonNull @RequiresPermission(android.Manifest.permission.SUSPEND_APPS) public String[] getUnsuspendablePackages(@NonNull String[]);
-    method @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public abstract void grantRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle);
-    method @Deprecated public abstract int installExistingPackage(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
-    method @Deprecated public abstract int installExistingPackage(@NonNull String, int) throws android.content.pm.PackageManager.NameNotFoundException;
-    method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceiversAsUser(@NonNull android.content.Intent, int, android.os.UserHandle);
-    method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public java.util.List<android.content.pm.ResolveInfo> queryIntentActivitiesAsUser(@NonNull android.content.Intent, int, @NonNull android.os.UserHandle);
-    method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public java.util.List<android.content.pm.ResolveInfo> queryIntentContentProvidersAsUser(@NonNull android.content.Intent, int, @NonNull android.os.UserHandle);
-    method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public java.util.List<android.content.pm.ResolveInfo> queryIntentServicesAsUser(@NonNull android.content.Intent, int, @NonNull android.os.UserHandle);
-    method public abstract void registerDexModule(@NonNull String, @Nullable android.content.pm.PackageManager.DexModuleRegisterCallback);
-    method @RequiresPermission("android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS") public abstract void removeOnPermissionsChangeListener(@NonNull android.content.pm.PackageManager.OnPermissionsChangedListener);
-    method public void replacePreferredActivity(@NonNull android.content.IntentFilter, int, @NonNull java.util.List<android.content.ComponentName>, @NonNull android.content.ComponentName);
-    method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public abstract void revokeRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle);
-    method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle, @NonNull String);
-    method public void sendDeviceCustomizationReadyBroadcast();
-    method @RequiresPermission(allOf={android.Manifest.permission.SET_PREFERRED_APPLICATIONS, android.Manifest.permission.INTERACT_ACROSS_USERS_FULL}) public abstract boolean setDefaultBrowserPackageNameAsUser(@Nullable String, int);
-    method @NonNull @RequiresPermission(android.Manifest.permission.SUSPEND_APPS) public String[] setDistractingPackageRestrictions(@NonNull String[], int);
-    method @RequiresPermission(android.Manifest.permission.SET_HARMFUL_APP_WARNINGS) public void setHarmfulAppWarning(@NonNull String, @Nullable CharSequence);
-    method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.SUSPEND_APPS) public String[] setPackagesSuspended(@Nullable String[], boolean, @Nullable android.os.PersistableBundle, @Nullable android.os.PersistableBundle, @Nullable String);
-    method @Nullable @RequiresPermission(android.Manifest.permission.SUSPEND_APPS) public String[] setPackagesSuspended(@Nullable String[], boolean, @Nullable android.os.PersistableBundle, @Nullable android.os.PersistableBundle, @Nullable android.content.pm.SuspendDialogInfo);
-    method @RequiresPermission(value=android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE, conditional=true) public void setSyntheticAppDetailsActivityEnabled(@NonNull String, boolean);
-    method public void setSystemAppState(@NonNull String, int);
-    method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public abstract void setUpdateAvailable(@NonNull String, boolean);
-    method @RequiresPermission(android.Manifest.permission.SET_PREFERRED_APPLICATIONS) public abstract boolean updateIntentVerificationStatusAsUser(@NonNull String, int, int);
-    method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS}) public abstract void updatePermissionFlags(@NonNull String, @NonNull String, @android.content.pm.PackageManager.PermissionFlags int, @android.content.pm.PackageManager.PermissionFlags int, @NonNull android.os.UserHandle);
-    method @RequiresPermission(android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT) public abstract void verifyIntentFilter(int, int, @NonNull java.util.List<java.lang.String>);
-    field public static final String ACTION_REQUEST_PERMISSIONS = "android.content.pm.action.REQUEST_PERMISSIONS";
-    field public static final String EXTRA_REQUEST_PERMISSIONS_NAMES = "android.content.pm.extra.REQUEST_PERMISSIONS_NAMES";
-    field public static final String EXTRA_REQUEST_PERMISSIONS_RESULTS = "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS";
-    field public static final String FEATURE_BROADCAST_RADIO = "android.hardware.broadcastradio";
-    field public static final String FEATURE_CONTEXT_HUB = "android.hardware.context_hub";
-    field public static final String FEATURE_INCREMENTAL_DELIVERY = "android.software.incremental_delivery";
-    field public static final String FEATURE_REBOOT_ESCROW = "android.hardware.reboot_escrow";
-    field public static final String FEATURE_TELEPHONY_CARRIERLOCK = "android.hardware.telephony.carrierlock";
-    field public static final int FLAGS_PERMISSION_RESERVED_PERMISSION_CONTROLLER = -268435456; // 0xf0000000
-    field public static final int FLAG_PERMISSION_APPLY_RESTRICTION = 16384; // 0x4000
-    field public static final int FLAG_PERMISSION_AUTO_REVOKED = 131072; // 0x20000
-    field public static final int FLAG_PERMISSION_GRANTED_BY_DEFAULT = 32; // 0x20
-    field public static final int FLAG_PERMISSION_GRANTED_BY_ROLE = 32768; // 0x8000
-    field public static final int FLAG_PERMISSION_ONE_TIME = 65536; // 0x10000
-    field public static final int FLAG_PERMISSION_POLICY_FIXED = 4; // 0x4
-    field public static final int FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT = 2048; // 0x800
-    field public static final int FLAG_PERMISSION_RESTRICTION_ROLE_EXEMPT = 262144; // 0x40000
-    field public static final int FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT = 4096; // 0x1000
-    field public static final int FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT = 8192; // 0x2000
-    field public static final int FLAG_PERMISSION_REVIEW_REQUIRED = 64; // 0x40
-    field public static final int FLAG_PERMISSION_REVOKED_COMPAT = 8; // 0x8
-    field @Deprecated public static final int FLAG_PERMISSION_REVOKE_ON_UPGRADE = 8; // 0x8
-    field public static final int FLAG_PERMISSION_SYSTEM_FIXED = 16; // 0x10
-    field public static final int FLAG_PERMISSION_USER_FIXED = 2; // 0x2
-    field public static final int FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED = 512; // 0x200
-    field public static final int FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED = 256; // 0x100
-    field public static final int FLAG_PERMISSION_USER_SET = 1; // 0x1
-    field public static final int INSTALL_FAILED_ALREADY_EXISTS = -1; // 0xffffffff
-    field public static final int INSTALL_FAILED_CONFLICTING_PROVIDER = -13; // 0xfffffff3
-    field public static final int INSTALL_FAILED_CONTAINER_ERROR = -18; // 0xffffffee
-    field public static final int INSTALL_FAILED_CPU_ABI_INCOMPATIBLE = -16; // 0xfffffff0
-    field public static final int INSTALL_FAILED_DEXOPT = -11; // 0xfffffff5
-    field public static final int INSTALL_FAILED_DUPLICATE_PACKAGE = -5; // 0xfffffffb
-    field public static final int INSTALL_FAILED_INSUFFICIENT_STORAGE = -4; // 0xfffffffc
-    field public static final int INSTALL_FAILED_INTERNAL_ERROR = -110; // 0xffffff92
-    field public static final int INSTALL_FAILED_INVALID_APK = -2; // 0xfffffffe
-    field public static final int INSTALL_FAILED_INVALID_INSTALL_LOCATION = -19; // 0xffffffed
-    field public static final int INSTALL_FAILED_INVALID_URI = -3; // 0xfffffffd
-    field public static final int INSTALL_FAILED_MEDIA_UNAVAILABLE = -20; // 0xffffffec
-    field public static final int INSTALL_FAILED_MISSING_FEATURE = -17; // 0xffffffef
-    field public static final int INSTALL_FAILED_MISSING_SHARED_LIBRARY = -9; // 0xfffffff7
-    field public static final int INSTALL_FAILED_NEWER_SDK = -14; // 0xfffffff2
-    field public static final int INSTALL_FAILED_NO_SHARED_USER = -6; // 0xfffffffa
-    field public static final int INSTALL_FAILED_OLDER_SDK = -12; // 0xfffffff4
-    field public static final int INSTALL_FAILED_PACKAGE_CHANGED = -23; // 0xffffffe9
-    field public static final int INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE = -26; // 0xffffffe6
-    field public static final int INSTALL_FAILED_REPLACE_COULDNT_DELETE = -10; // 0xfffffff6
-    field public static final int INSTALL_FAILED_SANDBOX_VERSION_DOWNGRADE = -27; // 0xffffffe5
-    field public static final int INSTALL_FAILED_SHARED_USER_INCOMPATIBLE = -8; // 0xfffffff8
-    field public static final int INSTALL_FAILED_TEST_ONLY = -15; // 0xfffffff1
-    field public static final int INSTALL_FAILED_UPDATE_INCOMPATIBLE = -7; // 0xfffffff9
-    field public static final int INSTALL_FAILED_VERIFICATION_FAILURE = -22; // 0xffffffea
-    field public static final int INSTALL_FAILED_VERIFICATION_TIMEOUT = -21; // 0xffffffeb
-    field public static final int INSTALL_PARSE_FAILED_BAD_MANIFEST = -101; // 0xffffff9b
-    field public static final int INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME = -106; // 0xffffff96
-    field public static final int INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID = -107; // 0xffffff95
-    field public static final int INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING = -105; // 0xffffff97
-    field public static final int INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES = -104; // 0xffffff98
-    field public static final int INSTALL_PARSE_FAILED_MANIFEST_EMPTY = -109; // 0xffffff93
-    field public static final int INSTALL_PARSE_FAILED_MANIFEST_MALFORMED = -108; // 0xffffff94
-    field public static final int INSTALL_PARSE_FAILED_NOT_APK = -100; // 0xffffff9c
-    field public static final int INSTALL_PARSE_FAILED_NO_CERTIFICATES = -103; // 0xffffff99
-    field public static final int INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION = -102; // 0xffffff9a
-    field public static final int INSTALL_SUCCEEDED = 1; // 0x1
-    field public static final int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS = 2; // 0x2
-    field public static final int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK = 4; // 0x4
-    field public static final int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK = 1; // 0x1
-    field public static final int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER = 3; // 0x3
-    field public static final int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED = 0; // 0x0
-    field public static final int INTENT_FILTER_VERIFICATION_FAILURE = -1; // 0xffffffff
-    field public static final int INTENT_FILTER_VERIFICATION_SUCCESS = 1; // 0x1
-    field @Deprecated public static final int MASK_PERMISSION_FLAGS = 255; // 0xff
-    field public static final int MATCH_ANY_USER = 4194304; // 0x400000
-    field public static final int MATCH_FACTORY_ONLY = 2097152; // 0x200000
-    field public static final int MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS = 536870912; // 0x20000000
-    field public static final int MATCH_INSTANT = 8388608; // 0x800000
-    field public static final int MODULE_APEX_NAME = 1; // 0x1
-    field public static final int RESTRICTION_HIDE_FROM_SUGGESTIONS = 1; // 0x1
-    field public static final int RESTRICTION_HIDE_NOTIFICATIONS = 2; // 0x2
-    field public static final int RESTRICTION_NONE = 0; // 0x0
-    field public static final int SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN = 0; // 0x0
-    field public static final int SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_VISIBLE = 1; // 0x1
-    field public static final int SYSTEM_APP_STATE_INSTALLED = 2; // 0x2
-    field public static final int SYSTEM_APP_STATE_UNINSTALLED = 3; // 0x3
-  }
-
-  public abstract static class PackageManager.DexModuleRegisterCallback {
-    ctor public PackageManager.DexModuleRegisterCallback();
-    method public abstract void onDexModuleRegistered(String, boolean, String);
-  }
-
-  public static interface PackageManager.OnPermissionsChangedListener {
-    method public void onPermissionsChanged(int);
-  }
-
-  @IntDef(prefix={"FLAG_PERMISSION_"}, value={android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET, android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_POLICY_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE, android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT, android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED, android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED, android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT, android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT, android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT, android.content.pm.PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION, android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_ROLE, android.content.pm.PackageManager.FLAG_PERMISSION_REVOKED_COMPAT, android.content.pm.PackageManager.FLAG_PERMISSION_ONE_TIME, android.content.pm.PackageManager.FLAG_PERMISSION_AUTO_REVOKED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PackageManager.PermissionFlags {
-  }
-
-  public class PermissionGroupInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
-    field @StringRes public final int backgroundRequestDetailResourceId;
-    field @StringRes public final int backgroundRequestResourceId;
-    field @StringRes public final int requestDetailResourceId;
-    field @StringRes public int requestRes;
-  }
-
-  public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
-    field public static final int FLAG_REMOVED = 2; // 0x2
-    field public static final int PROTECTION_FLAG_APP_PREDICTOR = 2097152; // 0x200000
-    field public static final int PROTECTION_FLAG_COMPANION = 8388608; // 0x800000
-    field public static final int PROTECTION_FLAG_CONFIGURATOR = 524288; // 0x80000
-    field public static final int PROTECTION_FLAG_DOCUMENTER = 262144; // 0x40000
-    field public static final int PROTECTION_FLAG_INCIDENT_REPORT_APPROVER = 1048576; // 0x100000
-    field public static final int PROTECTION_FLAG_OEM = 16384; // 0x4000
-    field public static final int PROTECTION_FLAG_RETAIL_DEMO = 16777216; // 0x1000000
-    field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000
-    field public static final int PROTECTION_FLAG_WELLBEING = 131072; // 0x20000
-    field @Nullable public final String backgroundPermission;
-    field @StringRes public int requestRes;
-  }
-
-  public class ResolveInfo implements android.os.Parcelable {
-    field public boolean handleAllWebDataURI;
-  }
-
-  public final class ShortcutInfo implements android.os.Parcelable {
-    method @Nullable public android.app.Person[] getPersons();
-  }
-
-  public class ShortcutManager {
-    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_APP_PREDICTIONS) public java.util.List<android.content.pm.ShortcutManager.ShareShortcutInfo> getShareTargets(@NonNull android.content.IntentFilter);
-    method public boolean hasShareTargets(@NonNull String);
-  }
-
-  public static final class ShortcutManager.ShareShortcutInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.content.pm.ShortcutInfo getShortcutInfo();
-    method @NonNull public android.content.ComponentName getTargetComponent();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.ShortcutManager.ShareShortcutInfo> CREATOR;
-  }
-
-  public final class SuspendDialogInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int BUTTON_ACTION_MORE_DETAILS = 0; // 0x0
-    field public static final int BUTTON_ACTION_UNSUSPEND = 1; // 0x1
-    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.SuspendDialogInfo> CREATOR;
-  }
-
-  public static final class SuspendDialogInfo.Builder {
-    ctor public SuspendDialogInfo.Builder();
-    method @NonNull public android.content.pm.SuspendDialogInfo build();
-    method @NonNull public android.content.pm.SuspendDialogInfo.Builder setIcon(@DrawableRes int);
-    method @NonNull public android.content.pm.SuspendDialogInfo.Builder setMessage(@NonNull String);
-    method @NonNull public android.content.pm.SuspendDialogInfo.Builder setMessage(@StringRes int);
-    method @NonNull public android.content.pm.SuspendDialogInfo.Builder setNeutralButtonAction(int);
-    method @NonNull public android.content.pm.SuspendDialogInfo.Builder setNeutralButtonText(@StringRes int);
-    method @NonNull public android.content.pm.SuspendDialogInfo.Builder setTitle(@StringRes int);
-  }
-
-}
-
-package android.content.pm.dex {
-
-  public class ArtManager {
-    method @RequiresPermission(allOf={android.Manifest.permission.READ_RUNTIME_PROFILES, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean isRuntimeProfilingEnabled(int);
-    method @RequiresPermission(allOf={android.Manifest.permission.READ_RUNTIME_PROFILES, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void snapshotRuntimeProfile(int, @Nullable String, @Nullable String, @NonNull java.util.concurrent.Executor, @NonNull android.content.pm.dex.ArtManager.SnapshotRuntimeProfileCallback);
-    field public static final int PROFILE_APPS = 0; // 0x0
-    field public static final int PROFILE_BOOT_IMAGE = 1; // 0x1
-    field public static final int SNAPSHOT_FAILED_CODE_PATH_NOT_FOUND = 1; // 0x1
-    field public static final int SNAPSHOT_FAILED_INTERNAL_ERROR = 2; // 0x2
-    field public static final int SNAPSHOT_FAILED_PACKAGE_NOT_FOUND = 0; // 0x0
-  }
-
-  public abstract static class ArtManager.SnapshotRuntimeProfileCallback {
-    ctor public ArtManager.SnapshotRuntimeProfileCallback();
-    method public abstract void onError(int);
-    method public abstract void onSuccess(android.os.ParcelFileDescriptor);
-  }
-
-}
-
-package android.content.pm.permission {
-
-  @Deprecated public final class RuntimePermissionPresentationInfo implements android.os.Parcelable {
-    ctor @Deprecated public RuntimePermissionPresentationInfo(CharSequence, boolean, boolean);
-    method @Deprecated public int describeContents();
-    method @Deprecated @NonNull public CharSequence getLabel();
-    method @Deprecated public boolean isGranted();
-    method @Deprecated public boolean isStandard();
-    method @Deprecated public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.content.pm.permission.RuntimePermissionPresentationInfo> CREATOR;
-  }
-
-}
-
-package android.content.rollback {
-
-  public final class PackageRollbackInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public String getPackageName();
-    method @NonNull public android.content.pm.VersionedPackage getVersionRolledBackFrom();
-    method @NonNull public android.content.pm.VersionedPackage getVersionRolledBackTo();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.content.rollback.PackageRollbackInfo> CREATOR;
-  }
-
-  public final class RollbackInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public java.util.List<android.content.pm.VersionedPackage> getCausePackages();
-    method public int getCommittedSessionId();
-    method @NonNull public java.util.List<android.content.rollback.PackageRollbackInfo> getPackages();
-    method public int getRollbackId();
-    method public boolean isStaged();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.content.rollback.RollbackInfo> CREATOR;
-  }
-
-  public final class RollbackManager {
-    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, "android.permission.TEST_MANAGE_ROLLBACKS"}) public void commitRollback(int, @NonNull java.util.List<android.content.pm.VersionedPackage>, @NonNull android.content.IntentSender);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, "android.permission.TEST_MANAGE_ROLLBACKS"}) public java.util.List<android.content.rollback.RollbackInfo> getAvailableRollbacks();
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, "android.permission.TEST_MANAGE_ROLLBACKS"}) public java.util.List<android.content.rollback.RollbackInfo> getRecentlyCommittedRollbacks();
-    field public static final String EXTRA_STATUS = "android.content.rollback.extra.STATUS";
-    field public static final String EXTRA_STATUS_MESSAGE = "android.content.rollback.extra.STATUS_MESSAGE";
-    field public static final int STATUS_FAILURE = 1; // 0x1
-    field public static final int STATUS_FAILURE_INSTALL = 3; // 0x3
-    field public static final int STATUS_FAILURE_ROLLBACK_UNAVAILABLE = 2; // 0x2
-    field public static final int STATUS_SUCCESS = 0; // 0x0
-  }
-
-}
-
-package android.debug {
-
-  public class AdbManager {
-    method @RequiresPermission(android.Manifest.permission.MANAGE_DEBUGGING) public boolean isAdbWifiQrSupported();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_DEBUGGING) public boolean isAdbWifiSupported();
-  }
-
-}
-
-package android.hardware {
-
-  public final class Sensor {
-    method public java.util.UUID getUuid();
-    method public boolean isDataInjectionSupported();
-    field public static final String STRING_TYPE_DYNAMIC_SENSOR_META = "android.sensor.dynamic_sensor_meta";
-    field public static final String STRING_TYPE_WRIST_TILT_GESTURE = "android.sensor.wrist_tilt_gesture";
-    field public static final int TYPE_DYNAMIC_SENSOR_META = 32; // 0x20
-    field public static final int TYPE_WRIST_TILT_GESTURE = 26; // 0x1a
-  }
-
-  public abstract class SensorManager {
-    method public boolean initDataInjection(boolean);
-    method public boolean injectSensorData(android.hardware.Sensor, float[], int, long);
-  }
-
-}
-
-package android.hardware.biometrics {
-
-  public static interface BiometricManager.Authenticators {
-    field @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static final int BIOMETRIC_CONVENIENCE = 4095; // 0xfff
-    field @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static final int EMPTY_SET = 0; // 0x0
-  }
-
-}
-
-package android.hardware.camera2 {
-
-  public abstract class CameraDevice implements java.lang.AutoCloseable {
-    method @Deprecated public abstract void createCustomCaptureSession(android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>, int, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
-    field public static final int SESSION_OPERATION_MODE_CONSTRAINED_HIGH_SPEED = 1; // 0x1
-    field public static final int SESSION_OPERATION_MODE_NORMAL = 0; // 0x0
-    field public static final int SESSION_OPERATION_MODE_VENDOR_START = 32768; // 0x8000
-  }
-
-}
-
-package android.hardware.camera2.params {
-
-  public final class OutputConfiguration implements android.os.Parcelable {
-    ctor public OutputConfiguration(@NonNull android.view.Surface, int);
-    ctor public OutputConfiguration(int, @NonNull android.view.Surface, int);
-    method public int getRotation();
-    field public static final int ROTATION_0 = 0; // 0x0
-    field public static final int ROTATION_180 = 2; // 0x2
-    field public static final int ROTATION_270 = 3; // 0x3
-    field public static final int ROTATION_90 = 1; // 0x1
-  }
-
-}
-
-package android.hardware.display {
-
-  public final class AmbientBrightnessDayStats implements android.os.Parcelable {
-    method public int describeContents();
-    method public float[] getBucketBoundaries();
-    method public java.time.LocalDate getLocalDate();
-    method public float[] getStats();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.AmbientBrightnessDayStats> CREATOR;
-  }
-
-  public final class BrightnessChangeEvent implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessChangeEvent> CREATOR;
-    field public final float batteryLevel;
-    field public final float brightness;
-    field public final long colorSampleDuration;
-    field public final int colorTemperature;
-    field @Nullable public final long[] colorValueBuckets;
-    field public final boolean isDefaultBrightnessConfig;
-    field public final boolean isUserSetBrightness;
-    field public final float lastBrightness;
-    field public final long[] luxTimestamps;
-    field public final float[] luxValues;
-    field public final boolean nightMode;
-    field public final String packageName;
-    field public final float powerBrightnessFactor;
-    field public final long timeStamp;
-  }
-
-  public final class BrightnessConfiguration implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByCategory(int);
-    method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByPackageName(@NonNull String);
-    method public android.util.Pair<float[],float[]> getCurve();
-    method public float getShortTermModelLowerLuxMultiplier();
-    method public long getShortTermModelTimeoutMillis();
-    method public float getShortTermModelUpperLuxMultiplier();
-    method public boolean shouldCollectColorSamples();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessConfiguration> CREATOR;
-    field public static final long SHORT_TERM_TIMEOUT_UNSET = -1L; // 0xffffffffffffffffL
-  }
-
-  public static class BrightnessConfiguration.Builder {
-    ctor public BrightnessConfiguration.Builder(float[], float[]);
-    method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, @NonNull android.hardware.display.BrightnessCorrection);
-    method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(@NonNull String, @NonNull android.hardware.display.BrightnessCorrection);
-    method @NonNull public android.hardware.display.BrightnessConfiguration build();
-    method public int getMaxCorrectionsByCategory();
-    method public int getMaxCorrectionsByPackageName();
-    method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String);
-    method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShortTermModelLowerLuxMultiplier(@FloatRange(from=0.0f) float);
-    method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShortTermModelTimeoutMillis(long);
-    method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShortTermModelUpperLuxMultiplier(@FloatRange(from=0.0f) float);
-    method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShouldCollectColorSamples(boolean);
-  }
-
-  public final class BrightnessCorrection implements android.os.Parcelable {
-    method @FloatRange(from=0.0) public float apply(@FloatRange(from=0.0) float);
-    method @NonNull public static android.hardware.display.BrightnessCorrection createScaleAndTranslateLog(float, float);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessCorrection> CREATOR;
-  }
-
-  public final class ColorDisplayManager {
-    method @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS) public int getNightDisplayAutoMode();
-    method @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS) public int getTransformCapabilities();
-    method @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS) public boolean setAppSaturationLevel(@NonNull String, @IntRange(from=0, to=100) int);
-    method @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS) public boolean setNightDisplayAutoMode(int);
-    method @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS) public boolean setNightDisplayCustomEndTime(@NonNull java.time.LocalTime);
-    method @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS) public boolean setNightDisplayCustomStartTime(@NonNull java.time.LocalTime);
-    method @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS) public boolean setSaturationLevel(@IntRange(from=0, to=100) int);
-    field public static final int AUTO_MODE_CUSTOM_TIME = 1; // 0x1
-    field public static final int AUTO_MODE_DISABLED = 0; // 0x0
-    field public static final int AUTO_MODE_TWILIGHT = 2; // 0x2
-    field public static final int CAPABILITY_HARDWARE_ACCELERATION_GLOBAL = 2; // 0x2
-    field public static final int CAPABILITY_HARDWARE_ACCELERATION_PER_APP = 4; // 0x4
-    field public static final int CAPABILITY_NONE = 0; // 0x0
-    field public static final int CAPABILITY_PROTECTED_CONTENT = 1; // 0x1
-  }
-
-  public final class DisplayManager {
-    method @RequiresPermission(android.Manifest.permission.ACCESS_AMBIENT_LIGHT_STATS) public java.util.List<android.hardware.display.AmbientBrightnessDayStats> getAmbientBrightnessStats();
-    method @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration();
-    method @RequiresPermission(android.Manifest.permission.BRIGHTNESS_SLIDER_USAGE) public java.util.List<android.hardware.display.BrightnessChangeEvent> getBrightnessEvents();
-    method @Nullable @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
-    method public android.util.Pair<float[],float[]> getMinimumBrightnessCurve();
-    method public android.graphics.Point getStableDisplaySize();
-    method @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_SATURATION) public void setSaturationLevel(float);
-  }
-
-}
-
-package android.hardware.hdmi {
-
-  public abstract class HdmiClient {
-    method public android.hardware.hdmi.HdmiDeviceInfo getActiveSource();
-    method public void sendKeyEvent(int, boolean);
-    method public void sendVendorCommand(int, byte[], boolean);
-    method public void setVendorCommandListener(@NonNull android.hardware.hdmi.HdmiControlManager.VendorCommandListener);
-  }
-
-  public final class HdmiControlManager {
-    method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void addHotplugEventListener(android.hardware.hdmi.HdmiControlManager.HotplugEventListener);
-    method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void addHotplugEventListener(@NonNull java.util.concurrent.Executor, @NonNull android.hardware.hdmi.HdmiControlManager.HotplugEventListener);
-    method @Nullable public android.hardware.hdmi.HdmiClient getClient(int);
-    method @NonNull public java.util.List<android.hardware.hdmi.HdmiDeviceInfo> getConnectedDevices();
-    method public int getPhysicalAddress();
-    method @Nullable public android.hardware.hdmi.HdmiPlaybackClient getPlaybackClient();
-    method @Nullable public android.hardware.hdmi.HdmiSwitchClient getSwitchClient();
-    method @Nullable public android.hardware.hdmi.HdmiTvClient getTvClient();
-    method public boolean isDeviceConnected(@NonNull android.hardware.hdmi.HdmiDeviceInfo);
-    method public void powerOffDevice(@NonNull android.hardware.hdmi.HdmiDeviceInfo);
-    method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void removeHotplugEventListener(android.hardware.hdmi.HdmiControlManager.HotplugEventListener);
-    method public void setActiveSource(@NonNull android.hardware.hdmi.HdmiDeviceInfo);
-    method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setStandbyMode(boolean);
-    field public static final String ACTION_OSD_MESSAGE = "android.hardware.hdmi.action.OSD_MESSAGE";
-    field public static final int AVR_VOLUME_MUTED = 101; // 0x65
-    field public static final int CLEAR_TIMER_STATUS_CEC_DISABLE = 162; // 0xa2
-    field public static final int CLEAR_TIMER_STATUS_CHECK_RECORDER_CONNECTION = 160; // 0xa0
-    field public static final int CLEAR_TIMER_STATUS_FAIL_TO_CLEAR_SELECTED_SOURCE = 161; // 0xa1
-    field public static final int CLEAR_TIMER_STATUS_TIMER_CLEARED = 128; // 0x80
-    field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_INFO_AVAILABLE = 2; // 0x2
-    field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_MATCHING = 1; // 0x1
-    field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_RECORDING = 0; // 0x0
-    field public static final int CONTROL_STATE_CHANGED_REASON_SETTING = 1; // 0x1
-    field public static final int CONTROL_STATE_CHANGED_REASON_STANDBY = 3; // 0x3
-    field public static final int CONTROL_STATE_CHANGED_REASON_START = 0; // 0x0
-    field public static final int CONTROL_STATE_CHANGED_REASON_WAKEUP = 2; // 0x2
-    field public static final int DEVICE_EVENT_ADD_DEVICE = 1; // 0x1
-    field public static final int DEVICE_EVENT_REMOVE_DEVICE = 2; // 0x2
-    field public static final int DEVICE_EVENT_UPDATE_DEVICE = 3; // 0x3
-    field public static final String EXTRA_MESSAGE_EXTRA_PARAM1 = "android.hardware.hdmi.extra.MESSAGE_EXTRA_PARAM1";
-    field public static final String EXTRA_MESSAGE_ID = "android.hardware.hdmi.extra.MESSAGE_ID";
-    field public static final int ONE_TOUCH_RECORD_ALREADY_RECORDING = 18; // 0x12
-    field public static final int ONE_TOUCH_RECORD_CEC_DISABLED = 51; // 0x33
-    field public static final int ONE_TOUCH_RECORD_CHECK_RECORDER_CONNECTION = 49; // 0x31
-    field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_COPY = 13; // 0xd
-    field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_FUTHER_COPIES = 14; // 0xe
-    field public static final int ONE_TOUCH_RECORD_FAIL_TO_RECORD_DISPLAYED_SCREEN = 50; // 0x32
-    field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PHYSICAL_ADDRESS = 10; // 0xa
-    field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PLUG_NUMBER = 9; // 0x9
-    field public static final int ONE_TOUCH_RECORD_MEDIA_PROBLEM = 21; // 0x15
-    field public static final int ONE_TOUCH_RECORD_MEDIA_PROTECTED = 19; // 0x13
-    field public static final int ONE_TOUCH_RECORD_NOT_ENOUGH_SPACE = 22; // 0x16
-    field public static final int ONE_TOUCH_RECORD_NO_MEDIA = 16; // 0x10
-    field public static final int ONE_TOUCH_RECORD_NO_OR_INSUFFICIENT_CA_ENTITLEMENTS = 12; // 0xc
-    field public static final int ONE_TOUCH_RECORD_NO_SOURCE_SIGNAL = 20; // 0x14
-    field public static final int ONE_TOUCH_RECORD_OTHER_REASON = 31; // 0x1f
-    field public static final int ONE_TOUCH_RECORD_PARENT_LOCK_ON = 23; // 0x17
-    field public static final int ONE_TOUCH_RECORD_PLAYING = 17; // 0x11
-    field public static final int ONE_TOUCH_RECORD_PREVIOUS_RECORDING_IN_PROGRESS = 48; // 0x30
-    field public static final int ONE_TOUCH_RECORD_RECORDING_ALREADY_TERMINATED = 27; // 0x1b
-    field public static final int ONE_TOUCH_RECORD_RECORDING_ANALOGUE_SERVICE = 3; // 0x3
-    field public static final int ONE_TOUCH_RECORD_RECORDING_CURRENTLY_SELECTED_SOURCE = 1; // 0x1
-    field public static final int ONE_TOUCH_RECORD_RECORDING_DIGITAL_SERVICE = 2; // 0x2
-    field public static final int ONE_TOUCH_RECORD_RECORDING_EXTERNAL_INPUT = 4; // 0x4
-    field public static final int ONE_TOUCH_RECORD_RECORDING_TERMINATED_NORMALLY = 26; // 0x1a
-    field public static final int ONE_TOUCH_RECORD_UNABLE_ANALOGUE_SERVICE = 6; // 0x6
-    field public static final int ONE_TOUCH_RECORD_UNABLE_DIGITAL_SERVICE = 5; // 0x5
-    field public static final int ONE_TOUCH_RECORD_UNABLE_SELECTED_SERVICE = 7; // 0x7
-    field public static final int ONE_TOUCH_RECORD_UNSUPPORTED_CA = 11; // 0xb
-    field public static final int OSD_MESSAGE_ARC_CONNECTED_INVALID_PORT = 1; // 0x1
-    field public static final int OSD_MESSAGE_AVR_VOLUME_CHANGED = 2; // 0x2
-    field public static final int POWER_STATUS_ON = 0; // 0x0
-    field public static final int POWER_STATUS_STANDBY = 1; // 0x1
-    field public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; // 0x2
-    field public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; // 0x3
-    field public static final int POWER_STATUS_UNKNOWN = -1; // 0xffffffff
-    field @Deprecated public static final int RESULT_ALREADY_IN_PROGRESS = 4; // 0x4
-    field public static final int RESULT_COMMUNICATION_FAILED = 7; // 0x7
-    field public static final int RESULT_EXCEPTION = 5; // 0x5
-    field public static final int RESULT_INCORRECT_MODE = 6; // 0x6
-    field public static final int RESULT_SOURCE_NOT_AVAILABLE = 2; // 0x2
-    field public static final int RESULT_SUCCESS = 0; // 0x0
-    field public static final int RESULT_TARGET_NOT_AVAILABLE = 3; // 0x3
-    field public static final int RESULT_TIMEOUT = 1; // 0x1
-    field public static final int TIMER_RECORDING_RESULT_EXTRA_CEC_DISABLED = 3; // 0x3
-    field public static final int TIMER_RECORDING_RESULT_EXTRA_CHECK_RECORDER_CONNECTION = 1; // 0x1
-    field public static final int TIMER_RECORDING_RESULT_EXTRA_FAIL_TO_RECORD_SELECTED_SOURCE = 2; // 0x2
-    field public static final int TIMER_RECORDING_RESULT_EXTRA_NO_ERROR = 0; // 0x0
-    field public static final int TIMER_RECORDING_TYPE_ANALOGUE = 2; // 0x2
-    field public static final int TIMER_RECORDING_TYPE_DIGITAL = 1; // 0x1
-    field public static final int TIMER_RECORDING_TYPE_EXTERNAL = 3; // 0x3
-    field public static final int TIMER_STATUS_MEDIA_INFO_NOT_PRESENT = 2; // 0x2
-    field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_NOT_PROTECTED = 0; // 0x0
-    field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_PROTECTED = 1; // 0x1
-    field public static final int TIMER_STATUS_NOT_PROGRAMMED_CA_NOT_SUPPORTED = 6; // 0x6
-    field public static final int TIMER_STATUS_NOT_PROGRAMMED_CLOCK_FAILURE = 10; // 0xa
-    field public static final int TIMER_STATUS_NOT_PROGRAMMED_DATE_OUT_OF_RANGE = 2; // 0x2
-    field public static final int TIMER_STATUS_NOT_PROGRAMMED_DUPLICATED = 14; // 0xe
-    field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PHYSICAL_NUMBER = 5; // 0x5
-    field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PLUG_NUMBER = 4; // 0x4
-    field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_SEQUENCE = 3; // 0x3
-    field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_CA_ENTITLEMENTS = 7; // 0x7
-    field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_FREE_TIME = 1; // 0x1
-    field public static final int TIMER_STATUS_NOT_PROGRAMMED_PARENTAL_LOCK_ON = 9; // 0x9
-    field public static final int TIMER_STATUS_NOT_PROGRAMMED_UNSUPPORTED_RESOLUTION = 8; // 0x8
-    field public static final int TIMER_STATUS_PROGRAMMED_INFO_ENOUGH_SPACE = 8; // 0x8
-    field public static final int TIMER_STATUS_PROGRAMMED_INFO_MIGHT_NOT_ENOUGH_SPACE = 11; // 0xb
-    field public static final int TIMER_STATUS_PROGRAMMED_INFO_NOT_ENOUGH_SPACE = 9; // 0x9
-    field public static final int TIMER_STATUS_PROGRAMMED_INFO_NO_MEDIA_INFO = 10; // 0xa
-  }
-
-  @IntDef({android.hardware.hdmi.HdmiControlManager.RESULT_SUCCESS, android.hardware.hdmi.HdmiControlManager.RESULT_TIMEOUT, android.hardware.hdmi.HdmiControlManager.RESULT_SOURCE_NOT_AVAILABLE, android.hardware.hdmi.HdmiControlManager.RESULT_TARGET_NOT_AVAILABLE, android.hardware.hdmi.HdmiControlManager.RESULT_ALREADY_IN_PROGRESS, android.hardware.hdmi.HdmiControlManager.RESULT_EXCEPTION, android.hardware.hdmi.HdmiControlManager.RESULT_INCORRECT_MODE, android.hardware.hdmi.HdmiControlManager.RESULT_COMMUNICATION_FAILED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface HdmiControlManager.ControlCallbackResult {
-  }
-
-  public static interface HdmiControlManager.HotplugEventListener {
-    method public void onReceived(android.hardware.hdmi.HdmiHotplugEvent);
-  }
-
-  public static interface HdmiControlManager.VendorCommandListener {
-    method public void onControlStateChanged(boolean, int);
-    method public void onReceived(int, int, byte[], boolean);
-  }
-
-  public class HdmiDeviceInfo implements android.os.Parcelable {
-    ctor public HdmiDeviceInfo();
-    method public int describeContents();
-    method public int getAdopterId();
-    method public int getDeviceId();
-    method public int getDevicePowerStatus();
-    method public int getDeviceType();
-    method public String getDisplayName();
-    method public int getId();
-    method public int getLogicalAddress();
-    method public int getPhysicalAddress();
-    method public int getPortId();
-    method public int getVendorId();
-    method public static int idForCecDevice(int);
-    method public static int idForHardware(int);
-    method public static int idForMhlDevice(int);
-    method public boolean isCecDevice();
-    method public boolean isInactivated();
-    method public boolean isMhlDevice();
-    method public boolean isSourceType();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int ADDR_INTERNAL = 0; // 0x0
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.hdmi.HdmiDeviceInfo> CREATOR;
-    field public static final int DEVICE_AUDIO_SYSTEM = 5; // 0x5
-    field public static final int DEVICE_INACTIVE = -1; // 0xffffffff
-    field public static final int DEVICE_PLAYBACK = 4; // 0x4
-    field public static final int DEVICE_RECORDER = 1; // 0x1
-    field public static final int DEVICE_RESERVED = 2; // 0x2
-    field public static final int DEVICE_TUNER = 3; // 0x3
-    field public static final int DEVICE_TV = 0; // 0x0
-    field public static final int ID_INVALID = 65535; // 0xffff
-    field public static final android.hardware.hdmi.HdmiDeviceInfo INACTIVE_DEVICE;
-    field public static final int PATH_INTERNAL = 0; // 0x0
-    field public static final int PATH_INVALID = 65535; // 0xffff
-    field public static final int PORT_INVALID = -1; // 0xffffffff
-  }
-
-  public final class HdmiHotplugEvent implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getPort();
-    method public boolean isConnected();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.hdmi.HdmiHotplugEvent> CREATOR;
-  }
-
-  public final class HdmiPlaybackClient extends android.hardware.hdmi.HdmiClient {
-    method public int getDeviceType();
-    method public void oneTouchPlay(android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback);
-    method public void queryDisplayStatus(android.hardware.hdmi.HdmiPlaybackClient.DisplayStatusCallback);
-    method public void sendStandby();
-  }
-
-  public static interface HdmiPlaybackClient.DisplayStatusCallback {
-    method public void onComplete(int);
-  }
-
-  public static interface HdmiPlaybackClient.OneTouchPlayCallback {
-    method public void onComplete(int);
-  }
-
-  public final class HdmiPortInfo implements android.os.Parcelable {
-    ctor public HdmiPortInfo(int, int, int, boolean, boolean, boolean);
-    method public int describeContents();
-    method public int getAddress();
-    method public int getId();
-    method public int getType();
-    method public boolean isArcSupported();
-    method public boolean isCecSupported();
-    method public boolean isMhlSupported();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.hdmi.HdmiPortInfo> CREATOR;
-    field public static final int PORT_INPUT = 0; // 0x0
-    field public static final int PORT_OUTPUT = 1; // 0x1
-  }
-
-  public abstract class HdmiRecordListener {
-    ctor public HdmiRecordListener();
-    method public void onClearTimerRecordingResult(int, int);
-    method public void onOneTouchRecordResult(int, int);
-    method public abstract android.hardware.hdmi.HdmiRecordSources.RecordSource onOneTouchRecordSourceRequested(int);
-    method public void onTimerRecordingResult(int, android.hardware.hdmi.HdmiRecordListener.TimerStatusData);
-  }
-
-  public static class HdmiRecordListener.TimerStatusData {
-    method public int getDurationHour();
-    method public int getDurationMinute();
-    method public int getExtraError();
-    method public int getMediaInfo();
-    method public int getNotProgammedError();
-    method public int getProgrammedInfo();
-    method public boolean isOverlapped();
-    method public boolean isProgrammed();
-  }
-
-  public final class HdmiRecordSources {
-    method public static boolean checkRecordSource(byte[]);
-    method public static android.hardware.hdmi.HdmiRecordSources.OwnSource ofOwnSource();
-  }
-
-  public static final class HdmiRecordSources.AnalogueServiceSource extends android.hardware.hdmi.HdmiRecordSources.RecordSource {
-  }
-
-  public static final class HdmiRecordSources.DigitalServiceSource extends android.hardware.hdmi.HdmiRecordSources.RecordSource {
-  }
-
-  public static final class HdmiRecordSources.ExternalPhysicalAddress extends android.hardware.hdmi.HdmiRecordSources.RecordSource {
-  }
-
-  public static final class HdmiRecordSources.ExternalPlugData extends android.hardware.hdmi.HdmiRecordSources.RecordSource {
-  }
-
-  public static final class HdmiRecordSources.OwnSource extends android.hardware.hdmi.HdmiRecordSources.RecordSource {
-  }
-
-  public abstract static class HdmiRecordSources.RecordSource {
-  }
-
-  public class HdmiSwitchClient extends android.hardware.hdmi.HdmiClient {
-    method public int getDeviceType();
-    method @NonNull public java.util.List<android.hardware.hdmi.HdmiPortInfo> getPortInfo();
-    method public void selectPort(int, @NonNull android.hardware.hdmi.HdmiSwitchClient.OnSelectListener);
-    method public void selectPort(int, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.hdmi.HdmiSwitchClient.OnSelectListener);
-  }
-
-  public static interface HdmiSwitchClient.OnSelectListener {
-    method public void onSelect(@android.hardware.hdmi.HdmiControlManager.ControlCallbackResult int);
-  }
-
-  public class HdmiTimerRecordSources {
-    method public static boolean checkTimerRecordSource(int, byte[]);
-    method public static android.hardware.hdmi.HdmiTimerRecordSources.Duration durationOf(int, int);
-    method public static android.hardware.hdmi.HdmiTimerRecordSources.TimerRecordSource ofAnalogueSource(android.hardware.hdmi.HdmiTimerRecordSources.TimerInfo, android.hardware.hdmi.HdmiRecordSources.AnalogueServiceSource);
-    method public static android.hardware.hdmi.HdmiTimerRecordSources.TimerRecordSource ofDigitalSource(android.hardware.hdmi.HdmiTimerRecordSources.TimerInfo, android.hardware.hdmi.HdmiRecordSources.DigitalServiceSource);
-    method public static android.hardware.hdmi.HdmiTimerRecordSources.TimerRecordSource ofExternalPhysicalAddress(android.hardware.hdmi.HdmiTimerRecordSources.TimerInfo, android.hardware.hdmi.HdmiRecordSources.ExternalPhysicalAddress);
-    method public static android.hardware.hdmi.HdmiTimerRecordSources.TimerRecordSource ofExternalPlug(android.hardware.hdmi.HdmiTimerRecordSources.TimerInfo, android.hardware.hdmi.HdmiRecordSources.ExternalPlugData);
-    method public static android.hardware.hdmi.HdmiTimerRecordSources.Time timeOf(int, int);
-    method public static android.hardware.hdmi.HdmiTimerRecordSources.TimerInfo timerInfoOf(int, int, android.hardware.hdmi.HdmiTimerRecordSources.Time, android.hardware.hdmi.HdmiTimerRecordSources.Duration, int);
-    field public static final int RECORDING_SEQUENCE_REPEAT_FRIDAY = 32; // 0x20
-    field public static final int RECORDING_SEQUENCE_REPEAT_MONDAY = 2; // 0x2
-    field public static final int RECORDING_SEQUENCE_REPEAT_ONCE_ONLY = 0; // 0x0
-    field public static final int RECORDING_SEQUENCE_REPEAT_SATUREDAY = 64; // 0x40
-    field public static final int RECORDING_SEQUENCE_REPEAT_SUNDAY = 1; // 0x1
-    field public static final int RECORDING_SEQUENCE_REPEAT_THURSDAY = 16; // 0x10
-    field public static final int RECORDING_SEQUENCE_REPEAT_TUESDAY = 4; // 0x4
-    field public static final int RECORDING_SEQUENCE_REPEAT_WEDNESDAY = 8; // 0x8
-  }
-
-  public static final class HdmiTimerRecordSources.Duration {
-  }
-
-  public static final class HdmiTimerRecordSources.Time {
-  }
-
-  public static final class HdmiTimerRecordSources.TimerInfo {
-  }
-
-  public static final class HdmiTimerRecordSources.TimerRecordSource {
-  }
-
-  public final class HdmiTvClient extends android.hardware.hdmi.HdmiClient {
-    method public void clearTimerRecording(int, int, android.hardware.hdmi.HdmiTimerRecordSources.TimerRecordSource);
-    method public void deviceSelect(int, @NonNull android.hardware.hdmi.HdmiTvClient.SelectCallback);
-    method public java.util.List<android.hardware.hdmi.HdmiDeviceInfo> getDeviceList();
-    method public int getDeviceType();
-    method public void portSelect(int, @NonNull android.hardware.hdmi.HdmiTvClient.SelectCallback);
-    method public void sendMhlVendorCommand(int, int, int, byte[]);
-    method public void sendStandby(int);
-    method public void setHdmiMhlVendorCommandListener(android.hardware.hdmi.HdmiTvClient.HdmiMhlVendorCommandListener);
-    method public void setInputChangeListener(android.hardware.hdmi.HdmiTvClient.InputChangeListener);
-    method public void setRecordListener(@NonNull android.hardware.hdmi.HdmiRecordListener);
-    method public void setSystemAudioMode(boolean, android.hardware.hdmi.HdmiTvClient.SelectCallback);
-    method public void setSystemAudioMute(boolean);
-    method public void setSystemAudioVolume(int, int, int);
-    method public void startOneTouchRecord(int, @NonNull android.hardware.hdmi.HdmiRecordSources.RecordSource);
-    method public void startTimerRecording(int, int, android.hardware.hdmi.HdmiTimerRecordSources.TimerRecordSource);
-    method public void stopOneTouchRecord(int);
-    field public static final int VENDOR_DATA_SIZE = 16; // 0x10
-  }
-
-  public static interface HdmiTvClient.HdmiMhlVendorCommandListener {
-    method public void onReceived(int, int, int, byte[]);
-  }
-
-  public static interface HdmiTvClient.InputChangeListener {
-    method public void onChanged(android.hardware.hdmi.HdmiDeviceInfo);
-  }
-
-  public static interface HdmiTvClient.SelectCallback {
-    method public void onComplete(int);
-  }
-
-}
-
-package android.hardware.lights {
-
-  public final class Light implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getId();
-    method public int getOrdinal();
-    method public int getType();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.lights.Light> CREATOR;
-  }
-
-  public final class LightState implements android.os.Parcelable {
-    ctor public LightState(@ColorInt int);
-    method public int describeContents();
-    method @ColorInt public int getColor();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.lights.LightState> CREATOR;
-  }
-
-  public final class LightsManager {
-    method @NonNull @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public java.util.List<android.hardware.lights.Light> getLights();
-    method @NonNull @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public android.hardware.lights.LightsManager.LightsSession openSession();
-    field public static final int LIGHT_TYPE_MICROPHONE = 8; // 0x8
-  }
-
-  public final class LightsManager.LightsSession implements java.lang.AutoCloseable {
-    method @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public void close();
-    method @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public void requestLights(@NonNull android.hardware.lights.LightsRequest);
-  }
-
-  public final class LightsRequest {
-  }
-
-  public static final class LightsRequest.Builder {
-    ctor public LightsRequest.Builder();
-    method @NonNull public android.hardware.lights.LightsRequest build();
-    method @NonNull public android.hardware.lights.LightsRequest.Builder clearLight(@NonNull android.hardware.lights.Light);
-    method @NonNull public android.hardware.lights.LightsRequest.Builder setLight(@NonNull android.hardware.lights.Light, @NonNull android.hardware.lights.LightState);
-  }
-
-}
-
-package android.hardware.location {
-
-  public class ContextHubClient implements java.io.Closeable {
-    method public void close();
-    method @NonNull public android.hardware.location.ContextHubInfo getAttachedHub();
-    method @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public int sendMessageToNanoApp(@NonNull android.hardware.location.NanoAppMessage);
-  }
-
-  public class ContextHubClientCallback {
-    ctor public ContextHubClientCallback();
-    method public void onHubReset(android.hardware.location.ContextHubClient);
-    method public void onMessageFromNanoApp(android.hardware.location.ContextHubClient, android.hardware.location.NanoAppMessage);
-    method public void onNanoAppAborted(android.hardware.location.ContextHubClient, long, int);
-    method public void onNanoAppDisabled(android.hardware.location.ContextHubClient, long);
-    method public void onNanoAppEnabled(android.hardware.location.ContextHubClient, long);
-    method public void onNanoAppLoaded(android.hardware.location.ContextHubClient, long);
-    method public void onNanoAppUnloaded(android.hardware.location.ContextHubClient, long);
-  }
-
-  public class ContextHubInfo implements android.os.Parcelable {
-    ctor public ContextHubInfo();
-    method public int describeContents();
-    method public byte getChreApiMajorVersion();
-    method public byte getChreApiMinorVersion();
-    method public short getChrePatchVersion();
-    method public long getChrePlatformId();
-    method public int getId();
-    method public int getMaxPacketLengthBytes();
-    method public android.hardware.location.MemoryRegion[] getMemoryRegions();
-    method public String getName();
-    method public float getPeakMips();
-    method public float getPeakPowerDrawMw();
-    method public int getPlatformVersion();
-    method public float getSleepPowerDrawMw();
-    method public int getStaticSwVersion();
-    method public float getStoppedPowerDrawMw();
-    method public int[] getSupportedSensors();
-    method public String getToolchain();
-    method public int getToolchainVersion();
-    method public String getVendor();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.location.ContextHubInfo> CREATOR;
-  }
-
-  public class ContextHubIntentEvent {
-    method @NonNull public static android.hardware.location.ContextHubIntentEvent fromIntent(@NonNull android.content.Intent);
-    method @NonNull public android.hardware.location.ContextHubInfo getContextHubInfo();
-    method public int getEventType();
-    method public int getNanoAppAbortCode();
-    method public long getNanoAppId();
-    method @NonNull public android.hardware.location.NanoAppMessage getNanoAppMessage();
-  }
-
-  public final class ContextHubManager {
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.ContextHubClientCallback, @NonNull java.util.concurrent.Executor);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.ContextHubClientCallback);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.app.PendingIntent, long);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubTransaction<java.lang.Void> disableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubTransaction<java.lang.Void> enableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
-    method @Deprecated @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public int[] findNanoAppOnHub(int, @NonNull android.hardware.location.NanoAppFilter);
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public int[] getContextHubHandles();
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubInfo getContextHubInfo(int);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public java.util.List<android.hardware.location.ContextHubInfo> getContextHubs();
-    method @Deprecated @Nullable @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.NanoAppInstanceInfo getNanoAppInstanceInfo(int);
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public int loadNanoApp(int, @NonNull android.hardware.location.NanoApp);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubTransaction<java.lang.Void> loadNanoApp(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.NanoAppBinary);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubTransaction<java.util.List<android.hardware.location.NanoAppState>> queryNanoApps(@NonNull android.hardware.location.ContextHubInfo);
-    method @Deprecated public int registerCallback(@NonNull android.hardware.location.ContextHubManager.Callback);
-    method @Deprecated public int registerCallback(android.hardware.location.ContextHubManager.Callback, android.os.Handler);
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public int sendMessage(int, int, @NonNull android.hardware.location.ContextHubMessage);
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public int unloadNanoApp(int);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubTransaction<java.lang.Void> unloadNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
-    method @Deprecated public int unregisterCallback(@NonNull android.hardware.location.ContextHubManager.Callback);
-    field public static final int EVENT_HUB_RESET = 6; // 0x6
-    field public static final int EVENT_NANOAPP_ABORTED = 4; // 0x4
-    field public static final int EVENT_NANOAPP_DISABLED = 3; // 0x3
-    field public static final int EVENT_NANOAPP_ENABLED = 2; // 0x2
-    field public static final int EVENT_NANOAPP_LOADED = 0; // 0x0
-    field public static final int EVENT_NANOAPP_MESSAGE = 5; // 0x5
-    field public static final int EVENT_NANOAPP_UNLOADED = 1; // 0x1
-    field public static final String EXTRA_CONTEXT_HUB_INFO = "android.hardware.location.extra.CONTEXT_HUB_INFO";
-    field public static final String EXTRA_EVENT_TYPE = "android.hardware.location.extra.EVENT_TYPE";
-    field public static final String EXTRA_MESSAGE = "android.hardware.location.extra.MESSAGE";
-    field public static final String EXTRA_NANOAPP_ABORT_CODE = "android.hardware.location.extra.NANOAPP_ABORT_CODE";
-    field public static final String EXTRA_NANOAPP_ID = "android.hardware.location.extra.NANOAPP_ID";
-  }
-
-  @Deprecated public abstract static class ContextHubManager.Callback {
-    ctor @Deprecated protected ContextHubManager.Callback();
-    method @Deprecated public abstract void onMessageReceipt(int, int, @NonNull android.hardware.location.ContextHubMessage);
-  }
-
-  @Deprecated public class ContextHubMessage implements android.os.Parcelable {
-    ctor @Deprecated public ContextHubMessage(int, int, byte[]);
-    method @Deprecated public int describeContents();
-    method @Deprecated public byte[] getData();
-    method @Deprecated public int getMsgType();
-    method @Deprecated public int getVersion();
-    method @Deprecated public void setMsgData(byte[]);
-    method @Deprecated public void setMsgType(int);
-    method @Deprecated public void setVersion(int);
-    method @Deprecated public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.hardware.location.ContextHubMessage> CREATOR;
-  }
-
-  public class ContextHubTransaction<T> {
-    method public int getType();
-    method public void setOnCompleteListener(@NonNull android.hardware.location.ContextHubTransaction.OnCompleteListener<T>, @NonNull java.util.concurrent.Executor);
-    method public void setOnCompleteListener(@NonNull android.hardware.location.ContextHubTransaction.OnCompleteListener<T>);
-    method public static String typeToString(int, boolean);
-    method public android.hardware.location.ContextHubTransaction.Response<T> waitForResponse(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException;
-    field public static final int RESULT_FAILED_AT_HUB = 5; // 0x5
-    field public static final int RESULT_FAILED_BAD_PARAMS = 2; // 0x2
-    field public static final int RESULT_FAILED_BUSY = 4; // 0x4
-    field public static final int RESULT_FAILED_HAL_UNAVAILABLE = 8; // 0x8
-    field public static final int RESULT_FAILED_SERVICE_INTERNAL_FAILURE = 7; // 0x7
-    field public static final int RESULT_FAILED_TIMEOUT = 6; // 0x6
-    field public static final int RESULT_FAILED_UNINITIALIZED = 3; // 0x3
-    field public static final int RESULT_FAILED_UNKNOWN = 1; // 0x1
-    field public static final int RESULT_SUCCESS = 0; // 0x0
-    field public static final int TYPE_DISABLE_NANOAPP = 3; // 0x3
-    field public static final int TYPE_ENABLE_NANOAPP = 2; // 0x2
-    field public static final int TYPE_LOAD_NANOAPP = 0; // 0x0
-    field public static final int TYPE_QUERY_NANOAPPS = 4; // 0x4
-    field public static final int TYPE_UNLOAD_NANOAPP = 1; // 0x1
-  }
-
-  @java.lang.FunctionalInterface public static interface ContextHubTransaction.OnCompleteListener<L> {
-    method public void onComplete(android.hardware.location.ContextHubTransaction<L>, android.hardware.location.ContextHubTransaction.Response<L>);
-  }
-
-  public static class ContextHubTransaction.Response<R> {
-    method public R getContents();
-    method public int getResult();
-  }
-
-  public final class GeofenceHardware {
-    method public boolean addGeofence(int, int, android.hardware.location.GeofenceHardwareRequest, android.hardware.location.GeofenceHardwareCallback);
-    method public int[] getMonitoringTypes();
-    method public int getStatusOfMonitoringType(int);
-    method public boolean pauseGeofence(int, int);
-    method public boolean registerForMonitorStateChangeCallback(int, android.hardware.location.GeofenceHardwareMonitorCallback);
-    method public boolean removeGeofence(int, int);
-    method public boolean resumeGeofence(int, int, int);
-    method public boolean unregisterForMonitorStateChangeCallback(int, android.hardware.location.GeofenceHardwareMonitorCallback);
-    field public static final int GEOFENCE_ENTERED = 1; // 0x1
-    field public static final int GEOFENCE_ERROR_ID_EXISTS = 2; // 0x2
-    field public static final int GEOFENCE_ERROR_ID_UNKNOWN = 3; // 0x3
-    field public static final int GEOFENCE_ERROR_INSUFFICIENT_MEMORY = 6; // 0x6
-    field public static final int GEOFENCE_ERROR_INVALID_TRANSITION = 4; // 0x4
-    field public static final int GEOFENCE_ERROR_TOO_MANY_GEOFENCES = 1; // 0x1
-    field public static final int GEOFENCE_EXITED = 2; // 0x2
-    field public static final int GEOFENCE_FAILURE = 5; // 0x5
-    field public static final int GEOFENCE_SUCCESS = 0; // 0x0
-    field public static final int GEOFENCE_UNCERTAIN = 4; // 0x4
-    field public static final int MONITORING_TYPE_FUSED_HARDWARE = 1; // 0x1
-    field public static final int MONITORING_TYPE_GPS_HARDWARE = 0; // 0x0
-    field public static final int MONITOR_CURRENTLY_AVAILABLE = 0; // 0x0
-    field public static final int MONITOR_CURRENTLY_UNAVAILABLE = 1; // 0x1
-    field public static final int MONITOR_UNSUPPORTED = 2; // 0x2
-    field public static final int SOURCE_TECHNOLOGY_BLUETOOTH = 16; // 0x10
-    field public static final int SOURCE_TECHNOLOGY_CELL = 8; // 0x8
-    field public static final int SOURCE_TECHNOLOGY_GNSS = 1; // 0x1
-    field public static final int SOURCE_TECHNOLOGY_SENSORS = 4; // 0x4
-    field public static final int SOURCE_TECHNOLOGY_WIFI = 2; // 0x2
-  }
-
-  public abstract class GeofenceHardwareCallback {
-    ctor public GeofenceHardwareCallback();
-    method public void onGeofenceAdd(int, int);
-    method public void onGeofencePause(int, int);
-    method public void onGeofenceRemove(int, int);
-    method public void onGeofenceResume(int, int);
-    method public void onGeofenceTransition(int, int, android.location.Location, long, int);
-  }
-
-  public abstract class GeofenceHardwareMonitorCallback {
-    ctor public GeofenceHardwareMonitorCallback();
-    method @Deprecated public void onMonitoringSystemChange(int, boolean, android.location.Location);
-    method public void onMonitoringSystemChange(android.hardware.location.GeofenceHardwareMonitorEvent);
-  }
-
-  public class GeofenceHardwareMonitorEvent implements android.os.Parcelable {
-    ctor public GeofenceHardwareMonitorEvent(int, int, int, android.location.Location);
-    method public int describeContents();
-    method public android.location.Location getLocation();
-    method public int getMonitoringStatus();
-    method public int getMonitoringType();
-    method public int getSourceTechnologies();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.location.GeofenceHardwareMonitorEvent> CREATOR;
-  }
-
-  public final class GeofenceHardwareRequest {
-    ctor public GeofenceHardwareRequest();
-    method public static android.hardware.location.GeofenceHardwareRequest createCircularGeofence(double, double, double);
-    method public int getLastTransition();
-    method public double getLatitude();
-    method public double getLongitude();
-    method public int getMonitorTransitions();
-    method public int getNotificationResponsiveness();
-    method public double getRadius();
-    method public int getSourceTechnologies();
-    method public int getUnknownTimer();
-    method public void setLastTransition(int);
-    method public void setMonitorTransitions(int);
-    method public void setNotificationResponsiveness(int);
-    method public void setSourceTechnologies(int);
-    method public void setUnknownTimer(int);
-  }
-
-  public class MemoryRegion implements android.os.Parcelable {
-    ctor public MemoryRegion(android.os.Parcel);
-    method public int describeContents();
-    method public int getCapacityBytes();
-    method public int getFreeCapacityBytes();
-    method public boolean isExecutable();
-    method public boolean isReadable();
-    method public boolean isWritable();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.location.MemoryRegion> CREATOR;
-  }
-
-  @Deprecated public class NanoApp implements android.os.Parcelable {
-    ctor @Deprecated public NanoApp();
-    ctor @Deprecated public NanoApp(int, byte[]);
-    ctor @Deprecated public NanoApp(long, byte[]);
-    method @Deprecated public int describeContents();
-    method @Deprecated public byte[] getAppBinary();
-    method @Deprecated public long getAppId();
-    method @Deprecated public int getAppVersion();
-    method @Deprecated public String getName();
-    method @Deprecated public int getNeededExecMemBytes();
-    method @Deprecated public int getNeededReadMemBytes();
-    method @Deprecated public int[] getNeededSensors();
-    method @Deprecated public int getNeededWriteMemBytes();
-    method @Deprecated public int[] getOutputEvents();
-    method @Deprecated public String getPublisher();
-    method @Deprecated public void setAppBinary(byte[]);
-    method @Deprecated public void setAppId(long);
-    method @Deprecated public void setAppVersion(int);
-    method @Deprecated public void setName(String);
-    method @Deprecated public void setNeededExecMemBytes(int);
-    method @Deprecated public void setNeededReadMemBytes(int);
-    method @Deprecated public void setNeededSensors(int[]);
-    method @Deprecated public void setNeededWriteMemBytes(int);
-    method @Deprecated public void setOutputEvents(int[]);
-    method @Deprecated public void setPublisher(String);
-    method @Deprecated public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.hardware.location.NanoApp> CREATOR;
-  }
-
-  public final class NanoAppBinary implements android.os.Parcelable {
-    ctor public NanoAppBinary(byte[]);
-    method public int describeContents();
-    method public byte[] getBinary();
-    method public byte[] getBinaryNoHeader();
-    method public int getFlags();
-    method public int getHeaderVersion();
-    method public long getHwHubType();
-    method public long getNanoAppId();
-    method public int getNanoAppVersion();
-    method public byte getTargetChreApiMajorVersion();
-    method public byte getTargetChreApiMinorVersion();
-    method public boolean hasValidHeader();
-    method public boolean isEncrypted();
-    method public boolean isSigned();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.location.NanoAppBinary> CREATOR;
-  }
-
-  @Deprecated public class NanoAppFilter implements android.os.Parcelable {
-    ctor @Deprecated public NanoAppFilter(long, int, int, long);
-    method @Deprecated public int describeContents();
-    method @Deprecated public boolean testMatch(android.hardware.location.NanoAppInstanceInfo);
-    method @Deprecated public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated public static final int APP_ANY = -1; // 0xffffffff
-    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.hardware.location.NanoAppFilter> CREATOR;
-    field @Deprecated public static final int FLAGS_VERSION_ANY = -1; // 0xffffffff
-    field @Deprecated public static final int FLAGS_VERSION_GREAT_THAN = 2; // 0x2
-    field @Deprecated public static final int FLAGS_VERSION_LESS_THAN = 4; // 0x4
-    field @Deprecated public static final int FLAGS_VERSION_STRICTLY_EQUAL = 8; // 0x8
-    field @Deprecated public static final int HUB_ANY = -1; // 0xffffffff
-    field @Deprecated public static final int VENDOR_ANY = -1; // 0xffffffff
-  }
-
-  @Deprecated public class NanoAppInstanceInfo implements android.os.Parcelable {
-    ctor @Deprecated public NanoAppInstanceInfo();
-    method @Deprecated public int describeContents();
-    method @Deprecated public long getAppId();
-    method @Deprecated public int getAppVersion();
-    method @Deprecated public int getContexthubId();
-    method @Deprecated public int getHandle();
-    method @Deprecated public String getName();
-    method @Deprecated public int getNeededExecMemBytes();
-    method @Deprecated public int getNeededReadMemBytes();
-    method @Deprecated @NonNull public int[] getNeededSensors();
-    method @Deprecated public int getNeededWriteMemBytes();
-    method @Deprecated @NonNull public int[] getOutputEvents();
-    method @Deprecated public String getPublisher();
-    method @Deprecated public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.hardware.location.NanoAppInstanceInfo> CREATOR;
-  }
-
-  public final class NanoAppMessage implements android.os.Parcelable {
-    method public static android.hardware.location.NanoAppMessage createMessageFromNanoApp(long, int, byte[], boolean);
-    method public static android.hardware.location.NanoAppMessage createMessageToNanoApp(long, int, byte[]);
-    method public int describeContents();
-    method public byte[] getMessageBody();
-    method public int getMessageType();
-    method public long getNanoAppId();
-    method public boolean isBroadcastMessage();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.location.NanoAppMessage> CREATOR;
-  }
-
-  public final class NanoAppState implements android.os.Parcelable {
-    ctor public NanoAppState(long, int, boolean);
-    method public int describeContents();
-    method public long getNanoAppId();
-    method public long getNanoAppVersion();
-    method public boolean isEnabled();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.location.NanoAppState> CREATOR;
-  }
-
-}
-
-package android.hardware.radio {
-
-  public final class Announcement implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.hardware.radio.ProgramSelector getSelector();
-    method public int getType();
-    method @NonNull public java.util.Map<java.lang.String,java.lang.String> getVendorInfo();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.Announcement> CREATOR;
-    field public static final int TYPE_EMERGENCY = 1; // 0x1
-    field public static final int TYPE_EVENT = 6; // 0x6
-    field public static final int TYPE_MISC = 8; // 0x8
-    field public static final int TYPE_NEWS = 5; // 0x5
-    field public static final int TYPE_SPORT = 7; // 0x7
-    field public static final int TYPE_TRAFFIC = 3; // 0x3
-    field public static final int TYPE_WARNING = 2; // 0x2
-    field public static final int TYPE_WEATHER = 4; // 0x4
-  }
-
-  public static interface Announcement.OnListUpdatedListener {
-    method public void onListUpdated(java.util.Collection<android.hardware.radio.Announcement>);
-  }
-
-  public final class ProgramList implements java.lang.AutoCloseable {
-    method public void addOnCompleteListener(@NonNull java.util.concurrent.Executor, @NonNull android.hardware.radio.ProgramList.OnCompleteListener);
-    method public void addOnCompleteListener(@NonNull android.hardware.radio.ProgramList.OnCompleteListener);
-    method public void close();
-    method @Nullable public android.hardware.radio.RadioManager.ProgramInfo get(@NonNull android.hardware.radio.ProgramSelector.Identifier);
-    method public void registerListCallback(@NonNull java.util.concurrent.Executor, @NonNull android.hardware.radio.ProgramList.ListCallback);
-    method public void registerListCallback(@NonNull android.hardware.radio.ProgramList.ListCallback);
-    method public void removeOnCompleteListener(@NonNull android.hardware.radio.ProgramList.OnCompleteListener);
-    method @NonNull public java.util.List<android.hardware.radio.RadioManager.ProgramInfo> toList();
-    method public void unregisterListCallback(@NonNull android.hardware.radio.ProgramList.ListCallback);
-  }
-
-  public static final class ProgramList.Filter implements android.os.Parcelable {
-    ctor public ProgramList.Filter(@NonNull java.util.Set<java.lang.Integer>, @NonNull java.util.Set<android.hardware.radio.ProgramSelector.Identifier>, boolean, boolean);
-    method public boolean areCategoriesIncluded();
-    method public boolean areModificationsExcluded();
-    method public int describeContents();
-    method @NonNull public java.util.Set<java.lang.Integer> getIdentifierTypes();
-    method @NonNull public java.util.Set<android.hardware.radio.ProgramSelector.Identifier> getIdentifiers();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.ProgramList.Filter> CREATOR;
-  }
-
-  public abstract static class ProgramList.ListCallback {
-    ctor public ProgramList.ListCallback();
-    method public void onItemChanged(@NonNull android.hardware.radio.ProgramSelector.Identifier);
-    method public void onItemRemoved(@NonNull android.hardware.radio.ProgramSelector.Identifier);
-  }
-
-  public static interface ProgramList.OnCompleteListener {
-    method public void onComplete();
-  }
-
-  public final class ProgramSelector implements android.os.Parcelable {
-    ctor public ProgramSelector(@android.hardware.radio.ProgramSelector.ProgramType int, @NonNull android.hardware.radio.ProgramSelector.Identifier, @Nullable android.hardware.radio.ProgramSelector.Identifier[], @Nullable long[]);
-    method @NonNull public static android.hardware.radio.ProgramSelector createAmFmSelector(@android.hardware.radio.RadioManager.Band int, int);
-    method @NonNull public static android.hardware.radio.ProgramSelector createAmFmSelector(@android.hardware.radio.RadioManager.Band int, int, int);
-    method public int describeContents();
-    method @NonNull public android.hardware.radio.ProgramSelector.Identifier[] getAllIds(@android.hardware.radio.ProgramSelector.IdentifierType int);
-    method public long getFirstId(@android.hardware.radio.ProgramSelector.IdentifierType int);
-    method @NonNull public android.hardware.radio.ProgramSelector.Identifier getPrimaryId();
-    method @Deprecated @android.hardware.radio.ProgramSelector.ProgramType public int getProgramType();
-    method @NonNull public android.hardware.radio.ProgramSelector.Identifier[] getSecondaryIds();
-    method @Deprecated @NonNull public long[] getVendorIds();
-    method @NonNull public android.hardware.radio.ProgramSelector withSecondaryPreferred(@NonNull android.hardware.radio.ProgramSelector.Identifier);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.ProgramSelector> CREATOR;
-    field public static final int IDENTIFIER_TYPE_AMFM_FREQUENCY = 1; // 0x1
-    field public static final int IDENTIFIER_TYPE_DAB_ENSEMBLE = 6; // 0x6
-    field public static final int IDENTIFIER_TYPE_DAB_FREQUENCY = 8; // 0x8
-    field public static final int IDENTIFIER_TYPE_DAB_SCID = 7; // 0x7
-    field public static final int IDENTIFIER_TYPE_DAB_SIDECC = 5; // 0x5
-    field public static final int IDENTIFIER_TYPE_DAB_SID_EXT = 5; // 0x5
-    field public static final int IDENTIFIER_TYPE_DRMO_FREQUENCY = 10; // 0xa
-    field @Deprecated public static final int IDENTIFIER_TYPE_DRMO_MODULATION = 11; // 0xb
-    field public static final int IDENTIFIER_TYPE_DRMO_SERVICE_ID = 9; // 0x9
-    field public static final int IDENTIFIER_TYPE_HD_STATION_ID_EXT = 3; // 0x3
-    field public static final int IDENTIFIER_TYPE_HD_STATION_NAME = 10004; // 0x2714
-    field @Deprecated public static final int IDENTIFIER_TYPE_HD_SUBCHANNEL = 4; // 0x4
-    field public static final int IDENTIFIER_TYPE_INVALID = 0; // 0x0
-    field public static final int IDENTIFIER_TYPE_RDS_PI = 2; // 0x2
-    field public static final int IDENTIFIER_TYPE_SXM_CHANNEL = 13; // 0xd
-    field public static final int IDENTIFIER_TYPE_SXM_SERVICE_ID = 12; // 0xc
-    field public static final int IDENTIFIER_TYPE_VENDOR_END = 1999; // 0x7cf
-    field @Deprecated public static final int IDENTIFIER_TYPE_VENDOR_PRIMARY_END = 1999; // 0x7cf
-    field @Deprecated public static final int IDENTIFIER_TYPE_VENDOR_PRIMARY_START = 1000; // 0x3e8
-    field public static final int IDENTIFIER_TYPE_VENDOR_START = 1000; // 0x3e8
-    field @Deprecated public static final int PROGRAM_TYPE_AM = 1; // 0x1
-    field @Deprecated public static final int PROGRAM_TYPE_AM_HD = 3; // 0x3
-    field @Deprecated public static final int PROGRAM_TYPE_DAB = 5; // 0x5
-    field @Deprecated public static final int PROGRAM_TYPE_DRMO = 6; // 0x6
-    field @Deprecated public static final int PROGRAM_TYPE_FM = 2; // 0x2
-    field @Deprecated public static final int PROGRAM_TYPE_FM_HD = 4; // 0x4
-    field @Deprecated public static final int PROGRAM_TYPE_INVALID = 0; // 0x0
-    field @Deprecated public static final int PROGRAM_TYPE_SXM = 7; // 0x7
-    field @Deprecated public static final int PROGRAM_TYPE_VENDOR_END = 1999; // 0x7cf
-    field @Deprecated public static final int PROGRAM_TYPE_VENDOR_START = 1000; // 0x3e8
-  }
-
-  public static final class ProgramSelector.Identifier implements android.os.Parcelable {
-    ctor public ProgramSelector.Identifier(@android.hardware.radio.ProgramSelector.IdentifierType int, long);
-    method public int describeContents();
-    method @android.hardware.radio.ProgramSelector.IdentifierType public int getType();
-    method public long getValue();
-    method public boolean isCategoryType();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.ProgramSelector.Identifier> CREATOR;
-  }
-
-  @IntDef(prefix={"IDENTIFIER_TYPE_"}, value={android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_INVALID, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_RDS_PI, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_HD_SUBCHANNEL, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_HD_STATION_NAME, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DAB_SID_EXT, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DAB_SIDECC, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DAB_ENSEMBLE, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DAB_SCID, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DAB_FREQUENCY, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DRMO_SERVICE_ID, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DRMO_FREQUENCY, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_DRMO_MODULATION, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_SXM_SERVICE_ID, android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_SXM_CHANNEL}) @IntRange(from=android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_VENDOR_START, to=android.hardware.radio.ProgramSelector.IDENTIFIER_TYPE_VENDOR_END) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ProgramSelector.IdentifierType {
-  }
-
-  @Deprecated @IntDef(prefix={"PROGRAM_TYPE_"}, value={android.hardware.radio.ProgramSelector.PROGRAM_TYPE_INVALID, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_AM, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_FM, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_AM_HD, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_FM_HD, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_DAB, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_DRMO, android.hardware.radio.ProgramSelector.PROGRAM_TYPE_SXM}) @IntRange(from=android.hardware.radio.ProgramSelector.PROGRAM_TYPE_VENDOR_START, to=android.hardware.radio.ProgramSelector.PROGRAM_TYPE_VENDOR_END) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ProgramSelector.ProgramType {
-  }
-
-  public class RadioManager {
-    method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RADIO) public void addAnnouncementListener(@NonNull java.util.Set<java.lang.Integer>, @NonNull android.hardware.radio.Announcement.OnListUpdatedListener);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RADIO) public void addAnnouncementListener(@NonNull java.util.concurrent.Executor, @NonNull java.util.Set<java.lang.Integer>, @NonNull android.hardware.radio.Announcement.OnListUpdatedListener);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RADIO) public int listModules(java.util.List<android.hardware.radio.RadioManager.ModuleProperties>);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RADIO) public android.hardware.radio.RadioTuner openTuner(int, android.hardware.radio.RadioManager.BandConfig, boolean, android.hardware.radio.RadioTuner.Callback, android.os.Handler);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RADIO) public void removeAnnouncementListener(@NonNull android.hardware.radio.Announcement.OnListUpdatedListener);
-    field public static final int BAND_AM = 0; // 0x0
-    field public static final int BAND_AM_HD = 3; // 0x3
-    field public static final int BAND_FM = 1; // 0x1
-    field public static final int BAND_FM_HD = 2; // 0x2
-    field public static final int BAND_INVALID = -1; // 0xffffffff
-    field public static final int CLASS_AM_FM = 0; // 0x0
-    field public static final int CLASS_DT = 2; // 0x2
-    field public static final int CLASS_SAT = 1; // 0x1
-    field public static final int CONFIG_DAB_DAB_LINKING = 6; // 0x6
-    field public static final int CONFIG_DAB_DAB_SOFT_LINKING = 8; // 0x8
-    field public static final int CONFIG_DAB_FM_LINKING = 7; // 0x7
-    field public static final int CONFIG_DAB_FM_SOFT_LINKING = 9; // 0x9
-    field public static final int CONFIG_FORCE_ANALOG = 2; // 0x2
-    field public static final int CONFIG_FORCE_DIGITAL = 3; // 0x3
-    field public static final int CONFIG_FORCE_MONO = 1; // 0x1
-    field public static final int CONFIG_RDS_AF = 4; // 0x4
-    field public static final int CONFIG_RDS_REG = 5; // 0x5
-    field public static final int REGION_ITU_1 = 0; // 0x0
-    field public static final int REGION_ITU_2 = 1; // 0x1
-    field public static final int REGION_JAPAN = 3; // 0x3
-    field public static final int REGION_KOREA = 4; // 0x4
-    field public static final int REGION_OIRT = 2; // 0x2
-    field public static final int STATUS_BAD_VALUE = -22; // 0xffffffea
-    field public static final int STATUS_DEAD_OBJECT = -32; // 0xffffffe0
-    field public static final int STATUS_ERROR = -2147483648; // 0x80000000
-    field public static final int STATUS_INVALID_OPERATION = -38; // 0xffffffda
-    field public static final int STATUS_NO_INIT = -19; // 0xffffffed
-    field public static final int STATUS_OK = 0; // 0x0
-    field public static final int STATUS_PERMISSION_DENIED = -1; // 0xffffffff
-    field public static final int STATUS_TIMED_OUT = -110; // 0xffffff92
-  }
-
-  public static class RadioManager.AmBandConfig extends android.hardware.radio.RadioManager.BandConfig {
-    method public boolean getStereo();
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.AmBandConfig> CREATOR;
-  }
-
-  public static class RadioManager.AmBandConfig.Builder {
-    ctor public RadioManager.AmBandConfig.Builder(android.hardware.radio.RadioManager.AmBandDescriptor);
-    ctor public RadioManager.AmBandConfig.Builder(android.hardware.radio.RadioManager.AmBandConfig);
-    method public android.hardware.radio.RadioManager.AmBandConfig build();
-    method public android.hardware.radio.RadioManager.AmBandConfig.Builder setStereo(boolean);
-  }
-
-  public static class RadioManager.AmBandDescriptor extends android.hardware.radio.RadioManager.BandDescriptor {
-    method public boolean isStereoSupported();
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.AmBandDescriptor> CREATOR;
-  }
-
-  @IntDef(prefix={"BAND_"}, value={android.hardware.radio.RadioManager.BAND_INVALID, android.hardware.radio.RadioManager.BAND_AM, android.hardware.radio.RadioManager.BAND_FM, android.hardware.radio.RadioManager.BAND_AM_HD, android.hardware.radio.RadioManager.BAND_FM_HD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RadioManager.Band {
-  }
-
-  public static class RadioManager.BandConfig implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getLowerLimit();
-    method public int getRegion();
-    method public int getSpacing();
-    method public int getType();
-    method public int getUpperLimit();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.BandConfig> CREATOR;
-  }
-
-  public static class RadioManager.BandDescriptor implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getLowerLimit();
-    method public int getRegion();
-    method public int getSpacing();
-    method public int getType();
-    method public int getUpperLimit();
-    method public boolean isAmBand();
-    method public boolean isFmBand();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.BandDescriptor> CREATOR;
-  }
-
-  public static class RadioManager.FmBandConfig extends android.hardware.radio.RadioManager.BandConfig {
-    method public boolean getAf();
-    method public boolean getEa();
-    method public boolean getRds();
-    method public boolean getStereo();
-    method public boolean getTa();
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.FmBandConfig> CREATOR;
-  }
-
-  public static class RadioManager.FmBandConfig.Builder {
-    ctor public RadioManager.FmBandConfig.Builder(android.hardware.radio.RadioManager.FmBandDescriptor);
-    ctor public RadioManager.FmBandConfig.Builder(android.hardware.radio.RadioManager.FmBandConfig);
-    method public android.hardware.radio.RadioManager.FmBandConfig build();
-    method public android.hardware.radio.RadioManager.FmBandConfig.Builder setAf(boolean);
-    method public android.hardware.radio.RadioManager.FmBandConfig.Builder setEa(boolean);
-    method public android.hardware.radio.RadioManager.FmBandConfig.Builder setRds(boolean);
-    method public android.hardware.radio.RadioManager.FmBandConfig.Builder setStereo(boolean);
-    method public android.hardware.radio.RadioManager.FmBandConfig.Builder setTa(boolean);
-  }
-
-  public static class RadioManager.FmBandDescriptor extends android.hardware.radio.RadioManager.BandDescriptor {
-    method public boolean isAfSupported();
-    method public boolean isEaSupported();
-    method public boolean isRdsSupported();
-    method public boolean isStereoSupported();
-    method public boolean isTaSupported();
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.FmBandDescriptor> CREATOR;
-  }
-
-  public static class RadioManager.ModuleProperties implements android.os.Parcelable {
-    method public int describeContents();
-    method public android.hardware.radio.RadioManager.BandDescriptor[] getBands();
-    method public int getClassId();
-    method @Nullable public java.util.Map<java.lang.String,java.lang.Integer> getDabFrequencyTable();
-    method public int getId();
-    method public String getImplementor();
-    method public int getNumAudioSources();
-    method public int getNumTuners();
-    method public String getProduct();
-    method public String getSerial();
-    method @NonNull public String getServiceName();
-    method @NonNull public java.util.Map<java.lang.String,java.lang.String> getVendorInfo();
-    method public String getVersion();
-    method public boolean isBackgroundScanningSupported();
-    method public boolean isCaptureSupported();
-    method public boolean isInitializationRequired();
-    method public boolean isProgramIdentifierSupported(@android.hardware.radio.ProgramSelector.IdentifierType int);
-    method public boolean isProgramTypeSupported(@android.hardware.radio.ProgramSelector.ProgramType int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.ModuleProperties> CREATOR;
-  }
-
-  public static class RadioManager.ProgramInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method @Deprecated public int getChannel();
-    method @Nullable public android.hardware.radio.ProgramSelector.Identifier getLogicallyTunedTo();
-    method public android.hardware.radio.RadioMetadata getMetadata();
-    method @Nullable public android.hardware.radio.ProgramSelector.Identifier getPhysicallyTunedTo();
-    method @Nullable public java.util.Collection<android.hardware.radio.ProgramSelector.Identifier> getRelatedContent();
-    method @NonNull public android.hardware.radio.ProgramSelector getSelector();
-    method public int getSignalStrength();
-    method @Deprecated public int getSubChannel();
-    method @NonNull public java.util.Map<java.lang.String,java.lang.String> getVendorInfo();
-    method @Deprecated public boolean isDigital();
-    method public boolean isLive();
-    method public boolean isMuted();
-    method public boolean isStereo();
-    method public boolean isTrafficAnnouncementActive();
-    method public boolean isTrafficProgram();
-    method public boolean isTuned();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.ProgramInfo> CREATOR;
-  }
-
-  public final class RadioMetadata implements android.os.Parcelable {
-    method public boolean containsKey(String);
-    method public int describeContents();
-    method @Deprecated public android.graphics.Bitmap getBitmap(String);
-    method public android.hardware.radio.RadioMetadata.Clock getClock(String);
-    method public int getInt(String);
-    method public String getString(String);
-    method public java.util.Set<java.lang.String> keySet();
-    method public int size();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.RadioMetadata> CREATOR;
-    field public static final String METADATA_KEY_ALBUM = "android.hardware.radio.metadata.ALBUM";
-    field public static final String METADATA_KEY_ART = "android.hardware.radio.metadata.ART";
-    field public static final String METADATA_KEY_ARTIST = "android.hardware.radio.metadata.ARTIST";
-    field public static final String METADATA_KEY_CLOCK = "android.hardware.radio.metadata.CLOCK";
-    field public static final String METADATA_KEY_DAB_COMPONENT_NAME = "android.hardware.radio.metadata.DAB_COMPONENT_NAME";
-    field public static final String METADATA_KEY_DAB_COMPONENT_NAME_SHORT = "android.hardware.radio.metadata.DAB_COMPONENT_NAME_SHORT";
-    field public static final String METADATA_KEY_DAB_ENSEMBLE_NAME = "android.hardware.radio.metadata.DAB_ENSEMBLE_NAME";
-    field public static final String METADATA_KEY_DAB_ENSEMBLE_NAME_SHORT = "android.hardware.radio.metadata.DAB_ENSEMBLE_NAME_SHORT";
-    field public static final String METADATA_KEY_DAB_SERVICE_NAME = "android.hardware.radio.metadata.DAB_SERVICE_NAME";
-    field public static final String METADATA_KEY_DAB_SERVICE_NAME_SHORT = "android.hardware.radio.metadata.DAB_SERVICE_NAME_SHORT";
-    field public static final String METADATA_KEY_GENRE = "android.hardware.radio.metadata.GENRE";
-    field public static final String METADATA_KEY_ICON = "android.hardware.radio.metadata.ICON";
-    field public static final String METADATA_KEY_PROGRAM_NAME = "android.hardware.radio.metadata.PROGRAM_NAME";
-    field public static final String METADATA_KEY_RBDS_PTY = "android.hardware.radio.metadata.RBDS_PTY";
-    field public static final String METADATA_KEY_RDS_PI = "android.hardware.radio.metadata.RDS_PI";
-    field public static final String METADATA_KEY_RDS_PS = "android.hardware.radio.metadata.RDS_PS";
-    field public static final String METADATA_KEY_RDS_PTY = "android.hardware.radio.metadata.RDS_PTY";
-    field public static final String METADATA_KEY_RDS_RT = "android.hardware.radio.metadata.RDS_RT";
-    field public static final String METADATA_KEY_TITLE = "android.hardware.radio.metadata.TITLE";
-  }
-
-  public static final class RadioMetadata.Builder {
-    ctor public RadioMetadata.Builder();
-    ctor public RadioMetadata.Builder(android.hardware.radio.RadioMetadata);
-    method public android.hardware.radio.RadioMetadata build();
-    method public android.hardware.radio.RadioMetadata.Builder putBitmap(String, android.graphics.Bitmap);
-    method public android.hardware.radio.RadioMetadata.Builder putClock(String, long, int);
-    method public android.hardware.radio.RadioMetadata.Builder putInt(String, int);
-    method public android.hardware.radio.RadioMetadata.Builder putString(String, String);
-  }
-
-  public static final class RadioMetadata.Clock implements android.os.Parcelable {
-    ctor public RadioMetadata.Clock(long, int);
-    method public int describeContents();
-    method public int getTimezoneOffsetMinutes();
-    method public long getUtcEpochSeconds();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.radio.RadioMetadata.Clock> CREATOR;
-  }
-
-  public abstract class RadioTuner {
-    ctor public RadioTuner();
-    method public abstract int cancel();
-    method public abstract void cancelAnnouncement();
-    method public abstract void close();
-    method @Deprecated public abstract int getConfiguration(android.hardware.radio.RadioManager.BandConfig[]);
-    method @Nullable public android.hardware.radio.ProgramList getDynamicProgramList(@Nullable android.hardware.radio.ProgramList.Filter);
-    method public abstract boolean getMute();
-    method @NonNull public java.util.Map<java.lang.String,java.lang.String> getParameters(@NonNull java.util.List<java.lang.String>);
-    method @Deprecated public abstract int getProgramInformation(android.hardware.radio.RadioManager.ProgramInfo[]);
-    method @Deprecated @NonNull public abstract java.util.List<android.hardware.radio.RadioManager.ProgramInfo> getProgramList(@Nullable java.util.Map<java.lang.String,java.lang.String>);
-    method public abstract boolean hasControl();
-    method @Deprecated public abstract boolean isAnalogForced();
-    method @Deprecated public abstract boolean isAntennaConnected();
-    method public boolean isConfigFlagSet(int);
-    method public boolean isConfigFlagSupported(int);
-    method public abstract int scan(int, boolean);
-    method @Deprecated public abstract void setAnalogForced(boolean);
-    method public void setConfigFlag(int, boolean);
-    method @Deprecated public abstract int setConfiguration(android.hardware.radio.RadioManager.BandConfig);
-    method public abstract int setMute(boolean);
-    method @NonNull public java.util.Map<java.lang.String,java.lang.String> setParameters(@NonNull java.util.Map<java.lang.String,java.lang.String>);
-    method public abstract boolean startBackgroundScan();
-    method public abstract int step(int, boolean);
-    method @Deprecated public abstract int tune(int, int);
-    method public abstract void tune(@NonNull android.hardware.radio.ProgramSelector);
-    field public static final int DIRECTION_DOWN = 1; // 0x1
-    field public static final int DIRECTION_UP = 0; // 0x0
-    field @Deprecated public static final int ERROR_BACKGROUND_SCAN_FAILED = 6; // 0x6
-    field @Deprecated public static final int ERROR_BACKGROUND_SCAN_UNAVAILABLE = 5; // 0x5
-    field @Deprecated public static final int ERROR_CANCELLED = 2; // 0x2
-    field @Deprecated public static final int ERROR_CONFIG = 4; // 0x4
-    field @Deprecated public static final int ERROR_HARDWARE_FAILURE = 0; // 0x0
-    field @Deprecated public static final int ERROR_SCAN_TIMEOUT = 3; // 0x3
-    field @Deprecated public static final int ERROR_SERVER_DIED = 1; // 0x1
-  }
-
-  public abstract static class RadioTuner.Callback {
-    ctor public RadioTuner.Callback();
-    method public void onAntennaState(boolean);
-    method public void onBackgroundScanAvailabilityChange(boolean);
-    method public void onBackgroundScanComplete();
-    method @Deprecated public void onConfigurationChanged(android.hardware.radio.RadioManager.BandConfig);
-    method public void onControlChanged(boolean);
-    method public void onEmergencyAnnouncement(boolean);
-    method @Deprecated public void onError(int);
-    method @Deprecated public void onMetadataChanged(android.hardware.radio.RadioMetadata);
-    method public void onParametersUpdated(@NonNull java.util.Map<java.lang.String,java.lang.String>);
-    method public void onProgramInfoChanged(android.hardware.radio.RadioManager.ProgramInfo);
-    method public void onProgramListChanged();
-    method public void onTrafficAnnouncement(boolean);
-    method public void onTuneFailed(int, @Nullable android.hardware.radio.ProgramSelector);
-  }
-
-}
-
-package android.hardware.soundtrigger {
-
-  public class SoundTrigger {
-    field public static final int RECOGNITION_MODE_GENERIC = 8; // 0x8
-    field public static final int RECOGNITION_MODE_USER_AUTHENTICATION = 4; // 0x4
-    field public static final int RECOGNITION_MODE_USER_IDENTIFICATION = 2; // 0x2
-    field public static final int RECOGNITION_MODE_VOICE_TRIGGER = 1; // 0x1
-    field public static final int STATUS_OK = 0; // 0x0
-  }
-
-  public static final class SoundTrigger.Keyphrase implements android.os.Parcelable {
-    ctor public SoundTrigger.Keyphrase(int, int, @NonNull java.util.Locale, @NonNull String, @Nullable int[]);
-    method public int getId();
-    method @NonNull public java.util.Locale getLocale();
-    method public int getRecognitionModes();
-    method @NonNull public String getText();
-    method @NonNull public int[] getUsers();
-    method @NonNull public static android.hardware.soundtrigger.SoundTrigger.Keyphrase readFromParcel(@NonNull android.os.Parcel);
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.Keyphrase> CREATOR;
-  }
-
-  public static final class SoundTrigger.KeyphraseSoundModel extends android.hardware.soundtrigger.SoundTrigger.SoundModel implements android.os.Parcelable {
-    ctor public SoundTrigger.KeyphraseSoundModel(@NonNull java.util.UUID, @NonNull java.util.UUID, @Nullable byte[], @Nullable android.hardware.soundtrigger.SoundTrigger.Keyphrase[], int);
-    ctor public SoundTrigger.KeyphraseSoundModel(@NonNull java.util.UUID, @NonNull java.util.UUID, @Nullable byte[], @Nullable android.hardware.soundtrigger.SoundTrigger.Keyphrase[]);
-    method @NonNull public android.hardware.soundtrigger.SoundTrigger.Keyphrase[] getKeyphrases();
-    method @NonNull public static android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel readFromParcel(@NonNull android.os.Parcel);
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel> CREATOR;
-  }
-
-  public static final class SoundTrigger.ModelParamRange implements android.os.Parcelable {
-    method public int getEnd();
-    method public int getStart();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.ModelParamRange> CREATOR;
-  }
-
-  public static final class SoundTrigger.ModuleProperties implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getAudioCapabilities();
-    method @NonNull public String getDescription();
-    method public int getId();
-    method @NonNull public String getImplementor();
-    method public int getMaxBufferMillis();
-    method public int getMaxKeyphrases();
-    method public int getMaxSoundModels();
-    method public int getMaxUsers();
-    method public int getPowerConsumptionMw();
-    method public int getRecognitionModes();
-    method @NonNull public String getSupportedModelArch();
-    method @NonNull public java.util.UUID getUuid();
-    method public int getVersion();
-    method public boolean isCaptureTransitionSupported();
-    method public boolean isConcurrentCaptureSupported();
-    method public boolean isTriggerReturnedInEvent();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int AUDIO_CAPABILITY_ECHO_CANCELLATION = 1; // 0x1
-    field public static final int AUDIO_CAPABILITY_NOISE_SUPPRESSION = 2; // 0x2
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.ModuleProperties> CREATOR;
-  }
-
-  public static class SoundTrigger.RecognitionEvent {
-    method @Nullable public android.media.AudioFormat getCaptureFormat();
-    method public int getCaptureSession();
-    method public byte[] getData();
-    method public boolean isCaptureAvailable();
-  }
-
-  public static class SoundTrigger.SoundModel {
-    method @NonNull public byte[] getData();
-    method public int getType();
-    method @NonNull public java.util.UUID getUuid();
-    method @NonNull public java.util.UUID getVendorUuid();
-    method public int getVersion();
-    field public static final int TYPE_GENERIC_SOUND = 1; // 0x1
-    field public static final int TYPE_KEYPHRASE = 0; // 0x0
-  }
-
-}
-
-package android.hardware.usb {
-
-  public class UsbDeviceConnection {
-    method public boolean resetDevice();
-  }
-
-  public class UsbManager {
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public long getCurrentFunctions();
-    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_USB) public java.util.List<android.hardware.usb.UsbPort> getPorts();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public void grantPermission(android.hardware.usb.UsbDevice, String);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public void resetUsbGadget();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public void setCurrentFunctions(long);
-    field @RequiresPermission(android.Manifest.permission.MANAGE_USB) public static final String ACTION_USB_ACCESSORY_HANDSHAKE = "android.hardware.usb.action.USB_ACCESSORY_HANDSHAKE";
-    field @RequiresPermission(android.Manifest.permission.MANAGE_USB) public static final String ACTION_USB_PORT_CHANGED = "android.hardware.usb.action.USB_PORT_CHANGED";
-    field public static final String ACTION_USB_STATE = "android.hardware.usb.action.USB_STATE";
-    field public static final String EXTRA_ACCESSORY_HANDSHAKE_END = "android.hardware.usb.extra.ACCESSORY_HANDSHAKE_END";
-    field public static final String EXTRA_ACCESSORY_START = "android.hardware.usb.extra.ACCESSORY_START";
-    field public static final String EXTRA_ACCESSORY_STRING_COUNT = "android.hardware.usb.extra.ACCESSORY_STRING_COUNT";
-    field public static final String EXTRA_ACCESSORY_UEVENT_TIME = "android.hardware.usb.extra.ACCESSORY_UEVENT_TIME";
-    field public static final long FUNCTION_ACCESSORY = 2L; // 0x2L
-    field public static final long FUNCTION_ADB = 1L; // 0x1L
-    field public static final long FUNCTION_AUDIO_SOURCE = 64L; // 0x40L
-    field public static final long FUNCTION_MIDI = 8L; // 0x8L
-    field public static final long FUNCTION_MTP = 4L; // 0x4L
-    field public static final long FUNCTION_NCM = 1024L; // 0x400L
-    field public static final long FUNCTION_NONE = 0L; // 0x0L
-    field public static final long FUNCTION_PTP = 16L; // 0x10L
-    field public static final long FUNCTION_RNDIS = 32L; // 0x20L
-    field public static final String USB_CONFIGURED = "configured";
-    field public static final String USB_CONNECTED = "connected";
-    field public static final String USB_FUNCTION_NCM = "ncm";
-    field public static final String USB_FUNCTION_RNDIS = "rndis";
-  }
-
-  public final class UsbPort {
-    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USB) public android.hardware.usb.UsbPortStatus getStatus();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public void setRoles(int, int);
-  }
-
-  public final class UsbPortStatus implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getCurrentDataRole();
-    method public int getCurrentMode();
-    method public int getCurrentPowerRole();
-    method public int getSupportedRoleCombinations();
-    method public boolean isConnected();
-    method public boolean isRoleCombinationSupported(int, int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.usb.UsbPortStatus> CREATOR;
-    field public static final int DATA_ROLE_DEVICE = 2; // 0x2
-    field public static final int DATA_ROLE_HOST = 1; // 0x1
-    field public static final int DATA_ROLE_NONE = 0; // 0x0
-    field public static final int MODE_AUDIO_ACCESSORY = 4; // 0x4
-    field public static final int MODE_DEBUG_ACCESSORY = 8; // 0x8
-    field public static final int MODE_DFP = 2; // 0x2
-    field public static final int MODE_NONE = 0; // 0x0
-    field public static final int MODE_UFP = 1; // 0x1
-    field public static final int POWER_ROLE_NONE = 0; // 0x0
-    field public static final int POWER_ROLE_SINK = 2; // 0x2
-    field public static final int POWER_ROLE_SOURCE = 1; // 0x1
-  }
-
-}
-
-package android.location {
-
-  public abstract class BatchedLocationCallback {
-    ctor public BatchedLocationCallback();
-    method public void onLocationBatch(java.util.List<android.location.Location>);
-  }
-
-  public final class GnssCapabilities {
-    method public boolean hasGeofencing();
-    method public boolean hasLowPowerMode();
-    method public boolean hasMeasurementCorrections();
-    method public boolean hasMeasurementCorrectionsExcessPathLength();
-    method public boolean hasMeasurementCorrectionsLosSats();
-    method public boolean hasMeasurementCorrectionsReflectingPane();
-    method public boolean hasMeasurements();
-    method public boolean hasNavMessages();
-    method @Deprecated public boolean hasSatelliteBlacklist();
-    method public boolean hasSatelliteBlocklist();
-  }
-
-  public final class GnssMeasurementCorrections implements android.os.Parcelable {
-    method public int describeContents();
-    method @FloatRange(from=-1000.0F, to=10000.0f) public double getAltitudeMeters();
-    method @FloatRange(from=0.0f, to=360.0f) public float getEnvironmentBearingDegrees();
-    method @FloatRange(from=0.0f, to=180.0f) public float getEnvironmentBearingUncertaintyDegrees();
-    method @FloatRange(from=0.0f) public double getHorizontalPositionUncertaintyMeters();
-    method @FloatRange(from=-90.0F, to=90.0f) public double getLatitudeDegrees();
-    method @FloatRange(from=-180.0F, to=180.0f) public double getLongitudeDegrees();
-    method @NonNull public java.util.List<android.location.GnssSingleSatCorrection> getSingleSatelliteCorrectionList();
-    method @IntRange(from=0) public long getToaGpsNanosecondsOfWeek();
-    method @FloatRange(from=0.0f) public double getVerticalPositionUncertaintyMeters();
-    method public boolean hasEnvironmentBearing();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.location.GnssMeasurementCorrections> CREATOR;
-  }
-
-  public static final class GnssMeasurementCorrections.Builder {
-    ctor public GnssMeasurementCorrections.Builder();
-    method @NonNull public android.location.GnssMeasurementCorrections build();
-    method @NonNull public android.location.GnssMeasurementCorrections.Builder setAltitudeMeters(@FloatRange(from=-1000.0F, to=10000.0f) double);
-    method @NonNull public android.location.GnssMeasurementCorrections.Builder setEnvironmentBearingDegrees(@FloatRange(from=0.0f, to=360.0f) float);
-    method @NonNull public android.location.GnssMeasurementCorrections.Builder setEnvironmentBearingUncertaintyDegrees(@FloatRange(from=0.0f, to=180.0f) float);
-    method @NonNull public android.location.GnssMeasurementCorrections.Builder setHorizontalPositionUncertaintyMeters(@FloatRange(from=0.0f) double);
-    method @NonNull public android.location.GnssMeasurementCorrections.Builder setLatitudeDegrees(@FloatRange(from=-90.0F, to=90.0f) double);
-    method @NonNull public android.location.GnssMeasurementCorrections.Builder setLongitudeDegrees(@FloatRange(from=-180.0F, to=180.0f) double);
-    method @NonNull public android.location.GnssMeasurementCorrections.Builder setSingleSatelliteCorrectionList(@NonNull java.util.List<android.location.GnssSingleSatCorrection>);
-    method @NonNull public android.location.GnssMeasurementCorrections.Builder setToaGpsNanosecondsOfWeek(@IntRange(from=0) long);
-    method @NonNull public android.location.GnssMeasurementCorrections.Builder setVerticalPositionUncertaintyMeters(@FloatRange(from=0.0f) double);
-  }
-
-  public final class GnssReflectingPlane implements android.os.Parcelable {
-    method public int describeContents();
-    method @FloatRange(from=-1000.0F, to=10000.0f) public double getAltitudeMeters();
-    method @FloatRange(from=0.0f, to=360.0f) public double getAzimuthDegrees();
-    method @FloatRange(from=-90.0F, to=90.0f) public double getLatitudeDegrees();
-    method @FloatRange(from=-180.0F, to=180.0f) public double getLongitudeDegrees();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.location.GnssReflectingPlane> CREATOR;
-  }
-
-  public static final class GnssReflectingPlane.Builder {
-    ctor public GnssReflectingPlane.Builder();
-    method @NonNull public android.location.GnssReflectingPlane build();
-    method @NonNull public android.location.GnssReflectingPlane.Builder setAltitudeMeters(@FloatRange(from=-1000.0F, to=10000.0f) double);
-    method @NonNull public android.location.GnssReflectingPlane.Builder setAzimuthDegrees(@FloatRange(from=0.0f, to=360.0f) double);
-    method @NonNull public android.location.GnssReflectingPlane.Builder setLatitudeDegrees(@FloatRange(from=-90.0F, to=90.0f) double);
-    method @NonNull public android.location.GnssReflectingPlane.Builder setLongitudeDegrees(@FloatRange(from=-180.0F, to=180.0f) double);
-  }
-
-  public final class GnssRequest implements android.os.Parcelable {
-    method public int describeContents();
-    method public boolean isFullTracking();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.location.GnssRequest> CREATOR;
-  }
-
-  public static final class GnssRequest.Builder {
-    ctor public GnssRequest.Builder();
-    ctor public GnssRequest.Builder(@NonNull android.location.GnssRequest);
-    method @NonNull public android.location.GnssRequest build();
-    method @NonNull public android.location.GnssRequest.Builder setFullTracking(boolean);
-  }
-
-  public final class GnssSingleSatCorrection implements android.os.Parcelable {
-    method public int describeContents();
-    method @FloatRange(from=0.0f, fromInclusive=false) public float getCarrierFrequencyHz();
-    method public int getConstellationType();
-    method @FloatRange(from=0.0f) public float getExcessPathLengthMeters();
-    method @FloatRange(from=0.0f) public float getExcessPathLengthUncertaintyMeters();
-    method @FloatRange(from=0.0f, to=1.0f) public float getProbabilityLineOfSight();
-    method @Nullable public android.location.GnssReflectingPlane getReflectingPlane();
-    method @IntRange(from=0) public int getSatelliteId();
-    method public boolean hasExcessPathLength();
-    method public boolean hasExcessPathLengthUncertainty();
-    method public boolean hasReflectingPlane();
-    method public boolean hasValidSatelliteLineOfSight();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.location.GnssSingleSatCorrection> CREATOR;
-  }
-
-  public static final class GnssSingleSatCorrection.Builder {
-    ctor public GnssSingleSatCorrection.Builder();
-    method @NonNull public android.location.GnssSingleSatCorrection build();
-    method @NonNull public android.location.GnssSingleSatCorrection.Builder setCarrierFrequencyHz(@FloatRange(from=0.0f, fromInclusive=false) float);
-    method @NonNull public android.location.GnssSingleSatCorrection.Builder setConstellationType(int);
-    method @NonNull public android.location.GnssSingleSatCorrection.Builder setExcessPathLengthMeters(@FloatRange(from=0.0f) float);
-    method @NonNull public android.location.GnssSingleSatCorrection.Builder setExcessPathLengthUncertaintyMeters(@FloatRange(from=0.0f) float);
-    method @NonNull public android.location.GnssSingleSatCorrection.Builder setProbabilityLineOfSight(@FloatRange(from=0.0f, to=1.0f) float);
-    method @NonNull public android.location.GnssSingleSatCorrection.Builder setReflectingPlane(@Nullable android.location.GnssReflectingPlane);
-    method @NonNull public android.location.GnssSingleSatCorrection.Builder setSatelliteId(@IntRange(from=0) int);
-  }
-
-  @Deprecated public class GpsClock implements android.os.Parcelable {
-    method @Deprecated public int describeContents();
-    method @Deprecated public double getBiasInNs();
-    method @Deprecated public double getBiasUncertaintyInNs();
-    method @Deprecated public double getDriftInNsPerSec();
-    method @Deprecated public double getDriftUncertaintyInNsPerSec();
-    method @Deprecated public long getFullBiasInNs();
-    method @Deprecated public short getLeapSecond();
-    method @Deprecated public long getTimeInNs();
-    method @Deprecated public double getTimeUncertaintyInNs();
-    method @Deprecated public byte getType();
-    method @Deprecated public boolean hasBiasInNs();
-    method @Deprecated public boolean hasBiasUncertaintyInNs();
-    method @Deprecated public boolean hasDriftInNsPerSec();
-    method @Deprecated public boolean hasDriftUncertaintyInNsPerSec();
-    method @Deprecated public boolean hasFullBiasInNs();
-    method @Deprecated public boolean hasLeapSecond();
-    method @Deprecated public boolean hasTimeUncertaintyInNs();
-    method @Deprecated public void reset();
-    method @Deprecated public void resetBiasInNs();
-    method @Deprecated public void resetBiasUncertaintyInNs();
-    method @Deprecated public void resetDriftInNsPerSec();
-    method @Deprecated public void resetDriftUncertaintyInNsPerSec();
-    method @Deprecated public void resetFullBiasInNs();
-    method @Deprecated public void resetLeapSecond();
-    method @Deprecated public void resetTimeUncertaintyInNs();
-    method @Deprecated public void set(android.location.GpsClock);
-    method @Deprecated public void setBiasInNs(double);
-    method @Deprecated public void setBiasUncertaintyInNs(double);
-    method @Deprecated public void setDriftInNsPerSec(double);
-    method @Deprecated public void setDriftUncertaintyInNsPerSec(double);
-    method @Deprecated public void setFullBiasInNs(long);
-    method @Deprecated public void setLeapSecond(short);
-    method @Deprecated public void setTimeInNs(long);
-    method @Deprecated public void setTimeUncertaintyInNs(double);
-    method @Deprecated public void setType(byte);
-    method @Deprecated public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.location.GpsClock> CREATOR;
-    field @Deprecated public static final byte TYPE_GPS_TIME = 2; // 0x2
-    field @Deprecated public static final byte TYPE_LOCAL_HW_TIME = 1; // 0x1
-    field @Deprecated public static final byte TYPE_UNKNOWN = 0; // 0x0
-  }
-
-  @Deprecated public class GpsMeasurement implements android.os.Parcelable {
-    method @Deprecated public int describeContents();
-    method @Deprecated public double getAccumulatedDeltaRangeInMeters();
-    method @Deprecated public short getAccumulatedDeltaRangeState();
-    method @Deprecated public double getAccumulatedDeltaRangeUncertaintyInMeters();
-    method @Deprecated public double getAzimuthInDeg();
-    method @Deprecated public double getAzimuthUncertaintyInDeg();
-    method @Deprecated public int getBitNumber();
-    method @Deprecated public long getCarrierCycles();
-    method @Deprecated public float getCarrierFrequencyInHz();
-    method @Deprecated public double getCarrierPhase();
-    method @Deprecated public double getCarrierPhaseUncertainty();
-    method @Deprecated public double getCn0InDbHz();
-    method @Deprecated public double getCodePhaseInChips();
-    method @Deprecated public double getCodePhaseUncertaintyInChips();
-    method @Deprecated public double getDopplerShiftInHz();
-    method @Deprecated public double getDopplerShiftUncertaintyInHz();
-    method @Deprecated public double getElevationInDeg();
-    method @Deprecated public double getElevationUncertaintyInDeg();
-    method @Deprecated public byte getLossOfLock();
-    method @Deprecated public byte getMultipathIndicator();
-    method @Deprecated public byte getPrn();
-    method @Deprecated public double getPseudorangeInMeters();
-    method @Deprecated public double getPseudorangeRateInMetersPerSec();
-    method @Deprecated public double getPseudorangeRateUncertaintyInMetersPerSec();
-    method @Deprecated public double getPseudorangeUncertaintyInMeters();
-    method @Deprecated public long getReceivedGpsTowInNs();
-    method @Deprecated public long getReceivedGpsTowUncertaintyInNs();
-    method @Deprecated public double getSnrInDb();
-    method @Deprecated public short getState();
-    method @Deprecated public short getTimeFromLastBitInMs();
-    method @Deprecated public double getTimeOffsetInNs();
-    method @Deprecated public boolean hasAzimuthInDeg();
-    method @Deprecated public boolean hasAzimuthUncertaintyInDeg();
-    method @Deprecated public boolean hasBitNumber();
-    method @Deprecated public boolean hasCarrierCycles();
-    method @Deprecated public boolean hasCarrierFrequencyInHz();
-    method @Deprecated public boolean hasCarrierPhase();
-    method @Deprecated public boolean hasCarrierPhaseUncertainty();
-    method @Deprecated public boolean hasCodePhaseInChips();
-    method @Deprecated public boolean hasCodePhaseUncertaintyInChips();
-    method @Deprecated public boolean hasDopplerShiftInHz();
-    method @Deprecated public boolean hasDopplerShiftUncertaintyInHz();
-    method @Deprecated public boolean hasElevationInDeg();
-    method @Deprecated public boolean hasElevationUncertaintyInDeg();
-    method @Deprecated public boolean hasPseudorangeInMeters();
-    method @Deprecated public boolean hasPseudorangeUncertaintyInMeters();
-    method @Deprecated public boolean hasSnrInDb();
-    method @Deprecated public boolean hasTimeFromLastBitInMs();
-    method @Deprecated public boolean isPseudorangeRateCorrected();
-    method @Deprecated public boolean isUsedInFix();
-    method @Deprecated public void reset();
-    method @Deprecated public void resetAzimuthInDeg();
-    method @Deprecated public void resetAzimuthUncertaintyInDeg();
-    method @Deprecated public void resetBitNumber();
-    method @Deprecated public void resetCarrierCycles();
-    method @Deprecated public void resetCarrierFrequencyInHz();
-    method @Deprecated public void resetCarrierPhase();
-    method @Deprecated public void resetCarrierPhaseUncertainty();
-    method @Deprecated public void resetCodePhaseInChips();
-    method @Deprecated public void resetCodePhaseUncertaintyInChips();
-    method @Deprecated public void resetDopplerShiftInHz();
-    method @Deprecated public void resetDopplerShiftUncertaintyInHz();
-    method @Deprecated public void resetElevationInDeg();
-    method @Deprecated public void resetElevationUncertaintyInDeg();
-    method @Deprecated public void resetPseudorangeInMeters();
-    method @Deprecated public void resetPseudorangeUncertaintyInMeters();
-    method @Deprecated public void resetSnrInDb();
-    method @Deprecated public void resetTimeFromLastBitInMs();
-    method @Deprecated public void set(android.location.GpsMeasurement);
-    method @Deprecated public void setAccumulatedDeltaRangeInMeters(double);
-    method @Deprecated public void setAccumulatedDeltaRangeState(short);
-    method @Deprecated public void setAccumulatedDeltaRangeUncertaintyInMeters(double);
-    method @Deprecated public void setAzimuthInDeg(double);
-    method @Deprecated public void setAzimuthUncertaintyInDeg(double);
-    method @Deprecated public void setBitNumber(int);
-    method @Deprecated public void setCarrierCycles(long);
-    method @Deprecated public void setCarrierFrequencyInHz(float);
-    method @Deprecated public void setCarrierPhase(double);
-    method @Deprecated public void setCarrierPhaseUncertainty(double);
-    method @Deprecated public void setCn0InDbHz(double);
-    method @Deprecated public void setCodePhaseInChips(double);
-    method @Deprecated public void setCodePhaseUncertaintyInChips(double);
-    method @Deprecated public void setDopplerShiftInHz(double);
-    method @Deprecated public void setDopplerShiftUncertaintyInHz(double);
-    method @Deprecated public void setElevationInDeg(double);
-    method @Deprecated public void setElevationUncertaintyInDeg(double);
-    method @Deprecated public void setLossOfLock(byte);
-    method @Deprecated public void setMultipathIndicator(byte);
-    method @Deprecated public void setPrn(byte);
-    method @Deprecated public void setPseudorangeInMeters(double);
-    method @Deprecated public void setPseudorangeRateInMetersPerSec(double);
-    method @Deprecated public void setPseudorangeRateUncertaintyInMetersPerSec(double);
-    method @Deprecated public void setPseudorangeUncertaintyInMeters(double);
-    method @Deprecated public void setReceivedGpsTowInNs(long);
-    method @Deprecated public void setReceivedGpsTowUncertaintyInNs(long);
-    method @Deprecated public void setSnrInDb(double);
-    method @Deprecated public void setState(short);
-    method @Deprecated public void setTimeFromLastBitInMs(short);
-    method @Deprecated public void setTimeOffsetInNs(double);
-    method @Deprecated public void setUsedInFix(boolean);
-    method @Deprecated public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated public static final short ADR_STATE_CYCLE_SLIP = 4; // 0x4
-    field @Deprecated public static final short ADR_STATE_RESET = 2; // 0x2
-    field @Deprecated public static final short ADR_STATE_UNKNOWN = 0; // 0x0
-    field @Deprecated public static final short ADR_STATE_VALID = 1; // 0x1
-    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.location.GpsMeasurement> CREATOR;
-    field @Deprecated public static final byte LOSS_OF_LOCK_CYCLE_SLIP = 2; // 0x2
-    field @Deprecated public static final byte LOSS_OF_LOCK_OK = 1; // 0x1
-    field @Deprecated public static final byte LOSS_OF_LOCK_UNKNOWN = 0; // 0x0
-    field @Deprecated public static final byte MULTIPATH_INDICATOR_DETECTED = 1; // 0x1
-    field @Deprecated public static final byte MULTIPATH_INDICATOR_NOT_USED = 2; // 0x2
-    field @Deprecated public static final byte MULTIPATH_INDICATOR_UNKNOWN = 0; // 0x0
-    field @Deprecated public static final short STATE_BIT_SYNC = 2; // 0x2
-    field @Deprecated public static final short STATE_CODE_LOCK = 1; // 0x1
-    field @Deprecated public static final short STATE_MSEC_AMBIGUOUS = 16; // 0x10
-    field @Deprecated public static final short STATE_SUBFRAME_SYNC = 4; // 0x4
-    field @Deprecated public static final short STATE_TOW_DECODED = 8; // 0x8
-    field @Deprecated public static final short STATE_UNKNOWN = 0; // 0x0
-  }
-
-  @Deprecated public class GpsMeasurementsEvent implements android.os.Parcelable {
-    ctor @Deprecated public GpsMeasurementsEvent(android.location.GpsClock, android.location.GpsMeasurement[]);
-    method @Deprecated public int describeContents();
-    method @Deprecated @NonNull public android.location.GpsClock getClock();
-    method @Deprecated @NonNull public java.util.Collection<android.location.GpsMeasurement> getMeasurements();
-    method @Deprecated public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.location.GpsMeasurementsEvent> CREATOR;
-    field @Deprecated public static final int STATUS_GPS_LOCATION_DISABLED = 2; // 0x2
-    field @Deprecated public static final int STATUS_NOT_SUPPORTED = 0; // 0x0
-    field @Deprecated public static final int STATUS_READY = 1; // 0x1
-  }
-
-  @Deprecated public static interface GpsMeasurementsEvent.Listener {
-    method @Deprecated public void onGpsMeasurementsReceived(android.location.GpsMeasurementsEvent);
-    method @Deprecated public void onStatusChanged(int);
-  }
-
-  @Deprecated public class GpsNavigationMessage implements android.os.Parcelable {
-    method @Deprecated public int describeContents();
-    method @Deprecated @NonNull public byte[] getData();
-    method @Deprecated public short getMessageId();
-    method @Deprecated public byte getPrn();
-    method @Deprecated public short getStatus();
-    method @Deprecated public short getSubmessageId();
-    method @Deprecated public byte getType();
-    method @Deprecated public void reset();
-    method @Deprecated public void set(android.location.GpsNavigationMessage);
-    method @Deprecated public void setData(byte[]);
-    method @Deprecated public void setMessageId(short);
-    method @Deprecated public void setPrn(byte);
-    method @Deprecated public void setStatus(short);
-    method @Deprecated public void setSubmessageId(short);
-    method @Deprecated public void setType(byte);
-    method @Deprecated public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.location.GpsNavigationMessage> CREATOR;
-    field @Deprecated public static final short STATUS_PARITY_PASSED = 1; // 0x1
-    field @Deprecated public static final short STATUS_PARITY_REBUILT = 2; // 0x2
-    field @Deprecated public static final short STATUS_UNKNOWN = 0; // 0x0
-    field @Deprecated public static final byte TYPE_CNAV2 = 4; // 0x4
-    field @Deprecated public static final byte TYPE_L1CA = 1; // 0x1
-    field @Deprecated public static final byte TYPE_L2CNAV = 2; // 0x2
-    field @Deprecated public static final byte TYPE_L5CNAV = 3; // 0x3
-    field @Deprecated public static final byte TYPE_UNKNOWN = 0; // 0x0
-  }
-
-  @Deprecated public class GpsNavigationMessageEvent implements android.os.Parcelable {
-    ctor @Deprecated public GpsNavigationMessageEvent(android.location.GpsNavigationMessage);
-    method @Deprecated public int describeContents();
-    method @Deprecated @NonNull public android.location.GpsNavigationMessage getNavigationMessage();
-    method @Deprecated public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.location.GpsNavigationMessageEvent> CREATOR;
-    field @Deprecated public static int STATUS_GPS_LOCATION_DISABLED;
-    field @Deprecated public static int STATUS_NOT_SUPPORTED;
-    field @Deprecated public static int STATUS_READY;
-  }
-
-  @Deprecated public static interface GpsNavigationMessageEvent.Listener {
-    method @Deprecated public void onGpsNavigationMessageReceived(android.location.GpsNavigationMessageEvent);
-    method @Deprecated public void onStatusChanged(int);
-  }
-
-  public class Location implements android.os.Parcelable {
-    method public boolean isComplete();
-    method public void makeComplete();
-    method public void setIsFromMockProvider(boolean);
-    field @Deprecated public static final String EXTRA_NO_GPS_LOCATION = "noGPSLocation";
-  }
-
-  public class LocationManager {
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void flushGnssBatch();
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void getCurrentLocation(@NonNull android.location.LocationRequest, @Nullable android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.location.Location>);
-    method @Nullable public String getExtraLocationControllerPackage();
-    method @Deprecated public int getGnssBatchSize();
-    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void injectGnssMeasurementCorrections(@NonNull android.location.GnssMeasurementCorrections);
-    method public boolean isExtraLocationControllerPackageEnabled();
-    method public boolean isLocationEnabledForUser(@NonNull android.os.UserHandle);
-    method public boolean isProviderEnabledForUser(@NonNull String, @NonNull android.os.UserHandle);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public boolean isProviderPackage(@NonNull String);
-    method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public boolean isProviderPackage(@Nullable String, @NonNull String);
-    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.UPDATE_APP_OPS_STATS}) public boolean registerGnssBatchedLocationCallback(long, boolean, @NonNull android.location.BatchedLocationCallback, @Nullable android.os.Handler);
-    method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.LOCATION_HARDWARE}) public boolean registerGnssMeasurementsCallback(@NonNull android.location.GnssRequest, @NonNull java.util.concurrent.Executor, @NonNull android.location.GnssMeasurementsEvent.Callback);
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull android.location.LocationListener, @Nullable android.os.Looper);
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull java.util.concurrent.Executor, @NonNull android.location.LocationListener);
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull android.app.PendingIntent);
-    method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setExtraLocationControllerPackage(@Nullable String);
-    method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setExtraLocationControllerPackageEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setLocationEnabledForUser(boolean, @NonNull android.os.UserHandle);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean setProviderEnabledForUser(@NonNull String, boolean, @NonNull android.os.UserHandle);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean unregisterGnssBatchedLocationCallback(@NonNull android.location.BatchedLocationCallback);
-  }
-
-  public final class LocationRequest implements android.os.Parcelable {
-    method @Deprecated @NonNull public static android.location.LocationRequest create();
-    method @Deprecated @NonNull public static android.location.LocationRequest createFromDeprecatedCriteria(@NonNull android.location.Criteria, long, float, boolean);
-    method @Deprecated @NonNull public static android.location.LocationRequest createFromDeprecatedProvider(@NonNull String, long, float, boolean);
-    method @Deprecated public long getExpireAt();
-    method @Deprecated public long getExpireIn();
-    method @Deprecated public long getFastestInterval();
-    method @Deprecated public boolean getHideFromAppOps();
-    method @Deprecated public long getInterval();
-    method @Deprecated public int getNumUpdates();
-    method @Deprecated @NonNull public String getProvider();
-    method @Deprecated public float getSmallestDisplacement();
-    method @NonNull public android.os.WorkSource getWorkSource();
-    method public boolean isHiddenFromAppOps();
-    method public boolean isLocationSettingsIgnored();
-    method public boolean isLowPower();
-    method @Deprecated public boolean isLowPowerMode();
-    method @Deprecated @NonNull public android.location.LocationRequest setExpireAt(long);
-    method @Deprecated @NonNull public android.location.LocationRequest setExpireIn(long);
-    method @Deprecated @NonNull public android.location.LocationRequest setFastestInterval(long);
-    method @Deprecated public void setHideFromAppOps(boolean);
-    method @Deprecated @NonNull public android.location.LocationRequest setInterval(long);
-    method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public android.location.LocationRequest setLocationSettingsIgnored(boolean);
-    method @Deprecated @NonNull public android.location.LocationRequest setLowPowerMode(boolean);
-    method @Deprecated @NonNull public android.location.LocationRequest setNumUpdates(int);
-    method @Deprecated @NonNull public android.location.LocationRequest setProvider(@NonNull String);
-    method @Deprecated @NonNull public android.location.LocationRequest setQuality(int);
-    method @Deprecated @NonNull public android.location.LocationRequest setSmallestDisplacement(float);
-    method @Deprecated public void setWorkSource(@Nullable android.os.WorkSource);
-    field @Deprecated public static final int ACCURACY_BLOCK = 102; // 0x66
-    field @Deprecated public static final int ACCURACY_CITY = 104; // 0x68
-    field @Deprecated public static final int ACCURACY_FINE = 100; // 0x64
-    field @Deprecated public static final int POWER_HIGH = 203; // 0xcb
-    field @Deprecated public static final int POWER_LOW = 201; // 0xc9
-    field @Deprecated public static final int POWER_NONE = 200; // 0xc8
-  }
-
-  public static final class LocationRequest.Builder {
-    method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_APP_OPS_STATS) public android.location.LocationRequest.Builder setHiddenFromAppOps(boolean);
-    method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public android.location.LocationRequest.Builder setLocationSettingsIgnored(boolean);
-    method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.location.LocationRequest.Builder setLowPower(boolean);
-    method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public android.location.LocationRequest.Builder setWorkSource(@Nullable android.os.WorkSource);
-  }
-
-  public final class LocationResult implements android.os.Parcelable {
-    method @NonNull public static android.location.LocationResult wrap(@NonNull android.location.Location);
-  }
-
-}
-
-package android.media {
-
-  public final class AudioAttributes implements android.os.Parcelable {
-    method public int getAllFlags();
-    method public android.os.Bundle getBundle();
-    method public int getCapturePreset();
-    method public int getSystemUsage();
-    method public static boolean isSystemUsage(int);
-    field public static final int FLAG_BEACON = 8; // 0x8
-    field public static final int FLAG_BYPASS_INTERRUPTION_POLICY = 64; // 0x40
-    field public static final int FLAG_BYPASS_MUTE = 128; // 0x80
-    field public static final int FLAG_HW_HOTWORD = 32; // 0x20
-    field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int USAGE_ANNOUNCEMENT = 1003; // 0x3eb
-    field @RequiresPermission(allOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.MODIFY_AUDIO_ROUTING}) public static final int USAGE_CALL_ASSISTANT = 17; // 0x11
-    field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int USAGE_EMERGENCY = 1000; // 0x3e8
-    field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int USAGE_SAFETY = 1001; // 0x3e9
-    field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int USAGE_VEHICLE_STATUS = 1002; // 0x3ea
-  }
-
-  public static class AudioAttributes.Builder {
-    method public android.media.AudioAttributes.Builder addBundle(@NonNull android.os.Bundle);
-    method public android.media.AudioAttributes.Builder setCapturePreset(int);
-    method public android.media.AudioAttributes.Builder setInternalCapturePreset(int);
-    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioAttributes.Builder setSystemUsage(int);
-  }
-
-  public final class AudioDeviceAttributes implements android.os.Parcelable {
-    ctor public AudioDeviceAttributes(@NonNull android.media.AudioDeviceInfo);
-    ctor public AudioDeviceAttributes(int, int, @NonNull String);
-    method public int describeContents();
-    method @NonNull public String getAddress();
-    method public int getRole();
-    method public int getType();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.media.AudioDeviceAttributes> CREATOR;
-    field public static final int ROLE_INPUT = 1; // 0x1
-    field public static final int ROLE_OUTPUT = 2; // 0x2
-  }
-
-  public final class AudioFocusInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.media.AudioAttributes getAttributes();
-    method @NonNull public String getClientId();
-    method public int getClientUid();
-    method public int getFlags();
-    method public int getGainRequest();
-    method public int getLossReceived();
-    method @NonNull public String getPackageName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.media.AudioFocusInfo> CREATOR;
-  }
-
-  public final class AudioFocusRequest {
-    method public boolean locksFocus();
-  }
-
-  public static final class AudioFocusRequest.Builder {
-    method @NonNull public android.media.AudioFocusRequest.Builder setLocksFocus(boolean);
-  }
-
-  public class AudioManager {
-    method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDeviceForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener) throws java.lang.SecurityException;
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDevicesForCapturePresetChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDevicesForCapturePresetChangedListener) throws java.lang.SecurityException;
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDevicesForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDevicesForStrategyChangedListener) throws java.lang.SecurityException;
-    method public void clearAudioServerStateCallback();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean clearPreferredDevicesForCapturePreset(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
-    method @IntRange(from=0) public long getAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo);
-    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioProductStrategy> getAudioProductStrategies();
-    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioVolumeGroup> getAudioVolumeGroups();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes);
-    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<android.media.AudioDeviceAttributes> getDevicesForAttributes(@NonNull android.media.AudioAttributes);
-    method @IntRange(from=0) public long getMaxAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo);
-    method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMaxVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
-    method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMinVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
-    method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioDeviceAttributes getPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
-    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<android.media.AudioDeviceAttributes> getPreferredDevicesForCapturePreset(int);
-    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<android.media.AudioDeviceAttributes> getPreferredDevicesForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
-    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int[] getSupportedSystemUsages();
-    method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
-    method public boolean isAudioServerRunning();
-    method public boolean isHdmiSystemAudioSupported();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
-    method public void registerVolumeGroupCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.VolumeGroupCallback);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDeviceForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDevicesForCapturePresetChangedListener(@NonNull android.media.AudioManager.OnPreferredDevicesForCapturePresetChangedListener);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDevicesForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDevicesForStrategyChangedListener);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean removePreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException;
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.MODIFY_AUDIO_ROUTING}) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException;
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int requestAudioFocus(@NonNull android.media.AudioFocusRequest, @Nullable android.media.audiopolicy.AudioPolicy);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo, @IntRange(from=0) long);
-    method public void setAudioServerStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioServerStateCallback);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForCapturePreset(int, @NonNull android.media.AudioDeviceAttributes);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull android.media.AudioDeviceAttributes);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDevicesForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull java.util.List<android.media.AudioDeviceAttributes>);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setSupportedSystemUsages(@NonNull int[]);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setVolumeIndexForAttributes(@NonNull android.media.AudioAttributes, int, int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicyAsync(@NonNull android.media.audiopolicy.AudioPolicy);
-    method public void unregisterVolumeGroupCallback(@NonNull android.media.AudioManager.VolumeGroupCallback);
-    field public static final int AUDIOFOCUS_FLAG_DELAY_OK = 1; // 0x1
-    field public static final int AUDIOFOCUS_FLAG_LOCK = 4; // 0x4
-    field public static final int AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS = 2; // 0x2
-    field public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE = 3; // 0x3
-    field public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE = 4; // 0x4
-    field public static final int DEVICE_VOLUME_BEHAVIOR_FIXED = 2; // 0x2
-    field public static final int DEVICE_VOLUME_BEHAVIOR_FULL = 1; // 0x1
-    field public static final int DEVICE_VOLUME_BEHAVIOR_VARIABLE = 0; // 0x0
-    field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int STREAM_ASSISTANT = 11; // 0xb
-    field public static final int SUCCESS = 0; // 0x0
-  }
-
-  public abstract static class AudioManager.AudioServerStateCallback {
-    ctor public AudioManager.AudioServerStateCallback();
-    method public void onAudioServerDown();
-    method public void onAudioServerUp();
-  }
-
-  @Deprecated public static interface AudioManager.OnPreferredDeviceForStrategyChangedListener {
-    method @Deprecated public void onPreferredDeviceForStrategyChanged(@NonNull android.media.audiopolicy.AudioProductStrategy, @Nullable android.media.AudioDeviceAttributes);
-  }
-
-  public static interface AudioManager.OnPreferredDevicesForCapturePresetChangedListener {
-    method public void onPreferredDevicesForCapturePresetChanged(int, @NonNull java.util.List<android.media.AudioDeviceAttributes>);
-  }
-
-  public static interface AudioManager.OnPreferredDevicesForStrategyChangedListener {
-    method public void onPreferredDevicesForStrategyChanged(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull java.util.List<android.media.AudioDeviceAttributes>);
-  }
-
-  public abstract static class AudioManager.VolumeGroupCallback {
-    ctor public AudioManager.VolumeGroupCallback();
-    method public void onAudioVolumeGroupChanged(int, int);
-  }
-
-  public final class AudioPlaybackConfiguration implements android.os.Parcelable {
-    method public int getClientPid();
-    method public int getClientUid();
-    method public int getPlayerInterfaceId();
-    method public android.media.PlayerProxy getPlayerProxy();
-    method public int getPlayerState();
-    method public int getPlayerType();
-    method public boolean isActive();
-    field public static final int PLAYER_STATE_IDLE = 1; // 0x1
-    field public static final int PLAYER_STATE_PAUSED = 3; // 0x3
-    field public static final int PLAYER_STATE_RELEASED = 0; // 0x0
-    field public static final int PLAYER_STATE_STARTED = 2; // 0x2
-    field public static final int PLAYER_STATE_STOPPED = 4; // 0x4
-    field public static final int PLAYER_STATE_UNKNOWN = -1; // 0xffffffff
-    field public static final int PLAYER_TYPE_JAM_AUDIOTRACK = 1; // 0x1
-    field public static final int PLAYER_TYPE_JAM_MEDIAPLAYER = 2; // 0x2
-    field public static final int PLAYER_TYPE_JAM_SOUNDPOOL = 3; // 0x3
-    field public static final int PLAYER_TYPE_SLES_AUDIOPLAYER_BUFFERQUEUE = 11; // 0xb
-    field public static final int PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD = 12; // 0xc
-    field public static final int PLAYER_TYPE_UNKNOWN = -1; // 0xffffffff
-  }
-
-  public class AudioRecord implements android.media.AudioRecordingMonitor android.media.AudioRouting android.media.MicrophoneDirection {
-    ctor public AudioRecord(android.media.AudioAttributes, android.media.AudioFormat, int, int) throws java.lang.IllegalArgumentException;
-  }
-
-  public static class AudioRecord.Builder {
-    method public android.media.AudioRecord.Builder setAudioAttributes(@NonNull android.media.AudioAttributes) throws java.lang.IllegalArgumentException;
-    method public android.media.AudioRecord.Builder setSessionId(int) throws java.lang.IllegalArgumentException;
-  }
-
-  public final class AudioRecordingConfiguration implements android.os.Parcelable {
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getClientUid();
-  }
-
-  public class AudioTrack implements android.media.AudioRouting android.media.VolumeAutomation {
-    field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int ENCAPSULATION_MODE_HANDLE = 2; // 0x2
-  }
-
-  public static class AudioTrack.Builder {
-    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioTrack.Builder setTunerConfiguration(@NonNull android.media.AudioTrack.TunerConfiguration);
-  }
-
-  public static class AudioTrack.TunerConfiguration {
-    ctor @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public AudioTrack.TunerConfiguration(@IntRange(from=1) int, @IntRange(from=1) int);
-    method @IntRange(from=1) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getContentId();
-    method @IntRange(from=1) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getSyncId();
-  }
-
-  public class HwAudioSource {
-    method public boolean isPlaying();
-    method public void start();
-    method public void stop();
-  }
-
-  public static final class HwAudioSource.Builder {
-    ctor public HwAudioSource.Builder();
-    method @NonNull public android.media.HwAudioSource build();
-    method @NonNull public android.media.HwAudioSource.Builder setAudioAttributes(@NonNull android.media.AudioAttributes);
-    method @NonNull public android.media.HwAudioSource.Builder setAudioDeviceInfo(@NonNull android.media.AudioDeviceInfo);
-  }
-
-  public class MediaPlayer implements android.media.AudioRouting android.media.VolumeAutomation {
-    method @RequiresPermission("android.permission.BIND_IMS_SERVICE") public void setOnRtpRxNoticeListener(@NonNull android.content.Context, @NonNull android.media.MediaPlayer.OnRtpRxNoticeListener, @Nullable android.os.Handler);
-  }
-
-  public static interface MediaPlayer.OnRtpRxNoticeListener {
-    method public void onRtpRxNotice(@NonNull android.media.MediaPlayer, int, @NonNull int[]);
-  }
-
-  public final class MediaRecorder.AudioSource {
-    field @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_OUTPUT) public static final int ECHO_REFERENCE = 1997; // 0x7cd
-    field @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD) public static final int HOTWORD = 1999; // 0x7cf
-    field @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_OUTPUT) public static final int RADIO_TUNER = 1998; // 0x7ce
-  }
-
-  public final class MediaTranscodeManager {
-    method @NonNull public android.media.MediaTranscodeManager.TranscodingSession enqueueRequest(@NonNull android.media.MediaTranscodeManager.TranscodingRequest, @NonNull java.util.concurrent.Executor, @NonNull android.media.MediaTranscodeManager.OnTranscodingFinishedListener) throws java.io.FileNotFoundException, android.media.MediaTranscodingException.ServiceNotAvailableException;
-    field public static final int PRIORITY_REALTIME = 1; // 0x1
-    field public static final int TRANSCODING_TYPE_VIDEO = 1; // 0x1
-  }
-
-  @java.lang.FunctionalInterface public static interface MediaTranscodeManager.OnTranscodingFinishedListener {
-    method public void onTranscodingFinished(@NonNull android.media.MediaTranscodeManager.TranscodingSession);
-  }
-
-  public static final class MediaTranscodeManager.TranscodingRequest {
-    method public int getClientPid();
-    method public int getClientUid();
-    method @NonNull public android.net.Uri getDestinationUri();
-    method public int getPriority();
-    method @NonNull public android.net.Uri getSourceUri();
-    method public int getType();
-    method @Nullable public android.media.MediaFormat getVideoTrackFormat();
-  }
-
-  public static final class MediaTranscodeManager.TranscodingRequest.Builder {
-    ctor public MediaTranscodeManager.TranscodingRequest.Builder();
-    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest build();
-    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setClientPid(int);
-    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setClientUid(int);
-    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setDestinationUri(@NonNull android.net.Uri);
-    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setPriority(int);
-    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setSourceUri(@NonNull android.net.Uri);
-    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setType(int);
-    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.Builder setVideoTrackFormat(@NonNull android.media.MediaFormat);
-  }
-
-  public static class MediaTranscodeManager.TranscodingRequest.MediaFormatResolver {
-    ctor public MediaTranscodeManager.TranscodingRequest.MediaFormatResolver();
-    method @Nullable public android.media.MediaFormat resolveVideoFormat();
-    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.MediaFormatResolver setSourceVideoFormatHint(@NonNull android.media.MediaFormat);
-    method public boolean shouldTranscode();
-    field public static final String CAPS_SUPPORTS_HEVC = "support-hevc";
-  }
-
-  public static final class MediaTranscodeManager.TranscodingSession {
-    method public void cancel();
-    method @IntRange(from=0, to=100) public int getProgress();
-    method public int getResult();
-    method public int getSessionId();
-    method public int getStatus();
-    method public void setOnProgressUpdateListener(@NonNull java.util.concurrent.Executor, @Nullable android.media.MediaTranscodeManager.TranscodingSession.OnProgressUpdateListener);
-    method public void setOnProgressUpdateListener(int, @NonNull java.util.concurrent.Executor, @Nullable android.media.MediaTranscodeManager.TranscodingSession.OnProgressUpdateListener);
-    field public static final int RESULT_CANCELED = 4; // 0x4
-    field public static final int RESULT_ERROR = 3; // 0x3
-    field public static final int RESULT_NONE = 1; // 0x1
-    field public static final int RESULT_SUCCESS = 2; // 0x2
-    field public static final int STATUS_FINISHED = 3; // 0x3
-    field public static final int STATUS_PAUSED = 4; // 0x4
-    field public static final int STATUS_PENDING = 1; // 0x1
-    field public static final int STATUS_RUNNING = 2; // 0x2
-  }
-
-  @java.lang.FunctionalInterface public static interface MediaTranscodeManager.TranscodingSession.OnProgressUpdateListener {
-    method public void onProgressUpdate(@NonNull android.media.MediaTranscodeManager.TranscodingSession, @IntRange(from=0, to=100) int);
-  }
-
-  public class PlayerProxy {
-    method public void pause();
-    method public void setPan(float);
-    method public void setStartDelayMs(int);
-    method public void setVolume(float);
-    method public void start();
-    method public void stop();
-  }
-
-  public class RingtoneManager {
-    method @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void ensureDefaultRingtones(@NonNull android.content.Context);
-  }
-
-}
-
-package android.media.audiofx {
-
-  public class AudioEffect {
-    ctor @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public AudioEffect(@NonNull java.util.UUID, @NonNull android.media.AudioDeviceAttributes);
-    method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public static boolean isEffectSupportedForDevice(@NonNull java.util.UUID, @NonNull android.media.AudioDeviceAttributes);
-  }
-
-}
-
-package android.media.audiopolicy {
-
-  public class AudioMix {
-    method public int getMixState();
-    field public static final int MIX_STATE_DISABLED = -1; // 0xffffffff
-    field public static final int MIX_STATE_IDLE = 0; // 0x0
-    field public static final int MIX_STATE_MIXING = 1; // 0x1
-    field public static final int ROUTE_FLAG_LOOP_BACK = 2; // 0x2
-    field public static final int ROUTE_FLAG_RENDER = 1; // 0x1
-  }
-
-  public static class AudioMix.Builder {
-    ctor public AudioMix.Builder(android.media.audiopolicy.AudioMixingRule) throws java.lang.IllegalArgumentException;
-    method public android.media.audiopolicy.AudioMix build() throws java.lang.IllegalArgumentException;
-    method public android.media.audiopolicy.AudioMix.Builder setDevice(@NonNull android.media.AudioDeviceInfo) throws java.lang.IllegalArgumentException;
-    method public android.media.audiopolicy.AudioMix.Builder setFormat(android.media.AudioFormat) throws java.lang.IllegalArgumentException;
-    method public android.media.audiopolicy.AudioMix.Builder setRouteFlags(int) throws java.lang.IllegalArgumentException;
-  }
-
-  public class AudioMixingRule {
-    field public static final int RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET = 2; // 0x2
-    field public static final int RULE_MATCH_ATTRIBUTE_USAGE = 1; // 0x1
-    field public static final int RULE_MATCH_UID = 4; // 0x4
-    field public static final int RULE_MATCH_USERID = 8; // 0x8
-  }
-
-  public static class AudioMixingRule.Builder {
-    ctor public AudioMixingRule.Builder();
-    method public android.media.audiopolicy.AudioMixingRule.Builder addMixRule(int, Object) throws java.lang.IllegalArgumentException;
-    method public android.media.audiopolicy.AudioMixingRule.Builder addRule(android.media.AudioAttributes, int) throws java.lang.IllegalArgumentException;
-    method @NonNull public android.media.audiopolicy.AudioMixingRule.Builder allowPrivilegedPlaybackCapture(boolean);
-    method public android.media.audiopolicy.AudioMixingRule build();
-    method public android.media.audiopolicy.AudioMixingRule.Builder excludeMixRule(int, Object) throws java.lang.IllegalArgumentException;
-    method public android.media.audiopolicy.AudioMixingRule.Builder excludeRule(android.media.AudioAttributes, int) throws java.lang.IllegalArgumentException;
-  }
-
-  public class AudioPolicy {
-    method public int attachMixes(@NonNull java.util.List<android.media.audiopolicy.AudioMix>);
-    method public android.media.AudioRecord createAudioRecordSink(android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException;
-    method public android.media.AudioTrack createAudioTrackSource(android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException;
-    method public int detachMixes(@NonNull java.util.List<android.media.audiopolicy.AudioMix>);
-    method public int getFocusDuckingBehavior();
-    method public int getStatus();
-    method public boolean removeUidDeviceAffinity(int);
-    method public boolean removeUserIdDeviceAffinity(int);
-    method public int setFocusDuckingBehavior(int) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
-    method public void setRegistration(String);
-    method public boolean setUidDeviceAffinity(int, @NonNull java.util.List<android.media.AudioDeviceInfo>);
-    method public boolean setUserIdDeviceAffinity(int, @NonNull java.util.List<android.media.AudioDeviceInfo>);
-    method public String toLogFriendlyString();
-    field public static final int FOCUS_POLICY_DUCKING_DEFAULT = 0; // 0x0
-    field public static final int FOCUS_POLICY_DUCKING_IN_APP = 0; // 0x0
-    field public static final int FOCUS_POLICY_DUCKING_IN_POLICY = 1; // 0x1
-    field public static final int POLICY_STATUS_REGISTERED = 2; // 0x2
-    field public static final int POLICY_STATUS_UNREGISTERED = 1; // 0x1
-  }
-
-  public abstract static class AudioPolicy.AudioPolicyFocusListener {
-    ctor public AudioPolicy.AudioPolicyFocusListener();
-    method public void onAudioFocusAbandon(android.media.AudioFocusInfo);
-    method public void onAudioFocusGrant(android.media.AudioFocusInfo, int);
-    method public void onAudioFocusLoss(android.media.AudioFocusInfo, boolean);
-    method public void onAudioFocusRequest(android.media.AudioFocusInfo, int);
-  }
-
-  public abstract static class AudioPolicy.AudioPolicyStatusListener {
-    ctor public AudioPolicy.AudioPolicyStatusListener();
-    method public void onMixStateUpdate(android.media.audiopolicy.AudioMix);
-    method public void onStatusChange();
-  }
-
-  public abstract static class AudioPolicy.AudioPolicyVolumeCallback {
-    ctor public AudioPolicy.AudioPolicyVolumeCallback();
-    method public void onVolumeAdjustment(int);
-  }
-
-  public static class AudioPolicy.Builder {
-    ctor public AudioPolicy.Builder(android.content.Context);
-    method @NonNull public android.media.audiopolicy.AudioPolicy.Builder addMix(@NonNull android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException;
-    method @NonNull public android.media.audiopolicy.AudioPolicy build();
-    method public void setAudioPolicyFocusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener);
-    method public void setAudioPolicyStatusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener);
-    method @NonNull public android.media.audiopolicy.AudioPolicy.Builder setAudioPolicyVolumeCallback(@NonNull android.media.audiopolicy.AudioPolicy.AudioPolicyVolumeCallback);
-    method @NonNull public android.media.audiopolicy.AudioPolicy.Builder setIsAudioFocusPolicy(boolean);
-    method @NonNull public android.media.audiopolicy.AudioPolicy.Builder setLooper(@NonNull android.os.Looper) throws java.lang.IllegalArgumentException;
-  }
-
-  public final class AudioProductStrategy implements android.os.Parcelable {
-    method @NonNull public static android.media.audiopolicy.AudioProductStrategy createInvalidAudioProductStrategy(int);
-    method public int describeContents();
-    method @NonNull public android.media.AudioAttributes getAudioAttributes();
-    method public int getId();
-    method public boolean supportsAudioAttributes(@NonNull android.media.AudioAttributes);
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioProductStrategy> CREATOR;
-  }
-
-  public final class AudioVolumeGroup implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public java.util.List<android.media.AudioAttributes> getAudioAttributes();
-    method public int getId();
-    method @NonNull public int[] getLegacyStreamTypes();
-    method @NonNull public String name();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioVolumeGroup> CREATOR;
-    field public static final int DEFAULT_VOLUME_GROUP = -1; // 0xffffffff
-  }
-
-}
-
-package android.media.musicrecognition {
-
-  public class MusicRecognitionManager {
-    method @RequiresPermission(android.Manifest.permission.MANAGE_MUSIC_RECOGNITION) public void beginStreamingSearch(@NonNull android.media.musicrecognition.RecognitionRequest, @NonNull java.util.concurrent.Executor, @NonNull android.media.musicrecognition.MusicRecognitionManager.RecognitionCallback);
-    field public static final int RECOGNITION_FAILED_AUDIO_UNAVAILABLE = 7; // 0x7
-    field public static final int RECOGNITION_FAILED_NOT_FOUND = 1; // 0x1
-    field public static final int RECOGNITION_FAILED_NO_CONNECTIVITY = 2; // 0x2
-    field public static final int RECOGNITION_FAILED_SERVICE_KILLED = 5; // 0x5
-    field public static final int RECOGNITION_FAILED_SERVICE_UNAVAILABLE = 3; // 0x3
-    field public static final int RECOGNITION_FAILED_TIMEOUT = 6; // 0x6
-    field public static final int RECOGNITION_FAILED_UNKNOWN = -1; // 0xffffffff
-  }
-
-  public static interface MusicRecognitionManager.RecognitionCallback {
-    method public void onAudioStreamClosed();
-    method public void onRecognitionFailed(@NonNull android.media.musicrecognition.RecognitionRequest, int);
-    method public void onRecognitionSucceeded(@NonNull android.media.musicrecognition.RecognitionRequest, @NonNull android.media.MediaMetadata, @Nullable android.os.Bundle);
-  }
-
-  public abstract class MusicRecognitionService extends android.app.Service {
-    ctor public MusicRecognitionService();
-    method public abstract void onRecognize(@NonNull android.os.ParcelFileDescriptor, @NonNull android.media.AudioFormat, @NonNull android.media.musicrecognition.MusicRecognitionService.Callback);
-  }
-
-  public static interface MusicRecognitionService.Callback {
-    method public void onRecognitionFailed(int);
-    method public void onRecognitionSucceeded(@NonNull android.media.MediaMetadata, @Nullable android.os.Bundle);
-  }
-
-  public final class RecognitionRequest implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.media.AudioAttributes getAudioAttributes();
-    method @NonNull public android.media.AudioFormat getAudioFormat();
-    method public int getCaptureSession();
-    method public int getIgnoreBeginningFrames();
-    method public int getMaxAudioLengthSeconds();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.media.musicrecognition.RecognitionRequest> CREATOR;
-  }
-
-  public static final class RecognitionRequest.Builder {
-    ctor public RecognitionRequest.Builder();
-    method @NonNull public android.media.musicrecognition.RecognitionRequest build();
-    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setAudioAttributes(@NonNull android.media.AudioAttributes);
-    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setAudioFormat(@NonNull android.media.AudioFormat);
-    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setCaptureSession(int);
-    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setIgnoreBeginningFrames(int);
-    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setMaxAudioLengthSeconds(int);
-  }
-
-}
-
-package android.media.session {
-
-  public final class MediaSessionManager {
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void addOnMediaKeyEventDispatchedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.session.MediaSessionManager.OnMediaKeyEventDispatchedListener);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void addOnMediaKeyEventSessionChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.session.MediaSessionManager.OnMediaKeyEventSessionChangedListener);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void removeOnMediaKeyEventDispatchedListener(@NonNull android.media.session.MediaSessionManager.OnMediaKeyEventDispatchedListener);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void removeOnMediaKeyEventSessionChangedListener(@NonNull android.media.session.MediaSessionManager.OnMediaKeyEventSessionChangedListener);
-    method @RequiresPermission(android.Manifest.permission.SET_MEDIA_KEY_LISTENER) public void setOnMediaKeyListener(android.media.session.MediaSessionManager.OnMediaKeyListener, @Nullable android.os.Handler);
-    method @RequiresPermission(android.Manifest.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER) public void setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager.OnVolumeKeyLongPressListener, @Nullable android.os.Handler);
-  }
-
-  public static interface MediaSessionManager.OnMediaKeyEventDispatchedListener {
-    method public void onMediaKeyEventDispatched(@NonNull android.view.KeyEvent, @NonNull String, @Nullable android.media.session.MediaSession.Token);
-  }
-
-  public static interface MediaSessionManager.OnMediaKeyEventSessionChangedListener {
-    method public void onMediaKeyEventSessionChanged(@NonNull String, @Nullable android.media.session.MediaSession.Token);
-  }
-
-  public static interface MediaSessionManager.OnMediaKeyListener {
-    method public boolean onMediaKey(android.view.KeyEvent);
-  }
-
-  public static interface MediaSessionManager.OnVolumeKeyLongPressListener {
-    method public void onVolumeKeyLongPress(android.view.KeyEvent);
-  }
-
-}
-
-package android.media.soundtrigger {
-
-  public abstract class SoundTriggerDetectionService extends android.app.Service {
-    ctor public SoundTriggerDetectionService();
-    method @MainThread public void onConnected(@NonNull java.util.UUID, @Nullable android.os.Bundle);
-    method @MainThread public void onDisconnected(@NonNull java.util.UUID, @Nullable android.os.Bundle);
-    method @MainThread public void onError(@NonNull java.util.UUID, @Nullable android.os.Bundle, int, int);
-    method @MainThread public void onGenericRecognitionEvent(@NonNull java.util.UUID, @Nullable android.os.Bundle, int, @NonNull android.hardware.soundtrigger.SoundTrigger.RecognitionEvent);
-    method @MainThread public abstract void onStopOperation(@NonNull java.util.UUID, @Nullable android.os.Bundle, int);
-    method public final void operationFinished(@Nullable java.util.UUID, int);
-  }
-
-  public final class SoundTriggerDetector {
-    method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public boolean startRecognition(int);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public boolean stopRecognition();
-    field public static final int RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS = 2; // 0x2
-    field public static final int RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO = 1; // 0x1
-    field public static final int RECOGNITION_FLAG_ENABLE_AUDIO_ECHO_CANCELLATION = 4; // 0x4
-    field public static final int RECOGNITION_FLAG_ENABLE_AUDIO_NOISE_SUPPRESSION = 8; // 0x8
-  }
-
-  public abstract static class SoundTriggerDetector.Callback {
-    ctor public SoundTriggerDetector.Callback();
-    method public abstract void onAvailabilityChanged(int);
-    method public abstract void onDetected(@NonNull android.media.soundtrigger.SoundTriggerDetector.EventPayload);
-    method public abstract void onError();
-    method public abstract void onRecognitionPaused();
-    method public abstract void onRecognitionResumed();
-  }
-
-  public static class SoundTriggerDetector.EventPayload {
-    method @Nullable public android.media.AudioFormat getCaptureAudioFormat();
-    method @Nullable public byte[] getTriggerAudio();
-  }
-
-  public final class SoundTriggerManager {
-    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public android.media.soundtrigger.SoundTriggerDetector createSoundTriggerDetector(java.util.UUID, @NonNull android.media.soundtrigger.SoundTriggerDetector.Callback, @Nullable android.os.Handler);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public void deleteModel(java.util.UUID);
-    method public int getDetectionServiceOperationsTimeout();
-    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public android.media.soundtrigger.SoundTriggerManager.Model getModel(java.util.UUID);
-    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public android.hardware.soundtrigger.SoundTrigger.ModuleProperties getModuleProperties();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public int getParameter(@NonNull java.util.UUID, int);
-    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public android.hardware.soundtrigger.SoundTrigger.ModelParamRange queryParameter(@Nullable java.util.UUID, int);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public int setParameter(@Nullable java.util.UUID, int, int);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public void updateModel(android.media.soundtrigger.SoundTriggerManager.Model);
-  }
-
-  public static class SoundTriggerManager.Model {
-    method @NonNull public static android.media.soundtrigger.SoundTriggerManager.Model create(@NonNull java.util.UUID, @NonNull java.util.UUID, @Nullable byte[], int);
-    method @NonNull public static android.media.soundtrigger.SoundTriggerManager.Model create(@NonNull java.util.UUID, @NonNull java.util.UUID, @Nullable byte[]);
-    method @Nullable public byte[] getModelData();
-    method @NonNull public java.util.UUID getModelUuid();
-    method @NonNull public java.util.UUID getVendorUuid();
-    method public int getVersion();
-  }
-
-}
-
-package android.media.tv {
-
-  public final class DvbDeviceInfo implements android.os.Parcelable {
-    ctor public DvbDeviceInfo(int, int);
-    method public int describeContents();
-    method @IntRange(from=0) public int getAdapterId();
-    method @IntRange(from=0) public int getDeviceId();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.media.tv.DvbDeviceInfo> CREATOR;
-  }
-
-  public final class TunedInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getAppTag();
-    method public int getAppType();
-    method @Nullable public android.net.Uri getChannelUri();
-    method @NonNull public String getInputId();
-    method public boolean isForeground();
-    method public boolean isRecordingSession();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field public static final int APP_TAG_SELF = 0; // 0x0
-    field public static final int APP_TYPE_NON_SYSTEM = 3; // 0x3
-    field public static final int APP_TYPE_SELF = 1; // 0x1
-    field public static final int APP_TYPE_SYSTEM = 2; // 0x2
-    field @NonNull public static final android.os.Parcelable.Creator<android.media.tv.TunedInfo> CREATOR;
-  }
-
-  public final class TvContentRatingSystemInfo implements android.os.Parcelable {
-    method public static android.media.tv.TvContentRatingSystemInfo createTvContentRatingSystemInfo(int, android.content.pm.ApplicationInfo);
-    method public int describeContents();
-    method public android.net.Uri getXmlUri();
-    method public boolean isSystemDefined();
-    method public void writeToParcel(android.os.Parcel, int);
-  }
-
-  public final class TvContract {
-    method public static android.net.Uri buildChannelsUriForInput(@Nullable String, boolean);
-    method public static android.net.Uri buildChannelsUriForInput(@Nullable String, @Nullable String, boolean);
-    field public static final String ACTION_CHANNEL_BROWSABLE_REQUESTED = "android.media.tv.action.CHANNEL_BROWSABLE_REQUESTED";
-    field public static final String EXTRA_BLOCKED_PACKAGES = "android.media.tv.extra.BLOCKED_PACKAGES";
-    field public static final String EXTRA_COLUMN_NAME = "android.media.tv.extra.COLUMN_NAME";
-    field public static final String EXTRA_DATA_TYPE = "android.media.tv.extra.DATA_TYPE";
-    field public static final String EXTRA_DEFAULT_VALUE = "android.media.tv.extra.DEFAULT_VALUE";
-    field public static final String EXTRA_EXISTING_COLUMN_NAMES = "android.media.tv.extra.EXISTING_COLUMN_NAMES";
-    field public static final String EXTRA_PACKAGE_NAME = "android.media.tv.extra.PACKAGE_NAME";
-    field public static final String EXTRA_RESULT_CODE = "android.media.tv.extra.RESULT_CODE";
-    field public static final String METHOD_ADD_COLUMN = "add_column";
-    field public static final String METHOD_BLOCK_PACKAGE = "block_package";
-    field public static final String METHOD_GET_BLOCKED_PACKAGES = "get_blocked_packages";
-    field public static final String METHOD_GET_COLUMNS = "get_columns";
-    field public static final String METHOD_UNBLOCK_PACKAGE = "unblock_package";
-    field public static final int RESULT_ERROR_INVALID_ARGUMENT = 2; // 0x2
-    field public static final int RESULT_ERROR_IO = 1; // 0x1
-    field public static final int RESULT_OK = 0; // 0x0
-  }
-
-  public static final class TvContract.WatchedPrograms implements android.media.tv.TvContract.BaseTvColumns {
-    field public static final String COLUMN_CHANNEL_ID = "channel_id";
-    field public static final String COLUMN_DESCRIPTION = "description";
-    field public static final String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
-    field public static final String COLUMN_INTERNAL_SESSION_TOKEN = "session_token";
-    field public static final String COLUMN_INTERNAL_TUNE_PARAMS = "tune_params";
-    field public static final String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
-    field public static final String COLUMN_TITLE = "title";
-    field public static final String COLUMN_WATCH_END_TIME_UTC_MILLIS = "watch_end_time_utc_millis";
-    field public static final String COLUMN_WATCH_START_TIME_UTC_MILLIS = "watch_start_time_utc_millis";
-    field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/watched_program";
-    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/watched_program";
-    field public static final android.net.Uri CONTENT_URI;
-  }
-
-  public final class TvInputHardwareInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method public String getAudioAddress();
-    method public int getAudioType();
-    method public int getCableConnectionStatus();
-    method public int getDeviceId();
-    method public int getHdmiPortId();
-    method public int getType();
-    method public void readFromParcel(android.os.Parcel);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int CABLE_CONNECTION_STATUS_CONNECTED = 1; // 0x1
-    field public static final int CABLE_CONNECTION_STATUS_DISCONNECTED = 2; // 0x2
-    field public static final int CABLE_CONNECTION_STATUS_UNKNOWN = 0; // 0x0
-    field @NonNull public static final android.os.Parcelable.Creator<android.media.tv.TvInputHardwareInfo> CREATOR;
-    field public static final int TV_INPUT_TYPE_COMPONENT = 6; // 0x6
-    field public static final int TV_INPUT_TYPE_COMPOSITE = 3; // 0x3
-    field public static final int TV_INPUT_TYPE_DISPLAY_PORT = 10; // 0xa
-    field public static final int TV_INPUT_TYPE_DVI = 8; // 0x8
-    field public static final int TV_INPUT_TYPE_HDMI = 9; // 0x9
-    field public static final int TV_INPUT_TYPE_OTHER_HARDWARE = 1; // 0x1
-    field public static final int TV_INPUT_TYPE_SCART = 5; // 0x5
-    field public static final int TV_INPUT_TYPE_SVIDEO = 4; // 0x4
-    field public static final int TV_INPUT_TYPE_TUNER = 2; // 0x2
-    field public static final int TV_INPUT_TYPE_VGA = 7; // 0x7
-  }
-
-  public static final class TvInputHardwareInfo.Builder {
-    ctor public TvInputHardwareInfo.Builder();
-    method public android.media.tv.TvInputHardwareInfo.Builder audioAddress(String);
-    method public android.media.tv.TvInputHardwareInfo.Builder audioType(int);
-    method public android.media.tv.TvInputHardwareInfo build();
-    method public android.media.tv.TvInputHardwareInfo.Builder cableConnectionStatus(int);
-    method public android.media.tv.TvInputHardwareInfo.Builder deviceId(int);
-    method public android.media.tv.TvInputHardwareInfo.Builder hdmiPortId(int);
-    method public android.media.tv.TvInputHardwareInfo.Builder type(int);
-  }
-
-  public final class TvInputInfo implements android.os.Parcelable {
-    method @Deprecated public static android.media.tv.TvInputInfo createTvInputInfo(android.content.Context, android.content.pm.ResolveInfo, android.hardware.hdmi.HdmiDeviceInfo, String, String, android.net.Uri) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
-    method @Deprecated public static android.media.tv.TvInputInfo createTvInputInfo(android.content.Context, android.content.pm.ResolveInfo, android.hardware.hdmi.HdmiDeviceInfo, String, int, android.graphics.drawable.Icon) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
-    method @Deprecated public static android.media.tv.TvInputInfo createTvInputInfo(android.content.Context, android.content.pm.ResolveInfo, android.media.tv.TvInputHardwareInfo, String, android.net.Uri) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
-    method @Deprecated public static android.media.tv.TvInputInfo createTvInputInfo(android.content.Context, android.content.pm.ResolveInfo, android.media.tv.TvInputHardwareInfo, int, android.graphics.drawable.Icon) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
-    method public android.hardware.hdmi.HdmiDeviceInfo getHdmiDeviceInfo();
-    method public boolean isConnectedToHdmiSwitch();
-    method public boolean isHardwareInput();
-    method public android.graphics.drawable.Drawable loadIcon(@NonNull android.content.Context, int);
-  }
-
-  public static final class TvInputInfo.Builder {
-    method public android.media.tv.TvInputInfo.Builder setHdmiDeviceInfo(android.hardware.hdmi.HdmiDeviceInfo);
-    method public android.media.tv.TvInputInfo.Builder setIcon(android.graphics.drawable.Icon);
-    method public android.media.tv.TvInputInfo.Builder setIcon(android.graphics.drawable.Icon, int);
-    method public android.media.tv.TvInputInfo.Builder setLabel(CharSequence);
-    method public android.media.tv.TvInputInfo.Builder setLabel(@StringRes int);
-    method public android.media.tv.TvInputInfo.Builder setParentId(String);
-    method public android.media.tv.TvInputInfo.Builder setTvInputHardwareInfo(android.media.tv.TvInputHardwareInfo);
-  }
-
-  public static final class TvInputInfo.TvInputSettings {
-    method public static java.util.Map<java.lang.String,java.lang.String> getCustomLabels(android.content.Context, int);
-    method public static java.util.Set<java.lang.String> getHiddenTvInputIds(android.content.Context, int);
-    method public static void putCustomLabels(android.content.Context, java.util.Map<java.lang.String,java.lang.String>, int);
-    method public static void putHiddenTvInputs(android.content.Context, java.util.Set<java.lang.String>, int);
-  }
-
-  public final class TvInputManager {
-    method @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public android.media.tv.TvInputManager.Hardware acquireTvInputHardware(int, @NonNull android.media.tv.TvInputInfo, @NonNull android.media.tv.TvInputManager.HardwareCallback);
-    method @Nullable @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public android.media.tv.TvInputManager.Hardware acquireTvInputHardware(int, @NonNull android.media.tv.TvInputInfo, @Nullable String, int, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.TvInputManager.HardwareCallback);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void addBlockedRating(@NonNull android.media.tv.TvContentRating);
-    method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public boolean captureFrame(String, android.view.Surface, android.media.tv.TvStreamConfig);
-    method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public java.util.List<android.media.tv.TvStreamConfig> getAvailableTvStreamConfigList(String);
-    method @NonNull @RequiresPermission("com.android.providers.tv.permission.ACCESS_WATCHED_PROGRAMS") public java.util.List<android.media.tv.TunedInfo> getCurrentTunedInfos();
-    method @NonNull @RequiresPermission("android.permission.DVB_DEVICE") public java.util.List<android.media.tv.DvbDeviceInfo> getDvbDeviceList();
-    method @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public java.util.List<android.media.tv.TvInputHardwareInfo> getHardwareList();
-    method @RequiresPermission(android.Manifest.permission.READ_CONTENT_RATING_SYSTEMS) public java.util.List<android.media.tv.TvContentRatingSystemInfo> getTvContentRatingSystemList();
-    method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public boolean isSingleSessionActive();
-    method @RequiresPermission(android.Manifest.permission.NOTIFY_TV_INPUTS) public void notifyPreviewProgramAddedToWatchNext(String, long, long);
-    method @RequiresPermission(android.Manifest.permission.NOTIFY_TV_INPUTS) public void notifyPreviewProgramBrowsableDisabled(String, long);
-    method @RequiresPermission(android.Manifest.permission.NOTIFY_TV_INPUTS) public void notifyWatchNextProgramBrowsableDisabled(String, long);
-    method @Nullable @RequiresPermission("android.permission.DVB_DEVICE") public android.os.ParcelFileDescriptor openDvbDevice(@NonNull android.media.tv.DvbDeviceInfo, int);
-    method @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public void releaseTvInputHardware(int, android.media.tv.TvInputManager.Hardware);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void removeBlockedRating(@NonNull android.media.tv.TvContentRating);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void setParentalControlsEnabled(boolean);
-  }
-
-  public static final class TvInputManager.Hardware {
-    method public void overrideAudioSink(int, String, int, int, int);
-    method public void setStreamVolume(float);
-    method public boolean setSurface(android.view.Surface, android.media.tv.TvStreamConfig);
-  }
-
-  public abstract static class TvInputManager.HardwareCallback {
-    ctor public TvInputManager.HardwareCallback();
-    method public abstract void onReleased();
-    method public abstract void onStreamConfigChanged(android.media.tv.TvStreamConfig[]);
-  }
-
-  public abstract static class TvInputManager.TvInputCallback {
-    method public void onCurrentTunedInfosUpdated(@NonNull java.util.List<android.media.tv.TunedInfo>);
-  }
-
-  public abstract class TvInputService extends android.app.Service {
-    method @Nullable public android.os.IBinder createExtension();
-    method @Nullable public android.media.tv.TvInputInfo onHardwareAdded(android.media.tv.TvInputHardwareInfo);
-    method @Nullable public String onHardwareRemoved(android.media.tv.TvInputHardwareInfo);
-    method @Nullable public android.media.tv.TvInputInfo onHdmiDeviceAdded(android.hardware.hdmi.HdmiDeviceInfo);
-    method @Nullable public String onHdmiDeviceRemoved(android.hardware.hdmi.HdmiDeviceInfo);
-    method public void onHdmiDeviceUpdated(@NonNull android.hardware.hdmi.HdmiDeviceInfo);
-  }
-
-  public abstract static class TvInputService.RecordingSession {
-    method public void notifySessionEvent(@NonNull String, android.os.Bundle);
-  }
-
-  public abstract static class TvInputService.Session implements android.view.KeyEvent.Callback {
-    method public void notifySessionEvent(@NonNull String, android.os.Bundle);
-    method public void onSetMain(boolean);
-  }
-
-  public abstract static class TvRecordingClient.RecordingCallback {
-    method public void onEvent(String, String, android.os.Bundle);
-  }
-
-  public class TvStreamConfig implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getGeneration();
-    method public int getMaxHeight();
-    method public int getMaxWidth();
-    method public int getStreamId();
-    method public int getType();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.media.tv.TvStreamConfig> CREATOR;
-    field public static final int STREAM_TYPE_BUFFER_PRODUCER = 2; // 0x2
-    field public static final int STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE = 1; // 0x1
-  }
-
-  public static final class TvStreamConfig.Builder {
-    ctor public TvStreamConfig.Builder();
-    method public android.media.tv.TvStreamConfig build();
-    method public android.media.tv.TvStreamConfig.Builder generation(int);
-    method public android.media.tv.TvStreamConfig.Builder maxHeight(int);
-    method public android.media.tv.TvStreamConfig.Builder maxWidth(int);
-    method public android.media.tv.TvStreamConfig.Builder streamId(int);
-    method public android.media.tv.TvStreamConfig.Builder type(int);
-  }
-
-  public class TvView extends android.view.ViewGroup {
-    method @RequiresPermission("android.permission.CHANGE_HDMI_CEC_ACTIVE_SOURCE") public void setMain();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void unblockContent(android.media.tv.TvContentRating);
-  }
-
-  public abstract static class TvView.TvInputCallback {
-    method public void onEvent(String, String, android.os.Bundle);
-  }
-
-}
-
-package android.media.tv.tuner {
-
-  public class DemuxCapabilities {
-    method public int getAudioFilterCount();
-    method public int getDemuxCount();
-    method public int getFilterCapabilities();
-    method @NonNull @Size(5) public int[] getLinkCapabilities();
-    method public int getPcrFilterCount();
-    method public int getPesFilterCount();
-    method public int getPlaybackCount();
-    method public int getRecordCount();
-    method public int getSectionFilterCount();
-    method public long getSectionFilterLength();
-    method public int getTsFilterCount();
-    method public int getVideoFilterCount();
-    method public boolean isTimeFilterSupported();
-  }
-
-  public class Descrambler implements java.lang.AutoCloseable {
-    method public int addPid(int, int, @Nullable android.media.tv.tuner.filter.Filter);
-    method public void close();
-    method public int removePid(int, int, @Nullable android.media.tv.tuner.filter.Filter);
-    method public int setKeyToken(@NonNull byte[]);
-    field public static final int PID_TYPE_MMTP = 2; // 0x2
-    field public static final int PID_TYPE_T = 1; // 0x1
-  }
-
-  public class Lnb implements java.lang.AutoCloseable {
-    method public void close();
-    method public int sendDiseqcMessage(@NonNull byte[]);
-    method public int setSatellitePosition(int);
-    method public int setTone(int);
-    method public int setVoltage(int);
-    field public static final int EVENT_TYPE_DISEQC_RX_OVERFLOW = 0; // 0x0
-    field public static final int EVENT_TYPE_DISEQC_RX_PARITY_ERROR = 2; // 0x2
-    field public static final int EVENT_TYPE_DISEQC_RX_TIMEOUT = 1; // 0x1
-    field public static final int EVENT_TYPE_LNB_OVERLOAD = 3; // 0x3
-    field public static final int POSITION_A = 1; // 0x1
-    field public static final int POSITION_B = 2; // 0x2
-    field public static final int POSITION_UNDEFINED = 0; // 0x0
-    field public static final int TONE_CONTINUOUS = 1; // 0x1
-    field public static final int TONE_NONE = 0; // 0x0
-    field public static final int VOLTAGE_11V = 2; // 0x2
-    field public static final int VOLTAGE_12V = 3; // 0x3
-    field public static final int VOLTAGE_13V = 4; // 0x4
-    field public static final int VOLTAGE_14V = 5; // 0x5
-    field public static final int VOLTAGE_15V = 6; // 0x6
-    field public static final int VOLTAGE_18V = 7; // 0x7
-    field public static final int VOLTAGE_19V = 8; // 0x8
-    field public static final int VOLTAGE_5V = 1; // 0x1
-    field public static final int VOLTAGE_NONE = 0; // 0x0
-  }
-
-  public interface LnbCallback {
-    method public void onDiseqcMessage(@NonNull byte[]);
-    method public void onEvent(int);
-  }
-
-  public class Tuner implements java.lang.AutoCloseable {
-    ctor @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public Tuner(@NonNull android.content.Context, @Nullable String, int);
-    method public int cancelScanning();
-    method public int cancelTuning();
-    method public void clearOnTuneEventListener();
-    method public void clearResourceLostListener();
-    method public void close();
-    method public int connectCiCam(int);
-    method public int disconnectCiCam();
-    method public int getAvSyncHwId(@NonNull android.media.tv.tuner.filter.Filter);
-    method public long getAvSyncTime(int);
-    method @Nullable public android.media.tv.tuner.DemuxCapabilities getDemuxCapabilities();
-    method @Nullable public android.media.tv.tuner.frontend.FrontendInfo getFrontendInfo();
-    method @Nullable public android.media.tv.tuner.frontend.FrontendStatus getFrontendStatus(@NonNull int[]);
-    method public int linkFrontendToCiCam(int);
-    method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_DESCRAMBLER) public android.media.tv.tuner.Descrambler openDescrambler();
-    method @Nullable public android.media.tv.tuner.dvr.DvrPlayback openDvrPlayback(long, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.dvr.OnPlaybackStatusChangedListener);
-    method @Nullable public android.media.tv.tuner.dvr.DvrRecorder openDvrRecorder(long, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.dvr.OnRecordStatusChangedListener);
-    method @Nullable public android.media.tv.tuner.filter.Filter openFilter(int, int, long, @Nullable java.util.concurrent.Executor, @Nullable android.media.tv.tuner.filter.FilterCallback);
-    method @Nullable public android.media.tv.tuner.Lnb openLnb(@NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.LnbCallback);
-    method @Nullable public android.media.tv.tuner.Lnb openLnbByName(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.LnbCallback);
-    method @Nullable public android.media.tv.tuner.filter.TimeFilter openTimeFilter();
-    method public int scan(@NonNull android.media.tv.tuner.frontend.FrontendSettings, int, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.frontend.ScanCallback);
-    method public int setLnaEnabled(boolean);
-    method public void setOnTuneEventListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.frontend.OnTuneEventListener);
-    method public void setResourceLostListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.Tuner.OnResourceLostListener);
-    method public void shareFrontendFromTuner(@NonNull android.media.tv.tuner.Tuner);
-    method public int tune(@NonNull android.media.tv.tuner.frontend.FrontendSettings);
-    method public int unlinkFrontendToCiCam(int);
-    method public void updateResourcePriority(int, int);
-    field public static final int INVALID_AV_SYNC_ID = -1; // 0xffffffff
-    field public static final int INVALID_FILTER_ID = -1; // 0xffffffff
-    field public static final long INVALID_FILTER_ID_64BIT = -1L; // 0xffffffffffffffffL
-    field public static final int INVALID_FIRST_MACROBLOCK_IN_SLICE = -1; // 0xffffffff
-    field public static final int INVALID_FRONTEND_ID = -1; // 0xffffffff
-    field public static final int INVALID_FRONTEND_SETTING_FREQUENCY = -1; // 0xffffffff
-    field @NonNull public static final byte[] INVALID_KEYTOKEN;
-    field public static final int INVALID_LTS_ID = -1; // 0xffffffff
-    field public static final int INVALID_MMTP_RECORD_EVENT_MPT_SEQUENCE_NUM = -1; // 0xffffffff
-    field public static final int INVALID_STREAM_ID = 65535; // 0xffff
-    field public static final long INVALID_TIMESTAMP = -1L; // 0xffffffffffffffffL
-    field public static final int INVALID_TS_PID = 65535; // 0xffff
-    field public static final int RESULT_INVALID_ARGUMENT = 4; // 0x4
-    field public static final int RESULT_INVALID_STATE = 3; // 0x3
-    field public static final int RESULT_NOT_INITIALIZED = 2; // 0x2
-    field public static final int RESULT_OUT_OF_MEMORY = 5; // 0x5
-    field public static final int RESULT_SUCCESS = 0; // 0x0
-    field public static final int RESULT_UNAVAILABLE = 1; // 0x1
-    field public static final int RESULT_UNKNOWN_ERROR = 6; // 0x6
-    field public static final int SCAN_TYPE_AUTO = 1; // 0x1
-    field public static final int SCAN_TYPE_BLIND = 2; // 0x2
-    field public static final int SCAN_TYPE_UNDEFINED = 0; // 0x0
-  }
-
-  public static interface Tuner.OnResourceLostListener {
-    method public void onResourceLost(@NonNull android.media.tv.tuner.Tuner);
-  }
-
-  public final class TunerVersionChecker {
-    method public static int getTunerVersion();
-    field public static final int TUNER_VERSION_1_0 = 65536; // 0x10000
-    field public static final int TUNER_VERSION_1_1 = 65537; // 0x10001
-    field public static final int TUNER_VERSION_UNKNOWN = 0; // 0x0
-  }
-
-}
-
-package android.media.tv.tuner.dvr {
-
-  public class DvrPlayback implements java.lang.AutoCloseable {
-    method @Deprecated public int attachFilter(@NonNull android.media.tv.tuner.filter.Filter);
-    method public void close();
-    method public int configure(@NonNull android.media.tv.tuner.dvr.DvrSettings);
-    method @Deprecated public int detachFilter(@NonNull android.media.tv.tuner.filter.Filter);
-    method public int flush();
-    method public long read(long);
-    method public long read(@NonNull byte[], long, long);
-    method public void setFileDescriptor(@NonNull android.os.ParcelFileDescriptor);
-    method public int start();
-    method public int stop();
-    field public static final int PLAYBACK_STATUS_ALMOST_EMPTY = 2; // 0x2
-    field public static final int PLAYBACK_STATUS_ALMOST_FULL = 4; // 0x4
-    field public static final int PLAYBACK_STATUS_EMPTY = 1; // 0x1
-    field public static final int PLAYBACK_STATUS_FULL = 8; // 0x8
-  }
-
-  public class DvrRecorder implements java.lang.AutoCloseable {
-    method public int attachFilter(@NonNull android.media.tv.tuner.filter.Filter);
-    method public void close();
-    method public int configure(@NonNull android.media.tv.tuner.dvr.DvrSettings);
-    method public int detachFilter(@NonNull android.media.tv.tuner.filter.Filter);
-    method public int flush();
-    method public void setFileDescriptor(@NonNull android.os.ParcelFileDescriptor);
-    method public int start();
-    method public int stop();
-    method public long write(long);
-    method public long write(@NonNull byte[], long, long);
-  }
-
-  public class DvrSettings {
-    method @NonNull public static android.media.tv.tuner.dvr.DvrSettings.Builder builder();
-    method public int getDataFormat();
-    method public long getHighThreshold();
-    method public long getLowThreshold();
-    method public long getPacketSize();
-    method public int getStatusMask();
-    field public static final int DATA_FORMAT_ES = 2; // 0x2
-    field public static final int DATA_FORMAT_PES = 1; // 0x1
-    field public static final int DATA_FORMAT_SHV_TLV = 3; // 0x3
-    field public static final int DATA_FORMAT_TS = 0; // 0x0
-  }
-
-  public static final class DvrSettings.Builder {
-    ctor public DvrSettings.Builder();
-    method @NonNull public android.media.tv.tuner.dvr.DvrSettings build();
-    method @NonNull public android.media.tv.tuner.dvr.DvrSettings.Builder setDataFormat(int);
-    method @NonNull public android.media.tv.tuner.dvr.DvrSettings.Builder setHighThreshold(long);
-    method @NonNull public android.media.tv.tuner.dvr.DvrSettings.Builder setLowThreshold(long);
-    method @NonNull public android.media.tv.tuner.dvr.DvrSettings.Builder setPacketSize(long);
-    method @NonNull public android.media.tv.tuner.dvr.DvrSettings.Builder setStatusMask(int);
-  }
-
-  public interface OnPlaybackStatusChangedListener {
-    method public void onPlaybackStatusChanged(int);
-  }
-
-  public interface OnRecordStatusChangedListener {
-    method public void onRecordStatusChanged(int);
-  }
-
-}
-
-package android.media.tv.tuner.filter {
-
-  public final class AlpFilterConfiguration extends android.media.tv.tuner.filter.FilterConfiguration {
-    method @NonNull public static android.media.tv.tuner.filter.AlpFilterConfiguration.Builder builder();
-    method public int getLengthType();
-    method public int getPacketType();
-    method public int getType();
-    field public static final int LENGTH_TYPE_UNDEFINED = 0; // 0x0
-    field public static final int LENGTH_TYPE_WITHOUT_ADDITIONAL_HEADER = 1; // 0x1
-    field public static final int LENGTH_TYPE_WITH_ADDITIONAL_HEADER = 2; // 0x2
-    field public static final int PACKET_TYPE_COMPRESSED = 2; // 0x2
-    field public static final int PACKET_TYPE_EXTENSION = 6; // 0x6
-    field public static final int PACKET_TYPE_IPV4 = 0; // 0x0
-    field public static final int PACKET_TYPE_MPEG2_TS = 7; // 0x7
-    field public static final int PACKET_TYPE_SIGNALING = 4; // 0x4
-  }
-
-  public static final class AlpFilterConfiguration.Builder {
-    method @NonNull public android.media.tv.tuner.filter.AlpFilterConfiguration build();
-    method @NonNull public android.media.tv.tuner.filter.AlpFilterConfiguration.Builder setLengthType(int);
-    method @NonNull public android.media.tv.tuner.filter.AlpFilterConfiguration.Builder setPacketType(int);
-    method @NonNull public android.media.tv.tuner.filter.AlpFilterConfiguration.Builder setSettings(@Nullable android.media.tv.tuner.filter.Settings);
-  }
-
-  public class AudioDescriptor {
-    method public byte getAdFade();
-    method public byte getAdGainCenter();
-    method public byte getAdGainFront();
-    method public byte getAdGainSurround();
-    method public byte getAdPan();
-    method public char getAdVersionTextTag();
-  }
-
-  public class AvSettings extends android.media.tv.tuner.filter.Settings {
-    method @NonNull public static android.media.tv.tuner.filter.AvSettings.Builder builder(int, boolean);
-    method public int getAudioStreamType();
-    method public int getVideoStreamType();
-    method public boolean isPassthrough();
-    field public static final int AUDIO_STREAM_TYPE_AAC = 6; // 0x6
-    field public static final int AUDIO_STREAM_TYPE_AC3 = 7; // 0x7
-    field public static final int AUDIO_STREAM_TYPE_AC4 = 9; // 0x9
-    field public static final int AUDIO_STREAM_TYPE_DRA = 15; // 0xf
-    field public static final int AUDIO_STREAM_TYPE_DTS = 10; // 0xa
-    field public static final int AUDIO_STREAM_TYPE_DTS_HD = 11; // 0xb
-    field public static final int AUDIO_STREAM_TYPE_EAC3 = 8; // 0x8
-    field public static final int AUDIO_STREAM_TYPE_MP3 = 2; // 0x2
-    field public static final int AUDIO_STREAM_TYPE_MPEG1 = 3; // 0x3
-    field public static final int AUDIO_STREAM_TYPE_MPEG2 = 4; // 0x4
-    field public static final int AUDIO_STREAM_TYPE_MPEGH = 5; // 0x5
-    field public static final int AUDIO_STREAM_TYPE_OPUS = 13; // 0xd
-    field public static final int AUDIO_STREAM_TYPE_PCM = 1; // 0x1
-    field public static final int AUDIO_STREAM_TYPE_UNDEFINED = 0; // 0x0
-    field public static final int AUDIO_STREAM_TYPE_VORBIS = 14; // 0xe
-    field public static final int AUDIO_STREAM_TYPE_WMA = 12; // 0xc
-    field public static final int VIDEO_STREAM_TYPE_AV1 = 10; // 0xa
-    field public static final int VIDEO_STREAM_TYPE_AVC = 5; // 0x5
-    field public static final int VIDEO_STREAM_TYPE_AVS = 11; // 0xb
-    field public static final int VIDEO_STREAM_TYPE_AVS2 = 12; // 0xc
-    field public static final int VIDEO_STREAM_TYPE_HEVC = 6; // 0x6
-    field public static final int VIDEO_STREAM_TYPE_MPEG1 = 2; // 0x2
-    field public static final int VIDEO_STREAM_TYPE_MPEG2 = 3; // 0x3
-    field public static final int VIDEO_STREAM_TYPE_MPEG4P2 = 4; // 0x4
-    field public static final int VIDEO_STREAM_TYPE_RESERVED = 1; // 0x1
-    field public static final int VIDEO_STREAM_TYPE_UNDEFINED = 0; // 0x0
-    field public static final int VIDEO_STREAM_TYPE_VC1 = 7; // 0x7
-    field public static final int VIDEO_STREAM_TYPE_VP8 = 8; // 0x8
-    field public static final int VIDEO_STREAM_TYPE_VP9 = 9; // 0x9
-  }
-
-  public static class AvSettings.Builder {
-    method @NonNull public android.media.tv.tuner.filter.AvSettings build();
-    method @NonNull public android.media.tv.tuner.filter.AvSettings.Builder setAudioStreamType(int);
-    method @NonNull public android.media.tv.tuner.filter.AvSettings.Builder setPassthrough(boolean);
-    method @NonNull public android.media.tv.tuner.filter.AvSettings.Builder setVideoStreamType(int);
-  }
-
-  public class DownloadEvent extends android.media.tv.tuner.filter.FilterEvent {
-    method public int getDataLength();
-    method public int getItemFragmentIndex();
-    method public int getItemId();
-    method public int getLastItemFragmentIndex();
-    method public int getMpuSequenceNumber();
-  }
-
-  public class DownloadSettings extends android.media.tv.tuner.filter.Settings {
-    method @NonNull public static android.media.tv.tuner.filter.DownloadSettings.Builder builder(int);
-    method public int getDownloadId();
-  }
-
-  public static class DownloadSettings.Builder {
-    method @NonNull public android.media.tv.tuner.filter.DownloadSettings build();
-    method @NonNull public android.media.tv.tuner.filter.DownloadSettings.Builder setDownloadId(int);
-  }
-
-  public class Filter implements java.lang.AutoCloseable {
-    method public void close();
-    method public int configure(@NonNull android.media.tv.tuner.filter.FilterConfiguration);
-    method public int flush();
-    method public int getId();
-    method public long getId64Bit();
-    method public int read(@NonNull byte[], long, long);
-    method public int setDataSource(@Nullable android.media.tv.tuner.filter.Filter);
-    method public int start();
-    method public int stop();
-    field public static final int STATUS_DATA_READY = 1; // 0x1
-    field public static final int STATUS_HIGH_WATER = 4; // 0x4
-    field public static final int STATUS_LOW_WATER = 2; // 0x2
-    field public static final int STATUS_OVERFLOW = 8; // 0x8
-    field public static final int SUBTYPE_AUDIO = 3; // 0x3
-    field public static final int SUBTYPE_DOWNLOAD = 5; // 0x5
-    field public static final int SUBTYPE_IP = 13; // 0xd
-    field public static final int SUBTYPE_IP_PAYLOAD = 12; // 0xc
-    field public static final int SUBTYPE_MMTP = 10; // 0xa
-    field public static final int SUBTYPE_NTP = 11; // 0xb
-    field public static final int SUBTYPE_PAYLOAD_THROUGH = 14; // 0xe
-    field public static final int SUBTYPE_PCR = 8; // 0x8
-    field public static final int SUBTYPE_PES = 2; // 0x2
-    field public static final int SUBTYPE_PTP = 16; // 0x10
-    field public static final int SUBTYPE_RECORD = 6; // 0x6
-    field public static final int SUBTYPE_SECTION = 1; // 0x1
-    field public static final int SUBTYPE_TEMI = 9; // 0x9
-    field public static final int SUBTYPE_TLV = 15; // 0xf
-    field public static final int SUBTYPE_TS = 7; // 0x7
-    field public static final int SUBTYPE_UNDEFINED = 0; // 0x0
-    field public static final int SUBTYPE_VIDEO = 4; // 0x4
-    field public static final int TYPE_ALP = 16; // 0x10
-    field public static final int TYPE_IP = 4; // 0x4
-    field public static final int TYPE_MMTP = 2; // 0x2
-    field public static final int TYPE_TLV = 8; // 0x8
-    field public static final int TYPE_TS = 1; // 0x1
-    field public static final int TYPE_UNDEFINED = 0; // 0x0
-  }
-
-  public interface FilterCallback {
-    method public void onFilterEvent(@NonNull android.media.tv.tuner.filter.Filter, @NonNull android.media.tv.tuner.filter.FilterEvent[]);
-    method public void onFilterStatusChanged(@NonNull android.media.tv.tuner.filter.Filter, int);
-  }
-
-  public abstract class FilterConfiguration {
-    method @Nullable public android.media.tv.tuner.filter.Settings getSettings();
-    method public abstract int getType();
-  }
-
-  public abstract class FilterEvent {
-    ctor public FilterEvent();
-  }
-
-  public final class IpFilterConfiguration extends android.media.tv.tuner.filter.FilterConfiguration {
-    method @NonNull public static android.media.tv.tuner.filter.IpFilterConfiguration.Builder builder();
-    method @NonNull @Size(min=4, max=16) public byte[] getDstIpAddress();
-    method public int getDstPort();
-    method @IntRange(from=0, to=61439) public int getIpFilterContextId();
-    method @NonNull @Size(min=4, max=16) public byte[] getSrcIpAddress();
-    method public int getSrcPort();
-    method public int getType();
-    method public boolean isPassthrough();
-    field public static final int INVALID_IP_FILTER_CONTEXT_ID = -1; // 0xffffffff
-  }
-
-  public static final class IpFilterConfiguration.Builder {
-    method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration build();
-    method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setDstIpAddress(@NonNull byte[]);
-    method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setDstPort(int);
-    method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setIpFilterContextId(int);
-    method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setPassthrough(boolean);
-    method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setSettings(@Nullable android.media.tv.tuner.filter.Settings);
-    method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setSrcIpAddress(@NonNull byte[]);
-    method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setSrcPort(int);
-  }
-
-  public class IpPayloadEvent extends android.media.tv.tuner.filter.FilterEvent {
-    method public int getDataLength();
-  }
-
-  public class MediaEvent extends android.media.tv.tuner.filter.FilterEvent {
-    method public long getAudioHandle();
-    method public long getAvDataId();
-    method public long getDataLength();
-    method @Nullable public android.media.tv.tuner.filter.AudioDescriptor getExtraMetaData();
-    method @Nullable public android.media.MediaCodec.LinearBlock getLinearBlock();
-    method public int getMpuSequenceNumber();
-    method public long getOffset();
-    method public long getPts();
-    method public int getStreamId();
-    method public boolean isPrivateData();
-    method public boolean isPtsPresent();
-    method public boolean isSecureMemory();
-    method public void release();
-  }
-
-  public final class MmtpFilterConfiguration extends android.media.tv.tuner.filter.FilterConfiguration {
-    method @NonNull public static android.media.tv.tuner.filter.MmtpFilterConfiguration.Builder builder();
-    method public int getMmtpPacketId();
-    method public int getType();
-  }
-
-  public static final class MmtpFilterConfiguration.Builder {
-    method @NonNull public android.media.tv.tuner.filter.MmtpFilterConfiguration build();
-    method @NonNull public android.media.tv.tuner.filter.MmtpFilterConfiguration.Builder setMmtpPacketId(int);
-    method @NonNull public android.media.tv.tuner.filter.MmtpFilterConfiguration.Builder setSettings(@Nullable android.media.tv.tuner.filter.Settings);
-  }
-
-  public class MmtpRecordEvent extends android.media.tv.tuner.filter.FilterEvent {
-    method public long getDataLength();
-    method public int getFirstMbInSlice();
-    method public int getMpuSequenceNumber();
-    method public long getPts();
-    method public int getScHevcIndexMask();
-    method public int getTsIndexMask();
-  }
-
-  public class PesEvent extends android.media.tv.tuner.filter.FilterEvent {
-    method public int getDataLength();
-    method public int getMpuSequenceNumber();
-    method public int getStreamId();
-  }
-
-  public class PesSettings extends android.media.tv.tuner.filter.Settings {
-    method @NonNull public static android.media.tv.tuner.filter.PesSettings.Builder builder(int);
-    method public int getStreamId();
-    method public boolean isRaw();
-  }
-
-  public static class PesSettings.Builder {
-    method @NonNull public android.media.tv.tuner.filter.PesSettings build();
-    method @NonNull public android.media.tv.tuner.filter.PesSettings.Builder setRaw(boolean);
-    method @NonNull public android.media.tv.tuner.filter.PesSettings.Builder setStreamId(int);
-  }
-
-  public class RecordSettings extends android.media.tv.tuner.filter.Settings {
-    method @NonNull public static android.media.tv.tuner.filter.RecordSettings.Builder builder(int);
-    method public int getScIndexMask();
-    method public int getScIndexType();
-    method public int getTsIndexMask();
-    field public static final int INDEX_TYPE_NONE = 0; // 0x0
-    field public static final int INDEX_TYPE_SC = 1; // 0x1
-    field public static final int INDEX_TYPE_SC_HEVC = 2; // 0x2
-    field public static final int MPT_INDEX_AUDIO = 262144; // 0x40000
-    field public static final int MPT_INDEX_MPT = 65536; // 0x10000
-    field public static final int MPT_INDEX_TIMESTAMP_TARGET_AUDIO = 1048576; // 0x100000
-    field public static final int MPT_INDEX_TIMESTAMP_TARGET_VIDEO = 524288; // 0x80000
-    field public static final int MPT_INDEX_VIDEO = 131072; // 0x20000
-    field public static final int SC_HEVC_INDEX_AUD = 2; // 0x2
-    field public static final int SC_HEVC_INDEX_SLICE_BLA_N_LP = 16; // 0x10
-    field public static final int SC_HEVC_INDEX_SLICE_BLA_W_RADL = 8; // 0x8
-    field public static final int SC_HEVC_INDEX_SLICE_CE_BLA_W_LP = 4; // 0x4
-    field public static final int SC_HEVC_INDEX_SLICE_IDR_N_LP = 64; // 0x40
-    field public static final int SC_HEVC_INDEX_SLICE_IDR_W_RADL = 32; // 0x20
-    field public static final int SC_HEVC_INDEX_SLICE_TRAIL_CRA = 128; // 0x80
-    field public static final int SC_HEVC_INDEX_SPS = 1; // 0x1
-    field public static final int SC_INDEX_B_FRAME = 4; // 0x4
-    field public static final int SC_INDEX_B_SLICE = 64; // 0x40
-    field public static final int SC_INDEX_I_FRAME = 1; // 0x1
-    field public static final int SC_INDEX_I_SLICE = 16; // 0x10
-    field public static final int SC_INDEX_P_FRAME = 2; // 0x2
-    field public static final int SC_INDEX_P_SLICE = 32; // 0x20
-    field public static final int SC_INDEX_SEQUENCE = 8; // 0x8
-    field public static final int SC_INDEX_SI_SLICE = 128; // 0x80
-    field public static final int SC_INDEX_SP_SLICE = 256; // 0x100
-    field public static final int TS_INDEX_ADAPTATION_EXTENSION_FLAG = 4096; // 0x1000
-    field public static final int TS_INDEX_CHANGE_TO_EVEN_SCRAMBLED = 8; // 0x8
-    field public static final int TS_INDEX_CHANGE_TO_NOT_SCRAMBLED = 4; // 0x4
-    field public static final int TS_INDEX_CHANGE_TO_ODD_SCRAMBLED = 16; // 0x10
-    field public static final int TS_INDEX_DISCONTINUITY_INDICATOR = 32; // 0x20
-    field public static final int TS_INDEX_FIRST_PACKET = 1; // 0x1
-    field public static final int TS_INDEX_INVALID = 0; // 0x0
-    field public static final int TS_INDEX_OPCR_FLAG = 512; // 0x200
-    field public static final int TS_INDEX_PAYLOAD_UNIT_START_INDICATOR = 2; // 0x2
-    field public static final int TS_INDEX_PCR_FLAG = 256; // 0x100
-    field public static final int TS_INDEX_PRIORITY_INDICATOR = 128; // 0x80
-    field public static final int TS_INDEX_PRIVATE_DATA = 2048; // 0x800
-    field public static final int TS_INDEX_RANDOM_ACCESS_INDICATOR = 64; // 0x40
-    field public static final int TS_INDEX_SPLICING_POINT_FLAG = 1024; // 0x400
-  }
-
-  public static class RecordSettings.Builder {
-    method @NonNull public android.media.tv.tuner.filter.RecordSettings build();
-    method @NonNull public android.media.tv.tuner.filter.RecordSettings.Builder setScIndexMask(int);
-    method @NonNull public android.media.tv.tuner.filter.RecordSettings.Builder setScIndexType(int);
-    method @NonNull public android.media.tv.tuner.filter.RecordSettings.Builder setTsIndexMask(int);
-  }
-
-  public class SectionEvent extends android.media.tv.tuner.filter.FilterEvent {
-    method public int getDataLength();
-    method public int getSectionNumber();
-    method public int getTableId();
-    method public int getVersion();
-  }
-
-  public abstract class SectionSettings extends android.media.tv.tuner.filter.Settings {
-    method public boolean isCrcEnabled();
-    method public boolean isRaw();
-    method public boolean isRepeat();
-  }
-
-  public abstract static class SectionSettings.Builder<T extends android.media.tv.tuner.filter.SectionSettings.Builder<T>> {
-    method @NonNull public T setCrcEnabled(boolean);
-    method @NonNull public T setRaw(boolean);
-    method @NonNull public T setRepeat(boolean);
-  }
-
-  public class SectionSettingsWithSectionBits extends android.media.tv.tuner.filter.SectionSettings {
-    method @NonNull public static android.media.tv.tuner.filter.SectionSettingsWithSectionBits.Builder builder(int);
-    method @NonNull public byte[] getFilterBytes();
-    method @NonNull public byte[] getMask();
-    method @NonNull public byte[] getMode();
-  }
-
-  public static class SectionSettingsWithSectionBits.Builder extends android.media.tv.tuner.filter.SectionSettings.Builder<android.media.tv.tuner.filter.SectionSettingsWithSectionBits.Builder> {
-    method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithSectionBits build();
-    method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithSectionBits.Builder setFilter(@NonNull byte[]);
-    method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithSectionBits.Builder setMask(@NonNull byte[]);
-    method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithSectionBits.Builder setMode(@NonNull byte[]);
-  }
-
-  public class SectionSettingsWithTableInfo extends android.media.tv.tuner.filter.SectionSettings {
-    method @NonNull public static android.media.tv.tuner.filter.SectionSettingsWithTableInfo.Builder builder(int);
-    method public int getTableId();
-    method public int getVersion();
-  }
-
-  public static class SectionSettingsWithTableInfo.Builder extends android.media.tv.tuner.filter.SectionSettings.Builder<android.media.tv.tuner.filter.SectionSettingsWithTableInfo.Builder> {
-    method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithTableInfo build();
-    method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithTableInfo.Builder setTableId(int);
-    method @NonNull public android.media.tv.tuner.filter.SectionSettingsWithTableInfo.Builder setVersion(int);
-  }
-
-  public abstract class Settings {
-    method public int getType();
-  }
-
-  public class TemiEvent extends android.media.tv.tuner.filter.FilterEvent {
-    method @NonNull public byte[] getDescriptorData();
-    method public byte getDescriptorTag();
-    method public long getPts();
-  }
-
-  public class TimeFilter implements java.lang.AutoCloseable {
-    method public int clearTimestamp();
-    method public void close();
-    method public long getSourceTime();
-    method public long getTimeStamp();
-    method public int setCurrentTimestamp(long);
-  }
-
-  public final class TlvFilterConfiguration extends android.media.tv.tuner.filter.FilterConfiguration {
-    method @NonNull public static android.media.tv.tuner.filter.TlvFilterConfiguration.Builder builder();
-    method public int getPacketType();
-    method public int getType();
-    method public boolean isCompressedIpPacket();
-    method public boolean isPassthrough();
-    field public static final int PACKET_TYPE_COMPRESSED = 3; // 0x3
-    field public static final int PACKET_TYPE_IPV4 = 1; // 0x1
-    field public static final int PACKET_TYPE_IPV6 = 2; // 0x2
-    field public static final int PACKET_TYPE_NULL = 255; // 0xff
-    field public static final int PACKET_TYPE_SIGNALING = 254; // 0xfe
-  }
-
-  public static final class TlvFilterConfiguration.Builder {
-    method @NonNull public android.media.tv.tuner.filter.TlvFilterConfiguration build();
-    method @NonNull public android.media.tv.tuner.filter.TlvFilterConfiguration.Builder setCompressedIpPacket(boolean);
-    method @NonNull public android.media.tv.tuner.filter.TlvFilterConfiguration.Builder setPacketType(int);
-    method @NonNull public android.media.tv.tuner.filter.TlvFilterConfiguration.Builder setPassthrough(boolean);
-    method @NonNull public android.media.tv.tuner.filter.TlvFilterConfiguration.Builder setSettings(@Nullable android.media.tv.tuner.filter.Settings);
-  }
-
-  public final class TsFilterConfiguration extends android.media.tv.tuner.filter.FilterConfiguration {
-    method @NonNull public static android.media.tv.tuner.filter.TsFilterConfiguration.Builder builder();
-    method public int getTpid();
-    method public int getType();
-  }
-
-  public static final class TsFilterConfiguration.Builder {
-    method @NonNull public android.media.tv.tuner.filter.TsFilterConfiguration build();
-    method @NonNull public android.media.tv.tuner.filter.TsFilterConfiguration.Builder setSettings(@Nullable android.media.tv.tuner.filter.Settings);
-    method @NonNull public android.media.tv.tuner.filter.TsFilterConfiguration.Builder setTpid(int);
-  }
-
-  public class TsRecordEvent extends android.media.tv.tuner.filter.FilterEvent {
-    method public long getDataLength();
-    method public int getFirstMbInSlice();
-    method public int getPacketId();
-    method public long getPts();
-    method public int getScIndexMask();
-    method public int getTsIndexMask();
-  }
-
-}
-
-package android.media.tv.tuner.frontend {
-
-  public class AnalogFrontendCapabilities extends android.media.tv.tuner.frontend.FrontendCapabilities {
-    method public int getSifStandardCapability();
-    method public int getSignalTypeCapability();
-  }
-
-  public class AnalogFrontendSettings extends android.media.tv.tuner.frontend.FrontendSettings {
-    method @NonNull public static android.media.tv.tuner.frontend.AnalogFrontendSettings.Builder builder();
-    method public int getAftFlag();
-    method public int getSifStandard();
-    method public int getSignalType();
-    method public int getType();
-    field public static final int AFT_FLAG_FALSE = 2; // 0x2
-    field public static final int AFT_FLAG_TRUE = 1; // 0x1
-    field public static final int AFT_FLAG_UNDEFINED = 0; // 0x0
-    field public static final int SIF_AUTO = 1; // 0x1
-    field public static final int SIF_BG = 2; // 0x2
-    field public static final int SIF_BG_A2 = 4; // 0x4
-    field public static final int SIF_BG_NICAM = 8; // 0x8
-    field public static final int SIF_DK = 32; // 0x20
-    field public static final int SIF_DK1_A2 = 64; // 0x40
-    field public static final int SIF_DK2_A2 = 128; // 0x80
-    field public static final int SIF_DK3_A2 = 256; // 0x100
-    field public static final int SIF_DK_NICAM = 512; // 0x200
-    field public static final int SIF_I = 16; // 0x10
-    field public static final int SIF_I_NICAM = 32768; // 0x8000
-    field public static final int SIF_L = 1024; // 0x400
-    field public static final int SIF_L_NICAM = 65536; // 0x10000
-    field public static final int SIF_L_PRIME = 131072; // 0x20000
-    field public static final int SIF_M = 2048; // 0x800
-    field public static final int SIF_M_A2 = 8192; // 0x2000
-    field public static final int SIF_M_BTSC = 4096; // 0x1000
-    field public static final int SIF_M_EIAJ = 16384; // 0x4000
-    field public static final int SIF_UNDEFINED = 0; // 0x0
-    field public static final int SIGNAL_TYPE_AUTO = 1; // 0x1
-    field public static final int SIGNAL_TYPE_NTSC = 32; // 0x20
-    field public static final int SIGNAL_TYPE_NTSC_443 = 64; // 0x40
-    field public static final int SIGNAL_TYPE_PAL = 2; // 0x2
-    field public static final int SIGNAL_TYPE_PAL_60 = 16; // 0x10
-    field public static final int SIGNAL_TYPE_PAL_M = 4; // 0x4
-    field public static final int SIGNAL_TYPE_PAL_N = 8; // 0x8
-    field public static final int SIGNAL_TYPE_SECAM = 128; // 0x80
-    field public static final int SIGNAL_TYPE_UNDEFINED = 0; // 0x0
-  }
-
-  public static class AnalogFrontendSettings.Builder {
-    method @NonNull public android.media.tv.tuner.frontend.AnalogFrontendSettings build();
-    method @NonNull public android.media.tv.tuner.frontend.AnalogFrontendSettings.Builder setAftFlag(int);
-    method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.AnalogFrontendSettings.Builder setFrequency(int);
-    method @NonNull public android.media.tv.tuner.frontend.AnalogFrontendSettings.Builder setSifStandard(int);
-    method @NonNull public android.media.tv.tuner.frontend.AnalogFrontendSettings.Builder setSignalType(int);
-  }
-
-  public class Atsc3FrontendCapabilities extends android.media.tv.tuner.frontend.FrontendCapabilities {
-    method public int getBandwidthCapability();
-    method public int getDemodOutputFormatCapability();
-    method public int getFecCapability();
-    method public int getModulationCapability();
-    method public int getPlpCodeRateCapability();
-    method public int getTimeInterleaveModeCapability();
-  }
-
-  public class Atsc3FrontendSettings extends android.media.tv.tuner.frontend.FrontendSettings {
-    method @NonNull public static android.media.tv.tuner.frontend.Atsc3FrontendSettings.Builder builder();
-    method public int getBandwidth();
-    method public int getDemodOutputFormat();
-    method @NonNull public android.media.tv.tuner.frontend.Atsc3PlpSettings[] getPlpSettings();
-    method public int getType();
-    field public static final int BANDWIDTH_AUTO = 1; // 0x1
-    field public static final int BANDWIDTH_BANDWIDTH_6MHZ = 2; // 0x2
-    field public static final int BANDWIDTH_BANDWIDTH_7MHZ = 4; // 0x4
-    field public static final int BANDWIDTH_BANDWIDTH_8MHZ = 8; // 0x8
-    field public static final int BANDWIDTH_UNDEFINED = 0; // 0x0
-    field public static final int CODERATE_10_15 = 512; // 0x200
-    field public static final int CODERATE_11_15 = 1024; // 0x400
-    field public static final int CODERATE_12_15 = 2048; // 0x800
-    field public static final int CODERATE_13_15 = 4096; // 0x1000
-    field public static final int CODERATE_2_15 = 2; // 0x2
-    field public static final int CODERATE_3_15 = 4; // 0x4
-    field public static final int CODERATE_4_15 = 8; // 0x8
-    field public static final int CODERATE_5_15 = 16; // 0x10
-    field public static final int CODERATE_6_15 = 32; // 0x20
-    field public static final int CODERATE_7_15 = 64; // 0x40
-    field public static final int CODERATE_8_15 = 128; // 0x80
-    field public static final int CODERATE_9_15 = 256; // 0x100
-    field public static final int CODERATE_AUTO = 1; // 0x1
-    field public static final int CODERATE_UNDEFINED = 0; // 0x0
-    field public static final int DEMOD_OUTPUT_FORMAT_ATSC3_LINKLAYER_PACKET = 1; // 0x1
-    field public static final int DEMOD_OUTPUT_FORMAT_BASEBAND_PACKET = 2; // 0x2
-    field public static final int DEMOD_OUTPUT_FORMAT_UNDEFINED = 0; // 0x0
-    field public static final int FEC_AUTO = 1; // 0x1
-    field public static final int FEC_BCH_LDPC_16K = 2; // 0x2
-    field public static final int FEC_BCH_LDPC_64K = 4; // 0x4
-    field public static final int FEC_CRC_LDPC_16K = 8; // 0x8
-    field public static final int FEC_CRC_LDPC_64K = 16; // 0x10
-    field public static final int FEC_LDPC_16K = 32; // 0x20
-    field public static final int FEC_LDPC_64K = 64; // 0x40
-    field public static final int FEC_UNDEFINED = 0; // 0x0
-    field public static final int MODULATION_AUTO = 1; // 0x1
-    field public static final int MODULATION_MOD_1024QAM = 32; // 0x20
-    field public static final int MODULATION_MOD_16QAM = 4; // 0x4
-    field public static final int MODULATION_MOD_256QAM = 16; // 0x10
-    field public static final int MODULATION_MOD_4096QAM = 64; // 0x40
-    field public static final int MODULATION_MOD_64QAM = 8; // 0x8
-    field public static final int MODULATION_MOD_QPSK = 2; // 0x2
-    field public static final int MODULATION_UNDEFINED = 0; // 0x0
-    field public static final int TIME_INTERLEAVE_MODE_AUTO = 1; // 0x1
-    field public static final int TIME_INTERLEAVE_MODE_CTI = 2; // 0x2
-    field public static final int TIME_INTERLEAVE_MODE_HTI = 4; // 0x4
-    field public static final int TIME_INTERLEAVE_MODE_UNDEFINED = 0; // 0x0
-  }
-
-  public static class Atsc3FrontendSettings.Builder {
-    method @NonNull public android.media.tv.tuner.frontend.Atsc3FrontendSettings build();
-    method @NonNull public android.media.tv.tuner.frontend.Atsc3FrontendSettings.Builder setBandwidth(int);
-    method @NonNull public android.media.tv.tuner.frontend.Atsc3FrontendSettings.Builder setDemodOutputFormat(int);
-    method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.Atsc3FrontendSettings.Builder setFrequency(int);
-    method @NonNull public android.media.tv.tuner.frontend.Atsc3FrontendSettings.Builder setPlpSettings(@NonNull android.media.tv.tuner.frontend.Atsc3PlpSettings[]);
-  }
-
-  public class Atsc3PlpInfo {
-    method public boolean getLlsFlag();
-    method public int getPlpId();
-  }
-
-  public class Atsc3PlpSettings {
-    method @NonNull public static android.media.tv.tuner.frontend.Atsc3PlpSettings.Builder builder();
-    method public int getCodeRate();
-    method public int getFec();
-    method public int getInterleaveMode();
-    method public int getModulation();
-    method public int getPlpId();
-  }
-
-  public static class Atsc3PlpSettings.Builder {
-    method @NonNull public android.media.tv.tuner.frontend.Atsc3PlpSettings build();
-    method @NonNull public android.media.tv.tuner.frontend.Atsc3PlpSettings.Builder setCodeRate(int);
-    method @NonNull public android.media.tv.tuner.frontend.Atsc3PlpSettings.Builder setFec(int);
-    method @NonNull public android.media.tv.tuner.frontend.Atsc3PlpSettings.Builder setInterleaveMode(int);
-    method @NonNull public android.media.tv.tuner.frontend.Atsc3PlpSettings.Builder setModulation(int);
-    method @NonNull public android.media.tv.tuner.frontend.Atsc3PlpSettings.Builder setPlpId(int);
-  }
-
-  public class AtscFrontendCapabilities extends android.media.tv.tuner.frontend.FrontendCapabilities {
-    method public int getModulationCapability();
-  }
-
-  public class AtscFrontendSettings extends android.media.tv.tuner.frontend.FrontendSettings {
-    method @NonNull public static android.media.tv.tuner.frontend.AtscFrontendSettings.Builder builder();
-    method public int getModulation();
-    method public int getType();
-    field public static final int MODULATION_AUTO = 1; // 0x1
-    field public static final int MODULATION_MOD_16VSB = 8; // 0x8
-    field public static final int MODULATION_MOD_8VSB = 4; // 0x4
-    field public static final int MODULATION_UNDEFINED = 0; // 0x0
-  }
-
-  public static class AtscFrontendSettings.Builder {
-    method @NonNull public android.media.tv.tuner.frontend.AtscFrontendSettings build();
-    method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.AtscFrontendSettings.Builder setFrequency(int);
-    method @NonNull public android.media.tv.tuner.frontend.AtscFrontendSettings.Builder setModulation(int);
-  }
-
-  public final class DtmbFrontendCapabilities extends android.media.tv.tuner.frontend.FrontendCapabilities {
-    method public int getBandwidthCapability();
-    method public int getCodeRateCapability();
-    method public int getGuardIntervalCapability();
-    method public int getModulationCapability();
-    method public int getTimeInterleaveModeCapability();
-    method public int getTransmissionModeCapability();
-  }
-
-  public final class DtmbFrontendSettings extends android.media.tv.tuner.frontend.FrontendSettings {
-    method @NonNull public static android.media.tv.tuner.frontend.DtmbFrontendSettings.Builder builder();
-    method public int getBandwidth();
-    method public int getCodeRate();
-    method public int getGuardInterval();
-    method public int getModulation();
-    method public int getTimeInterleaveMode();
-    method public int getTransmissionMode();
-    method public int getType();
-    field public static final int BANDWIDTH_6MHZ = 4; // 0x4
-    field public static final int BANDWIDTH_8MHZ = 2; // 0x2
-    field public static final int BANDWIDTH_AUTO = 1; // 0x1
-    field public static final int BANDWIDTH_UNDEFINED = 0; // 0x0
-    field public static final int CODERATE_2_5 = 2; // 0x2
-    field public static final int CODERATE_3_5 = 4; // 0x4
-    field public static final int CODERATE_4_5 = 8; // 0x8
-    field public static final int CODERATE_AUTO = 1; // 0x1
-    field public static final int CODERATE_UNDEFINED = 0; // 0x0
-    field public static final int GUARD_INTERVAL_AUTO = 1; // 0x1
-    field public static final int GUARD_INTERVAL_PN_420_CONST = 16; // 0x10
-    field public static final int GUARD_INTERVAL_PN_420_VARIOUS = 2; // 0x2
-    field public static final int GUARD_INTERVAL_PN_595_CONST = 4; // 0x4
-    field public static final int GUARD_INTERVAL_PN_945_CONST = 32; // 0x20
-    field public static final int GUARD_INTERVAL_PN_945_VARIOUS = 8; // 0x8
-    field public static final int GUARD_INTERVAL_PN_RESERVED = 64; // 0x40
-    field public static final int GUARD_INTERVAL_UNDEFINED = 0; // 0x0
-    field public static final int MODULATION_CONSTELLATION_16QAM = 8; // 0x8
-    field public static final int MODULATION_CONSTELLATION_32QAM = 16; // 0x10
-    field public static final int MODULATION_CONSTELLATION_4QAM = 2; // 0x2
-    field public static final int MODULATION_CONSTELLATION_4QAM_NR = 4; // 0x4
-    field public static final int MODULATION_CONSTELLATION_64QAM = 32; // 0x20
-    field public static final int MODULATION_CONSTELLATION_AUTO = 1; // 0x1
-    field public static final int MODULATION_CONSTELLATION_UNDEFINED = 0; // 0x0
-    field public static final int TIME_INTERLEAVE_MODE_AUTO = 1; // 0x1
-    field public static final int TIME_INTERLEAVE_MODE_TIMER_INT_240 = 2; // 0x2
-    field public static final int TIME_INTERLEAVE_MODE_TIMER_INT_720 = 4; // 0x4
-    field public static final int TIME_INTERLEAVE_MODE_UNDEFINED = 0; // 0x0
-    field public static final int TRANSMISSION_MODE_AUTO = 1; // 0x1
-    field public static final int TRANSMISSION_MODE_C1 = 2; // 0x2
-    field public static final int TRANSMISSION_MODE_C3780 = 4; // 0x4
-    field public static final int TRANSMISSION_MODE_UNDEFINED = 0; // 0x0
-  }
-
-  public static final class DtmbFrontendSettings.Builder {
-    method @NonNull public android.media.tv.tuner.frontend.DtmbFrontendSettings build();
-    method @NonNull public android.media.tv.tuner.frontend.DtmbFrontendSettings.Builder setBandwidth(int);
-    method @NonNull public android.media.tv.tuner.frontend.DtmbFrontendSettings.Builder setCodeRate(int);
-    method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.DtmbFrontendSettings.Builder setFrequency(int);
-    method @NonNull public android.media.tv.tuner.frontend.DtmbFrontendSettings.Builder setGuardInterval(int);
-    method @NonNull public android.media.tv.tuner.frontend.DtmbFrontendSettings.Builder setModulation(int);
-    method @NonNull public android.media.tv.tuner.frontend.DtmbFrontendSettings.Builder setTimeInterleaveMode(int);
-    method @NonNull public android.media.tv.tuner.frontend.DtmbFrontendSettings.Builder setTransmissionMode(int);
-  }
-
-  public class DvbcFrontendCapabilities extends android.media.tv.tuner.frontend.FrontendCapabilities {
-    method public int getAnnexCapability();
-    method public long getCodeRateCapability();
-    method @Deprecated public int getFecCapability();
-    method public int getModulationCapability();
-  }
-
-  public class DvbcFrontendSettings extends android.media.tv.tuner.frontend.FrontendSettings {
-    method @NonNull public static android.media.tv.tuner.frontend.DvbcFrontendSettings.Builder builder();
-    method public int getAnnex();
-    method public int getBandwidth();
-    method public long getInnerFec();
-    method public int getModulation();
-    method public int getOuterFec();
-    method public int getSpectralInversion();
-    method public int getSymbolRate();
-    method public int getTimeInterleaveMode();
-    method public int getType();
-    field public static final int ANNEX_A = 1; // 0x1
-    field public static final int ANNEX_B = 2; // 0x2
-    field public static final int ANNEX_C = 4; // 0x4
-    field public static final int ANNEX_UNDEFINED = 0; // 0x0
-    field public static final int BANDWIDTH_5MHZ = 1; // 0x1
-    field public static final int BANDWIDTH_6MHZ = 2; // 0x2
-    field public static final int BANDWIDTH_7MHZ = 4; // 0x4
-    field public static final int BANDWIDTH_8MHZ = 8; // 0x8
-    field public static final int BANDWIDTH_UNDEFINED = 0; // 0x0
-    field public static final int MODULATION_AUTO = 1; // 0x1
-    field public static final int MODULATION_MOD_128QAM = 16; // 0x10
-    field public static final int MODULATION_MOD_16QAM = 2; // 0x2
-    field public static final int MODULATION_MOD_256QAM = 32; // 0x20
-    field public static final int MODULATION_MOD_32QAM = 4; // 0x4
-    field public static final int MODULATION_MOD_64QAM = 8; // 0x8
-    field public static final int MODULATION_UNDEFINED = 0; // 0x0
-    field public static final int OUTER_FEC_OUTER_FEC_NONE = 1; // 0x1
-    field public static final int OUTER_FEC_OUTER_FEC_RS = 2; // 0x2
-    field public static final int OUTER_FEC_UNDEFINED = 0; // 0x0
-    field @Deprecated public static final int SPECTRAL_INVERSION_INVERTED = 2; // 0x2
-    field @Deprecated public static final int SPECTRAL_INVERSION_NORMAL = 1; // 0x1
-    field @Deprecated public static final int SPECTRAL_INVERSION_UNDEFINED = 0; // 0x0
-    field public static final int TIME_INTERLEAVE_MODE_128_1_0 = 2; // 0x2
-    field public static final int TIME_INTERLEAVE_MODE_128_1_1 = 4; // 0x4
-    field public static final int TIME_INTERLEAVE_MODE_128_2 = 128; // 0x80
-    field public static final int TIME_INTERLEAVE_MODE_128_3 = 256; // 0x100
-    field public static final int TIME_INTERLEAVE_MODE_128_4 = 512; // 0x200
-    field public static final int TIME_INTERLEAVE_MODE_16_8 = 32; // 0x20
-    field public static final int TIME_INTERLEAVE_MODE_32_4 = 16; // 0x10
-    field public static final int TIME_INTERLEAVE_MODE_64_2 = 8; // 0x8
-    field public static final int TIME_INTERLEAVE_MODE_8_16 = 64; // 0x40
-    field public static final int TIME_INTERLEAVE_MODE_AUTO = 1; // 0x1
-    field public static final int TIME_INTERLEAVE_MODE_UNDEFINED = 0; // 0x0
-  }
-
-  public static class DvbcFrontendSettings.Builder {
-    method @NonNull public android.media.tv.tuner.frontend.DvbcFrontendSettings build();
-    method @NonNull public android.media.tv.tuner.frontend.DvbcFrontendSettings.Builder setAnnex(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbcFrontendSettings.Builder setBandwidth(int);
-    method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.DvbcFrontendSettings.Builder setFrequency(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbcFrontendSettings.Builder setInnerFec(long);
-    method @NonNull public android.media.tv.tuner.frontend.DvbcFrontendSettings.Builder setModulation(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbcFrontendSettings.Builder setOuterFec(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbcFrontendSettings.Builder setSpectralInversion(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbcFrontendSettings.Builder setSymbolRate(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbcFrontendSettings.Builder setTimeInterleaveMode(int);
-  }
-
-  public class DvbsCodeRate {
-    method @NonNull public static android.media.tv.tuner.frontend.DvbsCodeRate.Builder builder();
-    method public int getBitsPer1000Symbol();
-    method public long getInnerFec();
-    method public boolean isLinear();
-    method public boolean isShortFrameEnabled();
-  }
-
-  public static class DvbsCodeRate.Builder {
-    method @NonNull public android.media.tv.tuner.frontend.DvbsCodeRate build();
-    method @NonNull public android.media.tv.tuner.frontend.DvbsCodeRate.Builder setBitsPer1000Symbol(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbsCodeRate.Builder setInnerFec(long);
-    method @NonNull public android.media.tv.tuner.frontend.DvbsCodeRate.Builder setLinear(boolean);
-    method @NonNull public android.media.tv.tuner.frontend.DvbsCodeRate.Builder setShortFrameEnabled(boolean);
-  }
-
-  public class DvbsFrontendCapabilities extends android.media.tv.tuner.frontend.FrontendCapabilities {
-    method public long getInnerFecCapability();
-    method public int getModulationCapability();
-    method public int getStandardCapability();
-  }
-
-  public class DvbsFrontendSettings extends android.media.tv.tuner.frontend.FrontendSettings {
-    method @NonNull public static android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder builder();
-    method @Nullable public android.media.tv.tuner.frontend.DvbsCodeRate getCodeRate();
-    method public boolean getCouldHandleDiseqcRxMessage();
-    method public int getInputStreamId();
-    method public int getModulation();
-    method public int getPilot();
-    method public int getRolloff();
-    method public int getScanType();
-    method public int getStandard();
-    method public int getSymbolRate();
-    method public int getType();
-    method public int getVcmMode();
-    field public static final int MODULATION_AUTO = 1; // 0x1
-    field public static final int MODULATION_MOD_128APSK = 2048; // 0x800
-    field public static final int MODULATION_MOD_16APSK = 256; // 0x100
-    field public static final int MODULATION_MOD_16PSK = 16; // 0x10
-    field public static final int MODULATION_MOD_16QAM = 8; // 0x8
-    field public static final int MODULATION_MOD_256APSK = 4096; // 0x1000
-    field public static final int MODULATION_MOD_32APSK = 512; // 0x200
-    field public static final int MODULATION_MOD_32PSK = 32; // 0x20
-    field public static final int MODULATION_MOD_64APSK = 1024; // 0x400
-    field public static final int MODULATION_MOD_8APSK = 128; // 0x80
-    field public static final int MODULATION_MOD_8PSK = 4; // 0x4
-    field public static final int MODULATION_MOD_ACM = 64; // 0x40
-    field public static final int MODULATION_MOD_QPSK = 2; // 0x2
-    field public static final int MODULATION_MOD_RESERVED = 8192; // 0x2000
-    field public static final int MODULATION_UNDEFINED = 0; // 0x0
-    field public static final int PILOT_AUTO = 3; // 0x3
-    field public static final int PILOT_OFF = 2; // 0x2
-    field public static final int PILOT_ON = 1; // 0x1
-    field public static final int PILOT_UNDEFINED = 0; // 0x0
-    field public static final int ROLLOFF_0_10 = 5; // 0x5
-    field public static final int ROLLOFF_0_15 = 4; // 0x4
-    field public static final int ROLLOFF_0_20 = 3; // 0x3
-    field public static final int ROLLOFF_0_25 = 2; // 0x2
-    field public static final int ROLLOFF_0_35 = 1; // 0x1
-    field public static final int ROLLOFF_0_5 = 6; // 0x6
-    field public static final int ROLLOFF_UNDEFINED = 0; // 0x0
-    field public static final int SCAN_TYPE_DIRECT = 1; // 0x1
-    field public static final int SCAN_TYPE_DISEQC = 2; // 0x2
-    field public static final int SCAN_TYPE_JESS = 4; // 0x4
-    field public static final int SCAN_TYPE_UNDEFINED = 0; // 0x0
-    field public static final int SCAN_TYPE_UNICABLE = 3; // 0x3
-    field public static final int STANDARD_AUTO = 1; // 0x1
-    field public static final int STANDARD_S = 2; // 0x2
-    field public static final int STANDARD_S2 = 4; // 0x4
-    field public static final int STANDARD_S2X = 8; // 0x8
-    field public static final int VCM_MODE_AUTO = 1; // 0x1
-    field public static final int VCM_MODE_MANUAL = 2; // 0x2
-    field public static final int VCM_MODE_UNDEFINED = 0; // 0x0
-  }
-
-  public static class DvbsFrontendSettings.Builder {
-    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings build();
-    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setCodeRate(@Nullable android.media.tv.tuner.frontend.DvbsCodeRate);
-    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setCouldHandleDiseqcRxMessage(boolean);
-    method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setFrequency(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setInputStreamId(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setModulation(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setPilot(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setRolloff(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setScanType(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setStandard(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setSymbolRate(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setVcmMode(int);
-  }
-
-  public class DvbtFrontendCapabilities extends android.media.tv.tuner.frontend.FrontendCapabilities {
-    method public int getBandwidthCapability();
-    method public int getCodeRateCapability();
-    method public int getConstellationCapability();
-    method public int getGuardIntervalCapability();
-    method public int getHierarchyCapability();
-    method public int getTransmissionModeCapability();
-    method public boolean isMisoSupported();
-    method public boolean isT2Supported();
-  }
-
-  public class DvbtFrontendSettings extends android.media.tv.tuner.frontend.FrontendSettings {
-    method @NonNull public static android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder builder();
-    method public int getBandwidth();
-    method public int getConstellation();
-    method public int getGuardInterval();
-    method public int getHierarchy();
-    method public int getHighPriorityCodeRate();
-    method public int getLowPriorityCodeRate();
-    method public int getPlpGroupId();
-    method public int getPlpId();
-    method public int getPlpMode();
-    method public int getStandard();
-    method public int getTransmissionMode();
-    method public int getType();
-    method public boolean isHighPriority();
-    method public boolean isMiso();
-    field public static final int BANDWIDTH_10MHZ = 64; // 0x40
-    field public static final int BANDWIDTH_1_7MHZ = 32; // 0x20
-    field public static final int BANDWIDTH_5MHZ = 16; // 0x10
-    field public static final int BANDWIDTH_6MHZ = 8; // 0x8
-    field public static final int BANDWIDTH_7MHZ = 4; // 0x4
-    field public static final int BANDWIDTH_8MHZ = 2; // 0x2
-    field public static final int BANDWIDTH_AUTO = 1; // 0x1
-    field public static final int BANDWIDTH_UNDEFINED = 0; // 0x0
-    field public static final int CODERATE_1_2 = 2; // 0x2
-    field public static final int CODERATE_2_3 = 4; // 0x4
-    field public static final int CODERATE_3_4 = 8; // 0x8
-    field public static final int CODERATE_3_5 = 64; // 0x40
-    field public static final int CODERATE_4_5 = 128; // 0x80
-    field public static final int CODERATE_5_6 = 16; // 0x10
-    field public static final int CODERATE_6_7 = 256; // 0x100
-    field public static final int CODERATE_7_8 = 32; // 0x20
-    field public static final int CODERATE_8_9 = 512; // 0x200
-    field public static final int CODERATE_AUTO = 1; // 0x1
-    field public static final int CODERATE_UNDEFINED = 0; // 0x0
-    field public static final int CONSTELLATION_16QAM = 4; // 0x4
-    field public static final int CONSTELLATION_16QAM_R = 64; // 0x40
-    field public static final int CONSTELLATION_256QAM = 16; // 0x10
-    field public static final int CONSTELLATION_256QAM_R = 256; // 0x100
-    field public static final int CONSTELLATION_64QAM = 8; // 0x8
-    field public static final int CONSTELLATION_64QAM_R = 128; // 0x80
-    field public static final int CONSTELLATION_AUTO = 1; // 0x1
-    field public static final int CONSTELLATION_QPSK = 2; // 0x2
-    field public static final int CONSTELLATION_QPSK_R = 32; // 0x20
-    field public static final int CONSTELLATION_UNDEFINED = 0; // 0x0
-    field public static final int GUARD_INTERVAL_19_128 = 64; // 0x40
-    field public static final int GUARD_INTERVAL_19_256 = 128; // 0x80
-    field public static final int GUARD_INTERVAL_1_128 = 32; // 0x20
-    field public static final int GUARD_INTERVAL_1_16 = 4; // 0x4
-    field public static final int GUARD_INTERVAL_1_32 = 2; // 0x2
-    field public static final int GUARD_INTERVAL_1_4 = 16; // 0x10
-    field public static final int GUARD_INTERVAL_1_8 = 8; // 0x8
-    field public static final int GUARD_INTERVAL_AUTO = 1; // 0x1
-    field public static final int GUARD_INTERVAL_UNDEFINED = 0; // 0x0
-    field public static final int HIERARCHY_1_INDEPTH = 64; // 0x40
-    field public static final int HIERARCHY_1_NATIVE = 4; // 0x4
-    field public static final int HIERARCHY_2_INDEPTH = 128; // 0x80
-    field public static final int HIERARCHY_2_NATIVE = 8; // 0x8
-    field public static final int HIERARCHY_4_INDEPTH = 256; // 0x100
-    field public static final int HIERARCHY_4_NATIVE = 16; // 0x10
-    field public static final int HIERARCHY_AUTO = 1; // 0x1
-    field public static final int HIERARCHY_NON_INDEPTH = 32; // 0x20
-    field public static final int HIERARCHY_NON_NATIVE = 2; // 0x2
-    field public static final int HIERARCHY_UNDEFINED = 0; // 0x0
-    field public static final int PLP_MODE_AUTO = 1; // 0x1
-    field public static final int PLP_MODE_MANUAL = 2; // 0x2
-    field public static final int PLP_MODE_UNDEFINED = 0; // 0x0
-    field public static final int STANDARD_AUTO = 1; // 0x1
-    field public static final int STANDARD_T = 2; // 0x2
-    field public static final int STANDARD_T2 = 4; // 0x4
-    field public static final int TRANSMISSION_MODE_16K = 32; // 0x20
-    field public static final int TRANSMISSION_MODE_1K = 16; // 0x10
-    field public static final int TRANSMISSION_MODE_2K = 2; // 0x2
-    field public static final int TRANSMISSION_MODE_32K = 64; // 0x40
-    field public static final int TRANSMISSION_MODE_4K = 8; // 0x8
-    field public static final int TRANSMISSION_MODE_8K = 4; // 0x4
-    field public static final int TRANSMISSION_MODE_AUTO = 1; // 0x1
-    field public static final int TRANSMISSION_MODE_EXTENDED_16K = 256; // 0x100
-    field public static final int TRANSMISSION_MODE_EXTENDED_32K = 512; // 0x200
-    field public static final int TRANSMISSION_MODE_EXTENDED_8K = 128; // 0x80
-    field public static final int TRANSMISSION_MODE_UNDEFINED = 0; // 0x0
-  }
-
-  public static class DvbtFrontendSettings.Builder {
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings build();
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setBandwidth(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setConstellation(int);
-    method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setFrequency(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setGuardInterval(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setHierarchy(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setHighPriority(boolean);
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setHighPriorityCodeRate(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setLowPriorityCodeRate(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setMiso(boolean);
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setPlpGroupId(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setPlpId(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setPlpMode(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setStandard(int);
-    method @NonNull public android.media.tv.tuner.frontend.DvbtFrontendSettings.Builder setTransmissionMode(int);
-  }
-
-  public abstract class FrontendCapabilities {
-    ctor public FrontendCapabilities();
-  }
-
-  public class FrontendInfo {
-    method public int getAcquireRange();
-    method public int getExclusiveGroupId();
-    method @NonNull public android.util.Range<java.lang.Integer> getFrequencyRange();
-    method @NonNull public android.media.tv.tuner.frontend.FrontendCapabilities getFrontendCapabilities();
-    method public int getId();
-    method @NonNull public int[] getStatusCapabilities();
-    method @NonNull public android.util.Range<java.lang.Integer> getSymbolRateRange();
-    method public int getType();
-  }
-
-  public abstract class FrontendSettings {
-    method @IntRange(from=1) public int getEndFrequency();
-    method public int getFrequency();
-    method public int getFrontendSpectralInversion();
-    method public abstract int getType();
-    method @IntRange(from=1) public void setEndFrequency(int);
-    method public void setSpectralInversion(int);
-    field public static final long FEC_11_15 = 4194304L; // 0x400000L
-    field public static final long FEC_11_20 = 8388608L; // 0x800000L
-    field public static final long FEC_11_45 = 16777216L; // 0x1000000L
-    field public static final long FEC_13_18 = 33554432L; // 0x2000000L
-    field public static final long FEC_13_45 = 67108864L; // 0x4000000L
-    field public static final long FEC_14_45 = 134217728L; // 0x8000000L
-    field public static final long FEC_1_2 = 2L; // 0x2L
-    field public static final long FEC_1_3 = 4L; // 0x4L
-    field public static final long FEC_1_4 = 8L; // 0x8L
-    field public static final long FEC_1_5 = 16L; // 0x10L
-    field public static final long FEC_23_36 = 268435456L; // 0x10000000L
-    field public static final long FEC_25_36 = 536870912L; // 0x20000000L
-    field public static final long FEC_26_45 = 1073741824L; // 0x40000000L
-    field public static final long FEC_28_45 = -2147483648L; // 0xffffffff80000000L
-    field public static final long FEC_29_45 = 1L; // 0x1L
-    field public static final long FEC_2_3 = 32L; // 0x20L
-    field public static final long FEC_2_5 = 64L; // 0x40L
-    field public static final long FEC_2_9 = 128L; // 0x80L
-    field public static final long FEC_31_45 = 2L; // 0x2L
-    field public static final long FEC_32_45 = 4L; // 0x4L
-    field public static final long FEC_3_4 = 256L; // 0x100L
-    field public static final long FEC_3_5 = 512L; // 0x200L
-    field public static final long FEC_4_15 = 2048L; // 0x800L
-    field public static final long FEC_4_5 = 1024L; // 0x400L
-    field public static final long FEC_5_6 = 4096L; // 0x1000L
-    field public static final long FEC_5_9 = 8192L; // 0x2000L
-    field public static final long FEC_6_7 = 16384L; // 0x4000L
-    field public static final long FEC_77_90 = 8L; // 0x8L
-    field public static final long FEC_7_15 = 131072L; // 0x20000L
-    field public static final long FEC_7_8 = 32768L; // 0x8000L
-    field public static final long FEC_7_9 = 65536L; // 0x10000L
-    field public static final long FEC_8_15 = 524288L; // 0x80000L
-    field public static final long FEC_8_9 = 262144L; // 0x40000L
-    field public static final long FEC_9_10 = 1048576L; // 0x100000L
-    field public static final long FEC_9_20 = 2097152L; // 0x200000L
-    field public static final long FEC_AUTO = 1L; // 0x1L
-    field public static final long FEC_UNDEFINED = 0L; // 0x0L
-    field public static final int FRONTEND_SPECTRAL_INVERSION_INVERTED = 2; // 0x2
-    field public static final int FRONTEND_SPECTRAL_INVERSION_NORMAL = 1; // 0x1
-    field public static final int FRONTEND_SPECTRAL_INVERSION_UNDEFINED = 0; // 0x0
-    field public static final int TYPE_ANALOG = 1; // 0x1
-    field public static final int TYPE_ATSC = 2; // 0x2
-    field public static final int TYPE_ATSC3 = 3; // 0x3
-    field public static final int TYPE_DTMB = 10; // 0xa
-    field public static final int TYPE_DVBC = 4; // 0x4
-    field public static final int TYPE_DVBS = 5; // 0x5
-    field public static final int TYPE_DVBT = 6; // 0x6
-    field public static final int TYPE_ISDBS = 7; // 0x7
-    field public static final int TYPE_ISDBS3 = 8; // 0x8
-    field public static final int TYPE_ISDBT = 9; // 0x9
-    field public static final int TYPE_UNDEFINED = 0; // 0x0
-  }
-
-  public class FrontendStatus {
-    method public int getAgc();
-    method @NonNull public android.media.tv.tuner.frontend.FrontendStatus.Atsc3PlpTuningInfo[] getAtsc3PlpTuningInfo();
-    method public int getBandwidth();
-    method public int getBer();
-    method @NonNull public int[] getBers();
-    method @NonNull public int[] getCodeRates();
-    method @NonNull public int[] getExtendedModulations();
-    method public int getFreqOffset();
-    method public int getGuardInterval();
-    method public int getHierarchy();
-    method public long getInnerFec();
-    method @NonNull public int[] getInterleaving();
-    method @IntRange(from=0, to=255) @NonNull public int[] getIsdbtSegment();
-    method @NonNull public boolean[] getLayerErrors();
-    method public int getLnbVoltage();
-    method public int getMer();
-    method public int getModulation();
-    method public int getPer();
-    method public int getPerBer();
-    method public int getPlpId();
-    method public int getRollOff();
-    method public int getSignalQuality();
-    method public int getSignalStrength();
-    method public int getSnr();
-    method public int getSpectralInversion();
-    method public int getSymbolRate();
-    method @IntRange(from=0, to=65535) public int getSystemId();
-    method public int getTransmissionMode();
-    method @NonNull public int[] getTsDataRate();
-    method public int getUec();
-    method public boolean isDemodLocked();
-    method public boolean isEwbs();
-    method public boolean isLinear();
-    method public boolean isLnaOn();
-    method public boolean isMisoEnabled();
-    method public boolean isRfLocked();
-    method public boolean isShortFramesEnabled();
-    field public static final int FRONTEND_STATUS_TYPE_AGC = 14; // 0xe
-    field public static final int FRONTEND_STATUS_TYPE_ATSC3_PLP_INFO = 21; // 0x15
-    field public static final int FRONTEND_STATUS_TYPE_BANDWIDTH = 25; // 0x19
-    field public static final int FRONTEND_STATUS_TYPE_BER = 2; // 0x2
-    field public static final int FRONTEND_STATUS_TYPE_BERS = 23; // 0x17
-    field public static final int FRONTEND_STATUS_TYPE_CODERATES = 24; // 0x18
-    field public static final int FRONTEND_STATUS_TYPE_DEMOD_LOCK = 0; // 0x0
-    field public static final int FRONTEND_STATUS_TYPE_EWBS = 13; // 0xd
-    field public static final int FRONTEND_STATUS_TYPE_FEC = 8; // 0x8
-    field public static final int FRONTEND_STATUS_TYPE_FREQ_OFFSET = 18; // 0x12
-    field public static final int FRONTEND_STATUS_TYPE_GUARD_INTERVAL = 26; // 0x1a
-    field public static final int FRONTEND_STATUS_TYPE_HIERARCHY = 19; // 0x13
-    field public static final int FRONTEND_STATUS_TYPE_INTERLEAVINGS = 30; // 0x1e
-    field public static final int FRONTEND_STATUS_TYPE_ISDBT_SEGMENTS = 31; // 0x1f
-    field public static final int FRONTEND_STATUS_TYPE_IS_LINEAR = 35; // 0x23
-    field public static final int FRONTEND_STATUS_TYPE_IS_MISO = 34; // 0x22
-    field public static final int FRONTEND_STATUS_TYPE_IS_SHORT_FRAMES = 36; // 0x24
-    field public static final int FRONTEND_STATUS_TYPE_LAYER_ERROR = 16; // 0x10
-    field public static final int FRONTEND_STATUS_TYPE_LNA = 15; // 0xf
-    field public static final int FRONTEND_STATUS_TYPE_LNB_VOLTAGE = 11; // 0xb
-    field public static final int FRONTEND_STATUS_TYPE_MER = 17; // 0x11
-    field public static final int FRONTEND_STATUS_TYPE_MODULATION = 9; // 0x9
-    field public static final int FRONTEND_STATUS_TYPE_MODULATIONS_EXT = 22; // 0x16
-    field public static final int FRONTEND_STATUS_TYPE_PER = 3; // 0x3
-    field public static final int FRONTEND_STATUS_TYPE_PLP_ID = 12; // 0xc
-    field public static final int FRONTEND_STATUS_TYPE_PRE_BER = 4; // 0x4
-    field public static final int FRONTEND_STATUS_TYPE_RF_LOCK = 20; // 0x14
-    field public static final int FRONTEND_STATUS_TYPE_ROLL_OFF = 33; // 0x21
-    field public static final int FRONTEND_STATUS_TYPE_SIGNAL_QUALITY = 5; // 0x5
-    field public static final int FRONTEND_STATUS_TYPE_SIGNAL_STRENGTH = 6; // 0x6
-    field public static final int FRONTEND_STATUS_TYPE_SNR = 1; // 0x1
-    field public static final int FRONTEND_STATUS_TYPE_SPECTRAL = 10; // 0xa
-    field public static final int FRONTEND_STATUS_TYPE_SYMBOL_RATE = 7; // 0x7
-    field public static final int FRONTEND_STATUS_TYPE_T2_SYSTEM_ID = 29; // 0x1d
-    field public static final int FRONTEND_STATUS_TYPE_TRANSMISSION_MODE = 27; // 0x1b
-    field public static final int FRONTEND_STATUS_TYPE_TS_DATA_RATES = 32; // 0x20
-    field public static final int FRONTEND_STATUS_TYPE_UEC = 28; // 0x1c
-  }
-
-  public static class FrontendStatus.Atsc3PlpTuningInfo {
-    method public int getPlpId();
-    method public int getUec();
-    method public boolean isLocked();
-  }
-
-  public class Isdbs3FrontendCapabilities extends android.media.tv.tuner.frontend.FrontendCapabilities {
-    method public int getCodeRateCapability();
-    method public int getModulationCapability();
-  }
-
-  public class Isdbs3FrontendSettings extends android.media.tv.tuner.frontend.FrontendSettings {
-    method @NonNull public static android.media.tv.tuner.frontend.Isdbs3FrontendSettings.Builder builder();
-    method public int getCodeRate();
-    method public int getModulation();
-    method public int getRolloff();
-    method public int getStreamId();
-    method public int getStreamIdType();
-    method public int getSymbolRate();
-    method public int getType();
-    field public static final int CODERATE_1_2 = 8; // 0x8
-    field public static final int CODERATE_1_3 = 2; // 0x2
-    field public static final int CODERATE_2_3 = 32; // 0x20
-    field public static final int CODERATE_2_5 = 4; // 0x4
-    field public static final int CODERATE_3_4 = 64; // 0x40
-    field public static final int CODERATE_3_5 = 16; // 0x10
-    field public static final int CODERATE_4_5 = 256; // 0x100
-    field public static final int CODERATE_5_6 = 512; // 0x200
-    field public static final int CODERATE_7_8 = 1024; // 0x400
-    field public static final int CODERATE_7_9 = 128; // 0x80
-    field public static final int CODERATE_9_10 = 2048; // 0x800
-    field public static final int CODERATE_AUTO = 1; // 0x1
-    field public static final int CODERATE_UNDEFINED = 0; // 0x0
-    field public static final int MODULATION_AUTO = 1; // 0x1
-    field public static final int MODULATION_MOD_16APSK = 16; // 0x10
-    field public static final int MODULATION_MOD_32APSK = 32; // 0x20
-    field public static final int MODULATION_MOD_8PSK = 8; // 0x8
-    field public static final int MODULATION_MOD_BPSK = 2; // 0x2
-    field public static final int MODULATION_MOD_QPSK = 4; // 0x4
-    field public static final int MODULATION_UNDEFINED = 0; // 0x0
-    field public static final int ROLLOFF_0_03 = 1; // 0x1
-    field public static final int ROLLOFF_UNDEFINED = 0; // 0x0
-  }
-
-  public static class Isdbs3FrontendSettings.Builder {
-    method @NonNull public android.media.tv.tuner.frontend.Isdbs3FrontendSettings build();
-    method @NonNull public android.media.tv.tuner.frontend.Isdbs3FrontendSettings.Builder setCodeRate(int);
-    method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.Isdbs3FrontendSettings.Builder setFrequency(int);
-    method @NonNull public android.media.tv.tuner.frontend.Isdbs3FrontendSettings.Builder setModulation(int);
-    method @NonNull public android.media.tv.tuner.frontend.Isdbs3FrontendSettings.Builder setRolloff(int);
-    method @NonNull public android.media.tv.tuner.frontend.Isdbs3FrontendSettings.Builder setStreamId(int);
-    method @NonNull public android.media.tv.tuner.frontend.Isdbs3FrontendSettings.Builder setStreamIdType(int);
-    method @NonNull public android.media.tv.tuner.frontend.Isdbs3FrontendSettings.Builder setSymbolRate(int);
-  }
-
-  public class IsdbsFrontendCapabilities extends android.media.tv.tuner.frontend.FrontendCapabilities {
-    method public int getCodeRateCapability();
-    method public int getModulationCapability();
-  }
-
-  public class IsdbsFrontendSettings extends android.media.tv.tuner.frontend.FrontendSettings {
-    method @NonNull public static android.media.tv.tuner.frontend.IsdbsFrontendSettings.Builder builder();
-    method public int getCodeRate();
-    method public int getModulation();
-    method public int getRolloff();
-    method public int getStreamId();
-    method public int getStreamIdType();
-    method public int getSymbolRate();
-    method public int getType();
-    field public static final int CODERATE_1_2 = 2; // 0x2
-    field public static final int CODERATE_2_3 = 4; // 0x4
-    field public static final int CODERATE_3_4 = 8; // 0x8
-    field public static final int CODERATE_5_6 = 16; // 0x10
-    field public static final int CODERATE_7_8 = 32; // 0x20
-    field public static final int CODERATE_AUTO = 1; // 0x1
-    field public static final int CODERATE_UNDEFINED = 0; // 0x0
-    field public static final int MODULATION_AUTO = 1; // 0x1
-    field public static final int MODULATION_MOD_BPSK = 2; // 0x2
-    field public static final int MODULATION_MOD_QPSK = 4; // 0x4
-    field public static final int MODULATION_MOD_TC8PSK = 8; // 0x8
-    field public static final int MODULATION_UNDEFINED = 0; // 0x0
-    field public static final int ROLLOFF_0_35 = 1; // 0x1
-    field public static final int ROLLOFF_UNDEFINED = 0; // 0x0
-    field public static final int STREAM_ID_TYPE_ID = 0; // 0x0
-    field public static final int STREAM_ID_TYPE_RELATIVE_NUMBER = 1; // 0x1
-  }
-
-  public static class IsdbsFrontendSettings.Builder {
-    method @NonNull public android.media.tv.tuner.frontend.IsdbsFrontendSettings build();
-    method @NonNull public android.media.tv.tuner.frontend.IsdbsFrontendSettings.Builder setCodeRate(int);
-    method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.IsdbsFrontendSettings.Builder setFrequency(int);
-    method @NonNull public android.media.tv.tuner.frontend.IsdbsFrontendSettings.Builder setModulation(int);
-    method @NonNull public android.media.tv.tuner.frontend.IsdbsFrontendSettings.Builder setRolloff(int);
-    method @NonNull public android.media.tv.tuner.frontend.IsdbsFrontendSettings.Builder setStreamId(int);
-    method @NonNull public android.media.tv.tuner.frontend.IsdbsFrontendSettings.Builder setStreamIdType(int);
-    method @NonNull public android.media.tv.tuner.frontend.IsdbsFrontendSettings.Builder setSymbolRate(int);
-  }
-
-  public class IsdbtFrontendCapabilities extends android.media.tv.tuner.frontend.FrontendCapabilities {
-    method public int getBandwidthCapability();
-    method public int getCodeRateCapability();
-    method public int getGuardIntervalCapability();
-    method public int getModeCapability();
-    method public int getModulationCapability();
-  }
-
-  public class IsdbtFrontendSettings extends android.media.tv.tuner.frontend.FrontendSettings {
-    method @NonNull public static android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder builder();
-    method public int getBandwidth();
-    method public int getCodeRate();
-    method public int getGuardInterval();
-    method public int getMode();
-    method public int getModulation();
-    method public int getServiceAreaId();
-    method public int getType();
-    field public static final int BANDWIDTH_6MHZ = 8; // 0x8
-    field public static final int BANDWIDTH_7MHZ = 4; // 0x4
-    field public static final int BANDWIDTH_8MHZ = 2; // 0x2
-    field public static final int BANDWIDTH_AUTO = 1; // 0x1
-    field public static final int BANDWIDTH_UNDEFINED = 0; // 0x0
-    field public static final int MODE_1 = 2; // 0x2
-    field public static final int MODE_2 = 4; // 0x4
-    field public static final int MODE_3 = 8; // 0x8
-    field public static final int MODE_AUTO = 1; // 0x1
-    field public static final int MODE_UNDEFINED = 0; // 0x0
-    field public static final int MODULATION_AUTO = 1; // 0x1
-    field public static final int MODULATION_MOD_16QAM = 8; // 0x8
-    field public static final int MODULATION_MOD_64QAM = 16; // 0x10
-    field public static final int MODULATION_MOD_DQPSK = 2; // 0x2
-    field public static final int MODULATION_MOD_QPSK = 4; // 0x4
-    field public static final int MODULATION_UNDEFINED = 0; // 0x0
-  }
-
-  public static class IsdbtFrontendSettings.Builder {
-    method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings build();
-    method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setBandwidth(int);
-    method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setCodeRate(int);
-    method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setFrequency(int);
-    method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setGuardInterval(int);
-    method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setMode(int);
-    method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setModulation(int);
-    method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setServiceAreaId(int);
-  }
-
-  public interface OnTuneEventListener {
-    method public void onTuneEvent(int);
-    field public static final int SIGNAL_LOCKED = 0; // 0x0
-    field public static final int SIGNAL_LOST_LOCK = 2; // 0x2
-    field public static final int SIGNAL_NO_SIGNAL = 1; // 0x1
-  }
-
-  public interface ScanCallback {
-    method public void onAnalogSifStandardReported(int);
-    method public void onAtsc3PlpInfosReported(@NonNull android.media.tv.tuner.frontend.Atsc3PlpInfo[]);
-    method public default void onDvbcAnnexReported(int);
-    method public void onDvbsStandardReported(int);
-    method public void onDvbtStandardReported(int);
-    method public void onFrequenciesReported(@NonNull int[]);
-    method public void onGroupIdsReported(@NonNull int[]);
-    method public void onHierarchyReported(int);
-    method public void onInputStreamIdsReported(@NonNull int[]);
-    method public void onLocked();
-    method public default void onModulationReported(int);
-    method public void onPlpIdsReported(@NonNull int[]);
-    method public default void onPriorityReported(boolean);
-    method public void onProgress(@IntRange(from=0, to=100) int);
-    method public void onScanStopped();
-    method public void onSignalTypeReported(int);
-    method public void onSymbolRatesReported(@NonNull int[]);
-  }
-
-}
-
-package android.media.voice {
-
-  public final class KeyphraseModelManager {
-    method @RequiresPermission("android.permission.MANAGE_VOICE_KEYPHRASES") public void deleteKeyphraseSoundModel(int, @NonNull java.util.Locale);
-    method @Nullable @RequiresPermission("android.permission.MANAGE_VOICE_KEYPHRASES") public android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel getKeyphraseSoundModel(int, @NonNull java.util.Locale);
-    method @RequiresPermission("android.permission.MANAGE_VOICE_KEYPHRASES") public void updateKeyphraseSoundModel(@NonNull android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel);
-  }
-
-}
-
-package android.metrics {
-
-  public class LogMaker {
-    ctor public LogMaker(int);
-    ctor public LogMaker(Object[]);
-    method public android.metrics.LogMaker addTaggedData(int, Object);
-    method public android.metrics.LogMaker clearCategory();
-    method public android.metrics.LogMaker clearPackageName();
-    method public android.metrics.LogMaker clearSubtype();
-    method public android.metrics.LogMaker clearTaggedData(int);
-    method public android.metrics.LogMaker clearType();
-    method public void deserialize(Object[]);
-    method public int getCategory();
-    method public long getCounterBucket();
-    method public String getCounterName();
-    method public int getCounterValue();
-    method public String getPackageName();
-    method public int getProcessId();
-    method public int getSubtype();
-    method public Object getTaggedData(int);
-    method public long getTimestamp();
-    method public int getType();
-    method public int getUid();
-    method public boolean isLongCounterBucket();
-    method public boolean isSubsetOf(android.metrics.LogMaker);
-    method public boolean isValidValue(Object);
-    method public Object[] serialize();
-    method public android.metrics.LogMaker setCategory(int);
-    method public android.metrics.LogMaker setPackageName(String);
-    method public android.metrics.LogMaker setSubtype(int);
-    method public android.metrics.LogMaker setType(int);
-  }
-
-  public class MetricsReader {
-    ctor public MetricsReader();
-    method public void checkpoint();
-    method public boolean hasNext();
-    method public android.metrics.LogMaker next();
-    method public void read(long);
-    method public void reset();
-  }
-
-}
-
-package android.net {
-
-  public class CaptivePortal implements android.os.Parcelable {
-    method public void logEvent(int, @NonNull String);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void reevaluateNetwork();
-    method public void useNetwork();
-    field public static final int APP_REQUEST_REEVALUATION_REQUIRED = 100; // 0x64
-    field public static final int APP_RETURN_DISMISSED = 0; // 0x0
-    field public static final int APP_RETURN_UNWANTED = 1; // 0x1
-    field public static final int APP_RETURN_WANTED_AS_IS = 2; // 0x2
-  }
-
-  public final class CaptivePortalData implements android.os.Parcelable {
-    method public int describeContents();
-    method public long getByteLimit();
-    method public long getExpiryTimeMillis();
-    method public long getRefreshTimeMillis();
-    method @Nullable public android.net.Uri getUserPortalUrl();
-    method @Nullable public android.net.Uri getVenueInfoUrl();
-    method public boolean isCaptive();
-    method public boolean isSessionExtendable();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.CaptivePortalData> CREATOR;
-  }
-
-  public static class CaptivePortalData.Builder {
-    ctor public CaptivePortalData.Builder();
-    ctor public CaptivePortalData.Builder(@Nullable android.net.CaptivePortalData);
-    method @NonNull public android.net.CaptivePortalData build();
-    method @NonNull public android.net.CaptivePortalData.Builder setBytesRemaining(long);
-    method @NonNull public android.net.CaptivePortalData.Builder setCaptive(boolean);
-    method @NonNull public android.net.CaptivePortalData.Builder setExpiryTime(long);
-    method @NonNull public android.net.CaptivePortalData.Builder setRefreshTime(long);
-    method @NonNull public android.net.CaptivePortalData.Builder setSessionExtendable(boolean);
-    method @NonNull public android.net.CaptivePortalData.Builder setUserPortalUrl(@Nullable android.net.Uri);
-    method @NonNull public android.net.CaptivePortalData.Builder setVenueInfoUrl(@Nullable android.net.Uri);
-  }
-
-  public class ConnectivityManager {
-    method @NonNull @RequiresPermission(android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD) public android.net.SocketKeepalive createNattKeepalive(@NonNull android.net.Network, @NonNull android.os.ParcelFileDescriptor, @NonNull java.net.InetAddress, @NonNull java.net.InetAddress, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback);
-    method @NonNull @RequiresPermission(android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD) public android.net.SocketKeepalive createSocketKeepalive(@NonNull android.net.Network, @NonNull java.net.Socket, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public String getCaptivePortalServerUrl();
-    method @Deprecated @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void getLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEntitlementResultListener);
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported();
-    method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_FACTORY}) public int registerNetworkProvider(@NonNull android.net.NetworkProvider);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEventCallback);
-    method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void requestNetwork(@NonNull android.net.NetworkRequest, int, int, @NonNull android.os.Handler, @NonNull android.net.ConnectivityManager.NetworkCallback);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_AIRPLANE_MODE, android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void setAirplaneMode(boolean);
-    method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK}) public boolean shouldAvoidBadWifi();
-    method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(@NonNull android.net.Network, @NonNull android.os.Bundle);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback, android.os.Handler);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void stopTethering(int);
-    method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_FACTORY}) public void unregisterNetworkProvider(@NonNull android.net.NetworkProvider);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void unregisterTetheringEventCallback(@NonNull android.net.ConnectivityManager.OnTetheringEventCallback);
-    field public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC";
-    field public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT";
-    field public static final int TETHERING_BLUETOOTH = 2; // 0x2
-    field public static final int TETHERING_USB = 1; // 0x1
-    field public static final int TETHERING_WIFI = 0; // 0x0
-    field @Deprecated public static final int TETHER_ERROR_ENTITLEMENT_UNKONWN = 13; // 0xd
-    field @Deprecated public static final int TETHER_ERROR_NO_ERROR = 0; // 0x0
-    field @Deprecated public static final int TETHER_ERROR_PROVISION_FAILED = 11; // 0xb
-    field public static final int TYPE_NONE = -1; // 0xffffffff
-    field @Deprecated public static final int TYPE_WIFI_P2P = 13; // 0xd
-  }
-
-  @Deprecated public abstract static class ConnectivityManager.OnStartTetheringCallback {
-    ctor @Deprecated public ConnectivityManager.OnStartTetheringCallback();
-    method @Deprecated public void onTetheringFailed();
-    method @Deprecated public void onTetheringStarted();
-  }
-
-  @Deprecated public static interface ConnectivityManager.OnTetheringEntitlementResultListener {
-    method @Deprecated public void onTetheringEntitlementResult(int);
-  }
-
-  @Deprecated public abstract static class ConnectivityManager.OnTetheringEventCallback {
-    ctor @Deprecated public ConnectivityManager.OnTetheringEventCallback();
-    method @Deprecated public void onUpstreamChanged(@Nullable android.net.Network);
-  }
-
-  public class EthernetManager {
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public android.net.EthernetManager.TetheredInterfaceRequest requestTetheredInterface(@NonNull java.util.concurrent.Executor, @NonNull android.net.EthernetManager.TetheredInterfaceCallback);
-  }
-
-  public static interface EthernetManager.TetheredInterfaceCallback {
-    method public void onAvailable(@NonNull String);
-    method public void onUnavailable();
-  }
-
-  public static class EthernetManager.TetheredInterfaceRequest {
-    method public void release();
-  }
-
-  public final class InvalidPacketException extends java.lang.Exception {
-    ctor public InvalidPacketException(int);
-    method public int getError();
-    field public static final int ERROR_INVALID_IP_ADDRESS = -21; // 0xffffffeb
-    field public static final int ERROR_INVALID_LENGTH = -23; // 0xffffffe9
-    field public static final int ERROR_INVALID_PORT = -22; // 0xffffffea
-  }
-
-  public final class IpConfiguration implements android.os.Parcelable {
-    ctor public IpConfiguration();
-    ctor public IpConfiguration(@NonNull android.net.IpConfiguration);
-    method public int describeContents();
-    method @Nullable public android.net.ProxyInfo getHttpProxy();
-    method @NonNull public android.net.IpConfiguration.IpAssignment getIpAssignment();
-    method @NonNull public android.net.IpConfiguration.ProxySettings getProxySettings();
-    method @Nullable public android.net.StaticIpConfiguration getStaticIpConfiguration();
-    method public void setHttpProxy(@Nullable android.net.ProxyInfo);
-    method public void setIpAssignment(@NonNull android.net.IpConfiguration.IpAssignment);
-    method public void setProxySettings(@NonNull android.net.IpConfiguration.ProxySettings);
-    method public void setStaticIpConfiguration(@Nullable android.net.StaticIpConfiguration);
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.IpConfiguration> CREATOR;
-  }
-
-  public enum IpConfiguration.IpAssignment {
-    enum_constant public static final android.net.IpConfiguration.IpAssignment DHCP;
-    enum_constant public static final android.net.IpConfiguration.IpAssignment STATIC;
-    enum_constant public static final android.net.IpConfiguration.IpAssignment UNASSIGNED;
-  }
-
-  public enum IpConfiguration.ProxySettings {
-    enum_constant public static final android.net.IpConfiguration.ProxySettings NONE;
-    enum_constant public static final android.net.IpConfiguration.ProxySettings PAC;
-    enum_constant public static final android.net.IpConfiguration.ProxySettings STATIC;
-    enum_constant public static final android.net.IpConfiguration.ProxySettings UNASSIGNED;
-  }
-
-  public final class IpPrefix implements android.os.Parcelable {
-    ctor public IpPrefix(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int);
-    ctor public IpPrefix(@NonNull String);
-  }
-
-  public final class IpSecManager {
-    method @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS) public void applyTunnelModeTransform(@NonNull android.net.IpSecManager.IpSecTunnelInterface, int, @NonNull android.net.IpSecTransform) throws java.io.IOException;
-    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS) public android.net.IpSecManager.IpSecTunnelInterface createIpSecTunnelInterface(@NonNull java.net.InetAddress, @NonNull java.net.InetAddress, @NonNull android.net.Network) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
-  }
-
-  public static final class IpSecManager.IpSecTunnelInterface implements java.lang.AutoCloseable {
-    method @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS) public void addAddress(@NonNull java.net.InetAddress, int) throws java.io.IOException;
-    method public void close();
-    method @NonNull public String getInterfaceName();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS) public void removeAddress(@NonNull java.net.InetAddress, int) throws java.io.IOException;
-  }
-
-  public static class IpSecTransform.Builder {
-    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS) public android.net.IpSecTransform buildTunnelModeTransform(@NonNull java.net.InetAddress, @NonNull android.net.IpSecManager.SecurityParameterIndex) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
-  }
-
-  public class KeepalivePacketData {
-    ctor protected KeepalivePacketData(@NonNull java.net.InetAddress, @IntRange(from=0, to=65535) int, @NonNull java.net.InetAddress, @IntRange(from=0, to=65535) int, @NonNull byte[]) throws android.net.InvalidPacketException;
-    method @NonNull public java.net.InetAddress getDstAddress();
-    method public int getDstPort();
-    method @NonNull public byte[] getPacket();
-    method @NonNull public java.net.InetAddress getSrcAddress();
-    method public int getSrcPort();
-  }
-
-  public class LinkAddress implements android.os.Parcelable {
-    ctor public LinkAddress(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int, int, int);
-    ctor public LinkAddress(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int, int, int, long, long);
-    ctor public LinkAddress(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int);
-    ctor public LinkAddress(@NonNull String);
-    ctor public LinkAddress(@NonNull String, int, int);
-    method public long getDeprecationTime();
-    method public long getExpirationTime();
-    method public boolean isGlobalPreferred();
-    method public boolean isIpv4();
-    method public boolean isIpv6();
-    method public boolean isSameAddressAs(@Nullable android.net.LinkAddress);
-    field public static final long LIFETIME_PERMANENT = 9223372036854775807L; // 0x7fffffffffffffffL
-    field public static final long LIFETIME_UNKNOWN = -1L; // 0xffffffffffffffffL
-  }
-
-  public final class LinkProperties implements android.os.Parcelable {
-    ctor public LinkProperties(@Nullable android.net.LinkProperties);
-    ctor public LinkProperties(@Nullable android.net.LinkProperties, boolean);
-    method public boolean addDnsServer(@NonNull java.net.InetAddress);
-    method public boolean addLinkAddress(@NonNull android.net.LinkAddress);
-    method public boolean addPcscfServer(@NonNull java.net.InetAddress);
-    method @NonNull public java.util.List<java.net.InetAddress> getAddresses();
-    method @NonNull public java.util.List<java.lang.String> getAllInterfaceNames();
-    method @NonNull public java.util.List<android.net.LinkAddress> getAllLinkAddresses();
-    method @NonNull public java.util.List<android.net.RouteInfo> getAllRoutes();
-    method @Nullable public android.net.Uri getCaptivePortalApiUrl();
-    method @Nullable public android.net.CaptivePortalData getCaptivePortalData();
-    method @NonNull public java.util.List<java.net.InetAddress> getPcscfServers();
-    method @Nullable public String getTcpBufferSizes();
-    method @NonNull public java.util.List<java.net.InetAddress> getValidatedPrivateDnsServers();
-    method public boolean hasGlobalIpv6Address();
-    method public boolean hasIpv4Address();
-    method public boolean hasIpv4DefaultRoute();
-    method public boolean hasIpv4DnsServer();
-    method public boolean hasIpv6DefaultRoute();
-    method public boolean hasIpv6DnsServer();
-    method public boolean isIpv4Provisioned();
-    method public boolean isIpv6Provisioned();
-    method public boolean isProvisioned();
-    method public boolean isReachable(@NonNull java.net.InetAddress);
-    method public boolean removeDnsServer(@NonNull java.net.InetAddress);
-    method public boolean removeLinkAddress(@NonNull android.net.LinkAddress);
-    method public boolean removeRoute(@NonNull android.net.RouteInfo);
-    method public void setCaptivePortalApiUrl(@Nullable android.net.Uri);
-    method public void setCaptivePortalData(@Nullable android.net.CaptivePortalData);
-    method public void setPcscfServers(@NonNull java.util.Collection<java.net.InetAddress>);
-    method public void setPrivateDnsServerName(@Nullable String);
-    method public void setTcpBufferSizes(@Nullable String);
-    method public void setUsePrivateDns(boolean);
-    method public void setValidatedPrivateDnsServers(@NonNull java.util.Collection<java.net.InetAddress>);
-  }
-
-  public final class MatchAllNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable {
-    ctor public MatchAllNetworkSpecifier();
-    method public int describeContents();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.MatchAllNetworkSpecifier> CREATOR;
-  }
-
-  public final class NattKeepalivePacketData extends android.net.KeepalivePacketData implements android.os.Parcelable {
-    ctor public NattKeepalivePacketData(@NonNull java.net.InetAddress, int, @NonNull java.net.InetAddress, int, @NonNull byte[]) throws android.net.InvalidPacketException;
-    method public int describeContents();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.NattKeepalivePacketData> CREATOR;
-  }
-
-  public class Network implements android.os.Parcelable {
-    ctor public Network(@NonNull android.net.Network);
-    method public int getNetId();
-    method @NonNull public android.net.Network getPrivateDnsBypassingCopy();
-  }
-
-  public abstract class NetworkAgent {
-    ctor public NetworkAgent(@NonNull android.content.Context, @NonNull android.os.Looper, @NonNull String, @NonNull android.net.NetworkCapabilities, @NonNull android.net.LinkProperties, int, @NonNull android.net.NetworkAgentConfig, @Nullable android.net.NetworkProvider);
-    method @Nullable public android.net.Network getNetwork();
-    method public void markConnected();
-    method public void onAddKeepalivePacketFilter(int, @NonNull android.net.KeepalivePacketData);
-    method public void onAutomaticReconnectDisabled();
-    method public void onNetworkUnwanted();
-    method public void onRemoveKeepalivePacketFilter(int);
-    method public void onSaveAcceptUnvalidated(boolean);
-    method public void onSignalStrengthThresholdsUpdated(@NonNull int[]);
-    method public void onStartSocketKeepalive(int, @NonNull java.time.Duration, @NonNull android.net.KeepalivePacketData);
-    method public void onStopSocketKeepalive(int);
-    method public void onValidationStatus(int, @Nullable android.net.Uri);
-    method @NonNull public android.net.Network register();
-    method public final void sendLinkProperties(@NonNull android.net.LinkProperties);
-    method public final void sendNetworkCapabilities(@NonNull android.net.NetworkCapabilities);
-    method public final void sendNetworkScore(@IntRange(from=0, to=99) int);
-    method public final void sendSocketKeepaliveEvent(int, int);
-    method public void unregister();
-    field public static final int VALIDATION_STATUS_NOT_VALID = 2; // 0x2
-    field public static final int VALIDATION_STATUS_VALID = 1; // 0x1
-  }
-
-  public final class NetworkAgentConfig implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getLegacyType();
-    method @NonNull public String getLegacyTypeName();
-    method public boolean isExplicitlySelected();
-    method public boolean isPartialConnectivityAcceptable();
-    method public boolean isUnvalidatedConnectivityAcceptable();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.NetworkAgentConfig> CREATOR;
-  }
-
-  public static final class NetworkAgentConfig.Builder {
-    ctor public NetworkAgentConfig.Builder();
-    method @NonNull public android.net.NetworkAgentConfig build();
-    method @NonNull public android.net.NetworkAgentConfig.Builder setExplicitlySelected(boolean);
-    method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyType(int);
-    method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyTypeName(@NonNull String);
-    method @NonNull public android.net.NetworkAgentConfig.Builder setPartialConnectivityAcceptable(boolean);
-    method @NonNull public android.net.NetworkAgentConfig.Builder setUnvalidatedConnectivityAcceptable(boolean);
-  }
-
-  public final class NetworkCapabilities implements android.os.Parcelable {
-    method @NonNull public int[] getAdministratorUids();
-    method @Nullable public String getSsid();
-    method @NonNull public int[] getTransportTypes();
-    method public boolean satisfiedByNetworkCapabilities(@Nullable android.net.NetworkCapabilities);
-    field public static final int NET_CAPABILITY_OEM_PAID = 22; // 0x16
-    field public static final int NET_CAPABILITY_OEM_PRIVATE = 26; // 0x1a
-    field public static final int NET_CAPABILITY_PARTIAL_CONNECTIVITY = 24; // 0x18
-  }
-
-  public static final class NetworkCapabilities.Builder {
-    ctor public NetworkCapabilities.Builder();
-    ctor public NetworkCapabilities.Builder(@NonNull android.net.NetworkCapabilities);
-    method @NonNull public android.net.NetworkCapabilities.Builder addCapability(int);
-    method @NonNull public android.net.NetworkCapabilities.Builder addTransportType(int);
-    method @NonNull public android.net.NetworkCapabilities build();
-    method @NonNull public android.net.NetworkCapabilities.Builder removeCapability(int);
-    method @NonNull public android.net.NetworkCapabilities.Builder removeTransportType(int);
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setAdministratorUids(@NonNull int[]);
-    method @NonNull public android.net.NetworkCapabilities.Builder setLinkDownstreamBandwidthKbps(int);
-    method @NonNull public android.net.NetworkCapabilities.Builder setLinkUpstreamBandwidthKbps(int);
-    method @NonNull public android.net.NetworkCapabilities.Builder setNetworkSpecifier(@Nullable android.net.NetworkSpecifier);
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setOwnerUid(int);
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setRequestorPackageName(@Nullable String);
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setRequestorUid(int);
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP) public android.net.NetworkCapabilities.Builder setSignalStrength(int);
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.NetworkCapabilities.Builder setSsid(@Nullable String);
-    method @NonNull public android.net.NetworkCapabilities.Builder setTransportInfo(@Nullable android.net.TransportInfo);
-  }
-
-  public class NetworkKey implements android.os.Parcelable {
-    ctor public NetworkKey(android.net.WifiKey);
-    method @Nullable public static android.net.NetworkKey createFromScanResult(@NonNull android.net.wifi.ScanResult);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.NetworkKey> CREATOR;
-    field public static final int TYPE_WIFI = 1; // 0x1
-    field public final int type;
-    field public final android.net.WifiKey wifiKey;
-  }
-
-  public class NetworkProvider {
-    ctor public NetworkProvider(@NonNull android.content.Context, @NonNull android.os.Looper, @NonNull String);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void declareNetworkRequestUnfulfillable(@NonNull android.net.NetworkRequest);
-    method public int getProviderId();
-    method public void onNetworkRequestWithdrawn(@NonNull android.net.NetworkRequest);
-    method public void onNetworkRequested(@NonNull android.net.NetworkRequest, @IntRange(from=0, to=99) int, int);
-    field public static final int ID_NONE = -1; // 0xffffffff
-  }
-
-  public abstract class NetworkRecommendationProvider {
-    ctor public NetworkRecommendationProvider(android.content.Context, java.util.concurrent.Executor);
-    method public final android.os.IBinder getBinder();
-    method public abstract void onRequestScores(android.net.NetworkKey[]);
-  }
-
-  public class NetworkRequest implements android.os.Parcelable {
-    method @Nullable public String getRequestorPackageName();
-    method public int getRequestorUid();
-  }
-
-  public static class NetworkRequest.Builder {
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP) public android.net.NetworkRequest.Builder setSignalStrength(int);
-  }
-
-  public class NetworkScoreManager {
-    method @RequiresPermission(anyOf={android.Manifest.permission.SCORE_NETWORKS, android.Manifest.permission.REQUEST_NETWORK_SCORES}) public boolean clearScores() throws java.lang.SecurityException;
-    method @RequiresPermission(anyOf={android.Manifest.permission.SCORE_NETWORKS, android.Manifest.permission.REQUEST_NETWORK_SCORES}) public void disableScoring() throws java.lang.SecurityException;
-    method @RequiresPermission(anyOf={android.Manifest.permission.SCORE_NETWORKS, android.Manifest.permission.REQUEST_NETWORK_SCORES}) public String getActiveScorerPackage();
-    method @RequiresPermission(android.Manifest.permission.REQUEST_NETWORK_SCORES) public void registerNetworkScoreCallback(int, int, @NonNull java.util.concurrent.Executor, @NonNull android.net.NetworkScoreManager.NetworkScoreCallback) throws java.lang.SecurityException;
-    method @RequiresPermission(android.Manifest.permission.REQUEST_NETWORK_SCORES) public boolean requestScores(@NonNull java.util.Collection<android.net.NetworkKey>) throws java.lang.SecurityException;
-    method @RequiresPermission(anyOf={android.Manifest.permission.SCORE_NETWORKS, android.Manifest.permission.REQUEST_NETWORK_SCORES}) public boolean setActiveScorer(String) throws java.lang.SecurityException;
-    method @RequiresPermission(android.Manifest.permission.SCORE_NETWORKS) public boolean updateScores(@NonNull android.net.ScoredNetwork[]) throws java.lang.SecurityException;
-    field @Deprecated public static final String ACTION_CHANGE_ACTIVE = "android.net.scoring.CHANGE_ACTIVE";
-    field public static final String ACTION_CUSTOM_ENABLE = "android.net.scoring.CUSTOM_ENABLE";
-    field public static final String ACTION_RECOMMEND_NETWORKS = "android.net.action.RECOMMEND_NETWORKS";
-    field public static final String ACTION_SCORER_CHANGED = "android.net.scoring.SCORER_CHANGED";
-    field @Deprecated public static final String ACTION_SCORE_NETWORKS = "android.net.scoring.SCORE_NETWORKS";
-    field @Deprecated public static final String EXTRA_NETWORKS_TO_SCORE = "networksToScore";
-    field public static final String EXTRA_NEW_SCORER = "newScorer";
-    field @Deprecated public static final String EXTRA_PACKAGE_NAME = "packageName";
-    field public static final int SCORE_FILTER_CURRENT_NETWORK = 1; // 0x1
-    field public static final int SCORE_FILTER_NONE = 0; // 0x0
-    field public static final int SCORE_FILTER_SCAN_RESULTS = 2; // 0x2
-  }
-
-  public abstract static class NetworkScoreManager.NetworkScoreCallback {
-    ctor public NetworkScoreManager.NetworkScoreCallback();
-    method public abstract void onScoresInvalidated();
-    method public abstract void onScoresUpdated(@NonNull java.util.Collection<android.net.ScoredNetwork>);
-  }
-
-  public abstract class NetworkSpecifier {
-    method public boolean canBeSatisfiedBy(@Nullable android.net.NetworkSpecifier);
-    method @Nullable public android.net.NetworkSpecifier redact();
-  }
-
-  public class NetworkStack {
-    method @Nullable public static android.os.IBinder getService();
-    field public static final String PERMISSION_MAINLINE_NETWORK_STACK = "android.permission.MAINLINE_NETWORK_STACK";
-  }
-
-  public final class NetworkStats implements android.os.Parcelable {
-    ctor public NetworkStats(long, int);
-    method @NonNull public android.net.NetworkStats add(@NonNull android.net.NetworkStats);
-    method @NonNull public android.net.NetworkStats addEntry(@NonNull android.net.NetworkStats.Entry);
-    method public int describeContents();
-    method @NonNull public android.net.NetworkStats subtract(@NonNull android.net.NetworkStats);
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.NetworkStats> CREATOR;
-    field public static final int DEFAULT_NETWORK_NO = 0; // 0x0
-    field public static final int DEFAULT_NETWORK_YES = 1; // 0x1
-    field public static final String IFACE_VT = "vt_data0";
-    field public static final int METERED_NO = 0; // 0x0
-    field public static final int METERED_YES = 1; // 0x1
-    field public static final int ROAMING_NO = 0; // 0x0
-    field public static final int ROAMING_YES = 1; // 0x1
-    field public static final int SET_DEFAULT = 0; // 0x0
-    field public static final int SET_FOREGROUND = 1; // 0x1
-    field public static final int TAG_NONE = 0; // 0x0
-    field public static final int UID_ALL = -1; // 0xffffffff
-    field public static final int UID_TETHERING = -5; // 0xfffffffb
-  }
-
-  public static class NetworkStats.Entry {
-    ctor public NetworkStats.Entry(@Nullable String, int, int, int, int, int, int, long, long, long, long, long);
-  }
-
-  public final class RouteInfo implements android.os.Parcelable {
-    ctor public RouteInfo(@Nullable android.net.IpPrefix, @Nullable java.net.InetAddress, @Nullable String, int);
-    ctor public RouteInfo(@Nullable android.net.IpPrefix, @Nullable java.net.InetAddress, @Nullable String, int, int);
-    method public int getMtu();
-    method public int getType();
-    field public static final int RTN_THROW = 9; // 0x9
-    field public static final int RTN_UNICAST = 1; // 0x1
-    field public static final int RTN_UNREACHABLE = 7; // 0x7
-  }
-
-  public class RssiCurve implements android.os.Parcelable {
-    ctor public RssiCurve(int, int, byte[]);
-    ctor public RssiCurve(int, int, byte[], int);
-    method public int describeContents();
-    method public byte lookupScore(int);
-    method public byte lookupScore(int, boolean);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.RssiCurve> CREATOR;
-    field public final int activeNetworkRssiBoost;
-    field public final int bucketWidth;
-    field public final byte[] rssiBuckets;
-    field public final int start;
-  }
-
-  public class ScoredNetwork implements android.os.Parcelable {
-    ctor public ScoredNetwork(android.net.NetworkKey, android.net.RssiCurve);
-    ctor public ScoredNetwork(android.net.NetworkKey, android.net.RssiCurve, boolean);
-    ctor public ScoredNetwork(android.net.NetworkKey, android.net.RssiCurve, boolean, @Nullable android.os.Bundle);
-    method public int calculateBadge(int);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final String ATTRIBUTES_KEY_BADGING_CURVE = "android.net.attributes.key.BADGING_CURVE";
-    field public static final String ATTRIBUTES_KEY_HAS_CAPTIVE_PORTAL = "android.net.attributes.key.HAS_CAPTIVE_PORTAL";
-    field public static final String ATTRIBUTES_KEY_RANKING_SCORE_OFFSET = "android.net.attributes.key.RANKING_SCORE_OFFSET";
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.ScoredNetwork> CREATOR;
-    field @Nullable public final android.os.Bundle attributes;
-    field public final boolean meteredHint;
-    field public final android.net.NetworkKey networkKey;
-    field public final android.net.RssiCurve rssiCurve;
-  }
-
-  public abstract class SocketKeepalive implements java.lang.AutoCloseable {
-    field public static final int SUCCESS = 0; // 0x0
-  }
-
-  public final class StaticIpConfiguration implements android.os.Parcelable {
-    ctor public StaticIpConfiguration();
-    ctor public StaticIpConfiguration(@Nullable android.net.StaticIpConfiguration);
-    method public void addDnsServer(@NonNull java.net.InetAddress);
-    method public void clear();
-    method public int describeContents();
-    method @NonNull public java.util.List<java.net.InetAddress> getDnsServers();
-    method @Nullable public String getDomains();
-    method @Nullable public java.net.InetAddress getGateway();
-    method @Nullable public android.net.LinkAddress getIpAddress();
-    method @NonNull public java.util.List<android.net.RouteInfo> getRoutes(@Nullable String);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.StaticIpConfiguration> CREATOR;
-  }
-
-  public static final class StaticIpConfiguration.Builder {
-    ctor public StaticIpConfiguration.Builder();
-    method @NonNull public android.net.StaticIpConfiguration build();
-    method @NonNull public android.net.StaticIpConfiguration.Builder setDnsServers(@NonNull Iterable<java.net.InetAddress>);
-    method @NonNull public android.net.StaticIpConfiguration.Builder setDomains(@Nullable String);
-    method @NonNull public android.net.StaticIpConfiguration.Builder setGateway(@Nullable java.net.InetAddress);
-    method @NonNull public android.net.StaticIpConfiguration.Builder setIpAddress(@Nullable android.net.LinkAddress);
-  }
-
-  public final class TetheredClient implements android.os.Parcelable {
-    ctor public TetheredClient(@NonNull android.net.MacAddress, @NonNull java.util.Collection<android.net.TetheredClient.AddressInfo>, int);
-    method public int describeContents();
-    method @NonNull public java.util.List<android.net.TetheredClient.AddressInfo> getAddresses();
-    method @NonNull public android.net.MacAddress getMacAddress();
-    method public int getTetheringType();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient> CREATOR;
-  }
-
-  public static final class TetheredClient.AddressInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.net.LinkAddress getAddress();
-    method @Nullable public String getHostname();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient.AddressInfo> CREATOR;
-  }
-
-  public class TetheringManager {
-    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.TetheringEventCallback);
-    method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void requestLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.OnTetheringEntitlementResultListener);
-    method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(@NonNull android.net.TetheringManager.TetheringRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback);
-    method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopAllTethering();
-    method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopTethering(int);
-    method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.ACCESS_NETWORK_STATE}) public void unregisterTetheringEventCallback(@NonNull android.net.TetheringManager.TetheringEventCallback);
-    field public static final String ACTION_TETHER_STATE_CHANGED = "android.net.conn.TETHER_STATE_CHANGED";
-    field public static final String EXTRA_ACTIVE_LOCAL_ONLY = "android.net.extra.ACTIVE_LOCAL_ONLY";
-    field public static final String EXTRA_ACTIVE_TETHER = "tetherArray";
-    field public static final String EXTRA_AVAILABLE_TETHER = "availableArray";
-    field public static final String EXTRA_ERRORED_TETHER = "erroredArray";
-    field public static final int TETHERING_BLUETOOTH = 2; // 0x2
-    field public static final int TETHERING_ETHERNET = 5; // 0x5
-    field public static final int TETHERING_INVALID = -1; // 0xffffffff
-    field public static final int TETHERING_NCM = 4; // 0x4
-    field public static final int TETHERING_USB = 1; // 0x1
-    field public static final int TETHERING_WIFI = 0; // 0x0
-    field public static final int TETHERING_WIFI_P2P = 3; // 0x3
-    field public static final int TETHER_ERROR_DHCPSERVER_ERROR = 12; // 0xc
-    field public static final int TETHER_ERROR_DISABLE_FORWARDING_ERROR = 9; // 0x9
-    field public static final int TETHER_ERROR_ENABLE_FORWARDING_ERROR = 8; // 0x8
-    field public static final int TETHER_ERROR_ENTITLEMENT_UNKNOWN = 13; // 0xd
-    field public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; // 0xa
-    field public static final int TETHER_ERROR_INTERNAL_ERROR = 5; // 0x5
-    field public static final int TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION = 15; // 0xf
-    field public static final int TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION = 14; // 0xe
-    field public static final int TETHER_ERROR_NO_ERROR = 0; // 0x0
-    field public static final int TETHER_ERROR_PROVISIONING_FAILED = 11; // 0xb
-    field public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2; // 0x2
-    field public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6; // 0x6
-    field public static final int TETHER_ERROR_UNAVAIL_IFACE = 4; // 0x4
-    field public static final int TETHER_ERROR_UNKNOWN_IFACE = 1; // 0x1
-    field public static final int TETHER_ERROR_UNKNOWN_TYPE = 16; // 0x10
-    field public static final int TETHER_ERROR_UNSUPPORTED = 3; // 0x3
-    field public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7; // 0x7
-    field public static final int TETHER_HARDWARE_OFFLOAD_FAILED = 2; // 0x2
-    field public static final int TETHER_HARDWARE_OFFLOAD_STARTED = 1; // 0x1
-    field public static final int TETHER_HARDWARE_OFFLOAD_STOPPED = 0; // 0x0
-  }
-
-  public static interface TetheringManager.OnTetheringEntitlementResultListener {
-    method public void onTetheringEntitlementResult(int);
-  }
-
-  public static interface TetheringManager.StartTetheringCallback {
-    method public default void onTetheringFailed(int);
-    method public default void onTetheringStarted();
-  }
-
-  public static interface TetheringManager.TetheringEventCallback {
-    method public default void onClientsChanged(@NonNull java.util.Collection<android.net.TetheredClient>);
-    method public default void onError(@NonNull String, int);
-    method public default void onOffloadStatusChanged(int);
-    method public default void onTetherableInterfacesChanged(@NonNull java.util.List<java.lang.String>);
-    method public default void onTetheredInterfacesChanged(@NonNull java.util.List<java.lang.String>);
-    method public default void onTetheringSupported(boolean);
-    method public default void onUpstreamChanged(@Nullable android.net.Network);
-  }
-
-  public static class TetheringManager.TetheringRequest {
-    method @Nullable public android.net.LinkAddress getClientStaticIpv4Address();
-    method @Nullable public android.net.LinkAddress getLocalIpv4Address();
-    method public boolean getShouldShowEntitlementUi();
-    method public int getTetheringType();
-    method public boolean isExemptFromEntitlementCheck();
-  }
-
-  public static class TetheringManager.TetheringRequest.Builder {
-    ctor public TetheringManager.TetheringRequest.Builder(int);
-    method @NonNull public android.net.TetheringManager.TetheringRequest build();
-    method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean);
-    method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setShouldShowEntitlementUi(boolean);
-    method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setStaticIpv4Addresses(@NonNull android.net.LinkAddress, @NonNull android.net.LinkAddress);
-  }
-
-  public class TrafficStats {
-    method public static void setThreadStatsTagApp();
-    method public static void setThreadStatsTagBackup();
-    method public static void setThreadStatsTagRestore();
-    field public static final int TAG_NETWORK_STACK_IMPERSONATION_RANGE_END = -113; // 0xffffff8f
-    field public static final int TAG_NETWORK_STACK_IMPERSONATION_RANGE_START = -128; // 0xffffff80
-    field public static final int TAG_NETWORK_STACK_RANGE_END = -257; // 0xfffffeff
-    field public static final int TAG_NETWORK_STACK_RANGE_START = -768; // 0xfffffd00
-    field public static final int TAG_SYSTEM_IMPERSONATION_RANGE_END = -241; // 0xffffff0f
-    field public static final int TAG_SYSTEM_IMPERSONATION_RANGE_START = -256; // 0xffffff00
-  }
-
-  public abstract class Uri implements java.lang.Comparable<android.net.Uri> android.os.Parcelable {
-    method @NonNull public String toSafeString();
-  }
-
-  public class VpnService extends android.app.Service {
-    method @RequiresPermission(android.Manifest.permission.CONTROL_VPN) public static void prepareAndAuthorize(android.content.Context);
-  }
-
-  public class WebAddress {
-    ctor public WebAddress(String) throws android.net.ParseException;
-  }
-
-  public class WifiKey implements android.os.Parcelable {
-    ctor public WifiKey(String, String);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.WifiKey> CREATOR;
-    field public final String bssid;
-    field public final String ssid;
-  }
-
-}
-
-package android.net.apf {
-
-  public final class ApfCapabilities implements android.os.Parcelable {
-    ctor public ApfCapabilities(int, int, int);
-    method public int describeContents();
-    method public static boolean getApfDrop8023Frames();
-    method @NonNull public static int[] getApfEtherTypeBlackList();
-    method public boolean hasDataAccess();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.net.apf.ApfCapabilities> CREATOR;
-    field public final int apfPacketFormat;
-    field public final int apfVersionSupported;
-    field public final int maximumApfProgramSize;
-  }
-
-}
-
-package android.net.metrics {
-
-  public final class ApfProgramEvent implements android.net.metrics.IpConnectivityLog.Event {
-  }
-
-  public static final class ApfProgramEvent.Builder {
-    ctor public ApfProgramEvent.Builder();
-    method @NonNull public android.net.metrics.ApfProgramEvent build();
-    method @NonNull public android.net.metrics.ApfProgramEvent.Builder setActualLifetime(long);
-    method @NonNull public android.net.metrics.ApfProgramEvent.Builder setCurrentRas(int);
-    method @NonNull public android.net.metrics.ApfProgramEvent.Builder setFilteredRas(int);
-    method @NonNull public android.net.metrics.ApfProgramEvent.Builder setFlags(boolean, boolean);
-    method @NonNull public android.net.metrics.ApfProgramEvent.Builder setLifetime(long);
-    method @NonNull public android.net.metrics.ApfProgramEvent.Builder setProgramLength(int);
-  }
-
-  public final class ApfStats implements android.net.metrics.IpConnectivityLog.Event {
-  }
-
-  public static final class ApfStats.Builder {
-    ctor public ApfStats.Builder();
-    method @NonNull public android.net.metrics.ApfStats build();
-    method @NonNull public android.net.metrics.ApfStats.Builder setDroppedRas(int);
-    method @NonNull public android.net.metrics.ApfStats.Builder setDurationMs(long);
-    method @NonNull public android.net.metrics.ApfStats.Builder setMatchingRas(int);
-    method @NonNull public android.net.metrics.ApfStats.Builder setMaxProgramSize(int);
-    method @NonNull public android.net.metrics.ApfStats.Builder setParseErrors(int);
-    method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdates(int);
-    method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdatesAll(int);
-    method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdatesAllowingMulticast(int);
-    method @NonNull public android.net.metrics.ApfStats.Builder setReceivedRas(int);
-    method @NonNull public android.net.metrics.ApfStats.Builder setZeroLifetimeRas(int);
-  }
-
-  public final class DhcpClientEvent implements android.net.metrics.IpConnectivityLog.Event {
-  }
-
-  public static final class DhcpClientEvent.Builder {
-    ctor public DhcpClientEvent.Builder();
-    method @NonNull public android.net.metrics.DhcpClientEvent build();
-    method @NonNull public android.net.metrics.DhcpClientEvent.Builder setDurationMs(int);
-    method @NonNull public android.net.metrics.DhcpClientEvent.Builder setMsg(String);
-  }
-
-  public final class DhcpErrorEvent implements android.net.metrics.IpConnectivityLog.Event {
-    ctor public DhcpErrorEvent(int);
-    method public static int errorCodeWithOption(int, int);
-    field public static final int BOOTP_TOO_SHORT = 67174400; // 0x4010000
-    field public static final int BUFFER_UNDERFLOW = 83951616; // 0x5010000
-    field public static final int DHCP_BAD_MAGIC_COOKIE = 67239936; // 0x4020000
-    field public static final int DHCP_ERROR = 4; // 0x4
-    field public static final int DHCP_INVALID_OPTION_LENGTH = 67305472; // 0x4030000
-    field public static final int DHCP_NO_COOKIE = 67502080; // 0x4060000
-    field public static final int DHCP_NO_MSG_TYPE = 67371008; // 0x4040000
-    field public static final int DHCP_UNKNOWN_MSG_TYPE = 67436544; // 0x4050000
-    field public static final int L2_ERROR = 1; // 0x1
-    field public static final int L2_TOO_SHORT = 16842752; // 0x1010000
-    field public static final int L2_WRONG_ETH_TYPE = 16908288; // 0x1020000
-    field public static final int L3_ERROR = 2; // 0x2
-    field public static final int L3_INVALID_IP = 33751040; // 0x2030000
-    field public static final int L3_NOT_IPV4 = 33685504; // 0x2020000
-    field public static final int L3_TOO_SHORT = 33619968; // 0x2010000
-    field public static final int L4_ERROR = 3; // 0x3
-    field public static final int L4_NOT_UDP = 50397184; // 0x3010000
-    field public static final int L4_WRONG_PORT = 50462720; // 0x3020000
-    field public static final int MISC_ERROR = 5; // 0x5
-    field public static final int PARSING_ERROR = 84082688; // 0x5030000
-    field public static final int RECEIVE_ERROR = 84017152; // 0x5020000
-  }
-
-  public class IpConnectivityLog {
-    ctor public IpConnectivityLog();
-    method public boolean log(long, @NonNull android.net.metrics.IpConnectivityLog.Event);
-    method public boolean log(@NonNull String, @NonNull android.net.metrics.IpConnectivityLog.Event);
-    method public boolean log(@NonNull android.net.Network, @NonNull int[], @NonNull android.net.metrics.IpConnectivityLog.Event);
-    method public boolean log(int, @NonNull int[], @NonNull android.net.metrics.IpConnectivityLog.Event);
-    method public boolean log(@NonNull android.net.metrics.IpConnectivityLog.Event);
-  }
-
-  public static interface IpConnectivityLog.Event extends android.os.Parcelable {
-  }
-
-  public final class IpManagerEvent implements android.net.metrics.IpConnectivityLog.Event {
-    ctor public IpManagerEvent(int, long);
-    field public static final int COMPLETE_LIFECYCLE = 3; // 0x3
-    field public static final int ERROR_INTERFACE_NOT_FOUND = 8; // 0x8
-    field public static final int ERROR_INVALID_PROVISIONING = 7; // 0x7
-    field public static final int ERROR_STARTING_IPREACHABILITYMONITOR = 6; // 0x6
-    field public static final int ERROR_STARTING_IPV4 = 4; // 0x4
-    field public static final int ERROR_STARTING_IPV6 = 5; // 0x5
-    field public static final int PROVISIONING_FAIL = 2; // 0x2
-    field public static final int PROVISIONING_OK = 1; // 0x1
-  }
-
-  public final class IpReachabilityEvent implements android.net.metrics.IpConnectivityLog.Event {
-    ctor public IpReachabilityEvent(int);
-    field public static final int NUD_FAILED = 512; // 0x200
-    field public static final int NUD_FAILED_ORGANIC = 1024; // 0x400
-    field public static final int PROBE = 256; // 0x100
-    field public static final int PROVISIONING_LOST = 768; // 0x300
-    field public static final int PROVISIONING_LOST_ORGANIC = 1280; // 0x500
-  }
-
-  public final class NetworkEvent implements android.net.metrics.IpConnectivityLog.Event {
-    ctor public NetworkEvent(int, long);
-    ctor public NetworkEvent(int);
-    field public static final int NETWORK_CAPTIVE_PORTAL_FOUND = 4; // 0x4
-    field public static final int NETWORK_CONNECTED = 1; // 0x1
-    field public static final int NETWORK_CONSECUTIVE_DNS_TIMEOUT_FOUND = 12; // 0xc
-    field public static final int NETWORK_DISCONNECTED = 7; // 0x7
-    field public static final int NETWORK_FIRST_VALIDATION_PORTAL_FOUND = 10; // 0xa
-    field public static final int NETWORK_FIRST_VALIDATION_SUCCESS = 8; // 0x8
-    field public static final int NETWORK_LINGER = 5; // 0x5
-    field public static final int NETWORK_PARTIAL_CONNECTIVITY = 13; // 0xd
-    field public static final int NETWORK_REVALIDATION_PORTAL_FOUND = 11; // 0xb
-    field public static final int NETWORK_REVALIDATION_SUCCESS = 9; // 0x9
-    field public static final int NETWORK_UNLINGER = 6; // 0x6
-    field public static final int NETWORK_VALIDATED = 2; // 0x2
-    field public static final int NETWORK_VALIDATION_FAILED = 3; // 0x3
-  }
-
-  public final class RaEvent implements android.net.metrics.IpConnectivityLog.Event {
-  }
-
-  public static final class RaEvent.Builder {
-    ctor public RaEvent.Builder();
-    method @NonNull public android.net.metrics.RaEvent build();
-    method @NonNull public android.net.metrics.RaEvent.Builder updateDnsslLifetime(long);
-    method @NonNull public android.net.metrics.RaEvent.Builder updatePrefixPreferredLifetime(long);
-    method @NonNull public android.net.metrics.RaEvent.Builder updatePrefixValidLifetime(long);
-    method @NonNull public android.net.metrics.RaEvent.Builder updateRdnssLifetime(long);
-    method @NonNull public android.net.metrics.RaEvent.Builder updateRouteInfoLifetime(long);
-    method @NonNull public android.net.metrics.RaEvent.Builder updateRouterLifetime(long);
-  }
-
-  public final class ValidationProbeEvent implements android.net.metrics.IpConnectivityLog.Event {
-    method @NonNull public static String getProbeName(int);
-    field public static final int DNS_FAILURE = 0; // 0x0
-    field public static final int DNS_SUCCESS = 1; // 0x1
-    field public static final int PROBE_DNS = 0; // 0x0
-    field public static final int PROBE_FALLBACK = 4; // 0x4
-    field public static final int PROBE_HTTP = 1; // 0x1
-    field public static final int PROBE_HTTPS = 2; // 0x2
-    field public static final int PROBE_PAC = 3; // 0x3
-    field public static final int PROBE_PRIVDNS = 5; // 0x5
-  }
-
-  public static final class ValidationProbeEvent.Builder {
-    ctor public ValidationProbeEvent.Builder();
-    method @NonNull public android.net.metrics.ValidationProbeEvent build();
-    method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setDurationMs(long);
-    method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setProbeType(int, boolean);
-    method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setReturnCode(int);
-  }
-
-}
-
-package android.net.netstats.provider {
-
-  public abstract class NetworkStatsProvider {
-    ctor public NetworkStatsProvider();
-    method public void notifyAlertReached();
-    method public void notifyLimitReached();
-    method public void notifyStatsUpdated(int, @NonNull android.net.NetworkStats, @NonNull android.net.NetworkStats);
-    method public abstract void onRequestStatsUpdate(int);
-    method public abstract void onSetAlert(long);
-    method public abstract void onSetLimit(@NonNull String, long);
-    field public static final int QUOTA_UNLIMITED = -1; // 0xffffffff
-  }
-
-}
-
-package android.net.sip {
-
-  public class SipAudioCall {
-    method @Nullable public android.net.rtp.AudioGroup getAudioGroup();
-    method public void setAudioGroup(@NonNull android.net.rtp.AudioGroup);
-  }
-
-  public class SipManager {
-    method @NonNull public java.util.List<android.net.sip.SipProfile> getProfiles() throws android.net.sip.SipException;
-    field public static final String ACTION_SIP_CALL_OPTION_CHANGED = "android.net.sip.action.SIP_CALL_OPTION_CHANGED";
-    field public static final String ACTION_SIP_INCOMING_CALL = "android.net.sip.action.SIP_INCOMING_CALL";
-    field public static final String ACTION_SIP_REMOVE_PROFILE = "android.net.sip.action.SIP_REMOVE_PROFILE";
-    field public static final String ACTION_SIP_SERVICE_UP = "android.net.sip.action.SIP_SERVICE_UP";
-    field public static final String ACTION_START_SIP = "android.net.sip.action.START_SIP";
-  }
-
-  public class SipProfile implements java.lang.Cloneable android.os.Parcelable java.io.Serializable {
-    method public int getCallingUid();
-  }
-
-}
-
-package android.net.util {
-
-  public final class SocketUtils {
-    method public static void bindSocketToInterface(@NonNull java.io.FileDescriptor, @NonNull String) throws android.system.ErrnoException;
-    method public static void closeSocket(@Nullable java.io.FileDescriptor) throws java.io.IOException;
-    method @NonNull public static java.net.SocketAddress makeNetlinkSocketAddress(int, int);
-    method @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, int);
-    method @Deprecated @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, @NonNull byte[]);
-    method @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, int, @NonNull byte[]);
-  }
-
-}
-
-package android.net.wifi {
-
-  public abstract class EasyConnectStatusCallback {
-    ctor public EasyConnectStatusCallback();
-    method public abstract void onConfiguratorSuccess(int);
-    method public abstract void onEnrolleeSuccess(int);
-    method public void onFailure(int);
-    method public void onFailure(int, @Nullable String, @NonNull android.util.SparseArray<int[]>, @NonNull int[]);
-    method public abstract void onProgress(int);
-    field public static final int EASY_CONNECT_EVENT_PROGRESS_AUTHENTICATION_SUCCESS = 0; // 0x0
-    field public static final int EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_ACCEPTED = 3; // 0x3
-    field public static final int EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_SENT_WAITING_RESPONSE = 2; // 0x2
-    field public static final int EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING = 1; // 0x1
-    field public static final int EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED = 1; // 0x1
-    field public static final int EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT = 0; // 0x0
-  }
-
-  @Deprecated public class RttManager {
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void disableResponder(android.net.wifi.RttManager.ResponderCallback);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void enableResponder(android.net.wifi.RttManager.ResponderCallback);
-    method @Deprecated public android.net.wifi.RttManager.Capabilities getCapabilities();
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.net.wifi.RttManager.RttCapabilities getRttCapabilities();
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startRanging(android.net.wifi.RttManager.RttParams[], android.net.wifi.RttManager.RttListener);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void stopRanging(android.net.wifi.RttManager.RttListener);
-    field @Deprecated public static final int BASE = 160256; // 0x27200
-    field @Deprecated public static final int CMD_OP_ABORTED = 160260; // 0x27204
-    field @Deprecated public static final int CMD_OP_DISABLE_RESPONDER = 160262; // 0x27206
-    field @Deprecated public static final int CMD_OP_ENABLE_RESPONDER = 160261; // 0x27205
-    field @Deprecated public static final int CMD_OP_ENALBE_RESPONDER_FAILED = 160264; // 0x27208
-    field @Deprecated public static final int CMD_OP_ENALBE_RESPONDER_SUCCEEDED = 160263; // 0x27207
-    field @Deprecated public static final int CMD_OP_FAILED = 160258; // 0x27202
-    field @Deprecated public static final int CMD_OP_START_RANGING = 160256; // 0x27200
-    field @Deprecated public static final int CMD_OP_STOP_RANGING = 160257; // 0x27201
-    field @Deprecated public static final int CMD_OP_SUCCEEDED = 160259; // 0x27203
-    field @Deprecated public static final String DESCRIPTION_KEY = "android.net.wifi.RttManager.Description";
-    field @Deprecated public static final int PREAMBLE_HT = 2; // 0x2
-    field @Deprecated public static final int PREAMBLE_LEGACY = 1; // 0x1
-    field @Deprecated public static final int PREAMBLE_VHT = 4; // 0x4
-    field @Deprecated public static final int REASON_INITIATOR_NOT_ALLOWED_WHEN_RESPONDER_ON = -6; // 0xfffffffa
-    field @Deprecated public static final int REASON_INVALID_LISTENER = -3; // 0xfffffffd
-    field @Deprecated public static final int REASON_INVALID_REQUEST = -4; // 0xfffffffc
-    field @Deprecated public static final int REASON_NOT_AVAILABLE = -2; // 0xfffffffe
-    field @Deprecated public static final int REASON_PERMISSION_DENIED = -5; // 0xfffffffb
-    field @Deprecated public static final int REASON_UNSPECIFIED = -1; // 0xffffffff
-    field @Deprecated public static final int RTT_BW_10_SUPPORT = 2; // 0x2
-    field @Deprecated public static final int RTT_BW_160_SUPPORT = 32; // 0x20
-    field @Deprecated public static final int RTT_BW_20_SUPPORT = 4; // 0x4
-    field @Deprecated public static final int RTT_BW_40_SUPPORT = 8; // 0x8
-    field @Deprecated public static final int RTT_BW_5_SUPPORT = 1; // 0x1
-    field @Deprecated public static final int RTT_BW_80_SUPPORT = 16; // 0x10
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_10 = 6; // 0x6
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_160 = 3; // 0x3
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_20 = 0; // 0x0
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_40 = 1; // 0x1
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_5 = 5; // 0x5
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_80 = 2; // 0x2
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_80P80 = 4; // 0x4
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_UNSPECIFIED = -1; // 0xffffffff
-    field @Deprecated public static final int RTT_PEER_NAN = 5; // 0x5
-    field @Deprecated public static final int RTT_PEER_P2P_CLIENT = 4; // 0x4
-    field @Deprecated public static final int RTT_PEER_P2P_GO = 3; // 0x3
-    field @Deprecated public static final int RTT_PEER_TYPE_AP = 1; // 0x1
-    field @Deprecated public static final int RTT_PEER_TYPE_STA = 2; // 0x2
-    field @Deprecated public static final int RTT_PEER_TYPE_UNSPECIFIED = 0; // 0x0
-    field @Deprecated public static final int RTT_STATUS_ABORTED = 8; // 0x8
-    field @Deprecated public static final int RTT_STATUS_FAILURE = 1; // 0x1
-    field @Deprecated public static final int RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL = 6; // 0x6
-    field @Deprecated public static final int RTT_STATUS_FAIL_BUSY_TRY_LATER = 12; // 0xc
-    field @Deprecated public static final int RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE = 15; // 0xf
-    field @Deprecated public static final int RTT_STATUS_FAIL_INVALID_TS = 9; // 0x9
-    field @Deprecated public static final int RTT_STATUS_FAIL_NOT_SCHEDULED_YET = 4; // 0x4
-    field @Deprecated public static final int RTT_STATUS_FAIL_NO_CAPABILITY = 7; // 0x7
-    field @Deprecated public static final int RTT_STATUS_FAIL_NO_RSP = 2; // 0x2
-    field @Deprecated public static final int RTT_STATUS_FAIL_PROTOCOL = 10; // 0xa
-    field @Deprecated public static final int RTT_STATUS_FAIL_REJECTED = 3; // 0x3
-    field @Deprecated public static final int RTT_STATUS_FAIL_SCHEDULE = 11; // 0xb
-    field @Deprecated public static final int RTT_STATUS_FAIL_TM_TIMEOUT = 5; // 0x5
-    field @Deprecated public static final int RTT_STATUS_INVALID_REQ = 13; // 0xd
-    field @Deprecated public static final int RTT_STATUS_NO_WIFI = 14; // 0xe
-    field @Deprecated public static final int RTT_STATUS_SUCCESS = 0; // 0x0
-    field @Deprecated public static final int RTT_TYPE_11_MC = 4; // 0x4
-    field @Deprecated public static final int RTT_TYPE_11_V = 2; // 0x2
-    field @Deprecated public static final int RTT_TYPE_ONE_SIDED = 1; // 0x1
-    field @Deprecated public static final int RTT_TYPE_TWO_SIDED = 2; // 0x2
-    field @Deprecated public static final int RTT_TYPE_UNSPECIFIED = 0; // 0x0
-  }
-
-  @Deprecated public class RttManager.Capabilities {
-    ctor @Deprecated public RttManager.Capabilities();
-    field @Deprecated public int supportedPeerType;
-    field @Deprecated public int supportedType;
-  }
-
-  @Deprecated public static class RttManager.ParcelableRttParams implements android.os.Parcelable {
-    field @Deprecated @NonNull public android.net.wifi.RttManager.RttParams[] mParams;
-  }
-
-  @Deprecated public static class RttManager.ParcelableRttResults implements android.os.Parcelable {
-    ctor @Deprecated public RttManager.ParcelableRttResults(android.net.wifi.RttManager.RttResult[]);
-    field @Deprecated public android.net.wifi.RttManager.RttResult[] mResults;
-  }
-
-  @Deprecated public abstract static class RttManager.ResponderCallback {
-    ctor @Deprecated public RttManager.ResponderCallback();
-    method @Deprecated public abstract void onResponderEnableFailure(int);
-    method @Deprecated public abstract void onResponderEnabled(android.net.wifi.RttManager.ResponderConfig);
-  }
-
-  @Deprecated public static class RttManager.ResponderConfig implements android.os.Parcelable {
-    ctor @Deprecated public RttManager.ResponderConfig();
-    method @Deprecated public int describeContents();
-    method @Deprecated public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.RttManager.ResponderConfig> CREATOR;
-    field @Deprecated public int centerFreq0;
-    field @Deprecated public int centerFreq1;
-    field @Deprecated public int channelWidth;
-    field @Deprecated public int frequency;
-    field @Deprecated public String macAddress;
-    field @Deprecated public int preamble;
-  }
-
-  @Deprecated public static class RttManager.RttCapabilities implements android.os.Parcelable {
-    ctor @Deprecated public RttManager.RttCapabilities();
-    field @Deprecated public int bwSupported;
-    field @Deprecated public boolean lciSupported;
-    field @Deprecated public boolean lcrSupported;
-    field @Deprecated public int mcVersion;
-    field @Deprecated public boolean oneSidedRttSupported;
-    field @Deprecated public int preambleSupported;
-    field @Deprecated public boolean responderSupported;
-    field @Deprecated public boolean secureRttSupported;
-    field @Deprecated public boolean supportedPeerType;
-    field @Deprecated public boolean supportedType;
-    field @Deprecated public boolean twoSided11McRttSupported;
-  }
-
-  @Deprecated public static interface RttManager.RttListener {
-    method @Deprecated public void onAborted();
-    method @Deprecated public void onFailure(int, String);
-    method @Deprecated public void onSuccess(android.net.wifi.RttManager.RttResult[]);
-  }
-
-  @Deprecated public static class RttManager.RttParams {
-    ctor @Deprecated public RttManager.RttParams();
-    field @Deprecated public boolean LCIRequest;
-    field @Deprecated public boolean LCRRequest;
-    field @Deprecated public int bandwidth;
-    field @Deprecated public String bssid;
-    field @Deprecated public int burstTimeout;
-    field @Deprecated public int centerFreq0;
-    field @Deprecated public int centerFreq1;
-    field @Deprecated public int channelWidth;
-    field @Deprecated public int deviceType;
-    field @Deprecated public int frequency;
-    field @Deprecated public int interval;
-    field @Deprecated public int numRetriesPerFTMR;
-    field @Deprecated public int numRetriesPerMeasurementFrame;
-    field @Deprecated public int numSamplesPerBurst;
-    field @Deprecated public int num_retries;
-    field @Deprecated public int num_samples;
-    field @Deprecated public int numberBurst;
-    field @Deprecated public int preamble;
-    field @Deprecated public int requestType;
-    field @Deprecated public boolean secure;
-  }
-
-  @Deprecated public static class RttManager.RttResult {
-    ctor @Deprecated public RttManager.RttResult();
-    field @Deprecated public android.net.wifi.RttManager.WifiInformationElement LCI;
-    field @Deprecated public android.net.wifi.RttManager.WifiInformationElement LCR;
-    field @Deprecated public String bssid;
-    field @Deprecated public int burstDuration;
-    field @Deprecated public int burstNumber;
-    field @Deprecated public int distance;
-    field @Deprecated public int distanceSpread;
-    field @Deprecated public int distanceStandardDeviation;
-    field @Deprecated public int distance_cm;
-    field @Deprecated public int distance_sd_cm;
-    field @Deprecated public int distance_spread_cm;
-    field @Deprecated public int frameNumberPerBurstPeer;
-    field @Deprecated public int measurementFrameNumber;
-    field @Deprecated public int measurementType;
-    field @Deprecated public int negotiatedBurstNum;
-    field @Deprecated public int requestType;
-    field @Deprecated public int retryAfterDuration;
-    field @Deprecated public int rssi;
-    field @Deprecated public int rssiSpread;
-    field @Deprecated public int rssi_spread;
-    field @Deprecated public long rtt;
-    field @Deprecated public long rttSpread;
-    field @Deprecated public long rttStandardDeviation;
-    field @Deprecated public long rtt_ns;
-    field @Deprecated public long rtt_sd_ns;
-    field @Deprecated public long rtt_spread_ns;
-    field @Deprecated public int rxRate;
-    field @Deprecated public boolean secure;
-    field @Deprecated public int status;
-    field @Deprecated public int successMeasurementFrameNumber;
-    field @Deprecated public long ts;
-    field @Deprecated public int txRate;
-    field @Deprecated public int tx_rate;
-  }
-
-  @Deprecated public static class RttManager.WifiInformationElement {
-    ctor @Deprecated public RttManager.WifiInformationElement();
-    field @Deprecated public byte[] data;
-    field @Deprecated public byte id;
-  }
-
-  public final class ScanResult implements android.os.Parcelable {
-    field public static final int CIPHER_CCMP = 3; // 0x3
-    field public static final int CIPHER_GCMP_256 = 4; // 0x4
-    field public static final int CIPHER_NONE = 0; // 0x0
-    field public static final int CIPHER_NO_GROUP_ADDRESSED = 1; // 0x1
-    field public static final int CIPHER_SMS4 = 5; // 0x5
-    field public static final int CIPHER_TKIP = 2; // 0x2
-    field public static final int KEY_MGMT_EAP = 2; // 0x2
-    field public static final int KEY_MGMT_EAP_SHA256 = 6; // 0x6
-    field public static final int KEY_MGMT_EAP_SUITE_B_192 = 10; // 0xa
-    field public static final int KEY_MGMT_FT_EAP = 4; // 0x4
-    field public static final int KEY_MGMT_FT_PSK = 3; // 0x3
-    field public static final int KEY_MGMT_FT_SAE = 11; // 0xb
-    field public static final int KEY_MGMT_NONE = 0; // 0x0
-    field public static final int KEY_MGMT_OSEN = 7; // 0x7
-    field public static final int KEY_MGMT_OWE = 9; // 0x9
-    field public static final int KEY_MGMT_OWE_TRANSITION = 12; // 0xc
-    field public static final int KEY_MGMT_PSK = 1; // 0x1
-    field public static final int KEY_MGMT_PSK_SHA256 = 5; // 0x5
-    field public static final int KEY_MGMT_SAE = 8; // 0x8
-    field public static final int KEY_MGMT_WAPI_CERT = 14; // 0xe
-    field public static final int KEY_MGMT_WAPI_PSK = 13; // 0xd
-    field public static final int PROTOCOL_NONE = 0; // 0x0
-    field public static final int PROTOCOL_OSEN = 3; // 0x3
-    field public static final int PROTOCOL_RSN = 2; // 0x2
-    field public static final int PROTOCOL_WAPI = 4; // 0x4
-    field public static final int PROTOCOL_WPA = 1; // 0x1
-  }
-
-  public final class SoftApCapability implements android.os.Parcelable {
-    method public boolean areFeaturesSupported(long);
-    method public int describeContents();
-    method public int getMaxSupportedClients();
-    method @NonNull public int[] getSupportedChannelList(int);
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.SoftApCapability> CREATOR;
-    field public static final long SOFTAP_FEATURE_ACS_OFFLOAD = 1L; // 0x1L
-    field public static final long SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT = 2L; // 0x2L
-    field public static final long SOFTAP_FEATURE_MAC_ADDRESS_CUSTOMIZATION = 8L; // 0x8L
-    field public static final long SOFTAP_FEATURE_WPA3_SAE = 4L; // 0x4L
-  }
-
-  public final class SoftApConfiguration implements android.os.Parcelable {
-    method @NonNull public java.util.List<android.net.MacAddress> getAllowedClientList();
-    method public int getBand();
-    method @NonNull public int[] getBands();
-    method @NonNull public java.util.List<android.net.MacAddress> getBlockedClientList();
-    method public int getChannel();
-    method @NonNull public android.util.SparseIntArray getChannels();
-    method public int getMacRandomizationSetting();
-    method public int getMaxNumberOfClients();
-    method public long getShutdownTimeoutMillis();
-    method public boolean isAutoShutdownEnabled();
-    method public boolean isClientControlByUserEnabled();
-    method @Nullable public android.net.wifi.WifiConfiguration toWifiConfiguration();
-    field public static final int BAND_2GHZ = 1; // 0x1
-    field public static final int BAND_5GHZ = 2; // 0x2
-    field public static final int BAND_6GHZ = 4; // 0x4
-    field @Deprecated public static final int BAND_ANY = 7; // 0x7
-    field public static final int RANDOMIZATION_NONE = 0; // 0x0
-    field public static final int RANDOMIZATION_PERSISTENT = 1; // 0x1
-  }
-
-  public static final class SoftApConfiguration.Builder {
-    ctor public SoftApConfiguration.Builder();
-    ctor public SoftApConfiguration.Builder(@NonNull android.net.wifi.SoftApConfiguration);
-    method @NonNull public android.net.wifi.SoftApConfiguration build();
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setAllowedClientList(@NonNull java.util.List<android.net.MacAddress>);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setAutoShutdownEnabled(boolean);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setBand(int);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setBands(@NonNull int[]);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setBlockedClientList(@NonNull java.util.List<android.net.MacAddress>);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setBssid(@Nullable android.net.MacAddress);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setChannel(int, int);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setChannels(@NonNull android.util.SparseIntArray);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setClientControlByUserEnabled(boolean);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setHiddenSsid(boolean);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setMacRandomizationSetting(int);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setMaxNumberOfClients(@IntRange(from=0) int);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setPassphrase(@Nullable String, int);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setShutdownTimeoutMillis(@IntRange(from=0) long);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setSsid(@Nullable String);
-  }
-
-  public final class SoftApInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getBandwidth();
-    method @Nullable public android.net.MacAddress getBssid();
-    method public int getFrequency();
-    method public int getWifiStandard();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field public static final int CHANNEL_WIDTH_160MHZ = 6; // 0x6
-    field public static final int CHANNEL_WIDTH_20MHZ = 2; // 0x2
-    field public static final int CHANNEL_WIDTH_20MHZ_NOHT = 1; // 0x1
-    field public static final int CHANNEL_WIDTH_40MHZ = 3; // 0x3
-    field public static final int CHANNEL_WIDTH_80MHZ = 4; // 0x4
-    field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 5; // 0x5
-    field public static final int CHANNEL_WIDTH_INVALID = 0; // 0x0
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.SoftApInfo> CREATOR;
-  }
-
-  public final class WifiClient implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.net.MacAddress getMacAddress();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiClient> CREATOR;
-  }
-
-  @Deprecated public class WifiConfiguration implements android.os.Parcelable {
-    method @Deprecated public int getAuthType();
-    method @Deprecated @NonNull public android.net.IpConfiguration getIpConfiguration();
-    method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus getNetworkSelectionStatus();
-    method @Deprecated @NonNull public String getPrintableSsid();
-    method @Deprecated @NonNull public String getProfileKey();
-    method @Deprecated public int getRecentFailureReason();
-    method @Deprecated public boolean hasNoInternetAccess();
-    method @Deprecated public boolean isEphemeral();
-    method @Deprecated public static boolean isMetered(@Nullable android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiInfo);
-    method @Deprecated public boolean isNoInternetAccessExpected();
-    method @Deprecated public void setIpConfiguration(@Nullable android.net.IpConfiguration);
-    method @Deprecated public void setNetworkSelectionStatus(@NonNull android.net.wifi.WifiConfiguration.NetworkSelectionStatus);
-    field @Deprecated public static final int INVALID_NETWORK_ID = -1; // 0xffffffff
-    field @Deprecated public static final int METERED_OVERRIDE_METERED = 1; // 0x1
-    field @Deprecated public static final int METERED_OVERRIDE_NONE = 0; // 0x0
-    field @Deprecated public static final int METERED_OVERRIDE_NOT_METERED = 2; // 0x2
-    field @Deprecated public static final int RANDOMIZATION_AUTO = 3; // 0x3
-    field @Deprecated public static final int RANDOMIZATION_ENHANCED = 2; // 0x2
-    field @Deprecated public static final int RANDOMIZATION_NONE = 0; // 0x0
-    field @Deprecated public static final int RANDOMIZATION_PERSISTENT = 1; // 0x1
-    field @Deprecated public static final int RECENT_FAILURE_AP_UNABLE_TO_HANDLE_NEW_STA = 17; // 0x11
-    field @Deprecated public static final int RECENT_FAILURE_DISCONNECTION_AP_BUSY = 1004; // 0x3ec
-    field @Deprecated public static final int RECENT_FAILURE_MBO_OCE_DISCONNECT = 1001; // 0x3e9
-    field @Deprecated public static final int RECENT_FAILURE_NONE = 0; // 0x0
-    field @Deprecated public static final int RECENT_FAILURE_POOR_CHANNEL_CONDITIONS = 1003; // 0x3eb
-    field @Deprecated public static final int RECENT_FAILURE_REFUSED_TEMPORARILY = 1002; // 0x3ea
-    field @Deprecated public boolean allowAutojoin;
-    field @Deprecated public int carrierId;
-    field @Deprecated public String creatorName;
-    field @Deprecated public int creatorUid;
-    field @Deprecated public boolean fromWifiNetworkSpecifier;
-    field @Deprecated public boolean fromWifiNetworkSuggestion;
-    field @Deprecated public String lastUpdateName;
-    field @Deprecated public int lastUpdateUid;
-    field @Deprecated public int macRandomizationSetting;
-    field @Deprecated public boolean meteredHint;
-    field @Deprecated public int meteredOverride;
-    field @Deprecated public int numAssociation;
-    field @Deprecated public int numScorerOverride;
-    field @Deprecated public int numScorerOverrideAndSwitchedNetwork;
-    field @Deprecated public boolean requirePmf;
-    field @Deprecated public boolean shared;
-    field @Deprecated public int subscriptionId;
-    field @Deprecated public boolean useExternalScores;
-  }
-
-  @Deprecated public static class WifiConfiguration.KeyMgmt {
-    field @Deprecated public static final int WAPI_CERT = 14; // 0xe
-    field @Deprecated public static final int WAPI_PSK = 13; // 0xd
-    field @Deprecated public static final int WPA2_PSK = 4; // 0x4
-  }
-
-  @Deprecated public static class WifiConfiguration.NetworkSelectionStatus {
-    method @Deprecated public int getDisableReasonCounter(int);
-    method @Deprecated public long getDisableTime();
-    method @Deprecated public static int getMaxNetworkSelectionDisableReason();
-    method @Deprecated public int getNetworkSelectionDisableReason();
-    method @Deprecated @Nullable public static String getNetworkSelectionDisableReasonString(int);
-    method @Deprecated public int getNetworkSelectionStatus();
-    method @Deprecated @NonNull public String getNetworkStatusString();
-    method @Deprecated public boolean hasEverConnected();
-    field @Deprecated public static final int DISABLED_ASSOCIATION_REJECTION = 1; // 0x1
-    field @Deprecated public static final int DISABLED_AUTHENTICATION_FAILURE = 2; // 0x2
-    field @Deprecated public static final int DISABLED_AUTHENTICATION_NO_CREDENTIALS = 5; // 0x5
-    field @Deprecated public static final int DISABLED_AUTHENTICATION_NO_SUBSCRIPTION = 9; // 0x9
-    field @Deprecated public static final int DISABLED_BY_WIFI_MANAGER = 7; // 0x7
-    field @Deprecated public static final int DISABLED_BY_WRONG_PASSWORD = 8; // 0x8
-    field @Deprecated public static final int DISABLED_DHCP_FAILURE = 3; // 0x3
-    field @Deprecated public static final int DISABLED_NONE = 0; // 0x0
-    field @Deprecated public static final int DISABLED_NO_INTERNET_PERMANENT = 6; // 0x6
-    field @Deprecated public static final int DISABLED_NO_INTERNET_TEMPORARY = 4; // 0x4
-    field @Deprecated public static final int NETWORK_SELECTION_ENABLED = 0; // 0x0
-    field @Deprecated public static final int NETWORK_SELECTION_PERMANENTLY_DISABLED = 2; // 0x2
-    field @Deprecated public static final int NETWORK_SELECTION_TEMPORARY_DISABLED = 1; // 0x1
-  }
-
-  @Deprecated public static final class WifiConfiguration.NetworkSelectionStatus.Builder {
-    ctor @Deprecated public WifiConfiguration.NetworkSelectionStatus.Builder();
-    method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus build();
-    method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus.Builder setNetworkSelectionDisableReason(int);
-    method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus.Builder setNetworkSelectionStatus(int);
-  }
-
-  public class WifiEnterpriseConfig implements android.os.Parcelable {
-    method @Nullable public String[] getCaCertificateAliases();
-    method @NonNull public String getCaPath();
-    method @NonNull public String getClientCertificateAlias();
-    method public int getOcsp();
-    method @NonNull public String getWapiCertSuite();
-    method public void setCaCertificateAliases(@Nullable String[]);
-    method public void setCaPath(@NonNull String);
-    method public void setClientCertificateAlias(@NonNull String);
-    method public void setOcsp(int);
-    method public void setWapiCertSuite(@NonNull String);
-    field public static final int OCSP_NONE = 0; // 0x0
-    field public static final int OCSP_REQUEST_CERT_STATUS = 1; // 0x1
-    field public static final int OCSP_REQUIRE_ALL_NON_TRUSTED_CERTS_STATUS = 3; // 0x3
-    field public static final int OCSP_REQUIRE_CERT_STATUS = 2; // 0x2
-  }
-
-  public class WifiFrameworkInitializer {
-    method public static void registerServiceWrappers();
-  }
-
-  public class WifiInfo implements android.os.Parcelable {
-    method public double getLostTxPacketsPerSecond();
-    method @Nullable public String getRequestingPackageName();
-    method public double getRetriedTxPacketsPerSecond();
-    method public int getScore();
-    method public double getSuccessfulRxPacketsPerSecond();
-    method public double getSuccessfulTxPacketsPerSecond();
-    method public boolean isEphemeral();
-    method public boolean isOemPaid();
-    method public boolean isOemPrivate();
-    method public boolean isOsuAp();
-    method public boolean isPasspointAp();
-    method public boolean isTrusted();
-    method @Nullable public static String sanitizeSsid(@Nullable String);
-    field public static final String DEFAULT_MAC_ADDRESS = "02:00:00:00:00:00";
-    field public static final int INVALID_RSSI = -127; // 0xffffff81
-  }
-
-  public class WifiManager {
-    method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public void addOnWifiUsabilityStatsListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.OnWifiUsabilityStatsListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void allowAutojoin(int, boolean);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void allowAutojoinGlobal(boolean);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void allowAutojoinPasspoint(@NonNull String, boolean);
-    method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public void clearWifiConnectedNetworkScorer();
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void connect(@NonNull android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiManager.ActionListener);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void connect(int, @Nullable android.net.wifi.WifiManager.ActionListener);
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void disable(int, @Nullable android.net.wifi.WifiManager.ActionListener);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK}) public void disableEphemeralNetwork(@NonNull String);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void factoryReset();
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void forget(int, @Nullable android.net.wifi.WifiManager.ActionListener);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.util.Pair<android.net.wifi.WifiConfiguration,java.util.Map<java.lang.Integer,java.util.List<android.net.wifi.ScanResult>>>> getAllMatchingWifiConfigs(@NonNull java.util.List<android.net.wifi.ScanResult>);
-    method @Nullable @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public String getCountryCode();
-    method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public android.net.Network getCurrentNetwork();
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public String[] getFactoryMacAddresses();
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,java.util.List<android.net.wifi.ScanResult>> getMatchingOsuProviders(@Nullable java.util.List<android.net.wifi.ScanResult>);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,android.net.wifi.hotspot2.PasspointConfiguration> getMatchingPasspointConfigsForOsuProviders(@NonNull java.util.Set<android.net.wifi.hotspot2.OsuProvider>);
-    method @NonNull @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE}) public java.util.Map<android.net.wifi.WifiNetworkSuggestion,java.util.List<android.net.wifi.ScanResult>> getMatchingScanResults(@NonNull java.util.List<android.net.wifi.WifiNetworkSuggestion>, @Nullable java.util.List<android.net.wifi.ScanResult>);
-    method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE, android.Manifest.permission.READ_WIFI_CREDENTIAL}) public java.util.List<android.net.wifi.WifiConfiguration> getPrivilegedConfiguredNetworks();
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.OVERRIDE_WIFI_CONFIG}) public android.net.wifi.SoftApConfiguration getSoftApConfiguration();
-    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public void getWifiActivityEnergyInfoAsync(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.OnWifiActivityEnergyInfoListener);
-    method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public android.net.wifi.WifiConfiguration getWifiApConfiguration();
-    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public int getWifiApState();
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.net.wifi.WifiConfiguration> getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(@NonNull java.util.List<android.net.wifi.ScanResult>);
-    method public boolean is60GHzBandSupported();
-    method public boolean isApMacRandomizationSupported();
-    method public boolean isConnectedMacRandomizationSupported();
-    method @Deprecated public boolean isDeviceToDeviceRttSupported();
-    method public boolean isPortableHotspotSupported();
-    method public boolean isVerboseLoggingEnabled();
-    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public boolean isWifiApEnabled();
-    method public boolean isWifiScannerSupported();
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void registerNetworkRequestMatchCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.NetworkRequestMatchCallback);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void registerSoftApCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.SoftApCallback);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void registerTrafficStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.TrafficStateCallback);
-    method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public void removeOnWifiUsabilityStatsListener(@NonNull android.net.wifi.WifiManager.OnWifiUsabilityStatsListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void restoreBackupData(@NonNull byte[]);
-    method @Nullable @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public android.net.wifi.SoftApConfiguration restoreSoftApBackupData(@NonNull byte[]);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void restoreSupplicantBackupData(@NonNull byte[], @NonNull byte[]);
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public byte[] retrieveBackupData();
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public byte[] retrieveSoftApBackupData();
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void save(@NonNull android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setAutoWakeupEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.WIFI_SET_DEVICE_MOBILITY_STATE) public void setDeviceMobilityState(int);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setMacRandomizationSettingPasspointEnabled(@NonNull String, boolean);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setPasspointMeteredOverride(@NonNull String, int);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setScanAlwaysAvailable(boolean);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setScanThrottleEnabled(boolean);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.OVERRIDE_WIFI_CONFIG}) public boolean setSoftApConfiguration(@NonNull android.net.wifi.SoftApConfiguration);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setVerboseLoggingEnabled(boolean);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public boolean setWifiApConfiguration(android.net.wifi.WifiConfiguration);
-    method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public boolean setWifiConnectedNetworkScorer(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.WifiConnectedNetworkScorer);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startEasyConnectAsConfiguratorInitiator(@NonNull String, int, int, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.EasyConnectStatusCallback);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startEasyConnectAsEnrolleeInitiator(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.EasyConnectStatusCallback);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startLocalOnlyHotspot(@NonNull android.net.wifi.SoftApConfiguration, @Nullable java.util.concurrent.Executor, @Nullable android.net.wifi.WifiManager.LocalOnlyHotspotCallback);
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public boolean startScan(android.os.WorkSource);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startSubscriptionProvisioning(@NonNull android.net.wifi.hotspot2.OsuProvider, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.hotspot2.ProvisioningCallback);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public boolean startTetheredHotspot(@Nullable android.net.wifi.SoftApConfiguration);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void stopEasyConnectSession();
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public boolean stopSoftAp();
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void unregisterNetworkRequestMatchCallback(@NonNull android.net.wifi.WifiManager.NetworkRequestMatchCallback);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void unregisterSoftApCallback(@NonNull android.net.wifi.WifiManager.SoftApCallback);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void unregisterTrafficStateCallback(@NonNull android.net.wifi.WifiManager.TrafficStateCallback);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void updateInterfaceIpState(@Nullable String, int);
-    method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public void updateWifiUsabilityScore(int, int, int);
-    field public static final String ACTION_LINK_CONFIGURATION_CHANGED = "android.net.wifi.LINK_CONFIGURATION_CHANGED";
-    field @RequiresPermission(android.Manifest.permission.NETWORK_CARRIER_PROVISIONING) public static final String ACTION_NETWORK_SETTINGS_RESET = "android.net.wifi.action.NETWORK_SETTINGS_RESET";
-    field public static final String ACTION_PASSPOINT_LAUNCH_OSU_VIEW = "android.net.wifi.action.PASSPOINT_LAUNCH_OSU_VIEW";
-    field public static final String ACTION_REQUEST_DISABLE = "android.net.wifi.action.REQUEST_DISABLE";
-    field public static final String ACTION_REQUEST_ENABLE = "android.net.wifi.action.REQUEST_ENABLE";
-    field public static final int CHANGE_REASON_ADDED = 0; // 0x0
-    field public static final int CHANGE_REASON_CONFIG_CHANGE = 2; // 0x2
-    field public static final int CHANGE_REASON_REMOVED = 1; // 0x1
-    field public static final String CONFIGURED_NETWORKS_CHANGED_ACTION = "android.net.wifi.CONFIGURED_NETWORKS_CHANGE";
-    field public static final int DEVICE_MOBILITY_STATE_HIGH_MVMT = 1; // 0x1
-    field public static final int DEVICE_MOBILITY_STATE_LOW_MVMT = 2; // 0x2
-    field public static final int DEVICE_MOBILITY_STATE_STATIONARY = 3; // 0x3
-    field public static final int DEVICE_MOBILITY_STATE_UNKNOWN = 0; // 0x0
-    field public static final int EASY_CONNECT_NETWORK_ROLE_AP = 1; // 0x1
-    field public static final int EASY_CONNECT_NETWORK_ROLE_STA = 0; // 0x0
-    field public static final String EXTRA_CHANGE_REASON = "changeReason";
-    field @Deprecated public static final String EXTRA_LINK_PROPERTIES = "android.net.wifi.extra.LINK_PROPERTIES";
-    field @Deprecated public static final String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges";
-    field public static final String EXTRA_OSU_NETWORK = "android.net.wifi.extra.OSU_NETWORK";
-    field public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state";
-    field public static final String EXTRA_URL = "android.net.wifi.extra.URL";
-    field public static final String EXTRA_WIFI_AP_FAILURE_REASON = "android.net.wifi.extra.WIFI_AP_FAILURE_REASON";
-    field public static final String EXTRA_WIFI_AP_INTERFACE_NAME = "android.net.wifi.extra.WIFI_AP_INTERFACE_NAME";
-    field public static final String EXTRA_WIFI_AP_MODE = "android.net.wifi.extra.WIFI_AP_MODE";
-    field public static final String EXTRA_WIFI_AP_STATE = "wifi_state";
-    field @Deprecated public static final String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration";
-    field public static final String EXTRA_WIFI_CREDENTIAL_EVENT_TYPE = "et";
-    field public static final String EXTRA_WIFI_CREDENTIAL_SSID = "ssid";
-    field public static final int IFACE_IP_MODE_CONFIGURATION_ERROR = 0; // 0x0
-    field public static final int IFACE_IP_MODE_LOCAL_ONLY = 2; // 0x2
-    field public static final int IFACE_IP_MODE_TETHERED = 1; // 0x1
-    field public static final int IFACE_IP_MODE_UNSPECIFIED = -1; // 0xffffffff
-    field public static final int PASSPOINT_HOME_NETWORK = 0; // 0x0
-    field public static final int PASSPOINT_ROAMING_NETWORK = 1; // 0x1
-    field public static final int SAP_CLIENT_BLOCK_REASON_CODE_BLOCKED_BY_USER = 0; // 0x0
-    field public static final int SAP_CLIENT_BLOCK_REASON_CODE_NO_MORE_STAS = 1; // 0x1
-    field public static final int SAP_START_FAILURE_GENERAL = 0; // 0x0
-    field public static final int SAP_START_FAILURE_NO_CHANNEL = 1; // 0x1
-    field public static final int SAP_START_FAILURE_UNSUPPORTED_CONFIGURATION = 2; // 0x2
-    field public static final String WIFI_AP_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_AP_STATE_CHANGED";
-    field public static final int WIFI_AP_STATE_DISABLED = 11; // 0xb
-    field public static final int WIFI_AP_STATE_DISABLING = 10; // 0xa
-    field public static final int WIFI_AP_STATE_ENABLED = 13; // 0xd
-    field public static final int WIFI_AP_STATE_ENABLING = 12; // 0xc
-    field public static final int WIFI_AP_STATE_FAILED = 14; // 0xe
-    field public static final String WIFI_CREDENTIAL_CHANGED_ACTION = "android.net.wifi.WIFI_CREDENTIAL_CHANGED";
-    field public static final int WIFI_CREDENTIAL_FORGOT = 1; // 0x1
-    field public static final int WIFI_CREDENTIAL_SAVED = 0; // 0x0
-  }
-
-  public static interface WifiManager.ActionListener {
-    method public void onFailure(int);
-    method public void onSuccess();
-  }
-
-  public static interface WifiManager.NetworkRequestMatchCallback {
-    method public default void onAbort();
-    method public default void onMatch(@NonNull java.util.List<android.net.wifi.ScanResult>);
-    method public default void onUserSelectionCallbackRegistration(@NonNull android.net.wifi.WifiManager.NetworkRequestUserSelectionCallback);
-    method public default void onUserSelectionConnectFailure(@NonNull android.net.wifi.WifiConfiguration);
-    method public default void onUserSelectionConnectSuccess(@NonNull android.net.wifi.WifiConfiguration);
-  }
-
-  public static interface WifiManager.NetworkRequestUserSelectionCallback {
-    method public default void reject();
-    method public default void select(@NonNull android.net.wifi.WifiConfiguration);
-  }
-
-  public static interface WifiManager.OnWifiActivityEnergyInfoListener {
-    method public void onWifiActivityEnergyInfo(@Nullable android.os.connectivity.WifiActivityEnergyInfo);
-  }
-
-  public static interface WifiManager.OnWifiUsabilityStatsListener {
-    method public void onWifiUsabilityStats(int, boolean, @NonNull android.net.wifi.WifiUsabilityStatsEntry);
-  }
-
-  public static interface WifiManager.ScoreUpdateObserver {
-    method public void notifyScoreUpdate(int, int);
-    method public void triggerUpdateOfWifiUsabilityStats(int);
-  }
-
-  public static interface WifiManager.SoftApCallback {
-    method public default void onBlockedClientConnecting(@NonNull android.net.wifi.WifiClient, int);
-    method public default void onCapabilityChanged(@NonNull android.net.wifi.SoftApCapability);
-    method public default void onConnectedClientsChanged(@NonNull java.util.List<android.net.wifi.WifiClient>);
-    method public default void onInfoChanged(@NonNull android.net.wifi.SoftApInfo);
-    method public default void onStateChanged(int, int);
-  }
-
-  public static interface WifiManager.TrafficStateCallback {
-    method public void onStateChanged(int);
-    field public static final int DATA_ACTIVITY_IN = 1; // 0x1
-    field public static final int DATA_ACTIVITY_INOUT = 3; // 0x3
-    field public static final int DATA_ACTIVITY_NONE = 0; // 0x0
-    field public static final int DATA_ACTIVITY_OUT = 2; // 0x2
-  }
-
-  public static interface WifiManager.WifiConnectedNetworkScorer {
-    method public void onSetScoreUpdateObserver(@NonNull android.net.wifi.WifiManager.ScoreUpdateObserver);
-    method public void onStart(int);
-    method public void onStop(int);
-  }
-
-  public final class WifiMigration {
-    method @Nullable public static java.io.InputStream convertAndRetrieveSharedConfigStoreFile(int);
-    method @Nullable public static java.io.InputStream convertAndRetrieveUserConfigStoreFile(int, @NonNull android.os.UserHandle);
-    method @NonNull public static android.net.wifi.WifiMigration.SettingsMigrationData loadFromSettings(@NonNull android.content.Context);
-    method public static void removeSharedConfigStoreFile(int);
-    method public static void removeUserConfigStoreFile(int, @NonNull android.os.UserHandle);
-    field public static final int STORE_FILE_SHARED_GENERAL = 0; // 0x0
-    field public static final int STORE_FILE_SHARED_SOFTAP = 1; // 0x1
-    field public static final int STORE_FILE_USER_GENERAL = 2; // 0x2
-    field public static final int STORE_FILE_USER_NETWORK_SUGGESTIONS = 3; // 0x3
-  }
-
-  public static final class WifiMigration.SettingsMigrationData implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public String getP2pDeviceName();
-    method public boolean isP2pFactoryResetPending();
-    method public boolean isScanAlwaysAvailable();
-    method public boolean isScanThrottleEnabled();
-    method public boolean isSoftApTimeoutEnabled();
-    method public boolean isVerboseLoggingEnabled();
-    method public boolean isWakeUpEnabled();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiMigration.SettingsMigrationData> CREATOR;
-  }
-
-  public static final class WifiMigration.SettingsMigrationData.Builder {
-    ctor public WifiMigration.SettingsMigrationData.Builder();
-    method @NonNull public android.net.wifi.WifiMigration.SettingsMigrationData build();
-    method @NonNull public android.net.wifi.WifiMigration.SettingsMigrationData.Builder setP2pDeviceName(@Nullable String);
-    method @NonNull public android.net.wifi.WifiMigration.SettingsMigrationData.Builder setP2pFactoryResetPending(boolean);
-    method @NonNull public android.net.wifi.WifiMigration.SettingsMigrationData.Builder setScanAlwaysAvailable(boolean);
-    method @NonNull public android.net.wifi.WifiMigration.SettingsMigrationData.Builder setScanThrottleEnabled(boolean);
-    method @NonNull public android.net.wifi.WifiMigration.SettingsMigrationData.Builder setSoftApTimeoutEnabled(boolean);
-    method @NonNull public android.net.wifi.WifiMigration.SettingsMigrationData.Builder setVerboseLoggingEnabled(boolean);
-    method @NonNull public android.net.wifi.WifiMigration.SettingsMigrationData.Builder setWakeUpEnabled(boolean);
-  }
-
-  public class WifiNetworkConnectionStatistics implements android.os.Parcelable {
-    ctor public WifiNetworkConnectionStatistics(int, int);
-    ctor public WifiNetworkConnectionStatistics();
-    ctor public WifiNetworkConnectionStatistics(android.net.wifi.WifiNetworkConnectionStatistics);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiNetworkConnectionStatistics> CREATOR;
-    field public int numConnection;
-    field public int numUsage;
-  }
-
-  public final class WifiNetworkSuggestion implements android.os.Parcelable {
-    method @NonNull public android.net.wifi.WifiConfiguration getWifiConfiguration();
-    method public boolean isOemPaid();
-    method public boolean isOemPrivate();
-  }
-
-  public static final class WifiNetworkSuggestion.Builder {
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_CARRIER_PROVISIONING) public android.net.wifi.WifiNetworkSuggestion.Builder setCarrierId(int);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setOemPaid(boolean);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setOemPrivate(boolean);
-  }
-
-  public class WifiScanner {
-    method @Deprecated public void configureWifiChange(int, int, int, int, int, android.net.wifi.WifiScanner.BssidInfo[]);
-    method @Deprecated public void configureWifiChange(android.net.wifi.WifiScanner.WifiChangeSettings);
-    method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public java.util.List<java.lang.Integer> getAvailableChannels(int);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean getScanResults();
-    method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public java.util.List<android.net.wifi.ScanResult> getSingleScanResults();
-    method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void registerScanListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiScanner.ScanListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void setScanningEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startBackgroundScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startBackgroundScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener, android.os.WorkSource);
-    method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener);
-    method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener, android.os.WorkSource);
-    method @Deprecated public void startTrackingBssids(android.net.wifi.WifiScanner.BssidInfo[], int, android.net.wifi.WifiScanner.BssidListener);
-    method @Deprecated public void startTrackingWifiChange(android.net.wifi.WifiScanner.WifiChangeListener);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void stopBackgroundScan(android.net.wifi.WifiScanner.ScanListener);
-    method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void stopScan(android.net.wifi.WifiScanner.ScanListener);
-    method @Deprecated public void stopTrackingBssids(android.net.wifi.WifiScanner.BssidListener);
-    method @Deprecated public void stopTrackingWifiChange(android.net.wifi.WifiScanner.WifiChangeListener);
-    method public void unregisterScanListener(@NonNull android.net.wifi.WifiScanner.ScanListener);
-    field public static final int MAX_SCAN_PERIOD_MS = 1024000; // 0xfa000
-    field public static final int MIN_SCAN_PERIOD_MS = 1000; // 0x3e8
-    field public static final int REASON_DUPLICATE_REQEUST = -5; // 0xfffffffb
-    field public static final int REASON_INVALID_LISTENER = -2; // 0xfffffffe
-    field public static final int REASON_INVALID_REQUEST = -3; // 0xfffffffd
-    field public static final int REASON_NOT_AUTHORIZED = -4; // 0xfffffffc
-    field public static final int REASON_SUCCEEDED = 0; // 0x0
-    field public static final int REASON_UNSPECIFIED = -1; // 0xffffffff
-    field @Deprecated public static final int REPORT_EVENT_AFTER_BUFFER_FULL = 0; // 0x0
-    field public static final int REPORT_EVENT_AFTER_EACH_SCAN = 1; // 0x1
-    field public static final int REPORT_EVENT_FULL_SCAN_RESULT = 2; // 0x2
-    field public static final int REPORT_EVENT_NO_BATCH = 4; // 0x4
-    field public static final int SCAN_TYPE_HIGH_ACCURACY = 2; // 0x2
-    field public static final int SCAN_TYPE_LOW_LATENCY = 0; // 0x0
-    field public static final int SCAN_TYPE_LOW_POWER = 1; // 0x1
-    field public static final int WIFI_BAND_24_5_6_GHZ = 11; // 0xb
-    field public static final int WIFI_BAND_24_5_WITH_DFS_6_GHZ = 15; // 0xf
-    field public static final int WIFI_BAND_24_GHZ = 1; // 0x1
-    field public static final int WIFI_BAND_5_GHZ = 2; // 0x2
-    field public static final int WIFI_BAND_5_GHZ_DFS_ONLY = 4; // 0x4
-    field public static final int WIFI_BAND_5_GHZ_WITH_DFS = 6; // 0x6
-    field public static final int WIFI_BAND_60_GHZ = 16; // 0x10
-    field public static final int WIFI_BAND_6_GHZ = 8; // 0x8
-    field public static final int WIFI_BAND_BOTH = 3; // 0x3
-    field public static final int WIFI_BAND_BOTH_WITH_DFS = 7; // 0x7
-    field public static final int WIFI_BAND_UNSPECIFIED = 0; // 0x0
-  }
-
-  public static interface WifiScanner.ActionListener {
-    method public void onFailure(int, String);
-    method public void onSuccess();
-  }
-
-  @Deprecated public static class WifiScanner.BssidInfo {
-    ctor @Deprecated public WifiScanner.BssidInfo();
-    field @Deprecated public String bssid;
-    field @Deprecated public int frequencyHint;
-    field @Deprecated public int high;
-    field @Deprecated public int low;
-  }
-
-  @Deprecated public static interface WifiScanner.BssidListener extends android.net.wifi.WifiScanner.ActionListener {
-    method @Deprecated public void onFound(android.net.wifi.ScanResult[]);
-    method @Deprecated public void onLost(android.net.wifi.ScanResult[]);
-  }
-
-  public static class WifiScanner.ChannelSpec {
-    ctor public WifiScanner.ChannelSpec(int);
-    field public int frequency;
-  }
-
-  @Deprecated public static class WifiScanner.HotlistSettings implements android.os.Parcelable {
-    ctor @Deprecated public WifiScanner.HotlistSettings();
-    field @Deprecated public int apLostThreshold;
-    field @Deprecated public android.net.wifi.WifiScanner.BssidInfo[] bssidInfos;
-  }
-
-  public static class WifiScanner.ParcelableScanData implements android.os.Parcelable {
-    ctor public WifiScanner.ParcelableScanData(android.net.wifi.WifiScanner.ScanData[]);
-    method public android.net.wifi.WifiScanner.ScanData[] getResults();
-    field public android.net.wifi.WifiScanner.ScanData[] mResults;
-  }
-
-  public static class WifiScanner.ParcelableScanResults implements android.os.Parcelable {
-    ctor public WifiScanner.ParcelableScanResults(android.net.wifi.ScanResult[]);
-    method public android.net.wifi.ScanResult[] getResults();
-    field public android.net.wifi.ScanResult[] mResults;
-  }
-
-  public static class WifiScanner.ScanData implements android.os.Parcelable {
-    ctor public WifiScanner.ScanData(int, int, android.net.wifi.ScanResult[]);
-    ctor public WifiScanner.ScanData(android.net.wifi.WifiScanner.ScanData);
-    method public int getFlags();
-    method public int getId();
-    method public android.net.wifi.ScanResult[] getResults();
-  }
-
-  public static interface WifiScanner.ScanListener extends android.net.wifi.WifiScanner.ActionListener {
-    method public void onFullResult(android.net.wifi.ScanResult);
-    method @Deprecated public void onPeriodChanged(int);
-    method public void onResults(android.net.wifi.WifiScanner.ScanData[]);
-  }
-
-  public static class WifiScanner.ScanSettings implements android.os.Parcelable {
-    ctor public WifiScanner.ScanSettings();
-    field public int band;
-    field public android.net.wifi.WifiScanner.ChannelSpec[] channels;
-    field @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public final java.util.List<android.net.wifi.WifiScanner.ScanSettings.HiddenNetwork> hiddenNetworks;
-    field public boolean hideFromAppOps;
-    field public boolean ignoreLocationSettings;
-    field @Deprecated public int maxPeriodInMs;
-    field @Deprecated public int maxScansToCache;
-    field @Deprecated public int numBssidsPerScan;
-    field @Deprecated public int periodInMs;
-    field @Deprecated public int reportEvents;
-    field @Deprecated public int stepCount;
-    field @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public int type;
-  }
-
-  public static class WifiScanner.ScanSettings.HiddenNetwork {
-    ctor public WifiScanner.ScanSettings.HiddenNetwork(@NonNull String);
-    field @NonNull public final String ssid;
-  }
-
-  @Deprecated public static interface WifiScanner.WifiChangeListener extends android.net.wifi.WifiScanner.ActionListener {
-    method @Deprecated public void onChanging(android.net.wifi.ScanResult[]);
-    method @Deprecated public void onQuiescence(android.net.wifi.ScanResult[]);
-  }
-
-  @Deprecated public static class WifiScanner.WifiChangeSettings implements android.os.Parcelable {
-    ctor @Deprecated public WifiScanner.WifiChangeSettings();
-    field @Deprecated public android.net.wifi.WifiScanner.BssidInfo[] bssidInfos;
-    field @Deprecated public int lostApSampleSize;
-    field @Deprecated public int minApsBreachingThreshold;
-    field @Deprecated public int periodInMs;
-    field @Deprecated public int rssiSampleSize;
-    field @Deprecated public int unchangedSampleSize;
-  }
-
-  public final class WifiUsabilityStatsEntry implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getCellularDataNetworkType();
-    method public int getCellularSignalStrengthDb();
-    method public int getCellularSignalStrengthDbm();
-    method public int getLinkSpeedMbps();
-    method public int getProbeElapsedTimeSinceLastUpdateMillis();
-    method public int getProbeMcsRateSinceLastUpdate();
-    method public int getProbeStatusSinceLastUpdate();
-    method public int getRssi();
-    method public int getRxLinkSpeedMbps();
-    method public long getTimeStampMillis();
-    method public long getTotalBackgroundScanTimeMillis();
-    method public long getTotalBeaconRx();
-    method public long getTotalCcaBusyFreqTimeMillis();
-    method public long getTotalHotspot2ScanTimeMillis();
-    method public long getTotalNanScanTimeMillis();
-    method public long getTotalPnoScanTimeMillis();
-    method public long getTotalRadioOnFreqTimeMillis();
-    method public long getTotalRadioOnTimeMillis();
-    method public long getTotalRadioRxTimeMillis();
-    method public long getTotalRadioTxTimeMillis();
-    method public long getTotalRoamScanTimeMillis();
-    method public long getTotalRxSuccess();
-    method public long getTotalScanTimeMillis();
-    method public long getTotalTxBad();
-    method public long getTotalTxRetries();
-    method public long getTotalTxSuccess();
-    method public boolean isSameRegisteredCell();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiUsabilityStatsEntry> CREATOR;
-    field public static final int PROBE_STATUS_FAILURE = 3; // 0x3
-    field public static final int PROBE_STATUS_NO_PROBE = 1; // 0x1
-    field public static final int PROBE_STATUS_SUCCESS = 2; // 0x2
-    field public static final int PROBE_STATUS_UNKNOWN = 0; // 0x0
-  }
-
-}
-
-package android.net.wifi.aware {
-
-  public class DiscoverySession implements java.lang.AutoCloseable {
-    method @Deprecated public android.net.NetworkSpecifier createNetworkSpecifierPmk(@NonNull android.net.wifi.aware.PeerHandle, @NonNull byte[]);
-  }
-
-  public class WifiAwareManager {
-    method public void enableInstantCommunicationMode(boolean);
-  }
-
-  public class WifiAwareSession implements java.lang.AutoCloseable {
-    method public android.net.NetworkSpecifier createNetworkSpecifierPmk(int, @NonNull byte[], @NonNull byte[]);
-  }
-
-}
-
-package android.net.wifi.hotspot2 {
-
-  public final class OsuProvider implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public String getFriendlyName();
-    method @Nullable public android.net.Uri getServerUri();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.OsuProvider> CREATOR;
-  }
-
-  public final class PasspointConfiguration implements android.os.Parcelable {
-    method public int getMeteredOverride();
-    method public boolean isAutojoinEnabled();
-    method public boolean isMacRandomizationEnabled();
-  }
-
-  public abstract class ProvisioningCallback {
-    ctor public ProvisioningCallback();
-    method public abstract void onProvisioningComplete();
-    method public abstract void onProvisioningFailure(int);
-    method public abstract void onProvisioningStatus(int);
-    field public static final int OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION = 22; // 0x16
-    field public static final int OSU_FAILURE_AP_CONNECTION = 1; // 0x1
-    field public static final int OSU_FAILURE_INVALID_URL_FORMAT_FOR_OSU = 8; // 0x8
-    field public static final int OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE = 17; // 0x11
-    field public static final int OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE = 21; // 0x15
-    field public static final int OSU_FAILURE_NO_OSU_ACTIVITY_FOUND = 14; // 0xe
-    field public static final int OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE = 19; // 0x13
-    field public static final int OSU_FAILURE_NO_PPS_MO = 16; // 0x10
-    field public static final int OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE = 18; // 0x12
-    field public static final int OSU_FAILURE_OSU_PROVIDER_NOT_FOUND = 23; // 0x17
-    field public static final int OSU_FAILURE_PROVISIONING_ABORTED = 6; // 0x6
-    field public static final int OSU_FAILURE_PROVISIONING_NOT_AVAILABLE = 7; // 0x7
-    field public static final int OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES = 20; // 0x14
-    field public static final int OSU_FAILURE_SERVER_CONNECTION = 3; // 0x3
-    field public static final int OSU_FAILURE_SERVER_URL_INVALID = 2; // 0x2
-    field public static final int OSU_FAILURE_SERVER_VALIDATION = 4; // 0x4
-    field public static final int OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION = 5; // 0x5
-    field public static final int OSU_FAILURE_SOAP_MESSAGE_EXCHANGE = 11; // 0xb
-    field public static final int OSU_FAILURE_START_REDIRECT_LISTENER = 12; // 0xc
-    field public static final int OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER = 13; // 0xd
-    field public static final int OSU_FAILURE_UNEXPECTED_COMMAND_TYPE = 9; // 0x9
-    field public static final int OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS = 15; // 0xf
-    field public static final int OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE = 10; // 0xa
-    field public static final int OSU_STATUS_AP_CONNECTED = 2; // 0x2
-    field public static final int OSU_STATUS_AP_CONNECTING = 1; // 0x1
-    field public static final int OSU_STATUS_INIT_SOAP_EXCHANGE = 6; // 0x6
-    field public static final int OSU_STATUS_REDIRECT_RESPONSE_RECEIVED = 8; // 0x8
-    field public static final int OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS = 11; // 0xb
-    field public static final int OSU_STATUS_SECOND_SOAP_EXCHANGE = 9; // 0x9
-    field public static final int OSU_STATUS_SERVER_CONNECTED = 5; // 0x5
-    field public static final int OSU_STATUS_SERVER_CONNECTING = 3; // 0x3
-    field public static final int OSU_STATUS_SERVER_VALIDATED = 4; // 0x4
-    field public static final int OSU_STATUS_THIRD_SOAP_EXCHANGE = 10; // 0xa
-    field public static final int OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE = 7; // 0x7
-  }
-
-}
-
-package android.net.wifi.nl80211 {
-
-  public final class DeviceWiphyCapabilities implements android.os.Parcelable {
-    ctor public DeviceWiphyCapabilities();
-    method public int describeContents();
-    method public int getMaxNumberRxSpatialStreams();
-    method public int getMaxNumberTxSpatialStreams();
-    method public boolean isChannelWidthSupported(int);
-    method public boolean isWifiStandardSupported(int);
-    method public void setWifiStandardSupport(int, boolean);
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.nl80211.DeviceWiphyCapabilities> CREATOR;
-  }
-
-  public final class NativeScanResult implements android.os.Parcelable {
-    ctor public NativeScanResult();
-    method public int describeContents();
-    method @Nullable public android.net.MacAddress getBssid();
-    method public int getCapabilities();
-    method public int getFrequencyMhz();
-    method @NonNull public byte[] getInformationElements();
-    method @NonNull public java.util.List<android.net.wifi.nl80211.RadioChainInfo> getRadioChainInfos();
-    method public int getSignalMbm();
-    method @NonNull public byte[] getSsid();
-    method public long getTsf();
-    method public boolean isAssociated();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field public static final int BSS_CAPABILITY_APSD = 2048; // 0x800
-    field public static final int BSS_CAPABILITY_CF_POLLABLE = 4; // 0x4
-    field public static final int BSS_CAPABILITY_CF_POLL_REQUEST = 8; // 0x8
-    field public static final int BSS_CAPABILITY_CHANNEL_AGILITY = 128; // 0x80
-    field public static final int BSS_CAPABILITY_DELAYED_BLOCK_ACK = 16384; // 0x4000
-    field public static final int BSS_CAPABILITY_DMG_ESS = 3; // 0x3
-    field public static final int BSS_CAPABILITY_DMG_IBSS = 1; // 0x1
-    field public static final int BSS_CAPABILITY_DSSS_OFDM = 8192; // 0x2000
-    field public static final int BSS_CAPABILITY_ESS = 1; // 0x1
-    field public static final int BSS_CAPABILITY_IBSS = 2; // 0x2
-    field public static final int BSS_CAPABILITY_IMMEDIATE_BLOCK_ACK = 32768; // 0x8000
-    field public static final int BSS_CAPABILITY_PBCC = 64; // 0x40
-    field public static final int BSS_CAPABILITY_PRIVACY = 16; // 0x10
-    field public static final int BSS_CAPABILITY_QOS = 512; // 0x200
-    field public static final int BSS_CAPABILITY_RADIO_MANAGEMENT = 4096; // 0x1000
-    field public static final int BSS_CAPABILITY_SHORT_PREAMBLE = 32; // 0x20
-    field public static final int BSS_CAPABILITY_SHORT_SLOT_TIME = 1024; // 0x400
-    field public static final int BSS_CAPABILITY_SPECTRUM_MANAGEMENT = 256; // 0x100
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.nl80211.NativeScanResult> CREATOR;
-  }
-
-  public final class NativeWifiClient implements android.os.Parcelable {
-    ctor public NativeWifiClient(@Nullable android.net.MacAddress);
-    method public int describeContents();
-    method @Nullable public android.net.MacAddress getMacAddress();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.nl80211.NativeWifiClient> CREATOR;
-  }
-
-  public final class PnoNetwork implements android.os.Parcelable {
-    ctor public PnoNetwork();
-    method public int describeContents();
-    method @NonNull public int[] getFrequenciesMhz();
-    method @NonNull public byte[] getSsid();
-    method public boolean isHidden();
-    method public void setFrequenciesMhz(@NonNull int[]);
-    method public void setHidden(boolean);
-    method public void setSsid(@NonNull byte[]);
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.nl80211.PnoNetwork> CREATOR;
-  }
-
-  public final class PnoSettings implements android.os.Parcelable {
-    ctor public PnoSettings();
-    method public int describeContents();
-    method public long getIntervalMillis();
-    method public int getMin2gRssiDbm();
-    method public int getMin5gRssiDbm();
-    method public int getMin6gRssiDbm();
-    method @NonNull public java.util.List<android.net.wifi.nl80211.PnoNetwork> getPnoNetworks();
-    method public void setIntervalMillis(long);
-    method public void setMin2gRssiDbm(int);
-    method public void setMin5gRssiDbm(int);
-    method public void setMin6gRssiDbm(int);
-    method public void setPnoNetworks(@NonNull java.util.List<android.net.wifi.nl80211.PnoNetwork>);
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.nl80211.PnoSettings> CREATOR;
-  }
-
-  public final class RadioChainInfo implements android.os.Parcelable {
-    ctor public RadioChainInfo(int, int);
-    method public int describeContents();
-    method public int getChainId();
-    method public int getLevelDbm();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.nl80211.RadioChainInfo> CREATOR;
-  }
-
-  public class WifiNl80211Manager {
-    method public void abortScan(@NonNull String);
-    method public void enableVerboseLogging(boolean);
-    method @NonNull public int[] getChannelsMhzForBand(int);
-    method @Nullable public android.net.wifi.nl80211.DeviceWiphyCapabilities getDeviceWiphyCapabilities(@NonNull String);
-    method @NonNull public java.util.List<android.net.wifi.nl80211.NativeScanResult> getScanResults(@NonNull String, int);
-    method @Nullable public android.net.wifi.nl80211.WifiNl80211Manager.TxPacketCounters getTxPacketCounters(@NonNull String);
-    method @Nullable public static android.net.wifi.nl80211.WifiNl80211Manager.OemSecurityType parseOemSecurityTypeElement(int, int, @NonNull byte[]);
-    method @Deprecated public boolean registerApCallback(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.nl80211.WifiNl80211Manager.SoftApCallback);
-    method public void sendMgmtFrame(@NonNull String, @NonNull byte[], int, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.nl80211.WifiNl80211Manager.SendMgmtFrameCallback);
-    method public void setOnServiceDeadCallback(@NonNull Runnable);
-    method public boolean setupInterfaceForClientMode(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.nl80211.WifiNl80211Manager.ScanEventCallback, @NonNull android.net.wifi.nl80211.WifiNl80211Manager.ScanEventCallback);
-    method public boolean setupInterfaceForSoftApMode(@NonNull String);
-    method @Nullable public android.net.wifi.nl80211.WifiNl80211Manager.SignalPollResult signalPoll(@NonNull String);
-    method public boolean startPnoScan(@NonNull String, @NonNull android.net.wifi.nl80211.PnoSettings, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.nl80211.WifiNl80211Manager.PnoScanRequestCallback);
-    method public boolean startScan(@NonNull String, int, @Nullable java.util.Set<java.lang.Integer>, @Nullable java.util.List<byte[]>);
-    method public boolean stopPnoScan(@NonNull String);
-    method public boolean tearDownClientInterface(@NonNull String);
-    method public boolean tearDownInterfaces();
-    method public boolean tearDownSoftApInterface(@NonNull String);
-    field public static final int SCAN_TYPE_PNO_SCAN = 1; // 0x1
-    field public static final int SCAN_TYPE_SINGLE_SCAN = 0; // 0x0
-    field public static final int SEND_MGMT_FRAME_ERROR_ALREADY_STARTED = 5; // 0x5
-    field public static final int SEND_MGMT_FRAME_ERROR_MCS_UNSUPPORTED = 2; // 0x2
-    field public static final int SEND_MGMT_FRAME_ERROR_NO_ACK = 3; // 0x3
-    field public static final int SEND_MGMT_FRAME_ERROR_TIMEOUT = 4; // 0x4
-    field public static final int SEND_MGMT_FRAME_ERROR_UNKNOWN = 1; // 0x1
-  }
-
-  public static class WifiNl80211Manager.OemSecurityType {
-    ctor public WifiNl80211Manager.OemSecurityType(int, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>, int);
-    field public final int groupCipher;
-    field @NonNull public final java.util.List<java.lang.Integer> keyManagement;
-    field @NonNull public final java.util.List<java.lang.Integer> pairwiseCipher;
-    field public final int protocol;
-  }
-
-  public static interface WifiNl80211Manager.PnoScanRequestCallback {
-    method public void onPnoRequestFailed();
-    method public void onPnoRequestSucceeded();
-  }
-
-  public static interface WifiNl80211Manager.ScanEventCallback {
-    method public void onScanFailed();
-    method public void onScanResultReady();
-  }
-
-  public static interface WifiNl80211Manager.SendMgmtFrameCallback {
-    method public void onAck(int);
-    method public void onFailure(int);
-  }
-
-  public static class WifiNl80211Manager.SignalPollResult {
-    field public final int associationFrequencyMHz;
-    field public final int currentRssiDbm;
-    field public final int rxBitrateMbps;
-    field public final int txBitrateMbps;
-  }
-
-  @Deprecated public static interface WifiNl80211Manager.SoftApCallback {
-    method @Deprecated public void onConnectedClientsChanged(@NonNull android.net.wifi.nl80211.NativeWifiClient, boolean);
-    method @Deprecated public void onFailure();
-    method @Deprecated public void onSoftApChannelSwitched(int, int);
-  }
-
-  public static class WifiNl80211Manager.TxPacketCounters {
-    field public final int txPacketFailed;
-    field public final int txPacketSucceeded;
-  }
-
-}
-
-package android.net.wifi.p2p {
-
-  public final class WifiP2pGroupList implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public java.util.List<android.net.wifi.p2p.WifiP2pGroup> getGroupList();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pGroupList> CREATOR;
-  }
-
-  public class WifiP2pManager {
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.OVERRIDE_WIFI_CONFIG}) public void deletePersistentGroup(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, int, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void factoryReset(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.READ_WIFI_CREDENTIAL}) public void requestPersistentGroupInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pManager.PersistentGroupInfoListener);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.OVERRIDE_WIFI_CONFIG}) public void setDeviceName(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull String, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY) public void setMiracastMode(int);
-    method @RequiresPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY) public void setWfdInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pWfdInfo, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.OVERRIDE_WIFI_CONFIG}) public void setWifiP2pChannels(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, int, int, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void startListening(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void stopListening(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    field public static final String ACTION_WIFI_P2P_PERSISTENT_GROUPS_CHANGED = "android.net.wifi.p2p.action.WIFI_P2P_PERSISTENT_GROUPS_CHANGED";
-    field public static final int MIRACAST_DISABLED = 0; // 0x0
-    field public static final int MIRACAST_SINK = 2; // 0x2
-    field public static final int MIRACAST_SOURCE = 1; // 0x1
-  }
-
-  public static interface WifiP2pManager.PersistentGroupInfoListener {
-    method public void onPersistentGroupInfoAvailable(@NonNull android.net.wifi.p2p.WifiP2pGroupList);
-  }
-
-}
-
-package android.net.wifi.rtt {
-
-  public static final class RangingRequest.Builder {
-    method public android.net.wifi.rtt.RangingRequest.Builder addResponder(@NonNull android.net.wifi.rtt.ResponderConfig);
-  }
-
-  public final class RangingResult implements android.os.Parcelable {
-    method @NonNull public byte[] getLci();
-    method @NonNull public byte[] getLcr();
-  }
-
-  public final class ResponderConfig implements android.os.Parcelable {
-    ctor public ResponderConfig(@NonNull android.net.MacAddress, int, boolean, int, int, int, int, int);
-    ctor public ResponderConfig(@NonNull android.net.wifi.aware.PeerHandle, int, boolean, int, int, int, int, int);
-    method public int describeContents();
-    method public static android.net.wifi.rtt.ResponderConfig fromScanResult(android.net.wifi.ScanResult);
-    method public static android.net.wifi.rtt.ResponderConfig fromWifiAwarePeerHandleWithDefaults(android.net.wifi.aware.PeerHandle);
-    method public static android.net.wifi.rtt.ResponderConfig fromWifiAwarePeerMacAddressWithDefaults(android.net.MacAddress);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int CHANNEL_WIDTH_160MHZ = 3; // 0x3
-    field public static final int CHANNEL_WIDTH_20MHZ = 0; // 0x0
-    field public static final int CHANNEL_WIDTH_40MHZ = 1; // 0x1
-    field public static final int CHANNEL_WIDTH_80MHZ = 2; // 0x2
-    field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4; // 0x4
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.rtt.ResponderConfig> CREATOR;
-    field public static final int PREAMBLE_HE = 3; // 0x3
-    field public static final int PREAMBLE_HT = 1; // 0x1
-    field public static final int PREAMBLE_LEGACY = 0; // 0x0
-    field public static final int PREAMBLE_VHT = 2; // 0x2
-    field public static final int RESPONDER_AP = 0; // 0x0
-    field public static final int RESPONDER_AWARE = 4; // 0x4
-    field public static final int RESPONDER_P2P_CLIENT = 3; // 0x3
-    field public static final int RESPONDER_P2P_GO = 2; // 0x2
-    field public static final int RESPONDER_STA = 1; // 0x1
-    field public final int centerFreq0;
-    field public final int centerFreq1;
-    field public final int channelWidth;
-    field public final int frequency;
-    field public final android.net.MacAddress macAddress;
-    field public final android.net.wifi.aware.PeerHandle peerHandle;
-    field public final int preamble;
-    field public final int responderType;
-    field public final boolean supports80211mc;
-  }
-
-  public final class ResponderLocation implements android.os.Parcelable {
-    method public boolean getExtraInfoOnAssociationIndication();
-  }
-
-  public class WifiRttManager {
-    method @RequiresPermission(allOf={android.Manifest.permission.LOCATION_HARDWARE}) public void cancelRanging(@Nullable android.os.WorkSource);
-    method @RequiresPermission(allOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.CHANGE_WIFI_STATE, android.Manifest.permission.ACCESS_WIFI_STATE}) public void startRanging(@Nullable android.os.WorkSource, @NonNull android.net.wifi.rtt.RangingRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.rtt.RangingResultCallback);
-  }
-
-}
-
-package android.nfc {
-
-  public final class NfcAdapter {
-    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean addNfcUnlockHandler(android.nfc.NfcAdapter.NfcUnlockHandler, String[]);
-    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean disable();
-    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean disable(boolean);
-    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean disableNdefPush();
-    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enable();
-    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enableNdefPush();
-    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enableSecureNfc(boolean);
-    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean removeNfcUnlockHandler(android.nfc.NfcAdapter.NfcUnlockHandler);
-    method public void setNdefPushMessage(android.nfc.NdefMessage, android.app.Activity, int);
-    field public static final int FLAG_NDEF_PUSH_NO_CONFIRM = 1; // 0x1
-  }
-
-  public static interface NfcAdapter.NfcUnlockHandler {
-    method public boolean onUnlockAttempted(android.nfc.Tag);
-  }
-
-}
-
-package android.os {
-
-  public class BatteryManager {
-    method @RequiresPermission(android.Manifest.permission.POWER_SAVER) public boolean setChargingStateUpdateDelayMillis(int);
-    field public static final String EXTRA_EVENTS = "android.os.extra.EVENTS";
-    field public static final String EXTRA_EVENT_TIMESTAMP = "android.os.extra.EVENT_TIMESTAMP";
-  }
-
-  public final class BatterySaverPolicyConfig implements android.os.Parcelable {
-    method public int describeContents();
-    method public float getAdjustBrightnessFactor();
-    method public boolean getAdvertiseIsEnabled();
-    method public boolean getDeferFullBackup();
-    method public boolean getDeferKeyValueBackup();
-    method @NonNull public java.util.Map<java.lang.String,java.lang.String> getDeviceSpecificSettings();
-    method public boolean getDisableAnimation();
-    method public boolean getDisableAod();
-    method public boolean getDisableLaunchBoost();
-    method public boolean getDisableOptionalSensors();
-    method public boolean getDisableSoundTrigger();
-    method public boolean getDisableVibration();
-    method public boolean getEnableAdjustBrightness();
-    method public boolean getEnableDataSaver();
-    method public boolean getEnableFirewall();
-    method public boolean getEnableNightMode();
-    method public boolean getEnableQuickDoze();
-    method public boolean getForceAllAppsStandby();
-    method public boolean getForceBackgroundCheck();
-    method public int getLocationMode();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.os.BatterySaverPolicyConfig> CREATOR;
-  }
-
-  public static final class BatterySaverPolicyConfig.Builder {
-    ctor public BatterySaverPolicyConfig.Builder();
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder addDeviceSpecificSetting(@NonNull String, @NonNull String);
-    method @NonNull public android.os.BatterySaverPolicyConfig build();
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setAdjustBrightnessFactor(float);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setAdvertiseIsEnabled(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDeferFullBackup(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDeferKeyValueBackup(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableAnimation(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableAod(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableLaunchBoost(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableOptionalSensors(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableSoundTrigger(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableVibration(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setEnableAdjustBrightness(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setEnableDataSaver(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setEnableFirewall(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setEnableNightMode(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setEnableQuickDoze(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setForceAllAppsStandby(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setForceBackgroundCheck(boolean);
-    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setLocationMode(int);
-  }
-
-  public final class BatteryStatsManager {
-    method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public android.os.connectivity.CellularBatteryStats getCellularBatteryStats();
-    method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public android.os.connectivity.WifiBatteryStats getWifiBatteryStats();
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportFullWifiLockAcquiredFromSource(@NonNull android.os.WorkSource);
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportFullWifiLockReleasedFromSource(@NonNull android.os.WorkSource);
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiBatchedScanStartedFromSource(@NonNull android.os.WorkSource, @IntRange(from=0) int);
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiBatchedScanStoppedFromSource(@NonNull android.os.WorkSource);
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiMulticastDisabled(@NonNull android.os.WorkSource);
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiMulticastEnabled(@NonNull android.os.WorkSource);
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiOff();
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiOn();
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiRssiChanged(@IntRange(from=0xffffff81, to=0) int);
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiScanStartedFromSource(@NonNull android.os.WorkSource);
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiScanStoppedFromSource(@NonNull android.os.WorkSource);
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiState(int, @Nullable String);
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiSupplicantStateChanged(int, boolean);
-    field public static final int WIFI_STATE_OFF = 0; // 0x0
-    field public static final int WIFI_STATE_OFF_SCANNING = 1; // 0x1
-    field public static final int WIFI_STATE_ON_CONNECTED_P2P = 5; // 0x5
-    field public static final int WIFI_STATE_ON_CONNECTED_STA = 4; // 0x4
-    field public static final int WIFI_STATE_ON_CONNECTED_STA_P2P = 6; // 0x6
-    field public static final int WIFI_STATE_ON_DISCONNECTED = 3; // 0x3
-    field public static final int WIFI_STATE_ON_NO_NETWORKS = 2; // 0x2
-    field public static final int WIFI_STATE_SOFT_AP = 7; // 0x7
-    field public static final int WIFI_SUPPL_STATE_ASSOCIATED = 7; // 0x7
-    field public static final int WIFI_SUPPL_STATE_ASSOCIATING = 6; // 0x6
-    field public static final int WIFI_SUPPL_STATE_AUTHENTICATING = 5; // 0x5
-    field public static final int WIFI_SUPPL_STATE_COMPLETED = 10; // 0xa
-    field public static final int WIFI_SUPPL_STATE_DISCONNECTED = 1; // 0x1
-    field public static final int WIFI_SUPPL_STATE_DORMANT = 11; // 0xb
-    field public static final int WIFI_SUPPL_STATE_FOUR_WAY_HANDSHAKE = 8; // 0x8
-    field public static final int WIFI_SUPPL_STATE_GROUP_HANDSHAKE = 9; // 0x9
-    field public static final int WIFI_SUPPL_STATE_INACTIVE = 3; // 0x3
-    field public static final int WIFI_SUPPL_STATE_INTERFACE_DISABLED = 2; // 0x2
-    field public static final int WIFI_SUPPL_STATE_INVALID = 0; // 0x0
-    field public static final int WIFI_SUPPL_STATE_SCANNING = 4; // 0x4
-    field public static final int WIFI_SUPPL_STATE_UNINITIALIZED = 12; // 0xc
-  }
-
-  public class Binder implements android.os.IBinder {
-    method public int handleShellCommand(@NonNull android.os.ParcelFileDescriptor, @NonNull android.os.ParcelFileDescriptor, @NonNull android.os.ParcelFileDescriptor, @NonNull String[]);
-    method public static void setProxyTransactListener(@Nullable android.os.Binder.ProxyTransactListener);
-  }
-
-  public static interface Binder.ProxyTransactListener {
-    method public void onTransactEnded(@Nullable Object);
-    method @Nullable public Object onTransactStarted(@NonNull android.os.IBinder, int);
-  }
-
-  public final class BugreportManager {
-    method @RequiresPermission(android.Manifest.permission.DUMP) public void cancelBugreport();
-    method @RequiresPermission(android.Manifest.permission.DUMP) public void requestBugreport(@NonNull android.os.BugreportParams, @Nullable CharSequence, @Nullable CharSequence);
-    method @RequiresPermission(android.Manifest.permission.DUMP) public void startBugreport(@NonNull android.os.ParcelFileDescriptor, @Nullable android.os.ParcelFileDescriptor, @NonNull android.os.BugreportParams, @NonNull java.util.concurrent.Executor, @NonNull android.os.BugreportManager.BugreportCallback);
-  }
-
-  public abstract static class BugreportManager.BugreportCallback {
-    ctor public BugreportManager.BugreportCallback();
-    method public void onError(int);
-    method public void onFinished();
-    method public void onProgress(@FloatRange(from=0.0f, to=100.0f) float);
-    field public static final int BUGREPORT_ERROR_ANOTHER_REPORT_IN_PROGRESS = 5; // 0x5
-    field public static final int BUGREPORT_ERROR_INVALID_INPUT = 1; // 0x1
-    field public static final int BUGREPORT_ERROR_RUNTIME = 2; // 0x2
-    field public static final int BUGREPORT_ERROR_USER_CONSENT_TIMED_OUT = 4; // 0x4
-    field public static final int BUGREPORT_ERROR_USER_DENIED_CONSENT = 3; // 0x3
-  }
-
-  public final class BugreportParams {
-    ctor public BugreportParams(int);
-    method public int getMode();
-    field public static final int BUGREPORT_MODE_FULL = 0; // 0x0
-    field public static final int BUGREPORT_MODE_INTERACTIVE = 1; // 0x1
-    field public static final int BUGREPORT_MODE_REMOTE = 2; // 0x2
-    field public static final int BUGREPORT_MODE_TELEPHONY = 4; // 0x4
-    field public static final int BUGREPORT_MODE_WEAR = 3; // 0x3
-    field public static final int BUGREPORT_MODE_WIFI = 5; // 0x5
-  }
-
-  public static class Build.VERSION {
-    field @NonNull public static final String PREVIEW_SDK_FINGERPRINT;
-  }
-
-  public final class ConfigUpdate {
-    field public static final String ACTION_UPDATE_CARRIER_ID_DB = "android.os.action.UPDATE_CARRIER_ID_DB";
-    field public static final String ACTION_UPDATE_CARRIER_PROVISIONING_URLS = "android.intent.action.UPDATE_CARRIER_PROVISIONING_URLS";
-    field public static final String ACTION_UPDATE_CONVERSATION_ACTIONS = "android.intent.action.UPDATE_CONVERSATION_ACTIONS";
-    field public static final String ACTION_UPDATE_CT_LOGS = "android.intent.action.UPDATE_CT_LOGS";
-    field public static final String ACTION_UPDATE_EMERGENCY_NUMBER_DB = "android.os.action.UPDATE_EMERGENCY_NUMBER_DB";
-    field public static final String ACTION_UPDATE_INTENT_FIREWALL = "android.intent.action.UPDATE_INTENT_FIREWALL";
-    field public static final String ACTION_UPDATE_LANG_ID = "android.intent.action.UPDATE_LANG_ID";
-    field public static final String ACTION_UPDATE_NETWORK_WATCHLIST = "android.intent.action.UPDATE_NETWORK_WATCHLIST";
-    field public static final String ACTION_UPDATE_PINS = "android.intent.action.UPDATE_PINS";
-    field public static final String ACTION_UPDATE_SMART_SELECTION = "android.intent.action.UPDATE_SMART_SELECTION";
-    field public static final String ACTION_UPDATE_SMS_SHORT_CODES = "android.intent.action.UPDATE_SMS_SHORT_CODES";
-    field public static final String EXTRA_REQUIRED_HASH = "android.os.extra.REQUIRED_HASH";
-    field public static final String EXTRA_VERSION = "android.os.extra.VERSION";
-  }
-
-  public class DeviceIdleManager {
-    method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void endIdle(@NonNull String);
-  }
-
-  public class Environment {
-    method @NonNull public static java.util.Collection<java.io.File> getInternalMediaDirectories();
-    method @NonNull public static java.io.File getOdmDirectory();
-    method @NonNull public static java.io.File getOemDirectory();
-    method @NonNull public static java.io.File getProductDirectory();
-    method @Deprecated @NonNull public static java.io.File getProductServicesDirectory();
-    method @NonNull public static java.io.File getSystemExtDirectory();
-    method @NonNull public static java.io.File getVendorDirectory();
-  }
-
-  public class HidlMemory implements java.io.Closeable {
-    ctor public HidlMemory(@NonNull String, @IntRange(from=0) long, @Nullable android.os.NativeHandle);
-    method public void close() throws java.io.IOException;
-    method @NonNull public android.os.HidlMemory dup() throws java.io.IOException;
-    method protected void finalize();
-    method @Nullable public android.os.NativeHandle getHandle();
-    method @NonNull public String getName();
-    method public long getSize();
-    method @Nullable public android.os.NativeHandle releaseHandle();
-  }
-
-  public class HidlSupport {
-    method public static boolean deepEquals(Object, Object);
-    method public static int deepHashCode(Object);
-    method public static int getPidIfSharable();
-    method public static boolean interfacesEqual(android.os.IHwInterface, Object);
-  }
-
-  public abstract class HwBinder implements android.os.IHwBinder {
-    ctor public HwBinder();
-    method public static final void configureRpcThreadpool(long, boolean);
-    method public static void enableInstrumentation();
-    method public static final android.os.IHwBinder getService(String, String) throws java.util.NoSuchElementException, android.os.RemoteException;
-    method public static final android.os.IHwBinder getService(String, String, boolean) throws java.util.NoSuchElementException, android.os.RemoteException;
-    method public static final void joinRpcThreadpool();
-    method public abstract void onTransact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException;
-    method public final void registerService(String) throws android.os.RemoteException;
-    method public final void transact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException;
-  }
-
-  public class HwBlob {
-    ctor public HwBlob(int);
-    method public final void copyToBoolArray(long, boolean[], int);
-    method public final void copyToDoubleArray(long, double[], int);
-    method public final void copyToFloatArray(long, float[], int);
-    method public final void copyToInt16Array(long, short[], int);
-    method public final void copyToInt32Array(long, int[], int);
-    method public final void copyToInt64Array(long, long[], int);
-    method public final void copyToInt8Array(long, byte[], int);
-    method public final boolean getBool(long);
-    method public final double getDouble(long);
-    method public final long getFieldHandle(long);
-    method public final float getFloat(long);
-    method public final short getInt16(long);
-    method public final int getInt32(long);
-    method public final long getInt64(long);
-    method public final byte getInt8(long);
-    method public final String getString(long);
-    method public final long handle();
-    method public final void putBlob(long, android.os.HwBlob);
-    method public final void putBool(long, boolean);
-    method public final void putBoolArray(long, boolean[]);
-    method public final void putDouble(long, double);
-    method public final void putDoubleArray(long, double[]);
-    method public final void putFloat(long, float);
-    method public final void putFloatArray(long, float[]);
-    method public final void putHidlMemory(long, @NonNull android.os.HidlMemory);
-    method public final void putInt16(long, short);
-    method public final void putInt16Array(long, short[]);
-    method public final void putInt32(long, int);
-    method public final void putInt32Array(long, int[]);
-    method public final void putInt64(long, long);
-    method public final void putInt64Array(long, long[]);
-    method public final void putInt8(long, byte);
-    method public final void putInt8Array(long, byte[]);
-    method public final void putNativeHandle(long, @Nullable android.os.NativeHandle);
-    method public final void putString(long, String);
-    method public static Boolean[] wrapArray(@NonNull boolean[]);
-    method public static Long[] wrapArray(@NonNull long[]);
-    method public static Byte[] wrapArray(@NonNull byte[]);
-    method public static Short[] wrapArray(@NonNull short[]);
-    method public static Integer[] wrapArray(@NonNull int[]);
-    method public static Float[] wrapArray(@NonNull float[]);
-    method public static Double[] wrapArray(@NonNull double[]);
-  }
-
-  public class HwParcel {
-    ctor public HwParcel();
-    method public final void enforceInterface(String);
-    method public final boolean readBool();
-    method public final java.util.ArrayList<java.lang.Boolean> readBoolVector();
-    method public final android.os.HwBlob readBuffer(long);
-    method public final double readDouble();
-    method public final java.util.ArrayList<java.lang.Double> readDoubleVector();
-    method public final android.os.HwBlob readEmbeddedBuffer(long, long, long, boolean);
-    method @NonNull @Nullable public final android.os.HidlMemory readEmbeddedHidlMemory(long, long, long);
-    method @Nullable public final android.os.NativeHandle readEmbeddedNativeHandle(long, long);
-    method public final float readFloat();
-    method public final java.util.ArrayList<java.lang.Float> readFloatVector();
-    method @NonNull public final android.os.HidlMemory readHidlMemory();
-    method public final short readInt16();
-    method public final java.util.ArrayList<java.lang.Short> readInt16Vector();
-    method public final int readInt32();
-    method public final java.util.ArrayList<java.lang.Integer> readInt32Vector();
-    method public final long readInt64();
-    method public final java.util.ArrayList<java.lang.Long> readInt64Vector();
-    method public final byte readInt8();
-    method public final java.util.ArrayList<java.lang.Byte> readInt8Vector();
-    method @Nullable public final android.os.NativeHandle readNativeHandle();
-    method @NonNull public final java.util.ArrayList<android.os.NativeHandle> readNativeHandleVector();
-    method public final String readString();
-    method public final java.util.ArrayList<java.lang.String> readStringVector();
-    method public final android.os.IHwBinder readStrongBinder();
-    method public final void release();
-    method public final void releaseTemporaryStorage();
-    method public final void send();
-    method public final void verifySuccess();
-    method public final void writeBool(boolean);
-    method public final void writeBoolVector(java.util.ArrayList<java.lang.Boolean>);
-    method public final void writeBuffer(android.os.HwBlob);
-    method public final void writeDouble(double);
-    method public final void writeDoubleVector(java.util.ArrayList<java.lang.Double>);
-    method public final void writeFloat(float);
-    method public final void writeFloatVector(java.util.ArrayList<java.lang.Float>);
-    method public final void writeHidlMemory(@NonNull android.os.HidlMemory);
-    method public final void writeInt16(short);
-    method public final void writeInt16Vector(java.util.ArrayList<java.lang.Short>);
-    method public final void writeInt32(int);
-    method public final void writeInt32Vector(java.util.ArrayList<java.lang.Integer>);
-    method public final void writeInt64(long);
-    method public final void writeInt64Vector(java.util.ArrayList<java.lang.Long>);
-    method public final void writeInt8(byte);
-    method public final void writeInt8Vector(java.util.ArrayList<java.lang.Byte>);
-    method public final void writeInterfaceToken(String);
-    method public final void writeNativeHandle(@Nullable android.os.NativeHandle);
-    method public final void writeNativeHandleVector(@NonNull java.util.ArrayList<android.os.NativeHandle>);
-    method public final void writeStatus(int);
-    method public final void writeString(String);
-    method public final void writeStringVector(java.util.ArrayList<java.lang.String>);
-    method public final void writeStrongBinder(android.os.IHwBinder);
-    field public static final int STATUS_SUCCESS = 0; // 0x0
-  }
-
-  public interface IHwBinder {
-    method public boolean linkToDeath(android.os.IHwBinder.DeathRecipient, long);
-    method public android.os.IHwInterface queryLocalInterface(String);
-    method public void transact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException;
-    method public boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient);
-  }
-
-  public static interface IHwBinder.DeathRecipient {
-    method public void serviceDied(long);
-  }
-
-  public interface IHwInterface {
-    method public android.os.IHwBinder asBinder();
-  }
-
-  public class IncidentManager {
-    method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void approveReport(android.net.Uri);
-    method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void cancelAuthorization(android.os.IncidentManager.AuthListener);
-    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void deleteIncidentReports(android.net.Uri);
-    method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void denyReport(android.net.Uri);
-    method @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public android.os.IncidentManager.IncidentReport getIncidentReport(android.net.Uri);
-    method @NonNull @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public java.util.List<android.net.Uri> getIncidentReportList(String);
-    method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public java.util.List<android.os.IncidentManager.PendingReport> getPendingReports();
-    method public void registerSection(int, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.os.IncidentManager.DumpCallback);
-    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void reportIncident(android.os.IncidentReportArgs);
-    method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener);
-    method public void unregisterSection(int);
-    field public static final int FLAG_CONFIRMATION_DIALOG = 1; // 0x1
-    field public static final int PRIVACY_POLICY_AUTO = 200; // 0xc8
-    field public static final int PRIVACY_POLICY_EXPLICIT = 100; // 0x64
-    field public static final int PRIVACY_POLICY_LOCAL = 0; // 0x0
-  }
-
-  public static class IncidentManager.AuthListener {
-    ctor public IncidentManager.AuthListener();
-    method public void onReportApproved();
-    method public void onReportDenied();
-  }
-
-  public static class IncidentManager.DumpCallback {
-    ctor public IncidentManager.DumpCallback();
-    method public void onDumpSection(int, @NonNull java.io.OutputStream);
-  }
-
-  public static class IncidentManager.IncidentReport implements java.io.Closeable android.os.Parcelable {
-    ctor public IncidentManager.IncidentReport(android.os.Parcel);
-    method public void close();
-    method public int describeContents();
-    method public java.io.InputStream getInputStream() throws java.io.IOException;
-    method public long getPrivacyPolicy();
-    method public long getTimestamp();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.os.IncidentManager.IncidentReport> CREATOR;
-  }
-
-  public static class IncidentManager.PendingReport {
-    ctor public IncidentManager.PendingReport(@NonNull android.net.Uri);
-    method public int getFlags();
-    method @NonNull public String getRequestingPackage();
-    method public long getTimestamp();
-    method @NonNull public android.net.Uri getUri();
-  }
-
-  public final class IncidentReportArgs implements android.os.Parcelable {
-    ctor public IncidentReportArgs();
-    ctor public IncidentReportArgs(android.os.Parcel);
-    method public void addHeader(byte[]);
-    method public void addSection(int);
-    method public boolean containsSection(int);
-    method public int describeContents();
-    method public boolean isAll();
-    method public void readFromParcel(android.os.Parcel);
-    method public int sectionCount();
-    method public void setAll(boolean);
-    method public void setPrivacyPolicy(int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.os.IncidentReportArgs> CREATOR;
-  }
-
-  public final class NativeHandle implements java.io.Closeable {
-    ctor public NativeHandle();
-    ctor public NativeHandle(@NonNull java.io.FileDescriptor, boolean);
-    ctor public NativeHandle(@NonNull java.io.FileDescriptor[], @NonNull int[], boolean);
-    method public void close() throws java.io.IOException;
-    method @NonNull public android.os.NativeHandle dup() throws java.io.IOException;
-    method @NonNull public java.io.FileDescriptor getFileDescriptor();
-    method @NonNull public java.io.FileDescriptor[] getFileDescriptors();
-    method @NonNull public int[] getInts();
-    method public boolean hasSingleFileDescriptor();
-  }
-
-  public interface Parcelable {
-    field public static final int PARCELABLE_STABILITY_LOCAL = 0; // 0x0
-    field public static final int PARCELABLE_STABILITY_VINTF = 1; // 0x1
-  }
-
-  public final class ParcelableHolder implements android.os.Parcelable {
-    ctor public ParcelableHolder(int);
-    method public int describeContents();
-    method @Nullable public <T extends android.os.Parcelable> T getParcelable(@NonNull Class<T>);
-    method public int getStability();
-    method public void readFromParcel(@NonNull android.os.Parcel);
-    method public boolean setParcelable(@Nullable android.os.Parcelable);
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.os.ParcelableHolder> CREATOR;
-  }
-
-  public final class PowerManager {
-    method @RequiresPermission(allOf={android.Manifest.permission.READ_DREAM_STATE, android.Manifest.permission.WRITE_DREAM_STATE}) public void dream(long);
-    method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public boolean forceSuspend();
-    method @RequiresPermission(android.Manifest.permission.POWER_SAVER) public int getPowerSaveModeTrigger();
-    method @RequiresPermission(android.Manifest.permission.READ_DREAM_STATE) public boolean isAmbientDisplayAvailable();
-    method @RequiresPermission(android.Manifest.permission.READ_DREAM_STATE) public boolean isAmbientDisplaySuppressed();
-    method @RequiresPermission(android.Manifest.permission.READ_DREAM_STATE) public boolean isAmbientDisplaySuppressedForToken(@NonNull String);
-    method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER}) public boolean setAdaptivePowerSaveEnabled(boolean);
-    method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER}) public boolean setAdaptivePowerSavePolicy(@NonNull android.os.BatterySaverPolicyConfig);
-    method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void setBatteryDischargePrediction(@NonNull java.time.Duration, boolean);
-    method @RequiresPermission(android.Manifest.permission.POWER_SAVER) public boolean setDynamicPowerSaveHint(boolean, int);
-    method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER}) public boolean setPowerSaveModeEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.WRITE_DREAM_STATE) public void suppressAmbientDisplay(@NonNull String, boolean);
-    method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.USER_ACTIVITY}) public void userActivity(long, int, int);
-    field public static final int POWER_SAVE_MODE_TRIGGER_DYNAMIC = 1; // 0x1
-    field public static final int POWER_SAVE_MODE_TRIGGER_PERCENTAGE = 0; // 0x0
-    field public static final String REBOOT_USERSPACE = "userspace";
-    field public static final int USER_ACTIVITY_EVENT_ACCESSIBILITY = 3; // 0x3
-    field public static final int USER_ACTIVITY_EVENT_BUTTON = 1; // 0x1
-    field public static final int USER_ACTIVITY_EVENT_OTHER = 0; // 0x0
-    field public static final int USER_ACTIVITY_EVENT_TOUCH = 2; // 0x2
-    field public static final int USER_ACTIVITY_FLAG_INDIRECT = 2; // 0x2
-    field public static final int USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS = 1; // 0x1
-  }
-
-  public class PowerWhitelistManager {
-    method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void addToWhitelist(@NonNull String);
-    method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void addToWhitelist(@NonNull java.util.List<java.lang.String>);
-    method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void removeFromWhitelist(@NonNull String);
-    method @RequiresPermission(android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST) public void whitelistAppTemporarily(@NonNull String, long);
-    method @RequiresPermission(android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST) public long whitelistAppTemporarilyForEvent(@NonNull String, int, @NonNull String);
-    field public static final int EVENT_MMS = 2; // 0x2
-    field public static final int EVENT_SMS = 1; // 0x1
-    field public static final int EVENT_UNSPECIFIED = 0; // 0x0
-  }
-
-  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(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(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(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;
-  }
-
-  public final class RemoteCallback implements android.os.Parcelable {
-    ctor public RemoteCallback(android.os.RemoteCallback.OnResultListener);
-    ctor public RemoteCallback(@NonNull android.os.RemoteCallback.OnResultListener, @Nullable android.os.Handler);
-    method public int describeContents();
-    method public void sendResult(@Nullable android.os.Bundle);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.os.RemoteCallback> CREATOR;
-  }
-
-  public static interface RemoteCallback.OnResultListener {
-    method public void onResult(@Nullable android.os.Bundle);
-  }
-
-  public class ServiceSpecificException extends java.lang.RuntimeException {
-    ctor public ServiceSpecificException(int, @Nullable String);
-    ctor public ServiceSpecificException(int);
-    field public final int errorCode;
-  }
-
-  public final class StatsDimensionsValue implements android.os.Parcelable {
-    method public int describeContents();
-    method public boolean getBooleanValue();
-    method public int getField();
-    method public float getFloatValue();
-    method public int getIntValue();
-    method public long getLongValue();
-    method public String getStringValue();
-    method public java.util.List<android.os.StatsDimensionsValue> getTupleValueList();
-    method public int getValueType();
-    method public boolean isValueType(int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int BOOLEAN_VALUE_TYPE = 5; // 0x5
-    field @NonNull public static final android.os.Parcelable.Creator<android.os.StatsDimensionsValue> CREATOR;
-    field public static final int FLOAT_VALUE_TYPE = 6; // 0x6
-    field public static final int INT_VALUE_TYPE = 3; // 0x3
-    field public static final int LONG_VALUE_TYPE = 4; // 0x4
-    field public static final int STRING_VALUE_TYPE = 2; // 0x2
-    field public static final int TUPLE_VALUE_TYPE = 7; // 0x7
-  }
-
-  public class SystemConfigManager {
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_CARRIER_APP_INFO) public java.util.Set<java.lang.String> getDisabledUntilUsedPreinstalledCarrierApps();
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_CARRIER_APP_INFO) public java.util.Map<java.lang.String,java.util.List<java.lang.String>> getDisabledUntilUsedPreinstalledCarrierAssociatedApps();
-  }
-
-  public class SystemProperties {
-    method @NonNull public static String get(@NonNull String);
-    method @NonNull public static String get(@NonNull String, @Nullable String);
-    method public static boolean getBoolean(@NonNull String, boolean);
-    method public static int getInt(@NonNull String, int);
-    method public static long getLong(@NonNull String, long);
-  }
-
-  public class SystemUpdateManager {
-    method @RequiresPermission(anyOf={android.Manifest.permission.READ_SYSTEM_UPDATE_INFO, android.Manifest.permission.RECOVERY}) public android.os.Bundle retrieveSystemUpdateInfo();
-    method @RequiresPermission(android.Manifest.permission.RECOVERY) public void updateSystemUpdateInfo(android.os.PersistableBundle);
-    field public static final String KEY_IS_SECURITY_UPDATE = "is_security_update";
-    field public static final String KEY_STATUS = "status";
-    field public static final String KEY_TARGET_BUILD_FINGERPRINT = "target_build_fingerprint";
-    field public static final String KEY_TARGET_SECURITY_PATCH_LEVEL = "target_security_patch_level";
-    field public static final String KEY_TITLE = "title";
-    field public static final int STATUS_IDLE = 1; // 0x1
-    field public static final int STATUS_IN_PROGRESS = 3; // 0x3
-    field public static final int STATUS_UNKNOWN = 0; // 0x0
-    field public static final int STATUS_WAITING_DOWNLOAD = 2; // 0x2
-    field public static final int STATUS_WAITING_INSTALL = 4; // 0x4
-    field public static final int STATUS_WAITING_REBOOT = 5; // 0x5
-  }
-
-  public class UpdateEngine {
-    ctor public UpdateEngine();
-    method @NonNull @WorkerThread public android.os.UpdateEngine.AllocateSpaceResult allocateSpace(@NonNull String, @NonNull String[]);
-    method public void applyPayload(String, long, long, String[]);
-    method public void applyPayload(@NonNull android.content.res.AssetFileDescriptor, @NonNull String[]);
-    method public boolean bind(android.os.UpdateEngineCallback, android.os.Handler);
-    method public boolean bind(android.os.UpdateEngineCallback);
-    method public void cancel();
-    method @WorkerThread public int cleanupAppliedPayload();
-    method public void resetStatus();
-    method public void resume();
-    method public void suspend();
-    method public boolean unbind();
-    method public boolean verifyPayloadMetadata(String);
-  }
-
-  public static final class UpdateEngine.AllocateSpaceResult {
-    method public int getErrorCode();
-    method public long getFreeSpaceRequired();
-  }
-
-  public static final class UpdateEngine.ErrorCodeConstants {
-    ctor public UpdateEngine.ErrorCodeConstants();
-    field public static final int DEVICE_CORRUPTED = 61; // 0x3d
-    field public static final int DOWNLOAD_PAYLOAD_VERIFICATION_ERROR = 12; // 0xc
-    field public static final int DOWNLOAD_TRANSFER_ERROR = 9; // 0x9
-    field public static final int ERROR = 1; // 0x1
-    field public static final int FILESYSTEM_COPIER_ERROR = 4; // 0x4
-    field public static final int INSTALL_DEVICE_OPEN_ERROR = 7; // 0x7
-    field public static final int KERNEL_DEVICE_OPEN_ERROR = 8; // 0x8
-    field public static final int NOT_ENOUGH_SPACE = 60; // 0x3c
-    field public static final int PAYLOAD_HASH_MISMATCH_ERROR = 10; // 0xa
-    field public static final int PAYLOAD_MISMATCHED_TYPE_ERROR = 6; // 0x6
-    field public static final int PAYLOAD_SIZE_MISMATCH_ERROR = 11; // 0xb
-    field public static final int PAYLOAD_TIMESTAMP_ERROR = 51; // 0x33
-    field public static final int POST_INSTALL_RUNNER_ERROR = 5; // 0x5
-    field public static final int SUCCESS = 0; // 0x0
-    field public static final int UPDATED_BUT_NOT_ACTIVE = 52; // 0x34
-  }
-
-  public static final class UpdateEngine.UpdateStatusConstants {
-    ctor public UpdateEngine.UpdateStatusConstants();
-    field public static final int ATTEMPTING_ROLLBACK = 8; // 0x8
-    field public static final int CHECKING_FOR_UPDATE = 1; // 0x1
-    field public static final int DISABLED = 9; // 0x9
-    field public static final int DOWNLOADING = 3; // 0x3
-    field public static final int FINALIZING = 5; // 0x5
-    field public static final int IDLE = 0; // 0x0
-    field public static final int REPORTING_ERROR_EVENT = 7; // 0x7
-    field public static final int UPDATED_NEED_REBOOT = 6; // 0x6
-    field public static final int UPDATE_AVAILABLE = 2; // 0x2
-    field public static final int VERIFYING = 4; // 0x4
-  }
-
-  public abstract class UpdateEngineCallback {
-    ctor public UpdateEngineCallback();
-    method public abstract void onPayloadApplicationComplete(int);
-    method public abstract void onStatusUpdate(int, float);
-  }
-
-  public final class UserHandle implements android.os.Parcelable {
-    method @NonNull public static String formatUid(int);
-    method public static int getAppId(int);
-    method public int getIdentifier();
-    method @Deprecated public boolean isOwner();
-    method public boolean isSystem();
-    method public static int myUserId();
-    method public static android.os.UserHandle of(int);
-    field @NonNull public static final android.os.UserHandle ALL;
-    field @NonNull public static final android.os.UserHandle CURRENT;
-    field @NonNull public static final android.os.UserHandle SYSTEM;
-  }
-
-  public class UserManager {
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void clearSeedAccountData();
-    method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public android.os.UserHandle createProfile(@NonNull String, @NonNull String, @NonNull java.util.Set<java.lang.String>) throws android.os.UserManager.UserOperationException;
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}, conditional=true) public java.util.List<android.os.UserHandle> getAllProfiles();
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}, conditional=true) public java.util.List<android.os.UserHandle> getEnabledProfiles();
-    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public android.os.UserHandle getProfileParent(@NonNull android.os.UserHandle);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public String getSeedAccountName();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public android.os.PersistableBundle getSeedAccountOptions();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public String getSeedAccountType();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public long[] getSerialNumbersOfUsers(boolean);
-    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public java.util.List<android.os.UserHandle> getUserHandles(boolean);
-    method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.GET_ACCOUNTS_PRIVILEGED}) public android.graphics.Bitmap getUserIcon();
-    method @Deprecated @android.os.UserManager.UserRestrictionSource @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public int getUserRestrictionSource(String, android.os.UserHandle);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public java.util.List<android.os.UserManager.EnforcingUser> getUserRestrictionSources(String, android.os.UserHandle);
-    method @RequiresPermission(allOf={android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public int getUserSwitchability();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean hasRestrictedProfiles();
-    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean hasUserRestrictionForUser(@NonNull String, @NonNull android.os.UserHandle);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isAdminUser();
-    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean isGuestUser();
-    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isManagedProfile(int);
-    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean isPrimaryUser();
-    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isProfile();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isRestrictedProfile();
-    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean isRestrictedProfile(@NonNull android.os.UserHandle);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isSameProfileGroup(@NonNull android.os.UserHandle, @NonNull android.os.UserHandle);
-    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.GET_ACCOUNTS_PRIVILEGED}) public boolean isUserNameSet();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isUserOfType(@NonNull String);
-    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isUserUnlockingOrUnlocked(@NonNull android.os.UserHandle);
-    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean removeUser(@NonNull android.os.UserHandle);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setUserIcon(@NonNull android.graphics.Bitmap) throws android.os.UserManager.UserOperationException;
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setUserName(@Nullable String);
-    field public static final String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED";
-    field @Deprecated public static final String DISALLOW_OEM_UNLOCK = "no_oem_unlock";
-    field public static final String DISALLOW_RUN_IN_BACKGROUND = "no_run_in_background";
-    field public static final int RESTRICTION_NOT_SET = 0; // 0x0
-    field public static final int RESTRICTION_SOURCE_DEVICE_OWNER = 2; // 0x2
-    field public static final int RESTRICTION_SOURCE_PROFILE_OWNER = 4; // 0x4
-    field public static final int RESTRICTION_SOURCE_SYSTEM = 1; // 0x1
-    field public static final int SWITCHABILITY_STATUS_OK = 0; // 0x0
-    field public static final int SWITCHABILITY_STATUS_SYSTEM_USER_LOCKED = 4; // 0x4
-    field public static final int SWITCHABILITY_STATUS_USER_IN_CALL = 1; // 0x1
-    field public static final int SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED = 2; // 0x2
-    field public static final String USER_TYPE_FULL_SECONDARY = "android.os.usertype.full.SECONDARY";
-    field public static final String USER_TYPE_FULL_SYSTEM = "android.os.usertype.full.SYSTEM";
-    field public static final String USER_TYPE_PROFILE_MANAGED = "android.os.usertype.profile.MANAGED";
-    field public static final String USER_TYPE_SYSTEM_HEADLESS = "android.os.usertype.system.HEADLESS";
-  }
-
-  public static final class UserManager.EnforcingUser implements android.os.Parcelable {
-    method public int describeContents();
-    method public android.os.UserHandle getUserHandle();
-    method @android.os.UserManager.UserRestrictionSource public int getUserRestrictionSource();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.os.UserManager.EnforcingUser> CREATOR;
-  }
-
-  @IntDef(flag=true, prefix={"RESTRICTION_"}, value={android.os.UserManager.RESTRICTION_NOT_SET, android.os.UserManager.RESTRICTION_SOURCE_SYSTEM, android.os.UserManager.RESTRICTION_SOURCE_DEVICE_OWNER, android.os.UserManager.RESTRICTION_SOURCE_PROFILE_OWNER}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface UserManager.UserRestrictionSource {
-  }
-
-  public abstract class Vibrator {
-    method @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public void addVibratorStateListener(@NonNull android.os.Vibrator.OnVibratorStateChangedListener);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public void addVibratorStateListener(@NonNull java.util.concurrent.Executor, @NonNull android.os.Vibrator.OnVibratorStateChangedListener);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public boolean isVibrating();
-    method @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public void removeVibratorStateListener(@NonNull android.os.Vibrator.OnVibratorStateChangedListener);
-  }
-
-  public static interface Vibrator.OnVibratorStateChangedListener {
-    method public void onVibratorStateChanged(boolean);
-  }
-
-  public class WorkSource implements android.os.Parcelable {
-    ctor public WorkSource(int);
-    ctor public WorkSource(int, @NonNull String);
-    method public android.os.WorkSource.WorkChain createWorkChain();
-    method @Nullable public String getPackageName(int);
-    method public int getUid(int);
-    method @Nullable public java.util.List<android.os.WorkSource.WorkChain> getWorkChains();
-    method public boolean isEmpty();
-    method public int size();
-    method @NonNull public android.os.WorkSource withoutNames();
-  }
-
-  public static final class WorkSource.WorkChain implements android.os.Parcelable {
-    ctor public WorkSource.WorkChain();
-    method public android.os.WorkSource.WorkChain addNode(int, @Nullable String);
-    method public int describeContents();
-    method public String getAttributionTag();
-    method public int getAttributionUid();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.os.WorkSource.WorkChain> CREATOR;
-  }
-
-}
-
-package android.os.connectivity {
-
-  public final class CellularBatteryStats implements android.os.Parcelable {
-    method public int describeContents();
-    method public long getEnergyConsumedMaMillis();
-    method public long getIdleTimeMillis();
-    method public long getKernelActiveTimeMillis();
-    method public long getLoggingDurationMillis();
-    method public long getMonitoredRailChargeConsumedMaMillis();
-    method public long getNumBytesRx();
-    method public long getNumBytesTx();
-    method public long getNumPacketsRx();
-    method public long getNumPacketsTx();
-    method public long getRxTimeMillis();
-    method public long getSleepTimeMillis();
-    method @NonNull public long getTimeInRatMicros(int);
-    method @NonNull public long getTimeInRxSignalStrengthLevelMicros(@IntRange(from=android.telephony.CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, to=android.telephony.CellSignalStrength.SIGNAL_STRENGTH_GREAT) int);
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.os.connectivity.CellularBatteryStats> CREATOR;
-  }
-
-  public final class WifiActivityEnergyInfo implements android.os.Parcelable {
-    ctor public WifiActivityEnergyInfo(long, int, @IntRange(from=0) long, @IntRange(from=0) long, @IntRange(from=0) long, @IntRange(from=0) long);
-    method public int describeContents();
-    method @IntRange(from=0) public long getControllerEnergyUsedMicroJoules();
-    method @IntRange(from=0) public long getControllerIdleDurationMillis();
-    method @IntRange(from=0) public long getControllerRxDurationMillis();
-    method @IntRange(from=0) public long getControllerScanDurationMillis();
-    method @IntRange(from=0) public long getControllerTxDurationMillis();
-    method public int getStackState();
-    method public long getTimeSinceBootMillis();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.os.connectivity.WifiActivityEnergyInfo> CREATOR;
-    field public static final int STACK_STATE_INVALID = 0; // 0x0
-    field public static final int STACK_STATE_STATE_ACTIVE = 1; // 0x1
-    field public static final int STACK_STATE_STATE_IDLE = 3; // 0x3
-    field public static final int STACK_STATE_STATE_SCANNING = 2; // 0x2
-  }
-
-  public final class WifiBatteryStats implements android.os.Parcelable {
-    method public int describeContents();
-    method public long getAppScanRequestCount();
-    method public long getEnergyConsumedMaMillis();
-    method public long getIdleTimeMillis();
-    method public long getKernelActiveTimeMillis();
-    method public long getLoggingDurationMillis();
-    method public long getMonitoredRailChargeConsumedMaMillis();
-    method public long getNumBytesRx();
-    method public long getNumBytesTx();
-    method public long getNumPacketsRx();
-    method public long getNumPacketsTx();
-    method public long getRxTimeMillis();
-    method public long getScanTimeMillis();
-    method public long getSleepTimeMillis();
-    method public long getTxTimeMillis();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.os.connectivity.WifiBatteryStats> CREATOR;
-  }
-
-}
-
-package android.os.ext {
-
-  public class SdkExtensions {
-    method public static int getExtensionVersion(int);
-  }
-
-}
-
-package android.os.image {
-
-  public class DynamicSystemClient {
-    ctor public DynamicSystemClient(@NonNull android.content.Context);
-    method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void bind();
-    method public void setOnStatusChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.os.image.DynamicSystemClient.OnStatusChangedListener);
-    method public void setOnStatusChangedListener(@NonNull android.os.image.DynamicSystemClient.OnStatusChangedListener);
-    method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void start(@NonNull android.net.Uri, long);
-    method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void start(@NonNull android.net.Uri, long, long);
-    method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void unbind();
-    field public static final int CAUSE_ERROR_EXCEPTION = 6; // 0x6
-    field public static final int CAUSE_ERROR_INVALID_URL = 4; // 0x4
-    field public static final int CAUSE_ERROR_IO = 3; // 0x3
-    field public static final int CAUSE_ERROR_IPC = 5; // 0x5
-    field public static final int CAUSE_INSTALL_CANCELLED = 2; // 0x2
-    field public static final int CAUSE_INSTALL_COMPLETED = 1; // 0x1
-    field public static final int CAUSE_NOT_SPECIFIED = 0; // 0x0
-    field public static final int STATUS_IN_PROGRESS = 2; // 0x2
-    field public static final int STATUS_IN_USE = 4; // 0x4
-    field public static final int STATUS_NOT_STARTED = 1; // 0x1
-    field public static final int STATUS_READY = 3; // 0x3
-    field public static final int STATUS_UNKNOWN = 0; // 0x0
-  }
-
-  public static interface DynamicSystemClient.OnStatusChangedListener {
-    method public void onStatusChanged(int, int, long, @Nullable Throwable);
-  }
-
-}
-
-package android.os.storage {
-
-  public class StorageManager {
-    method @WorkerThread public void allocateBytes(@NonNull java.util.UUID, long, @RequiresPermission int) throws java.io.IOException;
-    method @WorkerThread public void allocateBytes(java.io.FileDescriptor, long, @RequiresPermission int) throws java.io.IOException;
-    method @WorkerThread public long getAllocatableBytes(@NonNull java.util.UUID, @RequiresPermission int) throws java.io.IOException;
-    method public static boolean hasIsolatedStorage();
-    method public void updateExternalStorageFileQuotaType(@NonNull java.io.File, int) throws java.io.IOException;
-    field @RequiresPermission(android.Manifest.permission.ALLOCATE_AGGRESSIVE) public static final int FLAG_ALLOCATE_AGGRESSIVE = 1; // 0x1
-    field public static final int QUOTA_TYPE_MEDIA_AUDIO = 2; // 0x2
-    field public static final int QUOTA_TYPE_MEDIA_IMAGE = 1; // 0x1
-    field public static final int QUOTA_TYPE_MEDIA_NONE = 0; // 0x0
-    field public static final int QUOTA_TYPE_MEDIA_VIDEO = 3; // 0x3
-  }
-
-  public final class StorageVolume implements android.os.Parcelable {
-    method @NonNull public String getId();
-  }
-
-}
-
-package android.permission {
-
-  public final class PermissionControllerManager {
-    method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void applyStagedRuntimePermissionBackup(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
-    method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS) public void getRuntimePermissionBackup(@NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<byte[]>);
-    method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull java.util.concurrent.Executor, @NonNull android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback);
-    method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void stageAndApplyRuntimePermissionsBackup(@NonNull byte[], @NonNull android.os.UserHandle);
-    field public static final int COUNT_ONLY_WHEN_GRANTED = 1; // 0x1
-    field public static final int COUNT_WHEN_SYSTEM = 2; // 0x2
-    field public static final int REASON_INSTALLER_POLICY_VIOLATION = 2; // 0x2
-    field public static final int REASON_MALWARE = 1; // 0x1
-  }
-
-  public abstract static class PermissionControllerManager.OnRevokeRuntimePermissionsCallback {
-    ctor public PermissionControllerManager.OnRevokeRuntimePermissionsCallback();
-    method public abstract void onRevokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>);
-  }
-
-  public abstract class PermissionControllerService extends android.app.Service {
-    ctor public PermissionControllerService();
-    method @BinderThread public void onApplyStagedRuntimePermissionBackup(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.function.Consumer<java.lang.Boolean>);
-    method @NonNull public final android.os.IBinder onBind(android.content.Intent);
-    method @BinderThread public abstract void onCountPermissionApps(@NonNull java.util.List<java.lang.String>, int, @NonNull java.util.function.IntConsumer);
-    method @BinderThread public abstract void onGetAppPermissions(@NonNull String, @NonNull java.util.function.Consumer<java.util.List<android.permission.RuntimePermissionPresentationInfo>>);
-    method @BinderThread public abstract void onGetPermissionUsages(boolean, long, @NonNull java.util.function.Consumer<java.util.List<android.permission.RuntimePermissionUsageInfo>>);
-    method @BinderThread public abstract void onGetRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.OutputStream, @NonNull Runnable);
-    method @BinderThread public abstract void onGrantOrUpgradeDefaultRuntimePermissions(@NonNull Runnable);
-    method @BinderThread public void onOneTimePermissionSessionTimeout(@NonNull String);
-    method @Deprecated @BinderThread public void onRestoreDelayedRuntimePermissionsBackup(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.function.Consumer<java.lang.Boolean>);
-    method @Deprecated @BinderThread public void onRestoreRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.InputStream, @NonNull Runnable);
-    method @BinderThread public abstract void onRevokeRuntimePermission(@NonNull String, @NonNull String, @NonNull Runnable);
-    method @BinderThread public abstract void onRevokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull String, @NonNull java.util.function.Consumer<java.util.Map<java.lang.String,java.util.List<java.lang.String>>>);
-    method @BinderThread public abstract void onSetRuntimePermissionGrantStateByDeviceAdmin(@NonNull String, @NonNull String, @NonNull String, int, @NonNull java.util.function.Consumer<java.lang.Boolean>);
-    method @BinderThread public void onStageAndApplyRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.InputStream, @NonNull Runnable);
-    method @BinderThread public void onUpdateUserSensitivePermissionFlags(int, @NonNull java.util.concurrent.Executor, @NonNull Runnable);
-    method @BinderThread public void onUpdateUserSensitivePermissionFlags(int, @NonNull Runnable);
-    field public static final String SERVICE_INTERFACE = "android.permission.PermissionControllerService";
-  }
-
-  public final class PermissionManager {
-    method public int checkDeviceIdentifierAccess(@Nullable String, @Nullable String, @Nullable String, int, int);
-    method @NonNull @RequiresPermission(android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY) public java.util.Set<java.lang.String> getAutoRevokeExemptionGrantedPackages();
-    method @NonNull @RequiresPermission(android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY) public java.util.Set<java.lang.String> getAutoRevokeExemptionRequestedPackages();
-    method @IntRange(from=0) @RequiresPermission(anyOf={android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public int getRuntimePermissionsVersion();
-    method @NonNull public java.util.List<android.permission.PermissionManager.SplitPermissionInfo> getSplitPermissions();
-    method @RequiresPermission(anyOf={android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public void setRuntimePermissionsVersion(@IntRange(from=0) int);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS) public void startOneTimePermissionSession(@NonNull String, long, int, int);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS) public void stopOneTimePermissionSession(@NonNull String);
-  }
-
-  public static final class PermissionManager.SplitPermissionInfo {
-    method @NonNull public java.util.List<java.lang.String> getNewPermissions();
-    method @NonNull public String getSplitPermission();
-    method public int getTargetSdk();
-  }
-
-  public final class RuntimePermissionPresentationInfo implements android.os.Parcelable {
-    ctor public RuntimePermissionPresentationInfo(@NonNull CharSequence, boolean, boolean);
-    method public int describeContents();
-    method @NonNull public CharSequence getLabel();
-    method public boolean isGranted();
-    method public boolean isStandard();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionPresentationInfo> CREATOR;
-  }
-
-  public final class RuntimePermissionUsageInfo implements android.os.Parcelable {
-    ctor public RuntimePermissionUsageInfo(@NonNull String, int);
-    method public int describeContents();
-    method public int getAppAccessCount();
-    method @NonNull public String getName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionUsageInfo> CREATOR;
-  }
-
-}
-
-package android.permissionpresenterservice {
-
-  @Deprecated public abstract class RuntimePermissionPresenterService extends android.app.Service {
-    ctor @Deprecated public RuntimePermissionPresenterService();
-    method @Deprecated public final void attachBaseContext(android.content.Context);
-    method @Deprecated public final android.os.IBinder onBind(android.content.Intent);
-    method @Deprecated public abstract java.util.List<android.content.pm.permission.RuntimePermissionPresentationInfo> onGetAppPermissions(@NonNull String);
-    field @Deprecated public static final String SERVICE_INTERFACE = "android.permissionpresenterservice.RuntimePermissionPresenterService";
-  }
-
-}
-
-package android.preference {
-
-  @Deprecated public class PreferenceManager {
-    method @Deprecated public boolean isStorageCredentialProtected();
-    method @Deprecated public void setStorageCredentialProtected();
-  }
-
-}
-
-package android.print {
-
-  public final class PrintManager {
-    method @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICE_RECOMMENDATIONS) public void addPrintServiceRecommendationsChangeListener(@NonNull android.print.PrintManager.PrintServiceRecommendationsChangeListener, @Nullable android.os.Handler);
-    method @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICES) public void addPrintServicesChangeListener(@NonNull android.print.PrintManager.PrintServicesChangeListener, @Nullable android.os.Handler);
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICE_RECOMMENDATIONS) public java.util.List<android.printservice.recommendation.RecommendationInfo> getPrintServiceRecommendations();
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICES) public java.util.List<android.printservice.PrintServiceInfo> getPrintServices(int);
-    method @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICE_RECOMMENDATIONS) public void removePrintServiceRecommendationsChangeListener(@NonNull android.print.PrintManager.PrintServiceRecommendationsChangeListener);
-    method @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICES) public void removePrintServicesChangeListener(@NonNull android.print.PrintManager.PrintServicesChangeListener);
-    field public static final int ENABLED_SERVICES = 1; // 0x1
-  }
-
-  public static interface PrintManager.PrintServiceRecommendationsChangeListener {
-    method public void onPrintServiceRecommendationsChanged();
-  }
-
-  public static interface PrintManager.PrintServicesChangeListener {
-    method public void onPrintServicesChanged();
-  }
-
-}
-
-package android.printservice {
-
-  public final class PrintServiceInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.content.ComponentName getComponentName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.printservice.PrintServiceInfo> CREATOR;
-  }
-
-}
-
-package android.printservice.recommendation {
-
-  public final class RecommendationInfo implements android.os.Parcelable {
-    ctor public RecommendationInfo(@NonNull CharSequence, @NonNull CharSequence, @NonNull java.util.List<java.net.InetAddress>, boolean);
-    ctor @Deprecated public RecommendationInfo(@NonNull CharSequence, @NonNull CharSequence, @IntRange(from=0) int, boolean);
-    method public int describeContents();
-    method @NonNull public java.util.List<java.net.InetAddress> getDiscoveredPrinters();
-    method public CharSequence getName();
-    method public int getNumDiscoveredPrinters();
-    method public CharSequence getPackageName();
-    method public boolean recommendsMultiVendorService();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.printservice.recommendation.RecommendationInfo> CREATOR;
-  }
-
-  public abstract class RecommendationService extends android.app.Service {
-    ctor public RecommendationService();
-    method public final android.os.IBinder onBind(android.content.Intent);
-    method public abstract void onConnected();
-    method public abstract void onDisconnected();
-    method public final void updateRecommendations(@Nullable java.util.List<android.printservice.recommendation.RecommendationInfo>);
-    field public static final String SERVICE_INTERFACE = "android.printservice.recommendation.RecommendationService";
-  }
-
-}
-
-package android.provider {
-
-  @Deprecated public static final class ContactsContract.MetadataSync implements android.provider.BaseColumns android.provider.ContactsContract.MetadataSyncColumns {
-    field @Deprecated public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_metadata";
-    field @Deprecated public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contact_metadata";
-    field @Deprecated public static final android.net.Uri CONTENT_URI;
-    field @Deprecated public static final String METADATA_AUTHORITY = "com.android.contacts.metadata";
-    field @Deprecated public static final android.net.Uri METADATA_AUTHORITY_URI;
-  }
-
-  @Deprecated protected static interface ContactsContract.MetadataSyncColumns {
-    field @Deprecated public static final String ACCOUNT_NAME = "account_name";
-    field @Deprecated public static final String ACCOUNT_TYPE = "account_type";
-    field @Deprecated public static final String DATA = "data";
-    field @Deprecated public static final String DATA_SET = "data_set";
-    field @Deprecated public static final String DELETED = "deleted";
-    field @Deprecated public static final String RAW_CONTACT_BACKUP_ID = "raw_contact_backup_id";
-  }
-
-  @Deprecated public static final class ContactsContract.MetadataSyncState implements android.provider.BaseColumns android.provider.ContactsContract.MetadataSyncStateColumns {
-    field @Deprecated public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_metadata_sync_state";
-    field @Deprecated public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contact_metadata_sync_state";
-    field @Deprecated public static final android.net.Uri CONTENT_URI;
-  }
-
-  @Deprecated protected static interface ContactsContract.MetadataSyncStateColumns {
-    field @Deprecated public static final String ACCOUNT_NAME = "account_name";
-    field @Deprecated public static final String ACCOUNT_TYPE = "account_type";
-    field @Deprecated public static final String DATA_SET = "data_set";
-    field @Deprecated public static final String STATE = "state";
-  }
-
-  public final class DeviceConfig {
-    method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static void addOnPropertiesChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertiesChangedListener);
-    method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static boolean getBoolean(@NonNull String, @NonNull String, boolean);
-    method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static float getFloat(@NonNull String, @NonNull String, float);
-    method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static int getInt(@NonNull String, @NonNull String, int);
-    method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static long getLong(@NonNull String, @NonNull String, long);
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static android.provider.DeviceConfig.Properties getProperties(@NonNull String, @NonNull java.lang.String...);
-    method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getProperty(@NonNull String, @NonNull String);
-    method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getString(@NonNull String, @NonNull String, @Nullable String);
-    method public static void removeOnPropertiesChangedListener(@NonNull android.provider.DeviceConfig.OnPropertiesChangedListener);
-    method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String);
-    method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperties(@NonNull android.provider.DeviceConfig.Properties) throws android.provider.DeviceConfig.BadConfigException;
-    method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(@NonNull String, @NonNull String, @Nullable String, boolean);
-    field public static final String NAMESPACE_ACTIVITY_MANAGER = "activity_manager";
-    field public static final String NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT = "activity_manager_native_boot";
-    field public static final String NAMESPACE_APP_COMPAT = "app_compat";
-    field public static final String NAMESPACE_ATTENTION_MANAGER_SERVICE = "attention_manager_service";
-    field public static final String NAMESPACE_AUTOFILL = "autofill";
-    field public static final String NAMESPACE_BIOMETRICS = "biometrics";
-    field public static final String NAMESPACE_BLOBSTORE = "blobstore";
-    field public static final String NAMESPACE_BLUETOOTH = "bluetooth";
-    field public static final String NAMESPACE_CONNECTIVITY = "connectivity";
-    field public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture";
-    field @Deprecated public static final String NAMESPACE_DEX_BOOT = "dex_boot";
-    field public static final String NAMESPACE_DISPLAY_MANAGER = "display_manager";
-    field public static final String NAMESPACE_GAME_DRIVER = "game_driver";
-    field public static final String NAMESPACE_INPUT_NATIVE_BOOT = "input_native_boot";
-    field public static final String NAMESPACE_INTELLIGENCE_ATTENTION = "intelligence_attention";
-    field public static final String NAMESPACE_MEDIA_NATIVE = "media_native";
-    field public static final String NAMESPACE_NETD_NATIVE = "netd_native";
-    field public static final String NAMESPACE_PACKAGE_MANAGER_SERVICE = "package_manager_service";
-    field public static final String NAMESPACE_PERMISSIONS = "permissions";
-    field public static final String NAMESPACE_PRIVACY = "privacy";
-    field public static final String NAMESPACE_PROFCOLLECT_NATIVE_BOOT = "profcollect_native_boot";
-    field public static final String NAMESPACE_ROLLBACK = "rollback";
-    field public static final String NAMESPACE_ROLLBACK_BOOT = "rollback_boot";
-    field public static final String NAMESPACE_RUNTIME = "runtime";
-    field public static final String NAMESPACE_RUNTIME_NATIVE = "runtime_native";
-    field public static final String NAMESPACE_RUNTIME_NATIVE_BOOT = "runtime_native_boot";
-    field public static final String NAMESPACE_SCHEDULER = "scheduler";
-    field @Deprecated public static final String NAMESPACE_STORAGE = "storage";
-    field public static final String NAMESPACE_STORAGE_NATIVE_BOOT = "storage_native_boot";
-    field public static final String NAMESPACE_SYSTEMUI = "systemui";
-    field public static final String NAMESPACE_TELEPHONY = "telephony";
-    field public static final String NAMESPACE_TEXTCLASSIFIER = "textclassifier";
-    field public static final String NAMESPACE_WINDOW_MANAGER_NATIVE_BOOT = "window_manager_native_boot";
-  }
-
-  public static class DeviceConfig.BadConfigException extends java.lang.Exception {
-    ctor public DeviceConfig.BadConfigException();
-  }
-
-  public static interface DeviceConfig.OnPropertiesChangedListener {
-    method public void onPropertiesChanged(@NonNull android.provider.DeviceConfig.Properties);
-  }
-
-  public static class DeviceConfig.Properties {
-    method public boolean getBoolean(@NonNull String, boolean);
-    method public float getFloat(@NonNull String, float);
-    method public int getInt(@NonNull String, int);
-    method @NonNull public java.util.Set<java.lang.String> getKeyset();
-    method public long getLong(@NonNull String, long);
-    method @NonNull public String getNamespace();
-    method @Nullable public String getString(@NonNull String, @Nullable String);
-  }
-
-  public static final class DeviceConfig.Properties.Builder {
-    ctor public DeviceConfig.Properties.Builder(@NonNull String);
-    method @NonNull public android.provider.DeviceConfig.Properties build();
-    method @NonNull public android.provider.DeviceConfig.Properties.Builder setBoolean(@NonNull String, boolean);
-    method @NonNull public android.provider.DeviceConfig.Properties.Builder setFloat(@NonNull String, float);
-    method @NonNull public android.provider.DeviceConfig.Properties.Builder setInt(@NonNull String, int);
-    method @NonNull public android.provider.DeviceConfig.Properties.Builder setLong(@NonNull String, long);
-    method @NonNull public android.provider.DeviceConfig.Properties.Builder setString(@NonNull String, @Nullable String);
-  }
-
-  public final class DocumentsContract {
-    method @NonNull public static android.net.Uri buildDocumentUriAsUser(@NonNull String, @NonNull String, @NonNull android.os.UserHandle);
-    method public static boolean isManageMode(@NonNull android.net.Uri);
-    method @NonNull public static android.net.Uri setManageMode(@NonNull android.net.Uri);
-    field public static final String ACTION_DOCUMENT_ROOT_SETTINGS = "android.provider.action.DOCUMENT_ROOT_SETTINGS";
-    field public static final String ACTION_MANAGE_DOCUMENT = "android.provider.action.MANAGE_DOCUMENT";
-    field public static final String EXTRA_SHOW_ADVANCED = "android.provider.extra.SHOW_ADVANCED";
-  }
-
-  public static final class DocumentsContract.Root {
-    field public static final int FLAG_ADVANCED = 65536; // 0x10000
-    field public static final int FLAG_HAS_SETTINGS = 131072; // 0x20000
-    field public static final int FLAG_REMOVABLE_SD = 262144; // 0x40000
-    field public static final int FLAG_REMOVABLE_USB = 524288; // 0x80000
-  }
-
-  public final class MediaStore {
-    method @NonNull public static android.net.Uri rewriteToLegacy(@NonNull android.net.Uri);
-    method @NonNull @WorkerThread public static android.net.Uri scanFile(@NonNull android.content.ContentResolver, @NonNull java.io.File);
-    method @WorkerThread public static void scanVolume(@NonNull android.content.ContentResolver, @NonNull String);
-    method @WorkerThread public static void waitForIdle(@NonNull android.content.ContentResolver);
-    field public static final String AUTHORITY_LEGACY = "media_legacy";
-    field @NonNull public static final android.net.Uri AUTHORITY_LEGACY_URI;
-  }
-
-  public abstract class SearchIndexableData {
-    ctor public SearchIndexableData();
-    ctor public SearchIndexableData(android.content.Context);
-    field public String className;
-    field public android.content.Context context;
-    field public boolean enabled;
-    field public int iconResId;
-    field public String intentAction;
-    field public String intentTargetClass;
-    field public String intentTargetPackage;
-    field public String key;
-    field public java.util.Locale locale;
-    field public String packageName;
-    field public int rank;
-    field public int userId;
-  }
-
-  public class SearchIndexableResource extends android.provider.SearchIndexableData {
-    ctor public SearchIndexableResource(int, int, String, int);
-    ctor public SearchIndexableResource(android.content.Context);
-    field public int xmlResId;
-  }
-
-  public class SearchIndexablesContract {
-    ctor public SearchIndexablesContract();
-    field public static final int COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE = 0; // 0x0
-    field public static final int COLUMN_INDEX_RAW_CLASS_NAME = 7; // 0x7
-    field public static final int COLUMN_INDEX_RAW_ENTRIES = 4; // 0x4
-    field public static final int COLUMN_INDEX_RAW_ICON_RESID = 8; // 0x8
-    field public static final int COLUMN_INDEX_RAW_INTENT_ACTION = 9; // 0x9
-    field public static final int COLUMN_INDEX_RAW_INTENT_TARGET_CLASS = 11; // 0xb
-    field public static final int COLUMN_INDEX_RAW_INTENT_TARGET_PACKAGE = 10; // 0xa
-    field public static final int COLUMN_INDEX_RAW_KEY = 12; // 0xc
-    field public static final int COLUMN_INDEX_RAW_KEYWORDS = 5; // 0x5
-    field public static final int COLUMN_INDEX_RAW_RANK = 0; // 0x0
-    field public static final int COLUMN_INDEX_RAW_SCREEN_TITLE = 6; // 0x6
-    field public static final int COLUMN_INDEX_RAW_SUMMARY_OFF = 3; // 0x3
-    field public static final int COLUMN_INDEX_RAW_SUMMARY_ON = 2; // 0x2
-    field public static final int COLUMN_INDEX_RAW_TITLE = 1; // 0x1
-    field public static final int COLUMN_INDEX_RAW_USER_ID = 13; // 0xd
-    field public static final int COLUMN_INDEX_XML_RES_CLASS_NAME = 2; // 0x2
-    field public static final int COLUMN_INDEX_XML_RES_ICON_RESID = 3; // 0x3
-    field public static final int COLUMN_INDEX_XML_RES_INTENT_ACTION = 4; // 0x4
-    field public static final int COLUMN_INDEX_XML_RES_INTENT_TARGET_CLASS = 6; // 0x6
-    field public static final int COLUMN_INDEX_XML_RES_INTENT_TARGET_PACKAGE = 5; // 0x5
-    field public static final int COLUMN_INDEX_XML_RES_RANK = 0; // 0x0
-    field public static final int COLUMN_INDEX_XML_RES_RESID = 1; // 0x1
-    field public static final String DYNAMIC_INDEXABLES_RAW = "dynamic_indexables_raw";
-    field public static final String DYNAMIC_INDEXABLES_RAW_PATH = "settings/dynamic_indexables_raw";
-    field public static final String INDEXABLES_RAW = "indexables_raw";
-    field public static final String[] INDEXABLES_RAW_COLUMNS;
-    field public static final String INDEXABLES_RAW_PATH = "settings/indexables_raw";
-    field public static final String INDEXABLES_XML_RES = "indexables_xml_res";
-    field public static final String[] INDEXABLES_XML_RES_COLUMNS;
-    field public static final String INDEXABLES_XML_RES_PATH = "settings/indexables_xml_res";
-    field public static final String NON_INDEXABLES_KEYS = "non_indexables_key";
-    field public static final String[] NON_INDEXABLES_KEYS_COLUMNS;
-    field public static final String NON_INDEXABLES_KEYS_PATH = "settings/non_indexables_key";
-    field public static final String PROVIDER_INTERFACE = "android.content.action.SEARCH_INDEXABLES_PROVIDER";
-    field public static final String SLICE_URI_PAIRS = "slice_uri_pairs";
-    field @NonNull public static final String[] SLICE_URI_PAIRS_COLUMNS;
-    field public static final String SLICE_URI_PAIRS_PATH = "settings/slice_uri_pairs";
-  }
-
-  public static class SearchIndexablesContract.BaseColumns {
-    field public static final String COLUMN_CLASS_NAME = "className";
-    field public static final String COLUMN_ICON_RESID = "iconResId";
-    field public static final String COLUMN_INTENT_ACTION = "intentAction";
-    field public static final String COLUMN_INTENT_TARGET_CLASS = "intentTargetClass";
-    field public static final String COLUMN_INTENT_TARGET_PACKAGE = "intentTargetPackage";
-    field public static final String COLUMN_RANK = "rank";
-  }
-
-  public static final class SearchIndexablesContract.NonIndexableKey extends android.provider.SearchIndexablesContract.BaseColumns {
-    field public static final String COLUMN_KEY_VALUE = "key";
-    field public static final String MIME_TYPE = "vnd.android.cursor.dir/non_indexables_key";
-  }
-
-  public static final class SearchIndexablesContract.RawData extends android.provider.SearchIndexablesContract.BaseColumns {
-    field public static final String COLUMN_ENTRIES = "entries";
-    field public static final String COLUMN_KEY = "key";
-    field public static final String COLUMN_KEYWORDS = "keywords";
-    field public static final String COLUMN_SCREEN_TITLE = "screenTitle";
-    field public static final String COLUMN_SUMMARY_OFF = "summaryOff";
-    field public static final String COLUMN_SUMMARY_ON = "summaryOn";
-    field public static final String COLUMN_TITLE = "title";
-    field public static final String COLUMN_USER_ID = "user_id";
-    field public static final String MIME_TYPE = "vnd.android.cursor.dir/indexables_raw";
-  }
-
-  public static final class SearchIndexablesContract.SliceUriPairColumns {
-    field public static final String KEY = "key";
-    field public static final String SLICE_URI = "slice_uri";
-  }
-
-  public static final class SearchIndexablesContract.XmlResource extends android.provider.SearchIndexablesContract.BaseColumns {
-    field public static final String COLUMN_XML_RESID = "xmlResId";
-    field public static final String MIME_TYPE = "vnd.android.cursor.dir/indexables_xml_res";
-  }
-
-  public abstract class SearchIndexablesProvider extends android.content.ContentProvider {
-    ctor public SearchIndexablesProvider();
-    method public final int delete(android.net.Uri, String, String[]);
-    method public String getType(android.net.Uri);
-    method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
-    method public android.database.Cursor query(android.net.Uri, String[], String, String[], String);
-    method @Nullable public android.database.Cursor queryDynamicRawData(@Nullable String[]);
-    method public abstract android.database.Cursor queryNonIndexableKeys(String[]);
-    method public abstract android.database.Cursor queryRawData(String[]);
-    method @Nullable public android.database.Cursor querySliceUriPairs();
-    method public abstract android.database.Cursor queryXmlResources(String[]);
-    method public final int update(android.net.Uri, android.content.ContentValues, String, String[]);
-  }
-
-  public final class Settings {
-    method @Deprecated public static boolean checkAndNoteWriteSettingsOperation(@NonNull android.content.Context, int, @NonNull String, boolean);
-    method public static boolean checkAndNoteWriteSettingsOperation(@NonNull android.content.Context, int, @NonNull String, @Nullable String, boolean);
-    field public static final String ACTION_ACCESSIBILITY_DETAILS_SETTINGS = "android.settings.ACCESSIBILITY_DETAILS_SETTINGS";
-    field public static final String ACTION_BUGREPORT_HANDLER_SETTINGS = "android.settings.BUGREPORT_HANDLER_SETTINGS";
-    field public static final String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS";
-    field public static final String ACTION_LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS = "android.settings.LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS";
-    field public static final String ACTION_MANAGE_APP_OVERLAY_PERMISSION = "android.settings.MANAGE_APP_OVERLAY_PERMISSION";
-    field public static final String ACTION_MANAGE_DOMAIN_URLS = "android.settings.MANAGE_DOMAIN_URLS";
-    field public static final String ACTION_MANAGE_MORE_DEFAULT_APPS_SETTINGS = "android.settings.MANAGE_MORE_DEFAULT_APPS_SETTINGS";
-    field public static final String ACTION_NOTIFICATION_POLICY_ACCESS_DETAIL_SETTINGS = "android.settings.NOTIFICATION_POLICY_ACCESS_DETAIL_SETTINGS";
-    field public static final String ACTION_REQUEST_ENABLE_CONTENT_CAPTURE = "android.settings.REQUEST_ENABLE_CONTENT_CAPTURE";
-    field public static final String ACTION_SHOW_ADMIN_SUPPORT_DETAILS = "android.settings.SHOW_ADMIN_SUPPORT_DETAILS";
-    field public static final String ACTION_TETHER_PROVISIONING_UI = "android.settings.TETHER_PROVISIONING_UI";
-    field public static final String ACTION_TETHER_SETTINGS = "android.settings.TETHER_SETTINGS";
-  }
-
-  public static final class Settings.Global extends android.provider.Settings.NameValueTable {
-    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static boolean putString(@NonNull android.content.ContentResolver, @NonNull String, @Nullable String, @Nullable String, boolean);
-    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static void resetToDefaults(@NonNull android.content.ContentResolver, @Nullable String);
-    field public static final String AIRPLANE_MODE_TOGGLEABLE_RADIOS = "airplane_mode_toggleable_radios";
-    field public static final String APP_STANDBY_ENABLED = "app_standby_enabled";
-    field public static final String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages";
-    field public static final String CARRIER_APP_NAMES = "carrier_app_names";
-    field public static final String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
-    field public static final String DEFAULT_SM_DP_PLUS = "default_sm_dp_plus";
-    field public static final String DEVICE_DEMO_MODE = "device_demo_mode";
-    field public static final String DEVICE_PROVISIONING_MOBILE_DATA_ENABLED = "device_provisioning_mobile_data";
-    field public static final String EUICC_PROVISIONED = "euicc_provisioned";
-    field public static final String EUICC_SUPPORTED_COUNTRIES = "euicc_supported_countries";
-    field public static final String EUICC_UNSUPPORTED_COUNTRIES = "euicc_unsupported_countries";
-    field public static final String INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT = "install_carrier_app_notification_persistent";
-    field public static final String INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS = "install_carrier_app_notification_sleep_millis";
-    field public static final String OTA_DISABLE_AUTOMATIC_UPDATE = "ota_disable_automatic_update";
-    field public static final String REQUIRE_PASSWORD_TO_DECRYPT = "require_password_to_decrypt";
-    field public static final String TETHER_OFFLOAD_DISABLED = "tether_offload_disabled";
-    field public static final String TETHER_SUPPORTED = "tether_supported";
-    field public static final String THEATER_MODE_ON = "theater_mode_on";
-    field public static final String WEBVIEW_MULTIPROCESS = "webview_multiprocess";
-    field public static final String WIFI_BADGING_THRESHOLDS = "wifi_badging_thresholds";
-    field @Deprecated public static final String WIFI_WAKEUP_ENABLED = "wifi_wakeup_enabled";
-  }
-
-  public static final class Settings.Secure extends android.provider.Settings.NameValueTable {
-    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static boolean putString(@NonNull android.content.ContentResolver, @NonNull String, @Nullable String, @Nullable String, boolean);
-    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static void resetToDefaults(@NonNull android.content.ContentResolver, @Nullable String);
-    field @Deprecated public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED = "accessibility_display_magnification_navbar_enabled";
-    field public static final String ASSIST_GESTURE_SETUP_COMPLETE = "assist_gesture_setup_complete";
-    field public static final String AUTOFILL_FEATURE_FIELD_CLASSIFICATION = "autofill_field_classification";
-    field public static final String AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT = "autofill_user_data_max_category_count";
-    field public static final String AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE = "autofill_user_data_max_field_classification_size";
-    field public static final String AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE = "autofill_user_data_max_user_data_size";
-    field public static final String AUTOFILL_USER_DATA_MAX_VALUE_LENGTH = "autofill_user_data_max_value_length";
-    field public static final String AUTOFILL_USER_DATA_MIN_VALUE_LENGTH = "autofill_user_data_min_value_length";
-    field public static final String AUTO_REVOKE_DISABLED = "auto_revoke_disabled";
-    field public static final String COMPLETED_CATEGORY_PREFIX = "suggested.completed_category.";
-    field public static final String DOZE_ALWAYS_ON = "doze_always_on";
-    field public static final String HUSH_GESTURE_USED = "hush_gesture_used";
-    field public static final String INSTANT_APPS_ENABLED = "instant_apps_enabled";
-    field public static final String LAST_SETUP_SHOWN = "last_setup_shown";
-    field public static final String LOCATION_ACCESS_CHECK_DELAY_MILLIS = "location_access_check_delay_millis";
-    field public static final String LOCATION_ACCESS_CHECK_INTERVAL_MILLIS = "location_access_check_interval_millis";
-    field public static final int LOCATION_MODE_ON = 3; // 0x3
-    field @Deprecated public static final String LOCATION_PERMISSIONS_UPGRADE_TO_Q_MODE = "location_permissions_upgrade_to_q_mode";
-    field public static final String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS = "lock_screen_allow_private_notifications";
-    field public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS = "lock_screen_show_notifications";
-    field public static final String ODI_CAPTIONS_ENABLED = "odi_captions_enabled";
-    field public static final String THEME_CUSTOMIZATION_OVERLAY_PACKAGES = "theme_customization_overlay_packages";
-    field public static final String USER_SETUP_COMPLETE = "user_setup_complete";
-    field public static final int USER_SETUP_PERSONALIZATION_COMPLETE = 10; // 0xa
-    field public static final int USER_SETUP_PERSONALIZATION_NOT_STARTED = 0; // 0x0
-    field public static final int USER_SETUP_PERSONALIZATION_PAUSED = 2; // 0x2
-    field public static final int USER_SETUP_PERSONALIZATION_STARTED = 1; // 0x1
-    field public static final String USER_SETUP_PERSONALIZATION_STATE = "user_setup_personalization_state";
-    field public static final String VOLUME_HUSH_GESTURE = "volume_hush_gesture";
-    field public static final int VOLUME_HUSH_MUTE = 2; // 0x2
-    field public static final int VOLUME_HUSH_OFF = 0; // 0x0
-    field public static final int VOLUME_HUSH_VIBRATE = 1; // 0x1
-  }
-
-  public static final class Settings.System extends android.provider.Settings.NameValueTable {
-    method @RequiresPermission(android.Manifest.permission.MODIFY_SETTINGS_OVERRIDEABLE_BY_RESTORE) public static boolean putString(@NonNull android.content.ContentResolver, @NonNull String, @Nullable String, boolean);
-  }
-
-  public static final class Telephony.Carriers implements android.provider.BaseColumns {
-    field public static final String APN_SET_ID = "apn_set_id";
-    field public static final int CARRIER_EDITED = 4; // 0x4
-    field public static final String EDITED_STATUS = "edited";
-    field public static final int MATCH_ALL_APN_SET_ID = -1; // 0xffffffff
-    field public static final String MAX_CONNECTIONS = "max_conns";
-    field public static final String MODEM_PERSIST = "modem_cognitive";
-    field public static final String MTU = "mtu";
-    field public static final int NO_APN_SET_ID = 0; // 0x0
-    field public static final String TIME_LIMIT_FOR_MAX_CONNECTIONS = "max_conns_time";
-    field public static final int UNEDITED = 0; // 0x0
-    field public static final int USER_DELETED = 2; // 0x2
-    field public static final String USER_EDITABLE = "user_editable";
-    field public static final int USER_EDITED = 1; // 0x1
-    field public static final String USER_VISIBLE = "user_visible";
-    field public static final String WAIT_TIME_RETRY = "wait_time";
-  }
-
-  public static final class Telephony.CellBroadcasts implements android.provider.BaseColumns {
-    field @NonNull public static final String AUTHORITY_LEGACY = "cellbroadcast-legacy";
-    field @NonNull public static final android.net.Uri AUTHORITY_LEGACY_URI;
-    field @NonNull public static final String CALL_METHOD_GET_PREFERENCE = "get_preference";
-    field public static final String CID = "cid";
-    field public static final String CMAS_CATEGORY = "cmas_category";
-    field public static final String CMAS_CERTAINTY = "cmas_certainty";
-    field public static final String CMAS_MESSAGE_CLASS = "cmas_message_class";
-    field public static final String CMAS_RESPONSE_TYPE = "cmas_response_type";
-    field public static final String CMAS_SEVERITY = "cmas_severity";
-    field public static final String CMAS_URGENCY = "cmas_urgency";
-    field @NonNull public static final android.net.Uri CONTENT_URI;
-    field public static final String DATA_CODING_SCHEME = "dcs";
-    field public static final String DEFAULT_SORT_ORDER = "date DESC";
-    field public static final String DELIVERY_TIME = "date";
-    field public static final String ETWS_IS_PRIMARY = "etws_is_primary";
-    field public static final String ETWS_WARNING_TYPE = "etws_warning_type";
-    field public static final String GEOGRAPHICAL_SCOPE = "geo_scope";
-    field public static final String GEOMETRIES = "geometries";
-    field public static final String LAC = "lac";
-    field public static final String LANGUAGE_CODE = "language";
-    field public static final String LOCATION_CHECK_TIME = "location_check_time";
-    field public static final String MAXIMUM_WAIT_TIME = "maximum_wait_time";
-    field public static final String MESSAGE_BODY = "body";
-    field public static final String MESSAGE_BROADCASTED = "message_broadcasted";
-    field public static final String MESSAGE_DISPLAYED = "message_displayed";
-    field public static final String MESSAGE_FORMAT = "format";
-    field @NonNull @RequiresPermission(android.Manifest.permission.READ_CELL_BROADCASTS) public static final android.net.Uri MESSAGE_HISTORY_URI;
-    field public static final String MESSAGE_PRIORITY = "priority";
-    field public static final String MESSAGE_READ = "read";
-    field public static final String PLMN = "plmn";
-    field public static final String RECEIVED_TIME = "received_time";
-    field public static final String SERIAL_NUMBER = "serial_number";
-    field public static final String SERVICE_CATEGORY = "service_category";
-    field public static final String SLOT_INDEX = "slot_index";
-    field public static final String SUBSCRIPTION_ID = "sub_id";
-  }
-
-  public static final class Telephony.CellBroadcasts.Preference {
-    field @NonNull public static final String ENABLE_ALERT_VIBRATION_PREF = "enable_alert_vibrate";
-    field @NonNull public static final String ENABLE_AREA_UPDATE_INFO_PREF = "enable_area_update_info_alerts";
-    field @NonNull public static final String ENABLE_CMAS_AMBER_PREF = "enable_cmas_amber_alerts";
-    field @NonNull public static final String ENABLE_CMAS_EXTREME_THREAT_PREF = "enable_cmas_extreme_threat_alerts";
-    field @NonNull public static final String ENABLE_CMAS_IN_SECOND_LANGUAGE_PREF = "receive_cmas_in_second_language";
-    field @NonNull public static final String ENABLE_CMAS_PRESIDENTIAL_PREF = "enable_cmas_presidential_alerts";
-    field @NonNull public static final String ENABLE_CMAS_SEVERE_THREAT_PREF = "enable_cmas_severe_threat_alerts";
-    field @NonNull public static final String ENABLE_EMERGENCY_PERF = "enable_emergency_alerts";
-    field @NonNull public static final String ENABLE_PUBLIC_SAFETY_PREF = "enable_public_safety_messages";
-    field @NonNull public static final String ENABLE_STATE_LOCAL_TEST_PREF = "enable_state_local_test_alerts";
-    field @NonNull public static final String ENABLE_TEST_ALERT_PREF = "enable_test_alerts";
-  }
-
-  public static final class Telephony.Sms.Intents {
-    field public static final String ACTION_SMS_EMERGENCY_CB_RECEIVED = "android.provider.action.SMS_EMERGENCY_CB_RECEIVED";
-  }
-
-  public final class TimeZoneRulesDataContract {
-    field public static final String AUTHORITY = "com.android.timezone";
-  }
-
-  public static final class TimeZoneRulesDataContract.Operation {
-    field public static final String COLUMN_DISTRO_MAJOR_VERSION = "distro_major_version";
-    field public static final String COLUMN_DISTRO_MINOR_VERSION = "distro_minor_version";
-    field public static final String COLUMN_REVISION = "revision";
-    field public static final String COLUMN_RULES_VERSION = "rules_version";
-    field public static final String COLUMN_TYPE = "type";
-    field public static final android.net.Uri CONTENT_URI;
-    field public static final String TYPE_INSTALL = "INSTALL";
-    field public static final String TYPE_NO_OP = "NOOP";
-    field public static final String TYPE_UNINSTALL = "UNINSTALL";
-  }
-
-}
-
-package android.se.omapi {
-
-  public final class Reader {
-    method @RequiresPermission(android.Manifest.permission.SECURE_ELEMENT_PRIVILEGED_OPERATION) public boolean reset();
-  }
-
-}
-
-package android.security.keystore {
-
-  public class AndroidKeyStoreProvider extends java.security.Provider {
-    method @NonNull public static java.security.KeyStore getKeyStoreForUid(int) throws java.security.KeyStoreException, java.security.NoSuchProviderException;
-  }
-
-  public abstract class AttestationUtils {
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static java.security.cert.X509Certificate[] attestDeviceIds(android.content.Context, @NonNull int[], @NonNull byte[]) throws android.security.keystore.DeviceIdAttestationException;
-    field public static final int ID_TYPE_IMEI = 2; // 0x2
-    field public static final int ID_TYPE_MEID = 3; // 0x3
-    field public static final int ID_TYPE_SERIAL = 1; // 0x1
-    field public static final int USE_INDIVIDUAL_ATTESTATION = 4; // 0x4
-  }
-
-  public class DeviceIdAttestationException extends java.lang.Exception {
-    ctor public DeviceIdAttestationException(@Nullable String);
-    ctor public DeviceIdAttestationException(@Nullable String, @Nullable Throwable);
-  }
-
-  public static final class KeyGenParameterSpec.Builder {
-    method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setUid(int);
-  }
-
-}
-
-package android.security.keystore.recovery {
-
-  public class DecryptionFailedException extends java.security.GeneralSecurityException {
-    ctor public DecryptionFailedException(String);
-  }
-
-  public class InternalRecoveryServiceException extends java.security.GeneralSecurityException {
-    ctor public InternalRecoveryServiceException(String);
-    ctor public InternalRecoveryServiceException(String, Throwable);
-  }
-
-  public final class KeyChainProtectionParams implements android.os.Parcelable {
-    method public void clearSecret();
-    method public int describeContents();
-    method @NonNull public android.security.keystore.recovery.KeyDerivationParams getKeyDerivationParams();
-    method public int getLockScreenUiFormat();
-    method @NonNull public byte[] getSecret();
-    method public int getUserSecretType();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.security.keystore.recovery.KeyChainProtectionParams> CREATOR;
-    field public static final int TYPE_LOCKSCREEN = 100; // 0x64
-    field public static final int UI_FORMAT_PASSWORD = 2; // 0x2
-    field public static final int UI_FORMAT_PATTERN = 3; // 0x3
-    field public static final int UI_FORMAT_PIN = 1; // 0x1
-  }
-
-  public static class KeyChainProtectionParams.Builder {
-    ctor public KeyChainProtectionParams.Builder();
-    method @NonNull public android.security.keystore.recovery.KeyChainProtectionParams build();
-    method @NonNull public android.security.keystore.recovery.KeyChainProtectionParams.Builder setKeyDerivationParams(@NonNull android.security.keystore.recovery.KeyDerivationParams);
-    method @NonNull public android.security.keystore.recovery.KeyChainProtectionParams.Builder setLockScreenUiFormat(int);
-    method @NonNull public android.security.keystore.recovery.KeyChainProtectionParams.Builder setSecret(@NonNull byte[]);
-    method @NonNull public android.security.keystore.recovery.KeyChainProtectionParams.Builder setUserSecretType(int);
-  }
-
-  public final class KeyChainSnapshot implements android.os.Parcelable {
-    method public int describeContents();
-    method public long getCounterId();
-    method @NonNull public byte[] getEncryptedRecoveryKeyBlob();
-    method @NonNull public java.util.List<android.security.keystore.recovery.KeyChainProtectionParams> getKeyChainProtectionParams();
-    method public int getMaxAttempts();
-    method @NonNull public byte[] getServerParams();
-    method public int getSnapshotVersion();
-    method @NonNull public java.security.cert.CertPath getTrustedHardwareCertPath();
-    method @NonNull public java.util.List<android.security.keystore.recovery.WrappedApplicationKey> getWrappedApplicationKeys();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.security.keystore.recovery.KeyChainSnapshot> CREATOR;
-  }
-
-  public final class KeyDerivationParams implements android.os.Parcelable {
-    method @NonNull public static android.security.keystore.recovery.KeyDerivationParams createScryptParams(@NonNull byte[], int);
-    method @NonNull public static android.security.keystore.recovery.KeyDerivationParams createSha256Params(@NonNull byte[]);
-    method public int describeContents();
-    method public int getAlgorithm();
-    method public int getMemoryDifficulty();
-    method @NonNull public byte[] getSalt();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int ALGORITHM_SCRYPT = 2; // 0x2
-    field public static final int ALGORITHM_SHA256 = 1; // 0x1
-    field @NonNull public static final android.os.Parcelable.Creator<android.security.keystore.recovery.KeyDerivationParams> CREATOR;
-  }
-
-  public class LockScreenRequiredException extends java.security.GeneralSecurityException {
-    ctor public LockScreenRequiredException(String);
-  }
-
-  public class RecoveryController {
-    method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public android.security.keystore.recovery.RecoverySession createRecoverySession();
-    method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.security.Key generateKey(@NonNull String) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
-    method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.security.Key generateKey(@NonNull String, @Nullable byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
-    method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.util.List<java.lang.String> getAliases() throws android.security.keystore.recovery.InternalRecoveryServiceException;
-    method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public static android.security.keystore.recovery.RecoveryController getInstance(@NonNull android.content.Context);
-    method @Nullable @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.security.Key getKey(@NonNull String) throws android.security.keystore.recovery.InternalRecoveryServiceException, java.security.UnrecoverableKeyException;
-    method @Nullable @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public android.security.keystore.recovery.KeyChainSnapshot getKeyChainSnapshot() throws android.security.keystore.recovery.InternalRecoveryServiceException;
-    method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public int[] getRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException;
-    method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public int getRecoveryStatus(@NonNull String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
-    method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.util.Map<java.lang.String,java.security.cert.X509Certificate> getRootCertificates();
-    method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.security.Key importKey(@NonNull String, @NonNull byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
-    method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.security.Key importKey(@NonNull String, @NonNull byte[], @Nullable byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
-    method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void initRecoveryService(@NonNull String, @NonNull byte[], @NonNull byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
-    method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public static boolean isRecoverableKeyStoreEnabled(@NonNull android.content.Context);
-    method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void removeKey(@NonNull String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
-    method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void setRecoverySecretTypes(@NonNull int[]) throws android.security.keystore.recovery.InternalRecoveryServiceException;
-    method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void setRecoveryStatus(@NonNull String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException;
-    method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void setServerParams(@NonNull byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException;
-    method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void setSnapshotCreatedPendingIntent(@Nullable android.app.PendingIntent) throws android.security.keystore.recovery.InternalRecoveryServiceException;
-    field public static final int RECOVERY_STATUS_PERMANENT_FAILURE = 3; // 0x3
-    field public static final int RECOVERY_STATUS_SYNCED = 0; // 0x0
-    field public static final int RECOVERY_STATUS_SYNC_IN_PROGRESS = 1; // 0x1
-  }
-
-  public class RecoverySession implements java.lang.AutoCloseable {
-    method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void close();
-    method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.util.Map<java.lang.String,java.security.Key> recoverKeyChainSnapshot(@NonNull byte[], @NonNull java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
-    method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public byte[] start(@NonNull String, @NonNull java.security.cert.CertPath, @NonNull byte[], @NonNull byte[], @NonNull java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
-  }
-
-  public class SessionExpiredException extends java.security.GeneralSecurityException {
-    ctor public SessionExpiredException(String);
-  }
-
-  public final class WrappedApplicationKey implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public String getAlias();
-    method @NonNull public byte[] getEncryptedKeyMaterial();
-    method @Nullable public byte[] getMetadata();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.security.keystore.recovery.WrappedApplicationKey> CREATOR;
-  }
-
-  public static class WrappedApplicationKey.Builder {
-    ctor public WrappedApplicationKey.Builder();
-    method @NonNull public android.security.keystore.recovery.WrappedApplicationKey build();
-    method @NonNull public android.security.keystore.recovery.WrappedApplicationKey.Builder setAlias(@NonNull String);
-    method @NonNull public android.security.keystore.recovery.WrappedApplicationKey.Builder setEncryptedKeyMaterial(@NonNull byte[]);
-    method @NonNull public android.security.keystore.recovery.WrappedApplicationKey.Builder setMetadata(@Nullable byte[]);
-  }
-
-}
-
-package android.service.appprediction {
-
-  public abstract class AppPredictionService extends android.app.Service {
-    ctor public AppPredictionService();
-    method @MainThread public abstract void onAppTargetEvent(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull android.app.prediction.AppTargetEvent);
-    method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent);
-    method public void onCreatePredictionSession(@NonNull android.app.prediction.AppPredictionContext, @NonNull android.app.prediction.AppPredictionSessionId);
-    method @MainThread public void onDestroyPredictionSession(@NonNull android.app.prediction.AppPredictionSessionId);
-    method @MainThread public abstract void onLaunchLocationShown(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>);
-    method @MainThread public abstract void onRequestPredictionUpdate(@NonNull android.app.prediction.AppPredictionSessionId);
-    method @MainThread public abstract void onSortAppTargets(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>);
-    method @MainThread public void onStartPredictionUpdates();
-    method @MainThread public void onStopPredictionUpdates();
-    method public final void updatePredictions(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>);
-  }
-
-}
-
-package android.service.attention {
-
-  public abstract class AttentionService extends android.app.Service {
-    ctor public AttentionService();
-    method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
-    method public abstract void onCancelAttentionCheck(@NonNull android.service.attention.AttentionService.AttentionCallback);
-    method public abstract void onCheckAttention(@NonNull android.service.attention.AttentionService.AttentionCallback);
-    field public static final int ATTENTION_FAILURE_CAMERA_PERMISSION_ABSENT = 6; // 0x6
-    field public static final int ATTENTION_FAILURE_CANCELLED = 3; // 0x3
-    field public static final int ATTENTION_FAILURE_PREEMPTED = 4; // 0x4
-    field public static final int ATTENTION_FAILURE_TIMED_OUT = 5; // 0x5
-    field public static final int ATTENTION_FAILURE_UNKNOWN = 2; // 0x2
-    field public static final int ATTENTION_SUCCESS_ABSENT = 0; // 0x0
-    field public static final int ATTENTION_SUCCESS_PRESENT = 1; // 0x1
-    field public static final String SERVICE_INTERFACE = "android.service.attention.AttentionService";
-  }
-
-  public static final class AttentionService.AttentionCallback {
-    method public void onFailure(int);
-    method public void onSuccess(int, long);
-  }
-
-}
-
-package android.service.attestation {
-
-  public abstract class ImpressionAttestationService extends android.app.Service {
-    ctor public ImpressionAttestationService();
-    method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent);
-    method @Nullable public abstract android.service.attestation.ImpressionToken onGenerateImpressionToken(@NonNull android.hardware.HardwareBuffer, @NonNull android.graphics.Rect, @NonNull String);
-    method public abstract int onVerifyImpressionToken(@NonNull android.service.attestation.ImpressionToken);
-    field public static final int VERIFICATION_STATUS_APP_DECLARED = 2; // 0x2
-    field public static final int VERIFICATION_STATUS_OS_VERIFIED = 1; // 0x1
-    field public static final int VERIFICATION_STATUS_UNKNOWN = 0; // 0x0
-  }
-
-  public final class ImpressionToken implements android.os.Parcelable {
-    ctor public ImpressionToken(long, @NonNull android.graphics.Rect, @NonNull String, @NonNull byte[], @NonNull byte[]);
-    method public int describeContents();
-    method @NonNull public android.graphics.Rect getBoundsInWindow();
-    method @NonNull public String getHashingAlgorithm();
-    method @NonNull public byte[] getHmac();
-    method @NonNull public byte[] getImageHash();
-    method public long getScreenshotTimeMillis();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.attestation.ImpressionToken> CREATOR;
-  }
-
-}
-
-package android.service.autofill {
-
-  public abstract class AutofillFieldClassificationService extends android.app.Service {
-    ctor public AutofillFieldClassificationService();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method @Nullable public float[][] onCalculateScores(@NonNull java.util.List<android.view.autofill.AutofillValue>, @NonNull java.util.List<java.lang.String>, @NonNull java.util.List<java.lang.String>, @Nullable String, @Nullable android.os.Bundle, @Nullable java.util.Map, @Nullable java.util.Map);
-    method @Deprecated @Nullable public float[][] onGetScores(@Nullable String, @Nullable android.os.Bundle, @NonNull java.util.List<android.view.autofill.AutofillValue>, @NonNull java.util.List<java.lang.String>);
-    field public static final String REQUIRED_ALGORITHM_CREDIT_CARD = "CREDIT_CARD";
-    field public static final String REQUIRED_ALGORITHM_EDIT_DISTANCE = "EDIT_DISTANCE";
-    field public static final String REQUIRED_ALGORITHM_EXACT_MATCH = "EXACT_MATCH";
-    field public static final String SERVICE_INTERFACE = "android.service.autofill.AutofillFieldClassificationService";
-    field public static final String SERVICE_META_DATA_KEY_AVAILABLE_ALGORITHMS = "android.autofill.field_classification.available_algorithms";
-    field public static final String SERVICE_META_DATA_KEY_DEFAULT_ALGORITHM = "android.autofill.field_classification.default_algorithm";
-  }
-
-  public static final class Dataset.Builder {
-    ctor public Dataset.Builder(@NonNull android.service.autofill.InlinePresentation);
-    method @NonNull public android.service.autofill.Dataset.Builder setContent(@NonNull android.view.autofill.AutofillId, @Nullable android.content.ClipData);
-    method @NonNull public android.service.autofill.Dataset.Builder setFieldInlinePresentation(@NonNull android.view.autofill.AutofillId, @Nullable android.view.autofill.AutofillValue, @Nullable java.util.regex.Pattern, @NonNull android.service.autofill.InlinePresentation);
-  }
-
-  public abstract class InlineSuggestionRenderService extends android.app.Service {
-    ctor public InlineSuggestionRenderService();
-    method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
-    method @NonNull public android.os.Bundle onGetInlineSuggestionsRendererInfo();
-    method @Nullable public android.view.View onRenderSuggestion(@NonNull android.service.autofill.InlinePresentation, int, int);
-    method public final void startIntentSender(@NonNull android.content.IntentSender);
-    field public static final String SERVICE_INTERFACE = "android.service.autofill.InlineSuggestionRenderService";
-  }
-
-}
-
-package android.service.autofill.augmented {
-
-  public abstract class AugmentedAutofillService extends android.app.Service {
-    ctor public AugmentedAutofillService();
-    method protected final void dump(java.io.FileDescriptor, java.io.PrintWriter, String[]);
-    method protected void dump(@NonNull java.io.PrintWriter, @NonNull String[]);
-    method @Nullable public final android.service.autofill.FillEventHistory getFillEventHistory();
-    method public void onConnected();
-    method public void onDisconnected();
-    method public void onFillRequest(@NonNull android.service.autofill.augmented.FillRequest, @NonNull android.os.CancellationSignal, @NonNull android.service.autofill.augmented.FillController, @NonNull android.service.autofill.augmented.FillCallback);
-    method public final boolean requestAutofill(@NonNull android.content.ComponentName, @NonNull android.view.autofill.AutofillId);
-    field public static final String SERVICE_INTERFACE = "android.service.autofill.augmented.AugmentedAutofillService";
-  }
-
-  public final class FillCallback {
-    method public void onSuccess(@Nullable android.service.autofill.augmented.FillResponse);
-  }
-
-  public final class FillController {
-    method public void autofill(@NonNull java.util.List<android.util.Pair<android.view.autofill.AutofillId,android.view.autofill.AutofillValue>>);
-  }
-
-  public final class FillRequest {
-    method @NonNull public android.content.ComponentName getActivityComponent();
-    method @NonNull public android.view.autofill.AutofillId getFocusedId();
-    method @NonNull public android.view.autofill.AutofillValue getFocusedValue();
-    method @Nullable public android.view.inputmethod.InlineSuggestionsRequest getInlineSuggestionsRequest();
-    method @Nullable public android.service.autofill.augmented.PresentationParams getPresentationParams();
-    method public int getTaskId();
-  }
-
-  public final class FillResponse {
-  }
-
-  public static final class FillResponse.Builder {
-    ctor public FillResponse.Builder();
-    method @NonNull public android.service.autofill.augmented.FillResponse build();
-    method @NonNull public android.service.autofill.augmented.FillResponse.Builder setClientState(@NonNull android.os.Bundle);
-    method @NonNull public android.service.autofill.augmented.FillResponse.Builder setFillWindow(@NonNull android.service.autofill.augmented.FillWindow);
-    method @NonNull public android.service.autofill.augmented.FillResponse.Builder setInlineSuggestions(@NonNull java.util.List<android.service.autofill.Dataset>);
-  }
-
-  public final class FillWindow implements java.lang.AutoCloseable {
-    ctor public FillWindow();
-    method public void destroy();
-    method public boolean update(@NonNull android.service.autofill.augmented.PresentationParams.Area, @NonNull android.view.View, long);
-  }
-
-  public abstract class PresentationParams {
-    method @Nullable public android.service.autofill.augmented.PresentationParams.Area getSuggestionArea();
-  }
-
-  public abstract static class PresentationParams.Area {
-    method @NonNull public android.graphics.Rect getBounds();
-  }
-
-}
-
-package android.service.carrier {
-
-  public abstract class ApnService extends android.app.Service {
-    ctor public ApnService();
-    method @NonNull public android.os.IBinder onBind(@Nullable android.content.Intent);
-    method @NonNull @WorkerThread public abstract java.util.List<android.content.ContentValues> onRestoreApns(int);
-  }
-
-}
-
-package android.service.contentcapture {
-
-  public final class ActivityEvent implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.content.ComponentName getComponentName();
-    method public int getEventType();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.contentcapture.ActivityEvent> CREATOR;
-    field public static final int TYPE_ACTIVITY_DESTROYED = 24; // 0x18
-    field public static final int TYPE_ACTIVITY_PAUSED = 2; // 0x2
-    field public static final int TYPE_ACTIVITY_RESUMED = 1; // 0x1
-    field public static final int TYPE_ACTIVITY_STOPPED = 23; // 0x17
-  }
-
-  public abstract class ContentCaptureService extends android.app.Service {
-    ctor public ContentCaptureService();
-    method public final void disableSelf();
-    method public void onActivityEvent(@NonNull android.service.contentcapture.ActivityEvent);
-    method public void onActivitySnapshot(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.service.contentcapture.SnapshotData);
-    method public void onConnected();
-    method public void onContentCaptureEvent(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.view.contentcapture.ContentCaptureEvent);
-    method public void onCreateContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureContext, @NonNull android.view.contentcapture.ContentCaptureSessionId);
-    method public void onDataRemovalRequest(@NonNull android.view.contentcapture.DataRemovalRequest);
-    method public void onDataShareRequest(@NonNull android.view.contentcapture.DataShareRequest, @NonNull android.service.contentcapture.DataShareCallback);
-    method public void onDestroyContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureSessionId);
-    method public void onDisconnected();
-    method public final void setContentCaptureConditions(@NonNull String, @Nullable java.util.Set<android.view.contentcapture.ContentCaptureCondition>);
-    method public final void setContentCaptureWhitelist(@Nullable java.util.Set<java.lang.String>, @Nullable java.util.Set<android.content.ComponentName>);
-    field public static final String SERVICE_INTERFACE = "android.service.contentcapture.ContentCaptureService";
-    field public static final String SERVICE_META_DATA = "android.content_capture";
-  }
-
-  public interface DataShareCallback {
-    method public void onAccept(@NonNull java.util.concurrent.Executor, @NonNull android.service.contentcapture.DataShareReadAdapter);
-    method public void onReject();
-  }
-
-  public interface DataShareReadAdapter {
-    method public void onError(int);
-    method public void onStart(@NonNull android.os.ParcelFileDescriptor);
-  }
-
-  public final class SnapshotData implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public android.app.assist.AssistContent getAssistContent();
-    method @NonNull public android.os.Bundle getAssistData();
-    method @NonNull public android.app.assist.AssistStructure getAssistStructure();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.contentcapture.SnapshotData> CREATOR;
-  }
-
-}
-
-package android.service.contentsuggestions {
-
-  public abstract class ContentSuggestionsService extends android.app.Service {
-    ctor public ContentSuggestionsService();
-    method public abstract void onClassifyContentSelections(@NonNull android.app.contentsuggestions.ClassificationsRequest, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.ClassificationsCallback);
-    method public abstract void onNotifyInteraction(@NonNull String, @NonNull android.os.Bundle);
-    method public abstract void onProcessContextImage(int, @Nullable android.graphics.Bitmap, @NonNull android.os.Bundle);
-    method public abstract void onSuggestContentSelections(@NonNull android.app.contentsuggestions.SelectionsRequest, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.SelectionsCallback);
-    field public static final String SERVICE_INTERFACE = "android.service.contentsuggestions.ContentSuggestionsService";
-  }
-
-}
-
-package android.service.dataloader {
-
-  public abstract class DataLoaderService extends android.app.Service {
-    ctor public DataLoaderService();
-    method @Nullable public android.service.dataloader.DataLoaderService.DataLoader onCreateDataLoader(@NonNull android.content.pm.DataLoaderParams);
-  }
-
-  public static interface DataLoaderService.DataLoader {
-    method public boolean onCreate(@NonNull android.content.pm.DataLoaderParams, @NonNull android.service.dataloader.DataLoaderService.FileSystemConnector);
-    method public boolean onPrepareImage(@NonNull java.util.Collection<android.content.pm.InstallationFile>, @NonNull java.util.Collection<java.lang.String>);
-  }
-
-  public static final class DataLoaderService.FileSystemConnector {
-    method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void writeData(@NonNull String, long, long, @NonNull android.os.ParcelFileDescriptor) throws java.io.IOException;
-  }
-
-}
-
-package android.service.euicc {
-
-  public final class DownloadSubscriptionResult implements android.os.Parcelable {
-    ctor public DownloadSubscriptionResult(int, int, int);
-    method public int describeContents();
-    method public int getCardId();
-    method public int getResolvableErrors();
-    method public int getResult();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.euicc.DownloadSubscriptionResult> CREATOR;
-  }
-
-  public final class EuiccProfileInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method public android.service.carrier.CarrierIdentifier getCarrierIdentifier();
-    method public String getIccid();
-    method @Nullable public String getNickname();
-    method @android.service.euicc.EuiccProfileInfo.PolicyRule public int getPolicyRules();
-    method @android.service.euicc.EuiccProfileInfo.ProfileClass public int getProfileClass();
-    method public String getProfileName();
-    method public String getServiceProviderName();
-    method @android.service.euicc.EuiccProfileInfo.ProfileState public int getState();
-    method @Nullable public java.util.List<android.telephony.UiccAccessRule> getUiccAccessRules();
-    method public boolean hasPolicyRule(@android.service.euicc.EuiccProfileInfo.PolicyRule int);
-    method public boolean hasPolicyRules();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.euicc.EuiccProfileInfo> CREATOR;
-    field public static final int POLICY_RULE_DELETE_AFTER_DISABLING = 4; // 0x4
-    field public static final int POLICY_RULE_DO_NOT_DELETE = 2; // 0x2
-    field public static final int POLICY_RULE_DO_NOT_DISABLE = 1; // 0x1
-    field public static final int PROFILE_CLASS_OPERATIONAL = 2; // 0x2
-    field public static final int PROFILE_CLASS_PROVISIONING = 1; // 0x1
-    field public static final int PROFILE_CLASS_TESTING = 0; // 0x0
-    field public static final int PROFILE_STATE_DISABLED = 0; // 0x0
-    field public static final int PROFILE_STATE_ENABLED = 1; // 0x1
-  }
-
-  public static final class EuiccProfileInfo.Builder {
-    ctor public EuiccProfileInfo.Builder(String);
-    ctor public EuiccProfileInfo.Builder(android.service.euicc.EuiccProfileInfo);
-    method public android.service.euicc.EuiccProfileInfo build();
-    method public android.service.euicc.EuiccProfileInfo.Builder setCarrierIdentifier(android.service.carrier.CarrierIdentifier);
-    method public android.service.euicc.EuiccProfileInfo.Builder setIccid(String);
-    method public android.service.euicc.EuiccProfileInfo.Builder setNickname(String);
-    method public android.service.euicc.EuiccProfileInfo.Builder setPolicyRules(@android.service.euicc.EuiccProfileInfo.PolicyRule int);
-    method public android.service.euicc.EuiccProfileInfo.Builder setProfileClass(@android.service.euicc.EuiccProfileInfo.ProfileClass int);
-    method public android.service.euicc.EuiccProfileInfo.Builder setProfileName(String);
-    method public android.service.euicc.EuiccProfileInfo.Builder setServiceProviderName(String);
-    method public android.service.euicc.EuiccProfileInfo.Builder setState(@android.service.euicc.EuiccProfileInfo.ProfileState int);
-    method public android.service.euicc.EuiccProfileInfo.Builder setUiccAccessRule(@Nullable java.util.List<android.telephony.UiccAccessRule>);
-  }
-
-  @IntDef(flag=true, prefix={"POLICY_RULE_"}, value={android.service.euicc.EuiccProfileInfo.POLICY_RULE_DO_NOT_DISABLE, android.service.euicc.EuiccProfileInfo.POLICY_RULE_DO_NOT_DELETE, android.service.euicc.EuiccProfileInfo.POLICY_RULE_DELETE_AFTER_DISABLING}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccProfileInfo.PolicyRule {
-  }
-
-  @IntDef(prefix={"PROFILE_CLASS_"}, value={android.service.euicc.EuiccProfileInfo.PROFILE_CLASS_TESTING, android.service.euicc.EuiccProfileInfo.PROFILE_CLASS_PROVISIONING, android.service.euicc.EuiccProfileInfo.PROFILE_CLASS_OPERATIONAL, 0xffffffff}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccProfileInfo.ProfileClass {
-  }
-
-  @IntDef(prefix={"PROFILE_STATE_"}, value={android.service.euicc.EuiccProfileInfo.PROFILE_STATE_DISABLED, android.service.euicc.EuiccProfileInfo.PROFILE_STATE_ENABLED, 0xffffffff}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccProfileInfo.ProfileState {
-  }
-
-  public abstract class EuiccService extends android.app.Service {
-    ctor public EuiccService();
-    method public void dump(@NonNull java.io.PrintWriter);
-    method public int encodeSmdxSubjectAndReasonCode(@Nullable String, @Nullable String);
-    method @CallSuper public android.os.IBinder onBind(android.content.Intent);
-    method public abstract int onDeleteSubscription(int, String);
-    method public android.service.euicc.DownloadSubscriptionResult onDownloadSubscription(int, @NonNull android.telephony.euicc.DownloadableSubscription, boolean, boolean, @Nullable android.os.Bundle);
-    method @Deprecated public int onDownloadSubscription(int, @NonNull android.telephony.euicc.DownloadableSubscription, boolean, boolean);
-    method @Deprecated public abstract int onEraseSubscriptions(int);
-    method public int onEraseSubscriptions(int, @android.telephony.euicc.EuiccCardManager.ResetOption int);
-    method public abstract android.service.euicc.GetDefaultDownloadableSubscriptionListResult onGetDefaultDownloadableSubscriptionList(int, boolean);
-    method public abstract android.service.euicc.GetDownloadableSubscriptionMetadataResult onGetDownloadableSubscriptionMetadata(int, android.telephony.euicc.DownloadableSubscription, boolean);
-    method public abstract String onGetEid(int);
-    method @NonNull public abstract android.telephony.euicc.EuiccInfo onGetEuiccInfo(int);
-    method @NonNull public abstract android.service.euicc.GetEuiccProfileInfoListResult onGetEuiccProfileInfoList(int);
-    method @android.telephony.euicc.EuiccManager.OtaStatus public abstract int onGetOtaStatus(int);
-    method public abstract int onRetainSubscriptionsForFactoryReset(int);
-    method public abstract void onStartOtaIfNecessary(int, android.service.euicc.EuiccService.OtaStatusChangedCallback);
-    method public abstract int onSwitchToSubscription(int, @Nullable String, boolean);
-    method public abstract int onUpdateSubscriptionNickname(int, String, String);
-    field public static final String ACTION_BIND_CARRIER_PROVISIONING_SERVICE = "android.service.euicc.action.BIND_CARRIER_PROVISIONING_SERVICE";
-    field public static final String ACTION_DELETE_SUBSCRIPTION_PRIVILEGED = "android.service.euicc.action.DELETE_SUBSCRIPTION_PRIVILEGED";
-    field public static final String ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS = "android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS";
-    field public static final String ACTION_PROVISION_EMBEDDED_SUBSCRIPTION = "android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION";
-    field public static final String ACTION_RENAME_SUBSCRIPTION_PRIVILEGED = "android.service.euicc.action.RENAME_SUBSCRIPTION_PRIVILEGED";
-    field @Deprecated public static final String ACTION_RESOLVE_CONFIRMATION_CODE = "android.service.euicc.action.RESOLVE_CONFIRMATION_CODE";
-    field public static final String ACTION_RESOLVE_DEACTIVATE_SIM = "android.service.euicc.action.RESOLVE_DEACTIVATE_SIM";
-    field public static final String ACTION_RESOLVE_NO_PRIVILEGES = "android.service.euicc.action.RESOLVE_NO_PRIVILEGES";
-    field public static final String ACTION_RESOLVE_RESOLVABLE_ERRORS = "android.service.euicc.action.RESOLVE_RESOLVABLE_ERRORS";
-    field public static final String ACTION_START_CARRIER_ACTIVATION = "android.service.euicc.action.START_CARRIER_ACTIVATION";
-    field public static final String ACTION_START_EUICC_ACTIVATION = "android.service.euicc.action.START_EUICC_ACTIVATION";
-    field public static final String ACTION_TOGGLE_SUBSCRIPTION_PRIVILEGED = "android.service.euicc.action.TOGGLE_SUBSCRIPTION_PRIVILEGED";
-    field public static final String CATEGORY_EUICC_UI = "android.service.euicc.category.EUICC_UI";
-    field public static final String EUICC_SERVICE_INTERFACE = "android.service.euicc.EuiccService";
-    field public static final String EXTRA_RESOLUTION_ALLOW_POLICY_RULES = "android.service.euicc.extra.RESOLUTION_ALLOW_POLICY_RULES";
-    field public static final String EXTRA_RESOLUTION_CALLING_PACKAGE = "android.service.euicc.extra.RESOLUTION_CALLING_PACKAGE";
-    field public static final String EXTRA_RESOLUTION_CARD_ID = "android.service.euicc.extra.RESOLUTION_CARD_ID";
-    field public static final String EXTRA_RESOLUTION_CONFIRMATION_CODE = "android.service.euicc.extra.RESOLUTION_CONFIRMATION_CODE";
-    field public static final String EXTRA_RESOLUTION_CONFIRMATION_CODE_RETRIED = "android.service.euicc.extra.RESOLUTION_CONFIRMATION_CODE_RETRIED";
-    field public static final String EXTRA_RESOLUTION_CONSENT = "android.service.euicc.extra.RESOLUTION_CONSENT";
-    field public static final String EXTRA_RESOLVABLE_ERRORS = "android.service.euicc.extra.RESOLVABLE_ERRORS";
-    field public static final int RESOLVABLE_ERROR_CONFIRMATION_CODE = 1; // 0x1
-    field public static final int RESOLVABLE_ERROR_POLICY_RULES = 2; // 0x2
-    field public static final int RESULT_FIRST_USER = 1; // 0x1
-    field public static final int RESULT_MUST_DEACTIVATE_SIM = -1; // 0xffffffff
-    field @Deprecated public static final int RESULT_NEED_CONFIRMATION_CODE = -2; // 0xfffffffe
-    field public static final int RESULT_OK = 0; // 0x0
-    field public static final int RESULT_RESOLVABLE_ERRORS = -2; // 0xfffffffe
-  }
-
-  public abstract static class EuiccService.OtaStatusChangedCallback {
-    ctor public EuiccService.OtaStatusChangedCallback();
-    method public abstract void onOtaStatusChanged(int);
-  }
-
-  public final class GetDefaultDownloadableSubscriptionListResult implements android.os.Parcelable {
-    ctor public GetDefaultDownloadableSubscriptionListResult(int, @Nullable android.telephony.euicc.DownloadableSubscription[]);
-    method public int describeContents();
-    method @Nullable public java.util.List<android.telephony.euicc.DownloadableSubscription> getDownloadableSubscriptions();
-    method public int getResult();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.euicc.GetDefaultDownloadableSubscriptionListResult> CREATOR;
-  }
-
-  public final class GetDownloadableSubscriptionMetadataResult implements android.os.Parcelable {
-    ctor public GetDownloadableSubscriptionMetadataResult(int, @Nullable android.telephony.euicc.DownloadableSubscription);
-    method public int describeContents();
-    method @Nullable public android.telephony.euicc.DownloadableSubscription getDownloadableSubscription();
-    method public int getResult();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.euicc.GetDownloadableSubscriptionMetadataResult> CREATOR;
-  }
-
-  public final class GetEuiccProfileInfoListResult implements android.os.Parcelable {
-    ctor public GetEuiccProfileInfoListResult(int, @Nullable android.service.euicc.EuiccProfileInfo[], boolean);
-    method public int describeContents();
-    method public boolean getIsRemovable();
-    method @Nullable public java.util.List<android.service.euicc.EuiccProfileInfo> getProfiles();
-    method public int getResult();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.euicc.GetEuiccProfileInfoListResult> CREATOR;
-  }
-
-}
-
-package android.service.notification {
-
-  public final class Adjustment implements android.os.Parcelable {
-    ctor public Adjustment(String, String, android.os.Bundle, CharSequence, int);
-    ctor public Adjustment(@NonNull String, @NonNull String, @NonNull android.os.Bundle, @NonNull CharSequence, @NonNull android.os.UserHandle);
-    ctor protected Adjustment(android.os.Parcel);
-    method public int describeContents();
-    method @NonNull public CharSequence getExplanation();
-    method @NonNull public String getKey();
-    method @NonNull public String getPackage();
-    method @NonNull public android.os.Bundle getSignals();
-    method public int getUser();
-    method @NonNull public android.os.UserHandle getUserHandle();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.notification.Adjustment> CREATOR;
-    field public static final String KEY_CONTEXTUAL_ACTIONS = "key_contextual_actions";
-    field public static final String KEY_IMPORTANCE = "key_importance";
-    field public static final String KEY_NOT_CONVERSATION = "key_not_conversation";
-    field public static final String KEY_PEOPLE = "key_people";
-    field public static final String KEY_RANKING_SCORE = "key_ranking_score";
-    field public static final String KEY_SNOOZE_CRITERIA = "key_snooze_criteria";
-    field public static final String KEY_TEXT_REPLIES = "key_text_replies";
-    field public static final String KEY_USER_SENTIMENT = "key_user_sentiment";
-  }
-
-  public abstract class NotificationAssistantService extends android.service.notification.NotificationListenerService {
-    ctor public NotificationAssistantService();
-    method public final void adjustNotification(@NonNull android.service.notification.Adjustment);
-    method public final void adjustNotifications(@NonNull java.util.List<android.service.notification.Adjustment>);
-    method public void onActionInvoked(@NonNull String, @NonNull android.app.Notification.Action, int);
-    method public void onAllowedAdjustmentsChanged();
-    method @NonNull public final android.os.IBinder onBind(@Nullable android.content.Intent);
-    method public void onNotificationDirectReplied(@NonNull String);
-    method @Nullable public abstract android.service.notification.Adjustment onNotificationEnqueued(@NonNull android.service.notification.StatusBarNotification);
-    method @Nullable public android.service.notification.Adjustment onNotificationEnqueued(@NonNull android.service.notification.StatusBarNotification, @NonNull android.app.NotificationChannel);
-    method public void onNotificationExpansionChanged(@NonNull String, boolean, boolean);
-    method public abstract void onNotificationSnoozedUntilContext(@NonNull android.service.notification.StatusBarNotification, @NonNull String);
-    method public void onNotificationVisibilityChanged(@NonNull String, boolean);
-    method public void onNotificationsSeen(@NonNull java.util.List<java.lang.String>);
-    method public void onPanelHidden();
-    method public void onPanelRevealed(int);
-    method public void onSuggestedReplySent(@NonNull String, @NonNull CharSequence, int);
-    method public final void unsnoozeNotification(@NonNull String);
-    field public static final String SERVICE_INTERFACE = "android.service.notification.NotificationAssistantService";
-    field public static final int SOURCE_FROM_APP = 0; // 0x0
-    field public static final int SOURCE_FROM_ASSISTANT = 1; // 0x1
-  }
-
-  public abstract class NotificationListenerService extends android.app.Service {
-    method public void onNotificationRemoved(@NonNull android.service.notification.StatusBarNotification, @NonNull android.service.notification.NotificationListenerService.RankingMap, @NonNull android.service.notification.NotificationStats, int);
-  }
-
-  public final class NotificationStats implements android.os.Parcelable {
-    ctor public NotificationStats();
-    ctor protected NotificationStats(android.os.Parcel);
-    method public int describeContents();
-    method public int getDismissalSentiment();
-    method public int getDismissalSurface();
-    method public boolean hasDirectReplied();
-    method public boolean hasExpanded();
-    method public boolean hasInteracted();
-    method public boolean hasSeen();
-    method public boolean hasSnoozed();
-    method public boolean hasViewedSettings();
-    method public void setDirectReplied();
-    method public void setDismissalSentiment(int);
-    method public void setDismissalSurface(int);
-    method public void setExpanded();
-    method public void setSeen();
-    method public void setSnoozed();
-    method public void setViewedSettings();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.notification.NotificationStats> CREATOR;
-    field public static final int DISMISSAL_AOD = 2; // 0x2
-    field public static final int DISMISSAL_NOT_DISMISSED = -1; // 0xffffffff
-    field public static final int DISMISSAL_OTHER = 0; // 0x0
-    field public static final int DISMISSAL_PEEK = 1; // 0x1
-    field public static final int DISMISSAL_SHADE = 3; // 0x3
-    field public static final int DISMISS_SENTIMENT_NEGATIVE = 0; // 0x0
-    field public static final int DISMISS_SENTIMENT_NEUTRAL = 1; // 0x1
-    field public static final int DISMISS_SENTIMENT_POSITIVE = 2; // 0x2
-    field public static final int DISMISS_SENTIMENT_UNKNOWN = -1000; // 0xfffffc18
-  }
-
-  public final class SnoozeCriterion implements android.os.Parcelable {
-    ctor public SnoozeCriterion(String, CharSequence, CharSequence);
-    ctor protected SnoozeCriterion(android.os.Parcel);
-    method public int describeContents();
-    method public CharSequence getConfirmation();
-    method public CharSequence getExplanation();
-    method public String getId();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.notification.SnoozeCriterion> CREATOR;
-  }
-
-}
-
-package android.service.oemlock {
-
-  public class OemLockManager {
-    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE) public String getLockName();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE) public boolean isOemUnlockAllowedByCarrier();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USER_OEM_UNLOCK_STATE) public boolean isOemUnlockAllowedByUser();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE) public void setOemUnlockAllowedByCarrier(boolean, @Nullable byte[]);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_USER_OEM_UNLOCK_STATE) public void setOemUnlockAllowedByUser(boolean);
-  }
-
-}
-
-package android.service.persistentdata {
-
-  public class PersistentDataBlockManager {
-    method @RequiresPermission("android.permission.ACCESS_PDB_STATE") public int getDataBlockSize();
-    method @android.service.persistentdata.PersistentDataBlockManager.FlashLockState @RequiresPermission(anyOf={android.Manifest.permission.READ_OEM_UNLOCK_STATE, "android.permission.OEM_UNLOCK_STATE"}) public int getFlashLockState();
-    method public long getMaximumDataBlockSize();
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_OEM_UNLOCK_STATE, "android.permission.OEM_UNLOCK_STATE"}) public boolean getOemUnlockEnabled();
-    method public byte[] read();
-    method @Deprecated @RequiresPermission("android.permission.OEM_UNLOCK_STATE") public void setOemUnlockEnabled(boolean);
-    method @RequiresPermission("android.permission.OEM_UNLOCK_STATE") public void wipe();
-    method public int write(byte[]);
-    field public static final int FLASH_LOCK_LOCKED = 1; // 0x1
-    field public static final int FLASH_LOCK_UNKNOWN = -1; // 0xffffffff
-    field public static final int FLASH_LOCK_UNLOCKED = 0; // 0x0
-  }
-
-  @IntDef(prefix={"FLASH_LOCK_"}, value={android.service.persistentdata.PersistentDataBlockManager.FLASH_LOCK_UNKNOWN, android.service.persistentdata.PersistentDataBlockManager.FLASH_LOCK_LOCKED, android.service.persistentdata.PersistentDataBlockManager.FLASH_LOCK_UNLOCKED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PersistentDataBlockManager.FlashLockState {
-  }
-
-}
-
-package android.service.quicksettings {
-
-  public class TileService extends android.app.Service {
-    method public final void setStatusIcon(android.graphics.drawable.Icon, String);
-  }
-
-}
-
-package android.service.resolver {
-
-  public abstract class ResolverRankerService extends android.app.Service {
-    ctor public ResolverRankerService();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public void onPredictSharingProbabilities(java.util.List<android.service.resolver.ResolverTarget>);
-    method public void onTrainRankingModel(java.util.List<android.service.resolver.ResolverTarget>, int);
-    field public static final String BIND_PERMISSION = "android.permission.BIND_RESOLVER_RANKER_SERVICE";
-    field public static final String HOLD_PERMISSION = "android.permission.PROVIDE_RESOLVER_RANKER_SERVICE";
-    field public static final String SERVICE_INTERFACE = "android.service.resolver.ResolverRankerService";
-  }
-
-  public final class ResolverTarget implements android.os.Parcelable {
-    ctor public ResolverTarget();
-    method public int describeContents();
-    method public float getChooserScore();
-    method public float getLaunchScore();
-    method public float getRecencyScore();
-    method public float getSelectProbability();
-    method public float getTimeSpentScore();
-    method public void setChooserScore(float);
-    method public void setLaunchScore(float);
-    method public void setRecencyScore(float);
-    method public void setSelectProbability(float);
-    method public void setTimeSpentScore(float);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.resolver.ResolverTarget> CREATOR;
-  }
-
-}
-
-package android.service.settings.suggestions {
-
-  public final class Suggestion implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getFlags();
-    method public android.graphics.drawable.Icon getIcon();
-    method public String getId();
-    method public android.app.PendingIntent getPendingIntent();
-    method public CharSequence getSummary();
-    method public CharSequence getTitle();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.settings.suggestions.Suggestion> CREATOR;
-    field public static final int FLAG_HAS_BUTTON = 1; // 0x1
-  }
-
-  public static class Suggestion.Builder {
-    ctor public Suggestion.Builder(String);
-    method public android.service.settings.suggestions.Suggestion build();
-    method public android.service.settings.suggestions.Suggestion.Builder setFlags(int);
-    method public android.service.settings.suggestions.Suggestion.Builder setIcon(android.graphics.drawable.Icon);
-    method public android.service.settings.suggestions.Suggestion.Builder setPendingIntent(android.app.PendingIntent);
-    method public android.service.settings.suggestions.Suggestion.Builder setSummary(CharSequence);
-    method public android.service.settings.suggestions.Suggestion.Builder setTitle(CharSequence);
-  }
-
-  public abstract class SuggestionService extends android.app.Service {
-    ctor public SuggestionService();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public abstract java.util.List<android.service.settings.suggestions.Suggestion> onGetSuggestions();
-    method public abstract void onSuggestionDismissed(android.service.settings.suggestions.Suggestion);
-    method public abstract void onSuggestionLaunched(android.service.settings.suggestions.Suggestion);
-  }
-
-}
-
-package android.service.storage {
-
-  public abstract class ExternalStorageService extends android.app.Service {
-    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 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
-    field public static final int FLAG_SESSION_TYPE_FUSE = 1; // 0x1
-    field public static final String SERVICE_INTERFACE = "android.service.storage.ExternalStorageService";
-  }
-
-}
-
-package android.service.textclassifier {
-
-  public abstract class TextClassifierService extends android.app.Service {
-    ctor public TextClassifierService();
-    method @NonNull public static android.view.textclassifier.TextClassifier getDefaultTextClassifierImplementation(@NonNull android.content.Context);
-    method @Deprecated public final android.view.textclassifier.TextClassifier getLocalTextClassifier();
-    method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
-    method @MainThread public abstract void onClassifyText(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassification.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextClassification>);
-    method public void onConnected();
-    method @MainThread public void onCreateTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationContext, @NonNull android.view.textclassifier.TextClassificationSessionId);
-    method @MainThread public void onDestroyTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationSessionId);
-    method @MainThread public void onDetectLanguage(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLanguage.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLanguage>);
-    method public void onDisconnected();
-    method @MainThread public abstract void onGenerateLinks(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLinks.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLinks>);
-    method @Deprecated @MainThread public void onSelectionEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.SelectionEvent);
-    method @MainThread public void onSuggestConversationActions(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.ConversationActions.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.ConversationActions>);
-    method @MainThread public abstract void onSuggestSelection(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextSelection.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextSelection>);
-    method @MainThread public void onTextClassifierEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassifierEvent);
-    field public static final String SERVICE_INTERFACE = "android.service.textclassifier.TextClassifierService";
-  }
-
-  public static interface TextClassifierService.Callback<T> {
-    method public void onFailure(@NonNull CharSequence);
-    method public void onSuccess(T);
-  }
-
-}
-
-package android.service.trust {
-
-  public class TrustAgentService extends android.app.Service {
-    ctor public TrustAgentService();
-    method public final void addEscrowToken(byte[], android.os.UserHandle);
-    method @Deprecated public final void grantTrust(CharSequence, long, boolean);
-    method public final void grantTrust(CharSequence, long, int);
-    method public final void isEscrowTokenActive(long, android.os.UserHandle);
-    method public final android.os.IBinder onBind(android.content.Intent);
-    method public boolean onConfigure(java.util.List<android.os.PersistableBundle>);
-    method public void onDeviceLocked();
-    method public void onDeviceUnlockLockout(long);
-    method public void onDeviceUnlocked();
-    method public void onEscrowTokenAdded(byte[], long, android.os.UserHandle);
-    method public void onEscrowTokenRemoved(long, boolean);
-    method public void onEscrowTokenStateReceived(long, int);
-    method public void onTrustTimeout();
-    method public void onUnlockAttempt(boolean);
-    method public final void removeEscrowToken(long, android.os.UserHandle);
-    method public final void revokeTrust();
-    method public final void setManagingTrust(boolean);
-    method public final void showKeyguardErrorMessage(@NonNull CharSequence);
-    method public final void unlockUserWithToken(long, byte[], android.os.UserHandle);
-    field public static final int FLAG_GRANT_TRUST_DISMISS_KEYGUARD = 2; // 0x2
-    field public static final int FLAG_GRANT_TRUST_INITIATED_BY_USER = 1; // 0x1
-    field public static final String SERVICE_INTERFACE = "android.service.trust.TrustAgentService";
-    field public static final int TOKEN_STATE_ACTIVE = 1; // 0x1
-    field public static final int TOKEN_STATE_INACTIVE = 0; // 0x0
-    field public static final String TRUST_AGENT_META_DATA = "android.service.trust.trustagent";
-  }
-
-}
-
-package android.service.voice {
-
-  public class AlwaysOnHotwordDetector {
-    method @Nullable public android.content.Intent createEnrollIntent();
-    method @Nullable public android.content.Intent createReEnrollIntent();
-    method @Nullable public android.content.Intent createUnEnrollIntent();
-    method @RequiresPermission(allOf={android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.CAPTURE_AUDIO_HOTWORD}) public int getParameter(int);
-    method public int getSupportedAudioCapabilities();
-    method public int getSupportedRecognitionModes();
-    method @Nullable @RequiresPermission(allOf={android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.CAPTURE_AUDIO_HOTWORD}) public android.service.voice.AlwaysOnHotwordDetector.ModelParamRange queryParameter(int);
-    method @RequiresPermission(allOf={android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.CAPTURE_AUDIO_HOTWORD}) public int setParameter(int, int);
-    method @RequiresPermission(allOf={android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.CAPTURE_AUDIO_HOTWORD}) public boolean startRecognition(int);
-    method @RequiresPermission(allOf={android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.CAPTURE_AUDIO_HOTWORD}) public boolean stopRecognition();
-    field public static final int AUDIO_CAPABILITY_ECHO_CANCELLATION = 1; // 0x1
-    field public static final int AUDIO_CAPABILITY_NOISE_SUPPRESSION = 2; // 0x2
-    field public static final int MODEL_PARAM_THRESHOLD_FACTOR = 0; // 0x0
-    field public static final int RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS = 2; // 0x2
-    field public static final int RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO = 1; // 0x1
-    field public static final int RECOGNITION_FLAG_ENABLE_AUDIO_ECHO_CANCELLATION = 4; // 0x4
-    field public static final int RECOGNITION_FLAG_ENABLE_AUDIO_NOISE_SUPPRESSION = 8; // 0x8
-    field public static final int RECOGNITION_MODE_USER_IDENTIFICATION = 2; // 0x2
-    field public static final int RECOGNITION_MODE_VOICE_TRIGGER = 1; // 0x1
-    field public static final int STATE_HARDWARE_UNAVAILABLE = -2; // 0xfffffffe
-    field public static final int STATE_KEYPHRASE_ENROLLED = 2; // 0x2
-    field public static final int STATE_KEYPHRASE_UNENROLLED = 1; // 0x1
-    field @Deprecated public static final int STATE_KEYPHRASE_UNSUPPORTED = -1; // 0xffffffff
-  }
-
-  public abstract static class AlwaysOnHotwordDetector.Callback {
-    ctor public AlwaysOnHotwordDetector.Callback();
-    method public abstract void onAvailabilityChanged(int);
-    method public abstract void onDetected(@NonNull android.service.voice.AlwaysOnHotwordDetector.EventPayload);
-    method public abstract void onError();
-    method public abstract void onRecognitionPaused();
-    method public abstract void onRecognitionResumed();
-  }
-
-  public static class AlwaysOnHotwordDetector.EventPayload {
-    method @Nullable public android.media.AudioFormat getCaptureAudioFormat();
-    method @Nullable public byte[] getTriggerAudio();
-  }
-
-  public static final class AlwaysOnHotwordDetector.ModelParamRange {
-    method public int getEnd();
-    method public int getStart();
-  }
-
-  public class VoiceInteractionService extends android.app.Service {
-    method @NonNull public final android.service.voice.AlwaysOnHotwordDetector createAlwaysOnHotwordDetector(String, java.util.Locale, android.service.voice.AlwaysOnHotwordDetector.Callback);
-    method @NonNull @RequiresPermission("android.permission.MANAGE_VOICE_KEYPHRASES") public final android.media.voice.KeyphraseModelManager createKeyphraseModelManager();
-  }
-
-}
-
-package android.service.wallpaper {
-
-  public class WallpaperService.Engine {
-    method public boolean isInAmbientMode();
-    method public void onAmbientModeChanged(boolean, long);
-  }
-
-}
-
-package android.service.watchdog {
-
-  public abstract class ExplicitHealthCheckService extends android.app.Service {
-    ctor public ExplicitHealthCheckService();
-    method public final void notifyHealthCheckPassed(@NonNull String);
-    method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent);
-    method public abstract void onCancelHealthCheck(@NonNull String);
-    method @NonNull public abstract java.util.List<java.lang.String> onGetRequestedPackages();
-    method @NonNull public abstract java.util.List<android.service.watchdog.ExplicitHealthCheckService.PackageConfig> onGetSupportedPackages();
-    method public abstract void onRequestHealthCheck(@NonNull String);
-    field public static final String BIND_PERMISSION = "android.permission.BIND_EXPLICIT_HEALTH_CHECK_SERVICE";
-    field public static final String SERVICE_INTERFACE = "android.service.watchdog.ExplicitHealthCheckService";
-  }
-
-  public static final class ExplicitHealthCheckService.PackageConfig implements android.os.Parcelable {
-    ctor public ExplicitHealthCheckService.PackageConfig(@NonNull String, long);
-    method public int describeContents();
-    method public long getHealthCheckTimeoutMillis();
-    method @NonNull public String getPackageName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.service.watchdog.ExplicitHealthCheckService.PackageConfig> CREATOR;
-  }
-
-}
-
-package android.telecom {
-
-  @Deprecated public class AudioState implements android.os.Parcelable {
-    ctor @Deprecated public AudioState(boolean, int, int);
-    ctor @Deprecated public AudioState(android.telecom.AudioState);
-    ctor @Deprecated public AudioState(android.telecom.CallAudioState);
-    method @Deprecated public static String audioRouteToString(int);
-    method @Deprecated public int describeContents();
-    method @Deprecated public int getRoute();
-    method @Deprecated public int getSupportedRouteMask();
-    method @Deprecated public boolean isMuted();
-    method @Deprecated public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.telecom.AudioState> CREATOR;
-    field @Deprecated public static final int ROUTE_BLUETOOTH = 2; // 0x2
-    field @Deprecated public static final int ROUTE_EARPIECE = 1; // 0x1
-    field @Deprecated public static final int ROUTE_SPEAKER = 8; // 0x8
-    field @Deprecated public static final int ROUTE_WIRED_HEADSET = 4; // 0x4
-    field @Deprecated public static final int ROUTE_WIRED_OR_EARPIECE = 5; // 0x5
-  }
-
-  public final class Call {
-    method @Deprecated public void addListener(android.telecom.Call.Listener);
-    method public void enterBackgroundAudioProcessing();
-    method public void exitBackgroundAudioProcessing(boolean);
-    method @Deprecated public void removeListener(android.telecom.Call.Listener);
-    field @Deprecated public static final int STATE_PRE_DIAL_WAIT = 8; // 0x8
-  }
-
-  @Deprecated public abstract static class Call.Listener extends android.telecom.Call.Callback {
-    ctor @Deprecated public Call.Listener();
-  }
-
-  public static class CallScreeningService.CallResponse.Builder {
-    method @NonNull @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_OUTPUT) public android.telecom.CallScreeningService.CallResponse.Builder setShouldScreenCallViaAudioProcessing(boolean);
-  }
-
-  public abstract class Conference extends android.telecom.Conferenceable {
-    method @Deprecated public final android.telecom.AudioState getAudioState();
-    method @Deprecated public final long getConnectTimeMillis();
-    method public android.telecom.Connection getPrimaryConnection();
-    method @NonNull public final String getTelecomCallId();
-    method @Deprecated public void onAudioStateChanged(android.telecom.AudioState);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public final void setAddress(@NonNull android.net.Uri, int);
-    method public final void setCallerDisplayName(@NonNull String, int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setConferenceState(boolean);
-    method @Deprecated public final void setConnectTimeMillis(long);
-  }
-
-  public abstract class Connection extends android.telecom.Conferenceable {
-    method @Deprecated public final android.telecom.AudioState getAudioState();
-    method @IntRange(from=0) public final long getConnectTimeMillis();
-    method public final long getConnectionStartElapsedRealtimeMillis();
-    method @Nullable public android.telecom.PhoneAccountHandle getPhoneAccountHandle();
-    method @Nullable public final String getTelecomCallId();
-    method @Deprecated public void onAudioStateChanged(android.telecom.AudioState);
-    method public final void resetConnectionTime();
-    method public void setCallDirection(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public final void setConnectTimeMillis(@IntRange(from=0) long);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public final void setConnectionStartElapsedRealtimeMillis(long);
-    method public void setPhoneAccountHandle(@NonNull android.telecom.PhoneAccountHandle);
-    method public void setTelecomCallId(@NonNull String);
-    field public static final int CAPABILITY_CONFERENCE_HAS_NO_CHILDREN = 2097152; // 0x200000
-    field public static final int CAPABILITY_SPEED_UP_MT_AUDIO = 262144; // 0x40000
-    field public static final String EXTRA_DISABLE_ADD_CALL = "android.telecom.extra.DISABLE_ADD_CALL";
-    field public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 1; // 0x1
-    field public static final int PROPERTY_GENERIC_CONFERENCE = 2; // 0x2
-    field public static final int PROPERTY_IS_DOWNGRADED_CONFERENCE = 64; // 0x40
-    field public static final int PROPERTY_REMOTELY_HOSTED = 2048; // 0x800
-  }
-
-  public final class ConnectionRequest implements android.os.Parcelable {
-    method @Nullable public String getTelecomCallId();
-  }
-
-  public abstract class ConnectionService extends android.app.Service {
-    method public final void addExistingConnection(@NonNull android.telecom.PhoneAccountHandle, @NonNull android.telecom.Connection, @NonNull android.telecom.Conference);
-  }
-
-  public abstract class InCallService extends android.app.Service {
-    method @Deprecated public android.telecom.Phone getPhone();
-    method @Deprecated public void onPhoneCreated(android.telecom.Phone);
-    method @Deprecated public void onPhoneDestroyed(android.telecom.Phone);
-  }
-
-  public class ParcelableCallAnalytics implements android.os.Parcelable {
-    ctor public ParcelableCallAnalytics(long, long, int, boolean, boolean, int, int, boolean, String, boolean, java.util.List<android.telecom.ParcelableCallAnalytics.AnalyticsEvent>, java.util.List<android.telecom.ParcelableCallAnalytics.EventTiming>);
-    ctor public ParcelableCallAnalytics(android.os.Parcel);
-    method public java.util.List<android.telecom.ParcelableCallAnalytics.AnalyticsEvent> analyticsEvents();
-    method public int describeContents();
-    method public long getCallDurationMillis();
-    method public int getCallTechnologies();
-    method public int getCallTerminationCode();
-    method public int getCallType();
-    method public String getConnectionService();
-    method public java.util.List<android.telecom.ParcelableCallAnalytics.EventTiming> getEventTimings();
-    method public long getStartTimeMillis();
-    method public boolean isAdditionalCall();
-    method public boolean isCreatedFromExistingConnection();
-    method public boolean isEmergencyCall();
-    method public boolean isInterrupted();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int CALLTYPE_INCOMING = 1; // 0x1
-    field public static final int CALLTYPE_OUTGOING = 2; // 0x2
-    field public static final int CALLTYPE_UNKNOWN = 0; // 0x0
-    field public static final int CDMA_PHONE = 1; // 0x1
-    field @NonNull public static final android.os.Parcelable.Creator<android.telecom.ParcelableCallAnalytics> CREATOR;
-    field public static final int GSM_PHONE = 2; // 0x2
-    field public static final int IMS_PHONE = 4; // 0x4
-    field public static final long MILLIS_IN_1_SECOND = 1000L; // 0x3e8L
-    field public static final long MILLIS_IN_5_MINUTES = 300000L; // 0x493e0L
-    field public static final int SIP_PHONE = 8; // 0x8
-    field public static final int STILL_CONNECTED = -1; // 0xffffffff
-    field public static final int THIRD_PARTY_PHONE = 16; // 0x10
-  }
-
-  public static final class ParcelableCallAnalytics.AnalyticsEvent implements android.os.Parcelable {
-    ctor public ParcelableCallAnalytics.AnalyticsEvent(int, long);
-    method public int describeContents();
-    method public int getEventName();
-    method public long getTimeSinceLastEvent();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int AUDIO_ROUTE_BT = 204; // 0xcc
-    field public static final int AUDIO_ROUTE_EARPIECE = 205; // 0xcd
-    field public static final int AUDIO_ROUTE_HEADSET = 206; // 0xce
-    field public static final int AUDIO_ROUTE_SPEAKER = 207; // 0xcf
-    field public static final int BIND_CS = 5; // 0x5
-    field public static final int BLOCK_CHECK_FINISHED = 105; // 0x69
-    field public static final int BLOCK_CHECK_INITIATED = 104; // 0x68
-    field public static final int CONFERENCE_WITH = 300; // 0x12c
-    field @NonNull public static final android.os.Parcelable.Creator<android.telecom.ParcelableCallAnalytics.AnalyticsEvent> CREATOR;
-    field public static final int CS_BOUND = 6; // 0x6
-    field public static final int DIRECT_TO_VM_FINISHED = 103; // 0x67
-    field public static final int DIRECT_TO_VM_INITIATED = 102; // 0x66
-    field public static final int FILTERING_COMPLETED = 107; // 0x6b
-    field public static final int FILTERING_INITIATED = 106; // 0x6a
-    field public static final int FILTERING_TIMED_OUT = 108; // 0x6c
-    field public static final int MUTE = 202; // 0xca
-    field public static final int REMOTELY_HELD = 402; // 0x192
-    field public static final int REMOTELY_UNHELD = 403; // 0x193
-    field public static final int REQUEST_ACCEPT = 7; // 0x7
-    field public static final int REQUEST_HOLD = 400; // 0x190
-    field public static final int REQUEST_PULL = 500; // 0x1f4
-    field public static final int REQUEST_REJECT = 8; // 0x8
-    field public static final int REQUEST_UNHOLD = 401; // 0x191
-    field public static final int SCREENING_COMPLETED = 101; // 0x65
-    field public static final int SCREENING_SENT = 100; // 0x64
-    field public static final int SET_ACTIVE = 1; // 0x1
-    field public static final int SET_DIALING = 4; // 0x4
-    field public static final int SET_DISCONNECTED = 2; // 0x2
-    field public static final int SET_HOLD = 404; // 0x194
-    field public static final int SET_PARENT = 302; // 0x12e
-    field public static final int SET_SELECT_PHONE_ACCOUNT = 0; // 0x0
-    field public static final int SILENCE = 201; // 0xc9
-    field public static final int SKIP_RINGING = 200; // 0xc8
-    field public static final int SPLIT_CONFERENCE = 301; // 0x12d
-    field public static final int START_CONNECTION = 3; // 0x3
-    field public static final int SWAP = 405; // 0x195
-    field public static final int UNMUTE = 203; // 0xcb
-  }
-
-  public static final class ParcelableCallAnalytics.EventTiming implements android.os.Parcelable {
-    ctor public ParcelableCallAnalytics.EventTiming(int, long);
-    method public int describeContents();
-    method public int getName();
-    method public long getTime();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int ACCEPT_TIMING = 0; // 0x0
-    field public static final int BIND_CS_TIMING = 6; // 0x6
-    field public static final int BLOCK_CHECK_FINISHED_TIMING = 9; // 0x9
-    field @NonNull public static final android.os.Parcelable.Creator<android.telecom.ParcelableCallAnalytics.EventTiming> CREATOR;
-    field public static final int DIRECT_TO_VM_FINISHED_TIMING = 8; // 0x8
-    field public static final int DISCONNECT_TIMING = 2; // 0x2
-    field public static final int FILTERING_COMPLETED_TIMING = 10; // 0xa
-    field public static final int FILTERING_TIMED_OUT_TIMING = 11; // 0xb
-    field public static final int HOLD_TIMING = 3; // 0x3
-    field public static final int INVALID = 999999; // 0xf423f
-    field public static final int OUTGOING_TIME_TO_DIALING_TIMING = 5; // 0x5
-    field public static final int REJECT_TIMING = 1; // 0x1
-    field public static final int SCREENING_COMPLETED_TIMING = 7; // 0x7
-    field public static final int UNHOLD_TIMING = 4; // 0x4
-  }
-
-  @Deprecated public final class Phone {
-    method @Deprecated public void addListener(android.telecom.Phone.Listener);
-    method @Deprecated public boolean canAddCall();
-    method @Deprecated public android.telecom.AudioState getAudioState();
-    method @Deprecated public android.telecom.CallAudioState getCallAudioState();
-    method @Deprecated public java.util.List<android.telecom.Call> getCalls();
-    method @Deprecated public void removeListener(android.telecom.Phone.Listener);
-    method @Deprecated public void requestBluetoothAudio(String);
-    method @Deprecated public void setAudioRoute(int);
-    method @Deprecated public void setMuted(boolean);
-  }
-
-  @Deprecated public abstract static class Phone.Listener {
-    ctor @Deprecated public Phone.Listener();
-    method @Deprecated public void onAudioStateChanged(android.telecom.Phone, android.telecom.AudioState);
-    method @Deprecated public void onBringToForeground(android.telecom.Phone, boolean);
-    method @Deprecated public void onCallAdded(android.telecom.Phone, android.telecom.Call);
-    method @Deprecated public void onCallAudioStateChanged(android.telecom.Phone, android.telecom.CallAudioState);
-    method @Deprecated public void onCallRemoved(android.telecom.Phone, android.telecom.Call);
-    method @Deprecated public void onCanAddCallChanged(android.telecom.Phone, boolean);
-    method @Deprecated public void onSilenceRinger(android.telecom.Phone);
-  }
-
-  public final class PhoneAccount implements android.os.Parcelable {
-    field public static final int CAPABILITY_EMERGENCY_CALLS_ONLY = 128; // 0x80
-    field public static final int CAPABILITY_EMERGENCY_PREFERRED = 8192; // 0x2000
-    field public static final int CAPABILITY_EMERGENCY_VIDEO_CALLING = 512; // 0x200
-    field public static final int CAPABILITY_MULTI_USER = 32; // 0x20
-    field public static final String EXTRA_PLAY_CALL_RECORDING_TONE = "android.telecom.extra.PLAY_CALL_RECORDING_TONE";
-    field public static final String EXTRA_SORT_ORDER = "android.telecom.extra.SORT_ORDER";
-  }
-
-  public static class PhoneAccount.Builder {
-    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telecom.PhoneAccount.Builder setGroupId(@NonNull String);
-  }
-
-  public class PhoneAccountSuggestionService extends android.app.Service {
-    ctor public PhoneAccountSuggestionService();
-    method public void onAccountSuggestionRequest(@NonNull String);
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public final void suggestPhoneAccounts(@NonNull String, @NonNull java.util.List<android.telecom.PhoneAccountSuggestion>);
-    field public static final String SERVICE_INTERFACE = "android.telecom.PhoneAccountSuggestionService";
-  }
-
-  public final class RemoteConference {
-    method @Deprecated public void setAudioState(android.telecom.AudioState);
-  }
-
-  public final class RemoteConnection {
-    method @Deprecated public void setAudioState(android.telecom.AudioState);
-  }
-
-  public final class StatusHints implements android.os.Parcelable {
-    ctor @Deprecated public StatusHints(android.content.ComponentName, CharSequence, int, android.os.Bundle);
-    method @Deprecated public android.graphics.drawable.Drawable getIcon(android.content.Context);
-    method @Deprecated public int getIconResId();
-    method @Deprecated public android.content.ComponentName getPackageName();
-  }
-
-  public final class TelecomAnalytics implements android.os.Parcelable {
-    ctor public TelecomAnalytics(java.util.List<android.telecom.TelecomAnalytics.SessionTiming>, java.util.List<android.telecom.ParcelableCallAnalytics>);
-    method public int describeContents();
-    method public java.util.List<android.telecom.ParcelableCallAnalytics> getCallAnalytics();
-    method public java.util.List<android.telecom.TelecomAnalytics.SessionTiming> getSessionTimings();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telecom.TelecomAnalytics> CREATOR;
-  }
-
-  public static final class TelecomAnalytics.SessionTiming implements android.os.Parcelable {
-    ctor public TelecomAnalytics.SessionTiming(int, long);
-    method public int describeContents();
-    method public Integer getKey();
-    method public long getTime();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telecom.TelecomAnalytics.SessionTiming> CREATOR;
-    field public static final int CSW_ADD_CONFERENCE_CALL = 108; // 0x6c
-    field public static final int CSW_HANDLE_CREATE_CONNECTION_COMPLETE = 100; // 0x64
-    field public static final int CSW_REMOVE_CALL = 106; // 0x6a
-    field public static final int CSW_SET_ACTIVE = 101; // 0x65
-    field public static final int CSW_SET_DIALING = 103; // 0x67
-    field public static final int CSW_SET_DISCONNECTED = 104; // 0x68
-    field public static final int CSW_SET_IS_CONFERENCED = 107; // 0x6b
-    field public static final int CSW_SET_ON_HOLD = 105; // 0x69
-    field public static final int CSW_SET_RINGING = 102; // 0x66
-    field public static final int ICA_ANSWER_CALL = 1; // 0x1
-    field public static final int ICA_CONFERENCE = 8; // 0x8
-    field public static final int ICA_DISCONNECT_CALL = 3; // 0x3
-    field public static final int ICA_HOLD_CALL = 4; // 0x4
-    field public static final int ICA_MUTE = 6; // 0x6
-    field public static final int ICA_REJECT_CALL = 2; // 0x2
-    field public static final int ICA_SET_AUDIO_ROUTE = 7; // 0x7
-    field public static final int ICA_UNHOLD_CALL = 5; // 0x5
-  }
-
-  public class TelecomManager {
-    method public void addNewUnknownCall(android.telecom.PhoneAccountHandle, android.os.Bundle);
-    method @Deprecated public void clearAccounts();
-    method public void clearPhoneAccounts();
-    method @NonNull public android.content.Intent createLaunchEmergencyDialerIntent(@Nullable String);
-    method @RequiresPermission(android.Manifest.permission.DUMP) public android.telecom.TelecomAnalytics dumpAnalytics();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void enablePhoneAccount(android.telecom.PhoneAccountHandle, boolean);
-    method public java.util.List<android.telecom.PhoneAccountHandle> getAllPhoneAccountHandles();
-    method public java.util.List<android.telecom.PhoneAccount> getAllPhoneAccounts();
-    method public int getAllPhoneAccountsCount();
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<android.telecom.PhoneAccountHandle> getCallCapablePhoneAccounts(boolean);
-    method public int getCallState();
-    method public android.telecom.PhoneAccountHandle getConnectionManager();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getCurrentTtyMode();
-    method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getDefaultDialerPackage(@NonNull android.os.UserHandle);
-    method @Deprecated public android.content.ComponentName getDefaultPhoneApp();
-    method @Deprecated public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsForPackage();
-    method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsSupportingScheme(String);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isInEmergencyCall();
-    method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRinging();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUserSelectedOutgoingPhoneAccount(@Nullable android.telecom.PhoneAccountHandle);
-    field public static final String ACTION_CURRENT_TTY_MODE_CHANGED = "android.telecom.action.CURRENT_TTY_MODE_CHANGED";
-    field public static final String ACTION_TTY_PREFERRED_MODE_CHANGED = "android.telecom.action.TTY_PREFERRED_MODE_CHANGED";
-    field public static final int CALL_SOURCE_EMERGENCY_DIALPAD = 1; // 0x1
-    field public static final int CALL_SOURCE_EMERGENCY_SHORTCUT = 2; // 0x2
-    field public static final int CALL_SOURCE_UNSPECIFIED = 0; // 0x0
-    field public static final String EXTRA_CALL_BACK_INTENT = "android.telecom.extra.CALL_BACK_INTENT";
-    field public static final String EXTRA_CALL_SOURCE = "android.telecom.extra.CALL_SOURCE";
-    field public static final String EXTRA_CALL_TECHNOLOGY_TYPE = "android.telecom.extra.CALL_TECHNOLOGY_TYPE";
-    field public static final String EXTRA_CLEAR_MISSED_CALLS_INTENT = "android.telecom.extra.CLEAR_MISSED_CALLS_INTENT";
-    field public static final String EXTRA_CONNECTION_SERVICE = "android.telecom.extra.CONNECTION_SERVICE";
-    field public static final String EXTRA_CURRENT_TTY_MODE = "android.telecom.extra.CURRENT_TTY_MODE";
-    field public static final String EXTRA_IS_USER_INTENT_EMERGENCY_CALL = "android.telecom.extra.IS_USER_INTENT_EMERGENCY_CALL";
-    field public static final String EXTRA_TTY_PREFERRED_MODE = "android.telecom.extra.TTY_PREFERRED_MODE";
-    field public static final String EXTRA_UNKNOWN_CALL_HANDLE = "android.telecom.extra.UNKNOWN_CALL_HANDLE";
-    field public static final int TTY_MODE_FULL = 1; // 0x1
-    field public static final int TTY_MODE_HCO = 2; // 0x2
-    field public static final int TTY_MODE_OFF = 0; // 0x0
-    field public static final int TTY_MODE_VCO = 3; // 0x3
-  }
-
-}
-
-package android.telephony {
-
-  public final class AccessNetworkConstants {
-    field public static final int TRANSPORT_TYPE_INVALID = -1; // 0xffffffff
-  }
-
-  public static final class AccessNetworkConstants.NgranBands {
-    method public static int getFrequencyRangeGroup(int);
-    field public static final int FREQUENCY_RANGE_GROUP_1 = 1; // 0x1
-    field public static final int FREQUENCY_RANGE_GROUP_2 = 2; // 0x2
-    field public static final int FREQUENCY_RANGE_GROUP_UNKNOWN = 0; // 0x0
-  }
-
-  public final class BarringInfo implements android.os.Parcelable {
-    ctor public BarringInfo();
-    method @NonNull public android.telephony.BarringInfo createLocationInfoSanitizedCopy();
-  }
-
-  public final class CallAttributes implements android.os.Parcelable {
-    ctor public CallAttributes(@NonNull android.telephony.PreciseCallState, int, @NonNull android.telephony.CallQuality);
-    method public int describeContents();
-    method @NonNull public android.telephony.CallQuality getCallQuality();
-    method public int getNetworkType();
-    method @NonNull public android.telephony.PreciseCallState getPreciseCallState();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CallAttributes> CREATOR;
-  }
-
-  public final class CallForwardingInfo implements android.os.Parcelable {
-    ctor public CallForwardingInfo(boolean, int, @Nullable String, int);
-    method public int describeContents();
-    method @Nullable public String getNumber();
-    method public int getReason();
-    method public int getTimeoutSeconds();
-    method public boolean isEnabled();
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CallForwardingInfo> CREATOR;
-    field public static final int REASON_ALL = 4; // 0x4
-    field public static final int REASON_ALL_CONDITIONAL = 5; // 0x5
-    field public static final int REASON_BUSY = 1; // 0x1
-    field public static final int REASON_NOT_REACHABLE = 3; // 0x3
-    field public static final int REASON_NO_REPLY = 2; // 0x2
-    field public static final int REASON_UNCONDITIONAL = 0; // 0x0
-  }
-
-  public final class CallQuality implements android.os.Parcelable {
-    ctor public CallQuality(int, int, int, int, int, int, int, int, int, int, int);
-    ctor public CallQuality(int, int, int, int, int, int, int, int, int, int, int, boolean, boolean, boolean);
-    method public int describeContents();
-    method public int getAverageRelativeJitter();
-    method public int getAverageRoundTripTime();
-    method public int getCallDuration();
-    method public int getCodecType();
-    method public int getDownlinkCallQualityLevel();
-    method public int getMaxRelativeJitter();
-    method public int getNumRtpPacketsNotReceived();
-    method public int getNumRtpPacketsReceived();
-    method public int getNumRtpPacketsTransmitted();
-    method public int getNumRtpPacketsTransmittedLost();
-    method public int getUplinkCallQualityLevel();
-    method public boolean isIncomingSilenceDetectedAtCallSetup();
-    method public boolean isOutgoingSilenceDetectedAtCallSetup();
-    method public boolean isRtpInactivityDetected();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int CALL_QUALITY_BAD = 4; // 0x4
-    field public static final int CALL_QUALITY_EXCELLENT = 0; // 0x0
-    field public static final int CALL_QUALITY_FAIR = 2; // 0x2
-    field public static final int CALL_QUALITY_GOOD = 1; // 0x1
-    field public static final int CALL_QUALITY_NOT_AVAILABLE = 5; // 0x5
-    field public static final int CALL_QUALITY_POOR = 3; // 0x3
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CallQuality> CREATOR;
-  }
-
-  public class CarrierConfigManager {
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getDefaultCarrierServicePackageName();
-    method @NonNull public static android.os.PersistableBundle getDefaultConfig();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void overrideConfig(int, @Nullable android.os.PersistableBundle);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void updateConfigForPhoneId(int, String);
-    field public static final String KEY_CARRIER_SETUP_APP_STRING = "carrier_setup_app_string";
-    field public static final String KEY_SUPPORT_CDMA_1X_VOICE_CALLS_BOOL = "support_cdma_1x_voice_calls_bool";
-  }
-
-  public static final class CarrierConfigManager.Wifi {
-    field public static final String KEY_HOTSPOT_MAX_CLIENT_COUNT = "wifi.hotspot_maximum_client_count";
-    field public static final String KEY_PREFIX = "wifi.";
-  }
-
-  public final class CarrierRestrictionRules implements android.os.Parcelable {
-    method @NonNull public java.util.List<java.lang.Boolean> areCarrierIdentifiersAllowed(@NonNull java.util.List<android.service.carrier.CarrierIdentifier>);
-    method public int describeContents();
-    method @NonNull public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers();
-    method public int getDefaultCarrierRestriction();
-    method @NonNull public java.util.List<android.service.carrier.CarrierIdentifier> getExcludedCarriers();
-    method public int getMultiSimPolicy();
-    method public boolean isAllCarriersAllowed();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int CARRIER_RESTRICTION_DEFAULT_ALLOWED = 1; // 0x1
-    field public static final int CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED = 0; // 0x0
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CarrierRestrictionRules> CREATOR;
-    field public static final int MULTISIM_POLICY_NONE = 0; // 0x0
-    field public static final int MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT = 1; // 0x1
-  }
-
-  public static final class CarrierRestrictionRules.Builder {
-    ctor public CarrierRestrictionRules.Builder();
-    method @NonNull public android.telephony.CarrierRestrictionRules build();
-    method @NonNull public android.telephony.CarrierRestrictionRules.Builder setAllCarriersAllowed();
-    method @NonNull public android.telephony.CarrierRestrictionRules.Builder setAllowedCarriers(@NonNull java.util.List<android.service.carrier.CarrierIdentifier>);
-    method @NonNull public android.telephony.CarrierRestrictionRules.Builder setDefaultCarrierRestriction(int);
-    method @NonNull public android.telephony.CarrierRestrictionRules.Builder setExcludedCarriers(@NonNull java.util.List<android.service.carrier.CarrierIdentifier>);
-    method @NonNull public android.telephony.CarrierRestrictionRules.Builder setMultiSimPolicy(int);
-  }
-
-  public class CbGeoUtils {
-  }
-
-  public static class CbGeoUtils.Circle implements android.telephony.CbGeoUtils.Geometry {
-    ctor public CbGeoUtils.Circle(@NonNull android.telephony.CbGeoUtils.LatLng, double);
-    method public boolean contains(@NonNull android.telephony.CbGeoUtils.LatLng);
-    method @NonNull public android.telephony.CbGeoUtils.LatLng getCenter();
-    method public double getRadius();
-  }
-
-  public static interface CbGeoUtils.Geometry {
-    method public boolean contains(@NonNull android.telephony.CbGeoUtils.LatLng);
-  }
-
-  public static class CbGeoUtils.LatLng {
-    ctor public CbGeoUtils.LatLng(double, double);
-    method public double distance(@NonNull android.telephony.CbGeoUtils.LatLng);
-    method @NonNull public android.telephony.CbGeoUtils.LatLng subtract(@NonNull android.telephony.CbGeoUtils.LatLng);
-    field public final double lat;
-    field public final double lng;
-  }
-
-  public static class CbGeoUtils.Polygon implements android.telephony.CbGeoUtils.Geometry {
-    ctor public CbGeoUtils.Polygon(@NonNull java.util.List<android.telephony.CbGeoUtils.LatLng>);
-    method public boolean contains(@NonNull android.telephony.CbGeoUtils.LatLng);
-    method @NonNull public java.util.List<android.telephony.CbGeoUtils.LatLng> getVertices();
-  }
-
-  public class CellBroadcastIntents {
-    method public static void sendSmsCbReceivedBroadcast(@NonNull android.content.Context, @Nullable android.os.UserHandle, @NonNull android.telephony.SmsCbMessage, @Nullable android.content.BroadcastReceiver, @Nullable android.os.Handler, int, int);
-    field public static final String ACTION_AREA_INFO_UPDATED = "android.telephony.action.AREA_INFO_UPDATED";
-  }
-
-  public abstract class CellBroadcastService extends android.app.Service {
-    ctor public CellBroadcastService();
-    method @NonNull @WorkerThread public abstract CharSequence getCellBroadcastAreaInfo(int);
-    method @CallSuper public android.os.IBinder onBind(@Nullable android.content.Intent);
-    method public abstract void onCdmaCellBroadcastSms(int, @NonNull byte[], int);
-    method public abstract void onCdmaScpMessage(int, @NonNull java.util.List<android.telephony.cdma.CdmaSmsCbProgramData>, @NonNull String, @NonNull java.util.function.Consumer<android.os.Bundle>);
-    method public abstract void onGsmCellBroadcastSms(int, @NonNull byte[]);
-    field public static final String CELL_BROADCAST_SERVICE_INTERFACE = "android.telephony.CellBroadcastService";
-  }
-
-  public abstract class CellIdentity implements android.os.Parcelable {
-    method @NonNull public abstract android.telephony.CellLocation asCellLocation();
-    method @NonNull public abstract android.telephony.CellIdentity sanitizeLocationInfo();
-  }
-
-  public final class CellIdentityCdma extends android.telephony.CellIdentity {
-    method @NonNull public android.telephony.cdma.CdmaCellLocation asCellLocation();
-    method @NonNull public android.telephony.CellIdentityCdma sanitizeLocationInfo();
-  }
-
-  public final class CellIdentityGsm extends android.telephony.CellIdentity {
-    method @NonNull public android.telephony.gsm.GsmCellLocation asCellLocation();
-    method @NonNull public android.telephony.CellIdentityGsm sanitizeLocationInfo();
-  }
-
-  public final class CellIdentityLte extends android.telephony.CellIdentity {
-    method @NonNull public android.telephony.gsm.GsmCellLocation asCellLocation();
-    method @NonNull public android.telephony.CellIdentityLte sanitizeLocationInfo();
-  }
-
-  public final class CellIdentityNr extends android.telephony.CellIdentity {
-    method @NonNull public android.telephony.CellLocation asCellLocation();
-    method @NonNull public android.telephony.CellIdentityNr sanitizeLocationInfo();
-  }
-
-  public final class CellIdentityTdscdma extends android.telephony.CellIdentity {
-    method @NonNull public android.telephony.gsm.GsmCellLocation asCellLocation();
-    method @NonNull public android.telephony.CellIdentityTdscdma sanitizeLocationInfo();
-  }
-
-  public final class CellIdentityWcdma extends android.telephony.CellIdentity {
-    method @NonNull public android.telephony.gsm.GsmCellLocation asCellLocation();
-    method @NonNull public android.telephony.CellIdentityWcdma sanitizeLocationInfo();
-  }
-
-  public final class DataFailCause {
-    field @Deprecated public static final int VSNCP_APN_UNATHORIZED = 2238; // 0x8be
-  }
-
-  public final class DataSpecificRegistrationInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.telephony.LteVopsSupportInfo getLteVopsSupportInfo();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.DataSpecificRegistrationInfo> CREATOR;
-  }
-
-  public final class ImsiEncryptionInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public String getKeyIdentifier();
-    method @Nullable public java.security.PublicKey getPublicKey();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ImsiEncryptionInfo> CREATOR;
-  }
-
-  public final class LteVopsSupportInfo implements android.os.Parcelable {
-    ctor public LteVopsSupportInfo(int, int);
-    method public int describeContents();
-    method public int getEmcBearerSupport();
-    method public int getVopsSupport();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.LteVopsSupportInfo> CREATOR;
-    field public static final int LTE_STATUS_NOT_AVAILABLE = 1; // 0x1
-    field public static final int LTE_STATUS_NOT_SUPPORTED = 3; // 0x3
-    field public static final int LTE_STATUS_SUPPORTED = 2; // 0x2
-  }
-
-  public class MbmsDownloadSession implements java.lang.AutoCloseable {
-    field public static final String MBMS_DOWNLOAD_SERVICE_ACTION = "android.telephony.action.EmbmsDownload";
-  }
-
-  public class MbmsGroupCallSession implements java.lang.AutoCloseable {
-    field public static final String MBMS_GROUP_CALL_SERVICE_ACTION = "android.telephony.action.EmbmsGroupCall";
-  }
-
-  public class MbmsStreamingSession implements java.lang.AutoCloseable {
-    field public static final String MBMS_STREAMING_SERVICE_ACTION = "android.telephony.action.EmbmsStreaming";
-  }
-
-  public final class ModemActivityInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.telephony.ModemActivityInfo getDelta(@NonNull android.telephony.ModemActivityInfo);
-    method public long getIdleTimeMillis();
-    method public static int getNumTxPowerLevels();
-    method public long getReceiveTimeMillis();
-    method public long getSleepTimeMillis();
-    method public long getTimestampMillis();
-    method public long getTransmitDurationMillisAtPowerLevel(int);
-    method @NonNull public android.util.Range<java.lang.Integer> getTransmitPowerRange(int);
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ModemActivityInfo> CREATOR;
-    field public static final int TX_POWER_LEVEL_0 = 0; // 0x0
-    field public static final int TX_POWER_LEVEL_1 = 1; // 0x1
-    field public static final int TX_POWER_LEVEL_2 = 2; // 0x2
-    field public static final int TX_POWER_LEVEL_3 = 3; // 0x3
-    field public static final int TX_POWER_LEVEL_4 = 4; // 0x4
-  }
-
-  public final class NetworkRegistrationInfo implements android.os.Parcelable {
-    method @Nullable public android.telephony.DataSpecificRegistrationInfo getDataSpecificInfo();
-    method public int getRegistrationState();
-    method public int getRejectCause();
-    method public int getRoamingType();
-    method public boolean isEmergencyEnabled();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int REGISTRATION_STATE_DENIED = 3; // 0x3
-    field public static final int REGISTRATION_STATE_HOME = 1; // 0x1
-    field public static final int REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING = 0; // 0x0
-    field public static final int REGISTRATION_STATE_NOT_REGISTERED_SEARCHING = 2; // 0x2
-    field public static final int REGISTRATION_STATE_ROAMING = 5; // 0x5
-    field public static final int REGISTRATION_STATE_UNKNOWN = 4; // 0x4
-  }
-
-  public static final class NetworkRegistrationInfo.Builder {
-    ctor public NetworkRegistrationInfo.Builder();
-    method @NonNull public android.telephony.NetworkRegistrationInfo build();
-    method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setAccessNetworkTechnology(int);
-    method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setAvailableServices(@NonNull java.util.List<java.lang.Integer>);
-    method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setCellIdentity(@Nullable android.telephony.CellIdentity);
-    method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setDomain(int);
-    method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setEmergencyOnly(boolean);
-    method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setRegisteredPlmn(@Nullable String);
-    method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setRegistrationState(int);
-    method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setRejectCause(int);
-    method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setTransportType(int);
-  }
-
-  public abstract class NetworkService extends android.app.Service {
-    ctor public NetworkService();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method @Nullable public abstract android.telephony.NetworkService.NetworkServiceProvider onCreateNetworkServiceProvider(int);
-    field public static final String SERVICE_INTERFACE = "android.telephony.NetworkService";
-  }
-
-  public abstract class NetworkService.NetworkServiceProvider implements java.lang.AutoCloseable {
-    ctor public NetworkService.NetworkServiceProvider(int);
-    method public abstract void close();
-    method public final int getSlotIndex();
-    method public final void notifyNetworkRegistrationInfoChanged();
-    method public void requestNetworkRegistrationInfo(int, @NonNull android.telephony.NetworkServiceCallback);
-  }
-
-  public class NetworkServiceCallback {
-    method public void onRequestNetworkRegistrationInfoComplete(int, @Nullable android.telephony.NetworkRegistrationInfo);
-    field public static final int RESULT_ERROR_BUSY = 3; // 0x3
-    field public static final int RESULT_ERROR_FAILED = 5; // 0x5
-    field public static final int RESULT_ERROR_ILLEGAL_STATE = 4; // 0x4
-    field public static final int RESULT_ERROR_INVALID_ARG = 2; // 0x2
-    field public static final int RESULT_ERROR_UNSUPPORTED = 1; // 0x1
-    field public static final int RESULT_SUCCESS = 0; // 0x0
-  }
-
-  public interface NumberVerificationCallback {
-    method public default void onCallReceived(@NonNull String);
-    method public default void onVerificationFailed(int);
-    field public static final int REASON_CONCURRENT_REQUESTS = 4; // 0x4
-    field public static final int REASON_IN_ECBM = 5; // 0x5
-    field public static final int REASON_IN_EMERGENCY_CALL = 6; // 0x6
-    field public static final int REASON_NETWORK_NOT_AVAILABLE = 2; // 0x2
-    field public static final int REASON_TIMED_OUT = 1; // 0x1
-    field public static final int REASON_TOO_MANY_CALLS = 3; // 0x3
-    field public static final int REASON_UNSPECIFIED = 0; // 0x0
-  }
-
-  public final class PhoneNumberRange implements android.os.Parcelable {
-    ctor public PhoneNumberRange(@NonNull String, @NonNull String, @NonNull String, @NonNull String);
-    method public int describeContents();
-    method public boolean matches(@NonNull String);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PhoneNumberRange> CREATOR;
-  }
-
-  public class PhoneNumberUtils {
-    method @NonNull public static String getUsernameFromUriNumber(@NonNull String);
-    method public static boolean isUriNumber(@Nullable String);
-    method public static boolean isVoiceMailNumber(@NonNull android.content.Context, int, @Nullable String);
-  }
-
-  public class PhoneStateListener {
-    method public void onCallAttributesChanged(@NonNull android.telephony.CallAttributes);
-    method @Deprecated public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber);
-    method public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber, int);
-    method @Deprecated public void onOutgoingEmergencySms(@NonNull android.telephony.emergency.EmergencyNumber);
-    method public void onOutgoingEmergencySms(@NonNull android.telephony.emergency.EmergencyNumber, int);
-    method public void onPhysicalChannelConfigurationChanged(@NonNull java.util.List<android.telephony.PhysicalChannelConfig>);
-    method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseCallStateChanged(@NonNull android.telephony.PreciseCallState);
-    method public void onRadioPowerStateChanged(int);
-    method public void onSrvccStateChanged(int);
-    method public void onVoiceActivationStateChanged(int);
-    field @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public static final int LISTEN_CALL_ATTRIBUTES_CHANGED = 67108864; // 0x4000000
-    field @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_CALL = 268435456; // 0x10000000
-    field @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_SMS = 536870912; // 0x20000000
-    field @RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE) public static final long LISTEN_PHYSICAL_CHANNEL_CONFIGURATION = 4294967296L; // 0x100000000L
-    field @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public static final int LISTEN_PRECISE_CALL_STATE = 2048; // 0x800
-    field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final int LISTEN_RADIO_POWER_STATE_CHANGED = 8388608; // 0x800000
-    field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final int LISTEN_SRVCC_STATE_CHANGED = 16384; // 0x4000
-    field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final int LISTEN_VOICE_ACTIVATION_STATE = 131072; // 0x20000
-  }
-
-  public final class PhysicalChannelConfig implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getCellBandwidthDownlink();
-    method public int getChannelNumber();
-    method public int getConnectionStatus();
-    method public int getNetworkType();
-    method @IntRange(from=0, to=1007) public int getPhysicalCellId();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field public static final int CHANNEL_NUMBER_UNKNOWN = -1; // 0xffffffff
-    field public static final int CONNECTION_PRIMARY_SERVING = 1; // 0x1
-    field public static final int CONNECTION_SECONDARY_SERVING = 2; // 0x2
-    field public static final int CONNECTION_UNKNOWN = -1; // 0xffffffff
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PhysicalChannelConfig> CREATOR;
-    field public static final int PHYSICAL_CELL_ID_UNKNOWN = -1; // 0xffffffff
-  }
-
-  public final class PreciseCallState implements android.os.Parcelable {
-    ctor public PreciseCallState(int, int, int, int, int);
-    method public int describeContents();
-    method public int getBackgroundCallState();
-    method public int getForegroundCallState();
-    method public int getRingingCallState();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PreciseCallState> CREATOR;
-    field public static final int PRECISE_CALL_STATE_ACTIVE = 1; // 0x1
-    field public static final int PRECISE_CALL_STATE_ALERTING = 4; // 0x4
-    field public static final int PRECISE_CALL_STATE_DIALING = 3; // 0x3
-    field public static final int PRECISE_CALL_STATE_DISCONNECTED = 7; // 0x7
-    field public static final int PRECISE_CALL_STATE_DISCONNECTING = 8; // 0x8
-    field public static final int PRECISE_CALL_STATE_HOLDING = 2; // 0x2
-    field public static final int PRECISE_CALL_STATE_IDLE = 0; // 0x0
-    field public static final int PRECISE_CALL_STATE_INCOMING = 5; // 0x5
-    field public static final int PRECISE_CALL_STATE_NOT_VALID = -1; // 0xffffffff
-    field public static final int PRECISE_CALL_STATE_WAITING = 6; // 0x6
-  }
-
-  public final class PreciseDataConnectionState implements android.os.Parcelable {
-    method @Deprecated @NonNull public String getDataConnectionApn();
-    method @Deprecated public int getDataConnectionApnTypeBitMask();
-    method @Deprecated public int getDataConnectionFailCause();
-    method @Deprecated public int getDataConnectionState();
-    method public int getId();
-  }
-
-  public final class PreciseDisconnectCause {
-    field public static final int ACCESS_CLASS_BLOCKED = 260; // 0x104
-    field public static final int ACCESS_INFORMATION_DISCARDED = 43; // 0x2b
-    field public static final int ACM_LIMIT_EXCEEDED = 68; // 0x44
-    field public static final int BEARER_CAPABILITY_NOT_AUTHORIZED = 57; // 0x39
-    field public static final int BEARER_NOT_AVAIL = 58; // 0x3a
-    field public static final int BEARER_SERVICE_NOT_IMPLEMENTED = 65; // 0x41
-    field public static final int BUSY = 17; // 0x11
-    field public static final int CALL_BARRED = 240; // 0xf0
-    field public static final int CALL_REJECTED = 21; // 0x15
-    field public static final int CDMA_ACCESS_BLOCKED = 1009; // 0x3f1
-    field public static final int CDMA_ACCESS_FAILURE = 1006; // 0x3ee
-    field public static final int CDMA_DROP = 1001; // 0x3e9
-    field public static final int CDMA_INTERCEPT = 1002; // 0x3ea
-    field public static final int CDMA_LOCKED_UNTIL_POWER_CYCLE = 1000; // 0x3e8
-    field public static final int CDMA_NOT_EMERGENCY = 1008; // 0x3f0
-    field public static final int CDMA_PREEMPTED = 1007; // 0x3ef
-    field public static final int CDMA_REORDER = 1003; // 0x3eb
-    field public static final int CDMA_RETRY_ORDER = 1005; // 0x3ed
-    field public static final int CDMA_SO_REJECT = 1004; // 0x3ec
-    field public static final int CHANNEL_NOT_AVAIL = 44; // 0x2c
-    field public static final int CHANNEL_UNACCEPTABLE = 6; // 0x6
-    field public static final int CONDITIONAL_IE_ERROR = 100; // 0x64
-    field public static final int DESTINATION_OUT_OF_ORDER = 27; // 0x1b
-    field public static final int ERROR_UNSPECIFIED = 65535; // 0xffff
-    field public static final int FACILITY_REJECTED = 29; // 0x1d
-    field public static final int FDN_BLOCKED = 241; // 0xf1
-    field public static final int IMEI_NOT_ACCEPTED = 243; // 0xf3
-    field public static final int IMSI_UNKNOWN_IN_VLR = 242; // 0xf2
-    field public static final int INCOMING_CALLS_BARRED_WITHIN_CUG = 55; // 0x37
-    field public static final int INCOMPATIBLE_DESTINATION = 88; // 0x58
-    field public static final int INFORMATION_ELEMENT_NON_EXISTENT = 99; // 0x63
-    field public static final int INTERWORKING_UNSPECIFIED = 127; // 0x7f
-    field public static final int INVALID_MANDATORY_INFORMATION = 96; // 0x60
-    field public static final int INVALID_NUMBER_FORMAT = 28; // 0x1c
-    field public static final int INVALID_TRANSACTION_IDENTIFIER = 81; // 0x51
-    field public static final int MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE = 101; // 0x65
-    field public static final int MESSAGE_TYPE_NON_IMPLEMENTED = 97; // 0x61
-    field public static final int MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE = 98; // 0x62
-    field public static final int NETWORK_DETACH = 261; // 0x105
-    field public static final int NETWORK_OUT_OF_ORDER = 38; // 0x26
-    field public static final int NETWORK_REJECT = 252; // 0xfc
-    field public static final int NETWORK_RESP_TIMEOUT = 251; // 0xfb
-    field public static final int NORMAL = 16; // 0x10
-    field public static final int NORMAL_UNSPECIFIED = 31; // 0x1f
-    field public static final int NOT_VALID = -1; // 0xffffffff
-    field public static final int NO_ANSWER_FROM_USER = 19; // 0x13
-    field public static final int NO_CIRCUIT_AVAIL = 34; // 0x22
-    field public static final int NO_DISCONNECT_CAUSE_AVAILABLE = 0; // 0x0
-    field public static final int NO_ROUTE_TO_DESTINATION = 3; // 0x3
-    field public static final int NO_USER_RESPONDING = 18; // 0x12
-    field public static final int NO_VALID_SIM = 249; // 0xf9
-    field public static final int NUMBER_CHANGED = 22; // 0x16
-    field public static final int OEM_CAUSE_1 = 61441; // 0xf001
-    field public static final int OEM_CAUSE_10 = 61450; // 0xf00a
-    field public static final int OEM_CAUSE_11 = 61451; // 0xf00b
-    field public static final int OEM_CAUSE_12 = 61452; // 0xf00c
-    field public static final int OEM_CAUSE_13 = 61453; // 0xf00d
-    field public static final int OEM_CAUSE_14 = 61454; // 0xf00e
-    field public static final int OEM_CAUSE_15 = 61455; // 0xf00f
-    field public static final int OEM_CAUSE_2 = 61442; // 0xf002
-    field public static final int OEM_CAUSE_3 = 61443; // 0xf003
-    field public static final int OEM_CAUSE_4 = 61444; // 0xf004
-    field public static final int OEM_CAUSE_5 = 61445; // 0xf005
-    field public static final int OEM_CAUSE_6 = 61446; // 0xf006
-    field public static final int OEM_CAUSE_7 = 61447; // 0xf007
-    field public static final int OEM_CAUSE_8 = 61448; // 0xf008
-    field public static final int OEM_CAUSE_9 = 61449; // 0xf009
-    field public static final int ONLY_DIGITAL_INFORMATION_BEARER_AVAILABLE = 70; // 0x46
-    field public static final int OPERATOR_DETERMINED_BARRING = 8; // 0x8
-    field public static final int OUT_OF_SRV = 248; // 0xf8
-    field public static final int PREEMPTION = 25; // 0x19
-    field public static final int PROTOCOL_ERROR_UNSPECIFIED = 111; // 0x6f
-    field public static final int QOS_NOT_AVAIL = 49; // 0x31
-    field public static final int RADIO_ACCESS_FAILURE = 253; // 0xfd
-    field public static final int RADIO_INTERNAL_ERROR = 250; // 0xfa
-    field public static final int RADIO_LINK_FAILURE = 254; // 0xfe
-    field public static final int RADIO_LINK_LOST = 255; // 0xff
-    field public static final int RADIO_OFF = 247; // 0xf7
-    field public static final int RADIO_RELEASE_ABNORMAL = 259; // 0x103
-    field public static final int RADIO_RELEASE_NORMAL = 258; // 0x102
-    field public static final int RADIO_SETUP_FAILURE = 257; // 0x101
-    field public static final int RADIO_UPLINK_FAILURE = 256; // 0x100
-    field public static final int RECOVERY_ON_TIMER_EXPIRED = 102; // 0x66
-    field public static final int REQUESTED_FACILITY_NOT_IMPLEMENTED = 69; // 0x45
-    field public static final int REQUESTED_FACILITY_NOT_SUBSCRIBED = 50; // 0x32
-    field public static final int RESOURCES_UNAVAILABLE_OR_UNSPECIFIED = 47; // 0x2f
-    field public static final int SEMANTICALLY_INCORRECT_MESSAGE = 95; // 0x5f
-    field public static final int SERVICE_OPTION_NOT_AVAILABLE = 63; // 0x3f
-    field public static final int SERVICE_OR_OPTION_NOT_IMPLEMENTED = 79; // 0x4f
-    field public static final int STATUS_ENQUIRY = 30; // 0x1e
-    field public static final int SWITCHING_CONGESTION = 42; // 0x2a
-    field public static final int TEMPORARY_FAILURE = 41; // 0x29
-    field public static final int UNOBTAINABLE_NUMBER = 1; // 0x1
-    field public static final int USER_NOT_MEMBER_OF_CUG = 87; // 0x57
-  }
-
-  public class ServiceState implements android.os.Parcelable {
-    method @Nullable public android.telephony.NetworkRegistrationInfo getNetworkRegistrationInfo(int, int);
-    method @NonNull public java.util.List<android.telephony.NetworkRegistrationInfo> getNetworkRegistrationInfoListForDomain(int);
-    method @NonNull public java.util.List<android.telephony.NetworkRegistrationInfo> getNetworkRegistrationInfoListForTransportType(int);
-    field public static final int ROAMING_TYPE_DOMESTIC = 2; // 0x2
-    field public static final int ROAMING_TYPE_INTERNATIONAL = 3; // 0x3
-    field public static final int ROAMING_TYPE_NOT_ROAMING = 0; // 0x0
-    field public static final int ROAMING_TYPE_UNKNOWN = 1; // 0x1
-  }
-
-  public final class SmsCbCmasInfo implements android.os.Parcelable {
-    ctor public SmsCbCmasInfo(int, int, int, int, int, int);
-    method public int describeContents();
-    method public int getCategory();
-    method public int getCertainty();
-    method public int getMessageClass();
-    method public int getResponseType();
-    method public int getSeverity();
-    method public int getUrgency();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int CMAS_CATEGORY_CBRNE = 10; // 0xa
-    field public static final int CMAS_CATEGORY_ENV = 7; // 0x7
-    field public static final int CMAS_CATEGORY_FIRE = 5; // 0x5
-    field public static final int CMAS_CATEGORY_GEO = 0; // 0x0
-    field public static final int CMAS_CATEGORY_HEALTH = 6; // 0x6
-    field public static final int CMAS_CATEGORY_INFRA = 9; // 0x9
-    field public static final int CMAS_CATEGORY_MET = 1; // 0x1
-    field public static final int CMAS_CATEGORY_OTHER = 11; // 0xb
-    field public static final int CMAS_CATEGORY_RESCUE = 4; // 0x4
-    field public static final int CMAS_CATEGORY_SAFETY = 2; // 0x2
-    field public static final int CMAS_CATEGORY_SECURITY = 3; // 0x3
-    field public static final int CMAS_CATEGORY_TRANSPORT = 8; // 0x8
-    field public static final int CMAS_CATEGORY_UNKNOWN = -1; // 0xffffffff
-    field public static final int CMAS_CERTAINTY_LIKELY = 1; // 0x1
-    field public static final int CMAS_CERTAINTY_OBSERVED = 0; // 0x0
-    field public static final int CMAS_CERTAINTY_UNKNOWN = -1; // 0xffffffff
-    field public static final int CMAS_CLASS_CHILD_ABDUCTION_EMERGENCY = 3; // 0x3
-    field public static final int CMAS_CLASS_CMAS_EXERCISE = 5; // 0x5
-    field public static final int CMAS_CLASS_EXTREME_THREAT = 1; // 0x1
-    field public static final int CMAS_CLASS_OPERATOR_DEFINED_USE = 6; // 0x6
-    field public static final int CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT = 0; // 0x0
-    field public static final int CMAS_CLASS_REQUIRED_MONTHLY_TEST = 4; // 0x4
-    field public static final int CMAS_CLASS_SEVERE_THREAT = 2; // 0x2
-    field public static final int CMAS_CLASS_UNKNOWN = -1; // 0xffffffff
-    field public static final int CMAS_RESPONSE_TYPE_ASSESS = 6; // 0x6
-    field public static final int CMAS_RESPONSE_TYPE_AVOID = 5; // 0x5
-    field public static final int CMAS_RESPONSE_TYPE_EVACUATE = 1; // 0x1
-    field public static final int CMAS_RESPONSE_TYPE_EXECUTE = 3; // 0x3
-    field public static final int CMAS_RESPONSE_TYPE_MONITOR = 4; // 0x4
-    field public static final int CMAS_RESPONSE_TYPE_NONE = 7; // 0x7
-    field public static final int CMAS_RESPONSE_TYPE_PREPARE = 2; // 0x2
-    field public static final int CMAS_RESPONSE_TYPE_SHELTER = 0; // 0x0
-    field public static final int CMAS_RESPONSE_TYPE_UNKNOWN = -1; // 0xffffffff
-    field public static final int CMAS_SEVERITY_EXTREME = 0; // 0x0
-    field public static final int CMAS_SEVERITY_SEVERE = 1; // 0x1
-    field public static final int CMAS_SEVERITY_UNKNOWN = -1; // 0xffffffff
-    field public static final int CMAS_URGENCY_EXPECTED = 1; // 0x1
-    field public static final int CMAS_URGENCY_IMMEDIATE = 0; // 0x0
-    field public static final int CMAS_URGENCY_UNKNOWN = -1; // 0xffffffff
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.SmsCbCmasInfo> CREATOR;
-  }
-
-  public final class SmsCbEtwsInfo implements android.os.Parcelable {
-    ctor public SmsCbEtwsInfo(int, boolean, boolean, boolean, @Nullable byte[]);
-    method public int describeContents();
-    method @Nullable public byte[] getPrimaryNotificationSignature();
-    method public long getPrimaryNotificationTimestamp();
-    method public int getWarningType();
-    method public boolean isEmergencyUserAlert();
-    method public boolean isPopupAlert();
-    method public boolean isPrimary();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.SmsCbEtwsInfo> CREATOR;
-    field public static final int ETWS_WARNING_TYPE_EARTHQUAKE = 0; // 0x0
-    field public static final int ETWS_WARNING_TYPE_EARTHQUAKE_AND_TSUNAMI = 2; // 0x2
-    field public static final int ETWS_WARNING_TYPE_OTHER_EMERGENCY = 4; // 0x4
-    field public static final int ETWS_WARNING_TYPE_TEST_MESSAGE = 3; // 0x3
-    field public static final int ETWS_WARNING_TYPE_TSUNAMI = 1; // 0x1
-    field public static final int ETWS_WARNING_TYPE_UNKNOWN = -1; // 0xffffffff
-  }
-
-  public final class SmsCbLocation implements android.os.Parcelable {
-    ctor public SmsCbLocation(@NonNull String, int, int);
-    method public int describeContents();
-    method public int getCid();
-    method public int getLac();
-    method @NonNull public String getPlmn();
-    method public boolean isInLocationArea(@NonNull android.telephony.SmsCbLocation);
-    method public boolean isInLocationArea(@Nullable String, int, int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.SmsCbLocation> CREATOR;
-  }
-
-  public final class SmsCbMessage implements android.os.Parcelable {
-    ctor public SmsCbMessage(int, int, int, @NonNull android.telephony.SmsCbLocation, int, @Nullable String, int, @Nullable String, int, @Nullable android.telephony.SmsCbEtwsInfo, @Nullable android.telephony.SmsCbCmasInfo, int, @Nullable java.util.List<android.telephony.CbGeoUtils.Geometry>, long, int, int);
-    method @NonNull public static android.telephony.SmsCbMessage createFromCursor(@NonNull android.database.Cursor);
-    method public int describeContents();
-    method @Nullable public android.telephony.SmsCbCmasInfo getCmasWarningInfo();
-    method @NonNull public android.content.ContentValues getContentValues();
-    method public int getDataCodingScheme();
-    method @Nullable public android.telephony.SmsCbEtwsInfo getEtwsWarningInfo();
-    method public int getGeographicalScope();
-    method @NonNull public java.util.List<android.telephony.CbGeoUtils.Geometry> getGeometries();
-    method @Nullable public String getLanguageCode();
-    method @NonNull public android.telephony.SmsCbLocation getLocation();
-    method public int getMaximumWaitingDuration();
-    method @Nullable public String getMessageBody();
-    method public int getMessageFormat();
-    method public int getMessagePriority();
-    method public long getReceivedTime();
-    method public int getSerialNumber();
-    method public int getServiceCategory();
-    method public int getSlotIndex();
-    method public int getSubscriptionId();
-    method public boolean isCmasMessage();
-    method public boolean isEmergencyMessage();
-    method public boolean isEtwsMessage();
-    method public boolean needGeoFencingCheck();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.SmsCbMessage> CREATOR;
-    field public static final int GEOGRAPHICAL_SCOPE_CELL_WIDE = 3; // 0x3
-    field public static final int GEOGRAPHICAL_SCOPE_CELL_WIDE_IMMEDIATE = 0; // 0x0
-    field public static final int GEOGRAPHICAL_SCOPE_LOCATION_AREA_WIDE = 2; // 0x2
-    field public static final int GEOGRAPHICAL_SCOPE_PLMN_WIDE = 1; // 0x1
-    field public static final int MAXIMUM_WAIT_TIME_NOT_SET = 255; // 0xff
-    field public static final int MESSAGE_FORMAT_3GPP = 1; // 0x1
-    field public static final int MESSAGE_FORMAT_3GPP2 = 2; // 0x2
-    field public static final int MESSAGE_PRIORITY_EMERGENCY = 3; // 0x3
-    field public static final int MESSAGE_PRIORITY_INTERACTIVE = 1; // 0x1
-    field public static final int MESSAGE_PRIORITY_NORMAL = 0; // 0x0
-    field public static final int MESSAGE_PRIORITY_URGENT = 2; // 0x2
-  }
-
-  public final class SmsManager {
-    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_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
-    field public static final int PREMIUM_SMS_CONSENT_ASK_USER = 1; // 0x1
-    field public static final int PREMIUM_SMS_CONSENT_NEVER_ALLOW = 2; // 0x2
-    field public static final int PREMIUM_SMS_CONSENT_UNKNOWN = 0; // 0x0
-  }
-
-  public class SmsMessage {
-    method @Nullable public static android.telephony.SmsMessage createFromNativeSmsSubmitPdu(@NonNull byte[], boolean);
-    method @Nullable public static android.telephony.SmsMessage.SubmitPdu getSmsPdu(int, int, @Nullable String, @NonNull String, @NonNull String, long);
-    method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public static byte[] getSubmitPduEncodedMessage(boolean, @NonNull String, @NonNull String, int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0, to=255) int, @IntRange(from=1, to=255) int, @IntRange(from=1, to=255) int);
-  }
-
-  public class SubscriptionInfo implements android.os.Parcelable {
-    method public boolean areUiccApplicationsEnabled();
-    method @Nullable public java.util.List<android.telephony.UiccAccessRule> getAccessRules();
-    method public int getProfileClass();
-    method public boolean isGroupDisabled();
-  }
-
-  public class SubscriptionManager {
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean canDisablePhysicalSubscription();
-    method public boolean canManageSubscription(@NonNull android.telephony.SubscriptionInfo, @NonNull String);
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int[] getActiveSubscriptionIdList();
-    method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.SubscriptionInfo getActiveSubscriptionInfoForIcc(@NonNull String);
-    method public java.util.List<android.telephony.SubscriptionInfo> getAvailableSubscriptionInfoList();
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int[] getCompleteActiveSubscriptionIdList();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getEnabledSubscriptionId(int);
-    method @NonNull public static android.content.res.Resources getResourcesForSubId(@NonNull android.content.Context, int);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSubscriptionEnabled(int);
-    method public void requestEmbeddedSubscriptionInfoListRefresh();
-    method public void requestEmbeddedSubscriptionInfoListRefresh(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultDataSubId(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultSmsSubId(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultVoiceSubscriptionId(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setPreferredDataSubscriptionId(int, boolean, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.Consumer<java.lang.Integer>);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setSubscriptionEnabled(int, boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUiccApplicationsEnabled(int, boolean);
-    field @RequiresPermission(android.Manifest.permission.MANAGE_SUBSCRIPTION_PLANS) public static final String ACTION_SUBSCRIPTION_PLANS_CHANGED = "android.telephony.action.SUBSCRIPTION_PLANS_CHANGED";
-    field @NonNull public static final android.net.Uri ADVANCED_CALLING_ENABLED_CONTENT_URI;
-    field @Deprecated public static final int PROFILE_CLASS_DEFAULT = -1; // 0xffffffff
-    field public static final int PROFILE_CLASS_OPERATIONAL = 2; // 0x2
-    field public static final int PROFILE_CLASS_PROVISIONING = 1; // 0x1
-    field public static final int PROFILE_CLASS_TESTING = 0; // 0x0
-    field public static final int PROFILE_CLASS_UNSET = -1; // 0xffffffff
-    field @NonNull public static final android.net.Uri VT_ENABLED_CONTENT_URI;
-    field @NonNull public static final android.net.Uri WFC_ENABLED_CONTENT_URI;
-    field @NonNull public static final android.net.Uri WFC_MODE_CONTENT_URI;
-    field @NonNull public static final android.net.Uri WFC_ROAMING_ENABLED_CONTENT_URI;
-    field @NonNull public static final android.net.Uri WFC_ROAMING_MODE_CONTENT_URI;
-  }
-
-  public static class SubscriptionPlan.Builder {
-    method @Deprecated public static android.telephony.SubscriptionPlan.Builder createRecurringDaily(java.time.ZonedDateTime);
-    method @Deprecated public static android.telephony.SubscriptionPlan.Builder createRecurringMonthly(java.time.ZonedDateTime);
-    method @Deprecated public static android.telephony.SubscriptionPlan.Builder createRecurringWeekly(java.time.ZonedDateTime);
-  }
-
-  public final class TelephonyHistogram implements android.os.Parcelable {
-    ctor public TelephonyHistogram(int, int, int);
-    ctor public TelephonyHistogram(android.telephony.TelephonyHistogram);
-    ctor public TelephonyHistogram(android.os.Parcel);
-    method public void addTimeTaken(int);
-    method public int describeContents();
-    method public int getAverageTime();
-    method public int getBucketCount();
-    method public int[] getBucketCounters();
-    method public int[] getBucketEndPoints();
-    method public int getCategory();
-    method public int getId();
-    method public int getMaxTime();
-    method public int getMinTime();
-    method public int getSampleCount();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.TelephonyHistogram> CREATOR;
-    field public static final int TELEPHONY_CATEGORY_RIL = 1; // 0x1
-  }
-
-  public class TelephonyManager {
-    method @Deprecated @RequiresPermission(android.Manifest.permission.CALL_PHONE) public void call(String, String);
-    method public int checkCarrierPrivilegesForPackage(String);
-    method public int checkCarrierPrivilegesForPackageAnyPhone(String);
-    method public void dial(String);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean disableDataConnectivity();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean enableDataConnectivity();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean enableModemForSlot(int, boolean);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void enableVideoCalling(boolean);
-    method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getAidForAppType(int);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers(int);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getAllowedNetworkTypes();
-    method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.ComponentName getAndUpdateDefaultRespondViaMessageApplication();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getCallForwarding(int, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CallForwardingInfoCallback);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getCallWaitingStatus(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
-    method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int);
-    method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent);
-    method public java.util.List<java.lang.String> getCarrierPackageNamesForIntentAndPhone(android.content.Intent, int);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getCarrierPrivilegeStatus(int);
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<java.lang.String> getCarrierPrivilegedPackagesForAllActiveSubscriptions();
-    method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.CarrierRestrictionRules getCarrierRestrictionRules();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getCdmaEnhancedRoamingIndicatorDisplayNumber();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String getCdmaMdn();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String getCdmaMdn(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String getCdmaMin();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String getCdmaMin(int);
-    method public String getCdmaPrlVersion();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getCdmaRoamingMode();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getCdmaSubscriptionMode();
-    method public int getCurrentPhoneType();
-    method public int getCurrentPhoneType(int);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getDataActivationState();
-    method @Deprecated public boolean getDataEnabled();
-    method @Deprecated public boolean getDataEnabled(int);
-    method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.ComponentName getDefaultRespondViaMessageApplication();
-    method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getDeviceSoftwareVersion(int);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getEmergencyCallbackMode();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getEmergencyNumberDbVersion();
-    method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimDomain();
-    method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimIst();
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.Map<java.lang.Integer,java.lang.Integer> getLogicalToPhysicalSlotMapping();
-    method public int getMaxNumberOfSimultaneouslyActiveSims();
-    method public static long getMaxNumberVerificationTimeoutMillis();
-    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String[] getMergedImsisFromGroup();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getPreferredNetworkTypeBitmask();
-    method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public int getRadioPowerState();
-    method public int getSimApplicationState();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSimApplicationState(int);
-    method public int getSimCardState();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSimCardState(int);
-    method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.Locale getSimLocale();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getSupportedRadioAccessFamily();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.UiccSlotInfo[] getUiccSlotsInfo();
-    method @Nullable public android.os.Bundle getVisualVoicemailSettings();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getVoiceActivationState();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handlePinMmi(String);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handlePinMmiForSubscriber(int, String);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean iccCloseLogicalChannelBySlot(int, int);
-    method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannelBySlot(int, @Nullable String, int);
-    method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduBasicChannelBySlot(int, int, int, int, int, int, @Nullable String);
-    method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduLogicalChannelBySlot(int, int, int, int, int, int, int, @Nullable String);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAnyRadioPoweredOn();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isApnMetered(int);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isApplicationOnUicc(int);
-    method public boolean isDataConnectivityPossible();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isDataEnabledForApn(int);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isEmergencyAssistanceEnabled();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean isIccLockEnabled();
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isIdle();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isLteCdmaEvdoGsmWcdmaEnabled();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isMobileDataPolicyEnabled(int);
-    method public boolean isNrDualConnectivityEnabled();
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isOffhook();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isOpportunisticNetworkEnabled();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isPotentialEmergencyNumber(@NonNull String);
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRadioOn();
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRinging();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isTetheringApnRequired();
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isVideoCallingEnabled();
-    method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isVisualVoicemailEnabled(android.telecom.PhoneAccountHandle);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean matchesCurrentSimOperator(@NonNull String, int, @Nullable String);
-    method public boolean needsOtaServiceProvisioning();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyOtaEmergencyNumberDbInstalled();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean rebootRadio();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void reportDefaultNetworkStatus(boolean);
-    method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.MODIFY_PHONE_STATE}) public void requestCellInfoUpdate(@NonNull android.os.WorkSource, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void requestModemActivityInfo(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.telephony.ModemActivityInfo,android.telephony.TelephonyManager.ModemActivityInfoException>);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void requestNumberVerification(@NonNull android.telephony.PhoneNumberRange, long, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.NumberVerificationCallback);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void resetAllCarrierActions();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void resetCarrierKeysForImsiEncryption();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void resetIms(int);
-    method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void resetOtaEmergencyNumberDbFilePath();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean resetRadioConfig();
-    method @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL) public void resetSettings();
-    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setAllowedCarriers(int, java.util.List<android.service.carrier.CarrierIdentifier>);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setAllowedNetworkTypes(long);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setCallForwarding(@NonNull android.telephony.CallForwardingInfo, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.Consumer<java.lang.Integer>);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setCallWaitingEnabled(boolean, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.Consumer<java.lang.Integer>);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setCarrierDataEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setCarrierRestrictionRules(@NonNull android.telephony.CarrierRestrictionRules);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setCdmaRoamingMode(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setCdmaSubscriptionMode(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataActivationState(int);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataEnabled(int, boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataRoamingEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setMobileDataPolicyEnabledStatus(int, boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setMultiSimCarrierRestriction(boolean);
-    method public int setNrDualConnectivityState(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setOpportunisticNetworkState(boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setPreferredNetworkTypeBitmask(long);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadio(boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRadioEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadioPower(boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerState(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerStateForSlot(int, int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>);
-    method @Deprecated public void setVisualVoicemailEnabled(android.telecom.PhoneAccountHandle, boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoiceActivationState(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void shutdownAllRadios();
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean supplyPin(String);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPinReportResult(String);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean supplyPuk(String, String);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPukReportResult(String, String);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean switchSlots(int[]);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void toggleRadioOnOff();
-    method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void updateOtaEmergencyNumberDbFilePath(@NonNull android.os.ParcelFileDescriptor);
-    method public void updateServiceLocation();
-    field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final String ACTION_ANOMALY_REPORTED = "android.telephony.action.ANOMALY_REPORTED";
-    field public static final String ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED";
-    field public static final String ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED";
-    field public static final String ACTION_EMERGENCY_ASSISTANCE = "android.telephony.action.EMERGENCY_ASSISTANCE";
-    field public static final String ACTION_EMERGENCY_CALLBACK_MODE_CHANGED = "android.intent.action.EMERGENCY_CALLBACK_MODE_CHANGED";
-    field public static final String ACTION_EMERGENCY_CALL_STATE_CHANGED = "android.intent.action.EMERGENCY_CALL_STATE_CHANGED";
-    field public static final String ACTION_REQUEST_OMADM_CONFIGURATION_UPDATE = "com.android.omadm.service.CONFIGURATION_UPDATE";
-    field public static final String ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS = "android.telephony.action.SHOW_NOTICE_ECM_BLOCK_OTHERS";
-    field public static final String ACTION_SIM_APPLICATION_STATE_CHANGED = "android.telephony.action.SIM_APPLICATION_STATE_CHANGED";
-    field public static final String ACTION_SIM_CARD_STATE_CHANGED = "android.telephony.action.SIM_CARD_STATE_CHANGED";
-    field public static final String ACTION_SIM_SLOT_STATUS_CHANGED = "android.telephony.action.SIM_SLOT_STATUS_CHANGED";
-    field public static final int CALL_WAITING_STATUS_DISABLED = 2; // 0x2
-    field public static final int CALL_WAITING_STATUS_ENABLED = 1; // 0x1
-    field public static final int CALL_WAITING_STATUS_NOT_SUPPORTED = 4; // 0x4
-    field public static final int CALL_WAITING_STATUS_UNKNOWN_ERROR = 3; // 0x3
-    field public static final int CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES = -2; // 0xfffffffe
-    field public static final int CARRIER_PRIVILEGE_STATUS_HAS_ACCESS = 1; // 0x1
-    field public static final int CARRIER_PRIVILEGE_STATUS_NO_ACCESS = 0; // 0x0
-    field public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; // 0xffffffff
-    field public static final int CDMA_SUBSCRIPTION_NV = 1; // 0x1
-    field public static final int CDMA_SUBSCRIPTION_RUIM_SIM = 0; // 0x0
-    field public static final int CDMA_SUBSCRIPTION_UNKNOWN = -1; // 0xffffffff
-    field public static final int ENABLE_NR_DUAL_CONNECTIVITY_INVALID_STATE = 4; // 0x4
-    field public static final int ENABLE_NR_DUAL_CONNECTIVITY_NOT_SUPPORTED = 1; // 0x1
-    field public static final int ENABLE_NR_DUAL_CONNECTIVITY_RADIO_ERROR = 3; // 0x3
-    field public static final int ENABLE_NR_DUAL_CONNECTIVITY_RADIO_NOT_AVAILABLE = 2; // 0x2
-    field public static final int ENABLE_NR_DUAL_CONNECTIVITY_SUCCESS = 0; // 0x0
-    field public static final String EXTRA_ANOMALY_DESCRIPTION = "android.telephony.extra.ANOMALY_DESCRIPTION";
-    field public static final String EXTRA_ANOMALY_ID = "android.telephony.extra.ANOMALY_ID";
-    field public static final String EXTRA_PHONE_IN_ECM_STATE = "android.telephony.extra.PHONE_IN_ECM_STATE";
-    field public static final String EXTRA_PHONE_IN_EMERGENCY_CALL = "android.telephony.extra.PHONE_IN_EMERGENCY_CALL";
-    field public static final String EXTRA_SIM_STATE = "android.telephony.extra.SIM_STATE";
-    field public static final String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL";
-    field public static final String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING";
-    field public static final int INVALID_EMERGENCY_NUMBER_DB_VERSION = -1; // 0xffffffff
-    field public static final int KEY_TYPE_EPDG = 1; // 0x1
-    field public static final int KEY_TYPE_WLAN = 2; // 0x2
-    field public static final int MOBILE_DATA_POLICY_DATA_ON_NON_DEFAULT_DURING_VOICE_CALL = 1; // 0x1
-    field public static final int MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED = 2; // 0x2
-    field public static final long NETWORK_TYPE_BITMASK_1xRTT = 64L; // 0x40L
-    field public static final long NETWORK_TYPE_BITMASK_CDMA = 8L; // 0x8L
-    field public static final long NETWORK_TYPE_BITMASK_EDGE = 2L; // 0x2L
-    field public static final long NETWORK_TYPE_BITMASK_EHRPD = 8192L; // 0x2000L
-    field public static final long NETWORK_TYPE_BITMASK_EVDO_0 = 16L; // 0x10L
-    field public static final long NETWORK_TYPE_BITMASK_EVDO_A = 32L; // 0x20L
-    field public static final long NETWORK_TYPE_BITMASK_EVDO_B = 2048L; // 0x800L
-    field public static final long NETWORK_TYPE_BITMASK_GPRS = 1L; // 0x1L
-    field public static final long NETWORK_TYPE_BITMASK_GSM = 32768L; // 0x8000L
-    field public static final long NETWORK_TYPE_BITMASK_HSDPA = 128L; // 0x80L
-    field public static final long NETWORK_TYPE_BITMASK_HSPA = 512L; // 0x200L
-    field public static final long NETWORK_TYPE_BITMASK_HSPAP = 16384L; // 0x4000L
-    field public static final long NETWORK_TYPE_BITMASK_HSUPA = 256L; // 0x100L
-    field public static final long NETWORK_TYPE_BITMASK_IWLAN = 131072L; // 0x20000L
-    field public static final long NETWORK_TYPE_BITMASK_LTE = 4096L; // 0x1000L
-    field public static final long NETWORK_TYPE_BITMASK_LTE_CA = 262144L; // 0x40000L
-    field public static final long NETWORK_TYPE_BITMASK_NR = 524288L; // 0x80000L
-    field public static final long NETWORK_TYPE_BITMASK_TD_SCDMA = 65536L; // 0x10000L
-    field public static final long NETWORK_TYPE_BITMASK_UMTS = 4L; // 0x4L
-    field public static final long NETWORK_TYPE_BITMASK_UNKNOWN = 0L; // 0x0L
-    field public static final int NR_DUAL_CONNECTIVITY_DISABLE = 2; // 0x2
-    field public static final int NR_DUAL_CONNECTIVITY_DISABLE_IMMEDIATE = 3; // 0x3
-    field public static final int NR_DUAL_CONNECTIVITY_ENABLE = 1; // 0x1
-    field public static final int RADIO_POWER_OFF = 0; // 0x0
-    field public static final int RADIO_POWER_ON = 1; // 0x1
-    field public static final int RADIO_POWER_UNAVAILABLE = 2; // 0x2
-    field public static final int SET_CARRIER_RESTRICTION_ERROR = 2; // 0x2
-    field public static final int SET_CARRIER_RESTRICTION_NOT_SUPPORTED = 1; // 0x1
-    field public static final int SET_CARRIER_RESTRICTION_SUCCESS = 0; // 0x0
-    field public static final int SIM_ACTIVATION_STATE_ACTIVATED = 2; // 0x2
-    field public static final int SIM_ACTIVATION_STATE_ACTIVATING = 1; // 0x1
-    field public static final int SIM_ACTIVATION_STATE_DEACTIVATED = 3; // 0x3
-    field public static final int SIM_ACTIVATION_STATE_RESTRICTED = 4; // 0x4
-    field public static final int SIM_ACTIVATION_STATE_UNKNOWN = 0; // 0x0
-    field public static final int SIM_STATE_LOADED = 10; // 0xa
-    field public static final int SIM_STATE_PRESENT = 11; // 0xb
-    field public static final int SRVCC_STATE_HANDOVER_CANCELED = 3; // 0x3
-    field public static final int SRVCC_STATE_HANDOVER_COMPLETED = 1; // 0x1
-    field public static final int SRVCC_STATE_HANDOVER_FAILED = 2; // 0x2
-    field public static final int SRVCC_STATE_HANDOVER_NONE = -1; // 0xffffffff
-    field public static final int SRVCC_STATE_HANDOVER_STARTED = 0; // 0x0
-  }
-
-  public static interface TelephonyManager.CallForwardingInfoCallback {
-    method public void onCallForwardingInfoAvailable(@NonNull android.telephony.CallForwardingInfo);
-    method public void onError(int);
-    field public static final int RESULT_ERROR_FDN_CHECK_FAILURE = 2; // 0x2
-    field public static final int RESULT_ERROR_NOT_SUPPORTED = 3; // 0x3
-    field public static final int RESULT_ERROR_UNKNOWN = 1; // 0x1
-    field public static final int RESULT_SUCCESS = 0; // 0x0
-  }
-
-  public static class TelephonyManager.ModemActivityInfoException extends java.lang.Exception {
-    method public int getErrorCode();
-    field public static final int ERROR_INVALID_INFO_RECEIVED = 2; // 0x2
-    field public static final int ERROR_MODEM_RESPONSE_ERROR = 3; // 0x3
-    field public static final int ERROR_PHONE_NOT_AVAILABLE = 1; // 0x1
-    field public static final int ERROR_UNKNOWN = 0; // 0x0
-  }
-
-  public final class UiccAccessRule implements android.os.Parcelable {
-    ctor public UiccAccessRule(byte[], @Nullable String, long);
-    method public int describeContents();
-    method public int getCarrierPrivilegeStatus(android.content.pm.PackageInfo);
-    method public int getCarrierPrivilegeStatus(android.content.pm.Signature, String);
-    method public String getCertificateHexString();
-    method @Nullable public String getPackageName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.UiccAccessRule> CREATOR;
-  }
-
-  public class UiccSlotInfo implements android.os.Parcelable {
-    ctor @Deprecated public UiccSlotInfo(boolean, boolean, String, int, int, boolean);
-    method public int describeContents();
-    method public String getCardId();
-    method public int getCardStateInfo();
-    method public boolean getIsActive();
-    method public boolean getIsEuicc();
-    method public boolean getIsExtendedApduSupported();
-    method public int getLogicalSlotIdx();
-    method public boolean isRemovable();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int CARD_STATE_INFO_ABSENT = 1; // 0x1
-    field public static final int CARD_STATE_INFO_ERROR = 3; // 0x3
-    field public static final int CARD_STATE_INFO_PRESENT = 2; // 0x2
-    field public static final int CARD_STATE_INFO_RESTRICTED = 4; // 0x4
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.UiccSlotInfo> CREATOR;
-  }
-
-  public abstract class VisualVoicemailService extends android.app.Service {
-    method public static final void sendVisualVoicemailSms(android.content.Context, android.telecom.PhoneAccountHandle, String, short, String, android.app.PendingIntent);
-    method public static final void setSmsFilterSettings(android.content.Context, android.telecom.PhoneAccountHandle, android.telephony.VisualVoicemailSmsFilterSettings);
-  }
-
-}
-
-package android.telephony.cdma {
-
-  public final class CdmaSmsCbProgramData implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getCategory();
-    method public int getOperation();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY = 4099; // 0x1003
-    field public static final int CATEGORY_CMAS_EXTREME_THREAT = 4097; // 0x1001
-    field public static final int CATEGORY_CMAS_LAST_RESERVED_VALUE = 4351; // 0x10ff
-    field public static final int CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT = 4096; // 0x1000
-    field public static final int CATEGORY_CMAS_SEVERE_THREAT = 4098; // 0x1002
-    field public static final int CATEGORY_CMAS_TEST_MESSAGE = 4100; // 0x1004
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.cdma.CdmaSmsCbProgramData> CREATOR;
-    field public static final int OPERATION_ADD_CATEGORY = 1; // 0x1
-    field public static final int OPERATION_CLEAR_CATEGORIES = 2; // 0x2
-    field public static final int OPERATION_DELETE_CATEGORY = 0; // 0x0
-  }
-
-}
-
-package android.telephony.data {
-
-  public final class DataCallResponse implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public java.util.List<android.net.LinkAddress> getAddresses();
-    method public int getCause();
-    method @NonNull public java.util.List<java.net.InetAddress> getDnsAddresses();
-    method @NonNull public java.util.List<java.net.InetAddress> getGatewayAddresses();
-    method public int getHandoverFailureMode();
-    method public int getId();
-    method @NonNull public String getInterfaceName();
-    method public int getLinkStatus();
-    method @Deprecated public int getMtu();
-    method public int getMtuV4();
-    method public int getMtuV6();
-    method @NonNull public java.util.List<java.net.InetAddress> getPcscfAddresses();
-    method public int getProtocolType();
-    method public long getRetryDurationMillis();
-    method @Deprecated public int getSuggestedRetryTime();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.DataCallResponse> CREATOR;
-    field public static final int HANDOVER_FAILURE_MODE_DO_FALLBACK = 1; // 0x1
-    field public static final int HANDOVER_FAILURE_MODE_LEGACY = 0; // 0x0
-    field public static final int HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_HANDOVER = 2; // 0x2
-    field public static final int HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_SETUP_NORMAL = 3; // 0x3
-    field public static final int HANDOVER_FAILURE_MODE_UNKNOWN = -1; // 0xffffffff
-    field public static final int LINK_STATUS_ACTIVE = 2; // 0x2
-    field public static final int LINK_STATUS_DORMANT = 1; // 0x1
-    field public static final int LINK_STATUS_INACTIVE = 0; // 0x0
-    field public static final int LINK_STATUS_UNKNOWN = -1; // 0xffffffff
-    field public static final int RETRY_DURATION_UNDEFINED = -1; // 0xffffffff
-  }
-
-  public static final class DataCallResponse.Builder {
-    ctor public DataCallResponse.Builder();
-    method @NonNull public android.telephony.data.DataCallResponse build();
-    method @NonNull public android.telephony.data.DataCallResponse.Builder setAddresses(@NonNull java.util.List<android.net.LinkAddress>);
-    method @NonNull public android.telephony.data.DataCallResponse.Builder setCause(int);
-    method @NonNull public android.telephony.data.DataCallResponse.Builder setDnsAddresses(@NonNull java.util.List<java.net.InetAddress>);
-    method @NonNull public android.telephony.data.DataCallResponse.Builder setGatewayAddresses(@NonNull java.util.List<java.net.InetAddress>);
-    method @NonNull public android.telephony.data.DataCallResponse.Builder setHandoverFailureMode(int);
-    method @NonNull public android.telephony.data.DataCallResponse.Builder setId(int);
-    method @NonNull public android.telephony.data.DataCallResponse.Builder setInterfaceName(@NonNull String);
-    method @NonNull public android.telephony.data.DataCallResponse.Builder setLinkStatus(int);
-    method @Deprecated @NonNull public android.telephony.data.DataCallResponse.Builder setMtu(int);
-    method @NonNull public android.telephony.data.DataCallResponse.Builder setMtuV4(int);
-    method @NonNull public android.telephony.data.DataCallResponse.Builder setMtuV6(int);
-    method @NonNull public android.telephony.data.DataCallResponse.Builder setPcscfAddresses(@NonNull java.util.List<java.net.InetAddress>);
-    method @NonNull public android.telephony.data.DataCallResponse.Builder setProtocolType(int);
-    method @NonNull public android.telephony.data.DataCallResponse.Builder setRetryDurationMillis(long);
-    method @Deprecated @NonNull public android.telephony.data.DataCallResponse.Builder setSuggestedRetryTime(int);
-  }
-
-  public final class DataProfile implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public String getApn();
-    method public int getAuthType();
-    method public int getBearerBitmask();
-    method @Deprecated public int getMtu();
-    method public int getMtuV4();
-    method public int getMtuV6();
-    method @Nullable public String getPassword();
-    method public int getProfileId();
-    method public int getProtocolType();
-    method public int getRoamingProtocolType();
-    method public int getSupportedApnTypesBitmask();
-    method public int getType();
-    method @Nullable public String getUserName();
-    method public boolean isEnabled();
-    method public boolean isPersistent();
-    method public boolean isPreferred();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.DataProfile> CREATOR;
-    field public static final int TYPE_3GPP = 1; // 0x1
-    field public static final int TYPE_3GPP2 = 2; // 0x2
-    field public static final int TYPE_COMMON = 0; // 0x0
-  }
-
-  public static final class DataProfile.Builder {
-    ctor public DataProfile.Builder();
-    method @NonNull public android.telephony.data.DataProfile build();
-    method @NonNull public android.telephony.data.DataProfile.Builder enable(boolean);
-    method @NonNull public android.telephony.data.DataProfile.Builder setApn(@NonNull String);
-    method @NonNull public android.telephony.data.DataProfile.Builder setAuthType(int);
-    method @NonNull public android.telephony.data.DataProfile.Builder setBearerBitmask(int);
-    method @Deprecated @NonNull public android.telephony.data.DataProfile.Builder setMtu(int);
-    method @NonNull public android.telephony.data.DataProfile.Builder setMtuV4(int);
-    method @NonNull public android.telephony.data.DataProfile.Builder setMtuV6(int);
-    method @NonNull public android.telephony.data.DataProfile.Builder setPassword(@NonNull String);
-    method @NonNull public android.telephony.data.DataProfile.Builder setPersistent(boolean);
-    method @NonNull public android.telephony.data.DataProfile.Builder setPreferred(boolean);
-    method @NonNull public android.telephony.data.DataProfile.Builder setProfileId(int);
-    method @NonNull public android.telephony.data.DataProfile.Builder setProtocolType(int);
-    method @NonNull public android.telephony.data.DataProfile.Builder setRoamingProtocolType(int);
-    method @NonNull public android.telephony.data.DataProfile.Builder setSupportedApnTypesBitmask(int);
-    method @NonNull public android.telephony.data.DataProfile.Builder setType(int);
-    method @NonNull public android.telephony.data.DataProfile.Builder setUserName(@NonNull String);
-  }
-
-  public abstract class DataService extends android.app.Service {
-    ctor public DataService();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method @Nullable public abstract android.telephony.data.DataService.DataServiceProvider onCreateDataServiceProvider(int);
-    field public static final int REQUEST_REASON_HANDOVER = 3; // 0x3
-    field public static final int REQUEST_REASON_NORMAL = 1; // 0x1
-    field public static final int REQUEST_REASON_SHUTDOWN = 2; // 0x2
-    field public static final int REQUEST_REASON_UNKNOWN = 0; // 0x0
-    field public static final String SERVICE_INTERFACE = "android.telephony.data.DataService";
-  }
-
-  public abstract class DataService.DataServiceProvider implements java.lang.AutoCloseable {
-    ctor public DataService.DataServiceProvider(int);
-    method public abstract void close();
-    method public void deactivateDataCall(int, int, @Nullable android.telephony.data.DataServiceCallback);
-    method public final int getSlotIndex();
-    method public final void notifyDataCallListChanged(java.util.List<android.telephony.data.DataCallResponse>);
-    method public void requestDataCallList(@NonNull android.telephony.data.DataServiceCallback);
-    method public void setDataProfile(@NonNull java.util.List<android.telephony.data.DataProfile>, boolean, @NonNull android.telephony.data.DataServiceCallback);
-    method public void setInitialAttachApn(@NonNull android.telephony.data.DataProfile, boolean, @NonNull android.telephony.data.DataServiceCallback);
-    method public void setupDataCall(int, @NonNull android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @NonNull android.telephony.data.DataServiceCallback);
-  }
-
-  public class DataServiceCallback {
-    method public void onDataCallListChanged(@NonNull java.util.List<android.telephony.data.DataCallResponse>);
-    method public void onDeactivateDataCallComplete(int);
-    method public void onRequestDataCallListComplete(int, @NonNull java.util.List<android.telephony.data.DataCallResponse>);
-    method public void onSetDataProfileComplete(int);
-    method public void onSetInitialAttachApnComplete(int);
-    method public void onSetupDataCallComplete(int, @Nullable android.telephony.data.DataCallResponse);
-    field public static final int RESULT_ERROR_BUSY = 3; // 0x3
-    field public static final int RESULT_ERROR_ILLEGAL_STATE = 4; // 0x4
-    field public static final int RESULT_ERROR_INVALID_ARG = 2; // 0x2
-    field public static final int RESULT_ERROR_UNSUPPORTED = 1; // 0x1
-    field public static final int RESULT_SUCCESS = 0; // 0x0
-  }
-
-  public abstract class QualifiedNetworksService extends android.app.Service {
-    ctor public QualifiedNetworksService();
-    method @NonNull public abstract android.telephony.data.QualifiedNetworksService.NetworkAvailabilityProvider onCreateNetworkAvailabilityProvider(int);
-    field public static final String QUALIFIED_NETWORKS_SERVICE_INTERFACE = "android.telephony.data.QualifiedNetworksService";
-  }
-
-  public abstract class QualifiedNetworksService.NetworkAvailabilityProvider implements java.lang.AutoCloseable {
-    ctor public QualifiedNetworksService.NetworkAvailabilityProvider(int);
-    method public abstract void close();
-    method public final int getSlotIndex();
-    method public final void updateQualifiedNetworkTypes(int, @NonNull java.util.List<java.lang.Integer>);
-  }
-
-}
-
-package android.telephony.euicc {
-
-  public final class DownloadableSubscription implements android.os.Parcelable {
-    method public java.util.List<android.telephony.UiccAccessRule> getAccessRules();
-    method @Nullable public String getCarrierName();
-  }
-
-  public static final class DownloadableSubscription.Builder {
-    ctor public DownloadableSubscription.Builder();
-    ctor public DownloadableSubscription.Builder(android.telephony.euicc.DownloadableSubscription);
-    method public android.telephony.euicc.DownloadableSubscription build();
-    method public android.telephony.euicc.DownloadableSubscription.Builder setAccessRules(java.util.List<android.telephony.UiccAccessRule>);
-    method public android.telephony.euicc.DownloadableSubscription.Builder setCarrierName(String);
-    method public android.telephony.euicc.DownloadableSubscription.Builder setConfirmationCode(String);
-    method public android.telephony.euicc.DownloadableSubscription.Builder setEncodedActivationCode(String);
-  }
-
-  public class EuiccCardManager {
-    method public void authenticateServer(String, String, byte[], byte[], byte[], byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
-    method public void cancelSession(String, byte[], @android.telephony.euicc.EuiccCardManager.CancelReason int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
-    method public void deleteProfile(String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
-    method public void disableProfile(String, String, boolean, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
-    method public void listNotifications(String, @android.telephony.euicc.EuiccNotification.Event int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification[]>);
-    method public void loadBoundProfilePackage(String, byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
-    method public void prepareDownload(String, @Nullable byte[], byte[], byte[], byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
-    method public void removeNotificationFromList(String, int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
-    method public void requestAllProfiles(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo[]>);
-    method public void requestDefaultSmdpAddress(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.String>);
-    method public void requestEuiccChallenge(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
-    method public void requestEuiccInfo1(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
-    method public void requestEuiccInfo2(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
-    method public void requestProfile(String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo>);
-    method public void requestRulesAuthTable(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccRulesAuthTable>);
-    method public void requestSmdsAddress(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.String>);
-    method public void resetMemory(String, @android.telephony.euicc.EuiccCardManager.ResetOption int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
-    method public void retrieveNotification(String, int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification>);
-    method public void retrieveNotificationList(String, @android.telephony.euicc.EuiccNotification.Event int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification[]>);
-    method public void setDefaultSmdpAddress(String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
-    method public void setNickname(String, String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
-    method public void switchToProfile(String, String, boolean, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo>);
-    field public static final int CANCEL_REASON_END_USER_REJECTED = 0; // 0x0
-    field public static final int CANCEL_REASON_POSTPONED = 1; // 0x1
-    field public static final int CANCEL_REASON_PPR_NOT_ALLOWED = 3; // 0x3
-    field public static final int CANCEL_REASON_TIMEOUT = 2; // 0x2
-    field public static final int RESET_OPTION_DELETE_FIELD_LOADED_TEST_PROFILES = 2; // 0x2
-    field public static final int RESET_OPTION_DELETE_OPERATIONAL_PROFILES = 1; // 0x1
-    field public static final int RESET_OPTION_RESET_DEFAULT_SMDP_ADDRESS = 4; // 0x4
-    field public static final int RESULT_CALLER_NOT_ALLOWED = -3; // 0xfffffffd
-    field public static final int RESULT_EUICC_NOT_FOUND = -2; // 0xfffffffe
-    field public static final int RESULT_OK = 0; // 0x0
-    field public static final int RESULT_UNKNOWN_ERROR = -1; // 0xffffffff
-  }
-
-  @IntDef(prefix={"CANCEL_REASON_"}, value={android.telephony.euicc.EuiccCardManager.CANCEL_REASON_END_USER_REJECTED, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_POSTPONED, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_TIMEOUT, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_PPR_NOT_ALLOWED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccCardManager.CancelReason {
-  }
-
-  @IntDef(flag=true, prefix={"RESET_OPTION_"}, value={android.telephony.euicc.EuiccCardManager.RESET_OPTION_DELETE_OPERATIONAL_PROFILES, android.telephony.euicc.EuiccCardManager.RESET_OPTION_DELETE_FIELD_LOADED_TEST_PROFILES, android.telephony.euicc.EuiccCardManager.RESET_OPTION_RESET_DEFAULT_SMDP_ADDRESS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccCardManager.ResetOption {
-  }
-
-  public static interface EuiccCardManager.ResultCallback<T> {
-    method public void onComplete(int, T);
-  }
-
-  public class EuiccManager {
-    method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void continueOperation(android.content.Intent, android.os.Bundle);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void eraseSubscriptions(@NonNull android.app.PendingIntent);
-    method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void eraseSubscriptions(@android.telephony.euicc.EuiccCardManager.ResetOption int, @NonNull android.app.PendingIntent);
-    method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void getDefaultDownloadableSubscriptionList(android.app.PendingIntent);
-    method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void getDownloadableSubscriptionMetadata(android.telephony.euicc.DownloadableSubscription, android.app.PendingIntent);
-    method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public int getOtaStatus();
-    method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public java.util.List<java.lang.String> getSupportedCountries();
-    method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public java.util.List<java.lang.String> getUnsupportedCountries();
-    method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public boolean isSupportedCountry(@NonNull String);
-    method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void setSupportedCountries(@NonNull java.util.List<java.lang.String>);
-    method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void setUnsupportedCountries(@NonNull java.util.List<java.lang.String>);
-    field public static final String ACTION_DELETE_SUBSCRIPTION_PRIVILEGED = "android.telephony.euicc.action.DELETE_SUBSCRIPTION_PRIVILEGED";
-    field @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public static final String ACTION_OTA_STATUS_CHANGED = "android.telephony.euicc.action.OTA_STATUS_CHANGED";
-    field public static final String ACTION_PROVISION_EMBEDDED_SUBSCRIPTION = "android.telephony.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION";
-    field public static final String ACTION_RENAME_SUBSCRIPTION_PRIVILEGED = "android.telephony.euicc.action.RENAME_SUBSCRIPTION_PRIVILEGED";
-    field public static final String ACTION_TOGGLE_SUBSCRIPTION_PRIVILEGED = "android.telephony.euicc.action.TOGGLE_SUBSCRIPTION_PRIVILEGED";
-    field public static final int EUICC_ACTIVATION_TYPE_ACCOUNT_REQUIRED = 4; // 0x4
-    field public static final int EUICC_ACTIVATION_TYPE_BACKUP = 2; // 0x2
-    field public static final int EUICC_ACTIVATION_TYPE_DEFAULT = 1; // 0x1
-    field public static final int EUICC_ACTIVATION_TYPE_TRANSFER = 3; // 0x3
-    field public static final int EUICC_OTA_FAILED = 2; // 0x2
-    field public static final int EUICC_OTA_IN_PROGRESS = 1; // 0x1
-    field public static final int EUICC_OTA_NOT_NEEDED = 4; // 0x4
-    field public static final int EUICC_OTA_STATUS_UNAVAILABLE = 5; // 0x5
-    field public static final int EUICC_OTA_SUCCEEDED = 3; // 0x3
-    field public static final String EXTRA_ACTIVATION_TYPE = "android.telephony.euicc.extra.ACTIVATION_TYPE";
-    field public static final String EXTRA_EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTIONS = "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTIONS";
-    field public static final String EXTRA_ENABLE_SUBSCRIPTION = "android.telephony.euicc.extra.ENABLE_SUBSCRIPTION";
-    field public static final String EXTRA_FORCE_PROVISION = "android.telephony.euicc.extra.FORCE_PROVISION";
-    field public static final String EXTRA_FROM_SUBSCRIPTION_ID = "android.telephony.euicc.extra.FROM_SUBSCRIPTION_ID";
-    field public static final String EXTRA_PHYSICAL_SLOT_ID = "android.telephony.euicc.extra.PHYSICAL_SLOT_ID";
-    field public static final String EXTRA_SUBSCRIPTION_ID = "android.telephony.euicc.extra.SUBSCRIPTION_ID";
-    field public static final String EXTRA_SUBSCRIPTION_NICKNAME = "android.telephony.euicc.extra.SUBSCRIPTION_NICKNAME";
-  }
-
-  @IntDef(prefix={"EUICC_OTA_"}, value={android.telephony.euicc.EuiccManager.EUICC_OTA_IN_PROGRESS, android.telephony.euicc.EuiccManager.EUICC_OTA_FAILED, android.telephony.euicc.EuiccManager.EUICC_OTA_SUCCEEDED, android.telephony.euicc.EuiccManager.EUICC_OTA_NOT_NEEDED, android.telephony.euicc.EuiccManager.EUICC_OTA_STATUS_UNAVAILABLE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccManager.OtaStatus {
-  }
-
-  public final class EuiccNotification implements android.os.Parcelable {
-    ctor public EuiccNotification(int, String, @android.telephony.euicc.EuiccNotification.Event int, @Nullable byte[]);
-    method public int describeContents();
-    method @Nullable public byte[] getData();
-    method @android.telephony.euicc.EuiccNotification.Event public int getEvent();
-    method public int getSeq();
-    method public String getTargetAddr();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @android.telephony.euicc.EuiccNotification.Event public static final int ALL_EVENTS = 15; // 0xf
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.euicc.EuiccNotification> CREATOR;
-    field public static final int EVENT_DELETE = 8; // 0x8
-    field public static final int EVENT_DISABLE = 4; // 0x4
-    field public static final int EVENT_ENABLE = 2; // 0x2
-    field public static final int EVENT_INSTALL = 1; // 0x1
-  }
-
-  @IntDef(flag=true, prefix={"EVENT_"}, value={android.telephony.euicc.EuiccNotification.EVENT_INSTALL, android.telephony.euicc.EuiccNotification.EVENT_ENABLE, android.telephony.euicc.EuiccNotification.EVENT_DISABLE, android.telephony.euicc.EuiccNotification.EVENT_DELETE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccNotification.Event {
-  }
-
-  public final class EuiccRulesAuthTable implements android.os.Parcelable {
-    method public int describeContents();
-    method public int findIndex(@android.service.euicc.EuiccProfileInfo.PolicyRule int, android.service.carrier.CarrierIdentifier);
-    method public boolean hasPolicyRuleFlag(int, @android.telephony.euicc.EuiccRulesAuthTable.PolicyRuleFlag int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.euicc.EuiccRulesAuthTable> CREATOR;
-    field public static final int POLICY_RULE_FLAG_CONSENT_REQUIRED = 1; // 0x1
-  }
-
-  public static final class EuiccRulesAuthTable.Builder {
-    ctor public EuiccRulesAuthTable.Builder(int);
-    method public android.telephony.euicc.EuiccRulesAuthTable.Builder add(int, java.util.List<android.service.carrier.CarrierIdentifier>, int);
-    method public android.telephony.euicc.EuiccRulesAuthTable build();
-  }
-
-  @IntDef(flag=true, prefix={"POLICY_RULE_FLAG_"}, value={android.telephony.euicc.EuiccRulesAuthTable.POLICY_RULE_FLAG_CONSENT_REQUIRED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccRulesAuthTable.PolicyRuleFlag {
-  }
-
-}
-
-package android.telephony.ims {
-
-  public final class AudioCodecAttributes implements android.os.Parcelable {
-    ctor public AudioCodecAttributes(float, @NonNull android.util.Range<java.lang.Float>, float, @NonNull android.util.Range<java.lang.Float>);
-    method public int describeContents();
-    method public float getBandwidthKhz();
-    method @NonNull public android.util.Range<java.lang.Float> getBandwidthRangeKhz();
-    method public float getBitrateKbps();
-    method @NonNull public android.util.Range<java.lang.Float> getBitrateRangeKbps();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.AudioCodecAttributes> CREATOR;
-  }
-
-  public final class ImsCallForwardInfo implements android.os.Parcelable {
-    ctor public ImsCallForwardInfo(int, int, int, int, @NonNull String, int);
-    method public int describeContents();
-    method public int getCondition();
-    method public String getNumber();
-    method public int getServiceClass();
-    method public int getStatus();
-    method public int getTimeSeconds();
-    method public int getToA();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int CDIV_CF_REASON_ALL = 4; // 0x4
-    field public static final int CDIV_CF_REASON_ALL_CONDITIONAL = 5; // 0x5
-    field public static final int CDIV_CF_REASON_BUSY = 1; // 0x1
-    field public static final int CDIV_CF_REASON_NOT_LOGGED_IN = 6; // 0x6
-    field public static final int CDIV_CF_REASON_NOT_REACHABLE = 3; // 0x3
-    field public static final int CDIV_CF_REASON_NO_REPLY = 2; // 0x2
-    field public static final int CDIV_CF_REASON_UNCONDITIONAL = 0; // 0x0
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsCallForwardInfo> CREATOR;
-    field public static final int STATUS_ACTIVE = 1; // 0x1
-    field public static final int STATUS_NOT_ACTIVE = 0; // 0x0
-    field public static final int TYPE_OF_ADDRESS_INTERNATIONAL = 145; // 0x91
-    field public static final int TYPE_OF_ADDRESS_UNKNOWN = 129; // 0x81
-  }
-
-  public final class ImsCallProfile implements android.os.Parcelable {
-    ctor public ImsCallProfile();
-    ctor public ImsCallProfile(int, int);
-    ctor public ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile);
-    method public int describeContents();
-    method @NonNull public java.util.Set<android.telephony.ims.RtpHeaderExtensionType> getAcceptedRtpHeaderExtensionTypes();
-    method public String getCallExtra(String);
-    method public String getCallExtra(String, String);
-    method public boolean getCallExtraBoolean(String);
-    method public boolean getCallExtraBoolean(String, boolean);
-    method public int getCallExtraInt(String);
-    method public int getCallExtraInt(String, int);
-    method public android.os.Bundle getCallExtras();
-    method public int getCallType();
-    method public static int getCallTypeFromVideoState(int);
-    method public int getCallerNumberVerificationStatus();
-    method public int getEmergencyCallRouting();
-    method public int getEmergencyServiceCategories();
-    method @NonNull public java.util.List<java.lang.String> getEmergencyUrns();
-    method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile();
-    method @NonNull public java.util.Set<android.telephony.ims.RtpHeaderExtensionType> getOfferedRtpHeaderExtensionTypes();
-    method @NonNull public android.os.Bundle getProprietaryCallExtras();
-    method public int getRestrictCause();
-    method public int getServiceType();
-    method public static int getVideoStateFromCallType(int);
-    method public static int getVideoStateFromImsCallProfile(android.telephony.ims.ImsCallProfile);
-    method public boolean hasKnownUserIntentEmergency();
-    method public boolean isEmergencyCallTesting();
-    method public boolean isVideoCall();
-    method public boolean isVideoPaused();
-    method public static int presentationToOir(int);
-    method public void setAcceptedRtpHeaderExtensionTypes(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtensionType>);
-    method public void setCallExtra(String, String);
-    method public void setCallExtraBoolean(String, boolean);
-    method public void setCallExtraInt(String, int);
-    method public void setCallRestrictCause(int);
-    method public void setCallerNumberVerificationStatus(int);
-    method public void setEmergencyCallRouting(int);
-    method public void setEmergencyCallTesting(boolean);
-    method public void setEmergencyServiceCategories(int);
-    method public void setEmergencyUrns(@NonNull java.util.List<java.lang.String>);
-    method public void setHasKnownUserIntentEmergency(boolean);
-    method public void setOfferedRtpHeaderExtensionTypes(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtensionType>);
-    method public void updateCallExtras(android.telephony.ims.ImsCallProfile);
-    method public void updateCallType(android.telephony.ims.ImsCallProfile);
-    method public void updateMediaProfile(android.telephony.ims.ImsCallProfile);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int CALL_RESTRICT_CAUSE_DISABLED = 2; // 0x2
-    field public static final int CALL_RESTRICT_CAUSE_HD = 3; // 0x3
-    field public static final int CALL_RESTRICT_CAUSE_NONE = 0; // 0x0
-    field public static final int CALL_RESTRICT_CAUSE_RAT = 1; // 0x1
-    field public static final int CALL_TYPE_VIDEO_N_VOICE = 3; // 0x3
-    field public static final int CALL_TYPE_VOICE = 2; // 0x2
-    field public static final int CALL_TYPE_VOICE_N_VIDEO = 1; // 0x1
-    field public static final int CALL_TYPE_VS = 8; // 0x8
-    field public static final int CALL_TYPE_VS_RX = 10; // 0xa
-    field public static final int CALL_TYPE_VS_TX = 9; // 0x9
-    field public static final int CALL_TYPE_VT = 4; // 0x4
-    field public static final int CALL_TYPE_VT_NODIR = 7; // 0x7
-    field public static final int CALL_TYPE_VT_RX = 6; // 0x6
-    field public static final int CALL_TYPE_VT_TX = 5; // 0x5
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsCallProfile> CREATOR;
-    field public static final int DIALSTRING_NORMAL = 0; // 0x0
-    field public static final int DIALSTRING_SS_CONF = 1; // 0x1
-    field public static final int DIALSTRING_USSD = 2; // 0x2
-    field public static final String EXTRA_ADDITIONAL_CALL_INFO = "AdditionalCallInfo";
-    field public static final String EXTRA_ADDITIONAL_SIP_INVITE_FIELDS = "android.telephony.ims.extra.ADDITIONAL_SIP_INVITE_FIELDS";
-    field public static final String EXTRA_CALL_DISCONNECT_CAUSE = "android.telephony.ims.extra.CALL_DISCONNECT_CAUSE";
-    field public static final String EXTRA_CALL_NETWORK_TYPE = "android.telephony.ims.extra.CALL_NETWORK_TYPE";
-    field @Deprecated public static final String EXTRA_CALL_RAT_TYPE = "CallRadioTech";
-    field public static final String EXTRA_CHILD_NUMBER = "ChildNum";
-    field public static final String EXTRA_CNA = "cna";
-    field public static final String EXTRA_CNAP = "cnap";
-    field public static final String EXTRA_CODEC = "Codec";
-    field public static final String EXTRA_DIALSTRING = "dialstring";
-    field public static final String EXTRA_DISPLAY_TEXT = "DisplayText";
-    field public static final String EXTRA_EMERGENCY_CALL = "e_call";
-    field public static final String EXTRA_FORWARDED_NUMBER = "android.telephony.ims.extra.FORWARDED_NUMBER";
-    field public static final String EXTRA_IS_CALL_PULL = "CallPull";
-    field public static final String EXTRA_OI = "oi";
-    field public static final String EXTRA_OIR = "oir";
-    field public static final String EXTRA_REMOTE_URI = "remote_uri";
-    field public static final String EXTRA_USSD = "ussd";
-    field public static final int OIR_DEFAULT = 0; // 0x0
-    field public static final int OIR_PRESENTATION_NOT_RESTRICTED = 2; // 0x2
-    field public static final int OIR_PRESENTATION_PAYPHONE = 4; // 0x4
-    field public static final int OIR_PRESENTATION_RESTRICTED = 1; // 0x1
-    field public static final int OIR_PRESENTATION_UNKNOWN = 3; // 0x3
-    field public static final int SERVICE_TYPE_EMERGENCY = 2; // 0x2
-    field public static final int SERVICE_TYPE_NONE = 0; // 0x0
-    field public static final int SERVICE_TYPE_NORMAL = 1; // 0x1
-    field public static final int VERIFICATION_STATUS_FAILED = 2; // 0x2
-    field public static final int VERIFICATION_STATUS_NOT_VERIFIED = 0; // 0x0
-    field public static final int VERIFICATION_STATUS_PASSED = 1; // 0x1
-  }
-
-  public class ImsCallSessionListener {
-    method public void callQualityChanged(@NonNull android.telephony.CallQuality);
-    method public void callSessionConferenceExtendFailed(android.telephony.ims.ImsReasonInfo);
-    method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile);
-    method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile);
-    method public void callSessionConferenceStateUpdated(android.telephony.ims.ImsConferenceState);
-    method public void callSessionDtmfReceived(char);
-    method @Deprecated public void callSessionHandover(int, int, android.telephony.ims.ImsReasonInfo);
-    method @Deprecated public void callSessionHandoverFailed(int, int, android.telephony.ims.ImsReasonInfo);
-    method public void callSessionHeld(android.telephony.ims.ImsCallProfile);
-    method public void callSessionHoldFailed(android.telephony.ims.ImsReasonInfo);
-    method public void callSessionHoldReceived(android.telephony.ims.ImsCallProfile);
-    method public void callSessionInitiated(android.telephony.ims.ImsCallProfile);
-    method public void callSessionInitiatedFailed(android.telephony.ims.ImsReasonInfo);
-    method public void callSessionInviteParticipantsRequestDelivered();
-    method public void callSessionInviteParticipantsRequestFailed(android.telephony.ims.ImsReasonInfo);
-    method @Deprecated public void callSessionMayHandover(int, int);
-    method public void callSessionMergeComplete(android.telephony.ims.stub.ImsCallSessionImplBase);
-    method public void callSessionMergeFailed(android.telephony.ims.ImsReasonInfo);
-    method public void callSessionMergeStarted(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile);
-    method public void callSessionMultipartyStateChanged(boolean);
-    method public void callSessionProgressing(android.telephony.ims.ImsStreamMediaProfile);
-    method public void callSessionRemoveParticipantsRequestDelivered();
-    method public void callSessionRemoveParticipantsRequestFailed(android.telephony.ims.ImsReasonInfo);
-    method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo);
-    method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile);
-    method public void callSessionResumed(android.telephony.ims.ImsCallProfile);
-    method public void callSessionRtpHeaderExtensionsReceived(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtension>);
-    method public void callSessionRttAudioIndicatorChanged(@NonNull android.telephony.ims.ImsStreamMediaProfile);
-    method public void callSessionRttMessageReceived(String);
-    method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile);
-    method public void callSessionRttModifyResponseReceived(int);
-    method public void callSessionSuppServiceReceived(android.telephony.ims.ImsSuppServiceNotification);
-    method public void callSessionTerminated(android.telephony.ims.ImsReasonInfo);
-    method public void callSessionTtyModeReceived(int);
-    method public void callSessionUpdateFailed(android.telephony.ims.ImsReasonInfo);
-    method public void callSessionUpdateReceived(android.telephony.ims.ImsCallProfile);
-    method public void callSessionUpdated(android.telephony.ims.ImsCallProfile);
-    method public void callSessionUssdMessageReceived(int, String);
-    method public void onHandover(int, int, @Nullable android.telephony.ims.ImsReasonInfo);
-    method public void onHandoverFailed(int, int, @NonNull android.telephony.ims.ImsReasonInfo);
-    method public void onMayHandover(int, int);
-  }
-
-  public final class ImsConferenceState implements android.os.Parcelable {
-    method public int describeContents();
-    method public static int getConnectionStateForStatus(String);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsConferenceState> CREATOR;
-    field public static final String DISPLAY_TEXT = "display-text";
-    field public static final String ENDPOINT = "endpoint";
-    field public static final String SIP_STATUS_CODE = "sipstatuscode";
-    field public static final String STATUS = "status";
-    field public static final String STATUS_ALERTING = "alerting";
-    field public static final String STATUS_CONNECTED = "connected";
-    field public static final String STATUS_CONNECT_FAIL = "connect-fail";
-    field public static final String STATUS_DIALING_IN = "dialing-in";
-    field public static final String STATUS_DIALING_OUT = "dialing-out";
-    field public static final String STATUS_DISCONNECTED = "disconnected";
-    field public static final String STATUS_DISCONNECTING = "disconnecting";
-    field public static final String STATUS_MUTED_VIA_FOCUS = "muted-via-focus";
-    field public static final String STATUS_ON_HOLD = "on-hold";
-    field public static final String STATUS_PENDING = "pending";
-    field public static final String STATUS_SEND_ONLY = "sendonly";
-    field public static final String STATUS_SEND_RECV = "sendrecv";
-    field public static final String USER = "user";
-    field public final java.util.HashMap<java.lang.String,android.os.Bundle> mParticipants;
-  }
-
-  public final class ImsException extends java.lang.Exception {
-    ctor public ImsException(@Nullable String);
-    ctor public ImsException(@Nullable String, int);
-    ctor public ImsException(@Nullable String, int, @Nullable Throwable);
-  }
-
-  public final class ImsExternalCallState implements android.os.Parcelable {
-    ctor public ImsExternalCallState(@NonNull String, @NonNull android.net.Uri, @Nullable android.net.Uri, boolean, int, int, boolean);
-    method public int describeContents();
-    method @NonNull public android.net.Uri getAddress();
-    method public int getCallId();
-    method public int getCallState();
-    method public int getCallType();
-    method @Nullable public android.net.Uri getLocalAddress();
-    method public boolean isCallHeld();
-    method public boolean isCallPullable();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int CALL_STATE_CONFIRMED = 1; // 0x1
-    field public static final int CALL_STATE_TERMINATED = 2; // 0x2
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsExternalCallState> CREATOR;
-  }
-
-  public class ImsManager {
-    method @NonNull public android.telephony.ims.SipDelegateManager getSipDelegateManager(int);
-  }
-
-  public class ImsMmTelManager implements android.telephony.ims.RegistrationManager {
-    method @Deprecated @NonNull @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public static android.telephony.ims.ImsMmTelManager createForSubscriptionId(int);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getFeatureState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>) throws android.telephony.ims.ImsException;
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getRegistrationState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getVoWiFiRoamingModeSetting();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAvailable(int, int);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isCapable(int, int);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void isSupported(int, int, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>) throws android.telephony.ims.ImsException;
-    method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback) throws android.telephony.ims.ImsException;
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setAdvancedCallingSettingEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRttCapabilitySetting(boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiModeSetting(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiNonPersistent(boolean, int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingModeSetting(int);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingSettingEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSettingEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVtSettingEnabled(boolean);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback);
-  }
-
-  @Deprecated public static class ImsMmTelManager.RegistrationCallback extends android.telephony.ims.RegistrationManager.RegistrationCallback {
-    ctor @Deprecated public ImsMmTelManager.RegistrationCallback();
-  }
-
-  public final class ImsReasonInfo implements android.os.Parcelable {
-    field public static final String EXTRA_MSG_SERVICE_NOT_AUTHORIZED = "Forbidden. Not Authorized for Service";
-  }
-
-  public class ImsService extends android.app.Service {
-    ctor public ImsService();
-    method public android.telephony.ims.feature.MmTelFeature createMmTelFeature(int);
-    method public android.telephony.ims.feature.RcsFeature createRcsFeature(int);
-    method public void disableIms(int);
-    method public void enableIms(int);
-    method public android.telephony.ims.stub.ImsConfigImplBase getConfig(int);
-    method public long getImsServiceCapabilities();
-    method public android.telephony.ims.stub.ImsRegistrationImplBase getRegistration(int);
-    method @Nullable public android.telephony.ims.stub.SipTransportImplBase getSipTransport(int);
-    method public final void onUpdateSupportedImsFeatures(android.telephony.ims.stub.ImsFeatureConfiguration) throws android.os.RemoteException;
-    method public android.telephony.ims.stub.ImsFeatureConfiguration querySupportedImsFeatures();
-    method public void readyForFeatureCreation();
-    field public static final long CAPABILITY_SIP_DELEGATE_CREATION = 2L; // 0x2L
-  }
-
-  public final class ImsSsData implements android.os.Parcelable {
-    ctor public ImsSsData(int, int, int, int, int);
-    method public int describeContents();
-    method @Nullable public java.util.List<android.telephony.ims.ImsCallForwardInfo> getCallForwardInfo();
-    method public int getRequestType();
-    method public int getResult();
-    method public int getServiceClass();
-    method public int getServiceType();
-    method @NonNull public java.util.List<android.telephony.ims.ImsSsInfo> getSuppServiceInfo();
-    method public int getTeleserviceType();
-    method public boolean isTypeBarring();
-    method public boolean isTypeCf();
-    method public boolean isTypeClip();
-    method public boolean isTypeClir();
-    method public boolean isTypeColp();
-    method public boolean isTypeColr();
-    method public boolean isTypeCw();
-    method public boolean isTypeIcb();
-    method public boolean isTypeInterrogation();
-    method public boolean isTypeUnConditional();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSsData> CREATOR;
-    field public static final int RESULT_SUCCESS = 0; // 0x0
-    field public static final int SERVICE_CLASS_DATA = 2; // 0x2
-    field public static final int SERVICE_CLASS_DATA_CIRCUIT_ASYNC = 32; // 0x20
-    field public static final int SERVICE_CLASS_DATA_CIRCUIT_SYNC = 16; // 0x10
-    field public static final int SERVICE_CLASS_DATA_PACKET_ACCESS = 64; // 0x40
-    field public static final int SERVICE_CLASS_DATA_PAD = 128; // 0x80
-    field public static final int SERVICE_CLASS_FAX = 4; // 0x4
-    field public static final int SERVICE_CLASS_NONE = 0; // 0x0
-    field public static final int SERVICE_CLASS_SMS = 8; // 0x8
-    field public static final int SERVICE_CLASS_VOICE = 1; // 0x1
-    field public static final int SS_ACTIVATION = 0; // 0x0
-    field public static final int SS_ALL_BARRING = 18; // 0x12
-    field public static final int SS_ALL_DATA_TELESERVICES = 3; // 0x3
-    field public static final int SS_ALL_TELESERVICES_EXCEPT_SMS = 5; // 0x5
-    field public static final int SS_ALL_TELESEVICES = 1; // 0x1
-    field public static final int SS_ALL_TELE_AND_BEARER_SERVICES = 0; // 0x0
-    field public static final int SS_BAIC = 16; // 0x10
-    field public static final int SS_BAIC_ROAMING = 17; // 0x11
-    field public static final int SS_BAOC = 13; // 0xd
-    field public static final int SS_BAOIC = 14; // 0xe
-    field public static final int SS_BAOIC_EXC_HOME = 15; // 0xf
-    field public static final int SS_CFU = 0; // 0x0
-    field public static final int SS_CFUT = 6; // 0x6
-    field public static final int SS_CF_ALL = 4; // 0x4
-    field public static final int SS_CF_ALL_CONDITIONAL = 5; // 0x5
-    field public static final int SS_CF_BUSY = 1; // 0x1
-    field public static final int SS_CF_NOT_REACHABLE = 3; // 0x3
-    field public static final int SS_CF_NO_REPLY = 2; // 0x2
-    field public static final int SS_CLIP = 7; // 0x7
-    field public static final int SS_CLIR = 8; // 0x8
-    field public static final int SS_CNAP = 11; // 0xb
-    field public static final int SS_COLP = 9; // 0x9
-    field public static final int SS_COLR = 10; // 0xa
-    field public static final int SS_DEACTIVATION = 1; // 0x1
-    field public static final int SS_ERASURE = 4; // 0x4
-    field public static final int SS_INCOMING_BARRING = 20; // 0x14
-    field public static final int SS_INCOMING_BARRING_ANONYMOUS = 22; // 0x16
-    field public static final int SS_INCOMING_BARRING_DN = 21; // 0x15
-    field public static final int SS_INTERROGATION = 2; // 0x2
-    field public static final int SS_OUTGOING_BARRING = 19; // 0x13
-    field public static final int SS_REGISTRATION = 3; // 0x3
-    field public static final int SS_SMS_SERVICES = 4; // 0x4
-    field public static final int SS_TELEPHONY = 2; // 0x2
-    field public static final int SS_WAIT = 12; // 0xc
-  }
-
-  public static final class ImsSsData.Builder {
-    ctor public ImsSsData.Builder(int, int, int, int, int);
-    method @NonNull public android.telephony.ims.ImsSsData build();
-    method @NonNull public android.telephony.ims.ImsSsData.Builder setCallForwardingInfo(@NonNull java.util.List<android.telephony.ims.ImsCallForwardInfo>);
-    method @NonNull public android.telephony.ims.ImsSsData.Builder setSuppServiceInfo(@NonNull java.util.List<android.telephony.ims.ImsSsInfo>);
-  }
-
-  public final class ImsSsInfo implements android.os.Parcelable {
-    ctor @Deprecated public ImsSsInfo(int, @Nullable String);
-    method public int describeContents();
-    method public int getClirInterrogationStatus();
-    method public int getClirOutgoingState();
-    method @Deprecated public String getIcbNum();
-    method @Nullable public String getIncomingCommunicationBarringNumber();
-    method public int getProvisionStatus();
-    method public int getStatus();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int CLIR_OUTGOING_DEFAULT = 0; // 0x0
-    field public static final int CLIR_OUTGOING_INVOCATION = 1; // 0x1
-    field public static final int CLIR_OUTGOING_SUPPRESSION = 2; // 0x2
-    field public static final int CLIR_STATUS_NOT_PROVISIONED = 0; // 0x0
-    field public static final int CLIR_STATUS_PROVISIONED_PERMANENT = 1; // 0x1
-    field public static final int CLIR_STATUS_TEMPORARILY_ALLOWED = 4; // 0x4
-    field public static final int CLIR_STATUS_TEMPORARILY_RESTRICTED = 3; // 0x3
-    field public static final int CLIR_STATUS_UNKNOWN = 2; // 0x2
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSsInfo> CREATOR;
-    field public static final int DISABLED = 0; // 0x0
-    field public static final int ENABLED = 1; // 0x1
-    field public static final int NOT_REGISTERED = -1; // 0xffffffff
-    field public static final int SERVICE_NOT_PROVISIONED = 0; // 0x0
-    field public static final int SERVICE_PROVISIONED = 1; // 0x1
-    field public static final int SERVICE_PROVISIONING_UNKNOWN = -1; // 0xffffffff
-  }
-
-  public static final class ImsSsInfo.Builder {
-    ctor public ImsSsInfo.Builder(int);
-    method @NonNull public android.telephony.ims.ImsSsInfo build();
-    method @NonNull public android.telephony.ims.ImsSsInfo.Builder setClirInterrogationStatus(int);
-    method @NonNull public android.telephony.ims.ImsSsInfo.Builder setClirOutgoingState(int);
-    method @NonNull public android.telephony.ims.ImsSsInfo.Builder setIncomingCommunicationBarringNumber(@NonNull String);
-    method @NonNull public android.telephony.ims.ImsSsInfo.Builder setProvisionStatus(int);
-  }
-
-  public final class ImsStreamMediaProfile implements android.os.Parcelable {
-    ctor public ImsStreamMediaProfile(int, int, int, int, int);
-    method public void copyFrom(android.telephony.ims.ImsStreamMediaProfile);
-    method public int describeContents();
-    method @Nullable public android.telephony.ims.AudioCodecAttributes getAudioCodecAttributes();
-    method public int getAudioDirection();
-    method public int getAudioQuality();
-    method public int getRttMode();
-    method public int getVideoDirection();
-    method public int getVideoQuality();
-    method public boolean isReceivingRttAudio();
-    method public boolean isRttCall();
-    method public void setAudioCodecAttributes(@NonNull android.telephony.ims.AudioCodecAttributes);
-    method public void setReceivingRttAudio(boolean);
-    method public void setRttMode(int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int AUDIO_QUALITY_AMR = 1; // 0x1
-    field public static final int AUDIO_QUALITY_AMR_WB = 2; // 0x2
-    field public static final int AUDIO_QUALITY_EVRC = 4; // 0x4
-    field public static final int AUDIO_QUALITY_EVRC_B = 5; // 0x5
-    field public static final int AUDIO_QUALITY_EVRC_NW = 7; // 0x7
-    field public static final int AUDIO_QUALITY_EVRC_WB = 6; // 0x6
-    field public static final int AUDIO_QUALITY_EVS_FB = 20; // 0x14
-    field public static final int AUDIO_QUALITY_EVS_NB = 17; // 0x11
-    field public static final int AUDIO_QUALITY_EVS_SWB = 19; // 0x13
-    field public static final int AUDIO_QUALITY_EVS_WB = 18; // 0x12
-    field public static final int AUDIO_QUALITY_G711A = 13; // 0xd
-    field public static final int AUDIO_QUALITY_G711AB = 15; // 0xf
-    field public static final int AUDIO_QUALITY_G711U = 11; // 0xb
-    field public static final int AUDIO_QUALITY_G722 = 14; // 0xe
-    field public static final int AUDIO_QUALITY_G723 = 12; // 0xc
-    field public static final int AUDIO_QUALITY_G729 = 16; // 0x10
-    field public static final int AUDIO_QUALITY_GSM_EFR = 8; // 0x8
-    field public static final int AUDIO_QUALITY_GSM_FR = 9; // 0x9
-    field public static final int AUDIO_QUALITY_GSM_HR = 10; // 0xa
-    field public static final int AUDIO_QUALITY_NONE = 0; // 0x0
-    field public static final int AUDIO_QUALITY_QCELP13K = 3; // 0x3
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsStreamMediaProfile> CREATOR;
-    field public static final int DIRECTION_INACTIVE = 0; // 0x0
-    field public static final int DIRECTION_INVALID = -1; // 0xffffffff
-    field public static final int DIRECTION_RECEIVE = 1; // 0x1
-    field public static final int DIRECTION_SEND = 2; // 0x2
-    field public static final int DIRECTION_SEND_RECEIVE = 3; // 0x3
-    field public static final int RTT_MODE_DISABLED = 0; // 0x0
-    field public static final int RTT_MODE_FULL = 1; // 0x1
-    field public static final int VIDEO_QUALITY_NONE = 0; // 0x0
-    field public static final int VIDEO_QUALITY_QCIF = 1; // 0x1
-    field public static final int VIDEO_QUALITY_QVGA_LANDSCAPE = 2; // 0x2
-    field public static final int VIDEO_QUALITY_QVGA_PORTRAIT = 4; // 0x4
-    field public static final int VIDEO_QUALITY_VGA_LANDSCAPE = 8; // 0x8
-    field public static final int VIDEO_QUALITY_VGA_PORTRAIT = 16; // 0x10
-  }
-
-  public final class ImsSuppServiceNotification implements android.os.Parcelable {
-    ctor public ImsSuppServiceNotification(int, int, int, int, String, String[]);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSuppServiceNotification> CREATOR;
-    field public final int code;
-    field public final String[] history;
-    field public final int index;
-    field public final int notificationType;
-    field public final String number;
-    field public final int type;
-  }
-
-  public class ImsUtListener {
-    method public void onLineIdentificationSupplementaryServiceResponse(int, @NonNull android.telephony.ims.ImsSsInfo);
-    method public void onSupplementaryServiceIndication(android.telephony.ims.ImsSsData);
-    method public void onUtConfigurationCallBarringQueried(int, android.telephony.ims.ImsSsInfo[]);
-    method public void onUtConfigurationCallForwardQueried(int, android.telephony.ims.ImsCallForwardInfo[]);
-    method public void onUtConfigurationCallWaitingQueried(int, android.telephony.ims.ImsSsInfo[]);
-    method @Deprecated public void onUtConfigurationQueried(int, android.os.Bundle);
-    method public void onUtConfigurationQueryFailed(int, android.telephony.ims.ImsReasonInfo);
-    method public void onUtConfigurationUpdateFailed(int, android.telephony.ims.ImsReasonInfo);
-    method public void onUtConfigurationUpdated(int);
-    field @Deprecated public static final String BUNDLE_KEY_CLIR = "queryClir";
-    field @Deprecated public static final String BUNDLE_KEY_SSINFO = "imsSsInfo";
-  }
-
-  public abstract class ImsVideoCallProvider {
-    ctor public ImsVideoCallProvider();
-    method public void changeCallDataUsage(long);
-    method public void changeCameraCapabilities(android.telecom.VideoProfile.CameraCapabilities);
-    method public void changePeerDimensions(int, int);
-    method public void changeVideoQuality(int);
-    method public void handleCallSessionEvent(int);
-    method public abstract void onRequestCallDataUsage();
-    method public abstract void onRequestCameraCapabilities();
-    method public abstract void onSendSessionModifyRequest(android.telecom.VideoProfile, android.telecom.VideoProfile);
-    method public abstract void onSendSessionModifyResponse(android.telecom.VideoProfile);
-    method public abstract void onSetCamera(String);
-    method public void onSetCamera(String, int);
-    method public abstract void onSetDeviceOrientation(int);
-    method public abstract void onSetDisplaySurface(android.view.Surface);
-    method public abstract void onSetPauseImage(android.net.Uri);
-    method public abstract void onSetPreviewSurface(android.view.Surface);
-    method public abstract void onSetZoom(float);
-    method public void receiveSessionModifyRequest(android.telecom.VideoProfile);
-    method public void receiveSessionModifyResponse(int, android.telecom.VideoProfile, android.telecom.VideoProfile);
-  }
-
-  public class ProvisioningManager {
-    method @NonNull public static android.telephony.ims.ProvisioningManager createForSubscriptionId(int);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public int getProvisioningIntValue(int);
-    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.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.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) @WorkerThread public void setRcsProvisioningStatusForCapability(int, boolean);
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.Callback);
-    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 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";
-  }
-
-  public static class ProvisioningManager.Callback {
-    ctor public ProvisioningManager.Callback();
-    method public void onProvisioningIntChanged(int, int);
-    method public void onProvisioningStringChanged(int, @NonNull String);
-  }
-
-  public class RcsUceAdapter {
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException;
-  }
-
-  public final class RtpHeaderExtension implements android.os.Parcelable {
-    ctor public RtpHeaderExtension(@IntRange(from=1, to=14) int, @NonNull byte[]);
-    method public int describeContents();
-    method @NonNull public byte[] getExtensionData();
-    method @IntRange(from=1, to=14) public int getLocalIdentifier();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.RtpHeaderExtension> CREATOR;
-  }
-
-  public final class RtpHeaderExtensionType implements android.os.Parcelable {
-    ctor public RtpHeaderExtensionType(@IntRange(from=1, to=14) int, @NonNull android.net.Uri);
-    method public int describeContents();
-    method @IntRange(from=1, to=14) public int getLocalIdentifier();
-    method @NonNull public android.net.Uri getUri();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.RtpHeaderExtensionType> CREATOR;
-  }
-
-  public class SipDelegateManager {
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSupported() throws android.telephony.ims.ImsException;
-  }
-
-}
-
-package android.telephony.ims.feature {
-
-  public final class CapabilityChangeRequest implements android.os.Parcelable {
-    method public void addCapabilitiesToDisableForTech(int, int);
-    method public void addCapabilitiesToEnableForTech(int, int);
-    method public int describeContents();
-    method public java.util.List<android.telephony.ims.feature.CapabilityChangeRequest.CapabilityPair> getCapabilitiesToDisable();
-    method public java.util.List<android.telephony.ims.feature.CapabilityChangeRequest.CapabilityPair> getCapabilitiesToEnable();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.feature.CapabilityChangeRequest> CREATOR;
-  }
-
-  public static class CapabilityChangeRequest.CapabilityPair {
-    ctor public CapabilityChangeRequest.CapabilityPair(int, int);
-    method public int getCapability();
-    method public int getRadioTech();
-  }
-
-  public abstract class ImsFeature {
-    ctor public ImsFeature();
-    method public abstract void changeEnabledCapabilities(android.telephony.ims.feature.CapabilityChangeRequest, android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy);
-    method public int getFeatureState();
-    method public final int getSlotIndex();
-    method public abstract void onFeatureReady();
-    method public abstract void onFeatureRemoved();
-    method public final void setFeatureState(int);
-    field public static final int CAPABILITY_ERROR_GENERIC = -1; // 0xffffffff
-    field public static final int CAPABILITY_SUCCESS = 0; // 0x0
-    field public static final int FEATURE_EMERGENCY_MMTEL = 0; // 0x0
-    field public static final int FEATURE_MMTEL = 1; // 0x1
-    field public static final int FEATURE_RCS = 2; // 0x2
-    field public static final int STATE_INITIALIZING = 1; // 0x1
-    field public static final int STATE_READY = 2; // 0x2
-    field public static final int STATE_UNAVAILABLE = 0; // 0x0
-  }
-
-  @Deprecated public static class ImsFeature.Capabilities {
-    field @Deprecated protected int mCapabilities;
-  }
-
-  protected static class ImsFeature.CapabilityCallbackProxy {
-    method public void onChangeCapabilityConfigurationError(int, int, int);
-  }
-
-  public class MmTelFeature extends android.telephony.ims.feature.ImsFeature {
-    ctor public MmTelFeature();
-    method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy);
-    method @Nullable public android.telephony.ims.ImsCallProfile createCallProfile(int, int);
-    method @Nullable public android.telephony.ims.stub.ImsCallSessionImplBase createCallSession(@NonNull android.telephony.ims.ImsCallProfile);
-    method @NonNull public android.telephony.ims.stub.ImsEcbmImplBase getEcbm();
-    method @NonNull public android.telephony.ims.stub.ImsMultiEndpointImplBase getMultiEndpoint();
-    method @NonNull public android.telephony.ims.stub.ImsSmsImplBase getSmsImplementation();
-    method @NonNull public android.telephony.ims.stub.ImsUtImplBase getUt();
-    method public final void notifyCapabilitiesStatusChanged(@NonNull android.telephony.ims.feature.MmTelFeature.MmTelCapabilities);
-    method public final void notifyIncomingCall(@NonNull android.telephony.ims.stub.ImsCallSessionImplBase, @NonNull android.os.Bundle);
-    method public final void notifyRejectedCall(@NonNull android.telephony.ims.ImsCallProfile, @NonNull android.telephony.ims.ImsReasonInfo);
-    method public final void notifyVoiceMessageCountUpdate(int);
-    method public void onFeatureReady();
-    method public void onFeatureRemoved();
-    method public boolean queryCapabilityConfiguration(int, int);
-    method @NonNull public final android.telephony.ims.feature.MmTelFeature.MmTelCapabilities queryCapabilityStatus();
-    method public void setUiTtyMode(int, @Nullable android.os.Message);
-    method public int shouldProcessCall(@NonNull String[]);
-    field public static final String EXTRA_IS_UNKNOWN_CALL = "android.telephony.ims.feature.extra.IS_UNKNOWN_CALL";
-    field public static final String EXTRA_IS_USSD = "android.telephony.ims.feature.extra.IS_USSD";
-    field public static final int PROCESS_CALL_CSFB = 1; // 0x1
-    field public static final int PROCESS_CALL_IMS = 0; // 0x0
-  }
-
-  public static class MmTelFeature.MmTelCapabilities extends android.telephony.ims.feature.ImsFeature.Capabilities {
-    ctor public MmTelFeature.MmTelCapabilities();
-    ctor @Deprecated public MmTelFeature.MmTelCapabilities(android.telephony.ims.feature.ImsFeature.Capabilities);
-    ctor public MmTelFeature.MmTelCapabilities(int);
-    method public final void addCapabilities(int);
-    method public final void removeCapabilities(int);
-  }
-
-  public class RcsFeature extends android.telephony.ims.feature.ImsFeature {
-    ctor public RcsFeature();
-    method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy);
-    method public void onFeatureReady();
-    method public void onFeatureRemoved();
-  }
-
-}
-
-package android.telephony.ims.stub {
-
-  public class ImsCallSessionImplBase implements java.lang.AutoCloseable {
-    ctor public ImsCallSessionImplBase();
-    method public void accept(int, android.telephony.ims.ImsStreamMediaProfile);
-    method public void close();
-    method public void deflect(String);
-    method public void extendToConference(String[]);
-    method public String getCallId();
-    method public android.telephony.ims.ImsCallProfile getCallProfile();
-    method public android.telephony.ims.ImsVideoCallProvider getImsVideoCallProvider();
-    method public android.telephony.ims.ImsCallProfile getLocalCallProfile();
-    method public String getProperty(String);
-    method public android.telephony.ims.ImsCallProfile getRemoteCallProfile();
-    method public int getState();
-    method public void hold(android.telephony.ims.ImsStreamMediaProfile);
-    method public void inviteParticipants(String[]);
-    method public boolean isInCall();
-    method public boolean isMultiparty();
-    method public void merge();
-    method public void reject(int);
-    method public void removeParticipants(String[]);
-    method public void resume(android.telephony.ims.ImsStreamMediaProfile);
-    method public void sendDtmf(char, android.os.Message);
-    method public void sendRtpHeaderExtensions(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtension>);
-    method public void sendRttMessage(String);
-    method public void sendRttModifyRequest(android.telephony.ims.ImsCallProfile);
-    method public void sendRttModifyResponse(boolean);
-    method public void sendUssd(String);
-    method public void setListener(android.telephony.ims.ImsCallSessionListener);
-    method public void setMute(boolean);
-    method public void start(String, android.telephony.ims.ImsCallProfile);
-    method public void startConference(String[], android.telephony.ims.ImsCallProfile);
-    method public void startDtmf(char);
-    method public void stopDtmf();
-    method public void terminate(int);
-    method public void update(int, android.telephony.ims.ImsStreamMediaProfile);
-    field public static final int USSD_MODE_NOTIFY = 0; // 0x0
-    field public static final int USSD_MODE_REQUEST = 1; // 0x1
-  }
-
-  public static class ImsCallSessionImplBase.State {
-    method public static String toString(int);
-    field public static final int ESTABLISHED = 4; // 0x4
-    field public static final int ESTABLISHING = 3; // 0x3
-    field public static final int IDLE = 0; // 0x0
-    field public static final int INITIATED = 1; // 0x1
-    field public static final int INVALID = -1; // 0xffffffff
-    field public static final int NEGOTIATING = 2; // 0x2
-    field public static final int REESTABLISHING = 6; // 0x6
-    field public static final int RENEGOTIATING = 5; // 0x5
-    field public static final int TERMINATED = 8; // 0x8
-    field public static final int TERMINATING = 7; // 0x7
-  }
-
-  public class ImsConfigImplBase {
-    ctor public ImsConfigImplBase();
-    method public int getConfigInt(int);
-    method public String getConfigString(int);
-    method public final void notifyProvisionedValueChanged(int, int);
-    method public final void notifyProvisionedValueChanged(int, String);
-    method public void notifyRcsAutoConfigurationReceived(@NonNull byte[], boolean);
-    method public int setConfig(int, int);
-    method public int setConfig(int, String);
-    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
-  }
-
-  public class ImsEcbmImplBase {
-    ctor public ImsEcbmImplBase();
-    method public final void enteredEcbm();
-    method public void exitEmergencyCallbackMode();
-    method public final void exitedEcbm();
-  }
-
-  public final class ImsFeatureConfiguration implements android.os.Parcelable {
-    method public int describeContents();
-    method public java.util.Set<android.telephony.ims.stub.ImsFeatureConfiguration.FeatureSlotPair> getServiceFeatures();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.stub.ImsFeatureConfiguration> CREATOR;
-  }
-
-  public static class ImsFeatureConfiguration.Builder {
-    ctor public ImsFeatureConfiguration.Builder();
-    method public android.telephony.ims.stub.ImsFeatureConfiguration.Builder addFeature(int, int);
-    method public android.telephony.ims.stub.ImsFeatureConfiguration build();
-  }
-
-  public static final class ImsFeatureConfiguration.FeatureSlotPair {
-    ctor public ImsFeatureConfiguration.FeatureSlotPair(int, int);
-    field public final int featureType;
-    field public final int slotId;
-  }
-
-  public class ImsMultiEndpointImplBase {
-    ctor public ImsMultiEndpointImplBase();
-    method public final void onImsExternalCallStateUpdate(java.util.List<android.telephony.ims.ImsExternalCallState>);
-    method public void requestImsExternalCallStateInfo();
-  }
-
-  public class ImsRegistrationImplBase {
-    ctor public ImsRegistrationImplBase();
-    method public final void onDeregistered(android.telephony.ims.ImsReasonInfo);
-    method public final void onRegistered(int);
-    method public final void onRegistering(int);
-    method public final void onSubscriberAssociatedUriChanged(android.net.Uri[]);
-    method public final void onTechnologyChangeFailed(int, android.telephony.ims.ImsReasonInfo);
-    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
-  }
-
-  public class ImsSmsImplBase {
-    ctor public ImsSmsImplBase();
-    method public void acknowledgeSms(int, @IntRange(from=0, to=65535) int, int);
-    method public void acknowledgeSmsReport(int, @IntRange(from=0, to=65535) int, int);
-    method public String getSmsFormat();
-    method public void onReady();
-    method @Deprecated public final void onSendSmsResult(int, @IntRange(from=0, to=65535) int, int, int) throws java.lang.RuntimeException;
-    method public final void onSendSmsResultError(int, @IntRange(from=0, to=65535) int, int, int, int) throws java.lang.RuntimeException;
-    method public final void onSendSmsResultSuccess(int, @IntRange(from=0, to=65535) int) throws java.lang.RuntimeException;
-    method public final void onSmsReceived(int, String, byte[]) throws java.lang.RuntimeException;
-    method @Deprecated public final void onSmsStatusReportReceived(int, @IntRange(from=0, to=65535) int, String, byte[]) throws java.lang.RuntimeException;
-    method public final void onSmsStatusReportReceived(int, String, byte[]) throws java.lang.RuntimeException;
-    method public void sendSms(int, @IntRange(from=0, to=65535) int, String, String, boolean, byte[]);
-    field public static final int DELIVER_STATUS_ERROR_GENERIC = 2; // 0x2
-    field public static final int DELIVER_STATUS_ERROR_NO_MEMORY = 3; // 0x3
-    field public static final int DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED = 4; // 0x4
-    field public static final int DELIVER_STATUS_OK = 1; // 0x1
-    field public static final int RESULT_NO_NETWORK_ERROR = -1; // 0xffffffff
-    field public static final int SEND_STATUS_ERROR = 2; // 0x2
-    field public static final int SEND_STATUS_ERROR_FALLBACK = 4; // 0x4
-    field public static final int SEND_STATUS_ERROR_RETRY = 3; // 0x3
-    field public static final int SEND_STATUS_OK = 1; // 0x1
-    field public static final int STATUS_REPORT_STATUS_ERROR = 2; // 0x2
-    field public static final int STATUS_REPORT_STATUS_OK = 1; // 0x1
-  }
-
-  public class ImsUtImplBase {
-    ctor public ImsUtImplBase();
-    method public void close();
-    method public int queryCallBarring(int);
-    method public int queryCallBarringForServiceClass(int, int);
-    method public int queryCallForward(int, String);
-    method public int queryCallWaiting();
-    method public int queryClip();
-    method public int queryClir();
-    method public int queryColp();
-    method public int queryColr();
-    method public void setListener(android.telephony.ims.ImsUtListener);
-    method public int transact(android.os.Bundle);
-    method public int updateCallBarring(int, int, String[]);
-    method public int updateCallBarringForServiceClass(int, int, String[], int);
-    method public int updateCallForward(int, int, String, int, int);
-    method public int updateCallWaiting(boolean, int);
-    method public int updateClip(boolean);
-    method public int updateClir(int);
-    method public int updateColp(boolean);
-    method public int updateColr(int);
-  }
-
-  public class SipTransportImplBase {
-    ctor public SipTransportImplBase(@NonNull java.util.concurrent.Executor);
-  }
-
-}
-
-package android.telephony.mbms {
-
-  public static class DownloadRequest.Builder {
-    method public android.telephony.mbms.DownloadRequest.Builder setServiceId(String);
-  }
-
-  public final class FileInfo implements android.os.Parcelable {
-    ctor public FileInfo(android.net.Uri, String);
-  }
-
-  public final class FileServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable {
-    ctor public FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>);
-  }
-
-  public class MbmsDownloadReceiver extends android.content.BroadcastReceiver {
-    field public static final int RESULT_APP_NOTIFICATION_ERROR = 6; // 0x6
-    field public static final int RESULT_BAD_TEMP_FILE_ROOT = 3; // 0x3
-    field public static final int RESULT_DOWNLOAD_FINALIZATION_ERROR = 4; // 0x4
-    field public static final int RESULT_INVALID_ACTION = 1; // 0x1
-    field public static final int RESULT_MALFORMED_INTENT = 2; // 0x2
-    field public static final int RESULT_OK = 0; // 0x0
-    field public static final int RESULT_TEMP_FILE_GENERATION_ERROR = 5; // 0x5
-  }
-
-  public final class StreamingServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable {
-    ctor public StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date);
-  }
-
-  public final class UriPathPair implements android.os.Parcelable {
-    method public int describeContents();
-    method public android.net.Uri getContentUri();
-    method public android.net.Uri getFilePathUri();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.mbms.UriPathPair> CREATOR;
-  }
-
-}
-
-package android.telephony.mbms.vendor {
-
-  public class MbmsDownloadServiceBase extends android.os.Binder implements android.os.IInterface {
-    ctor public MbmsDownloadServiceBase();
-    method public int addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException;
-    method public int addServiceAnnouncement(int, @NonNull byte[]);
-    method public int addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException;
-    method public android.os.IBinder asBinder();
-    method public int cancelDownload(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException;
-    method public void dispose(int) throws android.os.RemoteException;
-    method public int download(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException;
-    method public int initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback) throws android.os.RemoteException;
-    method @NonNull public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads(int) throws android.os.RemoteException;
-    method public void onAppCallbackDied(int, int);
-    method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
-    method public int removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException;
-    method public int removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException;
-    method public int requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) throws android.os.RemoteException;
-    method public int requestUpdateFileServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException;
-    method public int resetDownloadKnowledge(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException;
-    method public int setTempFileRootDirectory(int, String) throws android.os.RemoteException;
-  }
-
-  public class MbmsGroupCallServiceBase extends android.app.Service {
-    ctor public MbmsGroupCallServiceBase();
-    method public void dispose(int) throws android.os.RemoteException;
-    method public int initialize(@NonNull android.telephony.mbms.MbmsGroupCallSessionCallback, int) throws android.os.RemoteException;
-    method public void onAppCallbackDied(int, int);
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public int startGroupCall(int, long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>, @NonNull android.telephony.mbms.GroupCallCallback);
-    method public void stopGroupCall(int, long);
-    method public void updateGroupCall(int, long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>);
-  }
-
-  public class MbmsStreamingServiceBase extends android.os.Binder implements android.os.IInterface {
-    ctor public MbmsStreamingServiceBase();
-    method public android.os.IBinder asBinder();
-    method public void dispose(int) throws android.os.RemoteException;
-    method @Nullable public android.net.Uri getPlaybackUri(int, String) throws android.os.RemoteException;
-    method public int initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int) throws android.os.RemoteException;
-    method public void onAppCallbackDied(int, int);
-    method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
-    method public int requestUpdateStreamingServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException;
-    method public int startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback) throws android.os.RemoteException;
-    method public void stopStreaming(int, String) throws android.os.RemoteException;
-  }
-
-  public class VendorUtils {
-    ctor public VendorUtils();
-    method public static android.content.ComponentName getAppReceiverFromPackageName(android.content.Context, String);
-    field public static final String ACTION_CLEANUP = "android.telephony.mbms.action.CLEANUP";
-    field public static final String ACTION_DOWNLOAD_RESULT_INTERNAL = "android.telephony.mbms.action.DOWNLOAD_RESULT_INTERNAL";
-    field public static final String ACTION_FILE_DESCRIPTOR_REQUEST = "android.telephony.mbms.action.FILE_DESCRIPTOR_REQUEST";
-    field public static final String EXTRA_FD_COUNT = "android.telephony.mbms.extra.FD_COUNT";
-    field public static final String EXTRA_FINAL_URI = "android.telephony.mbms.extra.FINAL_URI";
-    field public static final String EXTRA_FREE_URI_LIST = "android.telephony.mbms.extra.FREE_URI_LIST";
-    field public static final String EXTRA_PAUSED_LIST = "android.telephony.mbms.extra.PAUSED_LIST";
-    field public static final String EXTRA_PAUSED_URI_LIST = "android.telephony.mbms.extra.PAUSED_URI_LIST";
-    field public static final String EXTRA_SERVICE_ID = "android.telephony.mbms.extra.SERVICE_ID";
-    field public static final String EXTRA_TEMP_FILES_IN_USE = "android.telephony.mbms.extra.TEMP_FILES_IN_USE";
-    field public static final String EXTRA_TEMP_FILE_ROOT = "android.telephony.mbms.extra.TEMP_FILE_ROOT";
-    field public static final String EXTRA_TEMP_LIST = "android.telephony.mbms.extra.TEMP_LIST";
-  }
-
-}
-
-package android.util {
-
-  public class EventLog {
-    method public static void readEventsOnWrapping(int[], long, java.util.Collection<android.util.EventLog.Event>) throws java.io.IOException;
-  }
-
-  public static final class EventLog.Event {
-    method public int getUid();
-  }
-
-  public final class StatsEvent {
-    method @NonNull public static android.util.StatsEvent.Builder newBuilder();
-  }
-
-  public static final class StatsEvent.Builder {
-    method @NonNull public android.util.StatsEvent.Builder addBooleanAnnotation(byte, boolean);
-    method @NonNull public android.util.StatsEvent.Builder addIntAnnotation(byte, int);
-    method @NonNull public android.util.StatsEvent build();
-    method @NonNull public android.util.StatsEvent.Builder setAtomId(int);
-    method @NonNull public android.util.StatsEvent.Builder usePooledBuffer();
-    method @NonNull public android.util.StatsEvent.Builder writeAttributionChain(@NonNull int[], @NonNull String[]);
-    method @NonNull public android.util.StatsEvent.Builder writeBoolean(boolean);
-    method @NonNull public android.util.StatsEvent.Builder writeByteArray(@NonNull byte[]);
-    method @NonNull public android.util.StatsEvent.Builder writeFloat(float);
-    method @NonNull public android.util.StatsEvent.Builder writeInt(int);
-    method @NonNull public android.util.StatsEvent.Builder writeKeyValuePairs(@Nullable android.util.SparseIntArray, @Nullable android.util.SparseLongArray, @Nullable android.util.SparseArray<java.lang.String>, @Nullable android.util.SparseArray<java.lang.Float>);
-    method @NonNull public android.util.StatsEvent.Builder writeLong(long);
-    method @NonNull public android.util.StatsEvent.Builder writeString(@NonNull String);
-  }
-
-  public final class StatsLog {
-    method public static void write(@NonNull android.util.StatsEvent);
-    method public static void writeRaw(@NonNull byte[], int);
-  }
-
-}
-
-package android.view {
-
-  public abstract class Window {
-    method public void addSystemFlags(@android.view.WindowManager.LayoutParams.SystemFlags int);
-  }
-
-  public interface WindowManager extends android.view.ViewManager {
-    method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public android.graphics.Region getCurrentImeTouchRegion();
-  }
-
-  public static class WindowManager.LayoutParams extends android.view.ViewGroup.LayoutParams implements android.os.Parcelable {
-    method public final long getUserActivityTimeout();
-    method public final void setUserActivityTimeout(long);
-    field @RequiresPermission(android.Manifest.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS) public static final int SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS = 524288; // 0x80000
-    field @RequiresPermission(android.Manifest.permission.INTERNAL_SYSTEM_WINDOW) public static final int SYSTEM_FLAG_SHOW_FOR_ALL_USERS = 16; // 0x10
-  }
-
-  @IntDef(flag=true, prefix={"SYSTEM_FLAG_"}, value={android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS, android.view.WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowManager.LayoutParams.SystemFlags {
-  }
-
-}
-
-package android.view.accessibility {
-
-  public final class AccessibilityManager {
-    method public int getAccessibilityWindowId(@Nullable android.os.IBinder);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void performAccessibilityShortcut();
-    method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void registerSystemAction(@NonNull android.app.RemoteAction, int);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void unregisterSystemAction(int);
-  }
-
-}
-
-package android.view.autofill {
-
-  public final class AutofillManager {
-    method public void setAugmentedAutofillWhitelist(@Nullable java.util.Set<java.lang.String>, @Nullable java.util.Set<android.content.ComponentName>);
-  }
-
-}
-
-package android.view.contentcapture {
-
-  public final class ContentCaptureContext implements android.os.Parcelable {
-    method @Nullable public android.content.ComponentName getActivityComponent();
-    method public int getDisplayId();
-    method public int getFlags();
-    method @Nullable public android.view.contentcapture.ContentCaptureSessionId getParentSessionId();
-    method public int getTaskId();
-    field public static final int FLAG_DISABLED_BY_APP = 1; // 0x1
-    field public static final int FLAG_DISABLED_BY_FLAG_SECURE = 2; // 0x2
-    field public static final int FLAG_RECONNECTED = 4; // 0x4
-  }
-
-  public final class ContentCaptureEvent implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public android.view.contentcapture.ContentCaptureContext getContentCaptureContext();
-    method public long getEventTime();
-    method @Nullable public android.view.autofill.AutofillId getId();
-    method @Nullable public java.util.List<android.view.autofill.AutofillId> getIds();
-    method @Nullable public android.graphics.Insets getInsets();
-    method @Nullable public CharSequence getText();
-    method public int getType();
-    method @Nullable public android.view.contentcapture.ViewNode getViewNode();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.view.contentcapture.ContentCaptureEvent> CREATOR;
-    field public static final int TYPE_CONTEXT_UPDATED = 6; // 0x6
-    field public static final int TYPE_SESSION_PAUSED = 8; // 0x8
-    field public static final int TYPE_SESSION_RESUMED = 7; // 0x7
-    field public static final int TYPE_VIEW_APPEARED = 1; // 0x1
-    field public static final int TYPE_VIEW_DISAPPEARED = 2; // 0x2
-    field public static final int TYPE_VIEW_INSETS_CHANGED = 9; // 0x9
-    field public static final int TYPE_VIEW_TEXT_CHANGED = 3; // 0x3
-    field public static final int TYPE_VIEW_TREE_APPEARED = 5; // 0x5
-    field public static final int TYPE_VIEW_TREE_APPEARING = 4; // 0x4
-  }
-
-  public final class ContentCaptureManager {
-    method public boolean isContentCaptureFeatureEnabled();
-    field public static final int NO_SESSION_ID = 0; // 0x0
-  }
-
-  public final class ViewNode extends android.app.assist.AssistStructure.ViewNode {
-    method @Nullable public android.view.autofill.AutofillId getParentAutofillId();
-  }
-
-}
-
-package android.webkit {
-
-  public abstract class CookieManager {
-    method protected abstract boolean allowFileSchemeCookiesImpl();
-    method public abstract String getCookie(String, boolean);
-    method public String getCookie(android.net.WebAddress);
-    method public abstract boolean hasCookies(boolean);
-    method protected abstract void setAcceptFileSchemeCookiesImpl(boolean);
-  }
-
-  public class FindActionModeCallback implements android.view.ActionMode.Callback android.text.TextWatcher android.view.View.OnClickListener android.webkit.WebView.FindListener {
-    ctor public FindActionModeCallback(android.content.Context);
-    method public void afterTextChanged(android.text.Editable);
-    method public void beforeTextChanged(CharSequence, int, int, int);
-    method public void findAll();
-    method public void finish();
-    method public int getActionModeGlobalBottom();
-    method public boolean onActionItemClicked(android.view.ActionMode, android.view.MenuItem);
-    method public void onClick(android.view.View);
-    method public boolean onCreateActionMode(android.view.ActionMode, android.view.Menu);
-    method public void onDestroyActionMode(android.view.ActionMode);
-    method public void onFindResultReceived(int, int, boolean);
-    method public boolean onPrepareActionMode(android.view.ActionMode, android.view.Menu);
-    method public void onTextChanged(CharSequence, int, int, int);
-    method public void setText(String);
-    method public void setWebView(@NonNull android.webkit.WebView);
-    method public void showSoftInput();
-    method public void updateMatchCount(int, int, boolean);
-  }
-
-  public static class FindActionModeCallback.NoAction implements android.view.ActionMode.Callback {
-    ctor public FindActionModeCallback.NoAction();
-    method public boolean onActionItemClicked(android.view.ActionMode, android.view.MenuItem);
-    method public boolean onCreateActionMode(android.view.ActionMode, android.view.Menu);
-    method public void onDestroyActionMode(android.view.ActionMode);
-    method public boolean onPrepareActionMode(android.view.ActionMode, android.view.Menu);
-  }
-
-  public class GeolocationPermissions {
-    ctor public GeolocationPermissions();
-  }
-
-  public class HttpAuthHandler extends android.os.Handler {
-    ctor public HttpAuthHandler();
-  }
-
-  public class JsDialogHelper {
-    ctor public JsDialogHelper(android.webkit.JsPromptResult, int, String, String, String);
-    ctor public JsDialogHelper(android.webkit.JsPromptResult, android.os.Message);
-    method public boolean invokeCallback(android.webkit.WebChromeClient, android.webkit.WebView);
-    method public void showDialog(android.content.Context);
-    field public static final int ALERT = 1; // 0x1
-    field public static final int CONFIRM = 2; // 0x2
-    field public static final int PROMPT = 3; // 0x3
-    field public static final int UNLOAD = 4; // 0x4
-  }
-
-  public class JsPromptResult extends android.webkit.JsResult {
-    ctor public JsPromptResult(android.webkit.JsResult.ResultReceiver);
-    method public String getStringResult();
-  }
-
-  public class JsResult {
-    ctor public JsResult(android.webkit.JsResult.ResultReceiver);
-    method public final boolean getResult();
-  }
-
-  public static interface JsResult.ResultReceiver {
-    method public void onJsResultComplete(android.webkit.JsResult);
-  }
-
-  public interface PacProcessor {
-    method @NonNull public static android.webkit.PacProcessor createInstance();
-    method @Nullable public String findProxyForUrl(@NonNull String);
-    method @NonNull public static android.webkit.PacProcessor getInstance();
-    method @Nullable public default android.net.Network getNetwork();
-    method public default void release();
-    method public default void setNetwork(@Nullable android.net.Network);
-    method public boolean setProxyScript(@NonNull String);
-  }
-
-  public class SslErrorHandler extends android.os.Handler {
-    ctor public SslErrorHandler();
-  }
-
-  @Deprecated public abstract class TokenBindingService {
-    ctor @Deprecated public TokenBindingService();
-  }
-
-  public class WebChromeClient {
-    method @Deprecated public void openFileChooser(android.webkit.ValueCallback<android.net.Uri>, String, String);
-  }
-
-  public abstract class WebHistoryItem implements java.lang.Cloneable {
-    method @Deprecated public abstract int getId();
-  }
-
-  @Deprecated public abstract class WebIconDatabase {
-    method @Deprecated public abstract void bulkRequestIconForPageUrl(android.content.ContentResolver, String, android.webkit.WebIconDatabase.IconListener);
-  }
-
-  public abstract class WebMessagePort {
-    ctor public WebMessagePort();
-  }
-
-  public abstract class WebResourceError {
-    ctor public WebResourceError();
-  }
-
-  public class WebResourceResponse {
-    ctor public WebResourceResponse(boolean, String, String, int, String, java.util.Map<java.lang.String,java.lang.String>, java.io.InputStream);
-  }
-
-  public abstract class WebSettings {
-    method public abstract boolean getAcceptThirdPartyCookies();
-    method @Deprecated public abstract boolean getNavDump();
-    method @Deprecated public abstract boolean getPluginsEnabled();
-    method @Deprecated public abstract boolean getUseWebViewBackgroundForOverscrollBackground();
-    method @Deprecated public abstract int getUserAgent();
-    method public abstract boolean getVideoOverlayForEmbeddedEncryptedVideoEnabled();
-    method public abstract void setAcceptThirdPartyCookies(boolean);
-    method @Deprecated public abstract void setNavDump(boolean);
-    method @Deprecated public abstract void setPluginsEnabled(boolean);
-    method @Deprecated public abstract void setUseWebViewBackgroundForOverscrollBackground(boolean);
-    method @Deprecated public abstract void setUserAgent(int);
-    method public abstract void setVideoOverlayForEmbeddedEncryptedVideoEnabled(boolean);
-  }
-
-  public class WebStorage {
-    ctor public WebStorage();
-  }
-
-  public static class WebStorage.Origin {
-    ctor protected WebStorage.Origin(String, long, long);
-  }
-
-  public class WebView extends android.widget.AbsoluteLayout implements android.view.ViewGroup.OnHierarchyChangeListener android.view.ViewTreeObserver.OnGlobalFocusChangeListener {
-    method public android.webkit.WebViewProvider getWebViewProvider();
-  }
-
-  public static class WebView.HitTestResult {
-    ctor public WebView.HitTestResult();
-    method public void setExtra(String);
-    method public void setType(int);
-  }
-
-  public class WebView.PrivateAccess {
-    ctor public WebView.PrivateAccess();
-    method public void awakenScrollBars(int);
-    method public void awakenScrollBars(int, boolean);
-    method public float getHorizontalScrollFactor();
-    method public int getHorizontalScrollbarHeight();
-    method public float getVerticalScrollFactor();
-    method public void onScrollChanged(int, int, int, int);
-    method public void overScrollBy(int, int, int, int, int, int, int, int, boolean);
-    method public void setMeasuredDimension(int, int);
-    method public void setScrollXRaw(int);
-    method public void setScrollYRaw(int);
-    method public void super_computeScroll();
-    method public boolean super_dispatchKeyEvent(android.view.KeyEvent);
-    method public int super_getScrollBarStyle();
-    method @Nullable public android.view.WindowInsets super_onApplyWindowInsets(@Nullable android.view.WindowInsets);
-    method public void super_onDrawVerticalScrollBar(android.graphics.Canvas, android.graphics.drawable.Drawable, int, int, int, int);
-    method public boolean super_onGenericMotionEvent(android.view.MotionEvent);
-    method public boolean super_onHoverEvent(android.view.MotionEvent);
-    method public boolean super_performAccessibilityAction(int, android.os.Bundle);
-    method public boolean super_performLongClick();
-    method public boolean super_requestFocus(int, android.graphics.Rect);
-    method public void super_scrollTo(int, int);
-    method public boolean super_setFrame(int, int, int, int);
-    method public void super_setLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public void super_startActivityForResult(android.content.Intent, int);
-  }
-
-  public final class WebViewDelegate {
-    method public void addWebViewAssetPath(android.content.Context);
-    method @Deprecated public void callDrawGlFunction(android.graphics.Canvas, long);
-    method @Deprecated public void callDrawGlFunction(@NonNull android.graphics.Canvas, long, @Nullable Runnable);
-    method @Deprecated public boolean canInvokeDrawGlFunctor(android.view.View);
-    method @Deprecated public void detachDrawGlFunctor(android.view.View, long);
-    method public void drawWebViewFunctor(@NonNull android.graphics.Canvas, int);
-    method public android.app.Application getApplication();
-    method public String getDataDirectorySuffix();
-    method public String getErrorString(android.content.Context, int);
-    method public int getPackageId(android.content.res.Resources, String);
-    method @Deprecated public void invokeDrawGlFunctor(android.view.View, long, boolean);
-    method public boolean isMultiProcessEnabled();
-    method public boolean isTraceTagEnabled();
-    method public void setOnTraceEnabledChangeListener(android.webkit.WebViewDelegate.OnTraceEnabledChangeListener);
-  }
-
-  public static interface WebViewDelegate.OnTraceEnabledChangeListener {
-    method public void onTraceEnabledChange(boolean);
-  }
-
-  public final class WebViewFactory {
-    ctor public WebViewFactory();
-    method public static android.content.pm.PackageInfo getLoadedPackageInfo();
-    method public static int loadWebViewNativeLibraryFromPackage(String, ClassLoader);
-    method public static void prepareWebViewInZygote();
-    field public static final int LIBLOAD_ADDRESS_SPACE_NOT_RESERVED = 2; // 0x2
-    field public static final int LIBLOAD_FAILED_JNI_CALL = 7; // 0x7
-    field public static final int LIBLOAD_FAILED_LISTING_WEBVIEW_PACKAGES = 4; // 0x4
-    field public static final int LIBLOAD_FAILED_TO_FIND_NAMESPACE = 10; // 0xa
-    field public static final int LIBLOAD_FAILED_TO_LOAD_LIBRARY = 6; // 0x6
-    field public static final int LIBLOAD_FAILED_TO_OPEN_RELRO_FILE = 5; // 0x5
-    field public static final int LIBLOAD_FAILED_WAITING_FOR_RELRO = 3; // 0x3
-    field public static final int LIBLOAD_FAILED_WAITING_FOR_WEBVIEW_REASON_UNKNOWN = 8; // 0x8
-    field public static final int LIBLOAD_SUCCESS = 0; // 0x0
-    field public static final int LIBLOAD_WRONG_PACKAGE_NAME = 1; // 0x1
-  }
-
-  public interface WebViewFactoryProvider {
-    method @NonNull public default android.webkit.PacProcessor createPacProcessor();
-    method public android.webkit.WebViewProvider createWebView(android.webkit.WebView, android.webkit.WebView.PrivateAccess);
-    method public android.webkit.CookieManager getCookieManager();
-    method public android.webkit.GeolocationPermissions getGeolocationPermissions();
-    method @NonNull public default android.webkit.PacProcessor getPacProcessor();
-    method public android.webkit.ServiceWorkerController getServiceWorkerController();
-    method public android.webkit.WebViewFactoryProvider.Statics getStatics();
-    method @Deprecated public android.webkit.TokenBindingService getTokenBindingService();
-    method public android.webkit.TracingController getTracingController();
-    method public android.webkit.WebIconDatabase getWebIconDatabase();
-    method public android.webkit.WebStorage getWebStorage();
-    method public ClassLoader getWebViewClassLoader();
-    method public android.webkit.WebViewDatabase getWebViewDatabase(android.content.Context);
-  }
-
-  public static interface WebViewFactoryProvider.Statics {
-    method public void clearClientCertPreferences(Runnable);
-    method public void enableSlowWholeDocumentDraw();
-    method public String findAddress(String);
-    method public void freeMemoryForTests();
-    method public String getDefaultUserAgent(android.content.Context);
-    method @NonNull public android.net.Uri getSafeBrowsingPrivacyPolicyUrl();
-    method public void initSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>);
-    method public android.net.Uri[] parseFileChooserResult(int, android.content.Intent);
-    method public void setSafeBrowsingWhitelist(java.util.List<java.lang.String>, android.webkit.ValueCallback<java.lang.Boolean>);
-    method public void setWebContentsDebuggingEnabled(boolean);
-  }
-
-  public interface WebViewProvider {
-    method public void addJavascriptInterface(Object, String);
-    method public boolean canGoBack();
-    method public boolean canGoBackOrForward(int);
-    method public boolean canGoForward();
-    method public boolean canZoomIn();
-    method public boolean canZoomOut();
-    method public android.graphics.Picture capturePicture();
-    method public void clearCache(boolean);
-    method public void clearFormData();
-    method public void clearHistory();
-    method public void clearMatches();
-    method public void clearSslPreferences();
-    method public void clearView();
-    method public android.webkit.WebBackForwardList copyBackForwardList();
-    method public android.print.PrintDocumentAdapter createPrintDocumentAdapter(String);
-    method public android.webkit.WebMessagePort[] createWebMessageChannel();
-    method public void destroy();
-    method public void documentHasImages(android.os.Message);
-    method public void dumpViewHierarchyWithProperties(java.io.BufferedWriter, int);
-    method public void evaluateJavaScript(String, android.webkit.ValueCallback<java.lang.String>);
-    method public int findAll(String);
-    method public void findAllAsync(String);
-    method public android.view.View findHierarchyView(String, int);
-    method public void findNext(boolean);
-    method public void flingScroll(int, int);
-    method public void freeMemory();
-    method public android.net.http.SslCertificate getCertificate();
-    method public int getContentHeight();
-    method public int getContentWidth();
-    method public android.graphics.Bitmap getFavicon();
-    method public android.webkit.WebView.HitTestResult getHitTestResult();
-    method public String[] getHttpAuthUsernamePassword(String, String);
-    method public String getOriginalUrl();
-    method public int getProgress();
-    method public boolean getRendererPriorityWaivedWhenNotVisible();
-    method public int getRendererRequestedPriority();
-    method public float getScale();
-    method public android.webkit.WebViewProvider.ScrollDelegate getScrollDelegate();
-    method public android.webkit.WebSettings getSettings();
-    method @NonNull public default android.view.textclassifier.TextClassifier getTextClassifier();
-    method public String getTitle();
-    method public String getTouchIconUrl();
-    method public String getUrl();
-    method public android.webkit.WebViewProvider.ViewDelegate getViewDelegate();
-    method public int getVisibleTitleHeight();
-    method public android.webkit.WebChromeClient getWebChromeClient();
-    method public android.webkit.WebViewClient getWebViewClient();
-    method @Nullable public android.webkit.WebViewRenderProcess getWebViewRenderProcess();
-    method @Nullable public android.webkit.WebViewRenderProcessClient getWebViewRenderProcessClient();
-    method public android.view.View getZoomControls();
-    method public void goBack();
-    method public void goBackOrForward(int);
-    method public void goForward();
-    method public void init(java.util.Map<java.lang.String,java.lang.Object>, boolean);
-    method public void insertVisualStateCallback(long, android.webkit.WebView.VisualStateCallback);
-    method public void invokeZoomPicker();
-    method public boolean isPaused();
-    method public boolean isPrivateBrowsingEnabled();
-    method public void loadData(String, String, String);
-    method public void loadDataWithBaseURL(String, String, String, String, String);
-    method public void loadUrl(String, java.util.Map<java.lang.String,java.lang.String>);
-    method public void loadUrl(String);
-    method public void notifyFindDialogDismissed();
-    method public void onPause();
-    method public void onResume();
-    method public boolean overlayHorizontalScrollbar();
-    method public boolean overlayVerticalScrollbar();
-    method public boolean pageDown(boolean);
-    method public boolean pageUp(boolean);
-    method public void pauseTimers();
-    method public void postMessageToMainFrame(android.webkit.WebMessage, android.net.Uri);
-    method public void postUrl(String, byte[]);
-    method public void reload();
-    method public void removeJavascriptInterface(String);
-    method public void requestFocusNodeHref(android.os.Message);
-    method public void requestImageRef(android.os.Message);
-    method public boolean restorePicture(android.os.Bundle, java.io.File);
-    method public android.webkit.WebBackForwardList restoreState(android.os.Bundle);
-    method public void resumeTimers();
-    method public void savePassword(String, String, String);
-    method public boolean savePicture(android.os.Bundle, java.io.File);
-    method public android.webkit.WebBackForwardList saveState(android.os.Bundle);
-    method public void saveWebArchive(String);
-    method public void saveWebArchive(String, boolean, android.webkit.ValueCallback<java.lang.String>);
-    method public void setCertificate(android.net.http.SslCertificate);
-    method public void setDownloadListener(android.webkit.DownloadListener);
-    method public void setFindListener(android.webkit.WebView.FindListener);
-    method public void setHorizontalScrollbarOverlay(boolean);
-    method public void setHttpAuthUsernamePassword(String, String, String, String);
-    method public void setInitialScale(int);
-    method public void setMapTrackballToArrowKeys(boolean);
-    method public void setNetworkAvailable(boolean);
-    method public void setPictureListener(android.webkit.WebView.PictureListener);
-    method public void setRendererPriorityPolicy(int, boolean);
-    method public default void setTextClassifier(@Nullable android.view.textclassifier.TextClassifier);
-    method public void setVerticalScrollbarOverlay(boolean);
-    method public void setWebChromeClient(android.webkit.WebChromeClient);
-    method public void setWebViewClient(android.webkit.WebViewClient);
-    method public void setWebViewRenderProcessClient(@Nullable java.util.concurrent.Executor, @Nullable android.webkit.WebViewRenderProcessClient);
-    method public boolean showFindDialog(String, boolean);
-    method public void stopLoading();
-    method public boolean zoomBy(float);
-    method public boolean zoomIn();
-    method public boolean zoomOut();
-  }
-
-  public static interface WebViewProvider.ScrollDelegate {
-    method public int computeHorizontalScrollOffset();
-    method public int computeHorizontalScrollRange();
-    method public void computeScroll();
-    method public int computeVerticalScrollExtent();
-    method public int computeVerticalScrollOffset();
-    method public int computeVerticalScrollRange();
-  }
-
-  public static interface WebViewProvider.ViewDelegate {
-    method public default void autofill(android.util.SparseArray<android.view.autofill.AutofillValue>);
-    method public boolean dispatchKeyEvent(android.view.KeyEvent);
-    method public android.view.View findFocus(android.view.View);
-    method public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider();
-    method public android.os.Handler getHandler(android.os.Handler);
-    method public default boolean isVisibleToUserForAutofill(int);
-    method public void onActivityResult(int, int, android.content.Intent);
-    method @Nullable public default android.view.WindowInsets onApplyWindowInsets(@Nullable android.view.WindowInsets);
-    method public void onAttachedToWindow();
-    method public default boolean onCheckIsTextEditor();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.EditorInfo);
-    method public void onDetachedFromWindow();
-    method public boolean onDragEvent(android.view.DragEvent);
-    method public void onDraw(android.graphics.Canvas);
-    method public void onDrawVerticalScrollBar(android.graphics.Canvas, android.graphics.drawable.Drawable, int, int, int, int);
-    method public void onFinishTemporaryDetach();
-    method public void onFocusChanged(boolean, int, android.graphics.Rect);
-    method public boolean onGenericMotionEvent(android.view.MotionEvent);
-    method public boolean onHoverEvent(android.view.MotionEvent);
-    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo);
-    method public boolean onKeyDown(int, android.view.KeyEvent);
-    method public boolean onKeyMultiple(int, int, android.view.KeyEvent);
-    method public boolean onKeyUp(int, android.view.KeyEvent);
-    method public void onMeasure(int, int);
-    method public default void onMovedToDisplay(int, android.content.res.Configuration);
-    method public void onOverScrolled(int, int, boolean, boolean);
-    method public default void onProvideAutofillVirtualStructure(android.view.ViewStructure, int);
-    method public default void onProvideContentCaptureStructure(@NonNull android.view.ViewStructure, int);
-    method public void onProvideVirtualStructure(android.view.ViewStructure);
-    method public void onScrollChanged(int, int, int, int);
-    method public void onSizeChanged(int, int, int, int);
-    method public void onStartTemporaryDetach();
-    method public boolean onTouchEvent(android.view.MotionEvent);
-    method public boolean onTrackballEvent(android.view.MotionEvent);
-    method public void onVisibilityChanged(android.view.View, int);
-    method public void onWindowFocusChanged(boolean);
-    method public void onWindowVisibilityChanged(int);
-    method public boolean performAccessibilityAction(int, android.os.Bundle);
-    method public boolean performLongClick();
-    method public void preDispatchDraw(android.graphics.Canvas);
-    method public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
-    method public boolean requestFocus(int, android.graphics.Rect);
-    method public void setBackgroundColor(int);
-    method public boolean setFrame(int, int, int, int);
-    method public void setLayerType(int, android.graphics.Paint);
-    method public void setLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public void setOverScrollMode(int);
-    method public void setScrollBarStyle(int);
-    method public boolean shouldDelayChildPressedState();
-  }
-
-  public final class WebViewProviderInfo implements android.os.Parcelable {
-    ctor public WebViewProviderInfo(String, String, boolean, boolean, String[]);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.webkit.WebViewProviderInfo> CREATOR;
-    field public final boolean availableByDefault;
-    field public final String description;
-    field public final boolean isFallback;
-    field public final String packageName;
-    field public final android.content.pm.Signature[] signatures;
-  }
-
-  public final class WebViewUpdateService {
-    method public static android.webkit.WebViewProviderInfo[] getAllWebViewPackages();
-    method public static String getCurrentWebViewPackageName();
-    method public static android.webkit.WebViewProviderInfo[] getValidWebViewPackages();
-  }
-
-}
-
diff --git a/api/system-lint-baseline.txt b/api/system-lint-baseline.txt
deleted file mode 100644
index 3ef1f35..0000000
--- a/api/system-lint-baseline.txt
+++ /dev/null
@@ -1,537 +0,0 @@
-// Baseline format: 1.0
-AcronymName: android.net.NetworkCapabilities#setSSID(String):
-    
-
-
-ActionValue: android.location.Location#EXTRA_NO_GPS_LOCATION:
-    
-ActionValue: android.net.TetheringManager#ACTION_TETHER_STATE_CHANGED:
-    
-ActionValue: android.net.TetheringManager#EXTRA_ACTIVE_TETHER:
-    
-ActionValue: android.net.TetheringManager#EXTRA_AVAILABLE_TETHER:
-    
-ActionValue: android.net.TetheringManager#EXTRA_ERRORED_TETHER:
-    
-ActionValue: android.net.wifi.WifiManager#ACTION_LINK_CONFIGURATION_CHANGED:
-    
-
-
-ArrayReturn: android.bluetooth.BluetoothCodecStatus#BluetoothCodecStatus(android.bluetooth.BluetoothCodecConfig, android.bluetooth.BluetoothCodecConfig[], android.bluetooth.BluetoothCodecConfig[]) parameter #1:
-    
-ArrayReturn: android.bluetooth.BluetoothCodecStatus#BluetoothCodecStatus(android.bluetooth.BluetoothCodecConfig, android.bluetooth.BluetoothCodecConfig[], android.bluetooth.BluetoothCodecConfig[]) parameter #2:
-    
-ArrayReturn: android.bluetooth.BluetoothCodecStatus#getCodecsLocalCapabilities():
-    
-ArrayReturn: android.bluetooth.BluetoothCodecStatus#getCodecsSelectableCapabilities():
-    
-ArrayReturn: android.bluetooth.BluetoothUuid#containsAnyUuid(android.os.ParcelUuid[], android.os.ParcelUuid[]) parameter #0:
-    
-ArrayReturn: android.bluetooth.BluetoothUuid#containsAnyUuid(android.os.ParcelUuid[], android.os.ParcelUuid[]) parameter #1:
-    
-ArrayReturn: android.media.tv.tuner.Tuner.FilterCallback#onFilterEvent(android.media.tv.tuner.Tuner.Filter, android.media.tv.tuner.filter.FilterEvent[]) parameter #1:
-    
-ArrayReturn: android.net.NetworkScoreManager#requestScores(android.net.NetworkKey[]) parameter #0:
-    
-ArrayReturn: android.view.contentcapture.ViewNode#getAutofillOptions():
-    
-
-
-BuilderSetStyle: android.net.IpSecTransform.Builder#buildTunnelModeTransform(java.net.InetAddress, android.net.IpSecManager.SecurityParameterIndex):
-    Builder methods names should use setFoo() / addFoo() / clearFoo() style: method android.net.IpSecTransform.Builder.buildTunnelModeTransform(java.net.InetAddress,android.net.IpSecManager.SecurityParameterIndex)
-
-
-ExecutorRegistration: android.media.MediaPlayer#setOnRtpRxNoticeListener(android.content.Context, android.media.MediaPlayer.OnRtpRxNoticeListener, android.os.Handler):
-    Registration methods should have overload that accepts delivery Executor: `setOnRtpRxNoticeListener`
-ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#deletePersistentGroup(android.net.wifi.p2p.WifiP2pManager.Channel, int, android.net.wifi.p2p.WifiP2pManager.ActionListener):
-    
-ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#factoryReset(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener):
-    
-ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#listen(android.net.wifi.p2p.WifiP2pManager.Channel, boolean, android.net.wifi.p2p.WifiP2pManager.ActionListener):
-    
-ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#requestPersistentGroupInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.PersistentGroupInfoListener):
-    
-ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#setDeviceName(android.net.wifi.p2p.WifiP2pManager.Channel, String, android.net.wifi.p2p.WifiP2pManager.ActionListener):
-    
-ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#setWfdInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pWfdInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener):
-    
-ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#setWifiP2pChannels(android.net.wifi.p2p.WifiP2pManager.Channel, int, int, android.net.wifi.p2p.WifiP2pManager.ActionListener):
-    
-
-
-GenericException: android.app.prediction.AppPredictor#finalize():
-    
-GenericException: android.hardware.location.ContextHubClient#finalize():
-    
-GenericException: android.net.IpSecManager.IpSecTunnelInterface#finalize():
-    
-GenericException: android.service.autofill.augmented.FillWindow#finalize():
-    
-
-
-IntentBuilderName: android.content.Context#registerReceiverForAllUsers(android.content.BroadcastReceiver, android.content.IntentFilter, String, android.os.Handler):
-    
-
-
-KotlinKeyword: android.app.Notification#when:
-    
-
-
-KotlinOperator: android.telephony.CbGeoUtils.Geometry#contains(android.telephony.CbGeoUtils.LatLng):
-    
-
-
-MissingGetterMatchingBuilder: android.net.wifi.rtt.RangingRequest.Builder#addResponder(android.net.wifi.rtt.ResponderConfig):
-    android.net.wifi.rtt.RangingRequest does not declare a `getResponders()` method matching method android.net.wifi.rtt.RangingRequest.Builder.addResponder(android.net.wifi.rtt.ResponderConfig)
-MissingGetterMatchingBuilder: android.security.keystore.KeyGenParameterSpec.Builder#setUid(int):
-    android.security.keystore.KeyGenParameterSpec does not declare a `getUid()` method matching method android.security.keystore.KeyGenParameterSpec.Builder.setUid(int)
-MissingGetterMatchingBuilder: android.service.autofill.Dataset.Builder#setFieldInlinePresentation(android.view.autofill.AutofillId, android.view.autofill.AutofillValue, java.util.regex.Pattern, android.service.autofill.InlinePresentation):
-    android.service.autofill.Dataset does not declare a `getFieldInlinePresentation()` method matching method android.service.autofill.Dataset.Builder.setFieldInlinePresentation(android.view.autofill.AutofillId,android.view.autofill.AutofillValue,java.util.regex.Pattern,android.service.autofill.InlinePresentation)
-MissingGetterMatchingBuilder: android.telecom.CallScreeningService.CallResponse.Builder#setShouldScreenCallViaAudioProcessing(boolean):
-    android.telecom.CallScreeningService.CallResponse does not declare a `shouldScreenCallViaAudioProcessing()` method matching method android.telecom.CallScreeningService.CallResponse.Builder.setShouldScreenCallViaAudioProcessing(boolean)
-MissingGetterMatchingBuilder: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String):
-    android.telephony.mbms.DownloadRequest does not declare a `getServiceId()` method matching method android.telephony.mbms.DownloadRequest.Builder.setServiceId(String)
-
-
-MissingNullability: android.hardware.soundtrigger.SoundTrigger.ModuleProperties#toString():
-    
-MissingNullability: android.hardware.soundtrigger.SoundTrigger.ModuleProperties#writeToParcel(android.os.Parcel, int) parameter #0:
-    
-MissingNullability: android.media.session.MediaSessionManager.Callback#onAddressedPlayerChanged(android.content.ComponentName) parameter #0:
-    
-MissingNullability: android.media.session.MediaSessionManager.Callback#onAddressedPlayerChanged(android.media.session.MediaSession.Token) parameter #0:
-    
-MissingNullability: android.media.session.MediaSessionManager.Callback#onMediaKeyEventDispatched(android.view.KeyEvent, android.content.ComponentName) parameter #0:
-    
-MissingNullability: android.media.session.MediaSessionManager.Callback#onMediaKeyEventDispatched(android.view.KeyEvent, android.content.ComponentName) parameter #1:
-    
-MissingNullability: android.media.session.MediaSessionManager.Callback#onMediaKeyEventDispatched(android.view.KeyEvent, android.media.session.MediaSession.Token) parameter #0:
-    
-MissingNullability: android.media.session.MediaSessionManager.Callback#onMediaKeyEventDispatched(android.view.KeyEvent, android.media.session.MediaSession.Token) parameter #1:
-    
-MissingNullability: android.media.soundtrigger.SoundTriggerDetectionService#onUnbind(android.content.Intent) parameter #0:
-    
-MissingNullability: android.media.tv.TvRecordingClient.RecordingCallback#onEvent(String, String, android.os.Bundle) parameter #0:
-    
-MissingNullability: android.media.tv.TvRecordingClient.RecordingCallback#onEvent(String, String, android.os.Bundle) parameter #1:
-    
-MissingNullability: android.media.tv.TvRecordingClient.RecordingCallback#onEvent(String, String, android.os.Bundle) parameter #2:
-    
-MissingNullability: android.net.wifi.rtt.RangingRequest.Builder#addResponder(android.net.wifi.rtt.ResponderConfig):
-    
-MissingNullability: android.printservice.recommendation.RecommendationService#attachBaseContext(android.content.Context) parameter #0:
-    
-MissingNullability: android.provider.ContactsContract.MetadataSync#CONTENT_URI:
-    
-MissingNullability: android.provider.ContactsContract.MetadataSync#METADATA_AUTHORITY_URI:
-    
-MissingNullability: android.provider.ContactsContract.MetadataSyncState#CONTENT_URI:
-    
-MissingNullability: android.provider.SearchIndexablesProvider#attachInfo(android.content.Context, android.content.pm.ProviderInfo) parameter #0:
-    
-MissingNullability: android.provider.SearchIndexablesProvider#attachInfo(android.content.Context, android.content.pm.ProviderInfo) parameter #1:
-    
-MissingNullability: android.service.autofill.augmented.AugmentedAutofillService#onUnbind(android.content.Intent) parameter #0:
-    
-MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0:
-    
-MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #1:
-    
-MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #2:
-    
-MissingNullability: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context) parameter #0:
-    
-MissingNullability: android.telecom.CallScreeningService.CallResponse.Builder#setShouldScreenCallFurther(boolean):
-    
-MissingNullability: android.telephony.CallerInfo#toString():
-    
-MissingNullability: android.telephony.CellBroadcastService#onBind(android.content.Intent):
-    
-MissingNullability: android.telephony.CellBroadcastService#onBind(android.content.Intent) parameter #0:
-    
-MissingNullability: android.telephony.CellBroadcastService#onCdmaCellBroadcastSms(int, byte[]) parameter #1:
-    
-MissingNullability: android.telephony.CellBroadcastService#onCdmaCellBroadcastSms(int, byte[], int) parameter #1:
-    
-MissingNullability: android.telephony.CellBroadcastService#onGsmCellBroadcastSms(int, byte[]) parameter #1:
-    
-MissingNullability: android.telephony.ModemActivityInfo#toString():
-    
-MissingNullability: android.telephony.ModemActivityInfo#writeToParcel(android.os.Parcel, int) parameter #0:
-    
-MissingNullability: android.telephony.NetworkService#onUnbind(android.content.Intent) parameter #0:
-    
-MissingNullability: android.telephony.SmsCbCmasInfo#toString():
-    
-MissingNullability: android.telephony.SmsCbCmasInfo#writeToParcel(android.os.Parcel, int) parameter #0:
-    
-MissingNullability: android.telephony.SmsCbEtwsInfo#toString():
-    
-MissingNullability: android.telephony.SmsCbEtwsInfo#writeToParcel(android.os.Parcel, int) parameter #0:
-    
-MissingNullability: android.telephony.SmsCbLocation#equals(Object) parameter #0:
-    
-MissingNullability: android.telephony.SmsCbLocation#toString():
-    
-MissingNullability: android.telephony.SmsCbLocation#writeToParcel(android.os.Parcel, int) parameter #0:
-    
-MissingNullability: android.telephony.SmsCbMessage#toString():
-    
-MissingNullability: android.telephony.SmsCbMessage#writeToParcel(android.os.Parcel, int) parameter #0:
-    
-MissingNullability: android.telephony.SubscriptionPlan.Builder#createRecurringDaily(java.time.ZonedDateTime) parameter #0:
-    
-MissingNullability: android.telephony.SubscriptionPlan.Builder#createRecurringMonthly(java.time.ZonedDateTime) parameter #0:
-    
-MissingNullability: android.telephony.SubscriptionPlan.Builder#createRecurringWeekly(java.time.ZonedDateTime) parameter #0:
-    
-MissingNullability: android.telephony.cdma.CdmaSmsCbProgramData#toString():
-    
-MissingNullability: android.telephony.cdma.CdmaSmsCbProgramData#writeToParcel(android.os.Parcel, int) parameter #0:
-    
-MissingNullability: android.telephony.data.DataService#onUnbind(android.content.Intent) parameter #0:
-    
-MissingNullability: android.telephony.ims.stub.ImsSmsImplBase#onSmsStatusReportReceived(int, String, byte[]) parameter #1:
-    
-MissingNullability: android.telephony.ims.stub.ImsSmsImplBase#onSmsStatusReportReceived(int, String, byte[]) parameter #2:
-    
-MissingNullability: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String):
-    
-MissingNullability: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String) parameter #0:
-    
-
-
-MutableBareField: android.net.IpConfiguration#httpProxy:
-    
-MutableBareField: android.net.IpConfiguration#ipAssignment:
-    
-MutableBareField: android.net.IpConfiguration#proxySettings:
-    
-MutableBareField: android.net.IpConfiguration#staticIpConfiguration:
-    
-MutableBareField: android.net.wifi.WifiConfiguration#allowAutojoin:
-    
-MutableBareField: android.net.wifi.WifiConfiguration#carrierId:
-    
-MutableBareField: android.net.wifi.WifiConfiguration#fromWifiNetworkSpecifier:
-    
-MutableBareField: android.net.wifi.WifiConfiguration#fromWifiNetworkSuggestion:
-    
-MutableBareField: android.net.wifi.WifiConfiguration#macRandomizationSetting:
-    
-MutableBareField: android.net.wifi.WifiConfiguration#meteredOverride:
-    
-MutableBareField: android.net.wifi.WifiConfiguration#requirePmf:
-    
-MutableBareField: android.net.wifi.WifiConfiguration#saePasswordId:
-    
-MutableBareField: android.net.wifi.WifiConfiguration#shared:
-    
-MutableBareField: android.net.wifi.WifiConfiguration#subscriptionId:
-    Bare field subscriptionId must be marked final, or moved behind accessors if mutable
-MutableBareField: android.net.wifi.WifiScanner.ScanSettings#type:
-    
-
-
-NoClone: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0:
-    
-
-
-NoSettingsProvider: android.provider.Settings.Global#TETHER_OFFLOAD_DISABLED:
-    
-NoSettingsProvider: android.provider.Settings.Global#TETHER_SUPPORTED:
-    
-
-
-NotCloseable: android.bluetooth.BluetoothA2dpSink:
-    
-NotCloseable: android.bluetooth.BluetoothMap:
-    
-NotCloseable: android.bluetooth.BluetoothPan:
-    
-NotCloseable: android.bluetooth.BluetoothPbap:
-    
-
-
-OnNameExpected: android.content.ContentProvider#checkUriPermission(android.net.Uri, int, int):
-    
-
-
-PairedRegistration: android.net.wifi.nl80211.WifiNl80211Manager#registerApCallback(String, java.util.concurrent.Executor, android.net.wifi.nl80211.WifiNl80211Manager.SoftApCallback):
-    
-
-
-ProtectedMember: android.printservice.recommendation.RecommendationService#attachBaseContext(android.content.Context):
-    
-ProtectedMember: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]):
-    
-ProtectedMember: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context):
-    
-
-
-SamShouldBeLast: android.accounts.AccountManager#addAccount(String, String, String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean):
-    
-SamShouldBeLast: android.accounts.AccountManager#addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, String[]):
-    
-SamShouldBeLast: android.accounts.AccountManager#confirmCredentials(android.accounts.Account, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#editProperties(String, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#finishSession(android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#getAccountsByTypeAndFeatures(String, String[], android.accounts.AccountManagerCallback<android.accounts.Account[]>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#getAuthToken(android.accounts.Account, String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#getAuthToken(android.accounts.Account, String, android.os.Bundle, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#getAuthToken(android.accounts.Account, String, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#getAuthTokenByFeatures(String, String, String[], android.app.Activity, android.os.Bundle, android.os.Bundle, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#hasFeatures(android.accounts.Account, String[], android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#isCredentialsUpdateSuggested(android.accounts.Account, String, android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#removeAccount(android.accounts.Account, android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#removeAccount(android.accounts.Account, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#renameAccount(android.accounts.Account, String, android.accounts.AccountManagerCallback<android.accounts.Account>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#startAddAccountSession(String, String, String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#startUpdateCredentialsSession(android.accounts.Account, String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler):
-    
-SamShouldBeLast: android.accounts.AccountManager#updateCredentials(android.accounts.Account, String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler):
-    
-SamShouldBeLast: android.app.AlarmManager#set(int, long, String, android.app.AlarmManager.OnAlarmListener, android.os.Handler):
-    
-SamShouldBeLast: android.app.AlarmManager#setExact(int, long, String, android.app.AlarmManager.OnAlarmListener, android.os.Handler):
-    
-SamShouldBeLast: android.app.AlarmManager#setWindow(int, long, long, String, android.app.AlarmManager.OnAlarmListener, android.os.Handler):
-    
-SamShouldBeLast: android.app.WallpaperInfo#dump(android.util.Printer, String):
-    
-SamShouldBeLast: android.app.WallpaperManager#addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler):
-    
-SamShouldBeLast: android.app.admin.DevicePolicyManager#installSystemUpdate(android.content.ComponentName, android.net.Uri, java.util.concurrent.Executor, android.app.admin.DevicePolicyManager.InstallSystemUpdateCallback):
-    
-SamShouldBeLast: android.content.Context#bindIsolatedService(android.content.Intent, int, String, java.util.concurrent.Executor, android.content.ServiceConnection):
-    
-SamShouldBeLast: android.content.Context#bindService(android.content.Intent, int, java.util.concurrent.Executor, android.content.ServiceConnection):
-    
-SamShouldBeLast: android.content.ContextWrapper#bindIsolatedService(android.content.Intent, int, String, java.util.concurrent.Executor, android.content.ServiceConnection):
-    
-SamShouldBeLast: android.content.ContextWrapper#bindService(android.content.Intent, int, java.util.concurrent.Executor, android.content.ServiceConnection):
-    
-SamShouldBeLast: android.content.IntentFilter#dump(android.util.Printer, String):
-    
-SamShouldBeLast: android.content.pm.ApplicationInfo#dump(android.util.Printer, String):
-    
-SamShouldBeLast: android.content.pm.LauncherApps#registerPackageInstallerSessionCallback(java.util.concurrent.Executor, android.content.pm.PackageInstaller.SessionCallback):
-    
-SamShouldBeLast: android.content.pm.PackageItemInfo#dumpBack(android.util.Printer, String):
-    
-SamShouldBeLast: android.content.pm.PackageItemInfo#dumpFront(android.util.Printer, String):
-    
-SamShouldBeLast: android.content.pm.ResolveInfo#dump(android.util.Printer, String):
-    
-SamShouldBeLast: android.location.Location#dump(android.util.Printer, String):
-    
-SamShouldBeLast: android.location.LocationManager#addNmeaListener(android.location.OnNmeaMessageListener, android.os.Handler):
-    
-SamShouldBeLast: android.location.LocationManager#registerGnssMeasurementsCallback(java.util.concurrent.Executor, android.location.GnssMeasurementsEvent.Callback):
-    
-SamShouldBeLast: android.location.LocationManager#registerGnssNavigationMessageCallback(java.util.concurrent.Executor, android.location.GnssNavigationMessage.Callback):
-    
-SamShouldBeLast: android.location.LocationManager#registerGnssStatusCallback(java.util.concurrent.Executor, android.location.GnssStatus.Callback):
-    
-SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(String, long, float, android.location.LocationListener, android.os.Looper):
-    
-SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(String, long, float, java.util.concurrent.Executor, android.location.LocationListener):
-    
-SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(android.location.LocationRequest, java.util.concurrent.Executor, android.location.LocationListener):
-    
-SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(long, float, android.location.Criteria, android.location.LocationListener, android.os.Looper):
-    
-SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(long, float, android.location.Criteria, java.util.concurrent.Executor, android.location.LocationListener):
-    
-SamShouldBeLast: android.location.LocationManager#requestSingleUpdate(String, android.location.LocationListener, android.os.Looper):
-    
-SamShouldBeLast: android.location.LocationManager#requestSingleUpdate(android.location.Criteria, android.location.LocationListener, android.os.Looper):
-    
-SamShouldBeLast: android.media.AudioFocusRequest.Builder#setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener, android.os.Handler):
-    
-SamShouldBeLast: android.media.AudioManager#requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int):
-    
-SamShouldBeLast: android.media.AudioRecord#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler):
-    
-SamShouldBeLast: android.media.AudioRecord#registerAudioRecordingCallback(java.util.concurrent.Executor, android.media.AudioManager.AudioRecordingCallback):
-    
-SamShouldBeLast: android.media.AudioRecordingMonitor#registerAudioRecordingCallback(java.util.concurrent.Executor, android.media.AudioManager.AudioRecordingCallback):
-    
-SamShouldBeLast: android.media.AudioRouting#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler):
-    
-SamShouldBeLast: android.media.AudioTrack#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler):
-    SAM-compatible parameters (such as parameter 1, "listener", in android.media.AudioTrack.addOnRoutingChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
-SamShouldBeLast: android.media.MediaPlayer#setOnRtpRxNoticeListener(android.content.Context, android.media.MediaPlayer.OnRtpRxNoticeListener, android.os.Handler):
-    SAM-compatible parameters (such as parameter 2, "listener", in android.media.MediaPlayer.setOnRtpRxNoticeListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
-SamShouldBeLast: android.media.MediaRecorder#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler):
-    
-SamShouldBeLast: android.media.MediaRecorder#registerAudioRecordingCallback(java.util.concurrent.Executor, android.media.AudioManager.AudioRecordingCallback):
-    
-SamShouldBeLast: android.media.session.MediaSessionManager#addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, android.content.ComponentName):
-    
-SamShouldBeLast: android.media.session.MediaSessionManager#addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, android.content.ComponentName, android.os.Handler):
-    
-SamShouldBeLast: android.media.session.MediaSessionManager#addOnSession2TokensChangedListener(android.media.session.MediaSessionManager.OnSession2TokensChangedListener, android.os.Handler):
-    
-SamShouldBeLast: android.media.session.MediaSessionManager#registerCallback(java.util.concurrent.Executor, android.media.session.MediaSessionManager.Callback):
-    
-SamShouldBeLast: android.net.ConnectivityManager#createSocketKeepalive(android.net.Network, android.net.IpSecManager.UdpEncapsulationSocket, java.net.InetAddress, java.net.InetAddress, java.util.concurrent.Executor, android.net.SocketKeepalive.Callback):
-    
-SamShouldBeLast: android.net.wifi.WifiManager#startLocalOnlyHotspot(android.net.wifi.SoftApConfiguration, java.util.concurrent.Executor, android.net.wifi.WifiManager.LocalOnlyHotspotCallback):
-    
-SamShouldBeLast: android.net.wifi.rtt.WifiRttManager#startRanging(android.net.wifi.rtt.RangingRequest, java.util.concurrent.Executor, android.net.wifi.rtt.RangingResultCallback):
-    
-SamShouldBeLast: android.nfc.NfcAdapter#enableReaderMode(android.app.Activity, android.nfc.NfcAdapter.ReaderCallback, int, android.os.Bundle):
-    
-SamShouldBeLast: android.nfc.NfcAdapter#ignore(android.nfc.Tag, int, android.nfc.NfcAdapter.OnTagRemovedListener, android.os.Handler):
-    
-SamShouldBeLast: android.nfc.NfcAdapter#setBeamPushUrisCallback(android.nfc.NfcAdapter.CreateBeamUrisCallback, android.app.Activity):
-    
-SamShouldBeLast: android.nfc.NfcAdapter#setNdefPushMessageCallback(android.nfc.NfcAdapter.CreateNdefMessageCallback, android.app.Activity, android.app.Activity...):
-    
-SamShouldBeLast: android.nfc.NfcAdapter#setOnNdefPushCompleteCallback(android.nfc.NfcAdapter.OnNdefPushCompleteCallback, android.app.Activity, android.app.Activity...):
-    
-SamShouldBeLast: android.os.Binder#attachInterface(android.os.IInterface, String):
-    
-SamShouldBeLast: android.os.Binder#linkToDeath(android.os.IBinder.DeathRecipient, int):
-    
-SamShouldBeLast: android.os.Binder#unlinkToDeath(android.os.IBinder.DeathRecipient, int):
-    
-SamShouldBeLast: android.os.Handler#dump(android.util.Printer, String):
-    
-SamShouldBeLast: android.os.Handler#postAtTime(Runnable, Object, long):
-    
-SamShouldBeLast: android.os.Handler#postAtTime(Runnable, long):
-    
-SamShouldBeLast: android.os.Handler#postDelayed(Runnable, Object, long):
-    
-SamShouldBeLast: android.os.Handler#postDelayed(Runnable, long):
-    
-SamShouldBeLast: android.os.Handler#removeCallbacks(Runnable, Object):
-    
-SamShouldBeLast: android.os.IBinder#linkToDeath(android.os.IBinder.DeathRecipient, int):
-    
-SamShouldBeLast: android.os.IBinder#unlinkToDeath(android.os.IBinder.DeathRecipient, int):
-    
-SamShouldBeLast: android.os.RecoverySystem#verifyPackage(java.io.File, android.os.RecoverySystem.ProgressListener, java.io.File):
-    
-SamShouldBeLast: android.telephony.MbmsDownloadSession#addProgressListener(android.telephony.mbms.DownloadRequest, java.util.concurrent.Executor, android.telephony.mbms.DownloadProgressListener):
-    
-SamShouldBeLast: android.telephony.MbmsDownloadSession#addStatusListener(android.telephony.mbms.DownloadRequest, java.util.concurrent.Executor, android.telephony.mbms.DownloadStatusListener):
-    
-SamShouldBeLast: android.telephony.MbmsDownloadSession#create(android.content.Context, java.util.concurrent.Executor, android.telephony.mbms.MbmsDownloadSessionCallback):
-    
-SamShouldBeLast: android.telephony.MbmsDownloadSession#create(android.content.Context, java.util.concurrent.Executor, int, android.telephony.mbms.MbmsDownloadSessionCallback):
-    
-SamShouldBeLast: android.telephony.MbmsGroupCallSession#create(android.content.Context, int, java.util.concurrent.Executor, android.telephony.mbms.MbmsGroupCallSessionCallback):
-    
-SamShouldBeLast: android.telephony.MbmsGroupCallSession#create(android.content.Context, java.util.concurrent.Executor, android.telephony.mbms.MbmsGroupCallSessionCallback):
-    
-SamShouldBeLast: android.telephony.MbmsGroupCallSession#startGroupCall(long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>, java.util.concurrent.Executor, android.telephony.mbms.GroupCallCallback):
-    
-SamShouldBeLast: android.telephony.MbmsStreamingSession#create(android.content.Context, java.util.concurrent.Executor, android.telephony.mbms.MbmsStreamingSessionCallback):
-    
-SamShouldBeLast: android.telephony.MbmsStreamingSession#create(android.content.Context, java.util.concurrent.Executor, int, android.telephony.mbms.MbmsStreamingSessionCallback):
-    
-SamShouldBeLast: android.telephony.MbmsStreamingSession#startStreaming(android.telephony.mbms.StreamingServiceInfo, java.util.concurrent.Executor, android.telephony.mbms.StreamingServiceCallback):
-    
-SamShouldBeLast: android.telephony.SmsManager#getSmsMessagesForFinancialApp(android.os.Bundle, java.util.concurrent.Executor, android.telephony.SmsManager.FinancialSmsCallback):
-    
-SamShouldBeLast: android.telephony.SubscriptionManager#addOnOpportunisticSubscriptionsChangedListener(java.util.concurrent.Executor, android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener):
-    
-SamShouldBeLast: android.telephony.TelephonyManager#requestCellInfoUpdate(java.util.concurrent.Executor, android.telephony.TelephonyManager.CellInfoCallback):
-    
-SamShouldBeLast: android.telephony.TelephonyManager#requestNetworkScan(android.telephony.NetworkScanRequest, java.util.concurrent.Executor, android.telephony.TelephonyScanManager.NetworkScanCallback):
-    
-SamShouldBeLast: android.telephony.TelephonyManager#setPreferredOpportunisticDataSubscription(int, boolean, java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Integer>):
-    
-SamShouldBeLast: android.telephony.TelephonyManager#updateAvailableNetworks(java.util.List<android.telephony.AvailableNetworkInfo>, java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Integer>):
-    
-SamShouldBeLast: android.view.View#postDelayed(Runnable, long):
-    
-SamShouldBeLast: android.view.View#postOnAnimationDelayed(Runnable, long):
-    
-SamShouldBeLast: android.view.View#scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long):
-    
-SamShouldBeLast: android.view.Window#addOnFrameMetricsAvailableListener(android.view.Window.OnFrameMetricsAvailableListener, android.os.Handler):
-    
-SamShouldBeLast: android.view.accessibility.AccessibilityManager#addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener, android.os.Handler):
-    
-SamShouldBeLast: android.view.accessibility.AccessibilityManager#addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener, android.os.Handler):
-    
-SamShouldBeLast: android.webkit.WebChromeClient#onShowFileChooser(android.webkit.WebView, android.webkit.ValueCallback<android.net.Uri[]>, android.webkit.WebChromeClient.FileChooserParams):
-    
-SamShouldBeLast: android.webkit.WebView#setWebViewRenderProcessClient(java.util.concurrent.Executor, android.webkit.WebViewRenderProcessClient):
-    
-
-
-ServiceName: android.Manifest.permission#BIND_ATTENTION_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_AUGMENTED_AUTOFILL_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_CELL_BROADCAST_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_CONTENT_CAPTURE_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_CONTENT_SUGGESTIONS_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_EUICC_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_EXTERNAL_STORAGE_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_IMS_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_NETWORK_RECOMMENDATION_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_NOTIFICATION_ASSISTANT_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_PHONE_ACCOUNT_SUGGESTION_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_PRINT_RECOMMENDATION_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_RESOLVER_RANKER_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_SETTINGS_SUGGESTIONS_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_SOUND_TRIGGER_DETECTION_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_TELEPHONY_DATA_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_TELEPHONY_NETWORK_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_TEXTCLASSIFIER_SERVICE:
-    
-ServiceName: android.Manifest.permission#BIND_TV_REMOTE_SERVICE:
-    
-ServiceName: android.Manifest.permission#PROVIDE_RESOLVER_RANKER_SERVICE:
-    
-ServiceName: android.Manifest.permission#REQUEST_NOTIFICATION_ASSISTANT_SERVICE:
-    
-ServiceName: android.provider.DeviceConfig#NAMESPACE_PACKAGE_MANAGER_SERVICE:
-    
-
-
-UserHandle: android.companion.CompanionDeviceManager#isDeviceAssociated(String, android.net.MacAddress, android.os.UserHandle):
-    
-
-
-UserHandleName: android.telephony.CellBroadcastIntents#sendOrderedBroadcastForBackgroundReceivers(android.content.Context, android.os.UserHandle, android.content.Intent, String, String, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle):
-    
diff --git a/api/system-removed.txt b/api/system-removed.txt
deleted file mode 100644
index 3acc225..0000000
--- a/api/system-removed.txt
+++ /dev/null
@@ -1,198 +0,0 @@
-// Signature format: 2.0
-package android {
-
-  public static final class Manifest.permission {
-    field public static final String MANAGE_DEVICE_ADMINS = "android.permission.MANAGE_DEVICE_ADMINS";
-  }
-
-}
-
-package android.app {
-
-  public class AppOpsManager {
-    method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.app.AppOpsManager.PackageOps> getOpsForPackage(int, @NonNull String, @Nullable int[]);
-    method @Deprecated public void setNotedAppOpsCollector(@Nullable android.app.AppOpsManager.AppOpsCollector);
-  }
-
-  @Deprecated public abstract static class AppOpsManager.AppOpsCollector extends android.app.AppOpsManager.OnOpNotedCallback {
-    ctor public AppOpsManager.AppOpsCollector();
-    method @NonNull public java.util.concurrent.Executor getAsyncNotedExecutor();
-  }
-
-  public class Notification implements android.os.Parcelable {
-    method public static Class<? extends android.app.Notification.Style> getNotificationStyleClass(String);
-  }
-
-  public static final class Notification.TvExtender implements android.app.Notification.Extender {
-    method @Deprecated public String getChannel();
-  }
-
-}
-
-package android.app.backup {
-
-  public class RestoreSession {
-    method @Deprecated public int restoreSome(long, android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor, String[]);
-    method @Deprecated public int restoreSome(long, android.app.backup.RestoreObserver, String[]);
-  }
-
-}
-
-package android.app.prediction {
-
-  public static final class AppTarget.Builder {
-    ctor @Deprecated public AppTarget.Builder(@NonNull android.app.prediction.AppTargetId);
-    method @Deprecated @NonNull public android.app.prediction.AppTarget.Builder setTarget(@NonNull String, @NonNull android.os.UserHandle);
-    method @Deprecated @NonNull public android.app.prediction.AppTarget.Builder setTarget(@NonNull android.content.pm.ShortcutInfo);
-  }
-
-}
-
-package android.content {
-
-  public class Intent implements java.lang.Cloneable android.os.Parcelable {
-    field @Deprecated public static final String ACTION_DEVICE_INITIALIZATION_WIZARD = "android.intent.action.DEVICE_INITIALIZATION_WIZARD";
-    field @Deprecated public static final String ACTION_MASTER_CLEAR = "android.intent.action.MASTER_CLEAR";
-    field @Deprecated public static final String ACTION_SERVICE_STATE = "android.intent.action.SERVICE_STATE";
-    field @Deprecated public static final String EXTRA_CDMA_DEFAULT_ROAMING_INDICATOR = "cdmaDefaultRoamingIndicator";
-    field @Deprecated public static final String EXTRA_CDMA_ROAMING_INDICATOR = "cdmaRoamingIndicator";
-    field @Deprecated public static final String EXTRA_CSS_INDICATOR = "cssIndicator";
-    field @Deprecated public static final String EXTRA_DATA_OPERATOR_ALPHA_LONG = "data-operator-alpha-long";
-    field @Deprecated public static final String EXTRA_DATA_OPERATOR_ALPHA_SHORT = "data-operator-alpha-short";
-    field @Deprecated public static final String EXTRA_DATA_OPERATOR_NUMERIC = "data-operator-numeric";
-    field @Deprecated public static final String EXTRA_DATA_RADIO_TECH = "dataRadioTechnology";
-    field @Deprecated public static final String EXTRA_DATA_REG_STATE = "dataRegState";
-    field @Deprecated public static final String EXTRA_DATA_ROAMING_TYPE = "dataRoamingType";
-    field @Deprecated public static final String EXTRA_EMERGENCY_ONLY = "emergencyOnly";
-    field @Deprecated public static final String EXTRA_IS_DATA_ROAMING_FROM_REGISTRATION = "isDataRoamingFromRegistration";
-    field @Deprecated public static final String EXTRA_IS_USING_CARRIER_AGGREGATION = "isUsingCarrierAggregation";
-    field @Deprecated public static final String EXTRA_LTE_EARFCN_RSRP_BOOST = "LteEarfcnRsrpBoost";
-    field @Deprecated public static final String EXTRA_MANUAL = "manual";
-    field @Deprecated public static final String EXTRA_NETWORK_ID = "networkId";
-    field @Deprecated public static final String EXTRA_OPERATOR_ALPHA_LONG = "operator-alpha-long";
-    field @Deprecated public static final String EXTRA_OPERATOR_ALPHA_SHORT = "operator-alpha-short";
-    field @Deprecated public static final String EXTRA_OPERATOR_NUMERIC = "operator-numeric";
-    field @Deprecated public static final String EXTRA_SYSTEM_ID = "systemId";
-    field @Deprecated public static final String EXTRA_VOICE_RADIO_TECH = "radioTechnology";
-    field @Deprecated public static final String EXTRA_VOICE_REG_STATE = "voiceRegState";
-    field @Deprecated public static final String EXTRA_VOICE_ROAMING_TYPE = "voiceRoamingType";
-  }
-
-}
-
-package android.content.pm {
-
-  public class PackageItemInfo {
-    field @Deprecated public static final int SAFE_LABEL_FLAG_FIRST_LINE = 4; // 0x4
-    field @Deprecated public static final int SAFE_LABEL_FLAG_SINGLE_LINE = 2; // 0x2
-    field @Deprecated public static final int SAFE_LABEL_FLAG_TRIM = 1; // 0x1
-  }
-
-}
-
-package android.hardware.hdmi {
-
-  public final class HdmiControlManager {
-    method @Deprecated public java.util.List<android.hardware.hdmi.HdmiDeviceInfo> getConnectedDevicesList();
-    method @Deprecated public boolean isRemoteDeviceConnected(@NonNull android.hardware.hdmi.HdmiDeviceInfo);
-    method @Deprecated public void powerOffRemoteDevice(@NonNull android.hardware.hdmi.HdmiDeviceInfo);
-    method @Deprecated public void powerOnRemoteDevice(android.hardware.hdmi.HdmiDeviceInfo);
-    method @Deprecated public void requestRemoteDeviceToBecomeActiveSource(@NonNull android.hardware.hdmi.HdmiDeviceInfo);
-  }
-
-}
-
-package android.location {
-
-  public class LocationManager {
-    method @Deprecated public boolean addGpsMeasurementListener(android.location.GpsMeasurementsEvent.Listener);
-    method @Deprecated public boolean addGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener);
-    method @Deprecated public void removeGpsMeasurementListener(android.location.GpsMeasurementsEvent.Listener);
-    method @Deprecated public void removeGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setLocationControllerExtraPackage(String);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setLocationControllerExtraPackageEnabled(boolean);
-  }
-
-}
-
-package android.media.tv {
-
-  public final class TvInputManager {
-    method @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public android.media.tv.TvInputManager.Hardware acquireTvInputHardware(int, android.media.tv.TvInputManager.HardwareCallback, android.media.tv.TvInputInfo);
-  }
-
-  public static final class TvInputManager.Hardware {
-    method public boolean dispatchKeyEventToHdmi(android.view.KeyEvent);
-  }
-
-}
-
-package android.net.wifi {
-
-  @Deprecated public class BatchedScanResult implements android.os.Parcelable {
-    ctor public BatchedScanResult();
-    ctor public BatchedScanResult(android.net.wifi.BatchedScanResult);
-    field public final java.util.List<android.net.wifi.ScanResult> scanResults;
-    field public boolean truncated;
-  }
-
-  public final class ScanResult implements android.os.Parcelable {
-    field public boolean untrusted;
-  }
-
-}
-
-package android.os {
-
-  public class Build {
-    field public static final boolean PERMISSIONS_REVIEW_REQUIRED = true;
-  }
-
-}
-
-package android.service.notification {
-
-  public abstract class NotificationListenerService extends android.app.Service {
-    method public android.service.notification.StatusBarNotification[] getActiveNotifications(int);
-    method public android.service.notification.StatusBarNotification[] getActiveNotifications(String[], int);
-    method public void registerAsSystemService(android.content.Context, android.content.ComponentName, int) throws android.os.RemoteException;
-    method public final void setOnNotificationPostedTrim(int);
-    method public final void snoozeNotification(String, String);
-    method public void unregisterAsSystemService() throws android.os.RemoteException;
-    field public static final int TRIM_FULL = 0; // 0x0
-    field public static final int TRIM_LIGHT = 1; // 0x1
-  }
-
-  public static class NotificationListenerService.Ranking {
-    method public java.util.List<java.lang.String> getAdditionalPeople();
-    method public java.util.List<android.service.notification.SnoozeCriterion> getSnoozeCriteria();
-  }
-
-}
-
-package android.telecom {
-
-  public class TelecomManager {
-    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.WRITE_SECURE_SETTINGS}) public boolean setDefaultDialer(@Nullable String);
-  }
-
-}
-
-package android.telephony {
-
-  public class TelephonyManager {
-    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void answerRingingCall();
-    method @Deprecated @RequiresPermission(android.Manifest.permission.CALL_PHONE) public boolean endCall();
-    method @Deprecated public void silenceRinger();
-  }
-
-}
-
-package android.telephony.data {
-
-  public final class DataCallResponse implements android.os.Parcelable {
-    ctor public DataCallResponse(int, int, int, int, int, @Nullable String, @Nullable java.util.List<android.net.LinkAddress>, @Nullable java.util.List<java.net.InetAddress>, @Nullable java.util.List<java.net.InetAddress>, @Nullable java.util.List<java.net.InetAddress>, int);
-  }
-
-}
-
diff --git a/cmds/abx/Android.bp b/cmds/abx/Android.bp
new file mode 100644
index 0000000..333aced
--- /dev/null
+++ b/cmds/abx/Android.bp
@@ -0,0 +1,20 @@
+
+java_binary {
+    name: "abx",
+    wrapper: "abx",
+    srcs: ["**/*.java"],
+    required: [
+        "abx2xml",
+        "xml2abx",
+    ],
+}
+
+sh_binary {
+    name: "abx2xml",
+    src: "abx2xml",
+}
+
+sh_binary {
+    name: "xml2abx",
+    src: "xml2abx",
+}
diff --git a/cmds/abx/MODULE_LICENSE_APACHE2 b/cmds/abx/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cmds/abx/MODULE_LICENSE_APACHE2
diff --git a/cmds/abx/NOTICE b/cmds/abx/NOTICE
new file mode 100644
index 0000000..50e9e9b
--- /dev/null
+++ b/cmds/abx/NOTICE
@@ -0,0 +1,189 @@
+
+   Copyright (c) 2005-2020, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
diff --git a/cmds/abx/abx b/cmds/abx/abx
new file mode 100755
index 0000000..0a9362d
--- /dev/null
+++ b/cmds/abx/abx
@@ -0,0 +1,3 @@
+#!/system/bin/sh
+export CLASSPATH=/system/framework/abx.jar
+exec app_process /system/bin com.android.commands.abx.Abx "$0" "$@"
diff --git a/cmds/abx/abx2xml b/cmds/abx/abx2xml
new file mode 100755
index 0000000..0a9362d
--- /dev/null
+++ b/cmds/abx/abx2xml
@@ -0,0 +1,3 @@
+#!/system/bin/sh
+export CLASSPATH=/system/framework/abx.jar
+exec app_process /system/bin com.android.commands.abx.Abx "$0" "$@"
diff --git a/cmds/abx/src/com/android/commands/abx/Abx.java b/cmds/abx/src/com/android/commands/abx/Abx.java
new file mode 100644
index 0000000..8f1a4cf
--- /dev/null
+++ b/cmds/abx/src/com/android/commands/abx/Abx.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.commands.abx;
+
+import android.util.Xml;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * Utility that offers to convert between human-readable XML and a custom binary
+ * XML protocol.
+ *
+ * @see Xml#newSerializer()
+ * @see Xml#newBinarySerializer()
+ */
+public class Abx {
+    private static final String USAGE = "" +
+            "usage: abx2xml [-i] input [output]\n" +
+            "usage: xml2abx [-i] input [output]\n\n" +
+            "Converts between human-readable XML and Android Binary XML.\n\n" +
+            "When invoked with the '-i' argument, the output of a successful conversion\n" +
+            "will overwrite the original input file. Input can be '-' to use stdin, and\n" +
+            "output can be '-' to use stdout.\n";
+
+    private static InputStream openInput(String arg) throws IOException {
+        if ("-".equals(arg)) {
+            return System.in;
+        } else {
+            return new FileInputStream(arg);
+        }
+    }
+
+    private static OutputStream openOutput(String arg) throws IOException {
+        if ("-".equals(arg)) {
+            return System.out;
+        } else {
+            return new FileOutputStream(arg);
+        }
+    }
+
+    private static void mainInternal(String[] args) {
+        if (args.length < 2) {
+            throw new IllegalArgumentException("Missing arguments");
+        }
+
+        final XmlPullParser in;
+        final XmlSerializer out;
+        if (args[0].endsWith("abx2xml")) {
+            in = Xml.newBinaryPullParser();
+            out = Xml.newSerializer();
+        } else if (args[0].endsWith("xml2abx")) {
+            in = Xml.newPullParser();
+            out = Xml.newBinarySerializer();
+        } else {
+            throw new IllegalArgumentException("Unsupported conversion");
+        }
+
+        final boolean inPlace = "-i".equals(args[1]);
+        final String inputArg = inPlace ? args[2] : args[1];
+        final String outputArg = inPlace ? args[2] + ".tmp" : args[2];
+
+        try (InputStream is = openInput(inputArg);
+                OutputStream os = openOutput(outputArg)) {
+            in.setInput(is, StandardCharsets.UTF_8.name());
+            out.setOutput(os, StandardCharsets.UTF_8.name());
+            out.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
+            Xml.copy(in, out);
+            out.flush();
+        } catch (Exception e) {
+            // Clean up failed output before throwing
+            if (inPlace) {
+                new File(outputArg).delete();
+            }
+            throw new IllegalStateException(e);
+        }
+
+        // Successful in-place conversion of a file requires a rename
+        if (inPlace) {
+            if (!new File(outputArg).renameTo(new File(inputArg))) {
+                throw new IllegalStateException("Failed rename");
+            }
+        }
+    }
+
+    public static void main(String[] args) {
+        try {
+            mainInternal(args);
+            System.exit(0);
+        } catch (Exception e) {
+            System.err.println(e.toString());
+            System.err.println();
+            System.err.println(USAGE);
+            System.exit(1);
+        }
+    }
+}
diff --git a/cmds/abx/xml2abx b/cmds/abx/xml2abx
new file mode 100755
index 0000000..0a9362d
--- /dev/null
+++ b/cmds/abx/xml2abx
@@ -0,0 +1,3 @@
+#!/system/bin/sh
+export CLASSPATH=/system/framework/abx.jar
+exec app_process /system/bin com.android.commands.abx.Abx "$0" "$@"
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index bdb8380..ebe6199 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -186,6 +186,8 @@
                 instrument.userId = parseUserArg(nextArgRequired());
             } else if (opt.equals("--abi")) {
                 instrument.abi = nextArgRequired();
+            } else if (opt.equals("--no-restart")) {
+                instrument.noRestart = true;
             } else {
                 System.err.println("Error: Unknown option: " + opt);
                 return;
diff --git a/cmds/am/src/com/android/commands/am/Instrument.java b/cmds/am/src/com/android/commands/am/Instrument.java
index 7c30c8b..2be8264 100644
--- a/cmds/am/src/com/android/commands/am/Instrument.java
+++ b/cmds/am/src/com/android/commands/am/Instrument.java
@@ -19,6 +19,7 @@
 import static android.app.ActivityManager.INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS;
 import static android.app.ActivityManager.INSTR_FLAG_DISABLE_ISOLATED_STORAGE;
 import static android.app.ActivityManager.INSTR_FLAG_DISABLE_TEST_API_CHECKS;
+import static android.app.ActivityManager.INSTR_FLAG_NO_RESTART;
 
 import android.app.IActivityManager;
 import android.app.IInstrumentationWatcher;
@@ -89,6 +90,7 @@
     public boolean disableTestApiChecks = true;
     public boolean disableIsolatedStorage = false;
     public String abi = null;
+    public boolean noRestart = false;
     public int userId = UserHandle.USER_CURRENT;
     public Bundle args = new Bundle();
     // Required
@@ -514,6 +516,9 @@
             if (disableIsolatedStorage) {
                 flags |= INSTR_FLAG_DISABLE_ISOLATED_STORAGE;
             }
+            if (noRestart) {
+                flags |= INSTR_FLAG_NO_RESTART;
+            }
             if (!mAm.startInstrumentation(cn, profileFile, flags, args, watcher, connection, userId,
                         abi)) {
                 throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString());
diff --git a/cmds/statsd/Android.bp b/cmds/statsd/Android.bp
index 012450d..d225f966 100644
--- a/cmds/statsd/Android.bp
+++ b/cmds/statsd/Android.bp
@@ -294,6 +294,7 @@
         "tests/e2e/Anomaly_duration_sum_e2e_test.cpp",
         "tests/e2e/Attribution_e2e_test.cpp",
         "tests/e2e/ConfigTtl_e2e_test.cpp",
+        "tests/e2e/ConfigUpdate_e2e_test.cpp",
         "tests/e2e/CountMetric_e2e_test.cpp",
         "tests/e2e/DurationMetric_e2e_test.cpp",
         "tests/e2e/GaugeMetric_e2e_pull_test.cpp",
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp
index 7bee4e2..6eff639 100644
--- a/cmds/statsd/src/StatsLogProcessor.cpp
+++ b/cmds/statsd/src/StatsLogProcessor.cpp
@@ -520,10 +520,10 @@
 }
 
 void StatsLogProcessor::OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key,
-                                        const StatsdConfig& config) {
+                                        const StatsdConfig& config, bool modularUpdate) {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
     WriteDataToDiskLocked(key, timestampNs, CONFIG_UPDATED, NO_TIME_CONSTRAINTS);
-    OnConfigUpdatedLocked(timestampNs, key, config);
+    OnConfigUpdatedLocked(timestampNs, key, config, modularUpdate);
 }
 
 void StatsLogProcessor::OnConfigUpdatedLocked(const int64_t timestampNs, const ConfigKey& key,
@@ -549,9 +549,7 @@
         configValid = it->second->updateConfig(config, mTimeBaseNs, timestampNs,
                                                mAnomalyAlarmMonitor, mPeriodicAlarmMonitor);
         if (configValid) {
-            // TODO(b/162323476): refresh TTL, ensure init() is handled properly.
             mUidMap->OnConfigUpdated(key);
-
         }
     }
     if (!configValid) {
@@ -720,7 +718,8 @@
     for (const auto& key : configs) {
         StatsdConfig config;
         if (StorageManager::readConfigFromDisk(key, &config)) {
-            OnConfigUpdatedLocked(timestampNs, key, config);
+            // Force a full update when resetting a config.
+            OnConfigUpdatedLocked(timestampNs, key, config, /*modularUpdate=*/false);
             StatsdStats::getInstance().noteConfigReset(key);
         } else {
             ALOGE("Failed to read backup config from disk for : %s", key.ToString().c_str());
diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h
index 383dbd9..2af277a 100644
--- a/cmds/statsd/src/StatsLogProcessor.h
+++ b/cmds/statsd/src/StatsLogProcessor.h
@@ -48,7 +48,7 @@
     void OnLogEvent(LogEvent* event);
 
     void OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key,
-                         const StatsdConfig& config);
+                         const StatsdConfig& config, bool modularUpdate = false);
     void OnConfigRemoved(const ConfigKey& key);
 
     size_t GetMetricsSize(const ConfigKey& key) const;
@@ -188,7 +188,7 @@
     void resetIfConfigTtlExpiredLocked(const int64_t timestampNs);
 
     void OnConfigUpdatedLocked(const int64_t currentTimestampNs, const ConfigKey& key,
-                               const StatsdConfig& config, bool modularUpdate = false);
+                               const StatsdConfig& config, bool modularUpdate);
 
     void GetActiveConfigsLocked(const int uid, vector<int64_t>& outActiveConfigs);
 
@@ -338,6 +338,10 @@
     FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithSameDeactivation);
     FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations);
 
+    FRIEND_TEST(ConfigUpdateE2eTest, TestHashStrings);
+    FRIEND_TEST(ConfigUpdateE2eTest, TestUidMapVersionStringInstaller);
+    FRIEND_TEST(ConfigUpdateE2eTest, TestConfigTtl);
+
     FRIEND_TEST(CountMetricE2eTest, TestInitialConditionChanges);
     FRIEND_TEST(CountMetricE2eTest, TestSlicedState);
     FRIEND_TEST(CountMetricE2eTest, TestSlicedStateWithMap);
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 4a7a2b7..f7bbcbb 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -503,6 +503,11 @@
         TlsHandshakeReported tls_handshake_reported = 317 [(module) = "conscrypt"];
         TextClassifierApiUsageReported text_classifier_api_usage_reported = 318  [(module) = "textclassifier"];
         KilledAppStatsReported killed_app_stats_reported = 319 [(module) = "carwatchdogd"];
+        MediametricsPlaybackReported mediametrics_playback_reported = 320;
+        MediaNetworkInfoChanged media_network_info_changed = 321;
+        MediaPlaybackStateChanged media_playback_state_changed = 322;
+        MediaPlaybackErrorReported media_playback_error_reported = 323;
+        MediaPlaybackTrackChanged media_playback_track_changed = 324;
 
         // StatsdStats tracks platform atoms with ids upto 500.
         // Update StatsdStats::kMaxPushedAtomId when atom ids here approach that value.
@@ -12224,3 +12229,122 @@
     // Resident set size in kb.
     optional uint64 vm_rss_kb = 7;
 }
+
+/*
+ * pushes Media playback information.
+ * Logged from
+ *   (WIP) frameworks/av/services/mediaanalytics/playback_statsd.cpp
+ */
+message MediametricsPlaybackReported {
+    optional int32 uid = 1 [(is_uid) = true];
+
+    //  Randomly generated playback ID. A Base64 encoded hex string representing a 128-bit integer
+    optional string playback_id = 2;
+    //  The total length of the media in milliseconds. 0 for live contents.
+    optional int64 media_duration_millis = 3;
+    //  Network, device, or mixed.
+    optional android.stats.mediametrics.StreamSourceType stream_source = 4;
+    //  Stream type. DASH, HLS, etc
+    optional android.stats.mediametrics.StreamType stream_type = 5;
+    //  Live, VOD, others
+    optional android.stats.mediametrics.PlaybackType playback_type = 6;
+    //  DRM type
+    optional android.stats.mediametrics.DrmType drm_type = 7;
+    //  Main, AD, others
+    optional android.stats.mediametrics.ContentType content_type = 8;
+    //  Player name. E.g. ExoPlayer
+    optional string player_name = 9;
+    //  Player version. E.g. 1.10.3e
+    optional string player_version = 10;
+    //  Player related experiment IDs
+    optional Experiments experiment_ids = 11 [(log_mode) = MODE_BYTES];
+    //  Number of frames played. Dropped frames included. -1 means unknown.
+    optional int32 video_frames_played = 12;
+    //  Number of frames dropped. -1 means unknown.
+    optional int32 video_frames_dropped = 13;
+    //  Number of audio underruns. -1 means unknown.
+    optional int32 audio_underrun_count = 14;
+    //  Total number of bytes read from the network
+    optional int64 network_bytes_read = 15;
+    //  Total number of bytes read from on-device sources
+    optional int64 local_bytes_read = 16;
+    //  Total transfer spent reading from the network in ms.
+    // For parallel requests, the overlapping time intervals are counted only once.
+    optional int64 network_transfer_duration_millis = 17;
+}
+
+message MediaNetworkInfoChanged {
+    //  Randomly generated playback ID. A Base64 encoded hex string representing a 128-bit integer
+    optional string playback_id = 1;
+    //  New network type
+    optional android.stats.mediametrics.NetworkType type = 2;
+    //  Network Start time, relative to playback creation time in millisecond.
+    //  It's in absolute time (e.g. always ticks even if the playback is paused).
+    optional int64 time_since_playback_created_millis = 3;
+}
+
+message MediaPlaybackStateChanged {
+    //  Randomly generated playback ID. A Base64 encoded hex string representing a 128-bit integer
+    optional string playback_id = 1;
+    //  New playback state
+    optional android.stats.mediametrics.PlaybackState playback_state = 2;
+    //  State change time, relative to playback creation time in millisecond.
+    //  It's in absolute time (e.g. always ticks even if the playback is paused).
+    optional int64 time_since_playback_created_millis = 3;
+}
+
+message MediaPlaybackErrorReported {
+    //  Randomly generated playback ID. A Base64 encoded hex string representing a 128-bit integer
+    optional string playback_id = 1;
+    //  A shortened call stack of the error
+    optional string exception_stack = 2;
+    //  Error code
+    optional android.stats.mediametrics.PlaybackErrorCode error_code = 3;
+    //  Sub-code of error type specified by the error code.
+    optional int32 sub_error_code = 4;
+    //  Error time, relative to playback creation time in millisecond.
+    //  It's in absolute time (e.g. always ticks even if the playback is paused).
+    optional int64 time_since_playback_created_millis = 5;
+}
+
+message MediaPlaybackTrackChanged {
+    //  Randomly generated playback ID. A Base64 encoded hex string representing a 128-bit integer
+    optional string playback_id = 1;
+    //  The track is on or off after the change
+    optional android.stats.mediametrics.TrackState state = 2;
+    //  The reason of the track change
+    optional android.stats.mediametrics.TrackChangeReason reason = 3;
+    //  The MIME type of the container. E.g. video/mp4
+    optional string container_mime_type = 4;
+    //  The sample MIME type of the track. E.g. video/avc
+    optional string sample_mime_type = 5;
+
+    //  Codec name
+    optional string codec_name = 6;
+    //  Bits per second. 0 means unknown.
+    optional int32 bitrate = 7;
+
+    //  Track change time, relative to playback creation time in millisecond.
+    //  It's in absolute time (e.g. always ticks even if the playback is paused).
+    optional int64 time_since_playback_created_millis = 8;
+
+    //  Track type. Audio, Video, Text
+    optional android.stats.mediametrics.TrackType type = 9;
+    //  2-letter ISO 639-1 language code.
+    optional string language = 10;
+    //  IETF BCP 47 optional language region subtag based on a two-letter country code
+    optional string language_region = 11;
+    //  Number of channels
+    optional int32 channel_count = 12;
+    //  Samples per second
+    optional int32 sample_rate = 13;
+    //  The width of the video in pixels.
+    optional int32 width = 14;
+    //  The height of the video in pixels.
+    optional int32 height = 15;
+}
+
+message Experiments {
+    // Experiment IDs sent by the player.
+    repeated int64 experiments = 1;
+}
diff --git a/cmds/statsd/src/config/ConfigListener.h b/cmds/statsd/src/config/ConfigListener.h
index dcd5e52..3d30137 100644
--- a/cmds/statsd/src/config/ConfigListener.h
+++ b/cmds/statsd/src/config/ConfigListener.h
@@ -39,7 +39,7 @@
      * A configuration was added or updated.
      */
     virtual void OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key,
-                                 const StatsdConfig& config) = 0;
+                                 const StatsdConfig& config, bool modularUpdate = false) = 0;
 
     /**
      * A configuration was removed.
diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp
index acc12aa..f9b0a10 100644
--- a/cmds/statsd/src/metrics/MetricsManager.cpp
+++ b/cmds/statsd/src/metrics/MetricsManager.cpp
@@ -97,40 +97,8 @@
     for (const auto& annotation : config.annotation()) {
         mAnnotations.emplace_back(annotation.field_int64(), annotation.field_int32());
     }
-
-    // Guardrail. Reject the config if it's too big.
-    if (mAllMetricProducers.size() > StatsdStats::kMaxMetricCountPerConfig ||
-        mAllConditionTrackers.size() > StatsdStats::kMaxConditionCountPerConfig ||
-        mAllAtomMatchingTrackers.size() > StatsdStats::kMaxMatcherCountPerConfig) {
-        ALOGE("This config is too big! Reject!");
-        mConfigValid = false;
-    }
-    if (mAllAnomalyTrackers.size() > StatsdStats::kMaxAlertCountPerConfig) {
-        ALOGE("This config has too many alerts! Reject!");
-        mConfigValid = false;
-    }
-
-    mIsAlwaysActive = (mMetricIndexesWithActivation.size() != mAllMetricProducers.size()) ||
-            (mAllMetricProducers.size() == 0);
-    bool isActive = mIsAlwaysActive;
-    for (int metric : mMetricIndexesWithActivation) {
-        isActive |= mAllMetricProducers[metric]->isActive();
-    }
-    mIsActive = isActive;
-    VLOG("mIsActive is initialized to %d", mIsActive)
-
-    // no matter whether this config is valid, log it in the stats.
-    StatsdStats::getInstance().noteConfigReceived(
-            key, mAllMetricProducers.size(), mAllConditionTrackers.size(),
-            mAllAtomMatchingTrackers.size(), mAllAnomalyTrackers.size(), mAnnotations,
-            mConfigValid);
-    // Check active
-    for (const auto& metric : mAllMetricProducers) {
-        if (metric->isActive()) {
-            mIsActive = true;
-            break;
-        }
-    }
+    verifyGuardrailsAndUpdateStatsdStats();
+    initializeConfigActiveStatus();
 }
 
 MetricsManager::~MetricsManager() {
@@ -188,12 +156,32 @@
     mAlertTrackerMap = newAlertTrackerMap;
     mAllPeriodicAlarmTrackers = newPeriodicAlarmTrackers;
 
+    mTtlNs = config.has_ttl_in_seconds() ? config.ttl_in_seconds() * NS_PER_SEC : -1;
+    refreshTtl(currentTimeNs);
+
+    mHashStringsInReport = config.hash_strings_in_metric_report();
+    mVersionStringsInReport = config.version_strings_in_metric_report();
+    mInstallerInReport = config.installer_in_metric_report();
+    mWhitelistedAtomIds.clear();
+    mWhitelistedAtomIds.insert(config.whitelisted_atom_ids().begin(),
+                               config.whitelisted_atom_ids().end());
+    mShouldPersistHistory = config.persist_locally();
+
+    // Store the sub-configs used.
+    mAnnotations.clear();
+    for (const auto& annotation : config.annotation()) {
+        mAnnotations.emplace_back(annotation.field_int64(), annotation.field_int32());
+    }
+
     mAllowedUid.clear();
     mAllowedPkg.clear();
     mDefaultPullUids.clear();
     mPullAtomUids.clear();
     mPullAtomPackages.clear();
     createAllLogSourcesFromConfig(config);
+
+    verifyGuardrailsAndUpdateStatsdStats();
+    initializeConfigActiveStatus();
     return mConfigValid;
 }
 
@@ -255,6 +243,35 @@
     }
 }
 
+void MetricsManager::verifyGuardrailsAndUpdateStatsdStats() {
+    // Guardrail. Reject the config if it's too big.
+    if (mAllMetricProducers.size() > StatsdStats::kMaxMetricCountPerConfig ||
+        mAllConditionTrackers.size() > StatsdStats::kMaxConditionCountPerConfig ||
+        mAllAtomMatchingTrackers.size() > StatsdStats::kMaxMatcherCountPerConfig) {
+        ALOGE("This config is too big! Reject!");
+        mConfigValid = false;
+    }
+    if (mAllAnomalyTrackers.size() > StatsdStats::kMaxAlertCountPerConfig) {
+        ALOGE("This config has too many alerts! Reject!");
+        mConfigValid = false;
+    }
+    // no matter whether this config is valid, log it in the stats.
+    StatsdStats::getInstance().noteConfigReceived(
+            mConfigKey, mAllMetricProducers.size(), mAllConditionTrackers.size(),
+            mAllAtomMatchingTrackers.size(), mAllAnomalyTrackers.size(), mAnnotations,
+            mConfigValid);
+}
+
+void MetricsManager::initializeConfigActiveStatus() {
+    mIsAlwaysActive = (mMetricIndexesWithActivation.size() != mAllMetricProducers.size()) ||
+                      (mAllMetricProducers.size() == 0);
+    mIsActive = mIsAlwaysActive;
+    for (int metric : mMetricIndexesWithActivation) {
+        mIsActive |= mAllMetricProducers[metric]->isActive();
+    }
+    VLOG("mIsActive is initialized to %d", mIsActive);
+}
+
 void MetricsManager::initAllowedLogSources() {
     std::lock_guard<std::mutex> lock(mAllowedLogSourcesMutex);
     mAllowedLogSources.clear();
diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h
index 23048ae..3c9ecdb 100644
--- a/cmds/statsd/src/metrics/MetricsManager.h
+++ b/cmds/statsd/src/metrics/MetricsManager.h
@@ -172,7 +172,7 @@
     bool mVersionStringsInReport = false;
     bool mInstallerInReport = false;
 
-    const int64_t mTtlNs;
+    int64_t mTtlNs;
     int64_t mTtlEndNs;
 
     int64_t mLastReportTimeNs;
@@ -193,7 +193,7 @@
     // To guard access to mAllowedLogSources
     mutable std::mutex mAllowedLogSourcesMutex;
 
-    const std::set<int32_t> mWhitelistedAtomIds;
+    std::set<int32_t> mWhitelistedAtomIds;
 
     // We can pull any atom from these uids.
     std::set<int32_t> mDefaultPullUids;
@@ -211,8 +211,7 @@
     // Contains the annotations passed in with StatsdConfig.
     std::list<std::pair<const int64_t, const int32_t>> mAnnotations;
 
-    const bool mShouldPersistHistory;
-
+    bool mShouldPersistHistory;
 
     // All event tags that are interesting to my metrics.
     std::set<int> mTagIds;
@@ -293,6 +292,14 @@
     // Calls initAllowedLogSources and initPullAtomSources. Sets mConfigValid to false on error.
     void createAllLogSourcesFromConfig(const StatsdConfig& config);
 
+    // Verifies the config meets guardrails and updates statsdStats.
+    // Sets mConfigValid to false on error. Should be called on config creation/update
+    void verifyGuardrailsAndUpdateStatsdStats();
+
+    // Initializes mIsAlwaysActive and mIsActive.
+    // Should be called on config creation/update.
+    void initializeConfigActiveStatus();
+
     // The metrics that don't need to be uploaded or even reported.
     std::set<int64_t> mNoReportMetricIds;
 
@@ -327,6 +334,7 @@
 
     FRIEND_TEST(AlarmE2eTest, TestMultipleAlarms);
     FRIEND_TEST(ConfigTtlE2eTest, TestCountMetric);
+    FRIEND_TEST(ConfigUpdateE2eTest, TestConfigTtl);
     FRIEND_TEST(MetricActivationE2eTest, TestCountMetric);
     FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation);
     FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations);
diff --git a/cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp b/cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp
index 6372361..39789cd 100644
--- a/cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp
+++ b/cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp
@@ -396,6 +396,23 @@
     return true;
 }
 
+bool updateStates(const StatsdConfig& config, const map<int64_t, uint64_t>& oldStateProtoHashes,
+                  unordered_map<int64_t, int>& stateAtomIdMap,
+                  unordered_map<int64_t, unordered_map<int, int64_t>>& allStateGroupMaps,
+                  map<int64_t, uint64_t>& newStateProtoHashes, set<int64_t>& replacedStates) {
+    // Share with metrics_manager_util.
+    if (!initStates(config, stateAtomIdMap, allStateGroupMaps, newStateProtoHashes)) {
+        return false;
+    }
+
+    for (const auto& [stateId, stateHash] : oldStateProtoHashes) {
+        const auto& it = newStateProtoHashes.find(stateId);
+        if (it != newStateProtoHashes.end() && it->second != stateHash) {
+            replacedStates.insert(stateId);
+        }
+    }
+    return true;
+}
 // Returns true if any matchers in the metric activation were replaced.
 bool metricActivationDepsChange(const StatsdConfig& config,
                                 const unordered_map<int64_t, int>& metricToActivationMap,
@@ -869,6 +886,14 @@
         newMetricProducers.push_back(producer.value());
     }
 
+    for (int i = 0; i < config.no_report_metric_size(); ++i) {
+        const int64_t noReportMetric = config.no_report_metric(i);
+        if (newMetricProducerMap.find(noReportMetric) == newMetricProducerMap.end()) {
+            ALOGW("no_report_metric %" PRId64 " not exist", noReportMetric);
+            return false;
+        }
+        noReportMetricIds.insert(noReportMetric);
+    }
     const set<int> atomsAllowedFromAnyUid(config.whitelisted_atom_ids().begin(),
                                           config.whitelisted_atom_ids().end());
     for (int i = 0; i < allMetricsCount; i++) {
@@ -887,6 +912,12 @@
         }
     }
 
+    // Init new/replaced metrics.
+    for (size_t i = 0; i < newMetricProducers.size(); i++) {
+        if (metricsToUpdate[i] == UPDATE_REPLACE || metricsToUpdate[i] == UPDATE_NEW) {
+            newMetricProducers[i]->prepareFirstBucket();
+        }
+    }
     return true;
 }
 
@@ -1028,6 +1059,7 @@
                         set<int64_t>& noReportMetricIds) {
     set<int64_t> replacedMatchers;
     set<int64_t> replacedConditions;
+    set<int64_t> replacedStates;
     set<int64_t> replacedMetrics;
     vector<ConditionState> conditionCache;
     unordered_map<int64_t, int> stateAtomIdMap;
@@ -1039,7 +1071,6 @@
         ALOGE("updateAtomMatchingTrackers failed");
         return false;
     }
-    VLOG("updateAtomMatchingTrackers succeeded");
 
     if (!updateConditions(key, config, newAtomMatchingTrackerMap, replacedMatchers,
                           oldConditionTrackerMap, oldConditionTrackers, newConditionTrackerMap,
@@ -1048,21 +1079,12 @@
         ALOGE("updateConditions failed");
         return false;
     }
-    VLOG("updateConditions succeeded");
 
-    // Share with metrics_manager_util,
-    if (!initStates(config, stateAtomIdMap, allStateGroupMaps, newStateProtoHashes)) {
-        ALOGE("initStates failed");
+    if (!updateStates(config, oldStateProtoHashes, stateAtomIdMap, allStateGroupMaps,
+                      newStateProtoHashes, replacedStates)) {
+        ALOGE("updateStates failed");
         return false;
     }
-
-    set<int64_t> replacedStates;
-    for (const auto& [stateId, stateHash] : oldStateProtoHashes) {
-        const auto& it = newStateProtoHashes.find(stateId);
-        if (it != newStateProtoHashes.end() && it->second != stateHash) {
-            replacedStates.insert(stateId);
-        }
-    }
     if (!updateMetrics(key, config, timeBaseNs, currentTimeNs, pullerManager,
                        oldAtomMatchingTrackerMap, newAtomMatchingTrackerMap, replacedMatchers,
                        newAtomMatchingTrackers, newConditionTrackerMap, replacedConditions,
diff --git a/cmds/statsd/src/metrics/parsing_utils/config_update_utils.h b/cmds/statsd/src/metrics/parsing_utils/config_update_utils.h
index 178a9d2..8e2be68 100644
--- a/cmds/statsd/src/metrics/parsing_utils/config_update_utils.h
+++ b/cmds/statsd/src/metrics/parsing_utils/config_update_utils.h
@@ -126,6 +126,13 @@
                       std::vector<ConditionState>& conditionCache,
                       std::set<int64_t>& replacedConditions);
 
+bool updateStates(const StatsdConfig& config,
+                  const std::map<int64_t, uint64_t>& oldStateProtoHashes,
+                  std::unordered_map<int64_t, int>& stateAtomIdMap,
+                  std::unordered_map<int64_t, std::unordered_map<int, int64_t>>& allStateGroupMaps,
+                  std::map<int64_t, uint64_t>& newStateProtoHashes,
+                  std::set<int64_t>& replacedStates);
+
 // Function to determine the update status (preserve/replace/new) of all metrics in the config.
 // [config]: the input StatsdConfig
 // [oldMetricProducerMap]: metric id to index mapping in the existing MetricsManager
diff --git a/cmds/statsd/tests/ConfigManager_test.cpp b/cmds/statsd/tests/ConfigManager_test.cpp
index 9455304..1d83716 100644
--- a/cmds/statsd/tests/ConfigManager_test.cpp
+++ b/cmds/statsd/tests/ConfigManager_test.cpp
@@ -44,8 +44,8 @@
  */
 class MockListener : public ConfigListener {
 public:
-    MOCK_METHOD3(OnConfigUpdated, void(const int64_t timestampNs, const ConfigKey& key,
-                                       const StatsdConfig& config));
+    MOCK_METHOD4(OnConfigUpdated, void(const int64_t timestampNs, const ConfigKey& key,
+                                       const StatsdConfig& config, bool modularUpdate));
     MOCK_METHOD1(OnConfigRemoved, void(const ConfigKey& key));
 };
 
@@ -89,26 +89,26 @@
         manager->StartupForTest();
 
         // Add another one
-        EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("zzz")),
-            StatsdConfigEq(91)))
+        EXPECT_CALL(*(listener.get()),
+                    OnConfigUpdated(_, ConfigKeyEq(1, StringToId("zzz")), StatsdConfigEq(91), _))
                 .RetiresOnSaturation();
         manager->UpdateConfig(ConfigKey(1, StringToId("zzz")), config91);
 
         // Update It
-        EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("zzz")),
-            StatsdConfigEq(92)))
+        EXPECT_CALL(*(listener.get()),
+                    OnConfigUpdated(_, ConfigKeyEq(1, StringToId("zzz")), StatsdConfigEq(92), _))
                 .RetiresOnSaturation();
         manager->UpdateConfig(ConfigKey(1, StringToId("zzz")), config92);
 
         // Add one with the same uid but a different name
-        EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("yyy")),
-            StatsdConfigEq(93)))
+        EXPECT_CALL(*(listener.get()),
+                    OnConfigUpdated(_, ConfigKeyEq(1, StringToId("yyy")), StatsdConfigEq(93), _))
                 .RetiresOnSaturation();
         manager->UpdateConfig(ConfigKey(1, StringToId("yyy")), config93);
 
         // Add one with the same name but a different uid
-        EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(2, StringToId("zzz")),
-            StatsdConfigEq(94)))
+        EXPECT_CALL(*(listener.get()),
+                    OnConfigUpdated(_, ConfigKeyEq(2, StringToId("zzz")), StatsdConfigEq(94), _))
                 .RetiresOnSaturation();
         manager->UpdateConfig(ConfigKey(2, StringToId("zzz")), config94);
 
@@ -143,7 +143,7 @@
 
     StatsdConfig config;
 
-    EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, _, _)).Times(5);
+    EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, _, _, _)).Times(5);
     EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("xxx"))));
     EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("yyy"))));
     EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("zzz"))));
diff --git a/cmds/statsd/tests/e2e/ConfigUpdate_e2e_test.cpp b/cmds/statsd/tests/e2e/ConfigUpdate_e2e_test.cpp
new file mode 100644
index 0000000..e01a0b6
--- /dev/null
+++ b/cmds/statsd/tests/e2e/ConfigUpdate_e2e_test.cpp
@@ -0,0 +1,307 @@
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT 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 <thread>  // std::this_thread::sleep_for
+
+#include "android-base/stringprintf.h"
+#include "src/StatsLogProcessor.h"
+#include "src/storage/StorageManager.h"
+#include "tests/statsd_test_util.h"
+
+namespace android {
+namespace os {
+namespace statsd {
+
+#ifdef __ANDROID__
+#define STATS_DATA_DIR "/data/misc/stats-data"
+using android::base::StringPrintf;
+
+namespace {
+
+StatsdConfig CreateSimpleConfig() {
+    StatsdConfig config;
+    config.add_allowed_log_source("AID_STATSD");
+    config.set_hash_strings_in_metric_report(false);
+
+    *config.add_atom_matcher() = CreateBatteryStateUsbMatcher();
+    // Simple count metric so the config isn't empty.
+    CountMetric* countMetric1 = config.add_count_metric();
+    countMetric1->set_id(StringToId("Count1"));
+    countMetric1->set_what(config.atom_matcher(0).id());
+    countMetric1->set_bucket(FIVE_MINUTES);
+    return config;
+}
+}  // namespace
+
+// Setup for parameterized tests.
+class ConfigUpdateE2eTest : public TestWithParam<bool> {};
+
+INSTANTIATE_TEST_SUITE_P(ConfigUpdateE2eTest, ConfigUpdateE2eTest, testing::Bool());
+
+TEST_P(ConfigUpdateE2eTest, TestUidMapVersionStringInstaller) {
+    sp<UidMap> uidMap = new UidMap();
+    vector<int32_t> uids({1000});
+    vector<int64_t> versions({1});
+    vector<String16> apps({String16("app1")});
+    vector<String16> versionStrings({String16("v1")});
+    vector<String16> installers({String16("installer1")});
+    uidMap->updateMap(1, uids, versions, versionStrings, apps, installers);
+
+    StatsdConfig config = CreateSimpleConfig();
+    config.set_version_strings_in_metric_report(true);
+    config.set_installer_in_metric_report(false);
+    int64_t baseTimeNs = getElapsedRealtimeNs();
+
+    ConfigKey cfgKey(0, 12345);
+    sp<StatsLogProcessor> processor =
+            CreateStatsLogProcessor(baseTimeNs, baseTimeNs, config, cfgKey, nullptr, 0, uidMap);
+    EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+    sp<MetricsManager> metricsManager = processor->mMetricsManagers.begin()->second;
+    EXPECT_TRUE(metricsManager->isConfigValid());
+
+    // Now update.
+    config.set_version_strings_in_metric_report(false);
+    config.set_installer_in_metric_report(true);
+    processor->OnConfigUpdated(baseTimeNs + 1000, cfgKey, config, /*modularUpdate=*/GetParam());
+    EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+    EXPECT_EQ(metricsManager == processor->mMetricsManagers.begin()->second, GetParam());
+    EXPECT_TRUE(metricsManager->isConfigValid());
+
+    ConfigMetricsReportList reports;
+    vector<uint8_t> buffer;
+    processor->onDumpReport(cfgKey, baseTimeNs + 1001, false, true, ADB_DUMP, FAST, &buffer);
+    EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
+    // First report is written to disk when the update happens.
+    ASSERT_EQ(reports.reports_size(), 2);
+    UidMapping uidMapping = reports.reports(1).uid_map();
+    ASSERT_EQ(uidMapping.snapshots_size(), 1);
+    ASSERT_EQ(uidMapping.snapshots(0).package_info_size(), 1);
+    EXPECT_FALSE(uidMapping.snapshots(0).package_info(0).has_version_string());
+    EXPECT_EQ(uidMapping.snapshots(0).package_info(0).installer(), "installer1");
+}
+
+TEST_P(ConfigUpdateE2eTest, TestHashStrings) {
+    sp<UidMap> uidMap = new UidMap();
+    vector<int32_t> uids({1000});
+    vector<int64_t> versions({1});
+    vector<String16> apps({String16("app1")});
+    vector<String16> versionStrings({String16("v1")});
+    vector<String16> installers({String16("installer1")});
+    uidMap->updateMap(1, uids, versions, versionStrings, apps, installers);
+
+    StatsdConfig config = CreateSimpleConfig();
+    config.set_version_strings_in_metric_report(true);
+    config.set_hash_strings_in_metric_report(true);
+    int64_t baseTimeNs = getElapsedRealtimeNs();
+
+    ConfigKey cfgKey(0, 12345);
+    sp<StatsLogProcessor> processor =
+            CreateStatsLogProcessor(baseTimeNs, baseTimeNs, config, cfgKey, nullptr, 0, uidMap);
+    EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+    sp<MetricsManager> metricsManager = processor->mMetricsManagers.begin()->second;
+    EXPECT_TRUE(metricsManager->isConfigValid());
+
+    // Now update.
+    config.set_hash_strings_in_metric_report(false);
+    processor->OnConfigUpdated(baseTimeNs + 1000, cfgKey, config, /*modularUpdate=*/GetParam());
+    EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+    EXPECT_EQ(metricsManager == processor->mMetricsManagers.begin()->second, GetParam());
+    EXPECT_TRUE(metricsManager->isConfigValid());
+
+    ConfigMetricsReportList reports;
+    vector<uint8_t> buffer;
+    processor->onDumpReport(cfgKey, baseTimeNs + 1001, false, true, ADB_DUMP, FAST, &buffer);
+    EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
+    // First report is written to disk when the update happens.
+    ASSERT_EQ(reports.reports_size(), 2);
+    UidMapping uidMapping = reports.reports(1).uid_map();
+    ASSERT_EQ(uidMapping.snapshots_size(), 1);
+    ASSERT_EQ(uidMapping.snapshots(0).package_info_size(), 1);
+    EXPECT_TRUE(uidMapping.snapshots(0).package_info(0).has_version_string());
+    EXPECT_FALSE(uidMapping.snapshots(0).package_info(0).has_version_string_hash());
+}
+
+TEST_P(ConfigUpdateE2eTest, TestAnnotations) {
+    StatsdConfig config = CreateSimpleConfig();
+    StatsdConfig_Annotation* annotation = config.add_annotation();
+    annotation->set_field_int64(11);
+    annotation->set_field_int32(1);
+    int64_t baseTimeNs = getElapsedRealtimeNs();
+    ConfigKey cfgKey(0, 12345);
+    sp<StatsLogProcessor> processor =
+            CreateStatsLogProcessor(baseTimeNs, baseTimeNs, config, cfgKey);
+
+    // Now update
+    config.clear_annotation();
+    annotation = config.add_annotation();
+    annotation->set_field_int64(22);
+    annotation->set_field_int32(2);
+    processor->OnConfigUpdated(baseTimeNs + 1000, cfgKey, config, /*modularUpdate=*/GetParam());
+
+    ConfigMetricsReportList reports;
+    vector<uint8_t> buffer;
+    processor->onDumpReport(cfgKey, baseTimeNs + 1001, false, true, ADB_DUMP, FAST, &buffer);
+    EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
+    // First report is written to disk when the update happens.
+    ASSERT_EQ(reports.reports_size(), 2);
+    ConfigMetricsReport report = reports.reports(1);
+    EXPECT_EQ(report.annotation_size(), 1);
+    EXPECT_EQ(report.annotation(0).field_int64(), 22);
+    EXPECT_EQ(report.annotation(0).field_int32(), 2);
+}
+
+TEST_P(ConfigUpdateE2eTest, TestPersistLocally) {
+    StatsdConfig config = CreateSimpleConfig();
+    config.set_persist_locally(false);
+    int64_t baseTimeNs = getElapsedRealtimeNs();
+    ConfigKey cfgKey(0, 12345);
+    sp<StatsLogProcessor> processor =
+            CreateStatsLogProcessor(baseTimeNs, baseTimeNs, config, cfgKey);
+    ConfigMetricsReportList reports;
+    vector<uint8_t> buffer;
+    processor->onDumpReport(cfgKey, baseTimeNs + 1001, false, true, ADB_DUMP, FAST, &buffer);
+    EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
+    ASSERT_EQ(reports.reports_size(), 1);
+    // Number of reports should still be 1 since persist_locally is false.
+    reports.Clear();
+    buffer.clear();
+    processor->onDumpReport(cfgKey, baseTimeNs + 1001, false, true, ADB_DUMP, FAST, &buffer);
+    EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
+    ASSERT_EQ(reports.reports_size(), 1);
+
+    // Now update.
+    config.set_persist_locally(true);
+    processor->OnConfigUpdated(baseTimeNs + 1000, cfgKey, config, /*modularUpdate=*/GetParam());
+
+    // Should get 2: 1 in memory + 1 on disk. Both should be saved on disk.
+    reports.Clear();
+    buffer.clear();
+    processor->onDumpReport(cfgKey, baseTimeNs + 1001, false, true, ADB_DUMP, FAST, &buffer);
+    EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
+    ASSERT_EQ(reports.reports_size(), 2);
+    // Should get 3, 2 on disk + 1 in memory.
+    reports.Clear();
+    buffer.clear();
+    processor->onDumpReport(cfgKey, baseTimeNs + 1001, false, true, ADB_DUMP, FAST, &buffer);
+    EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
+    ASSERT_EQ(reports.reports_size(), 3);
+    string suffix = StringPrintf("%d_%lld", cfgKey.GetUid(), (long long)cfgKey.GetId());
+    StorageManager::deleteSuffixedFiles(STATS_DATA_DIR, suffix.c_str());
+    string historySuffix =
+            StringPrintf("%d_%lld_history", cfgKey.GetUid(), (long long)cfgKey.GetId());
+    StorageManager::deleteSuffixedFiles(STATS_DATA_DIR, historySuffix.c_str());
+}
+
+TEST_P(ConfigUpdateE2eTest, TestNoReportMetrics) {
+    StatsdConfig config = CreateSimpleConfig();
+    // Second simple count metric.
+    CountMetric* countMetric = config.add_count_metric();
+    countMetric->set_id(StringToId("Count2"));
+    countMetric->set_what(config.atom_matcher(0).id());
+    countMetric->set_bucket(FIVE_MINUTES);
+    config.add_no_report_metric(config.count_metric(0).id());
+    int64_t baseTimeNs = getElapsedRealtimeNs();
+    ConfigKey cfgKey(0, 12345);
+    sp<StatsLogProcessor> processor =
+            CreateStatsLogProcessor(baseTimeNs, baseTimeNs, config, cfgKey);
+
+    // Now update.
+    config.clear_no_report_metric();
+    config.add_no_report_metric(config.count_metric(1).id());
+    processor->OnConfigUpdated(baseTimeNs + 1000, cfgKey, config, /*modularUpdate=*/GetParam());
+
+    ConfigMetricsReportList reports;
+    vector<uint8_t> buffer;
+    processor->onDumpReport(cfgKey, baseTimeNs + 1001, false, true, ADB_DUMP, FAST, &buffer);
+    EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
+    // First report is written to disk when the update happens.
+    ASSERT_EQ(reports.reports_size(), 2);
+    // First report (before update) has the first count metric.
+    ASSERT_EQ(reports.reports(0).metrics_size(), 1);
+    EXPECT_EQ(reports.reports(0).metrics(0).metric_id(), config.count_metric(1).id());
+    // Second report (after update) has the first count metric.
+    ASSERT_EQ(reports.reports(1).metrics_size(), 1);
+    EXPECT_EQ(reports.reports(1).metrics(0).metric_id(), config.count_metric(0).id());
+}
+
+TEST_P(ConfigUpdateE2eTest, TestAtomsAllowedFromAnyUid) {
+    StatsdConfig config = CreateSimpleConfig();
+    int64_t baseTimeNs = getElapsedRealtimeNs();
+    ConfigKey cfgKey(0, 12345);
+    sp<StatsLogProcessor> processor =
+            CreateStatsLogProcessor(baseTimeNs, baseTimeNs, config, cfgKey);
+    // Uses AID_ROOT, which isn't in allowed log sources.
+    unique_ptr<LogEvent> event = CreateBatteryStateChangedEvent(
+            baseTimeNs + 2, BatteryPluggedStateEnum::BATTERY_PLUGGED_USB);
+    processor->OnLogEvent(event.get());
+    ConfigMetricsReportList reports;
+    vector<uint8_t> buffer;
+    processor->onDumpReport(cfgKey, baseTimeNs + 1001, true, true, ADB_DUMP, FAST, &buffer);
+    EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
+    ASSERT_EQ(reports.reports_size(), 1);
+    // Check the metric and make sure it has 0 count.
+    ASSERT_EQ(reports.reports(0).metrics_size(), 1);
+    EXPECT_FALSE(reports.reports(0).metrics(0).has_count_metrics());
+
+    // Now update. Allow plugged state to be logged from any uid, so the atom will be counted.
+    config.add_whitelisted_atom_ids(util::PLUGGED_STATE_CHANGED);
+    processor->OnConfigUpdated(baseTimeNs + 1000, cfgKey, config, /*modularUpdate=*/GetParam());
+    unique_ptr<LogEvent> event2 = CreateBatteryStateChangedEvent(
+            baseTimeNs + 2000, BatteryPluggedStateEnum::BATTERY_PLUGGED_USB);
+    processor->OnLogEvent(event.get());
+    reports.Clear();
+    buffer.clear();
+    processor->onDumpReport(cfgKey, baseTimeNs + 3000, true, true, ADB_DUMP, FAST, &buffer);
+    EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
+    ASSERT_EQ(reports.reports_size(), 2);
+    // Check the metric and make sure it has 0 count.
+    ASSERT_EQ(reports.reports(1).metrics_size(), 1);
+    EXPECT_TRUE(reports.reports(1).metrics(0).has_count_metrics());
+    ASSERT_EQ(reports.reports(1).metrics(0).count_metrics().data_size(), 1);
+    ASSERT_EQ(reports.reports(1).metrics(0).count_metrics().data(0).bucket_info_size(), 1);
+    EXPECT_EQ(reports.reports(1).metrics(0).count_metrics().data(0).bucket_info(0).count(), 1);
+}
+
+TEST_P(ConfigUpdateE2eTest, TestConfigTtl) {
+    StatsdConfig config = CreateSimpleConfig();
+    config.set_ttl_in_seconds(1);
+    int64_t baseTimeNs = getElapsedRealtimeNs();
+    ConfigKey cfgKey(0, 12345);
+    sp<StatsLogProcessor> processor =
+            CreateStatsLogProcessor(baseTimeNs, baseTimeNs, config, cfgKey);
+    EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+    sp<MetricsManager> metricsManager = processor->mMetricsManagers.begin()->second;
+    EXPECT_EQ(metricsManager->getTtlEndNs(), baseTimeNs + NS_PER_SEC);
+
+    config.set_ttl_in_seconds(5);
+    processor->OnConfigUpdated(baseTimeNs + 2 * NS_PER_SEC, cfgKey, config,
+                               /*modularUpdate=*/GetParam());
+    metricsManager = processor->mMetricsManagers.begin()->second;
+    EXPECT_EQ(metricsManager->getTtlEndNs(), baseTimeNs + 7 * NS_PER_SEC);
+
+    // Clear the data stored on disk as a result of the update.
+    vector<uint8_t> buffer;
+    processor->onDumpReport(cfgKey, baseTimeNs + 3 * NS_PER_SEC, false, true, ADB_DUMP, FAST,
+                            &buffer);
+}
+
+#else
+GTEST_LOG_(INFO) << "This test does nothing.\n";
+#endif
+
+}  // namespace statsd
+}  // namespace os
+}  // namespace android
diff --git a/cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp b/cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp
index 66bab4e..d78c14c 100644
--- a/cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp
+++ b/cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp
@@ -997,6 +997,57 @@
     EXPECT_THAT(combinationTracker1->mSlicedChildren, IsEmpty());
 }
 
+TEST_F(ConfigUpdateTest, TestUpdateStates) {
+    StatsdConfig config;
+    // Add states.
+    // Will be replaced because we add a state map.
+    State state1 = CreateScreenState();
+    int64_t state1Id = state1.id();
+    *config.add_state() = state1;
+
+    // Will be preserved.
+    State state2 = CreateUidProcessState();
+    int64_t state2Id = state2.id();
+    *config.add_state() = state2;
+
+    // Will be replaced since the atom changes from overlay to screen.
+    State state3 = CreateOverlayState();
+    int64_t state3Id = state3.id();
+    *config.add_state() = state3;
+
+    EXPECT_TRUE(initConfig(config));
+
+    // Change definitions of state1 and state3.
+    int64_t screenOnId = 0x4321, screenOffId = 0x1234;
+    *state1.mutable_map() = CreateScreenStateSimpleOnOffMap(screenOnId, screenOffId);
+    state3.set_atom_id(util::SCREEN_STATE_CHANGED);
+
+    StatsdConfig newConfig;
+    *newConfig.add_state() = state3;
+    *newConfig.add_state() = state1;
+    *newConfig.add_state() = state2;
+
+    unordered_map<int64_t, int> stateAtomIdMap;
+    unordered_map<int64_t, unordered_map<int, int64_t>> allStateGroupMaps;
+    map<int64_t, uint64_t> newStateProtoHashes;
+    set<int64_t> replacedStates;
+    EXPECT_TRUE(updateStates(newConfig, oldStateHashes, stateAtomIdMap, allStateGroupMaps,
+                             newStateProtoHashes, replacedStates));
+    EXPECT_THAT(replacedStates, ContainerEq(set({state1Id, state3Id})));
+
+    unordered_map<int64_t, int> expectedStateAtomIdMap = {
+            {state1Id, util::SCREEN_STATE_CHANGED},
+            {state2Id, util::UID_PROCESS_STATE_CHANGED},
+            {state3Id, util::SCREEN_STATE_CHANGED}};
+    EXPECT_THAT(stateAtomIdMap, ContainerEq(expectedStateAtomIdMap));
+
+    unordered_map<int64_t, unordered_map<int, int64_t>> expectedStateGroupMaps = {
+            {state1Id,
+             {{android::view::DisplayStateEnum::DISPLAY_STATE_OFF, screenOffId},
+              {android::view::DisplayStateEnum::DISPLAY_STATE_ON, screenOnId}}}};
+    EXPECT_THAT(allStateGroupMaps, ContainerEq(expectedStateGroupMaps));
+}
+
 TEST_F(ConfigUpdateTest, TestEventMetricPreserve) {
     StatsdConfig config;
     AtomMatcher startMatcher = CreateScreenTurnedOnAtomMatcher();
diff --git a/cmds/svc/src/com/android/commands/svc/UsbCommand.java b/cmds/svc/src/com/android/commands/svc/UsbCommand.java
index cd751f4..227b9e2 100644
--- a/cmds/svc/src/com/android/commands/svc/UsbCommand.java
+++ b/cmds/svc/src/com/android/commands/svc/UsbCommand.java
@@ -42,10 +42,20 @@
                 + "         Sets the functions which, if the device was charging, become current on"
                     + "screen unlock. If function is blank, turn off this feature.\n"
                 + "       svc usb getFunctions\n"
-                + "          Gets the list of currently enabled functions\n"
+                + "         Gets the list of currently enabled functions\n"
+                + "         possible values of [function] are any of 'mtp', 'ptp', 'rndis',\n"
+                + "         'midi', 'ncm (if supporting gadget hal v1.2)'\n"
                 + "       svc usb resetUsbGadget\n"
-                + "          Reset usb gadget\n\n"
-                + "possible values of [function] are any of 'mtp', 'ptp', 'rndis', 'midi'\n";
+                + "         Reset usb gadget\n"
+                + "       svc usb getUsbSpeed\n"
+                + "         Gets current USB speed\n"
+                + "         possible values of USB speed are any of 'low speed', 'full speed',\n"
+                + "         'high speed', 'super speed', 'super speed (10G)',\n"
+                + "         'super speed (20G)', or higher (future extension)\n"
+                + "       svc usb getGadgetHalVersion\n"
+                + "         Gets current Gadget Hal Version\n"
+                + "         possible values of Hal version are any of 'unknown', 'V1_0', 'V1_1',\n"
+                + "         'V1_2'\n";
     }
 
     @Override
@@ -84,6 +94,23 @@
                     System.err.println("Error communicating with UsbManager: " + e);
                 }
                 return;
+            } else if ("getUsbSpeed".equals(args[1])) {
+                try {
+                    System.err.println(
+                            UsbManager.usbSpeedToBandwidth(usbMgr.getCurrentUsbSpeed()));
+                } catch (RemoteException e) {
+                    System.err.println("Error communicating with UsbManager: " + e);
+                }
+                return;
+            } else if ("getGadgetHalVersion".equals(args[1])) {
+                try {
+                    System.err.println(
+                            UsbManager.usbGadgetHalVersionToString(
+                                    usbMgr.getGadgetHalVersion()));
+                } catch (RemoteException e) {
+                    System.err.println("Error communicating with UsbManager: " + e);
+                }
+                return;
             }
         }
         System.err.println(longHelp());
diff --git a/core/api/current.txt b/core/api/current.txt
index 9562715..dfe80c7 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -6950,6 +6950,7 @@
     method @Nullable public java.util.List<java.lang.String> getPermittedCrossProfileNotificationListeners(@NonNull android.content.ComponentName);
     method @Nullable public java.util.List<java.lang.String> getPermittedInputMethods(@NonNull android.content.ComponentName);
     method public int getPersonalAppsSuspendedReasons(@NonNull android.content.ComponentName);
+    method public int getRequiredPasswordComplexity();
     method public long getRequiredStrongAuthTimeout(@Nullable android.content.ComponentName);
     method public boolean getScreenCaptureDisabled(@Nullable android.content.ComponentName);
     method public java.util.List<android.os.UserHandle> getSecondaryUsers(@NonNull android.content.ComponentName);
@@ -7081,6 +7082,7 @@
     method public void setProfileEnabled(@NonNull android.content.ComponentName);
     method public void setProfileName(@NonNull android.content.ComponentName, String);
     method public void setRecommendedGlobalProxy(@NonNull android.content.ComponentName, @Nullable android.net.ProxyInfo);
+    method public void setRequiredPasswordComplexity(int);
     method public void setRequiredStrongAuthTimeout(@NonNull android.content.ComponentName, long);
     method public boolean setResetPasswordToken(android.content.ComponentName, byte[]);
     method public void setRestrictionsProvider(@NonNull android.content.ComponentName, @Nullable android.content.ComponentName);
@@ -7403,6 +7405,12 @@
     field public static final int ERROR_UNKNOWN = 1; // 0x1
   }
 
+  public final class UnsafeStateException extends java.lang.IllegalStateException implements android.os.Parcelable {
+    method public int describeContents();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.app.admin.UnsafeStateException> CREATOR;
+  }
+
 }
 
 package android.app.assist {
@@ -11400,7 +11408,7 @@
     field public static final int CONFIG_COLOR_MODE = 16384; // 0x4000
     field public static final int CONFIG_DENSITY = 4096; // 0x1000
     field public static final int CONFIG_FONT_SCALE = 1073741824; // 0x40000000
-    field public static final int CONFIG_FORCE_BOLD_TEXT = 268435456; // 0x10000000
+    field public static final int CONFIG_FONT_WEIGHT_ADJUSTMENT = 268435456; // 0x10000000
     field public static final int CONFIG_KEYBOARD = 16; // 0x10
     field public static final int CONFIG_KEYBOARD_HIDDEN = 32; // 0x20
     field public static final int CONFIG_LAYOUT_DIRECTION = 8192; // 0x2000
@@ -11736,7 +11744,7 @@
     method public long getFirstInstallTime();
     method public android.graphics.drawable.Drawable getIcon(int);
     method public CharSequence getLabel();
-    method public float getLoadingProgress();
+    method @FloatRange(from=0.0, to=1.0) public float getLoadingProgress();
     method public String getName();
     method public android.os.UserHandle getUser();
   }
@@ -12728,9 +12736,7 @@
     field public static final int COLOR_MODE_WIDE_COLOR_GAMUT_YES = 2; // 0x2
     field @NonNull public static final android.os.Parcelable.Creator<android.content.res.Configuration> CREATOR;
     field public static final int DENSITY_DPI_UNDEFINED = 0; // 0x0
-    field public static final int FORCE_BOLD_TEXT_NO = 1; // 0x1
-    field public static final int FORCE_BOLD_TEXT_UNDEFINED = 0; // 0x0
-    field public static final int FORCE_BOLD_TEXT_YES = 2; // 0x2
+    field public static final int FONT_WEIGHT_ADJUSTMENT_UNDEFINED = 2147483647; // 0x7fffffff
     field public static final int HARDKEYBOARDHIDDEN_NO = 1; // 0x1
     field public static final int HARDKEYBOARDHIDDEN_UNDEFINED = 0; // 0x0
     field public static final int HARDKEYBOARDHIDDEN_YES = 2; // 0x2
@@ -12797,7 +12803,7 @@
     field public int colorMode;
     field public int densityDpi;
     field public float fontScale;
-    field public int forceBoldText;
+    field public int fontWeightAdjustment;
     field public int hardKeyboardHidden;
     field public int keyboard;
     field public int keyboardHidden;
@@ -24166,6 +24172,25 @@
 
 package android.media {
 
+  public final class ApplicationMediaCapabilities implements android.os.Parcelable {
+    method public int describeContents();
+    method @NonNull public java.util.List<java.lang.String> getSupportedHdrTypes();
+    method @NonNull public java.util.List<java.lang.String> getSupportedVideoMimeTypes();
+    method public boolean isHdrTypeSupported(@NonNull String);
+    method public boolean isSlowMotionSupported();
+    method public boolean isVideoMimeTypeSupported(@NonNull String);
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.media.ApplicationMediaCapabilities> CREATOR;
+  }
+
+  public static final class ApplicationMediaCapabilities.Builder {
+    ctor public ApplicationMediaCapabilities.Builder();
+    method @NonNull public android.media.ApplicationMediaCapabilities.Builder addSupportedHdrType(@NonNull String);
+    method @NonNull public android.media.ApplicationMediaCapabilities.Builder addSupportedVideoMimeType(@NonNull String);
+    method @NonNull public android.media.ApplicationMediaCapabilities build();
+    method @NonNull public android.media.ApplicationMediaCapabilities.Builder setSlowMotionSupported(boolean);
+  }
+
   public class AsyncPlayer {
     ctor public AsyncPlayer(String);
     method @Deprecated public void play(android.content.Context, android.net.Uri, boolean, int);
@@ -24364,6 +24389,8 @@
     field public static final int ENCODING_MP3 = 9; // 0x9
     field public static final int ENCODING_OPUS = 20; // 0x14
     field public static final int ENCODING_PCM_16BIT = 2; // 0x2
+    field public static final int ENCODING_PCM_24BIT_PACKED = 21; // 0x15
+    field public static final int ENCODING_PCM_32BIT = 22; // 0x16
     field public static final int ENCODING_PCM_8BIT = 3; // 0x3
     field public static final int ENCODING_PCM_FLOAT = 4; // 0x4
     field public static final int SAMPLE_RATE_UNSPECIFIED = 0; // 0x0
@@ -26261,6 +26288,17 @@
     field public static final String TRACKS = "android.media.mediaextractor.ntrk";
   }
 
+  public final class MediaFeature {
+    ctor public MediaFeature();
+  }
+
+  public static final class MediaFeature.HdrType {
+    field public static final String DOLBY_VISION = "android.media.feature.hdr.dolby_vision";
+    field public static final String HDR10 = "android.media.feature.hdr.hdr10";
+    field public static final String HDR10_PLUS = "android.media.feature.hdr.hdr10_plus";
+    field public static final String HLG = "android.media.feature.hdr.hlg";
+  }
+
   public final class MediaFormat {
     ctor public MediaFormat();
     ctor public MediaFormat(@NonNull android.media.MediaFormat);
@@ -41238,10 +41276,11 @@
     method public String getKeystoreAlias();
     method public int getOrigin();
     method public int getPurposes();
+    method public int getSecurityLevel();
     method @NonNull public String[] getSignaturePaddings();
     method public int getUserAuthenticationType();
     method public int getUserAuthenticationValidityDurationSeconds();
-    method public boolean isInsideSecureHardware();
+    method @Deprecated public boolean isInsideSecureHardware();
     method public boolean isInvalidatedByBiometricEnrollment();
     method public boolean isTrustedUserPresenceRequired();
     method public boolean isUserAuthenticationRequired();
@@ -44243,6 +44282,8 @@
     field public static final String EXTRA_ANSWERING_DROPS_FG_CALL = "android.telecom.extra.ANSWERING_DROPS_FG_CALL";
     field public static final String EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME = "android.telecom.extra.ANSWERING_DROPS_FG_CALL_APP_NAME";
     field public static final String EXTRA_AUDIO_CODEC = "android.telecom.extra.AUDIO_CODEC";
+    field public static final String EXTRA_AUDIO_CODEC_BANDWIDTH_KHZ = "android.telecom.extra.AUDIO_CODEC_BANDWIDTH_KHZ";
+    field public static final String EXTRA_AUDIO_CODEC_BITRATE_KBPS = "android.telecom.extra.AUDIO_CODEC_BITRATE_KBPS";
     field public static final String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT";
     field public static final String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS";
     field public static final String EXTRA_IS_RTT_AUDIO_PRESENT = "android.telecom.extra.IS_RTT_AUDIO_PRESENT";
@@ -51952,16 +51993,17 @@
     field public int toolType;
   }
 
-  public interface OnReceiveContentCallback<T extends android.view.View> {
-    method public boolean onReceiveContent(@NonNull T, @NonNull android.view.OnReceiveContentCallback.Payload);
+  public interface OnReceiveContentListener {
+    method @Nullable public android.view.OnReceiveContentListener.Payload onReceiveContent(@NonNull android.view.View, @NonNull android.view.OnReceiveContentListener.Payload);
   }
 
-  public static final class OnReceiveContentCallback.Payload {
+  public static final class OnReceiveContentListener.Payload {
     method @NonNull public android.content.ClipData getClip();
     method @Nullable public android.os.Bundle getExtras();
     method public int getFlags();
     method @Nullable public android.net.Uri getLinkUri();
     method public int getSource();
+    method @NonNull public java.util.Map<java.lang.Boolean,android.view.OnReceiveContentListener.Payload> 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
@@ -51971,12 +52013,15 @@
     field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
   }
 
-  public static final class OnReceiveContentCallback.Payload.Builder {
-    ctor public OnReceiveContentCallback.Payload.Builder(@NonNull android.content.ClipData, int);
-    method @NonNull public android.view.OnReceiveContentCallback.Payload build();
-    method @NonNull public android.view.OnReceiveContentCallback.Payload.Builder setExtras(@Nullable android.os.Bundle);
-    method @NonNull public android.view.OnReceiveContentCallback.Payload.Builder setFlags(int);
-    method @NonNull public android.view.OnReceiveContentCallback.Payload.Builder setLinkUri(@Nullable android.net.Uri);
+  public static final class OnReceiveContentListener.Payload.Builder {
+    ctor public OnReceiveContentListener.Payload.Builder(@NonNull android.view.OnReceiveContentListener.Payload);
+    ctor public OnReceiveContentListener.Payload.Builder(@NonNull android.content.ClipData, int);
+    method @NonNull public android.view.OnReceiveContentListener.Payload build();
+    method @NonNull public android.view.OnReceiveContentListener.Payload.Builder setClip(@NonNull android.content.ClipData);
+    method @NonNull public android.view.OnReceiveContentListener.Payload.Builder setExtras(@Nullable android.os.Bundle);
+    method @NonNull public android.view.OnReceiveContentListener.Payload.Builder setFlags(int);
+    method @NonNull public android.view.OnReceiveContentListener.Payload.Builder setLinkUri(@Nullable android.net.Uri);
+    method @NonNull public android.view.OnReceiveContentListener.Payload.Builder setSource(int);
   }
 
   public abstract class OrientationEventListener {
@@ -52725,7 +52770,7 @@
     method public void onProvideContentCaptureStructure(@NonNull android.view.ViewStructure, int);
     method public void onProvideStructure(android.view.ViewStructure);
     method public void onProvideVirtualStructure(android.view.ViewStructure);
-    method public boolean onReceiveContent(@NonNull android.view.OnReceiveContentCallback.Payload);
+    method @Nullable public android.view.OnReceiveContentListener.Payload onReceiveContent(@NonNull android.view.OnReceiveContentListener.Payload);
     method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
     method @CallSuper protected void onRestoreInstanceState(android.os.Parcelable);
     method public void onRtlPropertiesChanged(int);
@@ -52883,7 +52928,7 @@
     method public void setOnHoverListener(android.view.View.OnHoverListener);
     method public void setOnKeyListener(android.view.View.OnKeyListener);
     method public void setOnLongClickListener(@Nullable android.view.View.OnLongClickListener);
-    method public void setOnReceiveContentCallback(@Nullable String[], @Nullable android.view.OnReceiveContentCallback);
+    method public void setOnReceiveContentListener(@Nullable String[], @Nullable android.view.OnReceiveContentListener);
     method public void setOnScrollChangeListener(android.view.View.OnScrollChangeListener);
     method @Deprecated public void setOnSystemUiVisibilityChangeListener(android.view.View.OnSystemUiVisibilityChangeListener);
     method public void setOnTouchListener(android.view.View.OnTouchListener);
@@ -59900,11 +59945,6 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.widget.TextView.SavedState> CREATOR;
   }
 
-  public class TextViewOnReceiveContentCallback implements android.view.OnReceiveContentCallback<android.widget.TextView> {
-    ctor public TextViewOnReceiveContentCallback();
-    method public boolean onReceiveContent(@NonNull android.widget.TextView, @NonNull android.view.OnReceiveContentCallback.Payload);
-  }
-
   public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
     method @Nullable public android.content.res.Resources.Theme getDropDownViewTheme();
     method public void setDropDownViewTheme(@Nullable android.content.res.Resources.Theme);
diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt
index 7085f7b..8a369c8 100644
--- a/core/api/module-lib-current.txt
+++ b/core/api/module-lib-current.txt
@@ -43,14 +43,23 @@
 
 }
 
-package android.graphics {
+package android.hardware.usb {
 
-  public final class Compatibility {
-    method public static void setTargetSdkVersion(int);
-  }
-
-  public final class ImageDecoder implements java.lang.AutoCloseable {
-    method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(@NonNull android.content.ContentResolver, @NonNull android.net.Uri, @Nullable android.content.res.Resources);
+  public class UsbManager {
+    method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public int getGadgetHalVersion();
+    method public int getUsbBandwidth();
+    field public static final int GADGET_HAL_NOT_SUPPORTED = -1; // 0xffffffff
+    field public static final int GADGET_HAL_V1_0 = 10; // 0xa
+    field public static final int GADGET_HAL_V1_1 = 11; // 0xb
+    field public static final int GADGET_HAL_V1_2 = 12; // 0xc
+    field public static final int USB_DATA_TRANSFER_RATE_10G = 10240; // 0x2800
+    field public static final int USB_DATA_TRANSFER_RATE_20G = 20480; // 0x5000
+    field public static final int USB_DATA_TRANSFER_RATE_40G = 40960; // 0xa000
+    field public static final int USB_DATA_TRANSFER_RATE_5G = 5120; // 0x1400
+    field public static final int USB_DATA_TRANSFER_RATE_FULL_SPEED = 12; // 0xc
+    field public static final int USB_DATA_TRANSFER_RATE_HIGH_SPEED = 480; // 0x1e0
+    field public static final int USB_DATA_TRANSFER_RATE_LOW_SPEED = 2; // 0x2
+    field public static final int USB_DATA_TRANSFER_RATE_UNKNOWN = -1; // 0xffffffff
   }
 
 }
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index ed3b7de..71dbca0a 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -4130,6 +4130,7 @@
     method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setLocationEnabledForUser(boolean, @NonNull android.os.UserHandle);
     method @Deprecated @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean setProviderEnabledForUser(@NonNull String, boolean, @NonNull android.os.UserHandle);
     method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean unregisterGnssBatchedLocationCallback(@NonNull android.location.BatchedLocationCallback);
+    field public static final String FUSED_PROVIDER = "fused";
   }
 
   public final class LocationRequest implements android.os.Parcelable {
@@ -4432,9 +4433,9 @@
   public static class MediaTranscodeManager.TranscodingRequest.MediaFormatResolver {
     ctor public MediaTranscodeManager.TranscodingRequest.MediaFormatResolver();
     method @Nullable public android.media.MediaFormat resolveVideoFormat();
+    method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.MediaFormatResolver setClientCapabilities(@NonNull android.media.ApplicationMediaCapabilities);
     method @NonNull public android.media.MediaTranscodeManager.TranscodingRequest.MediaFormatResolver setSourceVideoFormatHint(@NonNull android.media.MediaFormat);
     method public boolean shouldTranscode();
-    field public static final String CAPS_SUPPORTS_HEVC = "support-hevc";
   }
 
   public static final class MediaTranscodeManager.TranscodingSession {
@@ -5031,6 +5032,7 @@
     method public long getAvSyncTime(int);
     method @Nullable public android.media.tv.tuner.DemuxCapabilities getDemuxCapabilities();
     method @Nullable public android.media.tv.tuner.frontend.FrontendInfo getFrontendInfo();
+    method @Nullable public java.util.List<android.media.tv.tuner.frontend.FrontendInfo> getFrontendInfoList();
     method @Nullable public android.media.tv.tuner.frontend.FrontendStatus getFrontendStatus(@NonNull int[]);
     method public int linkFrontendToCiCam(int);
     method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_DESCRAMBLER) public android.media.tv.tuner.Descrambler openDescrambler();
@@ -5247,6 +5249,7 @@
   public class Filter implements java.lang.AutoCloseable {
     method public void close();
     method public int configure(@NonNull android.media.tv.tuner.filter.FilterConfiguration);
+    method public int configureScramblingStatusEvent(int);
     method public int flush();
     method public int getId();
     method public long getId64Bit();
@@ -5254,6 +5257,9 @@
     method public int setDataSource(@Nullable android.media.tv.tuner.filter.Filter);
     method public int start();
     method public int stop();
+    field public static final int SCRAMBLING_STATUS_NOT_SCRAMBLED = 2; // 0x2
+    field public static final int SCRAMBLING_STATUS_SCRAMBLED = 4; // 0x4
+    field public static final int SCRAMBLING_STATUS_UNKNOWN = 1; // 0x1
     field public static final int STATUS_DATA_READY = 1; // 0x1
     field public static final int STATUS_HIGH_WATER = 4; // 0x4
     field public static final int STATUS_LOW_WATER = 2; // 0x2
@@ -5354,7 +5360,7 @@
 
   public class MmtpRecordEvent extends android.media.tv.tuner.filter.FilterEvent {
     method public long getDataLength();
-    method public int getFirstMbInSlice();
+    method public int getFirstMacroblockInSlice();
     method public int getMpuSequenceNumber();
     method public long getPts();
     method public int getScHevcIndexMask();
@@ -5432,6 +5438,10 @@
     method @NonNull public android.media.tv.tuner.filter.RecordSettings.Builder setTsIndexMask(int);
   }
 
+  public final class ScramblingStatusEvent extends android.media.tv.tuner.filter.FilterEvent {
+    method public int getScramblingStatus();
+  }
+
   public class SectionEvent extends android.media.tv.tuner.filter.FilterEvent {
     method public int getDataLength();
     method public int getSectionNumber();
@@ -5530,7 +5540,7 @@
 
   public class TsRecordEvent extends android.media.tv.tuner.filter.FilterEvent {
     method public long getDataLength();
-    method public int getFirstMbInSlice();
+    method public int getFirstMacroblockInSlice();
     method public int getPacketId();
     method public long getPts();
     method public int getScIndexMask();
@@ -7491,6 +7501,7 @@
 
   public abstract static class BugreportManager.BugreportCallback {
     ctor public BugreportManager.BugreportCallback();
+    method public void onEarlyReportFinished();
     method public void onError(int);
     method public void onFinished();
     method public void onProgress(@FloatRange(from=0.0f, to=100.0f) float);
@@ -8760,8 +8771,13 @@
     ctor public DeviceIdAttestationException(@Nullable String, @Nullable Throwable);
   }
 
+  public final class KeyGenParameterSpec implements java.security.spec.AlgorithmParameterSpec {
+    method public int getNamespace();
+  }
+
   public static final class KeyGenParameterSpec.Builder {
-    method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setUid(int);
+    method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setNamespace(int);
+    method @Deprecated @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setUid(int);
   }
 
 }
@@ -10043,6 +10059,17 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CallQuality> CREATOR;
   }
 
+  public final class CarrierBandwidth implements android.os.Parcelable {
+    ctor public CarrierBandwidth(int, int, int, int);
+    method public int describeContents();
+    method public int getPrimaryDownlinkCapacityKbps();
+    method public int getPrimaryUplinkCapacityKbps();
+    method public int getSecondaryDownlinkCapacityKbps();
+    method public int getSecondaryUplinkCapacityKbps();
+    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CarrierBandwidth> CREATOR;
+    field public static final int INVALID = -1; // 0xffffffff
+  }
+
   public class CarrierConfigManager {
     method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getDefaultCarrierServicePackageName();
     method @NonNull public static android.os.PersistableBundle getDefaultConfig();
@@ -10340,6 +10367,18 @@
     field public static final int PHYSICAL_CELL_ID_UNKNOWN = -1; // 0xffffffff
   }
 
+  public final class PinResult implements android.os.Parcelable {
+    method public int describeContents();
+    method public int getAttemptsRemaining();
+    method public int getResult();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PinResult> CREATOR;
+    field public static final int PIN_RESULT_TYPE_ABORTED = 3; // 0x3
+    field public static final int PIN_RESULT_TYPE_FAILURE = 2; // 0x2
+    field public static final int PIN_RESULT_TYPE_INCORRECT = 1; // 0x1
+    field public static final int PIN_RESULT_TYPE_SUCCESS = 0; // 0x0
+  }
+
   public final class PreciseCallState implements android.os.Parcelable {
     ctor public PreciseCallState(int, int, int, int, int);
     method public int describeContents();
@@ -10683,6 +10722,7 @@
 
   public class TelephonyManager {
     method @Deprecated @RequiresPermission(android.Manifest.permission.CALL_PHONE) public void call(String, String);
+    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.PinResult changeIccLockPin(@NonNull String, @NonNull String);
     method public int checkCarrierPrivilegesForPackage(String);
     method public int checkCarrierPrivilegesForPackageAnyPhone(String);
     method public void dial(String);
@@ -10696,6 +10736,7 @@
     method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.ComponentName getAndUpdateDefaultRespondViaMessageApplication();
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getCallForwarding(int, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CallForwardingInfoCallback);
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getCallWaitingStatus(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
+    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.CarrierBandwidth getCarrierBandwidth();
     method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int);
     method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent);
     method public java.util.List<java.lang.String> getCarrierPackageNamesForIntentAndPhone(android.content.Intent, int);
@@ -10787,6 +10828,7 @@
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataActivationState(int);
     method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataEnabled(int, boolean);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataRoamingEnabled(boolean);
+    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.PinResult setIccLockEnabled(boolean, @NonNull String);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setMobileDataPolicyEnabledStatus(int, boolean);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setMultiSimCarrierRestriction(boolean);
     method public int setNrDualConnectivityState(int);
@@ -10802,10 +10844,12 @@
     method @Deprecated public void setVisualVoicemailEnabled(android.telecom.PhoneAccountHandle, boolean);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoiceActivationState(int);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void shutdownAllRadios();
+    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.PinResult supplyIccLockPin(@NonNull String);
+    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.PinResult supplyIccLockPuk(@NonNull String, @NonNull String);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean supplyPin(String);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPinReportResult(String);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPinReportResult(String);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean supplyPuk(String, String);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPukReportResult(String, String);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPukReportResult(String, String);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean switchSlots(int[]);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void toggleRadioOnOff();
     method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void updateOtaEmergencyNumberDbFilePath(@NonNull android.os.ParcelFileDescriptor);
@@ -10968,6 +11012,24 @@
 
 package android.telephony.data {
 
+  public class ApnSetting implements android.os.Parcelable {
+    method public static int getApnTypeInt(@NonNull String);
+    method @NonNull public static String getApnTypeString(int);
+    field public static final String TYPE_ALL_STRING = "*";
+    field public static final String TYPE_CBS_STRING = "cbs";
+    field public static final String TYPE_DEFAULT_STRING = "default";
+    field public static final String TYPE_DUN_STRING = "dun";
+    field public static final String TYPE_EMERGENCY_STRING = "emergency";
+    field public static final String TYPE_FOTA_STRING = "fota";
+    field public static final String TYPE_HIPRI_STRING = "hipri";
+    field public static final String TYPE_IA_STRING = "ia";
+    field public static final String TYPE_IMS_STRING = "ims";
+    field public static final String TYPE_MCX_STRING = "mcx";
+    field public static final String TYPE_MMS_STRING = "mms";
+    field public static final String TYPE_SUPL_STRING = "supl";
+    field public static final String TYPE_XCAP_STRING = "xcap";
+  }
+
   public final class DataCallResponse implements android.os.Parcelable {
     method public int describeContents();
     method @NonNull public java.util.List<android.net.LinkAddress> getAddresses();
@@ -11315,7 +11377,6 @@
     method public int getEmergencyServiceCategories();
     method @NonNull public java.util.List<java.lang.String> getEmergencyUrns();
     method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile();
-    method @NonNull public java.util.Set<android.telephony.ims.RtpHeaderExtensionType> getOfferedRtpHeaderExtensionTypes();
     method @NonNull public android.os.Bundle getProprietaryCallExtras();
     method public int getRestrictCause();
     method public int getServiceType();
@@ -11337,7 +11398,6 @@
     method public void setEmergencyServiceCategories(int);
     method public void setEmergencyUrns(@NonNull java.util.List<java.lang.String>);
     method public void setHasKnownUserIntentEmergency(boolean);
-    method public void setOfferedRtpHeaderExtensionTypes(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtensionType>);
     method public void updateCallExtras(android.telephony.ims.ImsCallProfile);
     method public void updateCallType(android.telephony.ims.ImsCallProfile);
     method public void updateMediaProfile(android.telephony.ims.ImsCallProfile);
@@ -11846,6 +11906,7 @@
   public class MmTelFeature extends android.telephony.ims.feature.ImsFeature {
     ctor public MmTelFeature();
     method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy);
+    method public void changeOfferedRtpHeaderExtensionTypes(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtensionType>);
     method @Nullable public android.telephony.ims.ImsCallProfile createCallProfile(int, int);
     method @Nullable public android.telephony.ims.stub.ImsCallSessionImplBase createCallSession(@NonNull android.telephony.ims.ImsCallProfile);
     method @NonNull public android.telephony.ims.stub.ImsEcbmImplBase getEcbm();
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 7a74ad1..1c72d02 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -282,7 +282,7 @@
   }
 
   public class StatusBarManager {
-    method public void collapsePanels();
+    method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void collapsePanels();
     method public void expandNotificationsPanel();
     method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setExpansionDisabledForSimNetworkLock(boolean);
   }
@@ -369,12 +369,17 @@
     method public boolean isCurrentInputMethodSetByOwner();
     method public boolean isFactoryResetProtectionPolicySupported();
     field public static final String ACTION_DATA_SHARING_RESTRICTION_APPLIED = "android.app.action.DATA_SHARING_RESTRICTION_APPLIED";
+    field public static final int OPERATION_LOCK_NOW = 1; // 0x1
   }
 
   public static final class SecurityLog.SecurityEvent implements android.os.Parcelable {
     ctor public SecurityLog.SecurityEvent(long, byte[]);
   }
 
+  public final class UnsafeStateException extends java.lang.IllegalStateException implements android.os.Parcelable {
+    method public int getOperation();
+  }
+
 }
 
 package android.app.blob {
diff --git a/core/java/android/accounts/GrantCredentialsPermissionActivity.java b/core/java/android/accounts/GrantCredentialsPermissionActivity.java
index 32b61b5..5dc6e60 100644
--- a/core/java/android/accounts/GrantCredentialsPermissionActivity.java
+++ b/core/java/android/accounts/GrantCredentialsPermissionActivity.java
@@ -16,16 +16,23 @@
 package android.accounts;
 
 import android.app.Activity;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.widget.TextView;
-import android.widget.LinearLayout;
-import android.view.View;
-import android.view.LayoutInflater;
+import android.app.ActivityTaskManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.UserHandle;
 import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
 import com.android.internal.R;
 
 import java.io.IOException;
@@ -42,6 +49,7 @@
     private Account mAccount;
     private String mAuthTokenType;
     private int mUid;
+    private int mCallingUid;
     private Bundle mResultBundle = null;
     protected LayoutInflater mInflater;
 
@@ -77,6 +85,20 @@
             return;
         }
 
+        try {
+            IBinder activityToken = getActivityToken();
+            mCallingUid = ActivityTaskManager.getService().getLaunchedFromUid(activityToken);
+        } catch (RemoteException re) {
+            // Couldn't figure out caller details
+            Log.w(getClass().getSimpleName(), "Unable to get caller identity \n" + re);
+        }
+
+        if (!UserHandle.isSameApp(mCallingUid, Process.SYSTEM_UID) && mCallingUid != mUid) {
+            setResult(Activity.RESULT_CANCELED);
+            finish();
+            return;
+        }
+
         String accountTypeLabel;
         try {
             accountTypeLabel = getAccountLabel(mAccount);
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index f9970dd..1e6e784 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -173,6 +173,12 @@
      */
     public static final int INSTR_FLAG_DISABLE_TEST_API_CHECKS = 1 << 2;
 
+    /**
+     * Do not restart the target process when starting or finishing instrumentation.
+     * @hide
+     */
+    public static final int INSTR_FLAG_NO_RESTART = 1 << 3;
+
     static final class UidObserver extends IUidObserver.Stub {
         final OnUidImportanceListener mListener;
         final Context mContext;
@@ -490,89 +496,98 @@
     @Retention(RetentionPolicy.SOURCE)
     public @interface ProcessState {}
 
+    /*
+     * PROCESS_STATE_* must come from frameworks/base/core/java/android/app/ProcessStateEnum.aidl.
+     * This is to make sure that Java side uses the same values as native.
+     */
 
     /** @hide Not a real process state. */
-    public static final int PROCESS_STATE_UNKNOWN = -1;
+    public static final int PROCESS_STATE_UNKNOWN = ProcessStateEnum.UNKNOWN;
 
     /** @hide Process is a persistent system process. */
-    public static final int PROCESS_STATE_PERSISTENT = 0;
+    public static final int PROCESS_STATE_PERSISTENT = ProcessStateEnum.PERSISTENT;
 
     /** @hide Process is a persistent system process and is doing UI. */
-    public static final int PROCESS_STATE_PERSISTENT_UI = 1;
+    public static final int PROCESS_STATE_PERSISTENT_UI = ProcessStateEnum.PERSISTENT_UI;
 
     /** @hide Process is hosting the current top activities.  Note that this covers
      * all activities that are visible to the user. */
     @UnsupportedAppUsage
-    public static final int PROCESS_STATE_TOP = 2;
+    public static final int PROCESS_STATE_TOP = ProcessStateEnum.TOP;
 
     /** @hide Process is bound to a TOP app. */
-    public static final int PROCESS_STATE_BOUND_TOP = 3;
+    public static final int PROCESS_STATE_BOUND_TOP = ProcessStateEnum.BOUND_TOP;
 
     /** @hide Process is hosting a foreground service. */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final int PROCESS_STATE_FOREGROUND_SERVICE = 4;
+    public static final int PROCESS_STATE_FOREGROUND_SERVICE = ProcessStateEnum.FOREGROUND_SERVICE;
 
     /** @hide Process is hosting a foreground service due to a system binding. */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final int PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 5;
+    public static final int PROCESS_STATE_BOUND_FOREGROUND_SERVICE =
+            ProcessStateEnum.BOUND_FOREGROUND_SERVICE;
 
     /** @hide Process is important to the user, and something they are aware of. */
-    public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 6;
+    public static final int PROCESS_STATE_IMPORTANT_FOREGROUND =
+            ProcessStateEnum.IMPORTANT_FOREGROUND;
 
     /** @hide Process is important to the user, but not something they are aware of. */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final int PROCESS_STATE_IMPORTANT_BACKGROUND = 7;
+    public static final int PROCESS_STATE_IMPORTANT_BACKGROUND =
+            ProcessStateEnum.IMPORTANT_BACKGROUND;
 
     /** @hide Process is in the background transient so we will try to keep running. */
-    public static final int PROCESS_STATE_TRANSIENT_BACKGROUND = 8;
+    public static final int PROCESS_STATE_TRANSIENT_BACKGROUND =
+            ProcessStateEnum.TRANSIENT_BACKGROUND;
 
     /** @hide Process is in the background running a backup/restore operation. */
-    public static final int PROCESS_STATE_BACKUP = 9;
+    public static final int PROCESS_STATE_BACKUP = ProcessStateEnum.BACKUP;
 
     /** @hide Process is in the background running a service.  Unlike oom_adj, this level
      * is used for both the normal running in background state and the executing
      * operations state. */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final int PROCESS_STATE_SERVICE = 10;
+    public static final int PROCESS_STATE_SERVICE = ProcessStateEnum.SERVICE;
 
     /** @hide Process is in the background running a receiver.   Note that from the
      * perspective of oom_adj, receivers run at a higher foreground level, but for our
      * prioritization here that is not necessary and putting them below services means
      * many fewer changes in some process states as they receive broadcasts. */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final int PROCESS_STATE_RECEIVER = 11;
+    public static final int PROCESS_STATE_RECEIVER = ProcessStateEnum.RECEIVER;
 
     /** @hide Same as {@link #PROCESS_STATE_TOP} but while device is sleeping. */
-    public static final int PROCESS_STATE_TOP_SLEEPING = 12;
+    public static final int PROCESS_STATE_TOP_SLEEPING = ProcessStateEnum.TOP_SLEEPING;
 
     /** @hide Process is in the background, but it can't restore its state so we want
      * to try to avoid killing it. */
-    public static final int PROCESS_STATE_HEAVY_WEIGHT = 13;
+    public static final int PROCESS_STATE_HEAVY_WEIGHT = ProcessStateEnum.HEAVY_WEIGHT;
 
     /** @hide Process is in the background but hosts the home activity. */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final int PROCESS_STATE_HOME = 14;
+    public static final int PROCESS_STATE_HOME = ProcessStateEnum.HOME;
 
     /** @hide Process is in the background but hosts the last shown activity. */
-    public static final int PROCESS_STATE_LAST_ACTIVITY = 15;
+    public static final int PROCESS_STATE_LAST_ACTIVITY = ProcessStateEnum.LAST_ACTIVITY;
 
     /** @hide Process is being cached for later use and contains activities. */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final int PROCESS_STATE_CACHED_ACTIVITY = 16;
+    public static final int PROCESS_STATE_CACHED_ACTIVITY = ProcessStateEnum.CACHED_ACTIVITY;
 
     /** @hide Process is being cached for later use and is a client of another cached
      * process that contains activities. */
-    public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 17;
+    public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT =
+            ProcessStateEnum.CACHED_ACTIVITY_CLIENT;
 
     /** @hide Process is being cached for later use and has an activity that corresponds
      * to an existing recent task. */
-    public static final int PROCESS_STATE_CACHED_RECENT = 18;
+    public static final int PROCESS_STATE_CACHED_RECENT = ProcessStateEnum.CACHED_RECENT;
 
     /** @hide Process is being cached for later use and is empty. */
-    public static final int PROCESS_STATE_CACHED_EMPTY = 19;
+    public static final int PROCESS_STATE_CACHED_EMPTY = ProcessStateEnum.CACHED_EMPTY;
 
     /** @hide Process does not exist. */
-    public static final int PROCESS_STATE_NONEXISTENT = 20;
+    public static final int PROCESS_STATE_NONEXISTENT = ProcessStateEnum.NONEXISTENT;
 
     /**
      * The set of flags for process capability.
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 0f6ebf2..2211807 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -381,6 +381,7 @@
     String mInstrumentedAppDir = null;
     String[] mInstrumentedSplitAppDirs = null;
     String mInstrumentedLibDir = null;
+    boolean mInstrumentingWithoutRestart;
     boolean mSystemThread = false;
     boolean mSomeActivitiesChanged = false;
     /* package */ boolean mHiddenApiWarningShown = false;
@@ -1774,6 +1775,19 @@
                 key.mLock.notifyAll();
             }
         }
+
+        @Override
+        public void instrumentWithoutRestart(ComponentName instrumentationName,
+                Bundle instrumentationArgs, IInstrumentationWatcher instrumentationWatcher,
+                IUiAutomationConnection instrumentationUiConnection, ApplicationInfo targetInfo) {
+            AppBindData data = new AppBindData();
+            data.instrumentationName = instrumentationName;
+            data.instrumentationArgs = instrumentationArgs;
+            data.instrumentationWatcher = instrumentationWatcher;
+            data.instrumentationUiAutomationConnection = instrumentationUiConnection;
+            data.appInfo = targetInfo;
+            sendMessage(H.INSTRUMENT_WITHOUT_RESTART, data);
+        }
     }
 
     private @NonNull SafeCancellationTransport createSafeCancellationTransport(
@@ -1879,6 +1893,9 @@
         public static final int PURGE_RESOURCES = 161;
         public static final int ATTACH_STARTUP_AGENTS = 162;
 
+        public static final int INSTRUMENT_WITHOUT_RESTART = 170;
+        public static final int FINISH_INSTRUMENTATION_WITHOUT_RESTART = 171;
+
         String codeToString(int code) {
             if (DEBUG_MESSAGES) {
                 switch (code) {
@@ -1921,6 +1938,9 @@
                     case RELAUNCH_ACTIVITY: return "RELAUNCH_ACTIVITY";
                     case PURGE_RESOURCES: return "PURGE_RESOURCES";
                     case ATTACH_STARTUP_AGENTS: return "ATTACH_STARTUP_AGENTS";
+                    case INSTRUMENT_WITHOUT_RESTART: return "INSTRUMENT_WITHOUT_RESTART";
+                    case FINISH_INSTRUMENTATION_WITHOUT_RESTART:
+                        return "FINISH_INSTRUMENTATION_WITHOUT_RESTART";
                 }
             }
             return Integer.toString(code);
@@ -2102,6 +2122,12 @@
                 case ATTACH_STARTUP_AGENTS:
                     handleAttachStartupAgents((String) msg.obj);
                     break;
+                case INSTRUMENT_WITHOUT_RESTART:
+                    handleInstrumentWithoutRestart((AppBindData) msg.obj);
+                    break;
+                case FINISH_INSTRUMENTATION_WITHOUT_RESTART:
+                    handleFinishInstrumentationWithoutRestart();
+                    break;
             }
             Object obj = msg.obj;
             if (obj instanceof SomeArgs) {
@@ -6500,32 +6526,7 @@
         // setting up the app context.
         final InstrumentationInfo ii;
         if (data.instrumentationName != null) {
-            try {
-                ii = new ApplicationPackageManager(
-                        null, getPackageManager(), getPermissionManager())
-                        .getInstrumentationInfo(data.instrumentationName, 0);
-            } catch (PackageManager.NameNotFoundException e) {
-                throw new RuntimeException(
-                        "Unable to find instrumentation info for: " + data.instrumentationName);
-            }
-
-            // Warn of potential ABI mismatches.
-            if (!Objects.equals(data.appInfo.primaryCpuAbi, ii.primaryCpuAbi)
-                    || !Objects.equals(data.appInfo.secondaryCpuAbi, ii.secondaryCpuAbi)) {
-                Slog.w(TAG, "Package uses different ABI(s) than its instrumentation: "
-                        + "package[" + data.appInfo.packageName + "]: "
-                        + data.appInfo.primaryCpuAbi + ", " + data.appInfo.secondaryCpuAbi
-                        + " instrumentation[" + ii.packageName + "]: "
-                        + ii.primaryCpuAbi + ", " + ii.secondaryCpuAbi);
-            }
-
-            mInstrumentationPackageName = ii.packageName;
-            mInstrumentationAppDir = ii.sourceDir;
-            mInstrumentationSplitAppDirs = ii.splitSourceDirs;
-            mInstrumentationLibDir = getInstrumentationLibrary(data.appInfo, ii);
-            mInstrumentedAppDir = data.info.getAppDir();
-            mInstrumentedSplitAppDirs = data.info.getSplitAppDirs();
-            mInstrumentedLibDir = data.info.getLibDir();
+            ii = prepareInstrumentation(data);
         } else {
             ii = null;
         }
@@ -6554,48 +6555,7 @@
 
         // Continue loading instrumentation.
         if (ii != null) {
-            ApplicationInfo instrApp;
-            try {
-                instrApp = getPackageManager().getApplicationInfo(ii.packageName, 0,
-                        UserHandle.myUserId());
-            } catch (RemoteException e) {
-                instrApp = null;
-            }
-            if (instrApp == null) {
-                instrApp = new ApplicationInfo();
-            }
-            ii.copyTo(instrApp);
-            instrApp.initForUser(UserHandle.myUserId());
-            final LoadedApk pi = getPackageInfo(instrApp, data.compatInfo,
-                    appContext.getClassLoader(), false, true, false);
-
-            // The test context's op package name == the target app's op package name, because
-            // the app ops manager checks the op package name against the real calling UID,
-            // which is what the target package name is associated with.
-            final ContextImpl instrContext = ContextImpl.createAppContext(this, pi,
-                    appContext.getOpPackageName());
-
-            try {
-                final ClassLoader cl = instrContext.getClassLoader();
-                mInstrumentation = (Instrumentation)
-                    cl.loadClass(data.instrumentationName.getClassName()).newInstance();
-            } catch (Exception e) {
-                throw new RuntimeException(
-                    "Unable to instantiate instrumentation "
-                    + data.instrumentationName + ": " + e.toString(), e);
-            }
-
-            final ComponentName component = new ComponentName(ii.packageName, ii.name);
-            mInstrumentation.init(this, instrContext, appContext, component,
-                    data.instrumentationWatcher, data.instrumentationUiAutomationConnection);
-
-            if (mProfiler.profileFile != null && !ii.handleProfiling
-                    && mProfiler.profileFd == null) {
-                mProfiler.handlingProfiling = true;
-                final File file = new File(mProfiler.profileFile);
-                file.getParentFile().mkdirs();
-                Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024);
-            }
+            initInstrumentation(ii, data, appContext);
         } else {
             mInstrumentation = new Instrumentation();
             mInstrumentation.basicInit(this);
@@ -6686,6 +6646,120 @@
         }
     }
 
+    private void handleInstrumentWithoutRestart(AppBindData data) {
+        try {
+            data.compatInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;
+            data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
+            mInstrumentingWithoutRestart = true;
+            final InstrumentationInfo ii = prepareInstrumentation(data);
+            final ContextImpl appContext =
+                    ContextImpl.createAppContext(this, data.info);
+
+            initInstrumentation(ii, data, appContext);
+
+            try {
+                mInstrumentation.onCreate(data.instrumentationArgs);
+            } catch (Exception e) {
+                throw new RuntimeException(
+                        "Exception thrown in onCreate() of "
+                                + data.instrumentationName + ": " + e.toString(), e);
+            }
+
+        } catch (Exception e) {
+            Slog.e(TAG, "Error in handleInstrumentWithoutRestart", e);
+        }
+    }
+
+    private InstrumentationInfo prepareInstrumentation(AppBindData data) {
+        final InstrumentationInfo ii;
+        try {
+            ii = new ApplicationPackageManager(
+                    null, getPackageManager(), getPermissionManager())
+                    .getInstrumentationInfo(data.instrumentationName, 0);
+        } catch (PackageManager.NameNotFoundException e) {
+            throw new RuntimeException(
+                    "Unable to find instrumentation info for: " + data.instrumentationName);
+        }
+
+        // Warn of potential ABI mismatches.
+        if (!Objects.equals(data.appInfo.primaryCpuAbi, ii.primaryCpuAbi)
+                || !Objects.equals(data.appInfo.secondaryCpuAbi, ii.secondaryCpuAbi)) {
+            Slog.w(TAG, "Package uses different ABI(s) than its instrumentation: "
+                    + "package[" + data.appInfo.packageName + "]: "
+                    + data.appInfo.primaryCpuAbi + ", " + data.appInfo.secondaryCpuAbi
+                    + " instrumentation[" + ii.packageName + "]: "
+                    + ii.primaryCpuAbi + ", " + ii.secondaryCpuAbi);
+        }
+
+        mInstrumentationPackageName = ii.packageName;
+        mInstrumentationAppDir = ii.sourceDir;
+        mInstrumentationSplitAppDirs = ii.splitSourceDirs;
+        mInstrumentationLibDir = getInstrumentationLibrary(data.appInfo, ii);
+        mInstrumentedAppDir = data.info.getAppDir();
+        mInstrumentedSplitAppDirs = data.info.getSplitAppDirs();
+        mInstrumentedLibDir = data.info.getLibDir();
+
+        return ii;
+    }
+
+    private void initInstrumentation(
+            InstrumentationInfo ii, AppBindData data, ContextImpl appContext) {
+        ApplicationInfo instrApp;
+        try {
+            instrApp = getPackageManager().getApplicationInfo(ii.packageName, 0,
+                    UserHandle.myUserId());
+        } catch (RemoteException e) {
+            instrApp = null;
+        }
+        if (instrApp == null) {
+            instrApp = new ApplicationInfo();
+        }
+        ii.copyTo(instrApp);
+        instrApp.initForUser(UserHandle.myUserId());
+        final LoadedApk pi = getPackageInfo(instrApp, data.compatInfo,
+                appContext.getClassLoader(), false, true, false);
+
+        // The test context's op package name == the target app's op package name, because
+        // the app ops manager checks the op package name against the real calling UID,
+        // which is what the target package name is associated with.
+        final ContextImpl instrContext = ContextImpl.createAppContext(this, pi,
+                appContext.getOpPackageName());
+
+        try {
+            final ClassLoader cl = instrContext.getClassLoader();
+            mInstrumentation = (Instrumentation)
+                    cl.loadClass(data.instrumentationName.getClassName()).newInstance();
+        } catch (Exception e) {
+            throw new RuntimeException(
+                    "Unable to instantiate instrumentation "
+                            + data.instrumentationName + ": " + e.toString(), e);
+        }
+
+        final ComponentName component = new ComponentName(ii.packageName, ii.name);
+        mInstrumentation.init(this, instrContext, appContext, component,
+                data.instrumentationWatcher, data.instrumentationUiAutomationConnection);
+
+        if (mProfiler.profileFile != null && !ii.handleProfiling
+                && mProfiler.profileFd == null) {
+            mProfiler.handlingProfiling = true;
+            final File file = new File(mProfiler.profileFile);
+            file.getParentFile().mkdirs();
+            Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024);
+        }
+    }
+
+    private void handleFinishInstrumentationWithoutRestart() {
+        mInstrumentation.onDestroy();
+        mInstrumentationPackageName = null;
+        mInstrumentationAppDir = null;
+        mInstrumentationSplitAppDirs = null;
+        mInstrumentationLibDir = null;
+        mInstrumentedAppDir = null;
+        mInstrumentedSplitAppDirs = null;
+        mInstrumentedLibDir = null;
+        mInstrumentingWithoutRestart = false;
+    }
+
     /*package*/ final void finishInstrumentation(int resultCode, Bundle results) {
         IActivityManager am = ActivityManager.getService();
         if (mProfiler.profileFile != null && mProfiler.handlingProfiling
@@ -6699,6 +6773,9 @@
         } catch (RemoteException ex) {
             throw ex.rethrowFromSystemServer();
         }
+        if (mInstrumentingWithoutRestart) {
+            sendMessage(H.FINISH_INSTRUMENTATION_WITHOUT_RESTART, null);
+        }
     }
 
     @UnsupportedAppUsage
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index d6cf8ff..d9f34d8 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -1157,9 +1157,16 @@
     // TODO: Add as AppProtoEnums
     public static final int OP_RECORD_AUDIO_HOTWORD = 102;
 
+    /**
+     * Manage credentials in the system KeyChain.
+     *
+     * @hide
+     */
+    public static final int OP_MANAGE_CREDENTIALS = AppProtoEnums.APP_OP_MANAGE_CREDENTIALS;
+
     /** @hide */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final int _NUM_OP = 104;
+    public static final int _NUM_OP = 105;
 
     /** Access to coarse location information. */
     public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
@@ -1510,6 +1517,13 @@
      */
     public static final String OPSTR_RECORD_AUDIO_HOTWORD = "android:record_audio_hotword";
 
+    /**
+     * Manage credentials in the system KeyChain.
+     *
+     * @hide
+     */
+    public static final String OPSTR_MANAGE_CREDENTIALS = "android:manage_credentials";
+
     /** {@link #sAppOpsToNote} not initialized yet for this op */
     private static final byte SHOULD_COLLECT_NOTE_OP_NOT_INITIALIZED = 0;
     /** Should not collect noting of this app-op in {@link #sAppOpsToNote} */
@@ -1704,6 +1718,7 @@
             OP_PHONE_CALL_CAMERA,               // OP_PHONE_CALL_CAMERA
             OP_RECORD_AUDIO_HOTWORD,            // RECORD_AUDIO_HOTWORD
             OP_MANAGE_ONGOING_CALLS,            // MANAGE_ONGOING_CALLS
+            OP_MANAGE_CREDENTIALS,              // MANAGE_CREDENTIALS
     };
 
     /**
@@ -1814,6 +1829,7 @@
             OPSTR_PHONE_CALL_CAMERA,
             OPSTR_RECORD_AUDIO_HOTWORD,
             OPSTR_MANAGE_ONGOING_CALLS,
+            OPSTR_MANAGE_CREDENTIALS,
     };
 
     /**
@@ -1925,6 +1941,7 @@
             "PHONE_CALL_CAMERA",
             "RECORD_AUDIO_HOTWORD",
             "MANAGE_ONGOING_CALLS",
+            "MANAGE_CREDENTIALS",
     };
 
     /**
@@ -2037,6 +2054,7 @@
             null, // no permission for OP_PHONE_CALL_CAMERA
             null, // no permission for OP_RECORD_AUDIO_HOTWORD
             Manifest.permission.MANAGE_ONGOING_CALLS,
+            null, // no permission for OP_MANAGE_CREDENTIALS
     };
 
     /**
@@ -2149,6 +2167,7 @@
             null, // PHONE_CALL_MICROPHONE
             null, // RECORD_AUDIO_HOTWORD
             null, // MANAGE_ONGOING_CALLS
+            null, // MANAGE_CREDENTIALS
     };
 
     /**
@@ -2260,6 +2279,7 @@
             null, // PHONE_CALL_CAMERA
             null, // RECORD_AUDIO_HOTWORD
             null, // MANAGE_ONGOING_CALLS
+            null, // MANAGE_CREDENTIALS
     };
 
     /**
@@ -2370,6 +2390,7 @@
             AppOpsManager.MODE_ALLOWED, // PHONE_CALL_CAMERA
             AppOpsManager.MODE_ALLOWED, // OP_RECORD_AUDIO_HOTWORD
             AppOpsManager.MODE_DEFAULT, // MANAGE_ONGOING_CALLS
+            AppOpsManager.MODE_DEFAULT, // MANAGE_CREDENTIALS
     };
 
     /**
@@ -2484,6 +2505,7 @@
             false, // PHONE_CALL_CAMERA
             false, // RECORD_AUDIO_HOTWORD
             true, // MANAGE_ONGOING_CALLS
+            false, // MANAGE_CREDENTIALS
     };
 
     /**
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 9727a28..2fec9f7 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -258,14 +258,48 @@
     private ContentCaptureOptions mContentCaptureOptions = null;
 
     private final Object mSync = new Object();
-
     /**
-     * Whether this is created from {@link #createSystemContext(ActivityThread)} or
-     * {@link #createSystemUiContext(ContextImpl, int)} or any {@link Context} that system UI uses.
+     * Indicates this {@link Context} can not handle UI components properly and is not associated
+     * with a {@link Display} instance.
      */
-    private boolean mIsSystemOrSystemUiContext;
-    private boolean mIsUiContext;
-    private boolean mIsAssociatedWithDisplay;
+    private static final int CONTEXT_TYPE_NON_UI = 0;
+    /**
+     * Indicates this {@link Context} is associated with a {@link Display} instance but should not
+     * be handled UI components properly because it doesn't receive configuration changes
+     * regardless of display property updates.
+     */
+    private static final int CONTEXT_TYPE_DISPLAY_CONTEXT = 1;
+    /**
+     * Indicates this {@link Context} is an {@link Activity} or {@link Activity} derived
+     * {@link Context}.
+     */
+    private static final int CONTEXT_TYPE_ACTIVITY = 2;
+    /**
+     * Indicates this {@link Context} is a {@link WindowContext} or {@link WindowContext} derived
+     * {@link Context}.
+     */
+    private static final int CONTEXT_TYPE_WINDOW_CONTEXT = 3;
+
+    // TODO(b/170369943): Remove after WindowContext migration
+    /**
+     * Indicates this {@link Context} is created from {@link #createSystemContext(ActivityThread)}
+     * or {@link #createSystemUiContext(ContextImpl, int)} or any {@link Context} that system UI
+     * uses.
+     */
+    private static final int CONTEXT_TYPE_SYSTEM_OR_SYSTEM_UI = 4;
+
+    @IntDef(prefix = "CONTEXT_TYPE_", value = {
+            CONTEXT_TYPE_NON_UI,
+            CONTEXT_TYPE_DISPLAY_CONTEXT,
+            CONTEXT_TYPE_ACTIVITY,
+            CONTEXT_TYPE_WINDOW_CONTEXT,
+            CONTEXT_TYPE_SYSTEM_OR_SYSTEM_UI
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    private @interface ContextType {}
+
+    @ContextType
+    private int mContextType;
 
     @GuardedBy("mSync")
     private File mDatabasesDir;
@@ -1912,7 +1946,7 @@
     public Object getSystemService(String name) {
         if (vmIncorrectContextUseEnabled()) {
             // Check incorrect Context usage.
-            if (isUiComponent(name) && !isSelfOrOuterUiContext()) {
+            if (isUiComponent(name) && !isUiContext()) {
                 final String errorMessage = "Tried to access visual service "
                         + SystemServiceRegistry.getSystemServiceClassName(name)
                         + " from a non-visual Context:" + getOuterContext();
@@ -1934,16 +1968,21 @@
         return SystemServiceRegistry.getSystemServiceName(serviceClass);
     }
 
-    // TODO(b/149463653): check if we still need this method after migrating IMS to WindowContext.
-    private boolean isSelfOrOuterUiContext() {
-        // We may override outer context's isUiContext
-        return isUiContext() || getOuterContext() != null && getOuterContext().isUiContext();
-    }
-
     /** @hide */
     @Override
     public boolean isUiContext() {
-        return mIsSystemOrSystemUiContext || mIsUiContext;
+        switch (mContextType) {
+            case CONTEXT_TYPE_ACTIVITY:
+            case CONTEXT_TYPE_WINDOW_CONTEXT:
+            case CONTEXT_TYPE_SYSTEM_OR_SYSTEM_UI:
+                return true;
+            case CONTEXT_TYPE_DISPLAY_CONTEXT:
+            case CONTEXT_TYPE_NON_UI: {
+                return false;
+            }
+            default:
+                return false;
+        }
     }
 
     /**
@@ -2423,16 +2462,11 @@
                 overrideConfig, display.getDisplayAdjustments().getCompatibilityInfo(),
                 mResources.getLoaders()));
         context.mDisplay = display;
-        context.mIsAssociatedWithDisplay = true;
+        context.mContextType = CONTEXT_TYPE_DISPLAY_CONTEXT;
         // Display contexts and any context derived from a display context should always override
         // the display that would otherwise be inherited from mToken (or the global configuration if
         // mToken is null).
         context.mForceDisplayOverrideInResources = true;
-        // Note that even if a display context is derived from an UI context, it should not be
-        // treated as UI context because it does not handle configuration changes from the server
-        // side. If the context does need to handle configuration changes, please use
-        // Context#createWindowContext(int, Bundle).
-        context.mIsUiContext = false;
         return context;
     }
 
@@ -2449,11 +2483,10 @@
     ContextImpl createBaseWindowContext(IBinder token) {
         ContextImpl context = new ContextImpl(this, mMainThread, mPackageInfo, mAttributionTag,
                 mSplitName, token, mUser, mFlags, mClassLoader, null);
-        context.mIsUiContext = true;
-        context.mIsAssociatedWithDisplay = true;
         // Window contexts receive configurations directly from the server and as such do not
         // need to override their display in ResourcesManager.
         context.mForceDisplayOverrideInResources = false;
+        context.mContextType = CONTEXT_TYPE_WINDOW_CONTEXT;
         return context;
     }
 
@@ -2520,7 +2553,7 @@
 
     @Override
     public Display getDisplay() {
-        if (!mIsSystemOrSystemUiContext && !mIsAssociatedWithDisplay && !isSelfOrOuterUiContext()) {
+        if (!isAssociatedWithDisplay()) {
             throw new UnsupportedOperationException("Tried to obtain display from a Context not "
                     + "associated with one. Only visual Contexts (such as Activity or one created "
                     + "with Context#createWindowContext) or ones created with "
@@ -2531,6 +2564,19 @@
         return getDisplayNoVerify();
     }
 
+    private boolean isAssociatedWithDisplay() {
+        switch (mContextType) {
+            case CONTEXT_TYPE_DISPLAY_CONTEXT:
+            case CONTEXT_TYPE_ACTIVITY:
+            case CONTEXT_TYPE_WINDOW_CONTEXT:
+            // TODO(b/170369943): Remove after WindowContext migration
+            case CONTEXT_TYPE_SYSTEM_OR_SYSTEM_UI:
+                return true;
+            default:
+                return false;
+        }
+    }
+
     @Override
     public Display getDisplayNoVerify() {
         if (mDisplay == null) {
@@ -2550,7 +2596,9 @@
     @Override
     public void updateDisplay(int displayId) {
         mDisplay = mResourcesManager.getAdjustedDisplay(displayId, mResources);
-        mIsAssociatedWithDisplay = true;
+        if (mContextType == CONTEXT_TYPE_NON_UI) {
+            mContextType = CONTEXT_TYPE_DISPLAY_CONTEXT;
+        }
     }
 
     @Override
@@ -2655,7 +2703,7 @@
         context.setResources(packageInfo.getResources());
         context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(),
                 context.mResourcesManager.getDisplayMetrics());
-        context.mIsSystemOrSystemUiContext = true;
+        context.mContextType = CONTEXT_TYPE_SYSTEM_OR_SYSTEM_UI;
         return context;
     }
 
@@ -2673,7 +2721,7 @@
         context.setResources(createResources(null, packageInfo, null, displayId, null,
                 packageInfo.getCompatibilityInfo(), null));
         context.updateDisplay(displayId);
-        context.mIsSystemOrSystemUiContext = true;
+        context.mContextType = CONTEXT_TYPE_SYSTEM_OR_SYSTEM_UI;
         return context;
     }
 
@@ -2696,7 +2744,8 @@
         ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, null, null,
                 0, null, opPackageName);
         context.setResources(packageInfo.getResources());
-        context.mIsSystemOrSystemUiContext = isSystemOrSystemUI(context);
+        context.mContextType = isSystemOrSystemUI(context) ? CONTEXT_TYPE_SYSTEM_OR_SYSTEM_UI
+                : CONTEXT_TYPE_NON_UI;
         return context;
     }
 
@@ -2724,9 +2773,7 @@
 
         ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null,
                 activityInfo.splitName, activityToken, null, 0, classLoader, null);
-        context.mIsUiContext = true;
-        context.mIsAssociatedWithDisplay = true;
-        context.mIsSystemOrSystemUiContext = isSystemOrSystemUI(context);
+        context.mContextType = CONTEXT_TYPE_ACTIVITY;
 
         // Clamp display ID to DEFAULT_DISPLAY if it is INVALID_DISPLAY.
         displayId = (displayId != Display.INVALID_DISPLAY) ? displayId : Display.DEFAULT_DISPLAY;
@@ -2757,7 +2804,7 @@
 
     private ContextImpl(@Nullable ContextImpl container, @NonNull ActivityThread mainThread,
             @NonNull LoadedApk packageInfo, @Nullable String attributionTag,
-            @Nullable String splitName, @Nullable IBinder activityToken, @Nullable UserHandle user,
+            @Nullable String splitName, @Nullable IBinder token, @Nullable UserHandle user,
             int flags, @Nullable ClassLoader classLoader, @Nullable String overrideOpPackageName) {
         mOuterContext = this;
 
@@ -2774,7 +2821,7 @@
         }
 
         mMainThread = mainThread;
-        mToken = activityToken;
+        mToken = token;
         mFlags = flags;
 
         if (user == null) {
@@ -2794,10 +2841,8 @@
             opPackageName = container.mOpPackageName;
             setResources(container.mResources);
             mDisplay = container.mDisplay;
-            mIsAssociatedWithDisplay = container.mIsAssociatedWithDisplay;
-            mIsSystemOrSystemUiContext = container.mIsSystemOrSystemUiContext;
             mForceDisplayOverrideInResources = container.mForceDisplayOverrideInResources;
-            mIsUiContext = container.isSelfOrOuterUiContext();
+            mContextType = container.mContextType;
         } else {
             mBasePackageName = packageInfo.mPackageName;
             ApplicationInfo ainfo = packageInfo.getApplicationInfo();
@@ -2847,8 +2892,13 @@
     }
 
     @UnsupportedAppUsage
-    final void setOuterContext(Context context) {
+    final void setOuterContext(@NonNull Context context) {
         mOuterContext = context;
+        // TODO(b/149463653): check if we still need this method after migrating IMS to
+        //  WindowContext.
+        if (mOuterContext.isUiContext() && mContextType <= CONTEXT_TYPE_DISPLAY_CONTEXT) {
+            mContextType = CONTEXT_TYPE_WINDOW_CONTEXT;
+        }
     }
 
     @UnsupportedAppUsage
@@ -2859,7 +2909,12 @@
     @Override
     @UnsupportedAppUsage
     public IBinder getActivityToken() {
-        return mToken;
+        return mContextType == CONTEXT_TYPE_ACTIVITY ? mToken : null;
+    }
+
+    @Override
+    public IBinder getWindowContextToken() {
+        return mContextType == CONTEXT_TYPE_WINDOW_CONTEXT ? mToken : null;
     }
 
     private void checkMode(int mode) {
diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl
index dc9918a..22ca42e 100644
--- a/core/java/android/app/IApplicationThread.aidl
+++ b/core/java/android/app/IApplicationThread.aidl
@@ -150,4 +150,9 @@
             in RemoteCallback resultCallback);
     void notifyContentProviderPublishStatus(in ContentProviderHolder holder, String auth,
             int userId, boolean published);
+    void instrumentWithoutRestart(in ComponentName instrumentationName,
+            in Bundle instrumentationArgs,
+            IInstrumentationWatcher instrumentationWatcher,
+            IUiAutomationConnection instrumentationUiConnection,
+            in ApplicationInfo targetInfo);
 }
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 4eef616..6535387a 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -102,7 +102,6 @@
 public final class LoadedApk {
     static final String TAG = "LoadedApk";
     static final boolean DEBUG = false;
-    private static final String PROPERTY_NAME_APPEND_NATIVE = "pi.append_native_lib_paths";
 
     @UnsupportedAppUsage
     private final ActivityThread mActivityThread;
@@ -926,7 +925,7 @@
             needToSetupJitProfiles = true;
         }
 
-        if (!libPaths.isEmpty() && SystemProperties.getBoolean(PROPERTY_NAME_APPEND_NATIVE, true)) {
+        if (!libPaths.isEmpty()) {
             // Temporarily disable logging of disk reads on the Looper thread as this is necessary
             StrictMode.ThreadPolicy oldPolicy = allowThreadDiskReads();
             try {
diff --git a/core/java/android/app/ProcessStateEnum.aidl b/core/java/android/app/ProcessStateEnum.aidl
new file mode 100644
index 0000000..a14e7a6
--- /dev/null
+++ b/core/java/android/app/ProcessStateEnum.aidl
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.app;
+
+/**
+ * Defines the PROCESS_STATE_* values used by ActivityManager.
+ * These values are shared by Java and native side.
+ * {@hide}
+ */
+@Backing(type="int")
+enum ProcessStateEnum {
+    /** @hide Not a real process state. */
+    UNKNOWN = -1,
+
+    /** @hide Process is a persistent system process. */
+    PERSISTENT = 0,
+
+    /** @hide Process is a persistent system process and is doing UI. */
+    PERSISTENT_UI = 1,
+
+    /** @hide Process is hosting the current top activities.  Note that this covers
+     * all activities that are visible to the user. */
+    TOP = 2,
+
+    /** @hide Process is bound to a TOP app. */
+    BOUND_TOP = 3,
+
+    /** @hide Process is hosting a foreground service. */
+    FOREGROUND_SERVICE = 4,
+
+    /** @hide Process is hosting a foreground service due to a system binding. */
+    BOUND_FOREGROUND_SERVICE = 5,
+
+    /** @hide Process is important to the user, and something they are aware of. */
+    IMPORTANT_FOREGROUND = 6,
+
+    /** @hide Process is important to the user, but not something they are aware of. */
+    IMPORTANT_BACKGROUND = 7,
+
+    /** @hide Process is in the background transient so we will try to keep running. */
+    TRANSIENT_BACKGROUND = 8,
+
+    /** @hide Process is in the background running a backup/restore operation. */
+    BACKUP = 9,
+
+    /** @hide Process is in the background running a service.  Unlike oom_adj, this level
+     * is used for both the normal running in background state and the executing
+     * operations state. */
+    SERVICE = 10,
+
+    /** @hide Process is in the background running a receiver.   Note that from the
+     * perspective of oom_adj, receivers run at a higher foreground level, but for our
+     * prioritization here that is not necessary and putting them below services means
+     * many fewer changes in some process states as they receive broadcasts. */
+    RECEIVER = 11,
+
+    /** @hide Same as {@link #PROCESS_STATE_TOP} but while device is sleeping. */
+    TOP_SLEEPING = 12,
+
+    /** @hide Process is in the background, but it can't restore its state so we want
+     * to try to avoid killing it. */
+    HEAVY_WEIGHT = 13,
+
+    /** @hide Process is in the background but hosts the home activity. */
+    HOME = 14,
+
+    /** @hide Process is in the background but hosts the last shown activity. */
+    LAST_ACTIVITY = 15,
+
+    /** @hide Process is being cached for later use and contains activities. */
+    CACHED_ACTIVITY = 16,
+
+    /** @hide Process is being cached for later use and is a client of another cached
+     * process that contains activities. */
+    CACHED_ACTIVITY_CLIENT = 17,
+
+    /** @hide Process is being cached for later use and has an activity that corresponds
+     * to an existing recent task. */
+    CACHED_RECENT = 18,
+
+    /** @hide Process is being cached for later use and is empty. */
+    CACHED_EMPTY = 19,
+
+    /** @hide Process does not exist. */
+    NONEXISTENT = 20,
+
+}
diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java
index b8fae67..4e3d85c 100644
--- a/core/java/android/app/StatusBarManager.java
+++ b/core/java/android/app/StatusBarManager.java
@@ -283,9 +283,15 @@
     /**
      * Collapse the notifications and settings panels.
      *
+     * Starting in Android {@link Build.VERSION_CODES.S}, apps targeting SDK level {@link
+     * Build.VERSION_CODES.S} or higher will need {@link android.Manifest.permission.STATUS_BAR}
+     * permission to call this API.
+     *
      * @hide
      */
-    @UnsupportedAppUsage
+    @RequiresPermission(android.Manifest.permission.STATUS_BAR)
+    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, publicAlternatives = "Send {@link "
+            + "android.content.Intent#ACTION_CLOSE_SYSTEM_DIALOGS} instead.")
     @TestApi
     public void collapsePanels() {
         try {
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 1d644c4..16ae081 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -122,6 +122,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 
+// TODO(b/172376923) - add CarDevicePolicyManager examples below (or remove reference to it).
 /**
  * Public interface for managing policies enforced on a device. Most clients of this class must be
  * registered with the system as a <a href="{@docRoot}guide/topics/admin/device-admin.html">device
@@ -130,6 +131,13 @@
  * for that method specifies that it is restricted to either device or profile owners. Any
  * application calling an api may only pass as an argument a device administrator component it
  * owns. Otherwise, a {@link SecurityException} will be thrown.
+ *
+ * <p><b>Note: </b>on
+ * {@link android.content.pm.PackageManager#FEATURE_AUTOMOTIVE automotive builds}, some methods can
+ * throw an {@link UnsafeStateException} exception (for example, if the vehicle is moving), so
+ * callers running on automotive builds should wrap every method call under the methods provided by
+ * {@code android.car.admin.CarDevicePolicyManager}.
+ *
  * <div class="special reference">
  * <h3>Developer Guides</h3>
  * <p>
@@ -1972,6 +1980,7 @@
     public static final int CODE_CANNOT_ADD_MANAGED_PROFILE = 11;
 
     /**
+     * TODO (b/137101239): clean up split system user codes
      * Result code for {@link #checkProvisioningPreCondition}.
      *
      * <p>Returned for {@link #ACTION_PROVISION_MANAGED_USER} and
@@ -1995,6 +2004,7 @@
     public static final int CODE_DEVICE_ADMIN_NOT_SUPPORTED = 13;
 
     /**
+     * TODO (b/137101239): clean up split system user codes
      * Result code for {@link #checkProvisioningPreCondition}.
      *
      * <p>Returned for {@link #ACTION_PROVISION_MANAGED_PROFILE} when the device the user is a
@@ -2443,6 +2453,19 @@
     @Retention(RetentionPolicy.SOURCE)
     public @interface PersonalAppsSuspensionReason {}
 
+    /** @hide */
+    @TestApi
+    public static final int OPERATION_LOCK_NOW = 1;
+
+    // TODO(b/172376923) - add all operations
+    /** @hide */
+    @IntDef(prefix = "OPERATION_", value = {
+            OPERATION_LOCK_NOW,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public static @interface DevicePolicyOperation {
+    }
+
     /**
      * Return true if the given administrator component is currently active (enabled) in the system.
      *
@@ -2729,6 +2752,9 @@
      * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
      * profile.
      *
+     * <p><strong>Note:</strong> Specifying password requirements using this method clears the
+     * password complexity requirements set using {@link #setRequiredPasswordComplexity(int)}.
+     *
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
      * @param quality The new desired quality. One of {@link #PASSWORD_QUALITY_UNSPECIFIED},
      *            {@link #PASSWORD_QUALITY_BIOMETRIC_WEAK},
@@ -3607,13 +3633,18 @@
      * <p>Note that when called from a profile which uses an unified challenge with its parent, the
      * screen lock complexity of the parent will be returned.
      *
+     * <p>Apps need the {@link permission#REQUEST_PASSWORD_COMPLEXITY} permission to call this
+     * method. On Android {@link android.os.Build.VERSION_CODES#S} and above, the calling
+     * application does not need this permission if it is a device owner or a profile owner.
+     *
      * <p>This method can be called on the {@link DevicePolicyManager} instance
      * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
      * restrictions on the parent profile.
      *
      * @throws IllegalStateException if the user is not unlocked.
      * @throws SecurityException     if the calling application does not have the permission
-     *                               {@link permission#REQUEST_PASSWORD_COMPLEXITY}
+     *                               {@link permission#REQUEST_PASSWORD_COMPLEXITY}, and is not a
+     *                               device owner or a profile owner.
      */
     @PasswordComplexity
     @RequiresPermission(android.Manifest.permission.REQUEST_PASSWORD_COMPLEXITY)
@@ -3630,6 +3661,66 @@
     }
 
     /**
+     * Sets a password complexity requirement for the user's screen lock.
+     * The complexity level is one of the pre-defined levels.
+     *
+     * <p>Note that when called on a profile which uses an unified challenge with its parent, the
+     * complexity would apply to the unified challenge.
+     *
+     * <p>This method can be called on the {@link DevicePolicyManager} instance
+     * returned by {@link #getParentProfileInstance(ComponentName)} in order to set
+     * restrictions on the parent profile.
+     *
+     * <p><strong>Note:</strong> Specifying password requirements using this method clears any
+     * password requirements set using the obsolete {@link #setPasswordQuality(ComponentName, int)}
+     * and any of its associated methods.
+     *
+     * @throws SecurityException if the calling application is not a device owner or a profile
+     * owner.
+     * @throws IllegalArgumentException if the complexity level is not one of the four above.
+     */
+    public void setRequiredPasswordComplexity(@PasswordComplexity int passwordComplexity) {
+        if (mService == null) {
+            return;
+        }
+
+        try {
+            mService.setRequiredPasswordComplexity(passwordComplexity, mParentInstance);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+
+    /**
+     * Gets the password complexity requirement set by {@link #setRequiredPasswordComplexity(int)},
+     * for the current user.
+     *
+     * <p>The difference between this method and {@link #getPasswordComplexity()} is that this
+     * method simply returns the value set by {@link #setRequiredPasswordComplexity(int)} while
+     * {@link #getPasswordComplexity()} returns the complexity of the actual password.
+     *
+     * <p>This method can be called on the {@link DevicePolicyManager} instance
+     * returned by {@link #getParentProfileInstance(ComponentName)} in order to get
+     * restrictions on the parent profile.
+     *
+     * @throws SecurityException if the calling application is not a device owner or a profile
+     * owner.
+     */
+    @PasswordComplexity
+    public int getRequiredPasswordComplexity() {
+        if (mService == null) {
+            return PASSWORD_COMPLEXITY_NONE;
+        }
+
+        try {
+            return mService.getRequiredPasswordComplexity(mParentInstance);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * When called by a profile owner of a managed profile returns true if the profile uses unified
      * challenge with its parent user.
      *
@@ -6685,7 +6776,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public boolean isDeviceManaged() {
         try {
             return mService.hasDeviceOwner();
@@ -9987,6 +10078,8 @@
      * <li>{@link #getRequiredStrongAuthTimeout}</li>
      * <li>{@link #setRequiredStrongAuthTimeout}</li>
      * <li>{@link #getAccountTypesWithManagementDisabled}</li>
+     * <li>{@link #setRequiredPasswordComplexity(int)} </li>
+     * <li>{@link #getRequiredPasswordComplexity()}</li>
      * </ul>
      * <p>
      * The following methods are supported for the parent instance but can only be called by the
@@ -10394,7 +10487,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public @Nullable CharSequence getDeviceOwnerOrganizationName() {
         try {
             return mService.getDeviceOwnerOrganizationName();
diff --git a/core/java/android/app/admin/DevicePolicySafetyChecker.java b/core/java/android/app/admin/DevicePolicySafetyChecker.java
new file mode 100644
index 0000000..1f8a933
--- /dev/null
+++ b/core/java/android/app/admin/DevicePolicySafetyChecker.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.app.admin;
+
+import android.annotation.NonNull;
+import android.app.admin.DevicePolicyManager.DevicePolicyOperation;
+
+/**
+ * Interface responsible to check if a {@link DevicePolicyManager} API can be safely executed.
+ *
+ * @hide
+ */
+public interface DevicePolicySafetyChecker {
+
+    /**
+     * Returns whether the given {@code operation} can be safely executed at the moment.
+     */
+    default boolean isDevicePolicyOperationSafe(@DevicePolicyOperation int operation) {
+        return true;
+    }
+
+    /**
+     * Returns a new exception for when the given {@code operation} cannot be safely executed.
+     */
+    @NonNull
+    default UnsafeStateException newUnsafeStateException(@DevicePolicyOperation int operation) {
+        return new UnsafeStateException(operation);
+    }
+}
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index f4105e9..58368bc 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -87,6 +87,8 @@
     boolean isProfileActivePasswordSufficientForParent(int userHandle);
     boolean isPasswordSufficientAfterProfileUnification(int userHandle, int profileUser);
     int getPasswordComplexity(boolean parent);
+    void setRequiredPasswordComplexity(int passwordComplexity, boolean parent);
+    int getRequiredPasswordComplexity(boolean parent);
     boolean isUsingUnifiedPassword(in ComponentName admin);
     int getCurrentFailedPasswordAttempts(int userHandle, boolean parent);
     int getProfileWithMinimumFailedPasswordsForWipe(int userHandle, boolean parent);
diff --git a/core/java/android/app/admin/UnsafeStateException.java b/core/java/android/app/admin/UnsafeStateException.java
new file mode 100644
index 0000000..9dcaae4
--- /dev/null
+++ b/core/java/android/app/admin/UnsafeStateException.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.admin;
+
+import android.annotation.NonNull;
+import android.annotation.TestApi;
+import android.app.admin.DevicePolicyManager.DevicePolicyOperation;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Exception thrown when a {@link DevicePolicyManager} operation failed because it was not safe
+ * to be executed at that moment.
+ *
+ * <p>For example, it can be thrown on
+ * {@link android.content.pm.PackageManager#FEATURE_AUTOMOTIVE automotive devices} when the vehicle
+ * is moving.
+ */
+@SuppressWarnings("serial")
+public final class UnsafeStateException extends IllegalStateException implements Parcelable {
+
+    private final @DevicePolicyOperation int mOperation;
+
+    /** @hide */
+    public UnsafeStateException(@DevicePolicyOperation int operation) {
+        super();
+
+        mOperation = operation;
+    }
+
+    /** @hide */
+    @TestApi
+    public @DevicePolicyOperation int getOperation() {
+        return mOperation;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        dest.writeInt(mOperation);
+    }
+
+    @NonNull
+    public static final Creator<UnsafeStateException> CREATOR =
+            new Creator<UnsafeStateException>() {
+
+        @Override
+        public UnsafeStateException createFromParcel(Parcel source) {
+            return new UnsafeStateException(source.readInt());
+        }
+
+        @Override
+        public UnsafeStateException[] newArray(int size) {
+            return new UnsafeStateException[size];
+        }
+    };
+}
diff --git a/core/java/android/app/backup/OWNERS b/core/java/android/app/backup/OWNERS
index 7e7710b..0f88811 100644
--- a/core/java/android/app/backup/OWNERS
+++ b/core/java/android/app/backup/OWNERS
@@ -1,4 +1,4 @@
 # Bug component: 656484
 
-include platform/frameworks/base/services/backup:/OWNERS
+include platform/frameworks/base:/services/backup/OWNERS
 
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 422d3f7..e35fb03 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -839,6 +839,7 @@
     }
 
     /** @hide */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     protected abstract IContentProvider acquireProvider(Context c, String name);
 
@@ -855,15 +856,19 @@
     }
 
     /** @hide */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract boolean releaseProvider(IContentProvider icp);
     /** @hide */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     protected abstract IContentProvider acquireUnstableProvider(Context c, String name);
     /** @hide */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract boolean releaseUnstableProvider(IContentProvider icp);
     /** @hide */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void unstableProviderDied(IContentProvider icp);
 
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 46d4f22..37e0a44 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -811,6 +811,7 @@
      * case {@link #getOpPackageName()} will be the name of the primary package in
      * that process (so that app ops uid verification will work with the name).
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract String getBasePackageName();
 
@@ -927,6 +928,7 @@
      * @see #MODE_PRIVATE
      * @removed
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract SharedPreferences getSharedPreferences(File file, @PreferencesMode int mode);
 
     /**
@@ -957,6 +959,7 @@
     public abstract boolean deleteSharedPreferences(String name);
 
     /** @hide */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract void reloadSharedPreferences();
 
     /**
@@ -1045,6 +1048,7 @@
      * @see #getSharedPreferences(String, int)
      * @removed
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract File getSharedPreferencesPath(String name);
 
     /**
@@ -1516,6 +1520,7 @@
      * There is no guarantee when these files will be deleted.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     @SystemApi
     public abstract File getPreloadsFileCache();
@@ -2184,6 +2189,7 @@
      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user,
             String[] receiverPermissions);
 
@@ -2214,6 +2220,7 @@
      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     public abstract void sendBroadcast(Intent intent,
             @Nullable String receiverPermission,
@@ -2224,6 +2231,7 @@
      * of an associated app op as per {@link android.app.AppOpsManager}.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void sendBroadcast(Intent intent,
             String receiverPermission, int appOp);
@@ -2339,6 +2347,7 @@
      * @see android.app.Activity#RESULT_OK
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     public abstract void sendOrderedBroadcast(@NonNull Intent intent,
             @Nullable String receiverPermission, @Nullable Bundle options,
@@ -2351,6 +2360,7 @@
      * of an associated app op as per {@link android.app.AppOpsManager}.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void sendOrderedBroadcast(Intent intent,
             String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
@@ -2404,6 +2414,7 @@
      * @see #sendBroadcast(Intent, String, Bundle)
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
     public abstract void sendBroadcastAsUser(@RequiresPermission Intent intent,
@@ -2426,6 +2437,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public abstract void sendBroadcastAsUser(@RequiresPermission Intent intent,
@@ -2472,6 +2484,7 @@
      *       BroadcastReceiver, Handler, int, String, Bundle)
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public abstract void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
@@ -2485,6 +2498,7 @@
      *       BroadcastReceiver, Handler, int, String, Bundle)
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
     @UnsupportedAppUsage
     public abstract void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
@@ -2699,6 +2713,7 @@
      * @hide
      * This is just here for sending CONNECTIVITY_ACTION.
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Deprecated
     @RequiresPermission(allOf = {
             android.Manifest.permission.INTERACT_ACROSS_USERS,
@@ -2989,6 +3004,7 @@
      * @see #sendBroadcast
      * @see #unregisterReceiver
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
     @UnsupportedAppUsage
@@ -3099,6 +3115,7 @@
     /**
      * @hide like {@link #startForegroundService(Intent)} but for a specific user.
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
     public abstract ComponentName startForegroundServiceAsUser(Intent service, UserHandle user);
@@ -3137,6 +3154,7 @@
     /**
      * @hide like {@link #startService(Intent)} but for a specific user.
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
     @UnsupportedAppUsage
@@ -3145,6 +3163,7 @@
     /**
      * @hide like {@link #stopService(Intent)} but for a specific user.
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
     public abstract boolean stopServiceAsUser(Intent service, UserHandle user);
 
@@ -5282,6 +5301,7 @@
     public abstract int checkPermission(@NonNull String permission, int pid, int uid);
 
     /** @hide */
+    @SuppressWarnings("HiddenAbstractMethod")
     @PackageManager.PermissionResult
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public abstract int checkPermission(@NonNull String permission, int pid, int uid,
@@ -5509,6 +5529,7 @@
             @Intent.AccessUriMode int modeFlags);
 
     /** @hide */
+    @SuppressWarnings("HiddenAbstractMethod")
     @PackageManager.PermissionResult
     public abstract int checkUriPermission(Uri uri, int pid, int uid,
             @Intent.AccessUriMode int modeFlags, IBinder callerToken);
@@ -5793,6 +5814,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract Context createApplicationContext(ApplicationInfo application,
             @CreatePackageOptions int flags) throws PackageManager.NameNotFoundException;
@@ -6024,6 +6046,7 @@
      * @see #isCredentialProtectedStorage()
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     public abstract Context createCredentialProtectedStorageContext();
 
@@ -6036,6 +6059,7 @@
      * @return The compatibility info holder, or null if not required by the application.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract DisplayAdjustments getDisplayAdjustments(int displayId);
 
     /**
@@ -6070,12 +6094,14 @@
      * @see #getDisplay()
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @TestApi
     public abstract int getDisplayId();
 
     /**
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract void updateDisplay(int displayId);
 
     /**
@@ -6104,6 +6130,7 @@
      * @see #createCredentialProtectedStorageContext()
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     public abstract boolean isCredentialProtectedStorage();
 
@@ -6111,16 +6138,47 @@
      * Returns true if the context can load unsafe resources, e.g. fonts.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract boolean canLoadUnsafeResources();
 
     /**
+     * Returns token if the {@link Context} is a {@link android.app.Activity}. Returns
+     * {@code null} otherwise.
+     *
      * @hide
      */
+    @Nullable
     public IBinder getActivityToken() {
         throw new RuntimeException("Not implemented. Must override in a subclass.");
     }
 
     /**
+     * Returns token if the {@link Context} is a {@link android.app.WindowContext}. Returns
+     * {@code null} otherwise.
+     *
+     * @hide
+     */
+    @Nullable
+    public IBinder getWindowContextToken() {
+        throw new RuntimeException("Not implemented. Must override in a subclass.");
+    }
+
+    /**
+     * Returns the proper token of a {@link Context}.
+     *
+     * If the {@link Context} is an {@link android.app.Activity}, returns
+     * {@link #getActivityToken()}. If the {@lijnk Context} is a {@link android.app.WindowContext},
+     * returns {@link #getWindowContextToken()}. Returns {@code null}, otherwise.
+     *
+     * @hide
+     */
+    @Nullable
+    public static IBinder getToken(@NonNull Context context) {
+        return context.getActivityToken() != null ? context.getActivityToken()
+                : context.getWindowContextToken();
+    }
+
+    /**
      * @hide
      */
     @Nullable
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index 387ae19..b0c47bd 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -1071,6 +1071,14 @@
      * @hide
      */
     @Override
+    public IBinder getWindowContextToken() {
+        return mBase != null ? mBase.getWindowContextToken() : null;
+    }
+
+    /**
+     * @hide
+     */
+    @Override
     public IServiceConnection getServiceDispatcher(ServiceConnection conn, Handler handler,
             int flags) {
         return mBase.getServiceDispatcher(conn, handler, flags);
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 9c4e6aa..ddcfb92 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -834,13 +834,13 @@
 
     /**
      * Bit in {@link #configChanges} that indicates that the activity
-     * can itself handle changes to bold text.  Set from the
+     * can itself handle changes to font weight.  Set from the
      * {@link android.R.attr#configChanges} attribute.  This is
      * not a core resource configuration, but a higher-level value, so its
      * constant starts at the high bits.
      */
 
-    public static final int CONFIG_FORCE_BOLD_TEXT = 0x10000000;
+    public static final int CONFIG_FONT_WEIGHT_ADJUSTMENT = 0x10000000;
 
     /** @hide
      * Unfortunately the constants for config changes in native code are
diff --git a/core/java/android/content/pm/LauncherActivityInfo.java b/core/java/android/content/pm/LauncherActivityInfo.java
index 7c48bdf..82d7b63 100644
--- a/core/java/android/content/pm/LauncherActivityInfo.java
+++ b/core/java/android/content/pm/LauncherActivityInfo.java
@@ -16,6 +16,7 @@
 
 package android.content.pm;
 
+import android.annotation.FloatRange;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -86,7 +87,7 @@
     /**
      * @return Package loading progress, range between [0, 1].
      */
-    public float getLoadingProgress() {
+    public @FloatRange(from = 0.0, to = 1.0) float getLoadingProgress() {
         return mInternal.getIncrementalStatesInfo().getProgress();
     }
 
@@ -129,6 +130,16 @@
     }
 
     /**
+     * Returns the ActivityInfo of the activity.
+     *
+     * @return Activity Info
+     * @hide
+     */
+    public ActivityInfo getActivityInfo() {
+        return mInternal.getActivityInfo();
+    }
+
+    /**
      * Returns the application info for the appliction this activity belongs to.
      * @return
      */
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index a77d8b1..cc484de 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -40,7 +40,7 @@
 import android.app.admin.DevicePolicyManager;
 import android.app.usage.StorageStatsManager;
 import android.compat.annotation.ChangeId;
-import android.compat.annotation.EnabledAfter;
+import android.compat.annotation.EnabledSince;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.ComponentName;
 import android.content.Context;
@@ -3765,7 +3765,7 @@
      * @hide
      */
     @ChangeId
-    @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q)
+    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.R)
     public static final long FILTER_APPLICATION_QUERY = 135549675L;
 
     /** {@hide} */
@@ -3919,6 +3919,7 @@
      *             found on the system.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS)
     @UnsupportedAppUsage
     public abstract PackageInfo getPackageInfoAsUser(@NonNull String packageName,
@@ -3985,6 +3986,7 @@
      *         does not contain such an activity.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract @Nullable Intent getCarLaunchIntentForPackage(@NonNull String packageName);
 
     /**
@@ -4050,6 +4052,7 @@
      *             found on the system.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract int getPackageUidAsUser(@NonNull String packageName, @UserIdInt int userId)
             throws NameNotFoundException;
@@ -4068,6 +4071,7 @@
      *             found on the system.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract int getPackageUidAsUser(@NonNull String packageName,
             @PackageInfoFlags int flags, @UserIdInt int userId) throws NameNotFoundException;
@@ -4110,6 +4114,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     public abstract boolean arePermissionsIndividuallyControlled();
 
@@ -4118,6 +4123,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract boolean isWirelessConsentModeEnabled();
 
     /**
@@ -4170,6 +4176,7 @@
             @ApplicationInfoFlags int flags) throws NameNotFoundException;
 
     /** {@hide} */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @UnsupportedAppUsage
     public abstract ApplicationInfo getApplicationInfoAsUser(@NonNull String packageName,
@@ -4360,6 +4367,7 @@
      *         deleted with {@code DELETE_KEEP_DATA} flag set).
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @SystemApi
     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
@@ -4408,6 +4416,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     @NonNull
     @TestApi
@@ -4521,6 +4530,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS)
     public abstract void grantRuntimePermission(@NonNull String packageName,
@@ -4547,6 +4557,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS)
     public abstract void revokeRuntimePermission(@NonNull String packageName,
@@ -4591,6 +4602,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(anyOf = {
             android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS,
@@ -4613,6 +4625,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(anyOf = {
             android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS,
@@ -4888,6 +4901,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract boolean shouldShowRequestPermissionRationale(@NonNull String permName);
 
@@ -5003,6 +5017,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @TestApi
     public abstract @Nullable String[] getNamesForUids(int[] uids);
 
@@ -5019,6 +5034,7 @@
      *             found on the system.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract int getUidForSharedUser(@NonNull String sharedUserName)
             throws NameNotFoundException;
@@ -5062,6 +5078,7 @@
      *         deleted with {@code DELETE_KEEP_DATA} flag set).
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @TestApi
     public abstract List<ApplicationInfo> getInstalledApplicationsAsUser(
@@ -5074,6 +5091,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(Manifest.permission.ACCESS_INSTANT_APPS)
     public abstract @NonNull List<InstantAppInfo> getInstantApps();
@@ -5085,6 +5103,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(Manifest.permission.ACCESS_INSTANT_APPS)
     public abstract @Nullable Drawable getInstantAppIcon(String packageName);
@@ -5133,6 +5152,7 @@
      * deprecated
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract int getInstantAppCookieMaxSize();
 
     /**
@@ -5190,6 +5210,7 @@
     /**
      * @removed
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract boolean setInstantAppCookie(@Nullable byte[] cookie);
 
     /**
@@ -5228,6 +5249,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract @NonNull List<SharedLibraryInfo> getSharedLibrariesAsUser(
             @InstallFlags int flags, @UserIdInt int userId);
 
@@ -5240,6 +5262,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @RequiresPermission(Manifest.permission.ACCESS_SHARED_LIBRARIES)
     @SystemApi
@@ -5259,6 +5282,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     @TestApi
     public abstract @NonNull String getServicesSystemSharedLibraryPackageName();
@@ -5270,6 +5294,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     @TestApi
     public abstract @NonNull String getSharedSystemSharedLibraryPackageName();
@@ -5376,6 +5401,7 @@
      *         containing something else, such as the activity resolver.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     @UnsupportedAppUsage
     public abstract ResolveInfo resolveActivityAsUser(@NonNull Intent intent,
@@ -5417,6 +5443,7 @@
      *         empty list is returned.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @UnsupportedAppUsage
     public abstract List<ResolveInfo> queryIntentActivitiesAsUser(@NonNull Intent intent,
@@ -5440,6 +5467,7 @@
      *         empty list is returned.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS)
     @SystemApi
@@ -5502,6 +5530,7 @@
      *         no matching receivers, an empty list or null is returned.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @SystemApi
     @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS)
@@ -5513,6 +5542,7 @@
     /**
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @UnsupportedAppUsage
     public abstract List<ResolveInfo> queryBroadcastReceiversAsUser(@NonNull Intent intent,
@@ -5551,6 +5581,7 @@
     /**
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     public abstract ResolveInfo resolveServiceAsUser(@NonNull Intent intent,
             @ResolveInfoFlags int flags, @UserIdInt int userId);
@@ -5583,6 +5614,7 @@
      *         empty list or null is returned.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @UnsupportedAppUsage
     public abstract List<ResolveInfo> queryIntentServicesAsUser(@NonNull Intent intent,
@@ -5621,6 +5653,7 @@
      *         no matching services, an empty list or null is returned.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @UnsupportedAppUsage
     public abstract List<ResolveInfo> queryIntentContentProvidersAsUser(
@@ -5688,6 +5721,7 @@
      *         provider. If a provider was not found, returns null.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     @UnsupportedAppUsage
     public abstract ProviderInfo resolveContentProviderAsUser(@NonNull String providerName,
@@ -6072,6 +6106,7 @@
      * @return the drawable or null if no drawable is required.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     @UnsupportedAppUsage
     public abstract Drawable getUserBadgeForDensity(@NonNull UserHandle user, int density);
@@ -6090,6 +6125,7 @@
      * @return the drawable or null if no drawable is required.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     @UnsupportedAppUsage
     public abstract Drawable getUserBadgeForDensityNoBackground(@NonNull UserHandle user,
@@ -6228,6 +6264,7 @@
      * TODO(b/170852794): mark maxTargetSdk as {@code Build.VERSION_CODES.S}
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170928809,
             publicAlternatives = "Use {@code Context#createContextAsUser(UserHandle, int)}"
@@ -6280,6 +6317,7 @@
      *
      * @deprecated use {@link PackageInstaller#installExistingPackage()} instead.
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Deprecated
     @SystemApi
     public abstract int installExistingPackage(@NonNull String packageName)
@@ -6292,6 +6330,7 @@
      *
      * @deprecated use {@link PackageInstaller#installExistingPackage()} instead.
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Deprecated
     @SystemApi
     public abstract int installExistingPackage(@NonNull String packageName,
@@ -6304,6 +6343,7 @@
      *
      * @deprecated use {@link PackageInstaller#installExistingPackage()} instead.
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Deprecated
     @RequiresPermission(anyOf = {
             Manifest.permission.INSTALL_EXISTING_PACKAGES,
@@ -6384,6 +6424,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT)
     public abstract void verifyIntentFilter(int verificationId, int verificationCode,
@@ -6409,6 +6450,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL)
     public abstract int getIntentVerificationStatusAsUser(@NonNull String packageName,
@@ -6434,6 +6476,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(android.Manifest.permission.SET_PREFERRED_APPLICATIONS)
     public abstract boolean updateIntentVerificationStatusAsUser(@NonNull String packageName,
@@ -6451,6 +6494,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @SystemApi
     public abstract List<IntentFilterVerificationInfo> getIntentFilterVerifications(
@@ -6467,6 +6511,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @SystemApi
     public abstract List<IntentFilter> getAllIntentFilters(@NonNull String packageName);
@@ -6481,6 +6526,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     @SystemApi
     @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL)
@@ -6498,6 +6544,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(allOf = {
             Manifest.permission.SET_PREFERRED_APPLICATIONS,
@@ -6524,6 +6571,7 @@
             @Nullable String installerPackageName);
 
     /** @hide */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(Manifest.permission.INSTALL_PACKAGES)
     public abstract void setUpdateAvailable(@NonNull String packageName, boolean updateAvaialble);
@@ -6544,6 +6592,7 @@
      *            indicate that no callback is desired.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @RequiresPermission(Manifest.permission.DELETE_PACKAGES)
     @UnsupportedAppUsage
     public abstract void deletePackage(@NonNull String packageName,
@@ -6564,6 +6613,7 @@
      * @param userId The user Id
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @RequiresPermission(anyOf = {
             Manifest.permission.DELETE_PACKAGES,
             Manifest.permission.INTERACT_ACROSS_USERS_FULL})
@@ -6581,6 +6631,7 @@
      *
      * @deprecated use {@link #getInstallSourceInfo(String)} instead
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Deprecated
     @Nullable
     public abstract String getInstallerPackageName(@NonNull String packageName);
@@ -6620,6 +6671,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void clearApplicationUserData(@NonNull String packageName,
             @Nullable IPackageDataObserver observer);
@@ -6639,6 +6691,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void deleteApplicationCacheFiles(@NonNull String packageName,
             @Nullable IPackageDataObserver observer);
@@ -6661,6 +6714,7 @@
      *            callback is desired.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void deleteApplicationCacheFilesAsUser(@NonNull String packageName,
             @UserIdInt int userId, @Nullable IPackageDataObserver observer);
@@ -6694,6 +6748,7 @@
     }
 
     /** {@hide} */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void freeStorageAndNotify(@Nullable String volumeUuid, long freeStorageSize,
             @Nullable IPackageDataObserver observer);
@@ -6727,6 +6782,7 @@
     }
 
     /** {@hide} */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void freeStorage(@Nullable String volumeUuid, long freeStorageSize,
             @Nullable IntentSender pi);
@@ -6750,6 +6806,7 @@
      * @deprecated use {@link StorageStatsManager} instead.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Deprecated
     @UnsupportedAppUsage
     public abstract void getPackageSizeInfoAsUser(@NonNull String packageName,
@@ -6881,6 +6938,7 @@
      * an app to be responsible for a particular role and to check current role
      * holders, see {@link android.app.role.RoleManager}.
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Deprecated
     @UnsupportedAppUsage
     public abstract void replacePreferredActivity(@NonNull IntentFilter filter, int match,
@@ -6988,6 +7046,7 @@
      * default, if any.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     @UnsupportedAppUsage
     public abstract ComponentName getHomeActivities(@NonNull List<ResolveInfo> outActivities);
@@ -7089,6 +7148,7 @@
      * @param userId Ther userId of the user whose restrictions are to be flushed.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void flushPackageRestrictionsAsUser(@UserIdInt int userId);
 
@@ -7099,6 +7159,7 @@
      * or by installing it, such as with {@link #installExistingPackage(String)}
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract boolean setApplicationHiddenSettingAsUser(@NonNull String packageName,
             boolean hidden, @NonNull UserHandle userHandle);
@@ -7108,6 +7169,7 @@
      * @see #setApplicationHiddenSettingAsUser(String, boolean, UserHandle)
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract boolean getApplicationHiddenSettingAsUser(@NonNull String packageName,
             @NonNull UserHandle userHandle);
@@ -7141,6 +7203,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS)
     public abstract void addOnPermissionsChangeListener(
@@ -7153,6 +7216,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS)
     public abstract void removeOnPermissionsChangeListener(
@@ -7166,6 +7230,7 @@
      *        application's AndroidManifest.xml.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @UnsupportedAppUsage
     public abstract KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias);
@@ -7173,6 +7238,7 @@
     /** Return the signing {@link KeySet} for this application.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @UnsupportedAppUsage
     public abstract KeySet getSigningKeySet(@NonNull String packageName);
@@ -7184,6 +7250,7 @@
      * Compare to {@link #isSignedByExactly(String packageName, KeySet ks)}.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract boolean isSignedBy(@NonNull String packageName, @NonNull KeySet ks);
 
@@ -7193,6 +7260,7 @@
      * {@link #isSignedBy(String packageName, KeySet ks)}.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract boolean isSignedByExactly(@NonNull String packageName, @NonNull KeySet ks);
 
@@ -7410,6 +7478,7 @@
      * @throws IllegalArgumentException if the package was not found.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract boolean isPackageSuspendedForUser(@NonNull String packageName, int userId);
 
@@ -7485,6 +7554,7 @@
      * @param packageName the package to change the category hint for.
      * @param categoryHint the category hint to set.
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract void setApplicationCategoryHint(@NonNull String packageName,
             @ApplicationInfo.Category int categoryHint);
 
@@ -7500,34 +7570,43 @@
     }
 
     /** {@hide} */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract int getMoveStatus(int moveId);
 
     /** {@hide} */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void registerMoveCallback(@NonNull MoveCallback callback,
             @NonNull Handler handler);
     /** {@hide} */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void unregisterMoveCallback(@NonNull MoveCallback callback);
 
     /** {@hide} */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public abstract int movePackage(@NonNull String packageName, @NonNull VolumeInfo vol);
     /** {@hide} */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public abstract @Nullable VolumeInfo getPackageCurrentVolume(@NonNull ApplicationInfo app);
     /** {@hide} */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public abstract List<VolumeInfo> getPackageCandidateVolumes(
             @NonNull ApplicationInfo app);
 
     /** {@hide} */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract int movePrimaryStorage(@NonNull VolumeInfo vol);
     /** {@hide} */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract @Nullable VolumeInfo getPrimaryStorageCurrentVolume();
     /** {@hide} */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract @NonNull List<VolumeInfo> getPrimaryStorageCandidateVolumes();
 
     /**
@@ -7537,6 +7616,7 @@
      * @return identity that uniquely identifies current device
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     public abstract VerifierDeviceIdentity getVerifierDeviceIdentity();
 
@@ -7545,6 +7625,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract boolean isUpgrade();
 
@@ -7574,6 +7655,7 @@
      *            {@link #ONLY_IF_NO_MATCH_FOUND}.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void addCrossProfileIntentFilter(@NonNull IntentFilter filter,
             @UserIdInt int sourceUserId, @UserIdInt int targetUserId, int flags);
@@ -7585,12 +7667,14 @@
      * @param sourceUserId The source user id.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void clearCrossProfileIntentFilters(@UserIdInt int sourceUserId);
 
     /**
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @UnsupportedAppUsage
     public abstract Drawable loadItemIcon(@NonNull PackageItemInfo itemInfo,
@@ -7599,12 +7683,14 @@
     /**
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @NonNull
     @UnsupportedAppUsage
     public abstract Drawable loadUnbadgedItemIcon(@NonNull PackageItemInfo itemInfo,
             @Nullable ApplicationInfo appInfo);
 
     /** {@hide} */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract boolean isPackageAvailable(@NonNull String packageName);
 
@@ -7825,6 +7911,7 @@
      *         user, {@code INSTALL_REASON_UNKNOWN} is returned.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @TestApi
     @InstallReason
     public abstract int getInstallReason(@NonNull String packageName, @NonNull UserHandle user);
@@ -7853,6 +7940,7 @@
      * @see {@link android.content.Intent#ACTION_INSTANT_APP_RESOLVER_SETTINGS}
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     @SystemApi
     public abstract ComponentName getInstantAppResolverSettingsComponent();
@@ -7864,6 +7952,7 @@
      * @see {@link android.content.Intent#ACTION_INSTALL_INSTANT_APP_PACKAGE}
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     @SystemApi
     public abstract ComponentName getInstantAppInstallerComponent();
@@ -7874,6 +7963,7 @@
      * @see {@link android.provider.Settings.Secure#ANDROID_ID}
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @Nullable
     public abstract String getInstantAppAndroidId(@NonNull String packageName,
             @NonNull UserHandle user);
@@ -7918,6 +8008,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     public abstract void registerDexModule(@NonNull String dexModulePath,
             @Nullable DexModuleRegisterCallback callback);
diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java
index 6a6be75..da75fba 100644
--- a/core/java/android/content/pm/ShortcutInfo.java
+++ b/core/java/android/content/pm/ShortcutInfo.java
@@ -1319,8 +1319,8 @@
          * system services even after it has been unpublished as a dynamic shortcut.
          */
         @NonNull
-        public Builder setLongLived(boolean londLived) {
-            mIsLongLived = londLived;
+        public Builder setLongLived(boolean longLived) {
+            mIsLongLived = longLived;
             return this;
         }
 
diff --git a/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java b/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
index c5240c2..ddf3d90 100644
--- a/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
+++ b/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
@@ -419,7 +419,7 @@
             return null;
         }
 
-        return generateActivityInfoUnchecked(a, applicationInfo);
+        return generateActivityInfoUnchecked(a, flags, applicationInfo);
     }
 
     /**
@@ -431,6 +431,7 @@
      */
     @NonNull
     public static ActivityInfo generateActivityInfoUnchecked(@NonNull ParsedActivity a,
+            @PackageManager.ComponentInfoFlags int flags,
             @NonNull ApplicationInfo applicationInfo) {
         // Make shallow copies so we can store the metadata safely
         ActivityInfo ai = new ActivityInfo();
@@ -463,7 +464,9 @@
         ai.rotationAnimation = a.getRotationAnimation();
         ai.colorMode = a.getColorMode();
         ai.windowLayout = a.getWindowLayout();
-        ai.metaData = a.getMetaData();
+        if ((flags & PackageManager.GET_META_DATA) != 0) {
+            ai.metaData = a.getMetaData();
+        }
         ai.applicationInfo = applicationInfo;
         return ai;
     }
@@ -489,7 +492,7 @@
             return null;
         }
 
-        return generateServiceInfoUnchecked(s, applicationInfo);
+        return generateServiceInfoUnchecked(s, flags,  applicationInfo);
     }
 
     /**
@@ -501,17 +504,20 @@
      */
     @NonNull
     public static ServiceInfo generateServiceInfoUnchecked(@NonNull ParsedService s,
+            @PackageManager.ComponentInfoFlags int flags,
             @NonNull ApplicationInfo applicationInfo) {
         // Make shallow copies so we can store the metadata safely
         ServiceInfo si = new ServiceInfo();
         assignSharedFieldsForComponentInfo(si, s);
         si.exported = s.isExported();
         si.flags = s.getFlags();
-        si.metaData = s.getMetaData();
         si.permission = s.getPermission();
         si.processName = s.getProcessName();
         si.mForegroundServiceType = s.getForegroundServiceType();
         si.applicationInfo = applicationInfo;
+        if ((flags & PackageManager.GET_META_DATA) != 0) {
+            si.metaData = s.getMetaData();
+        }
         return si;
     }
 
@@ -566,10 +572,12 @@
         pi.initOrder = p.getInitOrder();
         pi.uriPermissionPatterns = p.getUriPermissionPatterns();
         pi.pathPermissions = p.getPathPermissions();
-        pi.metaData = p.getMetaData();
         if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) {
             pi.uriPermissionPatterns = null;
         }
+        if ((flags & PackageManager.GET_META_DATA) != 0) {
+            pi.metaData = p.getMetaData();
+        }
         pi.applicationInfo = applicationInfo;
         return pi;
     }
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java
index ce4ed8e..2f7aeb8 100644
--- a/core/java/android/content/res/Configuration.java
+++ b/core/java/android/content/res/Configuration.java
@@ -19,7 +19,7 @@
 import static android.content.ConfigurationProto.COLOR_MODE;
 import static android.content.ConfigurationProto.DENSITY_DPI;
 import static android.content.ConfigurationProto.FONT_SCALE;
-import static android.content.ConfigurationProto.FORCE_BOLD_TEXT;
+import static android.content.ConfigurationProto.FONT_WEIGHT_ADJUSTMENT;
 import static android.content.ConfigurationProto.HARD_KEYBOARD_HIDDEN;
 import static android.content.ConfigurationProto.KEYBOARD;
 import static android.content.ConfigurationProto.KEYBOARD_HIDDEN;
@@ -51,6 +51,7 @@
 import android.content.LocaleProto;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ActivityInfo.Config;
+import android.graphics.Typeface;
 import android.os.Build;
 import android.os.LocaleList;
 import android.os.Parcel;
@@ -333,24 +334,22 @@
     public int screenLayout;
 
     /**
-     * An undefined forceBoldText.
+     * An undefined fontWeightAdjustment.
      */
-    public static final int FORCE_BOLD_TEXT_UNDEFINED = 0;
+    public static final int FONT_WEIGHT_ADJUSTMENT_UNDEFINED = Integer.MAX_VALUE;
 
     /**
-     * Text is not bold.
+     * Adjustment in text font weight. Used to reflect the current user preference for increasing
+     * font weight.
+     *
+     * <p> If the text font weight is less than the minimum of 1, 1 will be used. If the font weight
+     * exceeds the maximum of 1000, 1000 will be used.
+     *
+     * @see android.graphics.Typeface#create(Typeface, int, boolean)
+     * @see android.graphics.fonts.FontStyle#FONT_WEIGHT_MIN
+     * @see android.graphics.fonts.FontStyle#FONT_WEIGHT_MAX
      */
-    public static final int FORCE_BOLD_TEXT_NO = 1;
-
-    /**
-     * Text is bold.
-     */
-    public static final int FORCE_BOLD_TEXT_YES = 2;
-
-    /**
-     * Current user preference for displaying all text in bold.
-     */
-    public int forceBoldText;
+    public int fontWeightAdjustment;
 
     /**
      * Configuration relating to the windowing state of the object associated with this
@@ -488,7 +487,7 @@
         if ((diff & ActivityInfo.CONFIG_WINDOW_CONFIGURATION) != 0) {
             list.add("CONFIG_WINDOW_CONFIGURATION");
         }
-        if ((diff & ActivityInfo.CONFIG_FORCE_BOLD_TEXT) != 0) {
+        if ((diff & ActivityInfo.CONFIG_FONT_WEIGHT_ADJUSTMENT) != 0) {
             list.add("CONFIG_AUTO_BOLD_TEXT");
         }
         StringBuilder builder = new StringBuilder("{");
@@ -981,7 +980,7 @@
         assetsSeq = o.assetsSeq;
         seq = o.seq;
         windowConfiguration.setTo(o.windowConfiguration);
-        forceBoldText = o.forceBoldText;
+        fontWeightAdjustment = o.fontWeightAdjustment;
     }
 
     public String toString() {
@@ -1137,11 +1136,11 @@
         if (seq != 0) {
             sb.append(" s.").append(seq);
         }
-        if (forceBoldText != FORCE_BOLD_TEXT_UNDEFINED) {
-            sb.append(" boldText=");
-            sb.append(forceBoldText);
+        if (fontWeightAdjustment != FONT_WEIGHT_ADJUSTMENT_UNDEFINED) {
+            sb.append(" fontWeightAdjustment=");
+            sb.append(fontWeightAdjustment);
         } else {
-            sb.append(" ?boldText");
+            sb.append(" ?fontWeightAdjustment");
         }
         sb.append('}');
         return sb.toString();
@@ -1183,7 +1182,7 @@
             if (!persisted && windowConfiguration != null) {
                 windowConfiguration.dumpDebug(protoOutputStream, WINDOW_CONFIGURATION);
             }
-            protoOutputStream.write(FORCE_BOLD_TEXT, forceBoldText);
+            protoOutputStream.write(FONT_WEIGHT_ADJUSTMENT, fontWeightAdjustment);
         }
         protoOutputStream.write(ORIENTATION, orientation);
         protoOutputStream.write(SCREEN_WIDTH_DP, screenWidthDp);
@@ -1347,8 +1346,8 @@
                             Slog.e(TAG, "error parsing locale list in configuration.", e);
                         }
                         break;
-                    case (int) FORCE_BOLD_TEXT:
-                        forceBoldText = protoInputStream.readInt(FORCE_BOLD_TEXT);
+                    case (int) FONT_WEIGHT_ADJUSTMENT:
+                        fontWeightAdjustment = protoInputStream.readInt(FONT_WEIGHT_ADJUSTMENT);
                         break;
                 }
             }
@@ -1445,7 +1444,7 @@
         assetsSeq = ASSETS_SEQ_UNDEFINED;
         seq = 0;
         windowConfiguration.setToDefaults();
-        forceBoldText = FORCE_BOLD_TEXT_UNDEFINED;
+        fontWeightAdjustment = FONT_WEIGHT_ADJUSTMENT_UNDEFINED;
     }
 
     /**
@@ -1643,10 +1642,10 @@
             changed |= ActivityInfo.CONFIG_WINDOW_CONFIGURATION;
         }
 
-        if (delta.forceBoldText != FORCE_BOLD_TEXT_UNDEFINED
-                && delta.forceBoldText != forceBoldText) {
-            changed |= ActivityInfo.CONFIG_FORCE_BOLD_TEXT;
-            forceBoldText = delta.forceBoldText;
+        if (delta.fontWeightAdjustment != FONT_WEIGHT_ADJUSTMENT_UNDEFINED
+                && delta.fontWeightAdjustment != fontWeightAdjustment) {
+            changed |= ActivityInfo.CONFIG_FONT_WEIGHT_ADJUSTMENT;
+            fontWeightAdjustment = delta.fontWeightAdjustment;
         }
 
         return changed;
@@ -1727,8 +1726,8 @@
         if ((mask & ActivityInfo.CONFIG_WINDOW_CONFIGURATION) != 0) {
             windowConfiguration.setTo(delta.windowConfiguration, windowMask);
         }
-        if ((mask & ActivityInfo.CONFIG_FORCE_BOLD_TEXT) != 0) {
-            forceBoldText = delta.forceBoldText;
+        if ((mask & ActivityInfo.CONFIG_FONT_WEIGHT_ADJUSTMENT) != 0) {
+            fontWeightAdjustment = delta.fontWeightAdjustment;
         }
     }
 
@@ -1762,8 +1761,8 @@
      * PackageManager.ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE}.
      * {@link android.content.pm.ActivityInfo#CONFIG_LAYOUT_DIRECTION
      * PackageManager.ActivityInfo.CONFIG_LAYOUT_DIRECTION}.
-     * {@link android.content.pm.ActivityInfo#CONFIG_FORCE_BOLD_TEXT
-     *  PackageManager.ActivityInfo.CONFIG_FORCE_BOLD_TEXT.
+     * {@link android.content.pm.ActivityInfo#CONFIG_FONT_WEIGHT_ADJUSTMENT
+     *  PackageManager.ActivityInfo.CONFIG_FONT_WEIGHT_ADJUSTMENT.
      */
     public int diff(Configuration delta) {
         return diff(delta, false /* compareUndefined */, false /* publicOnly */);
@@ -1887,9 +1886,9 @@
             changed |= ActivityInfo.CONFIG_WINDOW_CONFIGURATION;
         }
 
-        if ((compareUndefined || delta.forceBoldText != FORCE_BOLD_TEXT_UNDEFINED)
-                && forceBoldText != delta.forceBoldText) {
-            changed |= ActivityInfo.CONFIG_FORCE_BOLD_TEXT;
+        if ((compareUndefined || delta.fontWeightAdjustment != FONT_WEIGHT_ADJUSTMENT_UNDEFINED)
+                && fontWeightAdjustment != delta.fontWeightAdjustment) {
+            changed |= ActivityInfo.CONFIG_FONT_WEIGHT_ADJUSTMENT;
         }
         return changed;
     }
@@ -1984,7 +1983,7 @@
         dest.writeValue(windowConfiguration);
         dest.writeInt(assetsSeq);
         dest.writeInt(seq);
-        dest.writeInt(forceBoldText);
+        dest.writeInt(fontWeightAdjustment);
     }
 
     public void readFromParcel(Parcel source) {
@@ -2016,7 +2015,7 @@
         windowConfiguration.setTo((WindowConfiguration) source.readValue(null));
         assetsSeq = source.readInt();
         seq = source.readInt();
-        forceBoldText = source.readInt();
+        fontWeightAdjustment = source.readInt();
     }
 
     public static final @android.annotation.NonNull Parcelable.Creator<Configuration> CREATOR
@@ -2115,7 +2114,7 @@
         if (n != 0) return n;
         n = windowConfiguration.compareTo(that.windowConfiguration);
         if (n != 0) return n;
-        n = this.forceBoldText - that.forceBoldText;
+        n = this.fontWeightAdjustment - that.fontWeightAdjustment;
         if (n != 0) return n;
 
         // if (n != 0) return n;
@@ -2157,7 +2156,7 @@
         result = 31 * result + smallestScreenWidthDp;
         result = 31 * result + densityDpi;
         result = 31 * result + assetsSeq;
-        result = 31 * result + forceBoldText;
+        result = 31 * result + fontWeightAdjustment;
         return result;
     }
 
@@ -2731,8 +2730,8 @@
             delta.windowConfiguration.setTo(change.windowConfiguration);
         }
 
-        if (base.forceBoldText != change.forceBoldText) {
-            delta.forceBoldText = change.forceBoldText;
+        if (base.fontWeightAdjustment != change.fontWeightAdjustment) {
+            delta.fontWeightAdjustment = change.fontWeightAdjustment;
         }
         return delta;
     }
@@ -2757,7 +2756,7 @@
     private static final String XML_ATTR_SMALLEST_WIDTH = "sw";
     private static final String XML_ATTR_DENSITY = "density";
     private static final String XML_ATTR_APP_BOUNDS = "app_bounds";
-    private static final String XML_ATTR_FORCE_BOLD_TEXT = "forceBoldText";
+    private static final String XML_ATTR_FONT_WEIGHT_ADJUSTMENT = "fontWeightAdjustment";
 
     /**
      * Reads the attributes corresponding to Configuration member fields from the Xml parser.
@@ -2807,8 +2806,8 @@
                         SMALLEST_SCREEN_WIDTH_DP_UNDEFINED);
         configOut.densityDpi = XmlUtils.readIntAttribute(parser, XML_ATTR_DENSITY,
                 DENSITY_DPI_UNDEFINED);
-        configOut.forceBoldText = XmlUtils.readIntAttribute(parser, XML_ATTR_FORCE_BOLD_TEXT,
-                FORCE_BOLD_TEXT_UNDEFINED);
+        configOut.fontWeightAdjustment = XmlUtils.readIntAttribute(parser,
+                XML_ATTR_FONT_WEIGHT_ADJUSTMENT, FONT_WEIGHT_ADJUSTMENT_UNDEFINED);
 
         // For persistence, we don't care about assetsSeq and WindowConfiguration, so do not read it
         // out.
diff --git a/core/java/android/hardware/biometrics/IBiometricSysuiReceiver.aidl b/core/java/android/hardware/biometrics/IBiometricSysuiReceiver.aidl
index 7a006c3..492ceeb 100644
--- a/core/java/android/hardware/biometrics/IBiometricSysuiReceiver.aidl
+++ b/core/java/android/hardware/biometrics/IBiometricSysuiReceiver.aidl
@@ -28,4 +28,6 @@
     void onDeviceCredentialPressed();
     // Notifies the client that an internal event, e.g. back button has occurred.
     void onSystemEvent(int event);
+    // Notifies that the dialog has finished animating in.
+    void onDialogAnimatedIn();
 }
diff --git a/core/java/android/hardware/camera2/CameraCaptureSession.java b/core/java/android/hardware/camera2/CameraCaptureSession.java
index f0a83f0..e858159 100644
--- a/core/java/android/hardware/camera2/CameraCaptureSession.java
+++ b/core/java/android/hardware/camera2/CameraCaptureSession.java
@@ -188,6 +188,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract void prepare(int maxCount, @NonNull Surface surface)
             throws CameraAccessException;
 
@@ -227,6 +228,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract void tearDown(@NonNull Surface surface) throws CameraAccessException;
 
     /**
diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java
index cd13707..37e1280 100644
--- a/core/java/android/hardware/camera2/CameraDevice.java
+++ b/core/java/android/hardware/camera2/CameraDevice.java
@@ -234,7 +234,7 @@
      * @see StreamConfigurationMap#getOutputFormats()
      * @see StreamConfigurationMap#getOutputSizes(int)
      * @see StreamConfigurationMap#getOutputSizes(Class)
-     * @deprecated Please use @{link
+     * @deprecated Please use {@link
      *      #createCaptureSession(android.hardware.camera2.params.SessionConfiguration)} for the
      *      full set of configuration options available.
      */
@@ -249,7 +249,7 @@
      *
      * @see #createCaptureSession
      * @see OutputConfiguration
-     * @deprecated Please use @{link
+     * @deprecated Please use {@link
      *      #createCaptureSession(android.hardware.camera2.params.SessionConfiguration)} for the
      *      full set of configuration options available.
      */
@@ -285,7 +285,7 @@
      * @see StreamConfigurationMap#getOutputSizes
      * @see android.media.ImageWriter
      * @see android.media.ImageReader
-     * @deprecated Please use @{link
+     * @deprecated Please use {@link
      *      #createCaptureSession(android.hardware.camera2.params.SessionConfiguration)} for the
      *      full set of configuration options available.
      */
@@ -302,7 +302,7 @@
      *
      * @see #createReprocessableCaptureSession
      * @see OutputConfiguration
-     * @deprecated Please use @{link
+     * @deprecated Please use {@link
      *      #createCaptureSession(android.hardware.camera2.params.SessionConfiguration)} for the
      *      full set of configuration options available.
      */
@@ -340,7 +340,7 @@
      * @see CameraCaptureSession#captureBurst
      * @see CameraCaptureSession#setRepeatingBurst
      * @see CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList
-     * @deprecated Please use @{link
+     * @deprecated Please use {@link
      *      #createCaptureSession(android.hardware.camera2.params.SessionConfiguration)} for the
      *      full set of configuration options available.
      */
@@ -413,7 +413,7 @@
      * @see #createReprocessableCaptureSession
      * @see CameraCaptureSession
      * @see OutputConfiguration
-     * @deprecated Please use @{link
+     * @deprecated Please use {@link
      *      #createCaptureSession(android.hardware.camera2.params.SessionConfiguration)} for the
      *      full set of configuration options available.
      * @hide
diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java
index 500b299..f1534d9 100644
--- a/core/java/android/hardware/hdmi/HdmiControlManager.java
+++ b/core/java/android/hardware/hdmi/HdmiControlManager.java
@@ -577,7 +577,7 @@
      */
     @Nullable
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public HdmiClient getClient(int type) {
         if (mService == null) {
             return null;
@@ -610,7 +610,7 @@
      */
     @Nullable
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public HdmiPlaybackClient getPlaybackClient() {
         return (HdmiPlaybackClient) getClient(HdmiDeviceInfo.DEVICE_PLAYBACK);
     }
@@ -628,7 +628,7 @@
      */
     @Nullable
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public HdmiTvClient getTvClient() {
         return (HdmiTvClient) getClient(HdmiDeviceInfo.DEVICE_TV);
     }
@@ -646,7 +646,7 @@
      * @hide
      */
     @Nullable
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public HdmiAudioSystemClient getAudioSystemClient() {
         return (HdmiAudioSystemClient) getClient(HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
     }
@@ -661,7 +661,7 @@
      * @return {@link HdmiSwitchClient} instance. {@code null} on failure.
      */
     @Nullable
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public HdmiSwitchClient getSwitchClient() {
         return (HdmiSwitchClient) getClient(HdmiDeviceInfo.DEVICE_PURE_CEC_SWITCH);
     }
diff --git a/core/java/android/hardware/iris/IIrisService.aidl b/core/java/android/hardware/iris/IIrisService.aidl
index b9eca3b..3d26318 100644
--- a/core/java/android/hardware/iris/IIrisService.aidl
+++ b/core/java/android/hardware/iris/IIrisService.aidl
@@ -22,5 +22,5 @@
  */
 interface IIrisService {
     // Give IrisService its ID. See AuthService.java
-    void initializeConfiguration(int sensorId);
+    void initializeConfiguration(int sensorId, int strength);
 }
diff --git a/core/java/android/hardware/location/ContextHubManager.java b/core/java/android/hardware/location/ContextHubManager.java
index 1ed791d..d444807 100644
--- a/core/java/android/hardware/location/ContextHubManager.java
+++ b/core/java/android/hardware/location/ContextHubManager.java
@@ -654,7 +654,7 @@
      *             register a {@link android.hardware.location.ContextHubClientCallback}.
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public int registerCallback(@NonNull Callback callback) {
         return registerCallback(callback, null);
     }
@@ -688,7 +688,7 @@
      *             register a {@link android.hardware.location.ContextHubClientCallback}.
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public int registerCallback(Callback callback, Handler handler) {
         synchronized(this) {
             if (mCallback != null) {
@@ -892,7 +892,7 @@
      * @deprecated Use {@link android.hardware.location.ContextHubClient#close()} to unregister
      *             a {@link android.hardware.location.ContextHubClientCallback}.
      */
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     @Deprecated
     public int unregisterCallback(@NonNull Callback callback) {
       synchronized(this) {
diff --git a/core/java/android/hardware/radio/RadioTuner.java b/core/java/android/hardware/radio/RadioTuner.java
index 0edd055..969db96 100644
--- a/core/java/android/hardware/radio/RadioTuner.java
+++ b/core/java/android/hardware/radio/RadioTuner.java
@@ -257,6 +257,7 @@
      * @throws IllegalArgumentException if id==0
      * @hide This API is not thoroughly elaborated yet
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract @Nullable Bitmap getMetadataImage(int id);
 
     /**
diff --git a/core/java/android/hardware/usb/IUsbManager.aidl b/core/java/android/hardware/usb/IUsbManager.aidl
index e32865e..ca79901 100644
--- a/core/java/android/hardware/usb/IUsbManager.aidl
+++ b/core/java/android/hardware/usb/IUsbManager.aidl
@@ -118,6 +118,12 @@
     /* Gets the current USB functions. */
     long getCurrentFunctions();
 
+    /* Gets the current USB Speed. */
+    int getCurrentUsbSpeed();
+
+    /* Gets the Gadget Hal Version. */
+    int getGadgetHalVersion();
+
     /* Sets the screen unlocked USB function(s), which will be set automatically
      * when the screen is unlocked.
      */
diff --git a/core/java/android/hardware/usb/UsbDeviceConnection.java b/core/java/android/hardware/usb/UsbDeviceConnection.java
index 21634cc..1c35cb6 100644
--- a/core/java/android/hardware/usb/UsbDeviceConnection.java
+++ b/core/java/android/hardware/usb/UsbDeviceConnection.java
@@ -299,7 +299,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public boolean resetDevice() {
         return native_reset_device();
     }
diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java
index 62a5782..aac57fe 100644
--- a/core/java/android/hardware/usb/UsbManager.java
+++ b/core/java/android/hardware/usb/UsbManager.java
@@ -18,6 +18,7 @@
 package android.hardware.usb;
 
 import android.Manifest;
+import android.annotation.IntDef;
 import android.annotation.LongDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -34,6 +35,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.hardware.usb.gadget.V1_0.GadgetFunction;
+import android.hardware.usb.gadget.V1_2.UsbSpeed;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.ParcelFileDescriptor;
@@ -288,6 +290,34 @@
     public static final String USB_FUNCTION_NCM = "ncm";
 
     /**
+     * Name of Gadget Hal Not Present;
+     *
+     * {@hide}
+     */
+    public static final String GADGET_HAL_UNKNOWN = "unknown";
+
+    /**
+     * Name of the USB Gadget Hal Version v1.0;
+     *
+     * {@hide}
+     */
+    public static final String GADGET_HAL_VERSION_1_0 = "V1_0";
+
+    /**
+     * Name of the USB Gadget Hal Version v1.1;
+     *
+     * {@hide}
+     */
+    public static final String GADGET_HAL_VERSION_1_1 = "V1_1";
+
+    /**
+     * Name of the USB Gadget Hal Version v1.2;
+     *
+     * {@hide}
+     */
+    public static final String GADGET_HAL_VERSION_1_2 = "V1_2";
+
+    /**
      * Name of extra for {@link #ACTION_USB_PORT_CHANGED}
      * containing the {@link UsbPort} object for the port.
      *
@@ -390,6 +420,102 @@
     public static final String EXTRA_CAN_BE_DEFAULT = "android.hardware.usb.extra.CAN_BE_DEFAULT";
 
     /**
+     * The Value for USB gadget hal is not presented.
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public static final int GADGET_HAL_NOT_SUPPORTED = -1;
+
+    /**
+     * Value for Gadget Hal Version v1.0.
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public static final int GADGET_HAL_V1_0 = 10;
+
+    /**
+     * Value for Gadget Hal Version v1.1.
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public static final int GADGET_HAL_V1_1 = 11;
+
+    /**
+     * Value for Gadget Hal Version v1.2.
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public static final int GADGET_HAL_V1_2 = 12;
+
+    /**
+     * Value for USB_STATE is not configured.
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public static final int USB_DATA_TRANSFER_RATE_UNKNOWN = -1;
+
+    /**
+     * Value for USB Transfer Rate of Low Speed in Mbps (real value is 1.5Mbps).
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public static final int USB_DATA_TRANSFER_RATE_LOW_SPEED = 2;
+
+    /**
+     * Value for USB Transfer Rate of Full Speed in Mbps.
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public static final int USB_DATA_TRANSFER_RATE_FULL_SPEED = 12;
+
+    /**
+     * Value for USB Transfer Rate of High Speed in Mbps.
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public static final int USB_DATA_TRANSFER_RATE_HIGH_SPEED = 480;
+
+    /**
+     * Value for USB Transfer Rate of Super Speed in Mbps.
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public static final int USB_DATA_TRANSFER_RATE_5G = 5 * 1024;
+
+    /**
+     * Value for USB Transfer Rate of 10G.
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public static final int USB_DATA_TRANSFER_RATE_10G = 10 * 1024;
+
+    /**
+     * Value for USB Transfer Rate of 20G.
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public static final int USB_DATA_TRANSFER_RATE_20G = 20 * 1024;
+
+    /**
+     * Value for USB Transfer Rate of 40G.
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public static final int USB_DATA_TRANSFER_RATE_40G = 40 * 1024;
+
+    /**
      * Code for the charging usb function. Passed into {@link #setCurrentFunctions(long)}
      * {@hide}
      */
@@ -482,6 +608,15 @@
     })
     public @interface UsbFunctionMode {}
 
+    /** @hide */
+    @IntDef(flag = true, prefix = { "GADGET_HAL_" }, value = {
+            GADGET_HAL_NOT_SUPPORTED,
+            GADGET_HAL_V1_0,
+            GADGET_HAL_V1_1,
+            GADGET_HAL_V1_2,
+    })
+    public @interface UsbGadgetHalVersion {}
+
     private final Context mContext;
     private final IUsbManager mService;
 
@@ -894,6 +1029,53 @@
     }
 
     /**
+     * Get the Current USB Bandwidth.
+     * <p>
+     * This function returns the current USB bandwidth through USB Gadget HAL.
+     * It should be used when Android device is in USB peripheral mode and
+     * connects to a USB host. If USB state is not configued, API will return
+     * {@value #USB_DATA_TRANSFER_RATE_UNKNOWN}. In addition, the unit of the
+     * return value is Mbps.
+     * </p>
+     *
+     * @return The value of currently USB Bandwidth.
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public int getUsbBandwidth() {
+        int usbSpeed;
+
+        try {
+            usbSpeed = mService.getCurrentUsbSpeed();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+
+        return usbSpeedToBandwidth(usbSpeed);
+    }
+
+    /**
+     * Get the Current Gadget Hal Version.
+     * <p>
+     * This function returns the current Gadget Hal Version.
+     * </p>
+     *
+     * @return a integer {@code GADGET_HAL_*} represent hal version.
+     *
+     * {@hide}
+     */
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    @RequiresPermission(Manifest.permission.MANAGE_USB)
+    public @UsbGadgetHalVersion int getGadgetHalVersion() {
+        try {
+            return mService.getGadgetHalVersion();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * Resets the USB Gadget.
      * <p>
      * Performs USB data stack reset through USB Gadget HAL.
@@ -1084,4 +1266,61 @@
         }
         return ret;
     }
+
+    /**
+     * Converts the given integer of USB speed to corresponding bandwidth.
+     *
+     * @return a value of USB bandwidth
+     *
+     * {@hide}
+     */
+    public static int usbSpeedToBandwidth(int speed) {
+        switch (speed) {
+            case UsbSpeed.USB4_GEN3_40Gb:
+                return USB_DATA_TRANSFER_RATE_40G;
+            case UsbSpeed.USB4_GEN3_20Gb:
+                return USB_DATA_TRANSFER_RATE_20G;
+            case UsbSpeed.USB4_GEN2_20Gb:
+                return USB_DATA_TRANSFER_RATE_20G;
+            case UsbSpeed.USB4_GEN2_10Gb:
+                return USB_DATA_TRANSFER_RATE_10G;
+            case UsbSpeed.SUPERSPEED_20Gb:
+                return USB_DATA_TRANSFER_RATE_20G;
+            case UsbSpeed.SUPERSPEED_10Gb:
+                return USB_DATA_TRANSFER_RATE_10G;
+            case UsbSpeed.SUPERSPEED:
+                return USB_DATA_TRANSFER_RATE_5G;
+            case UsbSpeed.HIGHSPEED:
+                return USB_DATA_TRANSFER_RATE_HIGH_SPEED;
+            case UsbSpeed.FULLSPEED:
+                return USB_DATA_TRANSFER_RATE_FULL_SPEED;
+            case UsbSpeed.LOWSPEED:
+                return USB_DATA_TRANSFER_RATE_LOW_SPEED;
+            default:
+                return USB_DATA_TRANSFER_RATE_UNKNOWN;
+        }
+    }
+
+    /**
+     * Converts the given usb gadgdet hal version to String
+     *
+     * @return String representation of Usb Gadget Hal Version
+     *
+     * {@hide}
+     */
+    public static @NonNull String usbGadgetHalVersionToString(int version) {
+        String halVersion;
+
+        if (version == GADGET_HAL_V1_2) {
+            halVersion = GADGET_HAL_VERSION_1_2;
+        } else if (version == GADGET_HAL_V1_1) {
+            halVersion = GADGET_HAL_VERSION_1_1;
+        } else if (version == GADGET_HAL_V1_0) {
+            halVersion = GADGET_HAL_VERSION_1_0;
+        } else {
+            halVersion = GADGET_HAL_UNKNOWN;
+        }
+
+        return halVersion;
+    }
 }
diff --git a/core/java/android/inputmethodservice/AbstractInputMethodService.java b/core/java/android/inputmethodservice/AbstractInputMethodService.java
index 3ca5207..cd43637 100644
--- a/core/java/android/inputmethodservice/AbstractInputMethodService.java
+++ b/core/java/android/inputmethodservice/AbstractInputMethodService.java
@@ -202,6 +202,7 @@
      * @param args The arguments passed to the dump method.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     abstract void dumpProtoInternal(FileDescriptor fd, String[] args);
 
     /**
diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java
index a985e93..4e019cf 100644
--- a/core/java/android/net/TrafficStats.java
+++ b/core/java/android/net/TrafficStats.java
@@ -301,7 +301,7 @@
      * Changes only take effect during subsequent calls to
      * {@link #tagSocket(Socket)}.
      */
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public static void setThreadStatsUid(int uid) {
         NetworkManagementSocketTagger.setThreadSocketStatsUid(uid);
     }
@@ -339,7 +339,7 @@
      *
      * @see #setThreadStatsUid(int)
      */
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public static void clearThreadStatsUid() {
         NetworkManagementSocketTagger.setThreadSocketStatsUid(-1);
     }
@@ -976,11 +976,17 @@
         }
     }
 
-    // NOTE: keep these in sync with android_net_TrafficStats.cpp
-    private static final int TYPE_RX_BYTES = 0;
-    private static final int TYPE_RX_PACKETS = 1;
-    private static final int TYPE_TX_BYTES = 2;
-    private static final int TYPE_TX_PACKETS = 3;
-    private static final int TYPE_TCP_RX_PACKETS = 4;
-    private static final int TYPE_TCP_TX_PACKETS = 5;
+    // NOTE: keep these in sync with {@code com_android_server_net_NetworkStatsService.cpp}.
+    /** {@hide} */
+    public static final int TYPE_RX_BYTES = 0;
+    /** {@hide} */
+    public static final int TYPE_RX_PACKETS = 1;
+    /** {@hide} */
+    public static final int TYPE_TX_BYTES = 2;
+    /** {@hide} */
+    public static final int TYPE_TX_PACKETS = 3;
+    /** {@hide} */
+    public static final int TYPE_TCP_RX_PACKETS = 4;
+    /** {@hide} */
+    public static final int TYPE_TCP_TX_PACKETS = 5;
 }
diff --git a/core/java/android/os/BugreportManager.java b/core/java/android/os/BugreportManager.java
index fe4d729..46ad7b8 100644
--- a/core/java/android/os/BugreportManager.java
+++ b/core/java/android/os/BugreportManager.java
@@ -26,7 +26,6 @@
 import android.annotation.SystemService;
 import android.app.ActivityManager;
 import android.content.Context;
-import android.content.Intent;
 import android.os.Handler;
 import android.util.Log;
 import android.widget.Toast;
@@ -52,8 +51,6 @@
 public final class BugreportManager {
 
     private static final String TAG = "BugreportManager";
-    private static final String INTENT_UI_INTENSIVE_BUGREPORT_DUMPS_FINISHED =
-            "com.android.internal.intent.action.UI_INTENSIVE_BUGREPORT_DUMPS_FINISHED";
 
     private final Context mContext;
     private final IDumpstate mBinder;
@@ -126,6 +123,12 @@
          * Called when taking bugreport finishes successfully.
          */
         public void onFinished() {}
+
+        /**
+         * Called when it is ready for calling app to show UI, showing any extra UI before this
+         * callback can interfere with bugreport generation.
+         */
+        public void onEarlyReportFinished() {}
     }
 
     /**
@@ -288,21 +291,12 @@
         }
 
         @Override
-        public void onUiIntensiveBugreportDumpsFinished(String callingPackage)
+        public void onUiIntensiveBugreportDumpsFinished()
                 throws RemoteException {
             final long identity = Binder.clearCallingIdentity();
             try {
                 mExecutor.execute(() -> {
-                    // Send intent to let calling app to show UI safely without interfering with
-                    // the bugreport/screenshot generation.
-                    // TODO(b/154298410): When S is ready for API change, add a method in
-                    // BugreportCallback so we can just call the callback instead of using
-                    // broadcast.
-                    Intent intent = new Intent(INTENT_UI_INTENSIVE_BUGREPORT_DUMPS_FINISHED);
-                    intent.setPackage(callingPackage);
-                    intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-                    intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
-                    mContext.sendBroadcast(intent, android.Manifest.permission.DUMP);
+                    mCallback.onEarlyReportFinished();
                 });
             } finally {
                 Binder.restoreCallingIdentity(identity);
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
index d151c16..5db4107 100644
--- a/core/java/android/os/FileUtils.java
+++ b/core/java/android/os/FileUtils.java
@@ -1436,7 +1436,10 @@
     public static FileDescriptor convertToModernFd(FileDescriptor fd) {
         try {
             Context context = AppGlobals.getInitialApplication();
-            if (UserHandle.getAppId(Process.myUid()) == getMediaProviderAppId(context)) {
+            if (!SystemProperties.getBoolean("persist.sys.fuse.transcode", false)
+                    || !SystemProperties.getBoolean("persist.sys.fuse.transcode_optimize", true)
+                    || UserHandle.getAppId(Process.myUid()) == getMediaProviderAppId(context)) {
+                // If transcode is enabled we optimize by default, unless explicitly disabled.
                 // Never convert modern fd for MediaProvider, because this requires
                 // MediaStore#scanFile and can cause infinite loops when MediaProvider scans
                 return null;
diff --git a/core/java/android/os/IBinder.java b/core/java/android/os/IBinder.java
index d91c458..010459d 100644
--- a/core/java/android/os/IBinder.java
+++ b/core/java/android/os/IBinder.java
@@ -170,6 +170,15 @@
     int FLAG_ONEWAY             = 0x00000001;
 
     /**
+     * Flag to {@link #transact}: request binder driver to clear transaction data.
+     *
+     * Be very careful when using this flag in Java, since Java objects read from a Java
+     * Parcel may be non-trivial to clear.
+     * @hide
+     */
+    int FLAG_CLEAR_BUF          = 0x00000020;
+
+    /**
      * @hide
      */
     int FLAG_COLLECT_NOTED_APP_OPS = 0x00000002;
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index a04fcb5..5242750 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -300,6 +300,8 @@
     private static final int EX_TRANSACTION_FAILED = -129;
 
     @CriticalNative
+    private static native void nativeMarkSensitive(long nativePtr);
+    @CriticalNative
     private static native int nativeDataSize(long nativePtr);
     @CriticalNative
     private static native int nativeDataAvail(long nativePtr);
@@ -522,6 +524,14 @@
     public static native long getGlobalAllocCount();
 
     /**
+     * Parcel data should be zero'd before realloc'd or deleted.
+     * @hide
+     */
+    public final void markSensitive() {
+        nativeMarkSensitive(mNativePtr);
+    }
+
+    /**
      * Returns the total amount of data contained in the parcel.
      */
     public final int dataSize() {
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 13b30f4..72cd8ba 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -422,7 +422,7 @@
      * {@hide}
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public static boolean verifyPackageCompatibility(File compatibilityFile) throws IOException {
         try (InputStream inputStream = new FileInputStream(compatibilityFile)) {
             return verifyPackageCompatibility(inputStream);
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 5d3c66c..cfc3e01 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -2215,7 +2215,7 @@
     /** @hide */
     @SystemApi
     @WorkerThread
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public long getAllocatableBytes(@NonNull UUID storageUuid,
             @RequiresPermission @AllocateFlags int flags) throws IOException {
         try {
@@ -2264,7 +2264,7 @@
     /** @hide */
     @SystemApi
     @WorkerThread
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void allocateBytes(@NonNull UUID storageUuid, @BytesLong long bytes,
             @RequiresPermission @AllocateFlags int flags) throws IOException {
         try {
@@ -2314,7 +2314,7 @@
     /** @hide */
     @SystemApi
     @WorkerThread
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void allocateBytes(FileDescriptor fd, @BytesLong long bytes,
             @RequiresPermission @AllocateFlags int flags) throws IOException {
         final File file = ParcelFileDescriptor.getFile(fd);
diff --git a/core/java/android/permission/IPermissionManager.aidl b/core/java/android/permission/IPermissionManager.aidl
index e231021..1001668 100644
--- a/core/java/android/permission/IPermissionManager.aidl
+++ b/core/java/android/permission/IPermissionManager.aidl
@@ -29,8 +29,6 @@
  * @hide
  */
 interface IPermissionManager {
-    String[] getAppOpPermissionPackages(String permName);
-
     ParceledListSlice getAllPermissionGroups(int flags);
 
     PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags);
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 8093ff5..3e48168 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3580,8 +3580,9 @@
             if (outConfig.fontScale < 0) {
                 outConfig.fontScale = DEFAULT_FONT_SCALE;
             }
-            outConfig.forceBoldText = Settings.Secure.getIntForUser(
-                    cr, Settings.Secure.FORCE_BOLD_TEXT, Configuration.FORCE_BOLD_TEXT_NO,
+            outConfig.fontWeightAdjustment = Settings.Secure.getIntForUser(
+                    cr, Settings.Secure.FONT_WEIGHT_ADJUSTMENT,
+                    Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED,
                     userHandle);
 
             final String localeValue =
@@ -3613,7 +3614,7 @@
             if (!inoutConfig.userSetLocale && !inoutConfig.getLocales().isEmpty()) {
                 inoutConfig.clearLocales();
             }
-            inoutConfig.forceBoldText = Configuration.FORCE_BOLD_TEXT_UNDEFINED;
+            inoutConfig.fontWeightAdjustment = Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED;
         }
 
         /**
@@ -6814,17 +6815,16 @@
         public static final String KEYGUARD_SLICE_URI = "keyguard_slice_uri";
 
         /**
-         * Whether to draw text in bold.
+         * The adjustment in font weight. This is used to draw text in bold.
          *
-         * <p>Values:
-         *  1 - Text is not displayed in bold. (Default)
-         *  2 - Text is displayed in bold.
+         * <p> This value can be negative. To display bolded text, the adjustment used is 300,
+         * which is the difference between
+         * {@link android.graphics.fonts.FontStyle#FONT_WEIGHT_NORMAL} and
+         * {@link android.graphics.fonts.FontStyle#FONT_WEIGHT_BOLD}.
          *
-         * @see Configuration#FORCE_BOLD_TEXT_NO
-         * @see Configuration#FORCE_BOLD_TEXT_YES
          * @hide
          */
-        public static final String FORCE_BOLD_TEXT = "force_bold_text";
+        public static final String FONT_WEIGHT_ADJUSTMENT = "font_weight_adjustment";
 
         /**
          * Whether to speak passwords while in accessibility mode.
diff --git a/core/java/android/service/autofill/InternalTransformation.java b/core/java/android/service/autofill/InternalTransformation.java
index 0dba2b9..d31ea99 100644
--- a/core/java/android/service/autofill/InternalTransformation.java
+++ b/core/java/android/service/autofill/InternalTransformation.java
@@ -45,6 +45,7 @@
      * @param template the {@link RemoteViews presentation template}.
      * @param childViewId resource id of the child view inside the template.
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     abstract void apply(@NonNull ValueFinder finder, @NonNull RemoteViews template,
             int childViewId) throws Exception;
 
diff --git a/core/java/android/service/persistentdata/PersistentDataBlockManager.java b/core/java/android/service/persistentdata/PersistentDataBlockManager.java
index 0bf68b7..8242f4e 100644
--- a/core/java/android/service/persistentdata/PersistentDataBlockManager.java
+++ b/core/java/android/service/persistentdata/PersistentDataBlockManager.java
@@ -90,7 +90,7 @@
      *
      * @param data the data to write
      */
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public int write(byte[] data) {
         try {
             return sService.write(data);
@@ -102,7 +102,7 @@
     /**
      * Returns the data block stored on the persistent partition.
      */
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public byte[] read() {
         try {
             return sService.read();
@@ -130,7 +130,7 @@
      *
      * Returns -1 on error.
      */
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public long getMaximumDataBlockSize() {
         try {
             return sService.getMaximumDataBlockSize();
diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
index b94031a..46a5caf 100644
--- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java
+++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
@@ -40,7 +40,9 @@
 import android.media.AudioFormat;
 import android.media.permission.Identity;
 import android.os.AsyncTask;
+import android.os.Binder;
 import android.os.Handler;
+import android.os.IBinder;
 import android.os.Message;
 import android.os.RemoteException;
 import android.util.Slog;
@@ -246,6 +248,7 @@
     private final Callback mExternalCallback;
     private final Object mLock = new Object();
     private final Handler mHandler;
+    private final IBinder mBinder = new Binder();
 
     private int mAvailability = STATE_NOT_READY;
 
@@ -450,7 +453,7 @@
             Identity identity = new Identity();
             identity.packageName = ActivityThread.currentOpPackageName();
             mSoundTriggerSession = mModelManagementService.createSoundTriggerSessionAsOriginator(
-                    identity);
+                    identity, mBinder);
         } catch (RemoteException e) {
             throw e.rethrowAsRuntimeException();
         }
diff --git a/core/java/android/util/CharsetUtils.java b/core/java/android/util/CharsetUtils.java
index 80c2055..fa14667 100644
--- a/core/java/android/util/CharsetUtils.java
+++ b/core/java/android/util/CharsetUtils.java
@@ -31,34 +31,48 @@
  */
 public class CharsetUtils {
     /**
-     * Attempt to encode the given string as UTF-8 into the destination byte
-     * array without making any new allocations.
+     * Attempt to encode the given string as modified UTF-8 into the destination
+     * byte array without making any new allocations.
      *
      * @param src string value to be encoded
      * @param dest destination byte array to encode into
      * @param destOff offset into destination where encoding should begin
      * @param destLen length of destination
-     * @return the number of bytes written to the destination when encoded
-     *         successfully, otherwise {@code -1} if not large enough
+     * @return positive value when encoding succeeded, or negative value when
+     *         failed; the magnitude of the value is the number of bytes
+     *         required to encode the string.
      */
-    public static int toUtf8Bytes(@NonNull String src,
+    public static int toModifiedUtf8Bytes(@NonNull String src,
             long dest, int destOff, int destLen) {
-        return toUtf8Bytes(src, src.length(), dest, destOff, destLen);
+        return toModifiedUtf8Bytes(src, src.length(), dest, destOff, destLen);
     }
 
     /**
-     * Attempt to encode the given string as UTF-8 into the destination byte
-     * array without making any new allocations.
+     * Attempt to encode the given string as modified UTF-8 into the destination
+     * byte array without making any new allocations.
      *
      * @param src string value to be encoded
      * @param srcLen exact length of string to be encoded
      * @param dest destination byte array to encode into
      * @param destOff offset into destination where encoding should begin
      * @param destLen length of destination
-     * @return the number of bytes written to the destination when encoded
-     *         successfully, otherwise {@code -1} if not large enough
+     * @return positive value when encoding succeeded, or negative value when
+     *         failed; the magnitude of the value is the number of bytes
+     *         required to encode the string.
      */
     @FastNative
-    private static native int toUtf8Bytes(@NonNull String src, int srcLen,
+    private static native int toModifiedUtf8Bytes(@NonNull String src, int srcLen,
             long dest, int destOff, int destLen);
+
+    /**
+     * Attempt to decode a modified UTF-8 string from the source byte array.
+     *
+     * @param src source byte array to decode from
+     * @param srcOff offset into source where decoding should begin
+     * @param srcLen length of source that should be decoded
+     * @return the successfully decoded string
+     */
+    @FastNative
+    public static native @NonNull String fromModifiedUtf8Bytes(
+            long src, int srcOff, int srcLen);
 }
diff --git a/core/java/android/uwb/RangingParams.java b/core/java/android/uwb/RangingParams.java
deleted file mode 100644
index f23d9ed..0000000
--- a/core/java/android/uwb/RangingParams.java
+++ /dev/null
@@ -1,477 +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.uwb;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.PersistableBundle;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.time.Duration;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-
-/**
- * An object used when requesting to open a new {@link RangingSession}.
- * <p>Use {@link RangingParams.Builder} to create an instance of this class.
- *
- *  @hide
- */
-public final class RangingParams implements Parcelable {
-    private final boolean mIsInitiator;
-    private final boolean mIsController;
-    private final Duration mSamplePeriod;
-    private final UwbAddress mLocalDeviceAddress;
-    private final List<UwbAddress> mRemoteDeviceAddresses;
-    private final int mChannelNumber;
-    private final int mTransmitPreambleCodeIndex;
-    private final int mReceivePreambleCodeIndex;
-    private final int mStsPhyPacketType;
-    private final PersistableBundle mSpecificationParameters;
-
-    private RangingParams(boolean isInitiator, boolean isController,
-            @NonNull Duration samplingPeriod, @NonNull UwbAddress localDeviceAddress,
-            @NonNull List<UwbAddress> remoteDeviceAddresses, int channelNumber,
-            int transmitPreambleCodeIndex, int receivePreambleCodeIndex,
-            @StsPhyPacketType int stsPhyPacketType,
-            @NonNull PersistableBundle specificationParameters) {
-        mIsInitiator = isInitiator;
-        mIsController = isController;
-        mSamplePeriod = samplingPeriod;
-        mLocalDeviceAddress = localDeviceAddress;
-        mRemoteDeviceAddresses = remoteDeviceAddresses;
-        mChannelNumber = channelNumber;
-        mTransmitPreambleCodeIndex = transmitPreambleCodeIndex;
-        mReceivePreambleCodeIndex = receivePreambleCodeIndex;
-        mStsPhyPacketType = stsPhyPacketType;
-        mSpecificationParameters = specificationParameters;
-    }
-
-    /**
-     * Get if the local device is the initiator
-     *
-     * @return true if the device is the initiator
-     */
-    public boolean isInitiator() {
-        return mIsInitiator;
-    }
-
-    /**
-     * Get if the local device is the controller
-     *
-     * @return true if the device is the controller
-     */
-    public boolean isController() {
-        return mIsController;
-    }
-
-    /**
-     * The desired amount of time between two adjacent samples of measurement
-     *
-     * @return the ranging sample period
-     */
-    @NonNull
-    public Duration getSamplingPeriod() {
-        return mSamplePeriod;
-    }
-
-    /**
-     * Local device's {@link UwbAddress}
-     *
-     * <p>Simultaneous {@link RangingSession}s on the same device can have different results for
-     * {@link #getLocalDeviceAddress()}.
-     *
-     * @return the local device's {@link UwbAddress}
-     */
-    @NonNull
-    public UwbAddress getLocalDeviceAddress() {
-        return mLocalDeviceAddress;
-    }
-
-    /**
-     * Gets a list of all remote device's {@link UwbAddress}
-     *
-     * @return a {@link List} of {@link UwbAddress} representing the remote devices
-     */
-    @NonNull
-    public List<UwbAddress> getRemoteDeviceAddresses() {
-        return mRemoteDeviceAddresses;
-    }
-
-    /**
-     * Channel number used between this device pair as defined by 802.15.4z
-     *
-     * Range: -1, 0-15
-     *
-     * @return the channel to use
-     */
-    public int getChannelNumber() {
-        return mChannelNumber;
-    }
-
-    /**
-     * Preamble index used between this device pair as defined by 802.15.4z
-     *
-     * Range: 0, 0-32
-     *
-     * @return the preamble index to use for transmitting
-     */
-    public int getTxPreambleIndex() {
-        return mTransmitPreambleCodeIndex;
-    }
-
-    /**
-     * preamble index used between this device pair as defined by 802.15.4z
-     *
-     * Range: 0, 13-16, 21-32
-     *
-     * @return the preamble index to use for receiving
-     */
-    public int getRxPreambleIndex() {
-        return mReceivePreambleCodeIndex;
-    }
-
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(value = {
-            STS_PHY_PACKET_TYPE_SP0,
-            STS_PHY_PACKET_TYPE_SP1,
-            STS_PHY_PACKET_TYPE_SP2,
-            STS_PHY_PACKET_TYPE_SP3})
-    public @interface StsPhyPacketType {}
-
-    /**
-     * PHY packet type SP0 when STS is used as defined by 802.15.4z
-     */
-    public static final int STS_PHY_PACKET_TYPE_SP0 = 0;
-
-    /**
-     * PHY packet type SP1 when STS is used as defined by 802.15.4z
-     */
-    public static final int STS_PHY_PACKET_TYPE_SP1 = 1;
-
-    /**
-     * PHY packet type SP2 when STS is used as defined by 802.15.4z
-     */
-    public static final int STS_PHY_PACKET_TYPE_SP2 = 2;
-
-    /**
-     * PHY packet type SP3 when STS is used as defined by 802.15.4z
-     */
-    public static final int STS_PHY_PACKET_TYPE_SP3 = 3;
-
-    /**
-     * Get the type of PHY packet when STS is used as defined by 802.15.4z
-     *
-     * @return the {@link StsPhyPacketType} to use
-     */
-    @StsPhyPacketType
-    public int getStsPhyPacketType() {
-        return mStsPhyPacketType;
-    }
-
-    /**
-     * Parameters for a specific UWB protocol constructed using a support library.
-     *
-     * <p>Android reserves the '^android.*' namespace
-     *
-     * @return a {@link PersistableBundle} copy of protocol specific parameters
-     */
-    public @Nullable PersistableBundle getSpecificationParameters() {
-        return new PersistableBundle(mSpecificationParameters);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public boolean equals(@Nullable Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (obj instanceof RangingParams) {
-            RangingParams other = (RangingParams) obj;
-
-            return mIsInitiator == other.mIsInitiator
-                    && mIsController == other.mIsController
-                    && mSamplePeriod.equals(other.mSamplePeriod)
-                    && mLocalDeviceAddress.equals(other.mLocalDeviceAddress)
-                    && mRemoteDeviceAddresses.equals(other.mRemoteDeviceAddresses)
-                    && mChannelNumber == other.mChannelNumber
-                    && mTransmitPreambleCodeIndex == other.mTransmitPreambleCodeIndex
-                    && mReceivePreambleCodeIndex == other.mReceivePreambleCodeIndex
-                    && mStsPhyPacketType == other.mStsPhyPacketType
-                    && mSpecificationParameters.size() == other.mSpecificationParameters.size()
-                    && mSpecificationParameters.kindofEquals(other.mSpecificationParameters);
-        }
-        return false;
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public int hashCode() {
-        return Objects.hash(mIsInitiator, mIsController, mSamplePeriod, mLocalDeviceAddress,
-                mRemoteDeviceAddresses, mChannelNumber, mTransmitPreambleCodeIndex,
-                mReceivePreambleCodeIndex, mStsPhyPacketType, mSpecificationParameters);
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeBoolean(mIsInitiator);
-        dest.writeBoolean(mIsController);
-        dest.writeLong(mSamplePeriod.getSeconds());
-        dest.writeInt(mSamplePeriod.getNano());
-        dest.writeParcelable(mLocalDeviceAddress, flags);
-
-        UwbAddress[] remoteAddresses = new UwbAddress[mRemoteDeviceAddresses.size()];
-        mRemoteDeviceAddresses.toArray(remoteAddresses);
-        dest.writeParcelableArray(remoteAddresses, flags);
-
-        dest.writeInt(mChannelNumber);
-        dest.writeInt(mTransmitPreambleCodeIndex);
-        dest.writeInt(mReceivePreambleCodeIndex);
-        dest.writeInt(mStsPhyPacketType);
-        dest.writePersistableBundle(mSpecificationParameters);
-    }
-
-    public static final @android.annotation.NonNull Creator<RangingParams> CREATOR =
-            new Creator<RangingParams>() {
-                @Override
-                public RangingParams createFromParcel(Parcel in) {
-                    Builder builder = new Builder();
-                    builder.setIsInitiator(in.readBoolean());
-                    builder.setIsController(in.readBoolean());
-                    builder.setSamplePeriod(Duration.ofSeconds(in.readLong(), in.readInt()));
-                    builder.setLocalDeviceAddress(
-                            in.readParcelable(UwbAddress.class.getClassLoader()));
-
-                    UwbAddress[] remoteAddresses =
-                            in.readParcelableArray(null, UwbAddress.class);
-                    for (UwbAddress remoteAddress : remoteAddresses) {
-                        builder.addRemoteDeviceAddress(remoteAddress);
-                    }
-
-                    builder.setChannelNumber(in.readInt());
-                    builder.setTransmitPreambleCodeIndex(in.readInt());
-                    builder.setReceivePreambleCodeIndex(in.readInt());
-                    builder.setStsPhPacketType(in.readInt());
-                    builder.setSpecificationParameters(in.readPersistableBundle());
-
-                    return builder.build();
-                }
-
-                @Override
-                public RangingParams[] newArray(int size) {
-                    return new RangingParams[size];
-                }
-    };
-
-    /**
-     * Builder class for {@link RangingParams}.
-     */
-    public static final class Builder {
-        private boolean mIsInitiator = false;
-        private boolean mIsController = false;
-        private Duration mSamplePeriod = null;
-        private UwbAddress mLocalDeviceAddress = null;
-        private List<UwbAddress> mRemoteDeviceAddresses = new ArrayList<>();
-        private int mChannelNumber = 0;
-        private int mTransmitPreambleCodeIndex = 0;
-        private int mReceivePreambleCodeIndex = 0;
-        private int mStsPhyPacketType = STS_PHY_PACKET_TYPE_SP0;
-        private PersistableBundle mSpecificationParameters = new PersistableBundle();
-
-        /**
-         * Set whether the device is the initiator or responder as defined by IEEE 802.15.4z
-         *
-         * @param isInitiator whether the device is the initiator (true) or responder (false)
-         */
-        public Builder setIsInitiator(boolean isInitiator) {
-            mIsInitiator = isInitiator;
-            return this;
-        }
-
-        /**
-         * Set whether the local device is the controller or controlee as defined by IEEE 802.15.4z
-         *
-         * @param isController whether the device is the controller (true) or controlee (false)
-         */
-        public Builder setIsController(boolean isController) {
-            mIsController = isController;
-            return this;
-        }
-
-        /**
-         * Set the time between ranging samples
-         *
-         * @param samplePeriod the time between ranging samples
-         */
-        public Builder setSamplePeriod(@NonNull Duration samplePeriod) {
-            mSamplePeriod = samplePeriod;
-            return this;
-        }
-
-        /**
-         * Set the local device address
-         *
-         * @param localDeviceAddress the local device's address for the {@link RangingSession}
-         */
-        public Builder setLocalDeviceAddress(@NonNull UwbAddress localDeviceAddress) {
-            mLocalDeviceAddress = localDeviceAddress;
-            return this;
-        }
-
-        /**
-         * Add a remote device's address to the ranging session
-         *
-         * @param remoteDeviceAddress a remote device's address for the {@link RangingSession}
-         * @throws IllegalArgumentException if {@code remoteDeviceAddress} is already present.
-         */
-        public Builder addRemoteDeviceAddress(@NonNull UwbAddress remoteDeviceAddress) {
-            if (mRemoteDeviceAddresses.contains(remoteDeviceAddress)) {
-                throw new IllegalArgumentException(
-                        "Remote device address already added: " + remoteDeviceAddress.toString());
-            }
-            mRemoteDeviceAddresses.add(remoteDeviceAddress);
-            return this;
-        }
-
-        /**
-         * Set the IEEE 802.15.4z channel to use for the {@link RangingSession}
-         * <p>Valid values are in the range [-1, 15]
-         *
-         * @param channelNumber the channel to use for the {@link RangingSession}
-         * @throws IllegalArgumentException if {@code channelNumber} is invalid.
-         */
-        public Builder setChannelNumber(int channelNumber) {
-            if (channelNumber < -1 || channelNumber > 15) {
-                throw new IllegalArgumentException("Invalid channel number");
-            }
-            mChannelNumber = channelNumber;
-            return this;
-        }
-
-        private static final Set<Integer> VALID_TX_PREAMBLE_CODES = new HashSet<Integer>(
-                Arrays.asList(0, 13, 14, 15, 16, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32));
-
-        /**
-         * Set the IEEE 802.15.4z preamble code index to use when transmitting
-         *
-         * <p>Valid values are in the ranges: [0], [13-16], [21-32]
-         *
-         * @param transmitPreambleCodeIndex preamble code index to use for transmitting
-         * @throws IllegalArgumentException if {@code transmitPreambleCodeIndex} is invalid.
-         */
-        public Builder setTransmitPreambleCodeIndex(int transmitPreambleCodeIndex) {
-            if (!VALID_TX_PREAMBLE_CODES.contains(transmitPreambleCodeIndex)) {
-                throw new IllegalArgumentException(
-                        "Invalid transmit preamble: " + transmitPreambleCodeIndex);
-            }
-            mTransmitPreambleCodeIndex = transmitPreambleCodeIndex;
-            return this;
-        }
-
-        private static final Set<Integer> VALID_RX_PREAMBLE_CODES = new HashSet<Integer>(
-                Arrays.asList(0, 16, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32));
-
-        /**
-         * Set the IEEE 802.15.4z preamble code index to use when receiving
-         *
-         * Valid values are in the ranges: [0], [16-32]
-         *
-         * @param receivePreambleCodeIndex preamble code index to use for receiving
-         * @throws IllegalArgumentException if {@code receivePreambleCodeIndex} is invalid.
-         */
-        public Builder setReceivePreambleCodeIndex(int receivePreambleCodeIndex) {
-            if (!VALID_RX_PREAMBLE_CODES.contains(receivePreambleCodeIndex)) {
-                throw new IllegalArgumentException(
-                        "Invalid receive preamble: " + receivePreambleCodeIndex);
-            }
-            mReceivePreambleCodeIndex = receivePreambleCodeIndex;
-            return this;
-        }
-
-        /**
-         * Set the IEEE 802.15.4z PHY packet type when STS is used
-         *
-         * @param stsPhyPacketType PHY packet type when STS is used
-         * @throws IllegalArgumentException if {@code stsPhyPacketType} is invalid.
-         */
-        public Builder setStsPhPacketType(@StsPhyPacketType int stsPhyPacketType) {
-            if (stsPhyPacketType != STS_PHY_PACKET_TYPE_SP0
-                    && stsPhyPacketType != STS_PHY_PACKET_TYPE_SP1
-                    && stsPhyPacketType != STS_PHY_PACKET_TYPE_SP2
-                    && stsPhyPacketType != STS_PHY_PACKET_TYPE_SP3) {
-                throw new IllegalArgumentException("unknown StsPhyPacketType: " + stsPhyPacketType);
-            }
-
-            mStsPhyPacketType = stsPhyPacketType;
-            return this;
-        }
-
-        /**
-         * Set the specification parameters
-         *
-         * <p>Creates a copy of the parameters
-         *
-         * @param parameters specification parameters built from support library
-         */
-        public Builder setSpecificationParameters(@NonNull PersistableBundle parameters) {
-            mSpecificationParameters = new PersistableBundle(parameters);
-            return this;
-        }
-
-        /**
-         * Build the {@link RangingParams} object.
-         *
-         * @throws IllegalStateException if required parameters are missing
-         */
-        public RangingParams build() {
-            if (mSamplePeriod == null) {
-                throw new IllegalStateException("No sample period provided");
-            }
-
-            if (mLocalDeviceAddress == null) {
-                throw new IllegalStateException("Local device address not provided");
-            }
-
-            if (mRemoteDeviceAddresses.size() == 0) {
-                throw new IllegalStateException("No remote device address(es) provided");
-            }
-
-            return new RangingParams(mIsInitiator, mIsController, mSamplePeriod,
-                    mLocalDeviceAddress, mRemoteDeviceAddresses, mChannelNumber,
-                    mTransmitPreambleCodeIndex, mReceivePreambleCodeIndex, mStsPhyPacketType,
-                    mSpecificationParameters);
-        }
-    }
-}
diff --git a/core/java/android/uwb/RangingSession.java b/core/java/android/uwb/RangingSession.java
index f4033fe..8639269 100644
--- a/core/java/android/uwb/RangingSession.java
+++ b/core/java/android/uwb/RangingSession.java
@@ -30,7 +30,7 @@
  * {@link RangingSession}.
  *
  * <p>To get an instance of {@link RangingSession}, first use
- * {@link UwbManager#openRangingSession(RangingParams, Executor, Callback)} to request to open a
+ * {@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
@@ -44,7 +44,7 @@
      */
     public interface Callback {
         /**
-         * Invoked when {@link UwbManager#openRangingSession(RangingParams, Executor, Callback)}
+         * Invoked when {@link UwbManager#openRangingSession(PersistableBundle, Executor, Callback)}
          * is successful
          *
          * @param session the newly opened {@link RangingSession}
@@ -77,7 +77,7 @@
 
         /**
          * Indicates that the session failed to open due to erroneous parameters passed
-         * to {@link UwbManager#openRangingSession(RangingParams, Executor, Callback)}
+         * to {@link UwbManager#openRangingSession(PersistableBundle, Executor, Callback)}
          */
         int CLOSE_REASON_LOCAL_BAD_PARAMETERS = 2;
 
@@ -137,8 +137,8 @@
      * will still be invoked.
      *
      * <p>{@link Callback#onClosed(int)} will be invoked using the same callback
-     * object given to {@link UwbManager#openRangingSession(RangingParams, Executor, Callback)} when
-     * the {@link RangingSession} was opened. The callback will be invoked after each call to
+     * 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
diff --git a/core/java/android/uwb/UwbManager.java b/core/java/android/uwb/UwbManager.java
index 6bf7d6f..2f1e2de 100644
--- a/core/java/android/uwb/UwbManager.java
+++ b/core/java/android/uwb/UwbManager.java
@@ -279,7 +279,10 @@
      * <p>An open {@link RangingSession} will be automatically closed if client application process
      * dies.
      *
-     * @param params {@link RangingParams} used to initialize this {@link RangingSession}
+     * <p>A UWB support library must be used in order to construct the {@code parameter}
+     * {@link PersistableBundle}.
+     *
+     * @param parameters 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.
@@ -290,8 +293,9 @@
      *         {@link RangingSession.Callback#onOpenSuccess}.
      */
     @NonNull
-    public AutoCloseable openRangingSession(@NonNull RangingParams params,
-            @NonNull Executor executor, @NonNull RangingSession.Callback callbacks) {
+    public AutoCloseable openRangingSession(@NonNull PersistableBundle parameters,
+            @NonNull Executor executor,
+            @NonNull RangingSession.Callback callbacks) {
         throw new UnsupportedOperationException();
     }
 }
diff --git a/core/java/android/view/OnReceiveContentCallback.java b/core/java/android/view/OnReceiveContentCallback.java
deleted file mode 100644
index d74938c..0000000
--- a/core/java/android/view/OnReceiveContentCallback.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ClipData;
-import android.net.Uri;
-import android.os.Bundle;
-
-import com.android.internal.util.Preconditions;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Objects;
-
-/**
- * Callback for apps to implement handling for insertion of content. Content may be both text and
- * non-text (plain/styled text, HTML, images, videos, audio files, etc).
- *
- * <p>This callback can be attached to different types of UI components using
- * {@link View#setOnReceiveContentCallback}.
- *
- * <p>For editable {@link android.widget.TextView} components, implementations can extend from
- * {@link android.widget.TextViewOnReceiveContentCallback} to reuse default platform behavior for
- * handling text.
- *
- * <p>Example implementation:<br>
- * <pre class="prettyprint">
- * // (1) Define the callback
- * public class MyOnReceiveContentCallback implements OnReceiveContentCallback&lt;TextView&gt; {
- *     public static final Set&lt;String&gt; MIME_TYPES = Collections.unmodifiableSet(
- *         Set.of("image/*", "video/*"));
- *
- *     &#64;Override
- *     public boolean onReceiveContent(@NonNull TextView view, @NonNull Payload payload) {
- *         // ... app-specific logic to handle the content in the payload ...
- *     }
- * }
- *
- * // (2) Register the callback
- * public class MyActivity extends Activity {
- *     &#64;Override
- *     public void onCreate(Bundle savedInstanceState) {
- *         // ...
- *
- *         EditText myInput = findViewById(R.id.my_input);
- *         myInput.setOnReceiveContentCallback(
- *                 MyOnReceiveContentCallback.MIME_TYPES,
- *                 new MyOnReceiveContentCallback());
- *     }
- * </pre>
- *
- * @param <T> The type of {@link View} with which this callback can be associated.
- */
-public interface OnReceiveContentCallback<T extends View> {
-    /**
-     * Receive the given content.
-     *
-     * <p>This method is only invoked for content whose MIME type matches a type specified via
-     * {@link View#setOnReceiveContentCallback}.
-     *
-     * <p>For text, if the view has a selection, the selection should be overwritten by the clip; if
-     * there's no selection, this method should insert the content at the current cursor position.
-     *
-     * <p>For non-text content (e.g. an image), the content may be inserted inline, or it may be
-     * added as an attachment (could potentially be shown in a completely separate view).
-     *
-     * @param view The view where the content insertion was requested.
-     * @param payload The content to insert and related metadata.
-     *
-     * @return Returns true if the content was handled in some way, false otherwise. Actual
-     * insertion may be processed asynchronously in the background and may or may not succeed even
-     * if this method returns true. For example, an app may not end up inserting an item if it
-     * exceeds the app's size limit for that type of content.
-     */
-    boolean onReceiveContent(@NonNull T view, @NonNull Payload payload);
-
-    /**
-     * Holds all the relevant data for a request to {@link OnReceiveContentCallback}.
-     */
-    final class Payload {
-
-        /**
-         * Specifies the UI through which content is being inserted. Future versions of Android may
-         * support additional values.
-         *
-         * @hide
-         */
-        @IntDef(prefix = {"SOURCE_"}, value = {SOURCE_APP, SOURCE_CLIPBOARD, SOURCE_INPUT_METHOD,
-                SOURCE_DRAG_AND_DROP, SOURCE_AUTOFILL, SOURCE_PROCESS_TEXT})
-        @Retention(RetentionPolicy.SOURCE)
-        public @interface Source {}
-
-        /**
-         * Specifies that the operation was triggered by the app that contains the target view.
-         */
-        public static final int SOURCE_APP = 0;
-
-        /**
-         * Specifies that the operation was triggered by a paste from the clipboard (e.g. "Paste" or
-         * "Paste as plain text" action in the insertion/selection menu).
-         */
-        public static final int SOURCE_CLIPBOARD = 1;
-
-        /**
-         * Specifies that the operation was triggered from the soft keyboard (also known as input
-         * method editor or IME). See https://developer.android.com/guide/topics/text/image-keyboard
-         * for more info.
-         */
-        public static final int SOURCE_INPUT_METHOD = 2;
-
-        /**
-         * Specifies that the operation was triggered by the drag/drop framework. See
-         * https://developer.android.com/guide/topics/ui/drag-drop for more info.
-         */
-        public static final int SOURCE_DRAG_AND_DROP = 3;
-
-        /**
-         * Specifies that the operation was triggered by the autofill framework. See
-         * https://developer.android.com/guide/topics/text/autofill for more info.
-         */
-        public static final int SOURCE_AUTOFILL = 4;
-
-        /**
-         * Specifies that the operation was triggered by a result from a
-         * {@link android.content.Intent#ACTION_PROCESS_TEXT PROCESS_TEXT} action in the selection
-         * menu.
-         */
-        public static final int SOURCE_PROCESS_TEXT = 5;
-
-        /**
-         * Returns the symbolic name of the given source.
-         *
-         * @hide
-         */
-        static String sourceToString(@Source int source) {
-            switch (source) {
-                case SOURCE_APP: return "SOURCE_APP";
-                case SOURCE_CLIPBOARD: return "SOURCE_CLIPBOARD";
-                case SOURCE_INPUT_METHOD: return "SOURCE_INPUT_METHOD";
-                case SOURCE_DRAG_AND_DROP: return "SOURCE_DRAG_AND_DROP";
-                case SOURCE_AUTOFILL: return "SOURCE_AUTOFILL";
-                case SOURCE_PROCESS_TEXT: return "SOURCE_PROCESS_TEXT";
-            }
-            return String.valueOf(source);
-        }
-
-        /**
-         * Flags to configure the insertion behavior.
-         *
-         * @hide
-         */
-        @IntDef(flag = true, prefix = {"FLAG_"}, value = {FLAG_CONVERT_TO_PLAIN_TEXT})
-        @Retention(RetentionPolicy.SOURCE)
-        public @interface Flags {}
-
-        /**
-         * Flag requesting that the content should be converted to plain text prior to inserting.
-         */
-        public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1 << 0;
-
-        /**
-         * Returns the symbolic names of the set flags or {@code "0"} if no flags are set.
-         *
-         * @hide
-         */
-        static String flagsToString(@Flags int flags) {
-            if ((flags & FLAG_CONVERT_TO_PLAIN_TEXT) != 0) {
-                return "FLAG_CONVERT_TO_PLAIN_TEXT";
-            }
-            return String.valueOf(flags);
-        }
-
-        @NonNull private final ClipData mClip;
-        private final @Source int mSource;
-        private final @Flags int mFlags;
-        @Nullable private final Uri mLinkUri;
-        @Nullable private final Bundle mExtras;
-
-        private Payload(Builder b) {
-            this.mClip = Objects.requireNonNull(b.mClip);
-            this.mSource = Preconditions.checkArgumentInRange(b.mSource, 0, SOURCE_PROCESS_TEXT,
-                    "source");
-            this.mFlags = Preconditions.checkFlagsArgument(b.mFlags, FLAG_CONVERT_TO_PLAIN_TEXT);
-            this.mLinkUri = b.mLinkUri;
-            this.mExtras = b.mExtras;
-        }
-
-        @NonNull
-        @Override
-        public String toString() {
-            return "Payload{"
-                    + "clip=" + mClip.getDescription()
-                    + ", source=" + sourceToString(mSource)
-                    + ", flags=" + flagsToString(mFlags)
-                    + ", linkUri=" + mLinkUri
-                    + ", extras=" + mExtras
-                    + "}";
-        }
-
-        /**
-         * The data to be inserted.
-         */
-        public @NonNull ClipData getClip() {
-            return mClip;
-        }
-
-        /**
-         * The source of the operation. See {@code SOURCE_} constants. Future versions of Android
-         * may pass additional values.
-         */
-        public @Source int getSource() {
-            return mSource;
-        }
-
-        /**
-         * Optional flags that control the insertion behavior. See {@code FLAG_} constants.
-         */
-        public @Flags int getFlags() {
-            return mFlags;
-        }
-
-        /**
-         * Optional http/https URI for the content that may be provided by the IME. This is only
-         * populated if the source is {@link #SOURCE_INPUT_METHOD} and if a non-empty
-         * {@link android.view.inputmethod.InputContentInfo#getLinkUri linkUri} was passed by the
-         * IME.
-         */
-        public @Nullable Uri getLinkUri() {
-            return mLinkUri;
-        }
-
-        /**
-         * Optional additional metadata. If the source is {@link #SOURCE_INPUT_METHOD}, this will
-         * include the {@link android.view.inputmethod.InputConnection#commitContent opts} passed by
-         * the IME.
-         */
-        public @Nullable Bundle getExtras() {
-            return mExtras;
-        }
-
-        /**
-         * Builder for {@link Payload}.
-         */
-        public static final class Builder {
-            @NonNull private final ClipData mClip;
-            private final @Source int mSource;
-            private @Flags int mFlags;
-            @Nullable private Uri mLinkUri;
-            @Nullable private Bundle mExtras;
-
-            /**
-             * Creates a new builder.
-             * @param clip   The data to insert.
-             * @param source The source of the operation. See {@code SOURCE_} constants.
-             */
-            public Builder(@NonNull ClipData clip, @Source int source) {
-                mClip = clip;
-                mSource = source;
-            }
-
-            /**
-             * Sets flags that control content insertion behavior.
-             * @param flags Optional flags to configure the insertion behavior. Use 0 for default
-             *              behavior. See {@code FLAG_} constants.
-             * @return this builder
-             */
-            @NonNull
-            public Builder setFlags(@Flags int flags) {
-                mFlags = flags;
-                return this;
-            }
-
-            /**
-             * Sets the http/https URI for the content. See
-             * {@link android.view.inputmethod.InputContentInfo#getLinkUri} for more info.
-             * @param linkUri Optional http/https URI for the content.
-             * @return this builder
-             */
-            @NonNull
-            public Builder setLinkUri(@Nullable Uri linkUri) {
-                mLinkUri = linkUri;
-                return this;
-            }
-
-            /**
-             * Sets additional metadata.
-             * @param extras Optional bundle with additional metadata.
-             * @return this builder
-             */
-            @NonNull
-            public Builder setExtras(@Nullable Bundle extras) {
-                mExtras = extras;
-                return this;
-            }
-
-            /**
-             * @return A new {@link Payload} instance with the data from this builder.
-             */
-            @NonNull
-            public Payload build() {
-                return new Payload(this);
-            }
-        }
-    }
-}
diff --git a/core/java/android/view/OnReceiveContentListener.java b/core/java/android/view/OnReceiveContentListener.java
new file mode 100644
index 0000000..4955289
--- /dev/null
+++ b/core/java/android/view/OnReceiveContentListener.java
@@ -0,0 +1,416 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ClipData;
+import android.net.Uri;
+import android.os.Bundle;
+import android.util.ArrayMap;
+
+import com.android.internal.util.Preconditions;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Predicate;
+
+/**
+ * Listener for apps to implement handling for insertion of content. Content may be both text and
+ * non-text (plain/styled text, HTML, images, videos, audio files, etc).
+ *
+ * <p>This listener can be attached to different types of UI components using
+ * {@link View#setOnReceiveContentListener}.
+ *
+ * <p>Here is a sample implementation that handles content URIs and delegates the processing for
+ * text and everything else to the platform:<br>
+ * <pre class="prettyprint">
+ * // (1) Define the listener
+ * public class MyReceiver implements OnReceiveContentListener {
+ *     public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"};
+ *
+ *     &#64;Override
+ *     public Payload onReceiveContent(TextView view, Payload payload) {
+ *         Map&lt;Boolean, Payload&gt; split = payload.partition(item -&gt; item.getUri() != null);
+ *         if (split.get(true) != null) {
+ *             ClipData clip = payload.getClip();
+ *             for (int i = 0; i < clip.getItemCount(); i++) {
+ *                 Uri uri = clip.getItemAt(i).getUri();
+ *                 // ... app-specific logic to handle the URI ...
+ *             }
+ *         }
+ *         // Return anything that we didn't handle ourselves. This preserves the default platform
+ *         // behavior for text and anything else for which we are not implementing custom handling.
+ *         return split.get(false);
+ *     }
+ * }
+ *
+ * // (2) Register the listener
+ * public class MyActivity extends Activity {
+ *     &#64;Override
+ *     public void onCreate(Bundle savedInstanceState) {
+ *         // ...
+ *
+ *         EditText myInput = findViewById(R.id.my_input);
+ *         myInput.setOnReceiveContentListener(MyReceiver.MIME_TYPES, new MyReceiver());
+ *     }
+ * </pre>
+ */
+public interface OnReceiveContentListener {
+    /**
+     * Receive the given content.
+     *
+     * <p>Implementations should handle any content items of interest and return all unhandled
+     * items to preserve the default platform behavior for content that does not have app-specific
+     * 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 Payload#partition} for a convenient way to split the passed-in
+     * content.
+     *
+     * <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
+     * should be inserted at the current cursor position.
+     *
+     * <p>If implementing handling for non-text content (e.g. images): the content may be
+     * inserted inline, or it may be added as an attachment (could potentially be shown in a
+     * completely separate view).
+     *
+     * @param view The view where the content insertion was requested.
+     * @param payload The content to insert and related metadata.
+     *
+     * @return The portion of the passed-in content whose processing should be delegated to
+     * the platform. Return null if all content was handled in some way. Actual insertion of
+     * the content may be processed asynchronously in the background and may or may not
+     * succeed even if this method returns null. For example, an app may end up not inserting
+     * an item if it exceeds the app's size limit for that type of content.
+     */
+    @Nullable Payload onReceiveContent(@NonNull View view, @NonNull Payload payload);
+
+    /**
+     * Holds all the relevant data for a request to {@link OnReceiveContentListener}.
+     */
+    final class Payload {
+
+        /**
+         * Specifies the UI through which content is being inserted. Future versions of Android may
+         * support additional values.
+         *
+         * @hide
+         */
+        @IntDef(prefix = {"SOURCE_"}, value = {SOURCE_APP, SOURCE_CLIPBOARD, SOURCE_INPUT_METHOD,
+                SOURCE_DRAG_AND_DROP, SOURCE_AUTOFILL, SOURCE_PROCESS_TEXT})
+        @Retention(RetentionPolicy.SOURCE)
+        public @interface Source {}
+
+        /**
+         * Specifies that the operation was triggered by the app that contains the target view.
+         */
+        public static final int SOURCE_APP = 0;
+
+        /**
+         * Specifies that the operation was triggered by a paste from the clipboard (e.g. "Paste" or
+         * "Paste as plain text" action in the insertion/selection menu).
+         */
+        public static final int SOURCE_CLIPBOARD = 1;
+
+        /**
+         * Specifies that the operation was triggered from the soft keyboard (also known as input
+         * method editor or IME). See https://developer.android.com/guide/topics/text/image-keyboard
+         * for more info.
+         */
+        public static final int SOURCE_INPUT_METHOD = 2;
+
+        /**
+         * Specifies that the operation was triggered by the drag/drop framework. See
+         * https://developer.android.com/guide/topics/ui/drag-drop for more info.
+         */
+        public static final int SOURCE_DRAG_AND_DROP = 3;
+
+        /**
+         * Specifies that the operation was triggered by the autofill framework. See
+         * https://developer.android.com/guide/topics/text/autofill for more info.
+         */
+        public static final int SOURCE_AUTOFILL = 4;
+
+        /**
+         * Specifies that the operation was triggered by a result from a
+         * {@link android.content.Intent#ACTION_PROCESS_TEXT PROCESS_TEXT} action in the selection
+         * menu.
+         */
+        public static final int SOURCE_PROCESS_TEXT = 5;
+
+        /**
+         * Returns the symbolic name of the given source.
+         *
+         * @hide
+         */
+        static String sourceToString(@Source int source) {
+            switch (source) {
+                case SOURCE_APP: return "SOURCE_APP";
+                case SOURCE_CLIPBOARD: return "SOURCE_CLIPBOARD";
+                case SOURCE_INPUT_METHOD: return "SOURCE_INPUT_METHOD";
+                case SOURCE_DRAG_AND_DROP: return "SOURCE_DRAG_AND_DROP";
+                case SOURCE_AUTOFILL: return "SOURCE_AUTOFILL";
+                case SOURCE_PROCESS_TEXT: return "SOURCE_PROCESS_TEXT";
+            }
+            return String.valueOf(source);
+        }
+
+        /**
+         * Flags to configure the insertion behavior.
+         *
+         * @hide
+         */
+        @IntDef(flag = true, prefix = {"FLAG_"}, value = {FLAG_CONVERT_TO_PLAIN_TEXT})
+        @Retention(RetentionPolicy.SOURCE)
+        public @interface Flags {}
+
+        /**
+         * Flag requesting that the content should be converted to plain text prior to inserting.
+         */
+        public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1 << 0;
+
+        /**
+         * Returns the symbolic names of the set flags or {@code "0"} if no flags are set.
+         *
+         * @hide
+         */
+        static String flagsToString(@Flags int flags) {
+            if ((flags & FLAG_CONVERT_TO_PLAIN_TEXT) != 0) {
+                return "FLAG_CONVERT_TO_PLAIN_TEXT";
+            }
+            return String.valueOf(flags);
+        }
+
+        @NonNull private final ClipData mClip;
+        private final @Source int mSource;
+        private final @Flags int mFlags;
+        @Nullable private final Uri mLinkUri;
+        @Nullable private final Bundle mExtras;
+
+        private Payload(Builder b) {
+            this.mClip = Objects.requireNonNull(b.mClip);
+            this.mSource = Preconditions.checkArgumentInRange(b.mSource, 0, SOURCE_PROCESS_TEXT,
+                    "source");
+            this.mFlags = Preconditions.checkFlagsArgument(b.mFlags, FLAG_CONVERT_TO_PLAIN_TEXT);
+            this.mLinkUri = b.mLinkUri;
+            this.mExtras = b.mExtras;
+        }
+
+        @NonNull
+        @Override
+        public String toString() {
+            return "Payload{"
+                    + "clip=" + mClip
+                    + ", source=" + sourceToString(mSource)
+                    + ", flags=" + flagsToString(mFlags)
+                    + ", linkUri=" + mLinkUri
+                    + ", extras=" + mExtras
+                    + "}";
+        }
+
+        /**
+         * The data to be inserted.
+         */
+        public @NonNull ClipData getClip() {
+            return mClip;
+        }
+
+        /**
+         * The source of the operation. See {@code SOURCE_} constants. Future versions of Android
+         * may pass additional values.
+         */
+        public @Source int getSource() {
+            return mSource;
+        }
+
+        /**
+         * Optional flags that control the insertion behavior. See {@code FLAG_} constants.
+         */
+        public @Flags int getFlags() {
+            return mFlags;
+        }
+
+        /**
+         * Optional http/https URI for the content that may be provided by the IME. This is only
+         * populated if the source is {@link #SOURCE_INPUT_METHOD} and if a non-empty
+         * {@link android.view.inputmethod.InputContentInfo#getLinkUri linkUri} was passed by the
+         * IME.
+         */
+        public @Nullable Uri getLinkUri() {
+            return mLinkUri;
+        }
+
+        /**
+         * Optional additional metadata. If the source is {@link #SOURCE_INPUT_METHOD}, this will
+         * include the {@link android.view.inputmethod.InputConnection#commitContent opts} passed by
+         * the IME.
+         */
+        public @Nullable Bundle getExtras() {
+            return mExtras;
+        }
+
+        /**
+         * Partitions this payload based on the given predicate.
+         *
+         * <p>Similar to a
+         * {@link java.util.stream.Collectors#partitioningBy(Predicate) partitioning collector},
+         * this function classifies the content in this payload and organizes it into a map,
+         * grouping the content that matched vs didn't match the predicate.
+         *
+         * <p>Except for the {@link ClipData} items, the returned payloads will contain all the same
+         * metadata as the original payload.
+         *
+         * @param itemPredicate The predicate to test each {@link ClipData.Item} to determine which
+         * partition to place it into.
+         * @return A map containing the partitioned content. The map will contain a single entry if
+         * all items were classified into the same partition (all matched or all didn't match the
+         * predicate) or two entries (if there's at least one item that matched the predicate and at
+         * least one item that didn't match the predicate).
+         */
+        public @NonNull Map<Boolean, Payload> partition(
+                @NonNull Predicate<ClipData.Item> itemPredicate) {
+            if (mClip.getItemCount() == 1) {
+                Map<Boolean, Payload> result = new ArrayMap<>(1);
+                result.put(itemPredicate.test(mClip.getItemAt(0)), this);
+                return result;
+            }
+            ArrayList<ClipData.Item> accepted = new ArrayList<>();
+            ArrayList<ClipData.Item> remaining = new ArrayList<>();
+            for (int i = 0; i < mClip.getItemCount(); i++) {
+                ClipData.Item item = mClip.getItemAt(i);
+                if (itemPredicate.test(item)) {
+                    accepted.add(item);
+                } else {
+                    remaining.add(item);
+                }
+            }
+            Map<Boolean, Payload> result = new ArrayMap<>(2);
+            if (!accepted.isEmpty()) {
+                ClipData acceptedClip = new ClipData(mClip.getDescription(), accepted);
+                result.put(true, new Builder(this).setClip(acceptedClip).build());
+            }
+            if (!remaining.isEmpty()) {
+                ClipData remainingClip = new ClipData(mClip.getDescription(), remaining);
+                result.put(false, new Builder(this).setClip(remainingClip).build());
+            }
+            return result;
+        }
+
+        /**
+         * Builder for {@link Payload}.
+         */
+        public static final class Builder {
+            @NonNull private ClipData mClip;
+            private @Source int mSource;
+            private @Flags int mFlags;
+            @Nullable private Uri mLinkUri;
+            @Nullable private Bundle mExtras;
+
+            /**
+             * Creates a new builder initialized with the data from the given builder.
+             */
+            public Builder(@NonNull Payload payload) {
+                mClip = payload.mClip;
+                mSource = payload.mSource;
+                mFlags = payload.mFlags;
+                mLinkUri = payload.mLinkUri;
+                mExtras = payload.mExtras;
+            }
+
+            /**
+             * Creates a new builder.
+             * @param clip   The data to insert.
+             * @param source The source of the operation. See {@code SOURCE_} constants.
+             */
+            public Builder(@NonNull ClipData clip, @Source int source) {
+                mClip = clip;
+                mSource = source;
+            }
+
+            /**
+             * Sets the data to be inserted.
+             * @param clip The data to insert.
+             * @return this builder
+             */
+            @NonNull
+            public Builder setClip(@NonNull ClipData clip) {
+                mClip = clip;
+                return this;
+            }
+
+            /**
+             * Sets the source of the operation.
+             * @param source The source of the operation. See {@code SOURCE_} constants.
+             * @return this builder
+             */
+            @NonNull
+            public Builder setSource(@Source int source) {
+                mSource = source;
+                return this;
+            }
+
+            /**
+             * Sets flags that control content insertion behavior.
+             * @param flags Optional flags to configure the insertion behavior. Use 0 for default
+             *              behavior. See {@code FLAG_} constants.
+             * @return this builder
+             */
+            @NonNull
+            public Builder setFlags(@Flags int flags) {
+                mFlags = flags;
+                return this;
+            }
+
+            /**
+             * Sets the http/https URI for the content. See
+             * {@link android.view.inputmethod.InputContentInfo#getLinkUri} for more info.
+             * @param linkUri Optional http/https URI for the content.
+             * @return this builder
+             */
+            @NonNull
+            public Builder setLinkUri(@Nullable Uri linkUri) {
+                mLinkUri = linkUri;
+                return this;
+            }
+
+            /**
+             * Sets additional metadata.
+             * @param extras Optional bundle with additional metadata.
+             * @return this builder
+             */
+            @NonNull
+            public Builder setExtras(@Nullable Bundle extras) {
+                mExtras = extras;
+                return this;
+            }
+
+            /**
+             * @return A new {@link Payload} instance with the data from this builder.
+             */
+            @NonNull
+            public Payload build() {
+                return new Payload(this);
+            }
+        }
+    }
+}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index cefddd8..a88ad9f 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -112,6 +112,7 @@
 import android.view.AccessibilityIterators.WordTextSegmentIterator;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.InputDevice.InputSourceClass;
+import android.view.OnReceiveContentListener.Payload;
 import android.view.Window.OnContentApplyWindowInsetsListener;
 import android.view.WindowInsets.Type;
 import android.view.WindowInsetsAnimation.Bounds;
@@ -143,6 +144,7 @@
 import android.widget.ScrollBarDrawable;
 
 import com.android.internal.R;
+import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.Preconditions;
 import com.android.internal.view.ScrollCaptureInternal;
@@ -4713,6 +4715,9 @@
          * Allows the application to implement custom scroll capture support.
          */
         ScrollCaptureCallback mScrollCaptureCallback;
+
+        @Nullable
+        private OnReceiveContentListener mOnReceiveContentListener;
     }
 
     @UnsupportedAppUsage
@@ -5246,8 +5251,6 @@
 
     @Nullable
     private String[] mOnReceiveContentMimeTypes;
-    @Nullable
-    private OnReceiveContentCallback mOnReceiveContentCallback;
 
     /**
      * Simple constructor to use when creating a view from code.
@@ -9005,72 +9008,92 @@
     }
 
     /**
-     * Sets the callback to handle insertion of content into this view.
+     * Sets the listener to be {@link #onReceiveContent used} to handle insertion of
+     * content into this view.
      *
-     * <p>Depending on the view, this callback may be invoked for scenarios such as content
-     * insertion from the IME, Autofill, etc.
+     * <p>Depending on the type of view, this listener may be invoked for different scenarios. For
+     * example, for editable TextViews, this listener will be invoked for the following scenarios:
+     * <ol>
+     *     <li>Paste from the clipboard (e.g. "Paste" or "Paste as plain text" action in the
+     *     insertion/selection menu)
+     *     <li>Content insertion from the keyboard (from {@link InputConnection#commitContent})
+     *     <li>Drag and drop (drop events from {@link #onDragEvent(DragEvent)})
+     *     <li>Autofill
+     *     <li>Selection replacement via {@link Intent#ACTION_PROCESS_TEXT}
+     * </ol>
      *
-     * <p>This callback is only invoked for content whose MIME type matches a type specified via
-     * the {code mimeTypes} parameter. If the MIME type is not supported by the callback, the
-     * default platform handling will be executed instead (no-op for the default {@link View}).
+     * <p>When setting a listener, clients should also declare the MIME types accepted by it.
+     * When invoked with other types of content, the listener may reject the content (defer to
+     * the default platform behavior) or execute some other fallback logic. The MIME types
+     * declared here allow different features to optionally alter their behavior. For example,
+     * the soft keyboard may choose to hide its UI for inserting GIFs for a particular input
+     * field if the MIME types set here for that field don't include "image/gif" or "image/*".
      *
-     * <p><em>Note: MIME type matching in the Android framework is case-sensitive, unlike formal RFC
-     * MIME types. As a result, you should always write your MIME types with lower case letters, or
-     * use {@link android.content.Intent#normalizeMimeType} to ensure that it is converted to lower
-     * case.</em>
+     * <p>Note: MIME type matching in the Android framework is case-sensitive, unlike formal RFC
+     * MIME types. As a result, you should always write your MIME types with lowercase letters,
+     * or use {@link android.content.Intent#normalizeMimeType} to ensure that it is converted to
+     * lowercase.
      *
-     * @param mimeTypes The type of content for which the callback should be invoked. This may use
-     * wildcards such as "text/*", "image/*", etc. This must not be null or empty if a non-null
-     * callback is passed in.
-     * @param callback The callback to use. This can be null to reset to the default behavior.
+     * @param mimeTypes The MIME types accepted by the given listener. These may use patterns
+     *                  such as "image/*", but may not start with a wildcard. This argument must
+     *                  not be null or empty if a non-null listener is passed in.
+     * @param listener The listener to use. This can be null to reset to the default behavior.
      */
     @SuppressWarnings("rawtypes")
-    public void setOnReceiveContentCallback(@Nullable String[] mimeTypes,
-            @Nullable OnReceiveContentCallback callback) {
-        if (callback != null) {
+    public void setOnReceiveContentListener(@Nullable String[] mimeTypes,
+            @Nullable OnReceiveContentListener listener) {
+        if (listener != null) {
             Preconditions.checkArgument(mimeTypes != null && mimeTypes.length > 0,
-                    "When the callback is set, MIME types must also be set");
+                    "When the listener is set, MIME types must also be set");
         }
-        mOnReceiveContentMimeTypes = mimeTypes;
-        mOnReceiveContentCallback = callback;
+        if (mimeTypes != null) {
+            Preconditions.checkArgument(Arrays.stream(mimeTypes).noneMatch(t -> t.startsWith("*")),
+                    "A MIME type set here must not start with *: " + Arrays.toString(mimeTypes));
+        }
+        mOnReceiveContentMimeTypes = ArrayUtils.isEmpty(mimeTypes) ? null : mimeTypes;
+        getListenerInfo().mOnReceiveContentListener = listener;
     }
 
     /**
-     * Receives the given content. The default implementation invokes the callback set via
-     * {@link #setOnReceiveContentCallback}. If no callback is set or if the callback does not
-     * support the given content (based on the MIME type), returns false.
+     * Receives the given content. Invokes the listener configured via
+     * {@link #setOnReceiveContentListener}; if no listener is set, the default implementation is a
+     * no-op (returns the passed-in content without acting on it).
      *
      * @param payload The content to insert and related metadata.
      *
-     * @return Returns true if the content was handled in some way, false otherwise. Actual
-     * insertion may be processed asynchronously in the background and may or may not succeed even
-     * if this method returns true. For example, an app may not end up inserting an item if it
-     * exceeds the app's size limit for that type of content.
+     * @return The portion of the passed-in content that was not accepted (may be all, some, or none
+     * of the passed-in content).
      */
-    public boolean onReceiveContent(@NonNull OnReceiveContentCallback.Payload payload) {
-        ClipDescription description = payload.getClip().getDescription();
-        if (mOnReceiveContentCallback != null && mOnReceiveContentMimeTypes != null
-                && description.hasMimeType(mOnReceiveContentMimeTypes)) {
-            return mOnReceiveContentCallback.onReceiveContent(this, payload);
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public @Nullable Payload onReceiveContent(@NonNull Payload payload) {
+        final OnReceiveContentListener listener = (mListenerInfo == null) ? null
+                : getListenerInfo().mOnReceiveContentListener;
+        if (listener != null) {
+            return listener.onReceiveContent(this, payload);
         }
-        return false;
+        return payload;
     }
 
     /**
-     * Returns the MIME types that can be handled by {@link #onReceiveContent} for this view, as
-     * configured via {@link #setOnReceiveContentCallback}. By default returns null.
+     * Returns the MIME types accepted by {@link #onReceiveContent} for this view, as
+     * configured via {@link #setOnReceiveContentListener}. By default returns null.
      *
-     * <p>Different platform features (e.g. pasting from the clipboard, inserting stickers from the
-     * keyboard, etc) may use this function to conditionally alter their behavior. For example, the
-     * soft keyboard may choose to hide its UI for inserting GIFs for a particular input field if
-     * the MIME types returned here for that field don't include "image/gif".
+     * <p>Different features (e.g. pasting from the clipboard, inserting stickers from the soft
+     * keyboard, etc) may optionally use this metadata to conditionally alter their behavior. For
+     * example, a soft keyboard may choose to hide its UI for inserting GIFs for a particular
+     * input field if the MIME types returned here for that field don't include "image/gif" or
+     * "image/*".
      *
      * <p>Note: Comparisons of MIME types should be performed using utilities such as
      * {@link ClipDescription#compareMimeTypes} rather than simple string equality, in order to
-     * correctly handle patterns (e.g. "text/*").
+     * correctly handle patterns such as "text/*", "image/*", etc. Note that MIME type matching
+     * in the Android framework is case-sensitive, unlike formal RFC MIME types. As a result,
+     * you should always write your MIME types with lowercase letters, or use
+     * {@link android.content.Intent#normalizeMimeType} to ensure that it is converted to
+     * lowercase.
      *
-     * @return The MIME types supported by {@link #onReceiveContent} for this view. The returned
-     * MIME types may contain wildcards such as "text/*", "image/*", etc.
+     * @return The MIME types accepted by {@link #onReceiveContent} for this view (may
+     * include patterns such as "image/*").
      */
     public @Nullable String[] getOnReceiveContentMimeTypes() {
         return mOnReceiveContentMimeTypes;
diff --git a/core/java/android/view/ViewStructure.java b/core/java/android/view/ViewStructure.java
index 606e8f9..29ce231 100644
--- a/core/java/android/view/ViewStructure.java
+++ b/core/java/android/view/ViewStructure.java
@@ -97,6 +97,7 @@
     public abstract void setVisibility(int visibility);
 
     /** @hide */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract void setAssistBlocked(boolean state);
 
     /**
@@ -431,6 +432,7 @@
     public abstract void asyncCommit();
 
     /** @hide */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract Rect getTempRect();
 
     /**
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 8dd4b66..9c16378 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -1387,6 +1387,7 @@
     }
 
     /** @hide */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void alwaysReadCloseOnTouchAttr();
 
@@ -1567,6 +1568,7 @@
      *
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract void clearContentView();
 
     /**
@@ -2636,18 +2638,21 @@
      * Called when the activity changes from fullscreen mode to multi-window mode and visa-versa.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract void onMultiWindowModeChanged();
 
     /**
      * Called when the activity changes to/from picture-in-picture mode.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract void onPictureInPictureModeChanged(boolean isInPictureInPictureMode);
 
     /**
      * Called when the activity just relaunched.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract void reportActivityRelaunched();
 
     /**
diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java
index 4292a80..d56929e 100644
--- a/core/java/android/view/WindowManagerImpl.java
+++ b/core/java/android/view/WindowManagerImpl.java
@@ -250,8 +250,8 @@
         // Initialize params which used for obtaining all system insets.
         final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
         params.flags = FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR;
-        params.token = (mParentWindow != null) ? mParentWindow.getContext().getActivityToken()
-                : mContext.getActivityToken();
+        final Context context = (mParentWindow != null) ? mParentWindow.getContext() : mContext;
+        params.token = Context.getToken(context);
         params.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                 | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
         params.setFitInsetsTypes(0);
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 81db628..299c41b 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -19,7 +19,7 @@
 import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST;
 import static android.service.autofill.FillRequest.FLAG_PASSWORD_INPUT_TYPE;
 import static android.service.autofill.FillRequest.FLAG_VIEW_NOT_FOCUSED;
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_AUTOFILL;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_AUTOFILL;
 import static android.view.autofill.Helper.sDebug;
 import static android.view.autofill.Helper.sVerbose;
 import static android.view.autofill.Helper.toList;
@@ -62,7 +62,7 @@
 import android.util.SparseArray;
 import android.view.Choreographer;
 import android.view.KeyEvent;
-import android.view.OnReceiveContentCallback;
+import android.view.OnReceiveContentListener.Payload;
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
@@ -2371,12 +2371,10 @@
                 reportAutofillContentFailure(id);
                 return;
             }
-            OnReceiveContentCallback.Payload payload =
-                    new OnReceiveContentCallback.Payload.Builder(clip, SOURCE_AUTOFILL)
-                            .build();
-            boolean handled = view.onReceiveContent(payload);
-            if (!handled) {
-                Log.w(TAG, "autofillContent(): receiver returned false: id=" + id
+            Payload payload = new Payload.Builder(clip, SOURCE_AUTOFILL).build();
+            Payload result = view.onReceiveContent(payload);
+            if (result != null) {
+                Log.w(TAG, "autofillContent(): receiver could not insert content: id=" + id
                         + ", view=" + view + ", clip=" + clip);
                 reportAutofillContentFailure(id);
                 return;
diff --git a/core/java/android/view/inputmethod/BaseInputConnection.java b/core/java/android/view/inputmethod/BaseInputConnection.java
index 62b1b1f..a92d1f5 100644
--- a/core/java/android/view/inputmethod/BaseInputConnection.java
+++ b/core/java/android/view/inputmethod/BaseInputConnection.java
@@ -16,7 +16,7 @@
 
 package android.view.inputmethod;
 
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_INPUT_METHOD;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_INPUT_METHOD;
 
 import android.annotation.CallSuper;
 import android.annotation.IntRange;
@@ -40,7 +40,7 @@
 import android.util.LogPrinter;
 import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
-import android.view.OnReceiveContentCallback;
+import android.view.OnReceiveContentListener;
 import android.view.View;
 
 class ComposingText implements NoCopySpan {
@@ -928,17 +928,14 @@
 
     /**
      * Default implementation which invokes {@link View#onReceiveContent} on the target view if the
-     * MIME type of the content matches one of the MIME types returned by
-     * {@link View#getOnReceiveContentMimeTypes()}. If the MIME type of the content is not matched,
-     * returns false without any side effects.
+     * view {@link View#getOnReceiveContentMimeTypes allows} content insertion; otherwise returns
+     * false without any side effects.
      */
     public boolean commitContent(InputContentInfo inputContentInfo, int flags, Bundle opts) {
         ClipDescription description = inputContentInfo.getDescription();
-        final String[] viewMimeTypes = mTargetView.getOnReceiveContentMimeTypes();
-        if (viewMimeTypes == null || !description.hasMimeType(viewMimeTypes)) {
+        if (mTargetView.getOnReceiveContentMimeTypes() == null) {
             if (DEBUG) {
-                Log.d(TAG, "Can't insert content from IME; unsupported MIME type: content="
-                        + description + ", viewMimeTypes=" + viewMimeTypes);
+                Log.d(TAG, "Can't insert content from IME: content=" + description);
             }
             return false;
         }
@@ -950,13 +947,13 @@
                 return false;
             }
         }
-        final ClipData clip = new ClipData(description,
+        final ClipData clip = new ClipData(inputContentInfo.getDescription(),
                 new ClipData.Item(inputContentInfo.getContentUri()));
-        final OnReceiveContentCallback.Payload payload =
-                new OnReceiveContentCallback.Payload.Builder(clip, SOURCE_INPUT_METHOD)
+        final OnReceiveContentListener.Payload payload =
+                new OnReceiveContentListener.Payload.Builder(clip, SOURCE_INPUT_METHOD)
                 .setLinkUri(inputContentInfo.getLinkUri())
                 .setExtras(opts)
                 .build();
-        return mTargetView.onReceiveContent(payload);
+        return mTargetView.onReceiveContent(payload) == null;
     }
 }
diff --git a/core/java/android/webkit/CookieManager.java b/core/java/android/webkit/CookieManager.java
index f62a28e..023d9ff2 100644
--- a/core/java/android/webkit/CookieManager.java
+++ b/core/java/android/webkit/CookieManager.java
@@ -154,6 +154,7 @@
      *               HTTP request header
      * @hide Used by Browser and by WebViewProvider implementations.
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     public abstract String getCookie(String url, boolean privateBrowsing);
 
@@ -230,6 +231,7 @@
      * @param privateBrowsing whether to use the private browsing cookie jar
      * @hide Used by Browser and WebViewProvider implementations.
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     public abstract boolean hasCookies(boolean privateBrowsing);
 
@@ -264,6 +266,7 @@
      *
      * @hide Only for use by WebViewProvider implementations
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     protected abstract boolean allowFileSchemeCookiesImpl();
 
@@ -299,6 +302,7 @@
      *
      * @hide Only for use by WebViewProvider implementations
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     protected abstract void setAcceptFileSchemeCookiesImpl(boolean accept);
 }
diff --git a/core/java/android/webkit/WebHistoryItem.java b/core/java/android/webkit/WebHistoryItem.java
index b9e7042..2cb37b4 100644
--- a/core/java/android/webkit/WebHistoryItem.java
+++ b/core/java/android/webkit/WebHistoryItem.java
@@ -35,6 +35,7 @@
      * @deprecated This method is now obsolete.
      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @Deprecated
     public abstract int getId();
diff --git a/core/java/android/webkit/WebIconDatabase.java b/core/java/android/webkit/WebIconDatabase.java
index 08956e0..b705658 100644
--- a/core/java/android/webkit/WebIconDatabase.java
+++ b/core/java/android/webkit/WebIconDatabase.java
@@ -75,6 +75,7 @@
 
     /** {@hide}
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     public abstract void bulkRequestIconForPageUrl(ContentResolver cr, String where,
             IconListener listener);
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index 91b9390..9b753f1 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -268,6 +268,7 @@
      * @deprecated This method is now obsolete.
      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @Deprecated
     public abstract void setNavDump(boolean enabled);
@@ -280,6 +281,7 @@
      * @deprecated This method is now obsolete.
      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @Deprecated
     public abstract boolean getNavDump();
@@ -457,6 +459,7 @@
      * @deprecated This method is now obsolete.
      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @Deprecated
     public abstract  void setUseWebViewBackgroundForOverscrollBackground(boolean view);
@@ -469,6 +472,7 @@
      * @deprecated This method is now obsolete.
      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @Deprecated
     public abstract  boolean getUseWebViewBackgroundForOverscrollBackground();
@@ -534,6 +538,7 @@
      * Developers should access this via {@link CookieManager#setShouldAcceptThirdPartyCookies}.
      * @hide Internal API.
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     public abstract void setAcceptThirdPartyCookies(boolean accept);
 
@@ -542,6 +547,7 @@
      * Developers should access this via {@link CookieManager#getShouldAcceptThirdPartyCookies}.
      * @hide Internal API
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     public abstract boolean getAcceptThirdPartyCookies();
 
@@ -669,6 +675,7 @@
      * @deprecated Please use {@link #setUserAgentString} instead.
      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @Deprecated
     public abstract void setUserAgent(int ua);
@@ -687,6 +694,7 @@
      * @deprecated Please use {@link #getUserAgentString} instead.
      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @Deprecated
     public abstract int getUserAgent();
@@ -1050,6 +1058,7 @@
      *             {@link #setPluginState}
      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @Deprecated
     public abstract void setPluginsEnabled(boolean flag);
@@ -1259,6 +1268,7 @@
      * @deprecated This method has been replaced by {@link #getPluginState}
      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     @Deprecated
     public abstract boolean getPluginsEnabled();
@@ -1445,6 +1455,7 @@
      * WebView.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     public abstract void setVideoOverlayForEmbeddedEncryptedVideoEnabled(boolean flag);
 
@@ -1455,6 +1466,7 @@
      * @see #setVideoOverlayForEmbeddedEncryptedVideoEnabled
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @SystemApi
     public abstract boolean getVideoOverlayForEmbeddedEncryptedVideoEnabled();
 
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 88c0809..e740cc2 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -5348,6 +5348,7 @@
      *
      * @param down true if the scroll is going down, false if it is going up
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     abstract void fillGap(boolean down);
 
     void hideSelector() {
@@ -5385,6 +5386,7 @@
      * @param y Where the user touched
      * @return The position of the first (or only) item in the row containing y
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     abstract int findMotionRow(int y);
 
@@ -5432,6 +5434,7 @@
      *
      * @param position the position of the new selection
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     abstract void setSelectionInt(int position);
 
     /**
diff --git a/core/java/android/widget/AbsSpinner.java b/core/java/android/widget/AbsSpinner.java
index daf6914..76e97ad 100644
--- a/core/java/android/widget/AbsSpinner.java
+++ b/core/java/android/widget/AbsSpinner.java
@@ -310,6 +310,7 @@
         }
     }
 
+    @SuppressWarnings("HiddenAbstractMethod")
     abstract void layout(int delta, boolean animate);
 
     @Override
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index e36243c..da14f2c 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -16,7 +16,7 @@
 
 package android.widget;
 
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_DRAG_AND_DROP;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_DRAG_AND_DROP;
 
 import android.R;
 import android.animation.ValueAnimator;
@@ -98,7 +98,7 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
-import android.view.OnReceiveContentCallback;
+import android.view.OnReceiveContentListener;
 import android.view.SubMenu;
 import android.view.View;
 import android.view.View.DragShadowBuilder;
@@ -207,8 +207,8 @@
     }
 
     // Default content insertion handler.
-    private final TextViewOnReceiveContentCallback mDefaultOnReceiveContentCallback =
-            new TextViewOnReceiveContentCallback();
+    private final TextViewOnReceiveContentListener mDefaultOnReceiveContentListener =
+            new TextViewOnReceiveContentListener();
 
     // Each Editor manages its own undo stack.
     private final UndoManager mUndoManager = new UndoManager();
@@ -589,8 +589,8 @@
     }
 
     @VisibleForTesting
-    public @NonNull TextViewOnReceiveContentCallback getDefaultOnReceiveContentCallback() {
-        return mDefaultOnReceiveContentCallback;
+    public @NonNull TextViewOnReceiveContentListener getDefaultOnReceiveContentListener() {
+        return mDefaultOnReceiveContentListener;
     }
 
     /**
@@ -719,7 +719,7 @@
         hideCursorAndSpanControllers();
         stopTextActionModeWithPreservingSelection();
 
-        mDefaultOnReceiveContentCallback.clearInputConnectionInfo();
+        mDefaultOnReceiveContentListener.clearInputConnectionInfo();
     }
 
     private void discardTextDisplayLists() {
@@ -2869,8 +2869,8 @@
             final int originalLength = mTextView.getText().length();
             Selection.setSelection((Spannable) mTextView.getText(), offset);
             final ClipData clip = event.getClipData();
-            final OnReceiveContentCallback.Payload payload =
-                    new OnReceiveContentCallback.Payload.Builder(clip, SOURCE_DRAG_AND_DROP)
+            final OnReceiveContentListener.Payload payload =
+                    new OnReceiveContentListener.Payload.Builder(clip, SOURCE_DRAG_AND_DROP)
                     .build();
             mTextView.onReceiveContent(payload);
             if (dragDropIntoItself) {
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 3ac78ba..fb13807 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -17,10 +17,10 @@
 package android.widget;
 
 import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
-import static android.view.OnReceiveContentCallback.Payload.FLAG_CONVERT_TO_PLAIN_TEXT;
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_AUTOFILL;
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_CLIPBOARD;
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_PROCESS_TEXT;
+import static android.view.OnReceiveContentListener.Payload.FLAG_CONVERT_TO_PLAIN_TEXT;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_AUTOFILL;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_CLIPBOARD;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_PROCESS_TEXT;
 import static android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_RENDERING_INFO_KEY;
 import static android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH;
 import static android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX;
@@ -154,7 +154,7 @@
 import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
-import android.view.OnReceiveContentCallback;
+import android.view.OnReceiveContentListener.Payload;
 import android.view.PointerIcon;
 import android.view.View;
 import android.view.ViewConfiguration;
@@ -742,8 +742,9 @@
     private boolean mLocalesChanged = false;
     private int mTextSizeUnit = -1;
 
-    // True if force bold text feature is enabled. This feature makes all text bolder.
-    private boolean mForceBoldTextEnabled;
+    // This is used to reflect the current user preference for changing font weight and making text
+    // more bold.
+    private int mFontWeightAdjustment;
     private Typeface mOriginalTypeface;
 
     // True if setKeyListener() has been explicitly called
@@ -1647,8 +1648,7 @@
             attributes.mTypefaceIndex = MONOSPACE;
         }
 
-        mForceBoldTextEnabled = getContext().getResources().getConfiguration().forceBoldText
-                == Configuration.FORCE_BOLD_TEXT_YES;
+        mFontWeightAdjustment = getContext().getResources().getConfiguration().fontWeightAdjustment;
         applyTextAppearance(attributes);
 
         if (isPassword) {
@@ -2151,10 +2151,7 @@
                 if (result != null) {
                     if (isTextEditable()) {
                         ClipData clip = ClipData.newPlainText("", result);
-                        OnReceiveContentCallback.Payload payload =
-                                new OnReceiveContentCallback.Payload.Builder(
-                                        clip, SOURCE_PROCESS_TEXT)
-                                        .build();
+                        Payload payload = new Payload.Builder(clip, SOURCE_PROCESS_TEXT).build();
                         onReceiveContent(payload);
                         if (mEditor != null) {
                             mEditor.refreshTextActionMode();
@@ -4276,12 +4273,8 @@
                 invalidate();
             }
         }
-        if (newConfig.forceBoldText == Configuration.FORCE_BOLD_TEXT_YES) {
-            mForceBoldTextEnabled = true;
-            setTypeface(getTypeface());
-        } else  if (newConfig.forceBoldText == Configuration.FORCE_BOLD_TEXT_NO
-                || newConfig.forceBoldText == Configuration.FORCE_BOLD_TEXT_UNDEFINED) {
-            mForceBoldTextEnabled = false;
+        if (mFontWeightAdjustment != newConfig.fontWeightAdjustment) {
+            mFontWeightAdjustment = newConfig.fontWeightAdjustment;
             setTypeface(getTypeface());
         }
     }
@@ -4436,12 +4429,18 @@
      */
     public void setTypeface(@Nullable Typeface tf) {
         mOriginalTypeface = tf;
-        if (mForceBoldTextEnabled) {
-            int newWeight = tf != null ? tf.getWeight() + 300 : 400;
-            newWeight = Math.min(newWeight, 1000);
-            int typefaceStyle = tf != null ? tf.getStyle() : 0;
-            boolean italic = (typefaceStyle & Typeface.ITALIC) != 0;
-            tf = Typeface.create(tf, newWeight, italic);
+        if (mFontWeightAdjustment != 0
+                && mFontWeightAdjustment != Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED) {
+            if (tf == null) {
+                tf = Typeface.DEFAULT;
+            } else {
+                int newWeight = Math.min(
+                        Math.max(tf.getWeight() + mFontWeightAdjustment, FontStyle.FONT_WEIGHT_MIN),
+                        FontStyle.FONT_WEIGHT_MAX);
+                int typefaceStyle = tf != null ? tf.getStyle() : 0;
+                boolean italic = (typefaceStyle & Typeface.ITALIC) != 0;
+                tf = Typeface.create(tf, newWeight, italic);
+            }
         }
         if (mTextPaint.getTypeface() != tf) {
             mTextPaint.setTypeface(tf);
@@ -11858,8 +11857,7 @@
                     + " cannot be autofilled into " + this);
             return;
         }
-        final OnReceiveContentCallback.Payload payload =
-                new OnReceiveContentCallback.Payload.Builder(clip, SOURCE_AUTOFILL).build();
+        final Payload payload = new Payload.Builder(clip, SOURCE_AUTOFILL).build();
         onReceiveContent(payload);
     }
 
@@ -12926,8 +12924,7 @@
         if (clip == null) {
             return;
         }
-        final OnReceiveContentCallback.Payload payload =
-                new OnReceiveContentCallback.Payload.Builder(clip, SOURCE_CLIPBOARD)
+        final Payload payload = new Payload.Builder(clip, SOURCE_CLIPBOARD)
                 .setFlags(withFormatting ? 0 : FLAG_CONVERT_TO_PLAIN_TEXT)
                 .build();
         onReceiveContent(payload);
@@ -13717,7 +13714,8 @@
     public void onInputConnectionOpenedInternal(@NonNull InputConnection ic,
             @NonNull EditorInfo editorInfo, @Nullable Handler handler) {
         if (mEditor != null) {
-            mEditor.getDefaultOnReceiveContentCallback().setInputConnectionInfo(ic, editorInfo);
+            mEditor.getDefaultOnReceiveContentListener().setInputConnectionInfo(this, ic,
+                    editorInfo);
         }
     }
 
@@ -13725,68 +13723,35 @@
     @Override
     public void onInputConnectionClosedInternal() {
         if (mEditor != null) {
-            mEditor.getDefaultOnReceiveContentCallback().clearInputConnectionInfo();
+            mEditor.getDefaultOnReceiveContentListener().clearInputConnectionInfo();
         }
     }
 
     /**
-     * Sets the callback to handle insertion of content into this view.
+     * Receives the given content. Clients wishing to provide custom behavior should configure a
+     * listener via {@link #setOnReceiveContentListener}.
      *
-     * <p>This callback will be invoked for the following scenarios:
-     * <ol>
-     *     <li>Paste from the clipboard (e.g. "Paste" or "Paste as plain text" action in the
-     *     insertion/selection menu)
-     *     <li>Content insertion from the keyboard (from {@link InputConnection#commitContent})
-     *     <li>Drag and drop (drop events from {@link #onDragEvent(DragEvent)})
-     *     <li>Autofill (from {@link #autofill(AutofillValue)})
-     *     <li>{@link Intent#ACTION_PROCESS_TEXT} replacement
-     * </ol>
+     * <p>If a listener is set, invokes the listener. If the listener returns a non-null result,
+     * executes the default platform handling for the portion of the content returned by the
+     * listener.
      *
-     * <p>This callback is only invoked for content whose MIME type matches a type specified via
-     * the {code mimeTypes} parameter. If the MIME type is not supported by the callback, the
-     * default platform handling will be executed instead (no-op for the default {@link View}).
-     *
-     * <p><em>Note: MIME type matching in the Android framework is case-sensitive, unlike formal RFC
-     * MIME types. As a result, you should always write your MIME types with lower case letters, or
-     * use {@link android.content.Intent#normalizeMimeType} to ensure that it is converted to lower
-     * case.</em>
-     *
-     * @param mimeTypes The type of content for which the callback should be invoked. This may use
-     * wildcards such as "text/*", "image/*", etc. This must not be null or empty if a non-null
-     * callback is passed in.
-     * @param callback The callback to use. This can be null to reset to the default behavior.
-     */
-    @SuppressWarnings("rawtypes")
-    @Override
-    public void setOnReceiveContentCallback(
-            @Nullable String[] mimeTypes,
-            @Nullable OnReceiveContentCallback callback) {
-        super.setOnReceiveContentCallback(mimeTypes, callback);
-    }
-
-    /**
-     * Receives the given content. The default implementation invokes the callback set via
-     * {@link #setOnReceiveContentCallback}. If no callback is set or if the callback does not
-     * support the given content (based on the MIME type), executes the default platform handling
-     * (e.g. coerces content to text if the source is
-     * {@link OnReceiveContentCallback.Payload#SOURCE_CLIPBOARD} and this is an editable
-     * {@link TextView}).
+     * <p>If no listener is set, executes the default platform behavior. 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.
      *
      * @param payload The content to insert and related metadata.
      *
-     * @return Returns true if the content was handled in some way, false otherwise. Actual
-     * insertion may be processed asynchronously in the background and may or may not succeed even
-     * if this method returns true. For example, an app may not end up inserting an item if it
-     * exceeds the app's size limit for that type of content.
+     * @return The portion of the passed-in content that was not handled (may be all, some, or none
+     * of the passed-in content).
      */
     @Override
-    public boolean onReceiveContent(@NonNull OnReceiveContentCallback.Payload payload) {
-        if (super.onReceiveContent(payload)) {
-            return true;
-        } else if (mEditor != null) {
-            return mEditor.getDefaultOnReceiveContentCallback().onReceiveContent(this, payload);
+    public @Nullable Payload onReceiveContent(@NonNull Payload payload) {
+        Payload remaining = super.onReceiveContent(payload);
+        if (remaining != null && mEditor != null) {
+            return mEditor.getDefaultOnReceiveContentListener().onReceiveContent(this, remaining);
         }
-        return false;
+        return remaining;
     }
 
     private static void logCursor(String location, @Nullable String msgFormat, Object ... msgArgs) {
diff --git a/core/java/android/widget/TextViewOnReceiveContentCallback.java b/core/java/android/widget/TextViewOnReceiveContentListener.java
similarity index 70%
rename from core/java/android/widget/TextViewOnReceiveContentCallback.java
rename to core/java/android/widget/TextViewOnReceiveContentListener.java
index 7ed70ec..7ef68ec 100644
--- a/core/java/android/widget/TextViewOnReceiveContentCallback.java
+++ b/core/java/android/widget/TextViewOnReceiveContentListener.java
@@ -17,12 +17,10 @@
 package android.widget;
 
 import static android.content.ContentResolver.SCHEME_CONTENT;
-import static android.view.OnReceiveContentCallback.Payload.FLAG_CONVERT_TO_PLAIN_TEXT;
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_AUTOFILL;
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_DRAG_AND_DROP;
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_INPUT_METHOD;
-
-import static java.util.Collections.singleton;
+import static android.view.OnReceiveContentListener.Payload.FLAG_CONVERT_TO_PLAIN_TEXT;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_AUTOFILL;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_DRAG_AND_DROP;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_INPUT_METHOD;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -39,11 +37,10 @@
 import android.text.Selection;
 import android.text.SpannableStringBuilder;
 import android.text.Spanned;
-import android.util.ArraySet;
 import android.util.Log;
-import android.view.OnReceiveContentCallback;
-import android.view.OnReceiveContentCallback.Payload.Flags;
-import android.view.OnReceiveContentCallback.Payload.Source;
+import android.view.OnReceiveContentListener;
+import android.view.OnReceiveContentListener.Payload.Flags;
+import android.view.OnReceiveContentListener.Payload.Source;
 import android.view.View;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputConnection;
@@ -54,42 +51,38 @@
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Set;
 
 /**
- * Default implementation of {@link android.view.OnReceiveContentCallback} for editable
+ * Default implementation of {@link OnReceiveContentListener} for editable
  * {@link TextView} components. This class handles insertion of text (plain text, styled text, HTML,
- * etc) but not images or other content. This class can be used as a base class for an
- * implementation of {@link android.view.OnReceiveContentCallback} for a {@link TextView}, to
- * provide consistent behavior for insertion of text.
+ * etc) but not images or other content.
+ *
+ * @hide
  */
-public class TextViewOnReceiveContentCallback implements OnReceiveContentCallback<TextView> {
+@VisibleForTesting
+public final class TextViewOnReceiveContentListener implements OnReceiveContentListener {
     private static final String LOG_TAG = "OnReceiveContent";
 
-    private static final String MIME_TYPE_ALL_TEXT = "text/*";
-    private static final Set<String> MIME_TYPES_ALL_TEXT = singleton(MIME_TYPE_ALL_TEXT);
-
     @Nullable private InputConnectionInfo mInputConnectionInfo;
-    @Nullable private ArraySet<String> mCachedSupportedMimeTypes;
 
     @Override
-    public boolean onReceiveContent(@NonNull TextView view, @NonNull Payload payload) {
+    public @Nullable Payload onReceiveContent(@NonNull View view, @NonNull Payload payload) {
         if (Log.isLoggable(LOG_TAG, Log.DEBUG)) {
             Log.d(LOG_TAG, "onReceive: " + payload);
         }
-        ClipData clip = payload.getClip();
-        @Source int source = payload.getSource();
-        @Flags int flags = payload.getFlags();
+        final @Source int source = payload.getSource();
         if (source == SOURCE_INPUT_METHOD) {
             // InputConnection.commitContent() should only be used for non-text input which is not
             // supported by the default implementation.
-            return false;
+            return payload;
         }
         if (source == SOURCE_AUTOFILL) {
-            return onReceiveForAutofill(view, clip, flags);
+            onReceiveForAutofill((TextView) view, payload);
+            return null;
         }
         if (source == SOURCE_DRAG_AND_DROP) {
-            return onReceiveForDragAndDrop(view, clip, flags);
+            onReceiveForDragAndDrop((TextView) view, payload);
+            return null;
         }
 
         // The code here follows the original paste logic from TextView:
@@ -97,7 +90,9 @@
         // In particular, multiple items within the given ClipData will trigger separate calls to
         // replace/insert. This is to preserve the original behavior with respect to TextWatcher
         // notifications fired from SpannableStringBuilder when replace/insert is called.
-        final Editable editable = (Editable) view.getText();
+        final ClipData clip = payload.getClip();
+        final @Flags int flags = payload.getFlags();
+        final Editable editable = (Editable) ((TextView) view).getText();
         final Context context = view.getContext();
         boolean didFirst = false;
         for (int i = 0; i < clip.getItemCount(); i++) {
@@ -118,7 +113,7 @@
                 }
             }
         }
-        return didFirst;
+        return null;
     }
 
     private static void replaceSelection(@NonNull Editable editable,
@@ -131,37 +126,33 @@
         editable.replace(start, end, replacement);
     }
 
-    private boolean onReceiveForAutofill(@NonNull TextView view, @NonNull ClipData clip,
-            @Flags int flags) {
+    private void onReceiveForAutofill(@NonNull TextView view, @NonNull Payload payload) {
+        ClipData clip = payload.getClip();
         if (isUsageOfImeCommitContentEnabled(view)) {
             clip = handleNonTextViaImeCommitContent(clip);
             if (clip == null) {
                 if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) {
                     Log.v(LOG_TAG, "onReceive: Handled via IME");
                 }
-                return true;
+                return;
             }
         }
-        final CharSequence text = coerceToText(clip, view.getContext(), flags);
+        final CharSequence text = coerceToText(clip, view.getContext(), payload.getFlags());
         // First autofill it...
         view.setText(text);
         // ...then move cursor to the end.
         final Editable editable = (Editable) view.getText();
         Selection.setSelection(editable, editable.length());
-        return true;
     }
 
-    private static boolean onReceiveForDragAndDrop(@NonNull TextView textView,
-            @NonNull ClipData clip, @Flags int flags) {
-        final CharSequence text = coerceToText(clip, textView.getContext(), flags);
-        if (text.length() == 0) {
-            return false;
-        }
-        replaceSelection((Editable) textView.getText(), text);
-        return true;
+    private static void onReceiveForDragAndDrop(@NonNull TextView view, @NonNull Payload payload) {
+        final CharSequence text = coerceToText(payload.getClip(), view.getContext(),
+                payload.getFlags());
+        replaceSelection((Editable) view.getText(), text);
     }
 
-    private static CharSequence coerceToText(ClipData clip, Context context, @Flags int flags) {
+    private static @NonNull CharSequence coerceToText(@NonNull ClipData clip,
+            @NonNull Context context, @Flags int flags) {
         SpannableStringBuilder ssb = new SpannableStringBuilder();
         for (int i = 0; i < clip.getItemCount(); i++) {
             CharSequence itemText;
@@ -183,17 +174,17 @@
      * augmented autofill framework (see
      * <a href="/guide/topics/text/autofill-services">autofill services</a>). In order for an app to
      * be able to handle these suggestions, it must normally implement the
-     * {@link android.view.OnReceiveContentCallback} API. To make the adoption of this smoother for
+     * {@link android.view.OnReceiveContentListener} API. To make the adoption of this smoother for
      * apps that have previously implemented the
      * {@link android.view.inputmethod.InputConnection#commitContent(InputContentInfo, int, Bundle)}
-     * API, we reuse that API as a fallback if {@link android.view.OnReceiveContentCallback} is not
+     * API, we reuse that API as a fallback if {@link android.view.OnReceiveContentListener} is not
      * yet implemented by the app. This fallback is only enabled on Android S. This change ID
      * disables the fallback, such that apps targeting Android T and above must implement the
-     * {@link android.view.OnReceiveContentCallback} API in order to accept non-text suggestions.
+     * {@link android.view.OnReceiveContentListener} API in order to accept non-text suggestions.
      */
     @ChangeId
     @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.S) // Enabled on Android T and higher
-    private static final long AUTOFILL_NON_TEXT_REQUIRES_ON_RECEIVE_CONTENT_CALLBACK = 163400105L;
+    private static final long AUTOFILL_NON_TEXT_REQUIRES_ON_RECEIVE_CONTENT_LISTENER = 163400105L;
 
     /**
      * Returns true if we can use the IME {@link InputConnection#commitContent} API in order handle
@@ -206,7 +197,7 @@
             }
             return false;
         }
-        if (Compatibility.isChangeEnabled(AUTOFILL_NON_TEXT_REQUIRES_ON_RECEIVE_CONTENT_CALLBACK)) {
+        if (Compatibility.isChangeEnabled(AUTOFILL_NON_TEXT_REQUIRES_ON_RECEIVE_CONTENT_LISTENER)) {
             if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) {
                 Log.v(LOG_TAG, "Fallback to commitContent disabled (target SDK is above S)");
             }
@@ -238,11 +229,16 @@
      * Invoked by the platform when an {@link InputConnection} is successfully created for the view
      * that owns this callback instance.
      */
-    void setInputConnectionInfo(@NonNull InputConnection ic, @NonNull EditorInfo editorInfo) {
+    void setInputConnectionInfo(@NonNull TextView view, @NonNull InputConnection ic,
+            @NonNull EditorInfo editorInfo) {
         if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) {
             Log.v(LOG_TAG, "setInputConnectionInfo: "
                     + Arrays.toString(editorInfo.contentMimeTypes));
         }
+        if (!isUsageOfImeCommitContentEnabled(view)) {
+            mInputConnectionInfo = null;
+            return;
+        }
         String[] contentMimeTypes = editorInfo.contentMimeTypes;
         if (contentMimeTypes == null || contentMimeTypes.length == 0) {
             mInputConnectionInfo = null;
@@ -262,82 +258,26 @@
         mInputConnectionInfo = null;
     }
 
-    // TODO(b/168253885): Use this to populate the assist structure for Autofill
-
     /** @hide */
     @VisibleForTesting
-    public Set<String> getMimeTypes(TextView view) {
+    @Nullable
+    public String[] getEditorInfoMimeTypes(@NonNull TextView view) {
         if (!isUsageOfImeCommitContentEnabled(view)) {
-            return MIME_TYPES_ALL_TEXT;
+            return null;
         }
-        return getSupportedMimeTypesAugmentedWithImeCommitContentMimeTypes();
-    }
-
-    private Set<String> getSupportedMimeTypesAugmentedWithImeCommitContentMimeTypes() {
-        InputConnectionInfo icInfo = mInputConnectionInfo;
+        final InputConnectionInfo icInfo = mInputConnectionInfo;
         if (icInfo == null) {
             if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) {
-                Log.v(LOG_TAG, "getSupportedMimeTypes: No usable EditorInfo/InputConnection");
+                Log.v(LOG_TAG, "getEditorInfoMimeTypes: No usable EditorInfo");
             }
-            return MIME_TYPES_ALL_TEXT;
+            return null;
         }
-        String[] editorInfoContentMimeTypes = icInfo.mEditorInfoContentMimeTypes;
+        final String[] editorInfoContentMimeTypes = icInfo.mEditorInfoContentMimeTypes;
         if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) {
-            Log.v(LOG_TAG, "getSupportedMimeTypes: Augmenting with EditorInfo.contentMimeTypes: "
+            Log.v(LOG_TAG, "getEditorInfoMimeTypes: "
                     + Arrays.toString(editorInfoContentMimeTypes));
         }
-        ArraySet<String> supportedMimeTypes = mCachedSupportedMimeTypes;
-        if (canReuse(supportedMimeTypes, editorInfoContentMimeTypes)) {
-            return supportedMimeTypes;
-        }
-        supportedMimeTypes = new ArraySet<>(editorInfoContentMimeTypes);
-        supportedMimeTypes.add(MIME_TYPE_ALL_TEXT);
-        mCachedSupportedMimeTypes = supportedMimeTypes;
-        return supportedMimeTypes;
-    }
-
-    /**
-     * We want to avoid creating a new set on every invocation of
-     * {@link #getSupportedMimeTypesAugmentedWithImeCommitContentMimeTypes()}.
-     * This method will check if the cached set of MIME types matches the data in the given array
-     * from {@link EditorInfo} or if a new set should be created. The custom logic is needed for
-     * comparing the data because the set contains the additional "text/*" MIME type.
-     *
-     * @param cachedMimeTypes Previously cached set of MIME types.
-     * @param newEditorInfoMimeTypes MIME types from {@link EditorInfo}.
-     *
-     * @return Returns true if the data in the given cached set matches the data in the array.
-     *
-     * @hide
-     */
-    @VisibleForTesting
-    public static boolean canReuse(@Nullable ArraySet<String> cachedMimeTypes,
-            @NonNull String[] newEditorInfoMimeTypes) {
-        if (cachedMimeTypes == null) {
-            return false;
-        }
-        if (newEditorInfoMimeTypes.length != cachedMimeTypes.size()
-                && newEditorInfoMimeTypes.length != (cachedMimeTypes.size() - 1)) {
-            return false;
-        }
-        final boolean ignoreAllTextMimeType =
-                newEditorInfoMimeTypes.length == (cachedMimeTypes.size() - 1);
-        for (String mimeType : cachedMimeTypes) {
-            if (ignoreAllTextMimeType && mimeType.equals(MIME_TYPE_ALL_TEXT)) {
-                continue;
-            }
-            boolean present = false;
-            for (String editorInfoContentMimeType : newEditorInfoMimeTypes) {
-                if (editorInfoContentMimeType.equals(mimeType)) {
-                    present = true;
-                    break;
-                }
-            }
-            if (!present) {
-                return false;
-            }
-        }
-        return true;
+        return editorInfoContentMimeTypes;
     }
 
     /**
diff --git a/core/java/android/window/DisplayAreaOrganizer.java b/core/java/android/window/DisplayAreaOrganizer.java
index bc3e35c..6cc3cd3 100644
--- a/core/java/android/window/DisplayAreaOrganizer.java
+++ b/core/java/android/window/DisplayAreaOrganizer.java
@@ -78,6 +78,12 @@
     public static final int FEATURE_FULLSCREEN_MAGNIFICATION = FEATURE_SYSTEM_FIRST + 5;
 
     /**
+     * Display area for hiding display cutout feature
+     * @hide
+     */
+    public static final int FEATURE_HIDE_DISPLAY_CUTOUT = FEATURE_SYSTEM_FIRST + 6;
+
+    /**
      * The last boundary of display area for system features
      */
     public static final int FEATURE_SYSTEM_LAST = 10_000;
diff --git a/core/java/com/android/internal/app/ISoundTriggerService.aidl b/core/java/com/android/internal/app/ISoundTriggerService.aidl
index f8aac42..3874de3 100644
--- a/core/java/com/android/internal/app/ISoundTriggerService.aidl
+++ b/core/java/com/android/internal/app/ISoundTriggerService.aidl
@@ -38,8 +38,12 @@
      *
      * It is good practice to clear the binder calling identity prior to calling this, in case the
      * caller is ever in the same process as the callee.
+     *
+     * The binder object being passed is used by the server to keep track of client death, in order
+     * to clean-up whenever that happens.
      */
-    ISoundTriggerSession attachAsOriginator(in Identity originatorIdentity);
+    ISoundTriggerSession attachAsOriginator(in Identity originatorIdentity,
+                                            IBinder client);
 
     /**
      * Creates a new session.
@@ -54,7 +58,11 @@
      *
      * It is good practice to clear the binder calling identity prior to calling this, in case the
      * caller is ever in the same process as the callee.
+     *
+     * The binder object being passed is used by the server to keep track of client death, in order
+     * to clean-up whenever that happens.
      */
     ISoundTriggerSession attachAsMiddleman(in Identity middlemanIdentity,
-                                           in Identity originatorIdentity);
+                                           in Identity originatorIdentity,
+                                           IBinder client);
 }
diff --git a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
index 81c61aa..db25514 100644
--- a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
+++ b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
@@ -216,7 +216,11 @@
      * Caller must provide an identity, used for permission tracking purposes.
      * The uid/pid elements of the identity will be ignored by the server and replaced with the ones
      * provided by binder.
+     *
+     * The client argument is any binder owned by the client, used for tracking is death and
+     * cleaning up in this event.
      */
     IVoiceInteractionSoundTriggerSession createSoundTriggerSessionAsOriginator(
-            in Identity originatorIdentity);
+            in Identity originatorIdentity,
+            IBinder client);
 }
diff --git a/core/java/com/android/internal/inputmethod/CancellationGroup.java b/core/java/com/android/internal/inputmethod/CancellationGroup.java
index a4a2208..aef9e3b 100644
--- a/core/java/com/android/internal/inputmethod/CancellationGroup.java
+++ b/core/java/com/android/internal/inputmethod/CancellationGroup.java
@@ -24,11 +24,10 @@
 
 import java.util.ArrayList;
 import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
 
 /**
- * A utility class, which works as both a factory class of completable objects and a cancellation
- * signal to cancel all the completable objects created by this object.
+ * A utility class, which works as both a factory class of a cancellation signal to cancel
+ * all the completable objects.
  */
 public final class CancellationGroup {
     private final Object mLock = new Object();
@@ -46,274 +45,8 @@
     @GuardedBy("mLock")
     private boolean mCanceled = false;
 
-    /**
-     * An inner class to consolidate completable object types supported by
-     * {@link CancellationGroup}.
-     */
-    public static final class Completable {
-
-        /**
-         * Not intended to be instantiated.
-         */
-        private Completable() {
-        }
-
-        /**
-         * Base class of all the completable types supported by {@link CancellationGroup}.
-         */
-        protected static class ValueBase {
-            /**
-             * {@link CountDownLatch} to be signaled to unblock {@link #await(int, TimeUnit)}.
-             */
-            private final CountDownLatch mLatch = new CountDownLatch(1);
-
-            /**
-             * {@link CancellationGroup} to which this completable object belongs.
-             */
-            @NonNull
-            private final CancellationGroup mParentGroup;
-
-            /**
-             * Lock {@link Object} to guard complete operations within this class.
-             */
-            protected final Object mValueLock = new Object();
-
-            /**
-             * {@code true} after {@link #onComplete()} gets called.
-             */
-            @GuardedBy("mValueLock")
-            protected boolean mHasValue = false;
-
-            /**
-             * Base constructor.
-             *
-             * @param parentGroup {@link CancellationGroup} to which this completable object
-             *                    belongs.
-             */
-            protected ValueBase(@NonNull CancellationGroup parentGroup) {
-                mParentGroup = parentGroup;
-            }
-
-            /**
-             * @return {@link true} if {@link #onComplete()} gets called already.
-             */
-            @AnyThread
-            public boolean hasValue() {
-                synchronized (mValueLock) {
-                    return mHasValue;
-                }
-            }
-
-            /**
-             * Called by subclasses to signale {@link #mLatch}.
-             */
-            @AnyThread
-            protected void onComplete() {
-                mLatch.countDown();
-            }
-
-            /**
-             * Blocks the calling thread until at least one of the following conditions is met.
-             *
-             * <p>
-             *     <ol>
-             *         <li>This object becomes ready to return the value.</li>
-             *         <li>{@link CancellationGroup#cancelAll()} gets called.</li>
-             *         <li>The given timeout period has passed.</li>
-             *     </ol>
-             * </p>
-             *
-             * <p>The caller can distinguish the case 1 and case 2 by calling {@link #hasValue()}.
-             * Note that the return value of {@link #hasValue()} can change from {@code false} to
-             * {@code true} at any time, even after this methods finishes with returning
-             * {@code true}.</p>
-             *
-             * @param timeout length of the timeout.
-             * @param timeUnit unit of {@code timeout}.
-             * @return {@code false} if and only if the given timeout period has passed. Otherwise
-             *         {@code true}.
-             */
-            @AnyThread
-            public boolean await(int timeout, @NonNull TimeUnit timeUnit) {
-                if (!mParentGroup.registerLatch(mLatch)) {
-                    // Already canceled when this method gets called.
-                    return false;
-                }
-                try {
-                    return mLatch.await(timeout, timeUnit);
-                } catch (InterruptedException e) {
-                    return true;
-                } finally {
-                    mParentGroup.unregisterLatch(mLatch);
-                }
-            }
-        }
-
-        /**
-         * Completable object of integer primitive.
-         */
-        public static final class Int extends ValueBase {
-            @GuardedBy("mValueLock")
-            private int mValue = 0;
-
-            private Int(@NonNull CancellationGroup factory) {
-                super(factory);
-            }
-
-            /**
-             * Notify when a value is set to this completable object.
-             *
-             * @param value value to be set.
-             */
-            @AnyThread
-            void onComplete(int value) {
-                synchronized (mValueLock) {
-                    if (mHasValue) {
-                        throw new UnsupportedOperationException(
-                                "onComplete() cannot be called multiple times");
-                    }
-                    mValue = value;
-                    mHasValue = true;
-                }
-                onComplete();
-            }
-
-            /**
-             * @return value associated with this object.
-             * @throws UnsupportedOperationException when called while {@link #hasValue()} returns
-             *                                       {@code false}.
-             */
-            @AnyThread
-            public int getValue() {
-                synchronized (mValueLock) {
-                    if (!mHasValue) {
-                        throw new UnsupportedOperationException(
-                                "getValue() is allowed only if hasValue() returns true");
-                    }
-                    return mValue;
-                }
-            }
-        }
-
-        /**
-         * Base class of completable object types.
-         *
-         * @param <T> type associated with this completable object.
-         */
-        public static class Values<T> extends ValueBase {
-            @GuardedBy("mValueLock")
-            @Nullable
-            private T mValue = null;
-
-            protected Values(@NonNull CancellationGroup factory) {
-                super(factory);
-            }
-
-            /**
-             * Notify when a value is set to this completable value object.
-             *
-             * @param value value to be set.
-             */
-            @AnyThread
-            void onComplete(@Nullable T value) {
-                synchronized (mValueLock) {
-                    if (mHasValue) {
-                        throw new UnsupportedOperationException(
-                                "onComplete() cannot be called multiple times");
-                    }
-                    mValue = value;
-                    mHasValue = true;
-                }
-                onComplete();
-            }
-
-            /**
-             * @return value associated with this object.
-             * @throws UnsupportedOperationException when called while {@link #hasValue()} returns
-             *                                       {@code false}.
-             */
-            @AnyThread
-            @Nullable
-            public T getValue() {
-                synchronized (mValueLock) {
-                    if (!mHasValue) {
-                        throw new UnsupportedOperationException(
-                                "getValue() is allowed only if hasValue() returns true");
-                    }
-                    return mValue;
-                }
-            }
-        }
-
-        /**
-         * Completable object of {@link java.lang.CharSequence}.
-         */
-        public static final class CharSequence extends Values<java.lang.CharSequence> {
-            private CharSequence(@NonNull CancellationGroup factory) {
-                super(factory);
-            }
-        }
-
-        /**
-         * Completable object of {@link android.view.inputmethod.ExtractedText}.
-         */
-        public static final class ExtractedText
-                extends Values<android.view.inputmethod.ExtractedText> {
-            private ExtractedText(@NonNull CancellationGroup factory) {
-                super(factory);
-            }
-        }
-
-        /**
-         * Completable object of {@link android.view.inputmethod.SurroundingText}.
-         */
-        public static final class SurroundingText
-                extends Values<android.view.inputmethod.SurroundingText> {
-            private SurroundingText(@NonNull CancellationGroup factory) {
-                super(factory);
-            }
-        }
-    }
-
-    /**
-     * @return an instance of {@link Completable.Int} that is associated with this
-     *         {@link CancellationGroup}.
-     */
     @AnyThread
-    public Completable.Int createCompletableInt() {
-        return new Completable.Int(this);
-    }
-
-    /**
-     * @return an instance of {@link Completable.CharSequence} that is associated with this
-     *         {@link CancellationGroup}.
-     */
-    @AnyThread
-    public Completable.CharSequence createCompletableCharSequence() {
-        return new Completable.CharSequence(this);
-    }
-
-    /**
-     * @return an instance of {@link Completable.ExtractedText} that is associated with this
-     *         {@link CancellationGroup}.
-     */
-    @AnyThread
-    public Completable.ExtractedText createCompletableExtractedText() {
-        return new Completable.ExtractedText(this);
-    }
-
-    /**
-     * @return an instance of {@link Completable.SurroundingText} that is associated with this
-     *         {@link CancellationGroup}.
-     */
-    @AnyThread
-    public Completable.SurroundingText createCompletableSurroundingText() {
-        return new Completable.SurroundingText(this);
-    }
-
-
-    @AnyThread
-    private boolean registerLatch(@NonNull CountDownLatch latch) {
+    boolean registerLatch(@NonNull CountDownLatch latch) {
         synchronized (mLock) {
             if (mCanceled) {
                 return false;
@@ -329,7 +62,7 @@
     }
 
     @AnyThread
-    private void unregisterLatch(@NonNull CountDownLatch latch) {
+    void unregisterLatch(@NonNull CountDownLatch latch) {
         synchronized (mLock) {
             if (mLatchList != null) {
                 mLatchList.remove(latch);
diff --git a/core/java/com/android/internal/inputmethod/Completable.java b/core/java/com/android/internal/inputmethod/Completable.java
new file mode 100644
index 0000000..16473b9
--- /dev/null
+++ b/core/java/com/android/internal/inputmethod/Completable.java
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.inputmethod;
+
+import android.annotation.AnyThread;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * An class to consolidate completable object types supported by
+ * {@link CancellationGroup}.
+ */
+public final class Completable {
+
+    /**
+     * Not intended to be instantiated.
+     */
+    private Completable() {
+    }
+
+    /**
+     * Base class of all the completable types supported by {@link CancellationGroup}.
+     */
+    protected static class ValueBase {
+        /**
+         * {@link CountDownLatch} to be signaled to unblock
+         * {@link #await(int, TimeUnit, CancellationGroup)}.
+         */
+        private final CountDownLatch mLatch = new CountDownLatch(1);
+
+        /**
+         * Lock {@link Object} to guard complete operations within this class.
+         */
+        protected final Object mValueLock = new Object();
+
+        /**
+         * {@code true} after {@link #onComplete()} gets called.
+         */
+        @GuardedBy("mValueLock")
+        protected boolean mHasValue = false;
+
+        /**
+         * @return {@link true} if {@link #onComplete()} gets called already.
+         */
+        @AnyThread
+        public boolean hasValue() {
+            synchronized (mValueLock) {
+                return mHasValue;
+            }
+        }
+
+        /**
+         * Called by subclasses to signale {@link #mLatch}.
+         */
+        @AnyThread
+        protected void onComplete() {
+            mLatch.countDown();
+        }
+
+        /**
+         * Blocks the calling thread until at least one of the following conditions is met.
+         *
+         * <p>
+         *     <ol>
+         *         <li>This object becomes ready to return the value.</li>
+         *         <li>{@link CancellationGroup#cancelAll()} gets called.</li>
+         *         <li>The given timeout period has passed.</li>
+         *     </ol>
+         * </p>
+         *
+         * <p>The caller can distinguish the case 1 and case 2 by calling {@link #hasValue()}.
+         * Note that the return value of {@link #hasValue()} can change from {@code false} to
+         * {@code true} at any time, even after this methods finishes with returning
+         * {@code true}.</p>
+         *
+         * @param timeout length of the timeout.
+         * @param timeUnit unit of {@code timeout}.
+         * @param cancellationGroup {@link CancellationGroup} to cancel completable objects.
+         * @return {@code false} if and only if the given timeout period has passed. Otherwise
+         *         {@code true}.
+         */
+        @AnyThread
+        public boolean await(int timeout, @NonNull TimeUnit timeUnit,
+                @Nullable CancellationGroup cancellationGroup) {
+            if (cancellationGroup == null) {
+                return awaitInner(timeout, timeUnit);
+            }
+
+            if (!cancellationGroup.registerLatch(mLatch)) {
+                // Already canceled when this method gets called.
+                return false;
+            }
+            try {
+                return awaitInner(timeout, timeUnit);
+            } finally {
+                cancellationGroup.unregisterLatch(mLatch);
+            }
+        }
+
+        private boolean awaitInner(int timeout, @NonNull TimeUnit timeUnit) {
+            try {
+                return mLatch.await(timeout, timeUnit);
+            } catch (InterruptedException e) {
+                return true;
+            }
+        }
+    }
+
+    /**
+     * Completable object of integer primitive.
+     */
+    public static final class Int extends ValueBase {
+        @GuardedBy("mValueLock")
+        private int mValue = 0;
+
+        /**
+         * Notify when a value is set to this completable object.
+         *
+         * @param value value to be set.
+         */
+        @AnyThread
+        void onComplete(int value) {
+            synchronized (mValueLock) {
+                if (mHasValue) {
+                    throw new UnsupportedOperationException(
+                            "onComplete() cannot be called multiple times");
+                }
+                mValue = value;
+                mHasValue = true;
+            }
+            onComplete();
+        }
+
+        /**
+         * @return value associated with this object.
+         * @throws UnsupportedOperationException when called while {@link #hasValue()} returns
+         *                                       {@code false}.
+         */
+        @AnyThread
+        public int getValue() {
+            synchronized (mValueLock) {
+                if (!mHasValue) {
+                    throw new UnsupportedOperationException(
+                            "getValue() is allowed only if hasValue() returns true");
+                }
+                return mValue;
+            }
+        }
+    }
+
+    /**
+     * Base class of completable object types.
+     *
+     * @param <T> type associated with this completable object.
+     */
+    public static class Values<T> extends ValueBase {
+        @GuardedBy("mValueLock")
+        @Nullable
+        private T mValue = null;
+
+        /**
+         * Notify when a value is set to this completable value object.
+         *
+         * @param value value to be set.
+         */
+        @AnyThread
+        void onComplete(@Nullable T value) {
+            synchronized (mValueLock) {
+                if (mHasValue) {
+                    throw new UnsupportedOperationException(
+                            "onComplete() cannot be called multiple times");
+                }
+                mValue = value;
+                mHasValue = true;
+            }
+            onComplete();
+        }
+
+        /**
+         * @return value associated with this object.
+         * @throws UnsupportedOperationException when called while {@link #hasValue()} returns
+         *                                       {@code false}.
+         */
+        @AnyThread
+        @Nullable
+        public T getValue() {
+            synchronized (mValueLock) {
+                if (!mHasValue) {
+                    throw new UnsupportedOperationException(
+                            "getValue() is allowed only if hasValue() returns true");
+                }
+                return mValue;
+            }
+        }
+    }
+
+    /**
+     * @return an instance of {@link Completable.Int}.
+     */
+    public static Completable.Int createInt() {
+        return new Completable.Int();
+    }
+
+    /**
+     * @return an instance of {@link Completable.Boolean}.
+     */
+    public static Completable.Boolean createBoolean() {
+        return new Completable.Boolean();
+    }
+
+    /**
+     * @return an instance of {@link Completable.CharSequence}.
+     */
+    public static Completable.CharSequence createCharSequence() {
+        return new Completable.CharSequence();
+    }
+
+    /**
+     * @return an instance of {@link Completable.ExtractedText}.
+     */
+    public static Completable.ExtractedText createExtractedText() {
+        return new Completable.ExtractedText();
+    }
+
+    /**
+     * @return an instance of {@link Completable.SurroundingText}.
+     */
+    public static Completable.SurroundingText createSurroundingText() {
+        return new Completable.SurroundingText();
+    }
+
+    /**
+     * Completable object of {@link java.lang.Boolean}.
+     */
+    public static final class Boolean extends Values<java.lang.Boolean> { }
+
+    /**
+     * Completable object of {@link java.lang.CharSequence}.
+     */
+    public static final class CharSequence extends Values<java.lang.CharSequence> { }
+
+    /**
+     * Completable object of {@link android.view.inputmethod.ExtractedText}.
+     */
+    public static final class ExtractedText
+            extends Values<android.view.inputmethod.ExtractedText> { }
+
+    /**
+     * Completable object of {@link android.view.inputmethod.SurroundingText}.
+     */
+    public static final class SurroundingText
+            extends Values<android.view.inputmethod.SurroundingText> { }
+
+    /**
+     * Completable object of {@link com.android.internal.view.InputBindResult}.
+     */
+    public static final class InputBindResult
+            extends Values<com.android.internal.view.InputBindResult> { }
+}
diff --git a/core/java/com/android/internal/inputmethod/ResultCallbacks.java b/core/java/com/android/internal/inputmethod/ResultCallbacks.java
index 5eba898..7131284 100644
--- a/core/java/com/android/internal/inputmethod/ResultCallbacks.java
+++ b/core/java/com/android/internal/inputmethod/ResultCallbacks.java
@@ -26,7 +26,7 @@
 
 /**
  * Defines a set of factory methods to create {@link android.os.IBinder}-based callbacks that are
- * associated with completable objects defined in {@link CancellationGroup.Completable}.
+ * associated with completable objects defined in {@link Completable}.
  */
 public final class ResultCallbacks {
 
@@ -50,22 +50,22 @@
     }
 
     /**
-     * Creates {@link IIntResultCallback.Stub} that is to set
-     * {@link CancellationGroup.Completable.Int} when receiving the result.
+     * Creates {@link IIntResultCallback.Stub} that is to set {@link Completable.Int} when receiving
+     * the result.
      *
-     * @param value {@link CancellationGroup.Completable.Int} to be set when receiving the result.
+     * @param value {@link Completable.Int} to be set when receiving the result.
      * @return {@link IIntResultCallback.Stub} that can be passed as a binder IPC parameter.
      */
     @AnyThread
-    public static IIntResultCallback.Stub of(@NonNull CancellationGroup.Completable.Int value) {
-        final AtomicReference<WeakReference<CancellationGroup.Completable.Int>>
+    public static IIntResultCallback.Stub of(@NonNull Completable.Int value) {
+        final AtomicReference<WeakReference<Completable.Int>>
                 atomicRef = new AtomicReference<>(new WeakReference<>(value));
 
         return new IIntResultCallback.Stub() {
             @BinderThread
             @Override
             public void onResult(int result) {
-                final CancellationGroup.Completable.Int value = unwrap(atomicRef);
+                final Completable.Int value = unwrap(atomicRef);
                 if (value == null) {
                     return;
                 }
@@ -76,24 +76,23 @@
 
     /**
      * Creates {@link ICharSequenceResultCallback.Stub} that is to set
-     * {@link CancellationGroup.Completable.CharSequence} when receiving the result.
+     * {@link Completable.CharSequence} when receiving the result.
      *
-     * @param value {@link CancellationGroup.Completable.CharSequence} to be set when receiving the
-     *              result.
+     * @param value {@link Completable.CharSequence} to be set when receiving the result.
      * @return {@link ICharSequenceResultCallback.Stub} that can be passed as a binder IPC
      *         parameter.
      */
     @AnyThread
     public static ICharSequenceResultCallback.Stub of(
-            @NonNull CancellationGroup.Completable.CharSequence value) {
-        final AtomicReference<WeakReference<CancellationGroup.Completable.CharSequence>> atomicRef =
+            @NonNull Completable.CharSequence value) {
+        final AtomicReference<WeakReference<Completable.CharSequence>> atomicRef =
                 new AtomicReference<>(new WeakReference<>(value));
 
         return new ICharSequenceResultCallback.Stub() {
             @BinderThread
             @Override
             public void onResult(CharSequence result) {
-                final CancellationGroup.Completable.CharSequence value = unwrap(atomicRef);
+                final Completable.CharSequence value = unwrap(atomicRef);
                 if (value == null) {
                     return;
                 }
@@ -104,24 +103,23 @@
 
     /**
      * Creates {@link IExtractedTextResultCallback.Stub} that is to set
-     * {@link CancellationGroup.Completable.ExtractedText} when receiving the result.
+     * {@link Completable.ExtractedText} when receiving the result.
      *
-     * @param value {@link CancellationGroup.Completable.ExtractedText} to be set when receiving the
-     *              result.
+     * @param value {@link Completable.ExtractedText} to be set when receiving the result.
      * @return {@link IExtractedTextResultCallback.Stub} that can be passed as a binder IPC
      *         parameter.
      */
     @AnyThread
     public static IExtractedTextResultCallback.Stub of(
-            @NonNull CancellationGroup.Completable.ExtractedText value) {
-        final AtomicReference<WeakReference<CancellationGroup.Completable.ExtractedText>>
+            @NonNull Completable.ExtractedText value) {
+        final AtomicReference<WeakReference<Completable.ExtractedText>>
                 atomicRef = new AtomicReference<>(new WeakReference<>(value));
 
         return new IExtractedTextResultCallback.Stub() {
             @BinderThread
             @Override
             public void onResult(android.view.inputmethod.ExtractedText result) {
-                final CancellationGroup.Completable.ExtractedText value = unwrap(atomicRef);
+                final Completable.ExtractedText value = unwrap(atomicRef);
                 if (value == null) {
                     return;
                 }
@@ -132,24 +130,23 @@
 
     /**
      * Creates {@link ISurroundingTextResultCallback.Stub} that is to set
-     * {@link CancellationGroup.Completable.SurroundingText} when receiving the result.
+     * {@link Completable.SurroundingText} when receiving the result.
      *
-     * @param value {@link CancellationGroup.Completable.SurroundingText} to be set when receiving
-     *              the result.
+     * @param value {@link Completable.SurroundingText} to be set when receiving the result.
      * @return {@link ISurroundingTextResultCallback.Stub} that can be passed as a binder IPC
      *         parameter.
      */
     @AnyThread
     public static ISurroundingTextResultCallback.Stub of(
-            @NonNull CancellationGroup.Completable.SurroundingText value) {
-        final AtomicReference<WeakReference<CancellationGroup.Completable.SurroundingText>>
+            @NonNull Completable.SurroundingText value) {
+        final AtomicReference<WeakReference<Completable.SurroundingText>>
                 atomicRef = new AtomicReference<>(new WeakReference<>(value));
 
         return new ISurroundingTextResultCallback.Stub() {
             @BinderThread
             @Override
             public void onResult(android.view.inputmethod.SurroundingText result) {
-                final CancellationGroup.Completable.SurroundingText value = unwrap(atomicRef);
+                final Completable.SurroundingText value = unwrap(atomicRef);
                 if (value == null) {
                     return;
                 }
diff --git a/core/java/com/android/internal/jank/InteractionJankMonitor.java b/core/java/com/android/internal/jank/InteractionJankMonitor.java
index 137430b..fcaa963 100644
--- a/core/java/com/android/internal/jank/InteractionJankMonitor.java
+++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java
@@ -348,6 +348,57 @@
     }
 
     /**
+     * A helper method to translate interaction type to CUJ name.
+     *
+     * @param interactionType the interaction type defined in AtomsProto.java
+     * @return the name of the interaction type
+     */
+    public static String getNameOfInteraction(int interactionType) {
+        // There is an offset amount of 1 between cujType and interactionType.
+        return getNameOfCuj(interactionType - 1);
+    }
+
+    private static String getNameOfCuj(int cujType) {
+        switch (cujType) {
+            case CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE:
+                return "SHADE_EXPAND_COLLAPSE";
+            case CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE_LOCK:
+                return "SHADE_EXPAND_COLLAPSE_LOCK";
+            case CUJ_NOTIFICATION_SHADE_SCROLL_FLING:
+                return "SHADE_SCROLL_FLING";
+            case CUJ_NOTIFICATION_SHADE_ROW_EXPAND:
+                return "SHADE_ROW_EXPAND";
+            case CUJ_NOTIFICATION_SHADE_ROW_SWIPE:
+                return "SHADE_ROW_SWIPE";
+            case CUJ_NOTIFICATION_SHADE_QS_EXPAND_COLLAPSE:
+                return "SHADE_QS_EXPAND_COLLAPSE";
+            case CUJ_NOTIFICATION_SHADE_QS_SCROLL_SWIPE:
+                return "SHADE_QS_SCROLL_SWIPE";
+            case CUJ_LAUNCHER_APP_LAUNCH_FROM_RECENTS:
+                return "LAUNCHER_APP_LAUNCH_FROM_RECENTS";
+            case CUJ_LAUNCHER_APP_LAUNCH_FROM_ICON:
+                return "LAUNCHER_APP_LAUNCH_FROM_ICON";
+            case CUJ_LAUNCHER_APP_CLOSE_TO_HOME:
+                return "LAUNCHER_APP_CLOSE_TO_HOME";
+            case CUJ_LAUNCHER_APP_CLOSE_TO_PIP:
+                return "LAUNCHER_APP_CLOSE_TO_PIP";
+            case CUJ_LAUNCHER_QUICK_SWITCH:
+                return "LAUNCHER_QUICK_SWITCH";
+            case CUJ_NOTIFICATION_HEADS_UP_APPEAR:
+                return "NOTIFICATION_HEADS_UP_APPEAR";
+            case CUJ_NOTIFICATION_HEADS_UP_DISAPPEAR:
+                return "NOTIFICATION_HEADS_UP_DISAPPEAR";
+            case CUJ_NOTIFICATION_ADD:
+                return "NOTIFICATION_ADD";
+            case CUJ_NOTIFICATION_REMOVE:
+                return "NOTIFICATION_REMOVE";
+            case CUJ_NOTIFICATION_APP_START:
+                return "NOTIFICATION_APP_START";
+        }
+        return "UNKNOWN";
+    }
+
+    /**
      * A class to represent a session.
      */
     public static class Session {
@@ -375,7 +426,7 @@
         }
 
         public String getName() {
-            return "Cuj<" + getCuj() + ">";
+            return "Cuj<" + getNameOfCuj(mCujType) + ">";
         }
     }
 }
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index e7e75a8..7c442b4 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -4014,7 +4014,7 @@
 
     /**
      * Schedules a read of the latest cpu times before removing the isolated UID.
-     * @see #removeIsolatedUidLocked(int)
+     * @see #removeIsolatedUidLocked(int, int, int)
      */
     public void scheduleRemoveIsolatedUidLocked(int isolatedUid, int appUid) {
         int curUid = mIsolatedUids.get(isolatedUid, -1);
@@ -4030,14 +4030,6 @@
      * @see #scheduleRemoveIsolatedUidLocked(int, int)
      */
     @GuardedBy("this")
-    public void removeIsolatedUidLocked(int isolatedUid) {
-        removeIsolatedUidLocked(isolatedUid, mClocks.elapsedRealtime(), mClocks.uptimeMillis());
-    }
-
-    /**
-     * @see #removeIsolatedUidLocked(int)
-     */
-    @GuardedBy("this")
     public void removeIsolatedUidLocked(int isolatedUid, long elapsedRealtimeMs, long uptimeMs) {
         final int idx = mIsolatedUids.indexOfKey(isolatedUid);
         if (idx >= 0) {
@@ -11429,13 +11421,6 @@
      * Distribute WiFi energy info and network traffic to apps.
      * @param info The energy information from the WiFi controller.
      */
-    public void updateWifiState(@Nullable final WifiActivityEnergyInfo info) {
-        updateWifiState(info, mClocks.elapsedRealtime(), mClocks.uptimeMillis());
-    }
-
-    /**
-     * @see #updateWifiState(WifiActivityEnergyInfo)
-     */
     public void updateWifiState(@Nullable final WifiActivityEnergyInfo info,
             long elapsedRealtimeMs, long uptimeMs) {
         if (DEBUG_ENERGY) {
@@ -11714,13 +11699,6 @@
     /**
      * Distribute Cell radio energy info and network traffic to apps.
      */
-    public void updateMobileRadioState(@Nullable final ModemActivityInfo activityInfo) {
-        updateMobileRadioState(activityInfo, mClocks.elapsedRealtime(), mClocks.uptimeMillis());
-    }
-
-    /**
-     * @see #updateMobileRadioState(ModemActivityInfo)
-     */
     public void updateMobileRadioState(@Nullable final ModemActivityInfo activityInfo,
             long elapsedRealtimeMs, long uptimeMs) {
         if (DEBUG_ENERGY) {
@@ -11954,13 +11932,6 @@
      *
      * @param info The energy information from the bluetooth controller.
      */
-    public void updateBluetoothStateLocked(@Nullable final BluetoothActivityEnergyInfo info) {
-        updateBluetoothStateLocked(info, mClocks.elapsedRealtime(), mClocks.uptimeMillis());
-    }
-
-    /**
-     * @see #updateBluetoothStateLocked(BluetoothActivityEnergyInfo)
-     */
     public void updateBluetoothStateLocked(@Nullable final BluetoothActivityEnergyInfo info,
             long elapsedRealtimeMs, long uptimeMs) {
         if (DEBUG_ENERGY) {
@@ -12138,13 +12109,6 @@
      * If RPM stats were fetched more recently than RPM_STATS_UPDATE_FREQ_MS ago, uses the old data
      * instead of fetching it anew.
      */
-    public void updateRpmStatsLocked() {
-        updateRpmStatsLocked(mClocks.elapsedRealtime() * 1000);
-    }
-
-    /**
-     * @see #updateRpmStatsLocked()
-     */
     public void updateRpmStatsLocked(long elapsedRealtimeUs) {
         if (mPlatformIdleStateCallback == null) return;
         long now = SystemClock.elapsedRealtime();
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index 60f1b44..8d1f16b 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -24,7 +24,6 @@
 import android.content.type.DefaultMimeMapFactory;
 import android.os.Build;
 import android.os.DeadObjectException;
-import android.os.Debug;
 import android.os.IBinder;
 import android.os.Process;
 import android.os.SystemProperties;
@@ -257,18 +256,6 @@
          */
         NetworkManagementSocketTagger.install();
 
-        /*
-         * If we're running in an emulator launched with "-trace", put the
-         * VM into emulator trace profiling mode so that the user can hit
-         * F9/F10 at any time to capture traces.  This has performance
-         * consequences, so it's not something you want to do always.
-         */
-        String trace = SystemProperties.get("ro.kernel.android.tracing");
-        if (trace.equals("1")) {
-            Slog.i(TAG, "NOTE: emulator trace profiling enabled");
-            Debug.enableEmulatorTraceOutput();
-        }
-
         initialized = true;
     }
 
diff --git a/core/java/com/android/internal/util/FastDataInput.java b/core/java/com/android/internal/util/FastDataInput.java
index 2e8cb47..f8d241b 100644
--- a/core/java/com/android/internal/util/FastDataInput.java
+++ b/core/java/com/android/internal/util/FastDataInput.java
@@ -17,6 +17,9 @@
 package com.android.internal.util;
 
 import android.annotation.NonNull;
+import android.util.CharsetUtils;
+
+import dalvik.system.VMRuntime;
 
 import java.io.BufferedInputStream;
 import java.io.Closeable;
@@ -25,7 +28,6 @@
 import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.Objects;
 
@@ -39,9 +41,11 @@
 public class FastDataInput implements DataInput, Closeable {
     private static final int MAX_UNSIGNED_SHORT = 65_535;
 
+    private final VMRuntime mRuntime;
     private final InputStream mIn;
 
     private final byte[] mBuffer;
+    private final long mBufferPtr;
     private final int mBufferCap;
 
     private int mBufferPos;
@@ -54,12 +58,14 @@
     private String[] mStringRefs = new String[32];
 
     public FastDataInput(@NonNull InputStream in, int bufferSize) {
+        mRuntime = VMRuntime.getRuntime();
         mIn = Objects.requireNonNull(in);
         if (bufferSize < 8) {
             throw new IllegalArgumentException();
         }
 
-        mBuffer = new byte[bufferSize];
+        mBuffer = (byte[]) mRuntime.newNonMovableArray(byte.class, bufferSize);
+        mBufferPtr = mRuntime.addressOf(mBuffer);
         mBufferCap = mBuffer.length;
     }
 
@@ -123,15 +129,15 @@
         // Attempt to read directly from buffer space if there's enough room,
         // otherwise fall back to chunking into place
         final int len = readUnsignedShort();
-        if (mBufferCap >= len) {
+        if (mBufferCap > len) {
             if (mBufferLim - mBufferPos < len) fill(len);
-            final String res = new String(mBuffer, mBufferPos, len, StandardCharsets.UTF_8);
+            final String res = CharsetUtils.fromModifiedUtf8Bytes(mBufferPtr, mBufferPos, len);
             mBufferPos += len;
             return res;
         } else {
-            final byte[] tmp = new byte[len];
-            readFully(tmp, 0, tmp.length);
-            return new String(tmp, StandardCharsets.UTF_8);
+            final byte[] tmp = (byte[]) mRuntime.newNonMovableArray(byte.class, len + 1);
+            readFully(tmp, 0, len);
+            return CharsetUtils.fromModifiedUtf8Bytes(mRuntime.addressOf(tmp), 0, len);
         }
     }
 
diff --git a/core/java/com/android/internal/util/FastDataOutput.java b/core/java/com/android/internal/util/FastDataOutput.java
index 2530501..83d26e1 100644
--- a/core/java/com/android/internal/util/FastDataOutput.java
+++ b/core/java/com/android/internal/util/FastDataOutput.java
@@ -28,7 +28,6 @@
 import java.io.Flushable;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Objects;
 
@@ -42,6 +41,7 @@
 public class FastDataOutput implements DataOutput, Flushable, Closeable {
     private static final int MAX_UNSIGNED_SHORT = 65_535;
 
+    private final VMRuntime mRuntime;
     private final OutputStream mOut;
 
     private final byte[] mBuffer;
@@ -56,13 +56,14 @@
     private HashMap<String, Short> mStringRefs = new HashMap<>();
 
     public FastDataOutput(@NonNull OutputStream out, int bufferSize) {
+        mRuntime = VMRuntime.getRuntime();
         mOut = Objects.requireNonNull(out);
         if (bufferSize < 8) {
             throw new IllegalArgumentException();
         }
 
-        mBuffer = (byte[]) VMRuntime.getRuntime().newNonMovableArray(byte.class, bufferSize);
-        mBufferPtr = VMRuntime.getRuntime().addressOf(mBuffer);
+        mBuffer = (byte[]) mRuntime.newNonMovableArray(byte.class, bufferSize);
+        mBufferPtr = mRuntime.addressOf(mBuffer);
         mBufferCap = mBuffer.length;
     }
 
@@ -111,21 +112,28 @@
         // Attempt to write directly to buffer space if there's enough room,
         // otherwise fall back to chunking into place
         if (mBufferCap - mBufferPos < 2 + s.length()) drain();
-        final int res = CharsetUtils.toUtf8Bytes(s, mBufferPtr, mBufferPos + 2,
+
+        // Magnitude of this returned value indicates the number of bytes
+        // required to encode the string; sign indicates success/failure
+        int len = CharsetUtils.toModifiedUtf8Bytes(s, mBufferPtr, mBufferPos + 2,
                 mBufferCap - mBufferPos - 2);
-        if (res >= 0) {
-            if (res > MAX_UNSIGNED_SHORT) {
-                throw new IOException("UTF-8 length too large: " + res);
-            }
-            writeShort(res);
-            mBufferPos += res;
+        if (Math.abs(len) > MAX_UNSIGNED_SHORT) {
+            throw new IOException("Modified UTF-8 length too large: " + len);
+        }
+
+        if (len >= 0) {
+            // Positive value indicates the string was encoded into the buffer
+            // successfully, so we only need to prefix with length
+            writeShort(len);
+            mBufferPos += len;
         } else {
-            final byte[] tmp = s.getBytes(StandardCharsets.UTF_8);
-            if (tmp.length > MAX_UNSIGNED_SHORT) {
-                throw new IOException("UTF-8 length too large: " + res);
-            }
-            writeShort(tmp.length);
-            write(tmp, 0, tmp.length);
+            // Negative value indicates buffer was too small and we need to
+            // allocate a temporary buffer for encoding
+            len = -len;
+            final byte[] tmp = (byte[]) mRuntime.newNonMovableArray(byte.class, len + 1);
+            CharsetUtils.toModifiedUtf8Bytes(s, mRuntime.addressOf(tmp), 0, tmp.length);
+            writeShort(len);
+            write(tmp, 0, len);
         }
     }
 
diff --git a/core/java/com/android/internal/util/LatencyTracker.java b/core/java/com/android/internal/util/LatencyTracker.java
index c7ac189..a87e8aa 100644
--- a/core/java/com/android/internal/util/LatencyTracker.java
+++ b/core/java/com/android/internal/util/LatencyTracker.java
@@ -139,6 +139,38 @@
         BackgroundThread.getHandler().post(this::readSettings);
     }
 
+    /**
+     * A helper method to translate action type to name.
+     *
+     * @param action the action type defined in AtomsProto.java
+     * @return the name of the action
+     */
+    public static String getNameOfAction(int action) {
+        // Defined in AtomsProto.java
+        switch (action) {
+            case 0:
+                return "UNKNOWN";
+            case 1:
+                return "ACTION_EXPAND_PANEL";
+            case 2:
+                return "ACTION_TOGGLE_RECENTS";
+            case 3:
+                return "ACTION_FINGERPRINT_WAKE_AND_UNLOCK";
+            case 4:
+                return "ACTION_CHECK_CREDENTIAL";
+            case 5:
+                return "ACTION_CHECK_CREDENTIAL_UNLOCKED";
+            case 6:
+                return "ACTION_TURN_ON_SCREEN";
+            case 7:
+                return "ACTION_ROTATE_SCREEN";
+            case 8:
+                return "ACTION_FACE_WAKE_AND_UNLOCK";
+            default:
+                throw new IllegalArgumentException("Invalid action");
+        }
+    }
+
     private void registerSettingsObserver() {
         Uri settingsUri = Settings.Global.getUriFor(Settings.Global.LATENCY_TRACKER);
         mContext.getContentResolver().registerContentObserver(
diff --git a/core/java/com/android/internal/view/InputConnectionWrapper.java b/core/java/com/android/internal/view/InputConnectionWrapper.java
index e05aa83..ec4fe17 100644
--- a/core/java/com/android/internal/view/InputConnectionWrapper.java
+++ b/core/java/com/android/internal/view/InputConnectionWrapper.java
@@ -37,6 +37,7 @@
 import android.view.inputmethod.SurroundingText;
 
 import com.android.internal.inputmethod.CancellationGroup;
+import com.android.internal.inputmethod.Completable;
 import com.android.internal.inputmethod.ResultCallbacks;
 
 import java.lang.ref.WeakReference;
@@ -85,9 +86,10 @@
     }
 
     @AnyThread
-    private static int getResultOrZero(@NonNull CancellationGroup.Completable.Int value,
-             @NonNull String methodName) {
-        final boolean timedOut = value.await(MAX_WAIT_TIME_MILLIS,  TimeUnit.MILLISECONDS);
+    private static int getResultOrZero(@NonNull Completable.Int value, @NonNull String methodName,
+            @Nullable CancellationGroup cancellationGroup) {
+        final boolean timedOut =
+                value.await(MAX_WAIT_TIME_MILLIS,  TimeUnit.MILLISECONDS, cancellationGroup);
         if (value.hasValue()) {
             return value.getValue();
         }
@@ -97,9 +99,10 @@
 
     @AnyThread
     @Nullable
-    private static <T> T getResultOrNull(@NonNull CancellationGroup.Completable.Values<T> value,
-            @NonNull String methodName) {
-        final boolean timedOut = value.await(MAX_WAIT_TIME_MILLIS,  TimeUnit.MILLISECONDS);
+    private static <T> T getResultOrNull(@NonNull Completable.Values<T> value,
+            @NonNull String methodName, @Nullable CancellationGroup cancellationGroup) {
+        final boolean timedOut =
+                value.await(MAX_WAIT_TIME_MILLIS,  TimeUnit.MILLISECONDS, cancellationGroup);
         if (value.hasValue()) {
             return value.getValue();
         }
@@ -117,14 +120,13 @@
             return null;
         }
 
-        final CancellationGroup.Completable.CharSequence value =
-                mCancellationGroup.createCompletableCharSequence();
+        final Completable.CharSequence value = Completable.createCharSequence();
         try {
             mIInputContext.getTextAfterCursor(length, flags, ResultCallbacks.of(value));
         } catch (RemoteException e) {
             return null;
         }
-        return getResultOrNull(value, "getTextAfterCursor()");
+        return getResultOrNull(value, "getTextAfterCursor()", mCancellationGroup);
     }
 
     /**
@@ -137,14 +139,13 @@
             return null;
         }
 
-        final CancellationGroup.Completable.CharSequence value =
-                mCancellationGroup.createCompletableCharSequence();
+        final Completable.CharSequence value = Completable.createCharSequence();
         try {
             mIInputContext.getTextBeforeCursor(length, flags, ResultCallbacks.of(value));
         } catch (RemoteException e) {
             return null;
         }
-        return getResultOrNull(value, "getTextBeforeCursor()");
+        return getResultOrNull(value, "getTextBeforeCursor()", mCancellationGroup);
     }
 
     @AnyThread
@@ -157,14 +158,13 @@
             // This method is not implemented.
             return null;
         }
-        final CancellationGroup.Completable.CharSequence value =
-                mCancellationGroup.createCompletableCharSequence();
+        final Completable.CharSequence value = Completable.createCharSequence();
         try {
             mIInputContext.getSelectedText(flags, ResultCallbacks.of(value));
         } catch (RemoteException e) {
             return null;
         }
-        return getResultOrNull(value, "getSelectedText()");
+        return getResultOrNull(value, "getSelectedText()", mCancellationGroup);
     }
 
     /**
@@ -190,15 +190,14 @@
             // This method is not implemented.
             return null;
         }
-        final CancellationGroup.Completable.SurroundingText value =
-                mCancellationGroup.createCompletableSurroundingText();
+        final Completable.SurroundingText value = Completable.createSurroundingText();
         try {
             mIInputContext.getSurroundingText(beforeLength, afterLength, flags,
                     ResultCallbacks.of(value));
         } catch (RemoteException e) {
             return null;
         }
-        return getResultOrNull(value, "getSurroundingText()");
+        return getResultOrNull(value, "getSurroundingText()", mCancellationGroup);
     }
 
     @AnyThread
@@ -207,14 +206,13 @@
             return 0;
         }
 
-        final CancellationGroup.Completable.Int value =
-                mCancellationGroup.createCompletableInt();
+        final Completable.Int value = Completable.createInt();
         try {
             mIInputContext.getCursorCapsMode(reqModes, ResultCallbacks.of(value));
         } catch (RemoteException e) {
             return 0;
         }
-        return getResultOrZero(value, "getCursorCapsMode()");
+        return getResultOrZero(value, "getCursorCapsMode()", mCancellationGroup);
     }
 
     @AnyThread
@@ -223,14 +221,13 @@
             return null;
         }
 
-        final CancellationGroup.Completable.ExtractedText value =
-                mCancellationGroup.createCompletableExtractedText();
+        final Completable.ExtractedText value = Completable.createExtractedText();
         try {
             mIInputContext.getExtractedText(request, flags, ResultCallbacks.of(value));
         } catch (RemoteException e) {
             return null;
         }
-        return getResultOrNull(value, "getExtractedText()");
+        return getResultOrNull(value, "getExtractedText()", mCancellationGroup);
     }
 
     @AnyThread
@@ -434,14 +431,14 @@
             // This method is not implemented.
             return false;
         }
-        final CancellationGroup.Completable.Int value = mCancellationGroup.createCompletableInt();
+        final Completable.Int value = Completable.createInt();
         try {
             mIInputContext.requestUpdateCursorAnchorInfo(cursorUpdateMode,
                     ResultCallbacks.of(value));
         } catch (RemoteException e) {
             return false;
         }
-        return getResultOrZero(value, "requestUpdateCursorAnchorInfo()") != 0;
+        return getResultOrZero(value, "requestUpdateCursorAnchorInfo()", mCancellationGroup) != 0;
     }
 
     @AnyThread
@@ -475,13 +472,13 @@
             inputMethodService.exposeContent(inputContentInfo, this);
         }
 
-        final CancellationGroup.Completable.Int value = mCancellationGroup.createCompletableInt();
+        final Completable.Int value = Completable.createInt();
         try {
             mIInputContext.commitContent(inputContentInfo, flags, opts, ResultCallbacks.of(value));
         } catch (RemoteException e) {
             return false;
         }
-        return getResultOrZero(value, "commitContent()") != 0;
+        return getResultOrZero(value, "commitContent()", mCancellationGroup) != 0;
     }
 
     @AnyThread
diff --git a/core/jni/android_media_AudioFormat.h b/core/jni/android_media_AudioFormat.h
index b1b39f3..5f2dcdf 100644
--- a/core/jni/android_media_AudioFormat.h
+++ b/core/jni/android_media_AudioFormat.h
@@ -39,6 +39,8 @@
 #define ENCODING_E_AC3_JOC      18
 #define ENCODING_DOLBY_MAT      19
 #define ENCODING_OPUS           20
+#define ENCODING_PCM_24BIT_PACKED 21
+#define ENCODING_PCM_32BIT 22
 
 #define ENCODING_INVALID    0
 #define ENCODING_DEFAULT    1
@@ -92,6 +94,10 @@
         return AUDIO_FORMAT_MAT;
     case ENCODING_OPUS:
         return AUDIO_FORMAT_OPUS;
+    case ENCODING_PCM_24BIT_PACKED:
+        return AUDIO_FORMAT_PCM_24_BIT_PACKED;
+    case ENCODING_PCM_32BIT:
+        return AUDIO_FORMAT_PCM_32_BIT;
     default:
         return AUDIO_FORMAT_INVALID;
     }
@@ -107,10 +113,15 @@
     case AUDIO_FORMAT_PCM_FLOAT:
         return ENCODING_PCM_FLOAT;
 
-    // map these to ENCODING_PCM_FLOAT
-    case AUDIO_FORMAT_PCM_8_24_BIT:
+    // As of S, these extend integer precision formats now return more specific values
+    // than ENCODING_PCM_FLOAT.
     case AUDIO_FORMAT_PCM_24_BIT_PACKED:
+        return ENCODING_PCM_24BIT_PACKED;
     case AUDIO_FORMAT_PCM_32_BIT:
+        return ENCODING_PCM_32BIT;
+
+    // map this to ENCODING_PCM_FLOAT
+    case AUDIO_FORMAT_PCM_8_24_BIT:
         return ENCODING_PCM_FLOAT;
 
     case AUDIO_FORMAT_AC3:
diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp
index f05c6a4..787d348 100644
--- a/core/jni/android_os_Parcel.cpp
+++ b/core/jni/android_os_Parcel.cpp
@@ -90,6 +90,14 @@
     env->CallVoidMethod(parcelObj, gParcelOffsets.recycle);
 }
 
+static void android_os_Parcel_markSensitive(jlong nativePtr)
+{
+    Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
+    if (parcel) {
+        parcel->markSensitive();
+    }
+}
+
 static jint android_os_Parcel_dataSize(jlong nativePtr)
 {
     Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
@@ -741,6 +749,8 @@
 
 static const JNINativeMethod gParcelMethods[] = {
     // @CriticalNative
+    {"nativeMarkSensitive",             "(J)V", (void*)android_os_Parcel_markSensitive},
+    // @CriticalNative
     {"nativeDataSize",            "(J)I", (void*)android_os_Parcel_dataSize},
     // @CriticalNative
     {"nativeDataAvail",           "(J)I", (void*)android_os_Parcel_dataAvail},
diff --git a/core/jni/android_util_CharsetUtils.cpp b/core/jni/android_util_CharsetUtils.cpp
index 3e1d4a7..7ab6e8f2 100644
--- a/core/jni/android_util_CharsetUtils.cpp
+++ b/core/jni/android_util_CharsetUtils.cpp
@@ -19,13 +19,14 @@
 
 namespace android {
 
-static jint android_util_CharsetUtils_toUtf8Bytes(JNIEnv *env, jobject clazz,
+static jint android_util_CharsetUtils_toModifiedUtf8Bytes(JNIEnv *env, jobject clazz,
         jstring src, jint srcLen, jlong dest, jint destOff, jint destLen) {
     char *destPtr = reinterpret_cast<char*>(dest);
 
     // Quickly check if destination has plenty of room for worst-case
     // 4-bytes-per-char encoded size
-    if (destOff >= 0 && destOff + (srcLen * 4) < destLen) {
+    const size_t worstLen = (srcLen * 4);
+    if (destOff >= 0 && destOff + worstLen < destLen) {
         env->GetStringUTFRegion(src, 0, srcLen, destPtr + destOff);
         return strlen(destPtr + destOff + srcLen) + srcLen;
     }
@@ -38,13 +39,29 @@
         return encodedLen;
     }
 
-    return -1;
+    return -encodedLen;
+}
+
+static jstring android_util_CharsetUtils_fromModifiedUtf8Bytes(JNIEnv *env, jobject clazz,
+        jlong src, jint srcOff, jint srcLen) {
+    char *srcPtr = reinterpret_cast<char*>(src);
+
+    // This is funky, but we need to temporarily swap a null byte so that
+    // JNI knows where the string ends; we'll put it back, we promise
+    char tmp = srcPtr[srcOff + srcLen];
+    srcPtr[srcOff + srcLen] = '\0';
+    jstring res = env->NewStringUTF(srcPtr + srcOff);
+    srcPtr[srcOff + srcLen] = tmp;
+    return res;
 }
 
 static const JNINativeMethod methods[] = {
     // @FastNative
-    {"toUtf8Bytes",      "(Ljava/lang/String;IJII)I",
-            (void*)android_util_CharsetUtils_toUtf8Bytes},
+    {"toModifiedUtf8Bytes",      "(Ljava/lang/String;IJII)I",
+            (void*)android_util_CharsetUtils_toModifiedUtf8Bytes},
+    // @FastNative
+    {"fromModifiedUtf8Bytes",    "(JII)Ljava/lang/String;",
+            (void*)android_util_CharsetUtils_fromModifiedUtf8Bytes},
 };
 
 int register_android_util_CharsetUtils(JNIEnv *env) {
diff --git a/core/proto/android/app/enums.proto b/core/proto/android/app/enums.proto
index 2d2c8ac..722194b 100644
--- a/core/proto/android/app/enums.proto
+++ b/core/proto/android/app/enums.proto
@@ -211,4 +211,5 @@
     APP_OP_PHONE_CALL_CAMERA = 101;
     APP_OP_RECORD_AUDIO_HOTWORD = 102;
     APP_OP_MANAGE_ONGOING_CALLS = 103;
+    APP_OP_MANAGE_CREDENTIALS = 104;
 }
diff --git a/core/proto/android/content/configuration.proto b/core/proto/android/content/configuration.proto
index d578414..b1ffe38 100644
--- a/core/proto/android/content/configuration.proto
+++ b/core/proto/android/content/configuration.proto
@@ -49,7 +49,7 @@
     optional uint32 density_dpi = 18;
     optional .android.app.WindowConfigurationProto window_configuration = 19;
     optional string locale_list = 20;
-    optional uint32 force_bold_text = 21;
+    optional uint32 font_weight_adjustment = 21;
 }
 
 /**
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index d934b82..6f4085d 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -229,7 +229,7 @@
 
     optional SettingProto enhanced_voice_privacy_enabled = 23 [ (android.privacy).dest = DEST_AUTOMATIC ];
 
-    optional SettingProto force_bold_text = 85 [ (android.privacy).dest = DEST_AUTOMATIC ];
+    optional SettingProto font_weight_adjustment = 85 [ (android.privacy).dest = DEST_AUTOMATIC ];
 
     message Gesture {
         optional SettingProto aware_enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
diff --git a/core/proto/android/stats/mediametrics/mediametrics.proto b/core/proto/android/stats/mediametrics/mediametrics.proto
index 9f0ff59..9d49126 100644
--- a/core/proto/android/stats/mediametrics/mediametrics.proto
+++ b/core/proto/android/stats/mediametrics/mediametrics.proto
@@ -237,3 +237,107 @@
     optional int32 video_bitrate = 20;
     optional int32 iframe_interval = 21;
 }
+
+enum StreamType {
+    STREAM_TYPE_UNKNOWN = 0;
+    STREAM_TYPE_OTHER = 1;
+    STREAM_TYPE_PROGRESSIVE = 2;
+    STREAM_TYPE_DASH = 3;
+    STREAM_TYPE_HLS = 4;
+    STREAM_TYPE_SS = 5;
+}
+
+enum DrmType {
+    DRM_TYPE_NONE = 0;
+    DRM_TYPE_OTHER = 1;
+    DRM_TYPE_PLAY_READY = 2;
+    DRM_TYPE_WV_L1 = 3;
+    DRM_TYPE_WV_L3 = 4;
+}
+
+enum PlaybackType {
+    PLAYBACK_TYPE_VOD = 0;
+    PLAYBACK_TYPE_LIVE = 1;
+    PLAYBACK_TYPE_OTHER = 2;
+}
+
+enum ContentType {
+    CONTENT_TYPE_MAIN = 0;
+    CONTENT_TYPE_AD = 1;
+    CONTENT_TYPE_OTHER = 2;
+}
+
+enum StreamSourceType {
+    STREAM_SOURCE_UNKNOWN = 0;
+    STREAM_SOURCE_NETWORK = 1;
+    STREAM_SOURCE_DEVICE = 2;
+    STREAM_SOURCE_MIXED = 3;
+}
+enum NetworkType {
+    NETWORK_TYPE_NONE = 0;
+    NETWORK_TYPE_OTHER = 1;
+    NETWORK_TYPE_WIFI = 2;
+    NETWORK_TYPE_ETHERNET = 3;
+    NETWORK_TYPE_2G = 4;
+    NETWORK_TYPE_3G = 5;
+    NETWORK_TYPE_4G = 6;
+    NETWORK_TYPE_5G_NSA = 7;
+    NETWORK_TYPE_5G_SA = 8;
+}
+
+enum PlaybackState {
+    // Playback has not started (initial state)
+    NOT_STARTED = 0;
+    // Playback is buffering in the background for initial playback start
+    JOINING_BACKGROUND = 1;
+    // Playback is buffering in the foreground for initial playback start
+    JOINING_FOREGROUND = 2;
+    // Playback is actively playing
+    PLAYING = 3;
+    // Playback is paused but ready to play
+    PAUSED = 4;
+    // Playback is handling a seek
+    SEEKING = 5;
+    // Playback is buffering to resume active playback
+    BUFFERING = 6;
+    // Playback is buffering while paused
+    PAUSED_BUFFERING = 7;
+    // Playback is suppressed (e.g. due to audio focus loss)
+    SUPPRESSED = 8;
+    // Playback is suppressed (e.g. due to audio focus loss) while buffering to resume a
+    // playback
+    SUPPRESSED_BUFFERING = 9;
+    // Playback has reached the end of the media
+    ENDED = 10;
+    // Playback is stopped and can be restarted
+    STOPPED = 11;
+    // Playback is stopped due a fatal error and can be retried
+    FAILED = 12;
+    // Playback is interrupted by an ad
+    INTERRUPTED_BY_AD = 13;
+    // Playback is abandoned before reaching the end of the media
+    ABANDONED = 14;
+}
+
+enum PlaybackErrorCode {
+    ERROR_CODE_UNKNOWN = 0;
+    ERROR_CODE_OTHER = 1;
+    ERROR_CODE_RUNTIME = 2;
+}
+
+enum TrackType {
+    AUDIO = 0;
+    VIDEO = 1;
+    TEXT = 2;
+}
+enum TrackState {
+    OFF = 0;
+    ON = 1;
+}
+enum TrackChangeReason {
+    REASON_UNKNOWN = 0;
+    REASON_OTHER = 1;
+    REASON_INITIAL = 2;
+    REASON_MANUAL = 3;
+    REASON_ADAPTIVE = 4;
+}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index fbc5287..ea667277 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -668,6 +668,10 @@
     <!-- For tether entitlement recheck-->
     <protected-broadcast
         android:name="com.android.server.connectivity.tethering.PROVISIONING_RECHECK_ALARM" />
+
+    <!-- Made protected in S (was added in R) -->
+    <protected-broadcast android:name="com.android.internal.intent.action.BUGREPORT_REQUESTED" />
+
     <!-- ====================================================================== -->
     <!--                          RUNTIME PERMISSIONS                           -->
     <!-- ====================================================================== -->
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 1e07593..a7e2994 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -2052,7 +2052,7 @@
     <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selector del acceso directo de accesibilidad en pantalla"</string>
     <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Acceso directo de accesibilidad"</string>
     <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de subtítulos de <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
-    <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Se colocó <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> en el depósito RESTRICTED"</string>
+    <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Se colocó <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> en el bucket RESTRICTED"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"envió una imagen"</string>
     <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversación"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 542aaf0..95e64bb 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -690,9 +690,9 @@
     <string name="policylab_forceLock" msgid="7360335502968476434">"Verrouiller l\'écran"</string>
     <string name="policydesc_forceLock" msgid="1008844760853899693">"Gérer le mode et les conditions de verrouillage de l\'écran"</string>
     <string name="policylab_wipeData" msgid="1359485247727537311">"Effacer toutes les données"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Effacer les données de la tablette sans avertissement, en rétablissant la configuration d\'usine"</string>
+    <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Effacer les données de la tablette sans avertissement, en rétablissant les paramètres par défaut"</string>
     <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Effacez les données de votre appareil Android TV sans avertissement en effectuant une réinitialisation des paramètres d\'usine."</string>
-    <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Effacer les données du téléphone sans avertissement, en rétablissant la configuration d\'usine"</string>
+    <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Effacer les données du téléphone sans avertissement en rétablissant les paramètres par défaut"</string>
     <string name="policylab_wipeData_secondaryUser" msgid="413813645323433166">"Effacer les données de l\'utilisateur"</string>
     <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="2336676480090926470">"Effacer les données de l\'utilisateur sur cette tablette sans avertissement."</string>
     <string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2293713284515865200">"Effacez les données de cet utilisateur sur cet appareil Android TV sans avertissement."</string>
@@ -870,12 +870,12 @@
     <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="3069635524964070596">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Au bout de <xliff:g id="NUMBER_1">%2$d</xliff:g> échecs supplémentaires, vous devrez déverrouiller votre tablette à l\'aide de votre identifiant Google.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="6399092175942158529">"Vous avez dessiné votre schéma de déverrouillage incorrectement à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprise(s). Après <xliff:g id="NUMBER_1">%2$d</xliff:g> autre(s) tentative(s) incorrecte(s), vous devrez déverrouiller votre appareil Android TV en vous connectant à votre compte Google.\n\n Réessayez dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="5691623136957148335">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Au bout de <xliff:g id="NUMBER_1">%2$d</xliff:g> échecs supplémentaires, vous devrez déverrouiller votre téléphone à l\'aide de votre identifiant Google.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string>
-    <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="7914445759242151426">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, sa configuration d\'usine sera rétablie, et toutes les données utilisateur seront perdues."</string>
+    <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="7914445759242151426">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, ses paramètres par défaut seront rétablis, et toutes les données d\'utilisateur seront perdues."</string>
     <string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="4275591249631864248">"Vous avez tenté de déverrouiller votre appareil Android TV incorrectement à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprise(s). Après <xliff:g id="NUMBER_1">%2$d</xliff:g> autre(s) tentative(s) incorrecte(s), votre appareil Android TV sera réinitialisé à ses valeurs d\'usine et toutes les données personnelles seront supprimées."</string>
-    <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="1166532464798446579">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, sa configuration d\'usine sera rétablie, et toutes les données utilisateur seront perdues."</string>
-    <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="8682445539263683414">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Sa configuration d\'usine va être rétablie."</string>
+    <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="1166532464798446579">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, ses paramètres par défaut seront rétablis, et toutes les données d\'utilisateur seront perdues."</string>
+    <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="8682445539263683414">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Ses paramètres par défaut vont être rétablis."</string>
     <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="2205435033340091883">"Vous avez tenté de déverrouiller votre appareil Android TV incorrectement à <xliff:g id="NUMBER">%d</xliff:g> reprise(s). Votre appareil Android TV sera maintenant réinitialisé à ses valeurs d\'usine."</string>
-    <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="2203704707679895487">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Sa configuration d\'usine va être rétablie."</string>
+    <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="2203704707679895487">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Ses paramètres par défaut vont être rétablis."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6807200118164539589">"Veuillez réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="8362442730606839031">"Schéma oublié?"</string>
     <string name="lockscreen_glogin_forgot_pattern" msgid="9218940117797602518">"Déverrouillage du compte"</string>
@@ -1614,12 +1614,12 @@
     <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="23741434207544038">"Vous avez saisi un NIP incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. \n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string>
     <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="3328686432962224215">"Vous avez saisi un mot de passe incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. \n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string>
     <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="7357404233979139075">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string>
-    <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="3479940221343361587">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, sa configuration d\'usine sera rétablie, et toutes les données utilisateur seront perdues."</string>
+    <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="3479940221343361587">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, ses paramètres par défaut seront rétablis, et toutes les données d\'utilisateur seront perdues."</string>
     <string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="9064457748587850217">"Vous avez tenté de déverrouiller votre appareil Android TV incorrectement à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprise(s). Après <xliff:g id="NUMBER_1">%2$d</xliff:g> autre(s) tentative(s) incorrecte(s), votre appareil Android TV sera réinitialisé à ses valeurs d\'usine et toutes les données personnelles seront supprimées."</string>
-    <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="5955398963754432548">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, sa configuration d\'usine sera rétablie, et toutes les données utilisateur seront perdues."</string>
-    <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2299099385175083308">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Sa configuration d\'usine va être rétablie."</string>
+    <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="5955398963754432548">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, ses paramètres par défaut seront rétablis, et toutes les données d\'utilisateur seront perdues."</string>
+    <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2299099385175083308">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Ses paramètres par défaut vont être rétablis."</string>
     <string name="kg_failed_attempts_now_wiping" product="tv" msgid="5045460916106267585">"Vous avez tenté de déverrouiller votre appareil Android TV incorrectement à <xliff:g id="NUMBER">%d</xliff:g> reprise(s). Votre appareil Android TV sera maintenant réinitialisé à ses valeurs d\'usine."</string>
-    <string name="kg_failed_attempts_now_wiping" product="default" msgid="5043730590446071189">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Sa configuration d\'usine va être rétablie."</string>
+    <string name="kg_failed_attempts_now_wiping" product="default" msgid="5043730590446071189">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Ses paramètres par défaut vont être rétablis."</string>
     <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="7086799295109717623">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, vous devrez déverrouiller votre tablette à l\'aide d\'un compte de messagerie électronique.\n\n Veuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string>
     <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4670840383567106114">"Vous avez dessiné votre schéma de déverrouillage incorrectement à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprise(s). Après <xliff:g id="NUMBER_1">%2$d</xliff:g> autre(s) tentative(s) incorrecte(s), vous devrez déverrouiller votre appareil Android TV à l\'aide d\'un compte de courriel.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string>
     <string name="kg_failed_attempts_almost_at_login" product="default" msgid="5270861875006378092">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, vous devrez déverrouiller votre téléphone à l\'aide d\'un compte de messagerie électronique.\n\n Veuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string>
@@ -1849,7 +1849,7 @@
     <string name="zen_mode_default_events_name" msgid="2280682960128512257">"Événement"</string>
     <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"Sommeil"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> désactive certains sons"</string>
-    <string name="system_error_wipe_data" msgid="5910572292172208493">"Un problème interne est survenu avec votre appareil. Il se peut qu\'il soit instable jusqu\'à ce que vous le réinitialisiez à sa configuration d\'usine."</string>
+    <string name="system_error_wipe_data" msgid="5910572292172208493">"Un problème interne est survenu avec votre appareil. Il se peut qu\'il soit instable jusqu\'à ce que vous le réinitialisiez à ses paramètres par défaut."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Un problème interne est survenu avec votre appareil. Communiquez avec le fabricant pour obtenir plus de détails."</string>
     <string name="stk_cc_ussd_to_dial" msgid="3139884150741157610">"La demande USSD a été remplacée par une demande d\'appel régulier"</string>
     <string name="stk_cc_ussd_to_ss" msgid="4826846653052609738">"La demande USSD a été remplacée par une demande SS"</string>
diff --git a/core/res/res/values-mcc311-mnc180-as/strings.xml b/core/res/res/values-mcc311-mnc180-as/strings.xml
new file mode 100644
index 0000000..daa090c
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-as/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"ছিমখন প্ৰ\'ভিজন কৰা হোৱা নাই MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"ছিমৰ অনুমতি নাই MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"ফ\'নৰ অনুমতি নাই MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-az/strings.xml b/core/res/res/values-mcc311-mnc180-az/strings.xml
new file mode 100644
index 0000000..7b8bd89
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-az/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"SIM MM#2 təmin etmir"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"SIM MM#3 dəstəkləmir"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"MM#6 telefonu dəstəklənmir"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-b+sr+Latn/strings.xml b/core/res/res/values-mcc311-mnc180-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..6cbc6ee
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-b+sr+Latn/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"SIM kartica nije podešena MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"SIM kartica nije dozvoljena MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"Telefon nije dozvoljen MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-be/strings.xml b/core/res/res/values-mcc311-mnc180-be/strings.xml
new file mode 100644
index 0000000..363bcde5
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-be/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"SIM-карты няма MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"SIM-карта не дапускаецца MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"Тэлефон не дапускаецца MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-bn/strings.xml b/core/res/res/values-mcc311-mnc180-bn/strings.xml
new file mode 100644
index 0000000..23b9fdf
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-bn/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"সিমের জন্য প্রস্তুত নয় MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"সিমের অনুমতি নেই MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"ফোন অনুমোদিত নয় MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-bs/strings.xml b/core/res/res/values-mcc311-mnc180-bs/strings.xml
new file mode 100644
index 0000000..c73e0dc
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-bs/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"SIM kartica nije dodijeljena MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"SIM kartica nije dozvoljena MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"Telefon nije dozvoljen MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-en-rAU/strings.xml b/core/res/res/values-mcc311-mnc180-en-rAU/strings.xml
new file mode 100644
index 0000000..bd58d57
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-en-rAU/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"SIM not provisioned MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"SIM not allowed MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"Phone not allowed MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-en-rCA/strings.xml b/core/res/res/values-mcc311-mnc180-en-rCA/strings.xml
new file mode 100644
index 0000000..bd58d57
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-en-rCA/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"SIM not provisioned MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"SIM not allowed MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"Phone not allowed MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-en-rXC/strings.xml b/core/res/res/values-mcc311-mnc180-en-rXC/strings.xml
new file mode 100644
index 0000000..a9fdf61
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-en-rXC/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‎‎‎‏‎‎‏‎‏‎‎‎‎‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎‎SIM not provisioned MM#2‎‏‎‎‏‎"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‎‏‏‏‏‎‏‎‎‏‎‏‎SIM not allowed MM#3‎‏‎‎‏‎"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‎‎‎‏‎‎‎‎‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎Phone not allowed MM#6‎‏‎‎‏‎"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-gu/strings.xml b/core/res/res/values-mcc311-mnc180-gu/strings.xml
new file mode 100644
index 0000000..26f735b
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-gu/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"SIMને MM#2ની જોગવાઈ નથી"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"SIMને MM#3 કરવાની મંજૂરી નથી"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"MM#6 ફોનની મંજૂરી નથી"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-kk/strings.xml b/core/res/res/values-mcc311-mnc180-kk/strings.xml
new file mode 100644
index 0000000..18c492d
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-kk/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"SIM картасы қарастырылмаған MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"SIM картасына рұқсат етілмеген MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"Телефон пайдалануға болмайды MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-kn/strings.xml b/core/res/res/values-mcc311-mnc180-kn/strings.xml
new file mode 100644
index 0000000..6de3655
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-kn/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"MM#2 ಗೆ ಸಿಮ್‌ ಸಿದ್ಧವಾಗಿಲ್ಲ"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"ಸಿಮ್‌ MM#3 ಅನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"ಫೋನ್ MM#6 ಅನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-or/strings.xml b/core/res/res/values-mcc311-mnc180-or/strings.xml
new file mode 100644
index 0000000..8b2ffd9
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-or/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"SIM କାର୍ଡ ପ୍ରସ୍ତୁତ କରାଯାଇନାହିଁ MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"SIM କାର୍ଡର ଅନୁମତି ନାହିଁ MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"ଫୋନ୍‌ର ଅନୁମତି ନାହିଁ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-pa/strings.xml b/core/res/res/values-mcc311-mnc180-pa/strings.xml
new file mode 100644
index 0000000..b716a2e1
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-pa/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"ਸਿਮ ਦੀ ਵਿਵਸਥਾ ਨਹੀਂ ਹੈ MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"ਸਿਮ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"ਫ਼ੋਨ ਨੂੰ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-pt-rBR/strings.xml b/core/res/res/values-mcc311-mnc180-pt-rBR/strings.xml
new file mode 100644
index 0000000..6788df9
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-pt-rBR/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"Chip não aprovisionado MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"Chip não permitido MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"Smartphone não permitido MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-sq/strings.xml b/core/res/res/values-mcc311-mnc180-sq/strings.xml
new file mode 100644
index 0000000..eeec051
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-sq/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"Karta SIM nuk është dhënë MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"Karta SIM nuk lejohet MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"Telefoni nuk lejohet MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-ta/strings.xml b/core/res/res/values-mcc311-mnc180-ta/strings.xml
new file mode 100644
index 0000000..5a9f97b
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-ta/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"சிம் அமைக்கப்படவில்லை MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"சிம் அனுமதிக்கப்படவில்லை MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"ஃபோன் அனுமதிக்கப்படவில்லை MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-te/strings.xml b/core/res/res/values-mcc311-mnc180-te/strings.xml
new file mode 100644
index 0000000..7368dae3
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-te/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"SIM MM#2ని సక్రియం చేయలేదు"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"SIM MM#3ని అనుమతించలేదు"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"ఫోన్ అనుమతించబడదు MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-ur/strings.xml b/core/res/res/values-mcc311-mnc180-ur/strings.xml
new file mode 100644
index 0000000..57695ec
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-ur/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"‏SIM فراہم کردہ نہیں ہے MM#2"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"‏SIM کی اجازت نہیں ہے MM#3"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"‏فون کی اجازت نہیں ہے MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc180-uz/strings.xml b/core/res/res/values-mcc311-mnc180-uz/strings.xml
new file mode 100644
index 0000000..bb1f84a
--- /dev/null
+++ b/core/res/res/values-mcc311-mnc180-uz/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mmcc_imsi_unknown_in_hlr" msgid="604133804161351810">"SIM karta ishlatish taqiqlangan (MM#2)"</string>
+    <string name="mmcc_illegal_ms" msgid="4073997279280371621">"SIM karta ishlatish taqiqlangan (MM#3)"</string>
+    <string name="mmcc_illegal_me" msgid="4936539345546223576">"Chaqiruvlar taqiqlangan (MM#6)"</string>
+</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 2d56fb1..d959a37 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -829,12 +829,12 @@
     <string name="keyguard_password_enter_password_code" msgid="2751130557661643482">"అన్‌లాక్ చేయడానికి పాస్‌వర్డ్‌ను టైప్ చేయండి"</string>
     <string name="keyguard_password_enter_pin_password_code" msgid="7792964196473964340">"అన్‌లాక్ చేయడానికి పిన్‌ను టైప్ చేయండి"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="8583732939138432793">"చెల్లని పిన్‌ కోడ్."</string>
-    <string name="keyguard_label_text" msgid="3841953694564168384">"అన్‌లాక్ చేయడానికి, మెను ఆపై 0ని నొక్కండి."</string>
+    <string name="keyguard_label_text" msgid="3841953694564168384">"అన్‌లాక్ చేయడానికి, మెనూ ఆపై 0ని నొక్కండి."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="2978165477085612673">"అత్యవసర నంబర్"</string>
     <string name="lockscreen_carrier_default" msgid="6192313772955399160">"సేవ లేదు"</string>
     <string name="lockscreen_screen_locked" msgid="7364905540516041817">"స్క్రీన్ లాక్ చేయబడింది."</string>
-    <string name="lockscreen_instructions_when_pattern_enabled" msgid="7982445492532123308">"అన్‌లాక్ చేయడానికి లేదా అత్యవసర కాల్ చేయడానికి మెను నొక్కండి."</string>
-    <string name="lockscreen_instructions_when_pattern_disabled" msgid="7434061749374801753">"అన్‌లాక్ చేయడానికి మెను నొక్కండి."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled" msgid="7982445492532123308">"అన్‌లాక్ చేయడానికి లేదా అత్యవసర కాల్ చేయడానికి మెనూ నొక్కండి."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled" msgid="7434061749374801753">"అన్‌లాక్ చేయడానికి మెనూ నొక్కండి."</string>
     <string name="lockscreen_pattern_instructions" msgid="3169991838169244941">"అన్‌లాక్ చేయడానికి నమూనాను గీయండి"</string>
     <string name="lockscreen_emergency_call" msgid="7549683825868928636">"ఎమర్జెన్సీ కాల్"</string>
     <string name="lockscreen_return_to_call" msgid="3156883574692006382">"కాల్‌కు తిరిగి వెళ్లు"</string>
@@ -977,7 +977,7 @@
     <string name="text_copied" msgid="2531420577879738860">"వచనం క్లిప్‌బోర్డ్‌కు కాపీ చేయబడింది."</string>
     <string name="copied" msgid="4675902854553014676">"కాపీ చేయబడింది"</string>
     <string name="more_item_label" msgid="7419249600215749115">"ఎక్కువ"</string>
-    <string name="prepend_shortcut_label" msgid="1743716737502867951">"మెను+"</string>
+    <string name="prepend_shortcut_label" msgid="1743716737502867951">"మెనూ+"</string>
     <string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string>
     <string name="menu_ctrl_shortcut_label" msgid="131911133027196485">"Ctrl+"</string>
     <string name="menu_alt_shortcut_label" msgid="343761069945250991">"Alt+"</string>
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index f8266ba..fc9f670 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -1001,8 +1001,9 @@
         <!-- The font scaling factor has changed, that is the user has
              selected a new global font size. -->
         <flag name="fontScale" value="0x40000000" />
-        <!-- The user has enabled or disabled displaying all text in bold -->
-        <flag name="forceBoldText" value="0x10000000" />
+        <!-- The font weight adjustment value has changed. Used to reflect the user increasing font
+             weight. -->
+        <flag name="fontWeightAdjustment" value="0x10000000" />
     </attr>
 
     <!-- Indicate that the activity can be launched as the embedded child of another
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 433a46b..c83594a 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1602,6 +1602,9 @@
          config_timeZoneRulesUpdateTrackingEnabled are true.] -->
     <integer name="config_timeZoneRulesCheckRetryCount">5</integer>
 
+    <!-- Whether the geolocation time zone detection feature is enabled. -->
+    <bool name="config_enableGeolocationTimeZoneDetection" translatable="false">false</bool>
+
     <!-- Whether to enable primary location time zone provider overlay which allows the primary
          location time zone provider to be replaced by an app at run-time. When disabled, only the
          config_primaryLocationTimeZoneProviderPackageName package will be searched for the primary
@@ -4510,4 +4513,7 @@
          activity-level letterboxing (size-compat mode). Therefore this override can control the
          maximum screen area that can be occupied by the app in the letterbox mode. -->
     <item name="config_taskLetterboxAspectRatio" format="float" type="dimen">0.0</item>
+
+    <!-- If true, hide the display cutout with display area -->
+    <bool name="config_hideDisplayCutoutWithDisplayArea">false</bool>
 </resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 6960fb3..acfafa4 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2165,6 +2165,7 @@
   <java-symbol type="string" name="config_defaultNetworkScorerPackageName" />
   <java-symbol type="string" name="config_persistentDataPackageName" />
   <java-symbol type="string" name="config_deviceConfiguratorPackageName" />
+  <java-symbol type="bool" name="config_enableGeolocationTimeZoneDetection" />
   <java-symbol type="bool" name="config_enablePrimaryLocationTimeZoneOverlay" />
   <java-symbol type="string" name="config_primaryLocationTimeZoneProviderPackageName" />
   <java-symbol type="bool" name="config_enableSecondaryLocationTimeZoneOverlay" />
@@ -4095,4 +4096,6 @@
   <java-symbol type="dimen" name="controls_thumbnail_image_max_width" />
 
   <java-symbol type="dimen" name="config_taskLetterboxAspectRatio" />
+
+  <java-symbol type="bool" name="config_hideDisplayCutoutWithDisplayArea" />
 </resources>
diff --git a/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java b/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java
index f4a454b..a5ef2b4 100644
--- a/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java
+++ b/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java
@@ -118,6 +118,7 @@
         // Wifi bugreports should not receive any progress.
         assertThat(callback.hasReceivedProgress()).isFalse();
         assertThat(mBugreportFile.length()).isGreaterThan(0L);
+        assertThat(callback.hasEarlyReportFinished()).isTrue();
         assertFdsAreClosed(mBugreportFd);
     }
 
@@ -135,6 +136,7 @@
         // Interactive bugreports show progress updates.
         assertThat(callback.hasReceivedProgress()).isTrue();
         assertThat(mBugreportFile.length()).isGreaterThan(0L);
+        assertThat(callback.hasEarlyReportFinished()).isTrue();
         assertFdsAreClosed(mBugreportFd);
     }
 
@@ -246,6 +248,7 @@
         private int mErrorCode = -1;
         private boolean mSuccess = false;
         private boolean mReceivedProgress = false;
+        private boolean mEarlyReportFinished = false;
         private final Object mLock = new Object();
 
         @Override
@@ -271,6 +274,13 @@
             }
         }
 
+        @Override
+        public void onEarlyReportFinished() {
+            synchronized (mLock) {
+                mEarlyReportFinished = true;
+            }
+        }
+
         /* Indicates completion; and ended up with a success or error. */
         public boolean isDone() {
             synchronized (mLock) {
@@ -295,6 +305,12 @@
                 return mReceivedProgress;
             }
         }
+
+        public boolean hasEarlyReportFinished() {
+            synchronized (mLock) {
+                return mEarlyReportFinished;
+            }
+        }
     }
 
     public static BugreportManager getBugreportManager() {
diff --git a/core/tests/coretests/src/android/app/WindowContextTest.java b/core/tests/coretests/src/android/app/WindowContextTest.java
index 0f9bc4b..1c2f32f 100644
--- a/core/tests/coretests/src/android/app/WindowContextTest.java
+++ b/core/tests/coretests/src/android/app/WindowContextTest.java
@@ -60,7 +60,7 @@
         final WindowContext windowContext = new WindowContext(context, TYPE_APPLICATION_OVERLAY,
                 null /* options */);
 
-        final IBinder token = windowContext.getActivityToken();
+        final IBinder token = windowContext.getWindowContextToken();
 
         final IWindowManager wms = WindowManagerGlobal.getWindowManagerService();
         assertTrue("Token must be registered to WMS", wms.isWindowToken(token));
diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
index 7766b57..5871e2e 100644
--- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
+++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
@@ -672,5 +672,11 @@
         public void notifyContentProviderPublishStatus(ContentProviderHolder holder, String auth,
                 int userId, boolean published) {
         }
+
+        @Override
+        public void instrumentWithoutRestart(ComponentName instrumentationName,
+                Bundle instrumentationArgs, IInstrumentationWatcher instrumentationWatcher,
+                IUiAutomationConnection instrumentationUiConnection, ApplicationInfo targetInfo) {
+        }
     }
 }
diff --git a/core/tests/coretests/src/android/graphics/TypefaceTest.java b/core/tests/coretests/src/android/graphics/TypefaceTest.java
index cfed2ce..5fa8c4f 100644
--- a/core/tests/coretests/src/android/graphics/TypefaceTest.java
+++ b/core/tests/coretests/src/android/graphics/TypefaceTest.java
@@ -23,6 +23,8 @@
 import android.content.Context;
 import android.content.res.AssetManager;
 import android.content.res.Resources;
+import android.graphics.fonts.SystemFonts;
+import android.os.SharedMemory;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.LargeTest;
@@ -35,9 +37,9 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.List;
+import java.nio.ByteOrder;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Random;
 
 @RunWith(AndroidJUnit4.class)
@@ -54,6 +56,10 @@
         Typeface.create(Typeface.MONOSPACE, 0)
     };
 
+    private static final int[] STYLES = {
+        Typeface.NORMAL, Typeface.BOLD, Typeface.ITALIC, Typeface.BOLD_ITALIC,
+    };
+
     @SmallTest
     @Test
     public void testBasic() throws Exception {
@@ -66,6 +72,16 @@
 
     @SmallTest
     @Test
+    public void testDefaults() {
+        for (int style : STYLES) {
+            String msg = "style = " + style;
+            assertNotNull(msg, Typeface.defaultFromStyle(style));
+            assertEquals(msg, style, Typeface.defaultFromStyle(style).getStyle());
+        }
+    }
+
+    @SmallTest
+    @Test
     public void testUnique() throws Exception {
         final int n = mFaces.length;
         for (int i = 0; i < n; i++) {
@@ -178,21 +194,57 @@
     @SmallTest
     @Test
     public void testSerialize() throws Exception {
-        int size = Typeface.writeTypefaces(null, Arrays.asList(mFaces));
-        ByteBuffer buffer = ByteBuffer.allocateDirect(size);
-        Typeface.writeTypefaces(buffer, Arrays.asList(mFaces));
-        List<Typeface> copiedTypefaces = Typeface.readTypefaces(buffer);
-        assertNotNull(copiedTypefaces);
-        assertEquals(mFaces.length, copiedTypefaces.size());
-        for (int i = 0; i < mFaces.length; i++) {
-            Typeface original = mFaces[i];
-            Typeface copied = copiedTypefaces.get(i);
+        HashMap<String, Typeface> systemFontMap = new HashMap<>();
+        Typeface.initSystemDefaultTypefaces(systemFontMap, SystemFonts.getRawSystemFallbackMap(),
+                SystemFonts.getAliases());
+        SharedMemory sharedMemory = Typeface.serializeFontMap(systemFontMap);
+        Map<String, Typeface> copiedFontMap =
+                Typeface.deserializeFontMap(sharedMemory.mapReadOnly().order(ByteOrder.BIG_ENDIAN));
+        assertEquals(systemFontMap.size(), copiedFontMap.size());
+        for (String key : systemFontMap.keySet()) {
+            assertTrue(copiedFontMap.containsKey(key));
+            Typeface original = systemFontMap.get(key);
+            Typeface copied = copiedFontMap.get(key);
             assertEquals(original.getStyle(), copied.getStyle());
             assertEquals(original.getWeight(), copied.getWeight());
             assertEquals(measureText(original, "hello"), measureText(copied, "hello"), 1e-6);
         }
     }
 
+    @SmallTest
+    @Test
+    public void testSetSystemFontMap() throws Exception {
+        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        Resources res = context.getResources();
+        Map<String, Typeface> fontMap = Map.of(
+                "sans-serif", Typeface.create(res.getFont(R.font.samplefont), Typeface.NORMAL),
+                "serif", Typeface.create(res.getFont(R.font.samplefont2), Typeface.NORMAL),
+                "monospace", Typeface.create(res.getFont(R.font.samplefont3), Typeface.NORMAL),
+                "sample", Typeface.create(res.getFont(R.font.samplefont4), Typeface.NORMAL),
+                "sample-italic", Typeface.create(res.getFont(R.font.samplefont4), Typeface.ITALIC));
+        Typeface.setSystemFontMap(fontMap);
+
+        // Test public static final fields
+        assertEquals(fontMap.get("sans-serif"), Typeface.DEFAULT);
+        assertEquals(Typeface.BOLD, Typeface.DEFAULT_BOLD.getStyle());
+        assertEquals(fontMap.get("sans-serif"), Typeface.SANS_SERIF);
+        assertEquals(fontMap.get("serif"), Typeface.SERIF);
+        assertEquals(fontMap.get("monospace"), Typeface.MONOSPACE);
+
+        // Test defaults
+        assertEquals(fontMap.get("sans-serif"), Typeface.defaultFromStyle(Typeface.NORMAL));
+        for (int style : STYLES) {
+            String msg = "style = " + style;
+            assertNotNull(msg, Typeface.defaultFromStyle(style));
+            assertEquals(msg, style, Typeface.defaultFromStyle(style).getStyle());
+        }
+
+        // Test create()
+        assertEquals(fontMap.get("sample"), Typeface.create("sample", Typeface.NORMAL));
+        assertEquals(
+                fontMap.get("sample-italic"), Typeface.create("sample-italic", Typeface.ITALIC));
+    }
+
     private static float measureText(Typeface typeface, String text) {
         Paint paint = new Paint();
         paint.setTypeface(typeface);
diff --git a/core/tests/coretests/src/android/util/CharsetUtilsTest.java b/core/tests/coretests/src/android/util/CharsetUtilsTest.java
index 04cb3d7..c295451 100644
--- a/core/tests/coretests/src/android/util/CharsetUtilsTest.java
+++ b/core/tests/coretests/src/android/util/CharsetUtilsTest.java
@@ -40,37 +40,47 @@
     }
 
     @Test
-    public void testUtf8_Empty() {
-        assertEquals(0, CharsetUtils.toUtf8Bytes("", destPtr, 0, dest.length));
+    public void testModifiedUtf8_Empty() {
+        assertEquals(0, CharsetUtils.toModifiedUtf8Bytes("", destPtr, 0, dest.length));
         assertEquals("0000000000000000", HexDump.toHexString(dest));
+        assertEquals("", CharsetUtils.fromModifiedUtf8Bytes(destPtr, 0, 0));
     }
 
     @Test
-    public void testUtf8_Simple() {
-        assertEquals(7, CharsetUtils.toUtf8Bytes("example", destPtr, 0, dest.length));
+    public void testModifiedUtf8_Null() {
+        assertEquals(4, CharsetUtils.toModifiedUtf8Bytes("!\0!", destPtr, 0, dest.length));
+        assertEquals("21C0802100000000", HexDump.toHexString(dest));
+        assertEquals("!\0!", CharsetUtils.fromModifiedUtf8Bytes(destPtr, 0, 4));
+    }
+
+    @Test
+    public void testModifiedUtf8_Simple() {
+        assertEquals(7, CharsetUtils.toModifiedUtf8Bytes("example", destPtr, 0, dest.length));
         assertEquals("6578616D706C6500", HexDump.toHexString(dest));
+        assertEquals("example", CharsetUtils.fromModifiedUtf8Bytes(destPtr, 0, 7));
     }
 
     @Test
-    public void testUtf8_Complex() {
-        assertEquals(3, CharsetUtils.toUtf8Bytes("☃", destPtr, 4, dest.length));
+    public void testModifiedUtf8_Complex() {
+        assertEquals(3, CharsetUtils.toModifiedUtf8Bytes("☃", destPtr, 4, dest.length));
         assertEquals("00000000E2988300", HexDump.toHexString(dest));
+        assertEquals("☃", CharsetUtils.fromModifiedUtf8Bytes(destPtr, 4, 3));
     }
 
     @Test
-    public void testUtf8_Bounds() {
-        assertEquals(-1, CharsetUtils.toUtf8Bytes("foo", destPtr, 0, 0));
-        assertEquals(-1, CharsetUtils.toUtf8Bytes("foo", destPtr, 0, 2));
-        assertEquals(-1, CharsetUtils.toUtf8Bytes("foo", destPtr, -2, 8));
-        assertEquals(-1, CharsetUtils.toUtf8Bytes("foo", destPtr, 6, 8));
-        assertEquals(-1, CharsetUtils.toUtf8Bytes("foo", destPtr, 10, 8));
+    public void testModifiedUtf8_Bounds() {
+        assertEquals(-3, CharsetUtils.toModifiedUtf8Bytes("foo", destPtr, 0, 0));
+        assertEquals(-3, CharsetUtils.toModifiedUtf8Bytes("foo", destPtr, 0, 2));
+        assertEquals(-3, CharsetUtils.toModifiedUtf8Bytes("foo", destPtr, -2, 8));
+        assertEquals(-3, CharsetUtils.toModifiedUtf8Bytes("foo", destPtr, 6, 8));
+        assertEquals(-3, CharsetUtils.toModifiedUtf8Bytes("foo", destPtr, 10, 8));
     }
 
     @Test
-    public void testUtf8_Overwrite() {
-        assertEquals(5, CharsetUtils.toUtf8Bytes("!!!!!", destPtr, 0, dest.length));
-        assertEquals(3, CharsetUtils.toUtf8Bytes("...", destPtr, 0, dest.length));
-        assertEquals(1, CharsetUtils.toUtf8Bytes("?", destPtr, 0, dest.length));
+    public void testModifiedUtf8_Overwrite() {
+        assertEquals(5, CharsetUtils.toModifiedUtf8Bytes("!!!!!", destPtr, 0, dest.length));
+        assertEquals(3, CharsetUtils.toModifiedUtf8Bytes("...", destPtr, 0, dest.length));
+        assertEquals(1, CharsetUtils.toModifiedUtf8Bytes("?", destPtr, 0, dest.length));
         assertEquals("3F002E0021000000", HexDump.toHexString(dest));
     }
 }
diff --git a/core/tests/coretests/src/android/util/XmlTest.java b/core/tests/coretests/src/android/util/XmlTest.java
index 2ae9cdf..a30381a 100644
--- a/core/tests/coretests/src/android/util/XmlTest.java
+++ b/core/tests/coretests/src/android/util/XmlTest.java
@@ -64,7 +64,7 @@
      */
     private static void doLargeValues(TypedXmlSerializer out, TypedXmlPullParser in)
             throws Exception {
-        final char[] chars = new char[(1 << 16) - 1];
+        final char[] chars = new char[65_534];
         Arrays.fill(chars, '!');
 
         final String string = new String(chars);
diff --git a/core/tests/coretests/src/android/widget/TextViewOnReceiveContentTest.java b/core/tests/coretests/src/android/widget/TextViewOnReceiveContentTest.java
index 8efd3b4..7b9283b 100644
--- a/core/tests/coretests/src/android/widget/TextViewOnReceiveContentTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewOnReceiveContentTest.java
@@ -16,12 +16,11 @@
 
 package android.widget;
 
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_AUTOFILL;
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_CLIPBOARD;
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_DRAG_AND_DROP;
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_INPUT_METHOD;
-import static android.view.OnReceiveContentCallback.Payload.SOURCE_PROCESS_TEXT;
-import static android.widget.TextViewOnReceiveContentCallback.canReuse;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_AUTOFILL;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_CLIPBOARD;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_DRAG_AND_DROP;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_INPUT_METHOD;
+import static android.view.OnReceiveContentListener.Payload.SOURCE_PROCESS_TEXT;
 import static android.widget.espresso.TextViewActions.clickOnTextAtIndex;
 
 import static androidx.test.espresso.Espresso.onView;
@@ -42,8 +41,7 @@
 import android.content.ClipDescription;
 import android.net.Uri;
 import android.os.Bundle;
-import android.util.ArraySet;
-import android.view.OnReceiveContentCallback;
+import android.view.OnReceiveContentListener;
 import android.view.inputmethod.InputConnection;
 import android.view.inputmethod.InputConnectionWrapper;
 import android.view.inputmethod.InputContentInfo;
@@ -62,7 +60,7 @@
 import org.mockito.Mockito;
 
 /**
- * Tests for {@link TextViewOnReceiveContentCallback}. Most of the test cases are in the CTS test
+ * Tests for {@link TextViewOnReceiveContentListener}. Most of the test cases are in the CTS test
  * {@link android.widget.cts.TextViewOnReceiveContentTest}. This class tests some internal
  * implementation details, e.g. fallback to the keyboard image API.
  */
@@ -78,35 +76,34 @@
     private Instrumentation mInstrumentation;
     private Activity mActivity;
     private CustomInputConnectionEditText mEditText;
-    private TextViewOnReceiveContentCallback mDefaultCallback;
+    private TextViewOnReceiveContentListener mDefaultReceiver;
 
     @Before
     public void before() {
         mInstrumentation = InstrumentationRegistry.getInstrumentation();
         mActivity = mActivityRule.getActivity();
         mEditText = mActivity.findViewById(R.id.edittext2);
-        mDefaultCallback = mEditText.getEditorForTesting().getDefaultOnReceiveContentCallback();
+        mDefaultReceiver = mEditText.getEditorForTesting().getDefaultOnReceiveContentListener();
     }
 
     @Test
-    public void testGetSupportedMimeTypes_fallbackToCommitContent() throws Throwable {
+    public void testGetEditorInfoMimeTypes_fallbackToCommitContent() throws Throwable {
         // Configure the EditText with an EditorInfo/InputConnection that supports some image MIME
         // types.
-        mEditText.setContentMimeTypes(new String[] {"image/gif", "image/png"});
+        String[] mimeTypes = {"image/gif", "image/png"};
+        mEditText.setContentMimeTypes(mimeTypes);
         MyInputConnection ic = new MyInputConnection();
         mEditText.setInputConnectionWrapper(ic);
 
         // Focus into the EditText.
         onView(withId(mEditText.getId())).perform(clickOnTextAtIndex(0));
 
-        // Assert that the callback returns the MIME types declared in the EditorInfo in addition to
-        // the default.
-        assertThat(mDefaultCallback.getMimeTypes(mEditText)).containsExactly(
-                "text/*", "image/gif", "image/png");
+        // Assert that the default listener returns the MIME types declared in the EditorInfo.
+        assertThat(mDefaultReceiver.getEditorInfoMimeTypes(mEditText)).isEqualTo(mimeTypes);
     }
 
     @Test
-    public void testGetSupportedMimeTypes_fallbackToCommitContent_noMimeTypesInEditorInfo()
+    public void testGetEditorInfoMimeTypes_fallbackToCommitContent_noMimeTypesInEditorInfo()
             throws Throwable {
         // Configure the EditText with an EditorInfo/InputConnection that doesn't declare any MIME
         // types.
@@ -117,8 +114,8 @@
         // Focus into the EditText.
         onView(withId(mEditText.getId())).perform(clickOnTextAtIndex(0));
 
-        // Assert that the callback returns the default MIME types.
-        assertThat(mDefaultCallback.getMimeTypes(mEditText)).containsExactly("text/*");
+        // Assert that the default listener returns null as the MIME types.
+        assertThat(mDefaultReceiver.getEditorInfoMimeTypes(mEditText)).isNull();
     }
 
     @Test
@@ -132,13 +129,13 @@
         // Focus into the EditText.
         onView(withId(mEditText.getId())).perform(clickOnTextAtIndex(0));
 
-        // Invoke the callback with SOURCE_AUTOFILL and assert that it triggers a call to
+        // Invoke the listener with SOURCE_AUTOFILL and assert that it triggers a call to
         // InputConnection.commitContent.
         ClipDescription description = new ClipDescription("", new String[] {"image/gif"});
         ClipData clip = new ClipData(description, new ClipData.Item(SAMPLE_CONTENT_URI));
-        OnReceiveContentCallback.Payload payload =
-                new OnReceiveContentCallback.Payload.Builder(clip, SOURCE_AUTOFILL).build();
-        mDefaultCallback.onReceiveContent(mEditText, payload);
+        OnReceiveContentListener.Payload payload =
+                new OnReceiveContentListener.Payload.Builder(clip, SOURCE_AUTOFILL).build();
+        mDefaultReceiver.onReceiveContent(mEditText, payload);
         verify(ic.mMock, times(1))
                 .commitContent(any(InputContentInfo.class), eq(0), eq(null));
         verifyNoMoreInteractions(ic.mMock);
@@ -155,12 +152,12 @@
         // Focus into the EditText.
         onView(withId(mEditText.getId())).perform(clickOnTextAtIndex(0));
 
-        // Invoke the callback and assert that the InputConnection is not invoked.
+        // Invoke the listener and assert that the InputConnection is not invoked.
         ClipDescription description = new ClipDescription("", new String[] {"image/gif"});
         ClipData clip = new ClipData(description, new ClipData.Item(SAMPLE_CONTENT_URI));
-        OnReceiveContentCallback.Payload payload =
-                new OnReceiveContentCallback.Payload.Builder(clip, SOURCE_AUTOFILL).build();
-        mDefaultCallback.onReceiveContent(mEditText, payload);
+        OnReceiveContentListener.Payload payload =
+                new OnReceiveContentListener.Payload.Builder(clip, SOURCE_AUTOFILL).build();
+        mDefaultReceiver.onReceiveContent(mEditText, payload);
         verifyZeroInteractions(ic.mMock);
     }
 
@@ -175,71 +172,28 @@
         // Focus into the EditText.
         onView(withId(mEditText.getId())).perform(clickOnTextAtIndex(0));
 
-        // Invoke the callback with sources other than SOURCE_AUTOFILL and assert that it does NOT
+        // Invoke the listener with sources other than SOURCE_AUTOFILL and assert that it does NOT
         // trigger calls to InputConnection.commitContent.
         ClipDescription description = new ClipDescription("", new String[] {"image/gif"});
         ClipData clip = new ClipData(description, new ClipData.Item(SAMPLE_CONTENT_URI));
-        OnReceiveContentCallback.Payload payload =
-                new OnReceiveContentCallback.Payload.Builder(clip, SOURCE_CLIPBOARD).build();
-        mDefaultCallback.onReceiveContent(mEditText, payload);
+        OnReceiveContentListener.Payload payload =
+                new OnReceiveContentListener.Payload.Builder(clip, SOURCE_CLIPBOARD).build();
+        mDefaultReceiver.onReceiveContent(mEditText, payload);
         verifyZeroInteractions(ic.mMock);
 
-        payload = new OnReceiveContentCallback.Payload.Builder(clip, SOURCE_INPUT_METHOD).build();
-        mDefaultCallback.onReceiveContent(mEditText, payload);
+        payload = new OnReceiveContentListener.Payload.Builder(clip, SOURCE_INPUT_METHOD).build();
+        mDefaultReceiver.onReceiveContent(mEditText, payload);
         verifyZeroInteractions(ic.mMock);
 
-        payload = new OnReceiveContentCallback.Payload.Builder(clip, SOURCE_DRAG_AND_DROP).build();
-        mDefaultCallback.onReceiveContent(mEditText, payload);
+        payload = new OnReceiveContentListener.Payload.Builder(clip, SOURCE_DRAG_AND_DROP).build();
+        mDefaultReceiver.onReceiveContent(mEditText, payload);
         verifyZeroInteractions(ic.mMock);
 
-        payload = new OnReceiveContentCallback.Payload.Builder(clip, SOURCE_PROCESS_TEXT).build();
-        mDefaultCallback.onReceiveContent(mEditText, payload);
+        payload = new OnReceiveContentListener.Payload.Builder(clip, SOURCE_PROCESS_TEXT).build();
+        mDefaultReceiver.onReceiveContent(mEditText, payload);
         verifyZeroInteractions(ic.mMock);
     }
 
-    @Test
-    public void testCanReuse() throws Throwable {
-        ArraySet<String> mimeTypes = null;
-        String[] editorContentMimeTypes = new String[0];
-        assertThat(canReuse(mimeTypes, editorContentMimeTypes)).isFalse();
-
-        mimeTypes = new ArraySet<>();
-        editorContentMimeTypes = new String[0];
-        assertThat(canReuse(mimeTypes, editorContentMimeTypes)).isTrue();
-
-        mimeTypes = newArraySet("text/*");
-        editorContentMimeTypes = new String[0];
-        assertThat(canReuse(mimeTypes, editorContentMimeTypes)).isTrue();
-
-        mimeTypes = newArraySet("text/*");
-        editorContentMimeTypes = new String[] {"text/*"};
-        assertThat(canReuse(mimeTypes, editorContentMimeTypes)).isTrue();
-
-        mimeTypes = newArraySet("image/gif", "image/png", "text/*");
-        editorContentMimeTypes = new String[] {"image/gif", "image/png"};
-        assertThat(canReuse(mimeTypes, editorContentMimeTypes)).isTrue();
-
-        mimeTypes = newArraySet("image/gif", "image/png", "text/*");
-        editorContentMimeTypes = new String[] {"image/gif", "image/png", "text/*"};
-        assertThat(canReuse(mimeTypes, editorContentMimeTypes)).isTrue();
-
-        mimeTypes = newArraySet("image/gif", "image/png", "text/*");
-        editorContentMimeTypes = new String[] {"image/gif"};
-        assertThat(canReuse(mimeTypes, editorContentMimeTypes)).isFalse();
-
-        mimeTypes = newArraySet("image/gif", "image/png", "text/*");
-        editorContentMimeTypes = new String[] {"image/gif", "image/png", "image/jpg"};
-        assertThat(canReuse(mimeTypes, editorContentMimeTypes)).isFalse();
-
-        mimeTypes = newArraySet("image/gif", "image/png", "text/*");
-        editorContentMimeTypes = new String[] {"image/gif", "image/jpg"};
-        assertThat(canReuse(mimeTypes, editorContentMimeTypes)).isFalse();
-
-        mimeTypes = newArraySet("image/gif", "image/png", "text/*");
-        editorContentMimeTypes = new String[] {"image/gif", "image/jpg", "text/*"};
-        assertThat(canReuse(mimeTypes, editorContentMimeTypes)).isFalse();
-    }
-
     private static class MyInputConnection extends InputConnectionWrapper {
         public final InputConnection mMock;
 
@@ -254,9 +208,4 @@
             return true;
         }
     }
-
-    @SafeVarargs
-    private static <T> ArraySet<T> newArraySet(T ... elements) {
-        return new ArraySet<>(elements);
-    }
 }
diff --git a/core/tests/coretests/src/com/android/internal/util/FastDataTest.java b/core/tests/coretests/src/com/android/internal/util/FastDataTest.java
index 841d659..81fb39f 100644
--- a/core/tests/coretests/src/com/android/internal/util/FastDataTest.java
+++ b/core/tests/coretests/src/com/android/internal/util/FastDataTest.java
@@ -30,6 +30,10 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.DataInput;
+import java.io.DataInputStream;
+import java.io.DataOutput;
+import java.io.DataOutputStream;
 import java.io.EOFException;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
@@ -83,7 +87,7 @@
 
     @Test
     public void testUTF_Bounds() throws Exception {
-        final char[] buf = new char[65_535];
+        final char[] buf = new char[65_534];
         try (FastDataOutput out = new FastDataOutput(new ByteArrayOutputStream(), BOUNCE_SIZE)) {
             // Writing simple string will fit fine
             Arrays.fill(buf, '!');
@@ -100,6 +104,61 @@
     }
 
     @Test
+    public void testTranscode() throws Exception {
+        // Verify that upstream data can be read by fast
+        {
+            final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+            final DataOutputStream out = new DataOutputStream(outStream);
+            doTranscodeWrite(out);
+            out.flush();
+
+            final FastDataInput in = new FastDataInput(
+                    new ByteArrayInputStream(outStream.toByteArray()), BOUNCE_SIZE);
+            doTransodeRead(in);
+        }
+
+        // Verify that fast data can be read by upstream
+        {
+            final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+            final FastDataOutput out = new FastDataOutput(outStream, BOUNCE_SIZE);
+            doTranscodeWrite(out);
+            out.flush();
+
+            final DataInputStream in = new DataInputStream(
+                    new ByteArrayInputStream(outStream.toByteArray()));
+            doTransodeRead(in);
+        }
+    }
+
+    private static void doTranscodeWrite(DataOutput out) throws IOException {
+        out.writeBoolean(true);
+        out.writeBoolean(false);
+        out.writeByte(1);
+        out.writeShort(2);
+        out.writeInt(4);
+        out.writeUTF("foo\0bar");
+        out.writeUTF(TEST_SHORT_STRING);
+        out.writeUTF(TEST_LONG_STRING);
+        out.writeLong(8L);
+        out.writeFloat(16f);
+        out.writeDouble(32d);
+    }
+
+    private static void doTransodeRead(DataInput in) throws IOException {
+        assertEquals(true, in.readBoolean());
+        assertEquals(false, in.readBoolean());
+        assertEquals(1, in.readByte());
+        assertEquals(2, in.readShort());
+        assertEquals(4, in.readInt());
+        assertEquals("foo\0bar", in.readUTF());
+        assertEquals(TEST_SHORT_STRING, in.readUTF());
+        assertEquals(TEST_LONG_STRING, in.readUTF());
+        assertEquals(8L, in.readLong());
+        assertEquals(16f, in.readFloat(), 0.01);
+        assertEquals(32d, in.readDouble(), 0.01);
+    }
+
+    @Test
     public void testBounce_Char() throws Exception {
         doBounce((out) -> {
             out.writeChar('\0');
@@ -191,7 +250,7 @@
 
     @Test
     public void testBounce_UTF_Maximum() throws Exception {
-        final char[] expectedBuf = new char[65_535];
+        final char[] expectedBuf = new char[65_534];
         Arrays.fill(expectedBuf, '!');
         final String expected = new String(expectedBuf);
 
diff --git a/core/tests/uwbtests/src/android/uwb/RangingParamsTest.java b/core/tests/uwbtests/src/android/uwb/RangingParamsTest.java
deleted file mode 100644
index 8095c99..0000000
--- a/core/tests/uwbtests/src/android/uwb/RangingParamsTest.java
+++ /dev/null
@@ -1,99 +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.uwb;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.os.Parcel;
-import android.os.PersistableBundle;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.time.Duration;
-
-/**
- * Test of {@link RangingParams}.
- */
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class RangingParamsTest {
-
-    @Test
-    public void testParams_Build() {
-        UwbAddress local = UwbAddress.fromBytes(new byte[] {(byte) 0xA0, (byte) 0x57});
-        UwbAddress remote = UwbAddress.fromBytes(new byte[] {(byte) 0x4D, (byte) 0x8C});
-        int channel = 9;
-        int rxPreamble = 16;
-        int txPreamble = 21;
-        boolean isController = true;
-        boolean isInitiator = false;
-        @RangingParams.StsPhyPacketType int stsPhyType = RangingParams.STS_PHY_PACKET_TYPE_SP2;
-        Duration samplePeriod = Duration.ofSeconds(1, 234);
-        PersistableBundle specParams = new PersistableBundle();
-        specParams.putString("protocol", "some_protocol");
-
-        RangingParams params = new RangingParams.Builder()
-                .setChannelNumber(channel)
-                .setReceivePreambleCodeIndex(rxPreamble)
-                .setTransmitPreambleCodeIndex(txPreamble)
-                .setLocalDeviceAddress(local)
-                .addRemoteDeviceAddress(remote)
-                .setIsController(isController)
-                .setIsInitiator(isInitiator)
-                .setSamplePeriod(samplePeriod)
-                .setStsPhPacketType(stsPhyType)
-                .setSpecificationParameters(specParams)
-                .build();
-
-        assertEquals(params.getLocalDeviceAddress(), local);
-        assertEquals(params.getRemoteDeviceAddresses().size(), 1);
-        assertEquals(params.getRemoteDeviceAddresses().get(0), remote);
-        assertEquals(params.getChannelNumber(), channel);
-        assertEquals(params.isController(), isController);
-        assertEquals(params.isInitiator(), isInitiator);
-        assertEquals(params.getRxPreambleIndex(), rxPreamble);
-        assertEquals(params.getTxPreambleIndex(), txPreamble);
-        assertEquals(params.getStsPhyPacketType(), stsPhyType);
-        assertEquals(params.getSamplingPeriod(), samplePeriod);
-        assertTrue(params.getSpecificationParameters().kindofEquals(specParams));
-    }
-
-    @Test
-    public void testParcel() {
-        Parcel parcel = Parcel.obtain();
-        RangingParams params = new RangingParams.Builder()
-                .setChannelNumber(9)
-                .setReceivePreambleCodeIndex(16)
-                .setTransmitPreambleCodeIndex(21)
-                .setLocalDeviceAddress(UwbTestUtils.getUwbAddress(false))
-                .addRemoteDeviceAddress(UwbTestUtils.getUwbAddress(true))
-                .setIsController(false)
-                .setIsInitiator(true)
-                .setSamplePeriod(Duration.ofSeconds(2))
-                .setStsPhPacketType(RangingParams.STS_PHY_PACKET_TYPE_SP1)
-                .build();
-        params.writeToParcel(parcel, 0);
-        parcel.setDataPosition(0);
-        RangingParams fromParcel = RangingParams.CREATOR.createFromParcel(parcel);
-        assertEquals(params, fromParcel);
-    }
-}
diff --git a/data/etc/car/com.android.car.provision.xml b/data/etc/car/com.android.car.provision.xml
index 37f64b5..474cd54 100644
--- a/data/etc/car/com.android.car.provision.xml
+++ b/data/etc/car/com.android.car.provision.xml
@@ -18,6 +18,7 @@
     <privapp-permissions package="com.android.car.provision">
         <permission name="android.car.permission.CAR_POWERTRAIN"/>
         <permission name="android.permission.INTERACT_ACROSS_USERS"/>
+        <permission name="android.permission.MASTER_CLEAR"/>
         <permission name="android.permission.QUERY_ALL_PACKAGES"/>
         <permission name="android.permission.SEND_CATEGORY_CAR_NOTIFICATIONS"/>
         <permission name="android.permission.WRITE_SECURE_SETTINGS"/>
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 42ebfc5..8406fdf 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -356,6 +356,8 @@
         <!-- Needed for test only -->
         <permission name="android.permission.READ_PRECISE_PHONE_STATE" />
         <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
+        <!-- Permission required for UiModeManager CTS test -->
+        <permission name="android.permission.READ_PROJECTION_STATE"/>
         <permission name="android.permission.READ_WIFI_CREDENTIAL"/>
         <permission name="android.permission.REAL_GET_TASKS"/>
         <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
@@ -376,7 +378,7 @@
         <permission name="android.permission.STOP_APP_SWITCHES"/>
         <permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
         <permission name="android.permission.SUSPEND_APPS" />
-        <!-- Permissions required for UiModeManager and Telecom car mode CTS tests -->
+        <!-- Permission required for UiModeManager and Telecom car mode CTS tests -->
         <permission name="android.permission.TOGGLE_AUTOMOTIVE_PROJECTION" />
         <permission name="android.permission.UPDATE_APP_OPS_STATS"/>
         <permission name="android.permission.USE_RESERVED_DISK"/>
diff --git a/errorprone/java/com/google/errorprone/bugpatterns/android/EfficientXmlChecker.java b/errorprone/java/com/google/errorprone/bugpatterns/android/EfficientXmlChecker.java
new file mode 100644
index 0000000..b5f26e7
--- /dev/null
+++ b/errorprone/java/com/google/errorprone/bugpatterns/android/EfficientXmlChecker.java
@@ -0,0 +1,325 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.errorprone.bugpatterns.android;
+
+import static com.google.errorprone.BugPattern.SeverityLevel.WARNING;
+import static com.google.errorprone.matchers.Matchers.anyOf;
+import static com.google.errorprone.matchers.Matchers.instanceMethod;
+import static com.google.errorprone.matchers.Matchers.isSubtypeOf;
+import static com.google.errorprone.matchers.Matchers.methodInvocation;
+import static com.google.errorprone.matchers.Matchers.staticMethod;
+import static com.google.errorprone.matchers.Matchers.stringLiteral;
+
+import com.google.auto.service.AutoService;
+import com.google.common.base.Objects;
+import com.google.errorprone.BugPattern;
+import com.google.errorprone.VisitorState;
+import com.google.errorprone.bugpatterns.BugChecker;
+import com.google.errorprone.bugpatterns.BugChecker.MethodInvocationTreeMatcher;
+import com.google.errorprone.bugpatterns.BugChecker.NewClassTreeMatcher;
+import com.google.errorprone.matchers.Description;
+import com.google.errorprone.matchers.Matcher;
+import com.google.errorprone.util.ASTHelpers;
+import com.sun.source.tree.AssignmentTree;
+import com.sun.source.tree.ExpressionTree;
+import com.sun.source.tree.IdentifierTree;
+import com.sun.source.tree.MethodInvocationTree;
+import com.sun.source.tree.MethodTree;
+import com.sun.source.tree.NewClassTree;
+import com.sun.source.tree.Tree;
+import com.sun.source.tree.VariableTree;
+import com.sun.source.util.TreePathScanner;
+import com.sun.tools.javac.code.Type;
+
+import java.util.List;
+import java.util.regex.Pattern;
+
+import javax.lang.model.element.Name;
+
+/**
+ * Android offers {@code TypedXmlSerializer} and {@code TypedXmlPullParser} to
+ * more efficiently store primitive values.
+ * <p>
+ * This checker identifies callers that are manually converting strings instead
+ * of relying on efficient strongly-typed methods.
+ */
+@AutoService(BugChecker.class)
+@BugPattern(
+    name = "AndroidFrameworkEfficientXml",
+    summary = "Verifies efficient XML best-practices",
+    severity = WARNING)
+public final class EfficientXmlChecker extends BugChecker
+        implements MethodInvocationTreeMatcher, NewClassTreeMatcher {
+    private static final String STRING = "java.lang.String";
+    private static final String INTEGER = "java.lang.Integer";
+    private static final String LONG = "java.lang.Long";
+    private static final String FLOAT = "java.lang.Float";
+    private static final String DOUBLE = "java.lang.Double";
+    private static final String BOOLEAN = "java.lang.Boolean";
+
+    private static final Matcher<ExpressionTree> BOOLEAN_STRING_LITERAL = stringLiteral(
+            Pattern.compile("(true|false)"));
+
+    private static final Matcher<ExpressionTree> PRIMITIVE_TO_STRING = anyOf(
+            methodInvocation(staticMethod().onClass(INTEGER).named("toString")),
+            methodInvocation(staticMethod().onClass(INTEGER).named("toHexString")),
+            methodInvocation(staticMethod().onClass(LONG).named("toString")),
+            methodInvocation(staticMethod().onClass(LONG).named("toHexString")),
+            methodInvocation(staticMethod().onClass(FLOAT).named("toString")),
+            methodInvocation(staticMethod().onClass(DOUBLE).named("toString")),
+            methodInvocation(staticMethod().onClass(BOOLEAN).named("toString")),
+            methodInvocation(instanceMethod().onExactClass(INTEGER).named("toString")),
+            methodInvocation(instanceMethod().onExactClass(LONG).named("toString")),
+            methodInvocation(instanceMethod().onExactClass(FLOAT).named("toString")),
+            methodInvocation(instanceMethod().onExactClass(DOUBLE).named("toString")),
+            methodInvocation(instanceMethod().onExactClass(BOOLEAN).named("toString")));
+
+    private static final Matcher<ExpressionTree> VALUE_OF_PRIMITIVE = anyOf(
+            methodInvocation(staticMethod().onClass(STRING).withSignature("valueOf(int)")),
+            methodInvocation(staticMethod().onClass(STRING).withSignature("valueOf(long)")),
+            methodInvocation(staticMethod().onClass(STRING).withSignature("valueOf(float)")),
+            methodInvocation(staticMethod().onClass(STRING).withSignature("valueOf(double)")),
+            methodInvocation(staticMethod().onClass(STRING).withSignature("valueOf(boolean)")));
+
+    private static final Matcher<ExpressionTree> VALUE_OF_OBJECT = methodInvocation(
+            staticMethod().onClass(STRING).withSignature("valueOf(java.lang.Object)"));
+
+    private static final Matcher<ExpressionTree> PRIMITIVE_PARSE = anyOf(
+            methodInvocation(staticMethod().onClass(INTEGER).named("parseInt")),
+            methodInvocation(staticMethod().onClass(INTEGER)
+                    .withSignature("valueOf(java.lang.String)")),
+            methodInvocation(staticMethod().onClass(INTEGER)
+                    .withSignature("valueOf(java.lang.String,int)")),
+            methodInvocation(staticMethod().onClass(LONG).named("parseLong")),
+            methodInvocation(staticMethod().onClass(LONG)
+                    .withSignature("valueOf(java.lang.String)")),
+            methodInvocation(staticMethod().onClass(LONG)
+                    .withSignature("valueOf(java.lang.String,int)")),
+            methodInvocation(staticMethod().onClass(FLOAT).named("parseFloat")),
+            methodInvocation(staticMethod().onClass(FLOAT)
+                    .withSignature("valueOf(java.lang.String)")),
+            methodInvocation(staticMethod().onClass(DOUBLE).named("parseDouble")),
+            methodInvocation(staticMethod().onClass(DOUBLE)
+                    .withSignature("valueOf(java.lang.String)")),
+            methodInvocation(staticMethod().onClass(BOOLEAN).named("parseBoolean")),
+            methodInvocation(staticMethod().onClass(BOOLEAN)
+                    .withSignature("valueOf(java.lang.String)")));
+
+    private static final Matcher<Tree> IS_FAST_XML_SERIALIZER =
+            isSubtypeOf("com.android.internal.util.FastXmlSerializer");
+
+    private static final Matcher<ExpressionTree> WRITE_ATTRIBUTE = methodInvocation(
+            instanceMethod().onDescendantOf("org.xmlpull.v1.XmlSerializer")
+                    .named("attribute"));
+
+    private static final Matcher<ExpressionTree> READ_ATTRIBUTE = methodInvocation(
+            instanceMethod().onDescendantOf("org.xmlpull.v1.XmlPullParser")
+                    .named("getAttributeValue"));
+
+    private static final Matcher<ExpressionTree> XML_FACTORY = methodInvocation(staticMethod()
+            .onClass("android.util.Xml").namedAnyOf("newSerializer", "newPullParser"));
+
+    private static final Matcher<ExpressionTree> BYTES_TO_STRING = anyOf(
+            methodInvocation(staticMethod().onClass("android.util.Base64")
+                    .named("encodeToString")),
+            methodInvocation(instanceMethod().onDescendantOf("java.util.Base64.Encoder")
+                    .named("encodeToString")),
+            methodInvocation(staticMethod().onClass("libcore.util.HexEncoding")
+                    .named("encodeToString")),
+            methodInvocation(staticMethod().onClass("com.android.internal.util.HexDump")
+                    .named("toHexString")));
+
+    private static final Matcher<ExpressionTree> BYTES_FROM_STRING = anyOf(
+            methodInvocation(staticMethod().onClass("android.util.Base64")
+                    .named("decode")),
+            methodInvocation(instanceMethod().onDescendantOf("java.util.Base64.Decoder")
+                    .named("decode")),
+            methodInvocation(staticMethod().onClass("libcore.util.HexEncoding")
+                    .named("decode")),
+            methodInvocation(staticMethod().onClass("com.android.internal.util.HexDump")
+                    .named("hexStringToByteArray")));
+
+    private static final String MESSAGE_WRITE = "Primitive values can be written more "
+            + "efficiently by using TypedXmlSerializer overloads";
+    private static final String MESSAGE_READ = "Primitive values can be parsed more "
+            + "efficiently by using TypedXmlPullParser overloads";
+    private static final String MESSAGE_CTOR = "Primitive values can be parsed more "
+            + "efficiently by using Xml.resolveSerializer() and/or Xml.resolvePullParser()";
+
+    /**
+     * Determine if the given expression is attempting to convert a primitive to
+     * a {@link String}.
+     */
+    private static final Matcher<ExpressionTree> CONVERT_PRIMITIVE_TO_STRING =
+            new Matcher<ExpressionTree>() {
+        @Override
+        public boolean matches(ExpressionTree tree, VisitorState state) {
+            if (PRIMITIVE_TO_STRING.matches(tree, state)) {
+                final List<? extends ExpressionTree> args = ((MethodInvocationTree) tree)
+                        .getArguments();
+                // We're only interested in base-10 or base-16 numerical conversions
+                if (args.size() <= 1 || String.valueOf(args.get(1)).equals("10")
+                        || String.valueOf(args.get(1)).equals("16")) {
+                    return true;
+                }
+            } else if (VALUE_OF_PRIMITIVE.matches(tree, state)) {
+                return true;
+            } else if (VALUE_OF_OBJECT.matches(tree, state)) {
+                final Type type = ASTHelpers.getResultType(((MethodInvocationTree) tree)
+                        .getArguments().get(0));
+                if (ASTHelpers.isSameType(type, state.getTypeFromString(INTEGER), state)
+                        || ASTHelpers.isSameType(type, state.getTypeFromString(LONG), state)
+                        || ASTHelpers.isSameType(type, state.getTypeFromString(FLOAT), state)
+                        || ASTHelpers.isSameType(type, state.getTypeFromString(DOUBLE), state)
+                        || ASTHelpers.isSameType(type, state.getTypeFromString(BOOLEAN), state)) {
+                    return true;
+                }
+            } else if (BOOLEAN_STRING_LITERAL.matches(tree, state)) {
+                return true;
+            } else if (BYTES_TO_STRING.matches(tree, state)) {
+                return true;
+            }
+            return false;
+        }
+    };
+
+    /**
+     * Determine if the given expression is attempting to convert a
+     * {@link String} to a primitive.
+     */
+    private static final Matcher<ExpressionTree> CONVERT_STRING_TO_PRIMITIVE =
+            new Matcher<ExpressionTree>() {
+        @Override
+        public boolean matches(ExpressionTree tree, VisitorState state) {
+            if (PRIMITIVE_PARSE.matches(tree, state)) {
+                final List<? extends ExpressionTree> args = ((MethodInvocationTree) tree)
+                        .getArguments();
+                // We're only interested in base-10 or base-16 numerical conversions
+                if (args.size() <= 1 || String.valueOf(args.get(1)).equals("10")
+                        || String.valueOf(args.get(1)).equals("16")) {
+                    return true;
+                }
+            } else if (BYTES_FROM_STRING.matches(tree, state)) {
+                return true;
+            }
+            return false;
+        }
+    };
+
+    @Override
+    public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState state) {
+        if (WRITE_ATTRIBUTE.matches(tree, state)) {
+            final List<? extends ExpressionTree> args = tree.getArguments();
+            final ExpressionTree writeSource = args.get(2);
+            if (CONVERT_PRIMITIVE_TO_STRING.matches(writeSource, state)) {
+                return buildDescription(tree).setMessage(MESSAGE_WRITE).build();
+            }
+
+            // Hunt around for related conversions
+            if (writeSource instanceof IdentifierTree) {
+                final Name name = ((IdentifierTree) writeSource).getName();
+                final Description res = new TreePathScanner<Description, Void>() {
+                    @Override
+                    public Description reduce(Description r1, Description r2) {
+                        return (r1 != null) ? r1 : r2;
+                    }
+
+                    @Override
+                    public Description visitVariable(VariableTree node, Void param) {
+                        return visitWriteSource(node.getName(), node.getInitializer());
+                    }
+
+                    @Override
+                    public Description visitAssignment(AssignmentTree node, Void param) {
+                        final ExpressionTree variable = node.getVariable();
+                        if (variable instanceof IdentifierTree) {
+                            return visitWriteSource(((IdentifierTree) variable).getName(),
+                                    node.getExpression());
+                        } else {
+                            return super.visitAssignment(node, param);
+                        }
+                    }
+
+                    private Description visitWriteSource(Name target, ExpressionTree source) {
+                        if (CONVERT_PRIMITIVE_TO_STRING.matches(source, state)
+                                && Objects.equal(name, target)) {
+                            return buildDescription(source).setMessage(MESSAGE_WRITE).build();
+                        } else {
+                            return null;
+                        }
+                    }
+                }.scan(state.findPathToEnclosing(MethodTree.class), null);
+                if (res != null) {
+                    return res;
+                }
+            }
+        } else if (READ_ATTRIBUTE.matches(tree, state)) {
+            final Tree readDest = state.getPath().getParentPath().getLeaf();
+            if (readDest instanceof ExpressionTree
+                    && CONVERT_STRING_TO_PRIMITIVE.matches((ExpressionTree) readDest, state)) {
+                return buildDescription(tree).setMessage(MESSAGE_READ).build();
+            }
+
+            // Hunt around for related conversions
+            Name name = null;
+            if (readDest instanceof VariableTree) {
+                name = ((VariableTree) readDest).getName();
+            } else if (readDest instanceof AssignmentTree) {
+                final ExpressionTree variable = ((AssignmentTree) readDest).getVariable();
+                if (variable instanceof IdentifierTree) {
+                    name = ((IdentifierTree) variable).getName();
+                }
+            }
+            if (name != null) {
+                final Name fName = name;
+                final Description res = new TreePathScanner<Description, Void>() {
+                    @Override
+                    public Description reduce(Description r1, Description r2) {
+                        return (r1 != null) ? r1 : r2;
+                    }
+
+                    @Override
+                    public Description visitMethodInvocation(MethodInvocationTree node,
+                            Void param) {
+                        if (CONVERT_STRING_TO_PRIMITIVE.matches(node, state)) {
+                            final ExpressionTree arg = node.getArguments().get(0);
+                            if (arg instanceof IdentifierTree
+                                    && Objects.equal(((IdentifierTree) arg).getName(), fName)) {
+                                return buildDescription(node).setMessage(MESSAGE_READ).build();
+                            }
+                        }
+                        return super.visitMethodInvocation(node, param);
+                    }
+                }.scan(state.findPathToEnclosing(MethodTree.class), null);
+                if (res != null) {
+                    return res;
+                }
+            }
+        } else if (XML_FACTORY.matches(tree, state)) {
+            return buildDescription(tree).setMessage(MESSAGE_CTOR).build();
+        }
+        return Description.NO_MATCH;
+    }
+
+    @Override
+    public Description matchNewClass(NewClassTree tree, VisitorState state) {
+        if (IS_FAST_XML_SERIALIZER.matches(tree, state)) {
+            return buildDescription(tree).setMessage(MESSAGE_CTOR).build();
+        }
+        return Description.NO_MATCH;
+    }
+}
diff --git a/errorprone/tests/java/com/google/errorprone/bugpatterns/android/EfficientXmlCheckerTest.java b/errorprone/tests/java/com/google/errorprone/bugpatterns/android/EfficientXmlCheckerTest.java
new file mode 100644
index 0000000..084fb25
--- /dev/null
+++ b/errorprone/tests/java/com/google/errorprone/bugpatterns/android/EfficientXmlCheckerTest.java
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.errorprone.bugpatterns.android;
+
+import com.google.errorprone.CompilationTestHelper;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class EfficientXmlCheckerTest {
+    private CompilationTestHelper compilationHelper;
+
+    @Before
+    public void setUp() {
+        compilationHelper = CompilationTestHelper.newInstance(
+                EfficientXmlChecker.class, getClass());
+    }
+
+    @Test
+    public void testCtor() {
+        compilationHelper
+                .addSourceFile("/android/util/Xml.java")
+                .addSourceFile("/com/android/internal/util/FastXmlSerializer.java")
+                .addSourceLines("Example.java",
+                        "import android.util.Xml;",
+                        "import com.android.internal.util.FastXmlSerializer;",
+                        "public class Example {",
+                        "  public void writer() throws Exception {",
+                        "    // BUG: Diagnostic contains:",
+                        "    Xml.newSerializer();",
+                        "    // BUG: Diagnostic contains:",
+                        "    new FastXmlSerializer();",
+                        "  }",
+                        "  public void reader() throws Exception {",
+                        "    // BUG: Diagnostic contains:",
+                        "    Xml.newPullParser();",
+                        "  }",
+                        "}")
+                .doTest();
+    }
+
+    @Test
+    public void testWrite() {
+        compilationHelper
+                .addSourceLines("Example.java",
+                        "import org.xmlpull.v1.XmlSerializer;",
+                        "public class Example {",
+                        "  public void typical(XmlSerializer out) throws Exception {",
+                        "    out.attribute(null, null, null);",
+                        "    out.attribute(null, null, \"foo\");",
+                        "    out.attribute(null, null, String.valueOf(null));",
+                        "    out.attribute(null, null, String.valueOf(\"foo\"));",
+                        "  }",
+                        "  public void rawBoolean(XmlSerializer out) throws Exception {",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, \"true\");",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, \"false\");",
+                        "  }",
+                        "  public void toString(XmlSerializer out) throws Exception {",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Integer.toString(42));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Integer.toString(42, 10));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Integer.toString(42, 16));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Integer.toHexString(42));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Long.toString(42L));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Long.toString(42L, 10));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Long.toString(42L, 16));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Long.toHexString(42L));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Float.toString(42f));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Double.toString(42d));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Boolean.toString(true));",
+                        "  }",
+                        "  public void toStringBoxed(XmlSerializer out) throws Exception {",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Integer.valueOf(42).toString());",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Long.valueOf(42L).toString());",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Float.valueOf(42f).toString());",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Double.valueOf(42d).toString());",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Boolean.valueOf(true).toString());",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, Boolean.TRUE.toString());",
+                        "  }",
+                        "  public void valueOf(XmlSerializer out) throws Exception {",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, String.valueOf(42));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, String.valueOf(42L));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, String.valueOf(42f));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, String.valueOf(42d));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, String.valueOf(true));",
+                        "  }",
+                        "  public void valueOfBoxed(XmlSerializer out) throws Exception {",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, String.valueOf(Integer.valueOf(42)));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, String.valueOf(Long.valueOf(42L)));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, String.valueOf(Float.valueOf(42f)));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, String.valueOf(Double.valueOf(42d)));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, String.valueOf(Boolean.valueOf(true)));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null, String.valueOf(Boolean.TRUE));",
+                        "  }",
+                        "}")
+                .doTest();
+    }
+
+    @Test
+    public void testWrite_Indirect() {
+        compilationHelper
+                .addSourceLines("Example.java",
+                        "import org.xmlpull.v1.XmlSerializer;",
+                        "public class Example {",
+                        "  XmlSerializer out;",
+                        "  public void argUnknown(String arg) throws Exception {",
+                        "    out.attribute(null, null, arg);",
+                        "  }",
+                        "  public void argNull(String arg) throws Exception {",
+                        "    arg = null;",
+                        "    out.attribute(null, null, arg);",
+                        "  }",
+                        "  public void argValueOfNull(String arg) throws Exception {",
+                        "    arg = String.valueOf(null);",
+                        "    out.attribute(null, null, arg);",
+                        "  }",
+                        "  public void argToString(String arg) throws Exception {",
+                        "    // BUG: Diagnostic contains:",
+                        "    arg = Integer.toString(42);",
+                        "    out.attribute(null, null, arg);",
+                        "  }",
+                        "  public void argValueOf(String arg) throws Exception {",
+                        "    // BUG: Diagnostic contains:",
+                        "    arg = String.valueOf(42);",
+                        "    out.attribute(null, null, arg);",
+                        "  }",
+                        "  public void directToString() throws Exception {",
+                        "    // BUG: Diagnostic contains:",
+                        "    String arg = Integer.toString(42);",
+                        "    out.attribute(null, null, arg);",
+                        "  }",
+                        "}")
+                .doTest();
+    }
+
+    @Test
+    public void testWrite_Bytes() {
+        compilationHelper
+                .addSourceFile("/android/util/Base64.java")
+                .addSourceFile("/libcore/util/HexEncoding.java")
+                .addSourceFile("/com/android/internal/util/HexDump.java")
+                .addSourceLines("Example.java",
+                        "import org.xmlpull.v1.XmlSerializer;",
+                        "public class Example {",
+                        "  XmlSerializer out;",
+                        "  public void bytes(byte[] arg) throws Exception {",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null,",
+                        "        android.util.Base64.encodeToString(arg, 0));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null,",
+                        "        java.util.Base64.getEncoder().encodeToString(arg));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null,",
+                        "        libcore.util.HexEncoding.encodeToString(arg));",
+                        "    // BUG: Diagnostic contains:",
+                        "    out.attribute(null, null,",
+                        "        com.android.internal.util.HexDump.toHexString(arg));",
+                        "  }",
+                        "}")
+                .doTest();
+    }
+
+    @Test
+    public void testRead() {
+        compilationHelper
+                .addSourceLines("Example.java",
+                        "import org.xmlpull.v1.XmlPullParser;",
+                        "public class Example {",
+                        "  public void typical(XmlPullParser in) throws Exception {",
+                        "    in.getAttributeValue(null, null);",
+                        "  }",
+                        "  public void parse(XmlPullParser in) throws Exception {",
+                        "    // BUG: Diagnostic contains:",
+                        "    Integer.parseInt(in.getAttributeValue(null, null));",
+                        "    // BUG: Diagnostic contains:",
+                        "    Integer.parseInt(in.getAttributeValue(null, null), 10);",
+                        "    // BUG: Diagnostic contains:",
+                        "    Integer.parseInt(in.getAttributeValue(null, null), 16);",
+                        "    // BUG: Diagnostic contains:",
+                        "    Long.parseLong(in.getAttributeValue(null, null));",
+                        "    // BUG: Diagnostic contains:",
+                        "    Long.parseLong(in.getAttributeValue(null, null), 10);",
+                        "    // BUG: Diagnostic contains:",
+                        "    Long.parseLong(in.getAttributeValue(null, null), 16);",
+                        "    // BUG: Diagnostic contains:",
+                        "    Float.parseFloat(in.getAttributeValue(null, null));",
+                        "    // BUG: Diagnostic contains:",
+                        "    Double.parseDouble(in.getAttributeValue(null, null));",
+                        "    // BUG: Diagnostic contains:",
+                        "    Boolean.parseBoolean(in.getAttributeValue(null, null));",
+                        "  }",
+                        "  public void valueOf(XmlPullParser in) throws Exception {",
+                        "    // BUG: Diagnostic contains:",
+                        "    Integer.valueOf(in.getAttributeValue(null, null));",
+                        "    // BUG: Diagnostic contains:",
+                        "    Long.valueOf(in.getAttributeValue(null, null));",
+                        "    // BUG: Diagnostic contains:",
+                        "    Float.valueOf(in.getAttributeValue(null, null));",
+                        "    // BUG: Diagnostic contains:",
+                        "    Double.valueOf(in.getAttributeValue(null, null));",
+                        "    // BUG: Diagnostic contains:",
+                        "    Boolean.valueOf(in.getAttributeValue(null, null));",
+                        "  }",
+                        "}")
+                .doTest();
+    }
+
+    @Test
+    public void testRead_Indirect() {
+        compilationHelper
+                .addSourceLines("Example.java",
+                        "import org.xmlpull.v1.XmlPullParser;",
+                        "public class Example {",
+                        "  public int direct(XmlPullParser in) throws Exception {",
+                        "    String arg = in.getAttributeValue(null, null);",
+                        "    if (arg != null) {",
+                        "      // BUG: Diagnostic contains:",
+                        "      return Integer.parseInt(arg);",
+                        "    } else {",
+                        "      return -1;",
+                        "    }",
+                        "  }",
+                        "  public int indirect(XmlPullParser in, String arg) throws Exception {",
+                        "    arg = in.getAttributeValue(null, null);",
+                        "    if (arg != null) {",
+                        "      // BUG: Diagnostic contains:",
+                        "      return Integer.parseInt(arg);",
+                        "    } else {",
+                        "      return -1;",
+                        "    }",
+                        "  }",
+                        "  public int tryCatch(XmlPullParser in) throws Exception {",
+                        "    String arg = in.getAttributeValue(null, null);",
+                        "    try {",
+                        "      // BUG: Diagnostic contains:",
+                        "      return Integer.parseInt(arg);",
+                        "    } catch (NumberFormatException e) {",
+                        "      return -1;",
+                        "    }",
+                        "  }",
+                        "}")
+                .doTest();
+    }
+
+    @Test
+    public void testRead_Bytes() {
+        compilationHelper
+                .addSourceFile("/android/util/Base64.java")
+                .addSourceFile("/libcore/util/HexEncoding.java")
+                .addSourceFile("/com/android/internal/util/HexDump.java")
+                .addSourceLines("Example.java",
+                        "import org.xmlpull.v1.XmlPullParser;",
+                        "public class Example {",
+                        "  XmlPullParser in;",
+                        "  public void bytes() throws Exception {",
+                        "    android.util.Base64.decode(",
+                        "        // BUG: Diagnostic contains:",
+                        "        in.getAttributeValue(null, null), 0);",
+                        "    java.util.Base64.getDecoder().decode(",
+                        "        // BUG: Diagnostic contains:",
+                        "        in.getAttributeValue(null, null));",
+                        "    libcore.util.HexEncoding.decode(",
+                        "        // BUG: Diagnostic contains:",
+                        "        in.getAttributeValue(null, null));",
+                        "    com.android.internal.util.HexDump.hexStringToByteArray(",
+                        "        // BUG: Diagnostic contains:",
+                        "        in.getAttributeValue(null, null));",
+                        "  }",
+                        "}")
+                .doTest();
+    }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java b/errorprone/tests/res/android/util/Base64.java
similarity index 66%
rename from packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java
rename to errorprone/tests/res/android/util/Base64.java
index 4de3166..63d80bef 100644
--- a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java
+++ b/errorprone/tests/res/android/util/Base64.java
@@ -14,15 +14,14 @@
  * limitations under the License.
  */
 
-package com.android.systemui;
+package android.util;
 
-import dagger.Module;
+public class Base64 {
+    public static byte[] decode(String str, int flags) {
+        throw new UnsupportedOperationException();
+    }
 
-/**
- * Dagger module for including the CarSysUIComponent.
- *
- * TODO(b/162923491): Remove or otherwise refactor this module. This is a stop gap.
- */
-@Module(subcomponents = {CarSysUIComponent.class})
-public abstract class CarSysUIComponentModule {
+    public static String encodeToString(byte[] input, int flags) {
+        throw new UnsupportedOperationException();
+    }
 }
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java b/errorprone/tests/res/android/util/Xml.java
similarity index 64%
copy from packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java
copy to errorprone/tests/res/android/util/Xml.java
index 4de3166..0e44d00 100644
--- a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java
+++ b/errorprone/tests/res/android/util/Xml.java
@@ -14,15 +14,17 @@
  * limitations under the License.
  */
 
-package com.android.systemui;
+package android.util;
 
-import dagger.Module;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlSerializer;
 
-/**
- * Dagger module for including the CarSysUIComponent.
- *
- * TODO(b/162923491): Remove or otherwise refactor this module. This is a stop gap.
- */
-@Module(subcomponents = {CarSysUIComponent.class})
-public abstract class CarSysUIComponentModule {
+public class Xml {
+    public static XmlPullParser newPullParser() {
+        throw new UnsupportedOperationException();
+    }
+
+    public static XmlSerializer newSerializer() {
+        throw new UnsupportedOperationException();
+    }
 }
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java b/errorprone/tests/res/com/android/internal/util/FastXmlSerializer.java
similarity index 66%
copy from packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java
copy to errorprone/tests/res/com/android/internal/util/FastXmlSerializer.java
index 4de3166..83d14a9 100644
--- a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java
+++ b/errorprone/tests/res/com/android/internal/util/FastXmlSerializer.java
@@ -14,15 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.systemui;
+package com.android.internal.util;
 
-import dagger.Module;
-
-/**
- * Dagger module for including the CarSysUIComponent.
- *
- * TODO(b/162923491): Remove or otherwise refactor this module. This is a stop gap.
- */
-@Module(subcomponents = {CarSysUIComponent.class})
-public abstract class CarSysUIComponentModule {
+public class FastXmlSerializer {
 }
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java b/errorprone/tests/res/com/android/internal/util/HexDump.java
similarity index 66%
copy from packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java
copy to errorprone/tests/res/com/android/internal/util/HexDump.java
index 4de3166..55d3e50 100644
--- a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java
+++ b/errorprone/tests/res/com/android/internal/util/HexDump.java
@@ -14,15 +14,14 @@
  * limitations under the License.
  */
 
-package com.android.systemui;
+package com.android.internal.util;
 
-import dagger.Module;
+public class HexDump {
+    public static String toHexString(byte[] array) {
+        throw new UnsupportedOperationException();
+    }
 
-/**
- * Dagger module for including the CarSysUIComponent.
- *
- * TODO(b/162923491): Remove or otherwise refactor this module. This is a stop gap.
- */
-@Module(subcomponents = {CarSysUIComponent.class})
-public abstract class CarSysUIComponentModule {
+    public static byte[] hexStringToByteArray(String hexString) {
+        throw new UnsupportedOperationException();
+    }
 }
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java b/errorprone/tests/res/libcore/util/HexEncoding.java
similarity index 66%
copy from packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java
copy to errorprone/tests/res/libcore/util/HexEncoding.java
index 4de3166..34bbbac 100644
--- a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java
+++ b/errorprone/tests/res/libcore/util/HexEncoding.java
@@ -14,15 +14,14 @@
  * limitations under the License.
  */
 
-package com.android.systemui;
+package libcore.util;
 
-import dagger.Module;
+public class HexEncoding {
+    public static String encodeToString(byte[] data) {
+        throw new UnsupportedOperationException();
+    }
 
-/**
- * Dagger module for including the CarSysUIComponent.
- *
- * TODO(b/162923491): Remove or otherwise refactor this module. This is a stop gap.
- */
-@Module(subcomponents = {CarSysUIComponent.class})
-public abstract class CarSysUIComponentModule {
+    public static byte[] decode(String encoded) {
+        throw new UnsupportedOperationException();
+    }
 }
diff --git a/graphics/java/android/graphics/Compatibility.java b/graphics/java/android/graphics/Compatibility.java
index ed84912..747fbf1 100644
--- a/graphics/java/android/graphics/Compatibility.java
+++ b/graphics/java/android/graphics/Compatibility.java
@@ -16,14 +16,11 @@
 
 package android.graphics;
 
-import android.annotation.SystemApi;
-
 /**
  * Helper class for graphics classes to retrieve the targetSdkVersion, as
  * specified by the app.
  * @hide
  */
-@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
 public final class Compatibility {
     private Compatibility() {}
 
@@ -34,7 +31,6 @@
      * application. No other code should call this.
      * @hide
      */
-    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
     public static void setTargetSdkVersion(int targetSdkVersion) {
         sTargetSdkVersion = targetSdkVersion;
         Canvas.setCompatibilityVersion(targetSdkVersion);
diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java
index 4cac7fb..3732285 100644
--- a/graphics/java/android/graphics/ImageDecoder.java
+++ b/graphics/java/android/graphics/ImageDecoder.java
@@ -27,7 +27,6 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.Px;
-import android.annotation.SystemApi;
 import android.annotation.TestApi;
 import android.annotation.WorkerThread;
 import android.content.ContentResolver;
@@ -916,12 +915,8 @@
     /**
      * Provide Resources for density scaling.
      *
-     * This is a SystemApi to enable legacy behavior, so there is no need to
-     * make it public like the version above, which does not have a Resources
-     * parameter.
      * @hide
      */
-    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
     @AnyThread
     @NonNull
     public static Source createSource(@NonNull ContentResolver cr,
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index c58e5f3..5743df5 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -34,8 +34,12 @@
 import android.graphics.fonts.SystemFonts;
 import android.os.Build;
 import android.os.ParcelFileDescriptor;
+import android.os.SharedMemory;
+import android.os.Trace;
 import android.provider.FontRequest;
 import android.provider.FontsContract;
+import android.system.ErrnoException;
+import android.system.OsConstants;
 import android.text.FontConfig;
 import android.util.Base64;
 import android.util.LongSparseArray;
@@ -50,6 +54,7 @@
 
 import libcore.util.NativeAllocationRegistry;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileDescriptor;
 import java.io.IOException;
@@ -57,6 +62,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -79,19 +85,19 @@
             Typeface.class.getClassLoader(), nativeGetReleaseFunc());
 
     /** The default NORMAL typeface object */
-    public static final Typeface DEFAULT;
+    public static final Typeface DEFAULT = null;
     /**
      * The default BOLD typeface object. Note: this may be not actually be
      * bold, depending on what fonts are installed. Call getStyle() to know
      * for sure.
      */
-    public static final Typeface DEFAULT_BOLD;
+    public static final Typeface DEFAULT_BOLD = null;
     /** The NORMAL style of the default sans serif typeface. */
-    public static final Typeface SANS_SERIF;
+    public static final Typeface SANS_SERIF = null;
     /** The NORMAL style of the default serif typeface. */
-    public static final Typeface SERIF;
+    public static final Typeface SERIF = null;
     /** The NORMAL style of the default monospace typeface. */
-    public static final Typeface MONOSPACE;
+    public static final Typeface MONOSPACE = null;
 
     /**
      * The default {@link Typeface}s for different text styles.
@@ -99,6 +105,7 @@
      * It shouldn't be changed for app wide typeface settings. Please use theme and font XML for
      * the same purpose.
      */
+    @GuardedBy("SYSTEM_FONT_MAP_LOCK")
     @UnsupportedAppUsage(trackingBug = 123769446)
     static Typeface[] sDefaults;
 
@@ -125,16 +132,28 @@
     private static final LruCache<String, Typeface> sDynamicTypefaceCache = new LruCache<>(16);
     private static final Object sDynamicCacheLock = new Object();
 
+
+    @GuardedBy("SYSTEM_FONT_MAP_LOCK")
     static Typeface sDefaultTypeface;
 
-    // Following two fields are not used but left for hiddenapi private list
     /**
      * sSystemFontMap is read only and unmodifiable.
      * Use public API {@link #create(String, int)} to get the typeface for given familyName.
      */
+    @GuardedBy("SYSTEM_FONT_MAP_LOCK")
     @UnsupportedAppUsage(trackingBug = 123769347)
-    static final Map<String, Typeface> sSystemFontMap;
+    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;
+
+    // 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
+    // introduce deadlock.
+    private static final Object SYSTEM_FONT_MAP_LOCK = new Object();
+
+    // This field is used but left for hiddenapi private list
     // We cannot support sSystemFallbackMap since we will migrate to public FontFamily API.
     /**
      * @deprecated Use {@link android.graphics.fonts.FontFamily} instead.
@@ -187,8 +206,16 @@
      */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
     private static void setDefault(Typeface t) {
-        sDefaultTypeface = t;
-        nativeSetDefault(t.native_instance);
+        synchronized (SYSTEM_FONT_MAP_LOCK) {
+            sDefaultTypeface = t;
+            nativeSetDefault(t.native_instance);
+        }
+    }
+
+    private static Typeface getDefault() {
+        synchronized (SYSTEM_FONT_MAP_LOCK) {
+            return sDefaultTypeface;
+        }
     }
 
     /** Returns the typeface's weight value */
@@ -833,7 +860,7 @@
             style = NORMAL;
         }
         if (family == null) {
-            family = sDefaultTypeface;
+            family = getDefault();
         }
 
         // Return early if we're asked for the same face/style
@@ -902,7 +929,7 @@
             @IntRange(from = 1, to = 1000) int weight, boolean italic) {
         Preconditions.checkArgumentInRange(weight, 0, 1000, "weight");
         if (family == null) {
-            family = sDefaultTypeface;
+            family = getDefault();
         }
         return createWeightStyle(family, weight, italic);
     }
@@ -944,7 +971,9 @@
      * @return the default typeface that corresponds to the style
      */
     public static Typeface defaultFromStyle(@Style int style) {
-        return sDefaults[style];
+        synchronized (SYSTEM_FONT_MAP_LOCK) {
+            return sDefaults[style];
+        }
     }
 
     /**
@@ -1137,40 +1166,142 @@
         }
     }
 
+    /** @hide */
+    public static SharedMemory serializeFontMap(Map<String, Typeface> fontMap)
+            throws IOException, ErrnoException {
+        long[] nativePtrs = new long[fontMap.size()];
+        // The name table will not be large, so let's create a byte array in memory.
+        ByteArrayOutputStream namesBytes = new ByteArrayOutputStream();
+        int i = 0;
+        for (Map.Entry<String, Typeface> entry : fontMap.entrySet()) {
+            nativePtrs[i++] = entry.getValue().native_instance;
+            writeString(namesBytes, entry.getKey());
+        }
+        int typefacesBytesCount = nativeWriteTypefaces(null, nativePtrs);
+        // int (typefacesBytesCount), typefaces, namesBytes
+        SharedMemory sharedMemory = SharedMemory.create(
+                "fontMap", Integer.BYTES + typefacesBytesCount + namesBytes.size());
+        ByteBuffer writableBuffer = sharedMemory.mapReadWrite().order(ByteOrder.BIG_ENDIAN);
+        try {
+            writableBuffer.putInt(typefacesBytesCount);
+            int writtenBytesCount = nativeWriteTypefaces(writableBuffer.slice(), nativePtrs);
+            if (writtenBytesCount != typefacesBytesCount) {
+                throw new IOException(String.format("Unexpected bytes written: %d, expected: %d",
+                        writtenBytesCount, typefacesBytesCount));
+            }
+            writableBuffer.position(writableBuffer.position() + writtenBytesCount);
+            writableBuffer.put(namesBytes.toByteArray());
+        } finally {
+            SharedMemory.unmap(writableBuffer);
+        }
+        sharedMemory.setProtect(OsConstants.PROT_READ);
+        return sharedMemory;
+    }
+
+    // buffer's byte order should be BIG_ENDIAN.
+    /** @hide */
+    @VisibleForTesting
+    public static Map<String, Typeface> deserializeFontMap(ByteBuffer buffer) throws IOException {
+        Map<String, Typeface> fontMap = new HashMap<>();
+        int typefacesBytesCount = buffer.getInt();
+        long[] nativePtrs = nativeReadTypefaces(buffer.slice());
+        if (nativePtrs == null) {
+            throw new IOException("Could not read typefaces");
+        }
+        buffer.position(buffer.position() + typefacesBytesCount);
+        for (long nativePtr : nativePtrs) {
+            String name = readString(buffer);
+            fontMap.put(name, new Typeface(nativePtr));
+        }
+        return fontMap;
+    }
+
+    private static String readString(ByteBuffer buffer) {
+        int length = buffer.getInt();
+        byte[] bytes = new byte[length];
+        buffer.get(bytes);
+        return new String(bytes);
+    }
+
+    private static void writeString(ByteArrayOutputStream bos, String value) throws IOException {
+        byte[] bytes = value.getBytes();
+        writeInt(bos, bytes.length);
+        bos.write(bytes);
+    }
+
+    private static void writeInt(ByteArrayOutputStream bos, int value) {
+        // Write in the big endian order.
+        bos.write((value >> 24) & 0xFF);
+        bos.write((value >> 16) & 0xFF);
+        bos.write((value >> 8) & 0xFF);
+        bos.write(value & 0xFF);
+    }
+
+    /**
+     * Deserialize font map and set it as system font map. This method should be called at most once
+     * per process.
+     */
+    /** @hide */
+    public static void setSystemFontMap(SharedMemory sharedMemory)
+            throws IOException, ErrnoException {
+        if (sSystemFontMapBuffer != null) {
+            throw new UnsupportedOperationException(
+                    "Once set, buffer-based system font map cannot be updated");
+        }
+        Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "setSystemFontMap");
+        try {
+            sSystemFontMapBuffer = sharedMemory.mapReadOnly().order(ByteOrder.BIG_ENDIAN);
+            Map<String, Typeface> systemFontMap = deserializeFontMap(sSystemFontMapBuffer);
+            setSystemFontMap(systemFontMap);
+        } finally {
+            Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS);
+        }
+    }
+
+    /** @hide */
+    @VisibleForTesting
+    public static void setSystemFontMap(Map<String, Typeface> systemFontMap) {
+        synchronized (SYSTEM_FONT_MAP_LOCK) {
+            sSystemFontMap.clear();
+            sSystemFontMap.putAll(systemFontMap);
+
+            // We can't assume DEFAULT_FAMILY available on Roboletric.
+            if (sSystemFontMap.containsKey(DEFAULT_FAMILY)) {
+                setDefault(sSystemFontMap.get(DEFAULT_FAMILY));
+            }
+
+            // Set up defaults and typefaces exposed in public API
+            // Use sDefaultTypeface here, because create(String, int) uses DEFAULT as fallback.
+            nativeForceSetStaticFinalField("DEFAULT", create(sDefaultTypeface, 0));
+            nativeForceSetStaticFinalField("DEFAULT_BOLD", create(sDefaultTypeface, Typeface.BOLD));
+            nativeForceSetStaticFinalField("SANS_SERIF", create("sans-serif", 0));
+            nativeForceSetStaticFinalField("SERIF", create("serif", 0));
+            nativeForceSetStaticFinalField("MONOSPACE", create("monospace", 0));
+
+            sDefaults = new Typeface[]{
+                DEFAULT,
+                DEFAULT_BOLD,
+                create((String) null, Typeface.ITALIC),
+                create((String) null, Typeface.BOLD_ITALIC),
+            };
+
+            // A list of generic families to be registered in native.
+            // https://www.w3.org/TR/css-fonts-4/#generic-font-families
+            String[] genericFamilies = {
+                "serif", "sans-serif", "cursive", "fantasy", "monospace", "system-ui"
+            };
+
+            for (String genericFamily : genericFamilies) {
+                registerGenericFamilyNative(genericFamily, systemFontMap.get(genericFamily));
+            }
+        }
+    }
+
     static {
         final HashMap<String, Typeface> systemFontMap = new HashMap<>();
         initSystemDefaultTypefaces(systemFontMap, SystemFonts.getRawSystemFallbackMap(),
                 SystemFonts.getAliases());
-        sSystemFontMap = Collections.unmodifiableMap(systemFontMap);
-
-        // We can't assume DEFAULT_FAMILY available on Roboletric.
-        if (sSystemFontMap.containsKey(DEFAULT_FAMILY)) {
-            setDefault(sSystemFontMap.get(DEFAULT_FAMILY));
-        }
-
-        // Set up defaults and typefaces exposed in public API
-        DEFAULT         = create((String) null, 0);
-        DEFAULT_BOLD    = create((String) null, Typeface.BOLD);
-        SANS_SERIF      = create("sans-serif", 0);
-        SERIF           = create("serif", 0);
-        MONOSPACE       = create("monospace", 0);
-
-        sDefaults = new Typeface[] {
-            DEFAULT,
-            DEFAULT_BOLD,
-            create((String) null, Typeface.ITALIC),
-            create((String) null, Typeface.BOLD_ITALIC),
-        };
-
-        // A list of generic families to be registered in native.
-        // https://www.w3.org/TR/css-fonts-4/#generic-font-families
-        String[] genericFamilies = {
-            "serif", "sans-serif", "cursive", "fantasy", "monospace", "system-ui"
-        };
-
-        for (String genericFamily : genericFamilies) {
-            registerGenericFamilyNative(genericFamily, systemFontMap.get(genericFamily));
-        }
+        setSystemFontMap(systemFontMap);
     }
 
     @Override
@@ -1210,36 +1341,6 @@
         return Arrays.binarySearch(mSupportedAxes, axis) >= 0;
     }
 
-    /**
-     * Writes Typeface instances to the ByteBuffer and returns the number of bytes written.
-     *
-     * <p>If {@code buffer} is null, this method returns the number of bytes required to serialize
-     * the typefaces, without writing anything.
-     * @hide
-     */
-    public static int writeTypefaces(
-            @Nullable ByteBuffer buffer, @NonNull List<Typeface> typefaces) {
-        long[] nativePtrs = new long[typefaces.size()];
-        for (int i = 0; i < nativePtrs.length; i++) {
-            nativePtrs[i] = typefaces.get(i).native_instance;
-        }
-        return nativeWriteTypefaces(buffer, nativePtrs);
-    }
-
-    /**
-     * Reads serialized Typeface instances from the ByteBuffer. Returns null on errors.
-     * @hide
-     */
-    public static @Nullable List<Typeface> readTypefaces(@NonNull ByteBuffer buffer) {
-        long[] nativePtrs = nativeReadTypefaces(buffer);
-        if (nativePtrs == null) return null;
-        List<Typeface> typefaces = new ArrayList<>(nativePtrs.length);
-        for (long nativePtr : nativePtrs) {
-            typefaces.add(new Typeface(nativePtr));
-        }
-        return typefaces;
-    }
-
     private static native long nativeCreateFromTypeface(long native_instance, int style);
     private static native long nativeCreateFromTypefaceWithExactStyle(
             long native_instance, int weight, boolean italic);
@@ -1270,4 +1371,6 @@
             @Nullable ByteBuffer buffer, @NonNull long[] nativePtrs);
 
     private static native @Nullable long[] nativeReadTypefaces(@NonNull ByteBuffer buffer);
+
+    private static native void nativeForceSetStaticFinalField(String fieldName, Typeface typeface);
 }
diff --git a/graphics/java/android/graphics/drawable/Icon.java b/graphics/java/android/graphics/drawable/Icon.java
index 32b3103..dcd4f33 100644
--- a/graphics/java/android/graphics/drawable/Icon.java
+++ b/graphics/java/android/graphics/drawable/Icon.java
@@ -16,6 +16,9 @@
 
 package android.graphics.drawable;
 
+import static android.content.Context.CONTEXT_INCLUDE_CODE;
+import static android.content.Context.CONTEXT_RESTRICTED;
+
 import android.annotation.ColorInt;
 import android.annotation.DrawableRes;
 import android.annotation.IdRes;
@@ -39,6 +42,7 @@
 import android.os.Message;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.os.Process;
 import android.os.UserHandle;
 import android.text.TextUtils;
 import android.util.Log;
@@ -442,8 +446,19 @@
                 resPackage = context.getPackageName();
             }
             if (getResources() == null && !(getResPackage().equals("android"))) {
-                final PackageManager pm = context.createContextAsUser(
-                        UserHandle.of(userId), /* flags */ 0).getPackageManager();
+                // TODO(b/173307037): Move CONTEXT_INCLUDE_CODE to ContextImpl.createContextAsUser
+                final Context userContext;
+                if (context.getUserId() == userId) {
+                    userContext = context;
+                } else {
+                    final boolean sameAppWithProcess =
+                            UserHandle.isSameApp(context.getApplicationInfo().uid, Process.myUid());
+                    final int flags = (sameAppWithProcess ? CONTEXT_INCLUDE_CODE : 0)
+                            | CONTEXT_RESTRICTED;
+                    userContext = context.createContextAsUser(UserHandle.of(userId), flags);
+                }
+
+                final PackageManager pm = userContext.getPackageManager();
                 try {
                     // assign getResources() as the correct user
                     mObj1 = pm.getResourcesForApplication(resPackage);
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java b/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java
index 71e6559..d1b4464 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java
@@ -23,6 +23,7 @@
 import android.security.keymaster.ExportResult;
 import android.security.keymaster.KeyCharacteristics;
 import android.security.keymaster.KeymasterDefs;
+import android.sysprop.Keystore2Properties;
 
 import java.io.IOException;
 import java.security.KeyFactory;
@@ -111,6 +112,26 @@
         putSecretKeyFactoryImpl("HmacSHA512");
     }
 
+    private static boolean sKeystore2Enabled;
+
+    /**
+     * This function indicates whether or not Keystore 2.0 is enabled. Some parts of the
+     * Keystore SPI must behave subtly differently when Keystore 2.0 is enabled. However,
+     * the platform property that indicates that Keystore 2.0 is enabled is not readable
+     * by applications. So we set this value when {@code install()} is called because it
+     * is called by zygote, which can access Keystore2Properties.
+     *
+     * This function can be removed once the transition to Keystore 2.0 is complete.
+     * b/171305684
+     *
+     * @return true if Keystore 2.0 is enabled.
+     * @hide
+     */
+    public static boolean isKeystore2Enabled() {
+        return sKeystore2Enabled;
+    }
+
+
     /**
      * Installs a new instance of this provider (and the
      * {@link AndroidKeyStoreBCWorkaroundProvider}).
@@ -138,6 +159,11 @@
             // priority.
             Security.addProvider(workaroundProvider);
         }
+
+        // {@code install()} is run by zygote when this property is still accessible. We store its
+        // value so that the Keystore SPI can act accordingly without having to access an internal
+        // property.
+        sKeystore2Enabled = Keystore2Properties.keystore2_enabled().orElse(false);
     }
 
     private void putSecretKeyFactoryImpl(String algorithm) {
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSecretKeyFactorySpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreSecretKeyFactorySpi.java
index 9707260..3694d63 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreSecretKeyFactorySpi.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreSecretKeyFactorySpi.java
@@ -211,7 +211,11 @@
                 userAuthenticationValidWhileOnBody,
                 trustedUserPresenceRequired,
                 invalidatedByBiometricEnrollment,
-                userConfirmationRequired);
+                userConfirmationRequired,
+                // Keystore 1.0 does not tell us the exact security level of the key
+                // so we report an unknown but secure security level.
+                insideSecureHardware ? KeyProperties.SECURITY_LEVEL_UNKNOWN_SECURE
+                        : KeyProperties.SECURITY_LEVEL_SOFTWARE);
     }
 
     private static BigInteger getGateKeeperSecureUserId() throws ProviderException {
diff --git a/keystore/java/android/security/keystore/ArrayUtils.java b/keystore/java/android/security/keystore/ArrayUtils.java
index f519c7c..c8c1de4 100644
--- a/keystore/java/android/security/keystore/ArrayUtils.java
+++ b/keystore/java/android/security/keystore/ArrayUtils.java
@@ -18,6 +18,8 @@
 
 import libcore.util.EmptyArray;
 
+import java.util.function.Consumer;
+
 /**
  * @hide
  */
@@ -107,4 +109,16 @@
             return result;
         }
     }
+
+    /**
+     * Runs {@code consumer.accept()} for each element of {@code array}.
+     * @param array
+     * @param consumer
+     * @hide
+     */
+    public static void forEach(int[] array, Consumer<Integer> consumer) {
+        for (int i : array) {
+            consumer.accept(i);
+        }
+    }
 }
diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
index 688c4a7..e9aac7d 100644
--- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
@@ -27,7 +27,6 @@
 import android.hardware.biometrics.BiometricPrompt;
 import android.os.Build;
 import android.security.GateKeeper;
-import android.security.KeyStore;
 import android.text.TextUtils;
 
 import java.math.BigInteger;
@@ -246,7 +245,7 @@
     private static final Date DEFAULT_CERT_NOT_AFTER = new Date(2461449600000L); // Jan 1 2048
 
     private final String mKeystoreAlias;
-    private final int mUid;
+    private final int mNamespace;
     private final int mKeySize;
     private final AlgorithmParameterSpec mSpec;
     private final X500Principal mCertificateSubject;
@@ -286,7 +285,7 @@
      */
     public KeyGenParameterSpec(
             String keyStoreAlias,
-            int uid,
+            int namespace,
             int keySize,
             AlgorithmParameterSpec spec,
             X500Principal certificateSubject,
@@ -337,7 +336,7 @@
         }
 
         mKeystoreAlias = keyStoreAlias;
-        mUid = uid;
+        mNamespace = namespace;
         mKeySize = keySize;
         mSpec = spec;
         mCertificateSubject = certificateSubject;
@@ -382,11 +381,43 @@
      * Returns the UID which will own the key. {@code -1} is an alias for the UID of the current
      * process.
      *
+     * @deprecated See deprecation message on {@link KeyGenParameterSpec.Builder#setUid(int)}.
+     *             Known namespaces will be translated to their legacy UIDs. Unknown
+     *             Namespaces will yield {@link IllegalStateException}.
+     *
      * @hide
      */
     @UnsupportedAppUsage
+    @Deprecated
     public int getUid() {
-        return mUid;
+        if (!AndroidKeyStoreProvider.isKeystore2Enabled()) {
+            // If Keystore2 has not been enabled we have to behave as if mNamespace is actually
+            // a UID, because we are still being used with the old Keystore SPI.
+            // TODO This if statement and body can be removed when the Keystore 2 migration is
+            //      complete. b/171563717
+            return mNamespace;
+        }
+        try {
+            return KeyProperties.namespaceToLegacyUid(mNamespace);
+        } catch (IllegalArgumentException e) {
+            throw new IllegalStateException("getUid called on KeyGenParameterSpec with non legacy"
+                    + " keystore namespace.", e);
+        }
+    }
+
+    /**
+     * Returns the target namespace for the key.
+     * See {@link KeyGenParameterSpec.Builder#setNamespace(int)}.
+     *
+     * @return The numeric namespace as configured in the keystore2_key_contexts files of Android's
+     *         SEPolicy.
+     *         TODO b/171806779 link to public Keystore 2.0 documentation.
+     *              See bug for more details for now.
+     * @hide
+     */
+    @SystemApi
+    public int getNamespace() {
+        return mNamespace;
     }
 
     /**
@@ -767,7 +798,7 @@
         private final String mKeystoreAlias;
         private @KeyProperties.PurposeEnum int mPurposes;
 
-        private int mUid = KeyStore.UID_SELF;
+        private int mNamespace = KeyProperties.NAMESPACE_APPLICATION;
         private int mKeySize = -1;
         private AlgorithmParameterSpec mSpec;
         private X500Principal mCertificateSubject;
@@ -830,7 +861,7 @@
          */
         public Builder(@NonNull KeyGenParameterSpec sourceSpec) {
             this(sourceSpec.getKeystoreAlias(), sourceSpec.getPurposes());
-            mUid = sourceSpec.getUid();
+            mNamespace = sourceSpec.getNamespace();
             mKeySize = sourceSpec.getKeySize();
             mSpec = sourceSpec.getAlgorithmParameterSpec();
             mCertificateSubject = sourceSpec.getCertificateSubject();
@@ -873,12 +904,51 @@
          *
          * @param uid UID or {@code -1} for the UID of the current process.
          *
+         * @deprecated Setting the UID of the target namespace is based on a hardcoded
+         * hack in the Keystore service. This is no longer supported with Keystore 2.0/Android S.
+         * Instead, dedicated non UID based namespaces can be configured in SEPolicy using
+         * the keystore2_key_contexts files. The functionality of this method will be supported
+         * by mapping knows special UIDs, such as WIFI, to the newly configured SELinux based
+         * namespaces. Unknown UIDs will yield {@link IllegalArgumentException}.
+         *
          * @hide
          */
         @SystemApi
         @NonNull
+        @Deprecated
         public Builder setUid(int uid) {
-            mUid = uid;
+            if (!AndroidKeyStoreProvider.isKeystore2Enabled()) {
+                // If Keystore2 has not been enabled we have to behave as if mNamespace is actually
+                // a UID, because we are still being used with the old Keystore SPI.
+                // TODO This if statement and body can be removed when the Keystore 2 migration is
+                //      complete. b/171563717
+                mNamespace = uid;
+                return this;
+            }
+            mNamespace = KeyProperties.legacyUidToNamespace(uid);
+            return this;
+        }
+
+        /**
+         * Set the designated SELinux namespace that the key shall live in. The caller must
+         * have sufficient permissions to install a key in the given namespace. Namespaces
+         * can be created using SEPolicy. The keystore2_key_contexts files map numeric
+         * namespaces to SELinux labels, and SEPolicy can be used to grant access to these
+         * namespaces to the desired target context. This is the preferred way to share
+         * keys between system and vendor components, e.g., WIFI settings and WPA supplicant.
+         *
+         * @param namespace Numeric SELinux namespace as configured in keystore2_key_contexts
+         *                  of Android's SEPolicy.
+         *                  TODO b/171806779 link to public Keystore 2.0 documentation.
+         *                       See bug for more details for now.
+         * @return this Builder object.
+         *
+         * @hide
+         */
+        @SystemApi
+        @NonNull
+        public Builder setNamespace(int namespace) {
+            mNamespace = namespace;
             return this;
         }
 
@@ -1489,7 +1559,7 @@
         public KeyGenParameterSpec build() {
             return new KeyGenParameterSpec(
                     mKeystoreAlias,
-                    mUid,
+                    mNamespace,
                     mKeySize,
                     mSpec,
                     mCertificateSubject,
diff --git a/keystore/java/android/security/keystore/KeyInfo.java b/keystore/java/android/security/keystore/KeyInfo.java
index d891a25..7158d0c 100644
--- a/keystore/java/android/security/keystore/KeyInfo.java
+++ b/keystore/java/android/security/keystore/KeyInfo.java
@@ -84,6 +84,7 @@
     private final boolean mTrustedUserPresenceRequired;
     private final boolean mInvalidatedByBiometricEnrollment;
     private final boolean mUserConfirmationRequired;
+    private final @KeyProperties.SecurityLevelEnum int mSecurityLevel;
 
     /**
      * @hide
@@ -107,7 +108,8 @@
             boolean userAuthenticationValidWhileOnBody,
             boolean trustedUserPresenceRequired,
             boolean invalidatedByBiometricEnrollment,
-            boolean userConfirmationRequired) {
+            boolean userConfirmationRequired,
+            @KeyProperties.SecurityLevelEnum int securityLevel) {
         mKeystoreAlias = keystoreKeyAlias;
         mInsideSecureHardware = insideSecureHardware;
         mOrigin = origin;
@@ -131,6 +133,7 @@
         mTrustedUserPresenceRequired = trustedUserPresenceRequired;
         mInvalidatedByBiometricEnrollment = invalidatedByBiometricEnrollment;
         mUserConfirmationRequired = userConfirmationRequired;
+        mSecurityLevel = securityLevel;
     }
 
     /**
@@ -144,7 +147,10 @@
      * Returns {@code true} if the key resides inside secure hardware (e.g., Trusted Execution
      * Environment (TEE) or Secure Element (SE)). Key material of such keys is available in
      * plaintext only inside the secure hardware and is not exposed outside of it.
+     *
+     * @deprecated This method is superseded by @see getSecurityLevel.
      */
+    @Deprecated
     public boolean isInsideSecureHardware() {
         return mInsideSecureHardware;
     }
@@ -355,4 +361,17 @@
     public boolean isTrustedUserPresenceRequired() {
         return mTrustedUserPresenceRequired;
     }
+
+    /**
+     * Returns the security level that the key is protected by.
+     * {@code KeyProperties.SecurityLevelEnum.TRUSTED_ENVIRONMENT} and
+     * {@code KeyProperties.SecurityLevelEnum.STRONGBOX} indicate that the key material resides
+     * in secure hardware. Key material of such keys is available in
+     * plaintext only inside the secure hardware and is not exposed outside of it.
+     *
+     * <p>See {@link KeyProperties}.{@code SecurityLevelEnum} constants.
+     */
+    public @KeyProperties.SecurityLevelEnum int getSecurityLevel() {
+        return mSecurityLevel;
+    }
 }
diff --git a/keystore/java/android/security/keystore/KeyProperties.java b/keystore/java/android/security/keystore/KeyProperties.java
index 9050c69..5928540 100644
--- a/keystore/java/android/security/keystore/KeyProperties.java
+++ b/keystore/java/android/security/keystore/KeyProperties.java
@@ -20,6 +20,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.StringDef;
+import android.security.KeyStore;
 import android.security.keymaster.KeymasterDefs;
 
 import libcore.util.EmptyArray;
@@ -857,4 +858,43 @@
         }
     }
 
+    /**
+     * This value indicates the implicit keystore namespace of the calling application.
+     * It is used by default. Only select system components can choose a different namespace
+     * which it must be configured in SEPolicy.
+     * @hide
+     */
+    public static final int NAMESPACE_APPLICATION = -1;
+
+    /**
+     * For legacy support, translate namespaces into known UIDs.
+     * @hide
+     */
+    public static int namespaceToLegacyUid(int namespace) {
+        switch (namespace) {
+            case NAMESPACE_APPLICATION:
+                return KeyStore.UID_SELF;
+            // TODO Translate WIFI and VPN UIDs once the namespaces are defined.
+            //  b/171305388 and b/171305607
+            default:
+                throw new IllegalArgumentException("No UID corresponding to namespace "
+                        + namespace);
+        }
+    }
+
+    /**
+     * For legacy support, translate namespaces into known UIDs.
+     * @hide
+     */
+    public static int legacyUidToNamespace(int uid) {
+        switch (uid) {
+            case KeyStore.UID_SELF:
+                return NAMESPACE_APPLICATION;
+            // TODO Translate WIFI and VPN UIDs once the namespaces are defined.
+            //  b/171305388 and b/171305607
+            default:
+                throw new IllegalArgumentException("No namespace corresponding to uid "
+                        + uid);
+        }
+    }
 }
diff --git a/libs/WindowManager/Shell/OWNERS b/libs/WindowManager/Shell/OWNERS
index 4390004..36da7aa 100644
--- a/libs/WindowManager/Shell/OWNERS
+++ b/libs/WindowManager/Shell/OWNERS
@@ -1,4 +1,5 @@
 # sysui owners
 hwwang@google.com
 mrenouf@google.com
-winsonc@google.com
\ No newline at end of file
+winsonc@google.com
+madym@google.com
diff --git a/libs/WindowManager/Shell/res/layout/bubble_menu_view.xml b/libs/WindowManager/Shell/res/layout/bubble_menu_view.xml
index 0c1d1a5..d19b653 100644
--- a/libs/WindowManager/Shell/res/layout/bubble_menu_view.xml
+++ b/libs/WindowManager/Shell/res/layout/bubble_menu_view.xml
@@ -16,14 +16,16 @@
   -->
 <com.android.wm.shell.bubbles.BubbleMenuView
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_height="match_parent"
     android:layout_width="match_parent"
     android:background="#66000000"
     android:visibility="gone"
-    android:id="@+id/bubble_menu_container">
+    android:id="@+id/bubble_menu_container"
+    tools:ignore="MissingClass">
 
     <FrameLayout
-        android:layout_height="@dimen/individual_bubble_size"
+        android:layout_height="@dimen/bubble_menu_item_height"
         android:layout_width="wrap_content"
         android:background="#FFFFFF"
         android:id="@+id/bubble_menu_view">
diff --git a/libs/WindowManager/Shell/res/layout/bubble_overflow_button.xml b/libs/WindowManager/Shell/res/layout/bubble_overflow_button.xml
index 61000fe..e392cdc2 100644
--- a/libs/WindowManager/Shell/res/layout/bubble_overflow_button.xml
+++ b/libs/WindowManager/Shell/res/layout/bubble_overflow_button.xml
@@ -17,6 +17,6 @@
 <com.android.wm.shell.bubbles.BadgedImageView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/bubble_overflow_button"
-    android:layout_width="@dimen/individual_bubble_size"
-    android:layout_height="@dimen/individual_bubble_size"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
     android:src="@drawable/bubble_ic_overflow_button"/>
diff --git a/libs/WindowManager/Shell/res/layout/bubble_view.xml b/libs/WindowManager/Shell/res/layout/bubble_view.xml
index a28bd678..2b4b9e9 100644
--- a/libs/WindowManager/Shell/res/layout/bubble_view.xml
+++ b/libs/WindowManager/Shell/res/layout/bubble_view.xml
@@ -17,5 +17,5 @@
 <com.android.wm.shell.bubbles.BadgedImageView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/bubble_view"
-    android:layout_width="@dimen/individual_bubble_size"
-    android:layout_height="@dimen/individual_bubble_size"/>
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"/>
diff --git a/libs/WindowManager/Shell/res/raw/wm_shell_protolog.json b/libs/WindowManager/Shell/res/raw/wm_shell_protolog.json
index 6342c00..8213f2f 100644
--- a/libs/WindowManager/Shell/res/raw/wm_shell_protolog.json
+++ b/libs/WindowManager/Shell/res/raw/wm_shell_protolog.json
@@ -79,6 +79,12 @@
       "group": "WM_SHELL_TASK_ORG",
       "at": "com\/android\/wm\/shell\/splitscreen\/SplitScreenTaskListener.java"
     },
+    "-742394458": {
+      "message": "pair task1=%d task2=%d in AppPair=%s",
+      "level": "VERBOSE",
+      "group": "WM_SHELL_TASK_ORG",
+      "at": "com\/android\/wm\/shell\/apppairs\/AppPair.java"
+    },
     "-710770147": {
       "message": "Add target: %s",
       "level": "VERBOSE",
@@ -91,6 +97,12 @@
       "group": "WM_SHELL_TASK_ORG",
       "at": "com\/android\/wm\/shell\/splitscreen\/SplitScreenTaskListener.java"
     },
+    "-234284913": {
+      "message": "unpair taskId=%d pair=%s",
+      "level": "VERBOSE",
+      "group": "WM_SHELL_TASK_ORG",
+      "at": "com\/android\/wm\/shell\/apppairs\/AppPairsController.java"
+    },
     "-191422040": {
       "message": "Transition animations finished, notifying core %s",
       "level": "VERBOSE",
@@ -139,12 +151,30 @@
       "group": "WM_SHELL_TASK_ORG",
       "at": "com\/android\/wm\/shell\/ShellTaskOrganizer.java"
     },
+    "900599280": {
+      "message": "Can't pair unresizeable tasks task1.isResizeable=%b task1.isResizeable=%b",
+      "level": "ERROR",
+      "group": "WM_SHELL_TASK_ORG",
+      "at": "com\/android\/wm\/shell\/apppairs\/AppPair.java"
+    },
+    "950299522": {
+      "message": "taskId %d isn't isn't in an app-pair.",
+      "level": "VERBOSE",
+      "group": "WM_SHELL_TASK_ORG",
+      "at": "com\/android\/wm\/shell\/apppairs\/AppPairsController.java"
+    },
     "980952660": {
       "message": "Task root back pressed taskId=%d",
       "level": "VERBOSE",
       "group": "WM_SHELL_TASK_ORG",
       "at": "com\/android\/wm\/shell\/ShellTaskOrganizer.java"
     },
+    "1079041527": {
+      "message": "incrementPool size=%d",
+      "level": "VERBOSE",
+      "group": "WM_SHELL_TASK_ORG",
+      "at": "com\/android\/wm\/shell\/apppairs\/AppPairsPool.java"
+    },
     "1104702476": {
       "message": "Letterbox Task Changed: #%d",
       "level": "VERBOSE",
@@ -175,12 +205,24 @@
       "group": "WM_SHELL_DRAG_AND_DROP",
       "at": "com\/android\/wm\/shell\/draganddrop\/DragAndDropController.java"
     },
+    "1891981945": {
+      "message": "release entry.taskId=%s listener=%s size=%d",
+      "level": "VERBOSE",
+      "group": "WM_SHELL_TASK_ORG",
+      "at": "com\/android\/wm\/shell\/apppairs\/AppPairsPool.java"
+    },
     "1990759023": {
       "message": "addListenerForType types=%s listener=%s",
       "level": "VERBOSE",
       "group": "WM_SHELL_TASK_ORG",
       "at": "com\/android\/wm\/shell\/ShellTaskOrganizer.java"
     },
+    "2006473416": {
+      "message": "acquire entry.taskId=%s listener=%s size=%d",
+      "level": "VERBOSE",
+      "group": "WM_SHELL_TASK_ORG",
+      "at": "com\/android\/wm\/shell\/apppairs\/AppPairsPool.java"
+    },
     "2057038970": {
       "message": "Display changed: %d",
       "level": "VERBOSE",
diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml
new file mode 100644
index 0000000..ea634cf
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-af/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Maak toe"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Vou uit"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Instellings"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Kieslys"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> is in beeld-in-beeld"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"As jy nie wil hê dat <xliff:g id="NAME">%s</xliff:g> hierdie kenmerk moet gebruik nie, tik om instellings oop te maak en skakel dit af."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Speel"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Laat wag"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Slaan oor na volgende"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Slaan oor na vorige"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Verander grootte"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Program sal dalk nie met verdeelde skerm werk nie."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Program steun nie verdeelde skerm nie."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Program sal dalk nie op \'n sekondêre skerm werk nie."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Program steun nie begin op sekondêre skerms nie."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Skermverdeler"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Volskerm links"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Links 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Links 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Links 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Volskerm regs"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Volskerm bo"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Bo 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Bo 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Bo 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Volskerm onder"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Gebruik eenhandmodus"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Swiep van die onderkant van die skerm af op of tik enige plek bo die program om uit te gaan"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Begin eenhandmodus"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Verlaat eenhandmodus"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Instellings vir <xliff:g id="APP_NAME">%1$s</xliff:g>-borrels"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Oorloop"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Voeg terug op stapel"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> vanaf <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> van <xliff:g id="APP_NAME">%2$s</xliff:g> en <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> meer af"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Beweeg na links bo"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Beweeg na regs bo"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Beweeg na links onder"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Beweeg na regs onder"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>-instellings"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Maak borrel toe"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Moenie dat gesprek \'n borrel word nie"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Klets met borrels"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nuwe gesprekke verskyn as swerwende ikone, of borrels Tik op borrel om dit oop te maak. Sleep om dit te skuif."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Beheer borrels enige tyd"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tik op Bestuur om borrels vanaf hierdie program af te skakel"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Het dit"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Geen onlangse borrels nie"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Onlangse borrels en borrels wat toegemaak is, sal hier verskyn"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Borrel"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Bestuur"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Borrel is toegemaak."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-af/strings_tv.xml b/libs/WindowManager/Shell/res/values-af/strings_tv.xml
new file mode 100644
index 0000000..6ce5880
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-af/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Beeld-in-beeld"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Titellose program)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Maak PIP toe"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Volskerm"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml
new file mode 100644
index 0000000..e4628d7
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-am/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"ዝጋ"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"ዘርጋ"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"ቅንብሮች"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"ምናሌ"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> በስዕል-ላይ-ስዕል ውስጥ ነው"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g> ይህን ባህሪ እንዲጠቀም ካልፈለጉ ቅንብሮችን ለመክፈት መታ ያድርጉና ያጥፉት።"</string>
+    <string name="pip_play" msgid="3496151081459417097">"አጫውት"</string>
+    <string name="pip_pause" msgid="690688849510295232">"ባለበት አቁም"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"ወደ ቀጣይ ዝለል"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"ወደ ቀዳሚ ዝለል"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"መጠን ይቀይሩ"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"መተግበሪያ ከተከፈለ ማያ ገጽ ጋር ላይሠራ ይችላል"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"መተግበሪያው የተከፈለ ማያ ገጽን አይደግፍም።"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"መተግበሪያ በሁለተኛ ማሳያ ላይ ላይሠራ ይችላል።"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"መተግበሪያ በሁለተኛ ማሳያዎች ላይ ማስጀመርን አይደግፍም።"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"የተከፈለ የማያ ገጽ ከፋይ"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"የግራ ሙሉ ማያ ገጽ"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ግራ 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ግራ 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ግራ 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"የቀኝ ሙሉ ማያ ገጽ"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"የላይ ሙሉ ማያ ገጽ"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ከላይ 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ከላይ 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ከላይ 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"የታች ሙሉ ማያ ገጽ"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"ባለአንድ እጅ ሁነታን በመጠቀም ላይ"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"ለመውጣት ከማያው ግርጌ ወደ ላይ ይጥረጉ ወይም ከመተግበሪያው በላይ ማንኛውም ቦታ ላይ መታ ያድርጉ"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"ባለአንድ እጅ ሁነታ ጀምር"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"ከአንድ እጅ ሁነታ ውጣ"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"ቅንብሮች ለ <xliff:g id="APP_NAME">%1$s</xliff:g> አረፋዎች"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ትርፍ ፍሰት"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ወደ ቁልል መልሰው ያክሉ"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ከ<xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ከ <xliff:g id="APP_NAME">%2$s</xliff:g> እና <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ተጨማሪ"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"ወደ ላይኛው ግራ አንቀሳቅስ"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"ወደ ላይኛው ቀኝ አንቀሳቅስ"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"የግርጌውን ግራ አንቀሳቅስ"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"ታችኛውን ቀኝ ያንቀሳቅሱ"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"የ<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ቅንብሮች"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"አረፋን አሰናብት"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"ውይይቶችን በአረፋ አታሳይ"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"አረፋዎችን በመጠቀም ይወያዩ"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"አዲስ ውይይቶች እንደ ተንሳፋፊ አዶዎች ወይም አረፋዎች ሆነው ይታያሉ። አረፋን ለመክፈት መታ ያድርጉ። ለመውሰድ ይጎትቱት።"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"በማንኛውም ጊዜ አረፋዎችን ይቆጣጠሩ"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"የዚህ መተግበሪያ አረፋዎችን ለማጥፋት አቀናብርን መታ ያድርጉ"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"ገባኝ"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ምንም የቅርብ ጊዜ አረፋዎች የሉም"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"የቅርብ ጊዜ አረፋዎች እና የተሰናበቱ አረፋዎች እዚህ ብቅ ይላሉ"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"አረፋ"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"ያቀናብሩ"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"አረፋ ተሰናብቷል።"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-am/strings_tv.xml b/libs/WindowManager/Shell/res/values-am/strings_tv.xml
new file mode 100644
index 0000000..fcb87c5
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-am/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"ስዕል-ላይ-ስዕል"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ርዕስ የሌለው ፕሮግራም)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIPን ዝጋ"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"ሙሉ ማያ ገጽ"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml
new file mode 100644
index 0000000..3e81255
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ar/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"إغلاق"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"توسيع"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"الإعدادات"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"القائمة"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> يظهر في صورة داخل صورة"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"إذا كنت لا تريد أن يستخدم <xliff:g id="NAME">%s</xliff:g> هذه الميزة، فانقر لفتح الإعدادات، ثم أوقِف تفعيل هذه الميزة."</string>
+    <string name="pip_play" msgid="3496151081459417097">"تشغيل"</string>
+    <string name="pip_pause" msgid="690688849510295232">"إيقاف مؤقت"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"التخطي إلى التالي"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"التخطي إلى السابق"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"تغيير الحجم"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"التطبيق لا يتيح تقسيم الشاشة."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"قد لا يعمل التطبيق على شاشة عرض ثانوية."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"لا يمكن تشغيل التطبيق على شاشات عرض ثانوية."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"أداة تقسيم الشاشة"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"عرض النافذة اليسرى بملء الشاشة"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ضبط حجم النافذة اليسرى ليكون ٧٠%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ضبط حجم النافذة اليسرى ليكون ٥٠%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ضبط حجم النافذة اليسرى ليكون ٣٠%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"عرض النافذة اليمنى بملء الشاشة"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"عرض النافذة العلوية بملء الشاشة"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ضبط حجم النافذة العلوية ليكون ٧٠%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ضبط حجم النافذة العلوية ليكون ٥٠%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ضبط حجم النافذة العلوية ليكون ٣٠%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"عرض النافذة السفلية بملء الشاشة"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"إعدادات فقاعات المحادثات على <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"القائمة الكاملة"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"إضافة دعم إلى الحزم"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> من <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> من <xliff:g id="APP_NAME">%2$s</xliff:g> و<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> أيضًا"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"نقل إلى أعلى يمين الشاشة"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"الانتقال إلى أعلى اليسار"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"نقل إلى أسفل يمين الشاشة"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"نقل إلى أسفل اليسار"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"إعدادات <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"إغلاق فقاعة المحادثة"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"عدم عرض المحادثة كفقاعة محادثة"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"الدردشة باستخدام فقاعات المحادثات"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"تظهر المحادثات الجديدة كرموز عائمة أو كفقاعات. انقر لفتح فقاعة المحادثة، واسحبها لتحريكها."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"التحكّم في فقاعات المحادثات في أي وقت"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"انقر على \"إدارة\" لإيقاف فقاعات المحادثات من هذا التطبيق."</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ليس هناك فقاعات محادثات"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"ستظهر هنا أحدث فقاعات المحادثات وفقاعات المحادثات التي تم إغلاقها."</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"فقاعة"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"إدارة"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"تم إغلاق الفقاعة."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ar/strings_tv.xml b/libs/WindowManager/Shell/res/values-ar/strings_tv.xml
new file mode 100644
index 0000000..61588a0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ar/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ليس هناك عنوان للبرنامج)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"‏إغلاق PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"ملء الشاشة"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml
new file mode 100644
index 0000000..81cdc7f
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-as/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"বন্ধ কৰক"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"বিস্তাৰ কৰক"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"ছেটিংসমূহ"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"মেনু"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> চিত্ৰৰ ভিতৰৰ চিত্ৰত আছে"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"আপুনি যদি <xliff:g id="NAME">%s</xliff:g> সুবিধাটো ব্যৱহাৰ কৰিব নোখোজে, তেন্তে ছেটিংসমূহ খুলিবলৈ টিপক আৰু তালৈ গৈ ইয়াক অফ কৰক।"</string>
+    <string name="pip_play" msgid="3496151081459417097">"প্লে কৰক"</string>
+    <string name="pip_pause" msgid="690688849510295232">"পজ কৰক"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"পৰৱৰ্তী মিডিয়ালৈ যাওক"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"আগৰটো মিডিয়ালৈ যাওক"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"আকাৰ সলনি কৰক"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"এপটোৱে বিভাজিত স্ক্ৰীণ সমৰ্থন নকৰে।"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"গৌণ ডিছপ্লেত এপে সঠিকভাৱে কাম নকৰিব পাৰে।"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"গৌণ ডিছপ্লেত এপ্ লঞ্চ কৰিব নোৱাৰি।"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"স্প্লিট স্ক্ৰীণৰ বিভাজক"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"বাওঁফালৰ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"বাওঁফালৰ স্ক্ৰীণখন ৭০% কৰক"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"বাওঁফালৰ স্ক্ৰীণখন ৫০% কৰক"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"বাওঁফালৰ স্ক্ৰীণখন ৩০% কৰক"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"সোঁফালৰ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"শীৰ্ষ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"শীর্ষ স্ক্ৰীণখন ৭০% কৰক"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"শীর্ষ স্ক্ৰীণখন ৫০% কৰক"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"শীর্ষ স্ক্ৰীণখন ৩০% কৰক"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"তলৰ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ bubblesৰ ছেটিংসমূহ"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"অভাৰফ্ল’"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ষ্টেকত পুনৰ যোগ দিয়ক"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g>ৰ পৰা <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> আৰু<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>টাৰ পৰা <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"শীৰ্ষৰ বাওঁফালে নিয়ক"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"শীৰ্ষৰ সোঁফালে নিয়ক"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"বুটামটো বাওঁফালে নিয়ক"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"তলৰ সোঁফালে নিয়ক"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ছেটিংসমূহ"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"বাবল অগ্ৰাহ্য কৰক"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"বাৰ্তালাপ বাবল নকৰিব"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Bubbles ব্যৱহাৰ কৰি চাট কৰক"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"নতুন বাৰ্তালাপ উপঙি থকা চিহ্নসমূহ অথবা bubbles হিচাপে প্ৰদর্শিত হয়। Bubbles খুলিবলৈ টিপক। এইটো স্থানান্তৰ কৰিবলৈ টানি নিয়ক।"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"যিকোনো সময়তে bubbles নিয়ন্ত্ৰণ কৰক"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"এই এপ্‌টোৰ পৰা bubbles অফ কৰিবলৈ পৰিচালনা কৰকত টিপক"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"কোনো শেহতীয়া bubbles নাই"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"শেহতীয়া bubbles আৰু অগ্ৰাহ্য কৰা bubbles ইয়াত প্ৰদর্শিত হ\'ব"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"বাবল"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"পৰিচালনা কৰক"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"বাবল অগ্ৰাহ্য কৰা হৈছে"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-as/strings_tv.xml b/libs/WindowManager/Shell/res/values-as/strings_tv.xml
new file mode 100644
index 0000000..c4e3f38
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-as/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(শিৰোনামবিহীন কাৰ্যক্ৰম)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"পিপ বন্ধ কৰক"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"সম্পূৰ্ণ স্ক্ৰীণ"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml
new file mode 100644
index 0000000..923ff79
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-az/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Bağlayın"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Genişləndirin"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Ayarlar"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menyu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> şəkil içində şəkildədir"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g> tətbiqinin bu funksiyadan istifadə etməyini istəmirsinizsə, ayarları açmaq və deaktiv etmək üçün klikləyin."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Oxudun"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Fasilə verin"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Növbətiyə keçin"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Əvvəlkinə keçin"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Ölçüsünü dəyişin"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Tətbiq bölünmüş ekran ilə işləməyə bilər."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Tətbiq ekran bölünməsini dəstəkləmir."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Tətbiq ikinci ekranda işləməyə bilər."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Tətbiq ikinci ekranda başlamağı dəstəkləmir."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Bölünmüş ekran ayırıcısı"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Sol tam ekran"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Sol 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Sol 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Sol 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Sağ tam ekran"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Yuxarı tam ekran"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Yuxarı 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Yuxarı 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Yuxarı 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Aşağı tam ekran"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Bir əlli rejimdən istifadə edilir"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Çıxmaq üçün ekranın aşağısından yuxarıya doğru sürüşdürün və ya tətbiqin yuxarısında istənilən yerə toxunun"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Bir əlli rejimi başladın"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Bir əlli rejimdən çıxın"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> yumrucuqları üçün ayarlar"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Kənara çıxma"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Yenidən dəstəyə əlavə edin"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> tətbiqindən <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> tətbiqindən <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> və daha <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> qabarcıq"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Yuxarıya sola köçürün"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Yuxarıya sağa köçürün"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Aşağıya sola köçürün"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Aşağıya sağa köçürün"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ayarları"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Yumrucuğu ləğv edin"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Söhbəti yumrucuqda göstərmə"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Yumrucuqlardan istifadə edərək söhbət edin"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Yeni söhbətlər üzən nişanlar və ya yumrucuqlar kimi görünür. Yumrucuğu açmaq üçün toxunun. Hərəkət etdirmək üçün sürüşdürün."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Yumrucuqları istənilən vaxt idarə edin"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Bu tətbiqdə yumrucuqları deaktiv etmək üçün \"İdarə edin\" seçiminə toxunun"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Anladım"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Yumrucuqlar yoxdur"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Son yumrucuqlar və buraxılmış yumrucuqlar burada görünəcək"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Qabarcıq"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"İdarə edin"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Qabarcıqdan imtina edilib."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-az/strings_tv.xml b/libs/WindowManager/Shell/res/values-az/strings_tv.xml
new file mode 100644
index 0000000..c9f1acb
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-az/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Şəkil-içində-Şəkil"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Başlıqsız proqram)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP bağlayın"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Tam ekran"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..02e609cd
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Zatvori"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Proširi"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Podešavanja"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Meni"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> je slika u slici"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Ako ne želite da <xliff:g id="NAME">%s</xliff:g> koristi ovu funkciju, dodirnite da biste otvorili podešavanja i isključili je."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Pusti"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pauziraj"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Pređi na sledeće"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Pređi na prethodno"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Promenite veličinu"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacija možda neće raditi sa podeljenim ekranom."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacija ne podržava podeljeni ekran."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacija možda neće funkcionisati na sekundarnom ekranu."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikacija ne podržava pokretanje na sekundarnim ekranima."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Razdelnik podeljenog ekrana"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Režim celog ekrana za levi ekran"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Levi ekran 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Levi ekran 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Levi ekran 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Režim celog ekrana za donji ekran"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Režim celog ekrana za gornji ekran"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Gornji ekran 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Gornji ekran 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Gornji ekran 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Režim celog ekrana za donji ekran"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Korišćenje režima jednom rukom"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Da biste izašli, prevucite nagore od dna ekrana ili dodirnite bilo gde iznad aplikacije"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Pokrenite režim jednom rukom"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Izađite iz režima jednom rukom"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Podešavanja za <xliff:g id="APP_NAME">%1$s</xliff:g> oblačiće"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Preklapanje"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Dodaj ponovo u grupu"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> i još <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Premesti gore levo"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Premesti gore desno"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Premesti dole levo"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Premesti dole desno"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Podešavanja za <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Odbaci oblačić"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ne koristi oblačiće za konverzaciju"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Ćaskajte u oblačićima"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nove konverzacije se prikazuju kao plutajuće ikone ili oblačići. Dodirnite da biste otvorili oblačić. Prevucite da biste ga premestili."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Kontrolišite oblačiće u bilo kom trenutku"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Dodirnite Upravljajte da biste isključili oblačiće iz ove aplikacije"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Važi"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Nema nedavnih oblačića"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Ovde se prikazuju nedavni i odbačeni oblačići"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Oblačić"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljajte"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblačić je odbačen."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings_tv.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings_tv.xml
new file mode 100644
index 0000000..6fbc91b
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Slika u slici"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program bez naslova)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Zatvori PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Ceo ekran"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml
new file mode 100644
index 0000000..ccea318
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-be/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Закрыць"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Разгарнуць"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Налады"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Меню"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> з’яўляецца відарысам у відарысе"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Калі вы не хочаце, каб праграма <xliff:g id="NAME">%s</xliff:g> выкарыстоўвала гэту функцыю, дакраніцеся, каб адкрыць налады і адключыць яе."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Прайграць"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Прыпыніць"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Перайсці да наступнага"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Перайсці да папярэдняга"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Змяніць памер"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Праграма можа не працаваць у рэжыме падзеленага экрана."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Праграма не падтрымлівае функцыю дзялення экрана."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Праграма можа не працаваць на дадатковых экранах."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Праграма не падтрымлівае запуск на дадатковых экранах."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Раздзяляльнік падзеленага экрана"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Левы экран – поўнаэкранны рэжым"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Левы экран – 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Левы экран – 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Левы экран – 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Правы экран – поўнаэкранны рэжым"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Верхні экран – поўнаэкранны рэжым"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Верхні экран – 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Верхні экран – 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Верхні экран – 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Ніжні экран – поўнаэкранны рэжым"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Выкарыстоўваецца рэжым кіравання адной рукой"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Каб выйсці, правядзіце па экране пальцам знізу ўверх або націсніце ў любым месцы над праграмай"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Запусціць рэжым кіравання адной рукой"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Выйсці з рэжыму кіравання адной рукой"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Налады ўсплывальных апавяшчэнняў у праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Дадатковае меню"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Зноў дадаць у стос"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ад праграмы \"<xliff:g id="APP_NAME">%2$s</xliff:g>\""</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ад праграмы \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" і яшчэ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Перамясціць лявей і вышэй"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Перамясціце правей і вышэй"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Перамясціць лявей і ніжэй"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Перамясціць правей і ніжэй"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Налады \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\""</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Адхіліць апавяшчэнне"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Не паказваць размову ў выглядзе ўсплывальных апавяшчэнняў"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Усплывальныя апавяшчэнні"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Новыя размовы будуць паказвацца як рухомыя значкі ці ўсплывальныя апавяшчэнні. Націсніце, каб адкрыць усплывальнае апавяшчэнне. Перацягніце яго, каб перамясціць."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Кіруйце ўсплывальнымі апавяшчэннямі ў любы час"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Каб выключыць усплывальныя апавяшчэнні з гэтай праграмы, націсніце \"Кіраваць\""</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Зразумела"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Няма нядаўніх усплывальных апавяшчэнняў"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Нядаўнія і адхіленыя ўсплывальныя апавяшчэнні будуць паказаны тут"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Усплывальнае апавяшчэнне"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Кіраваць"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Усплывальнае апавяшчэнне адхілена."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-be/strings_tv.xml b/libs/WindowManager/Shell/res/values-be/strings_tv.xml
new file mode 100644
index 0000000..973ae8e
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-be/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Відарыс у відарысе"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Праграма без назвы)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Закрыць PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Ва ўвесь экран"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml
new file mode 100644
index 0000000..d29660b
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-bg/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Затваряне"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Разгъване"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Настройки"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Меню"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> е в режима „Картина в картината“"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Ако не искате <xliff:g id="NAME">%s</xliff:g> да използва тази функция, докоснете, за да отворите настройките, и я изключете."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Пускане"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Поставяне на пауза"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Към следващия елемент"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Към предишния елемент"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Преоразмеряване"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Приложението може да не работи в режим на разделен екран."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Приложението не поддържа разделен екран."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Възможно е приложението да не работи на алтернативни дисплеи."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Приложението не поддържа използването на алтернативни дисплеи."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Разделител в режима за разделен екран"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ляв екран: Показване на цял екран"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Ляв екран: 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ляв екран: 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ляв екран: 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Десен екран: Показване на цял екран"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Горен екран: Показване на цял екран"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Горен екран: 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Горен екран: 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Горен екран: 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Долен екран: Показване на цял екран"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Използване на режима за работа с една ръка"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"За изход прекарайте пръст нагоре от долната част на екрана или докоснете произволно място над приложението"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Стартиране на режима за работа с една ръка"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Изход от режима за работа с една ръка"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Настройки за балончетата за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Препълване"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Добавяне обратно към стека"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> от <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ от<xliff:g id="APP_NAME">%2$s</xliff:g> и още <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Преместване горе вляво"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Преместване горе вдясно"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Преместване долу вляво"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Преместване долу вдясно"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Настройки за <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Отхвърляне на балончетата"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Без балончета за разговора"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Чат с балончета"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Новите разговори се показват като плаващи икони, или балончета. Докоснете балонче, за да го отворите, или го плъзнете, за да го преместите."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Управление на балончетата по всяко време"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Докоснете „Управление“, за да изключите балончетата от това приложение"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Разбрах"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Няма скорошни балончета"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Скорошните и отхвърлените балончета ще се показват тук"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Балонче"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Управление"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Балончето е отхвърлено."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-bg/strings_tv.xml b/libs/WindowManager/Shell/res/values-bg/strings_tv.xml
new file mode 100644
index 0000000..f4fad60
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-bg/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Картина в картината"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Програма без заглавие)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Затваряне на PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Цял екран"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml
new file mode 100644
index 0000000..e92f8c9
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-bn/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"বন্ধ করুন"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"বড় করুন"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"সেটিংস"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"মেনু"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"ছবির-মধ্যে-ছবি তে <xliff:g id="NAME">%s</xliff:g> আছেন"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g> কে এই বৈশিষ্ট্যটি ব্যবহার করতে দিতে না চাইলে ট্যাপ করে সেটিংসে গিয়ে সেটি বন্ধ করে দিন।"</string>
+    <string name="pip_play" msgid="3496151081459417097">"চালান"</string>
+    <string name="pip_pause" msgid="690688849510295232">"বিরাম দিন"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"এগিয়ে যাওয়ার জন্য এড়িয়ে যান"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"পিছনে যাওয়ার জন্য এড়িয়ে যান"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"রিসাইজ করুন"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"অ্যাপ্লিকেশান বিভক্ত-স্ক্রিন সমর্থন করে না৷"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"সেকেন্ডারি ডিসপ্লেতে অ্যাপটি কাজ নাও করতে পারে।"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"সেকেন্ডারি ডিসপ্লেতে অ্যাপ লঞ্চ করা যাবে না।"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"বিভক্ত-স্ক্রিন বিভাজক"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"বাঁ দিকের অংশ নিয়ে পূর্ণ স্ক্রিন"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"৭০% বাকি আছে"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"৫০% বাকি আছে"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"৩০% বাকি আছে"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ডান দিকের অংশ নিয়ে পূর্ণ স্ক্রিন"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"উপর দিকের অংশ নিয়ে পূর্ণ স্ক্রিন"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"শীর্ষ ৭০%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"শীর্ষ ৫০%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"শীর্ষ ৩০%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"নীচের অংশ নিয়ে পূর্ণ স্ক্রিন"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> বাবলের জন্য সেটিংস"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ওভারফ্লো"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"স্ট্যাকে আবার যোগ করুন"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> অ্যাপ থেকে <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> অ্যাপ এবং আরও <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>টি থেকে <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"উপরে বাঁদিকে সরান"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"উপরে ডানদিকে সরান"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"নিচে বাঁদিকে সরান"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"নিচে ডান দিকে সরান"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> সেটিংস"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"বাবল খারিজ করুন"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"কথোপকথন বাবল হিসেবে দেখাবে না"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"বাবল ব্যবহার করে চ্যাট করুন"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"নতুন কথোপকথন ভেসে থাকা আইকন বা বাবল হিসেবে দেখানো হয়। বাবল খুলতে ট্যাপ করুন। সেটি সরাতে ধরে টেনে আনুন।"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"যেকোনও সময় বাবল নিয়ন্ত্রণ করুন"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"এই অ্যাপ থেকে বাবল বন্ধ করতে \'ম্যানেজ করুন\' বিকল্প ট্যাপ করুন"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"কোনও সাম্প্রতিক বাবল নেই"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"সাম্প্রতিক ও বাতিল করা বাবল এখানে দেখা যাবে"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"বাবল"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"ম্যানেজ করুন"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"বাবল বাতিল করা হয়েছে।"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-bn/strings_tv.xml b/libs/WindowManager/Shell/res/values-bn/strings_tv.xml
new file mode 100644
index 0000000..783cb92
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-bn/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(শিরোনামহীন প্রোগ্রাম)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP বন্ধ করুন"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"পূর্ণ স্ক্রিন"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml
new file mode 100644
index 0000000..e509e5c
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-bs/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Zatvori"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Proširi"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Postavke"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Meni"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> je u načinu priakza Slika u slici"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Ako ne želite da <xliff:g id="NAME">%s</xliff:g> koristi ovu funkciju, dodirnite da otvorite postavke i isključite je."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Reproduciraj"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pauziraj"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Preskoči na sljedeći"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Preskoči na prethodni"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Promjena veličine"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacija možda neće funkcionirati s podijeljenim zaslonom."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacija ne podržava dijeljenje ekrana."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacija možda neće raditi na sekundarnom ekranu."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikacija ne podržava pokretanje na sekundarnim ekranima."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Razdjelnik ekrana"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Lijevo cijeli ekran"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Lijevo 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Lijevo 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Lijevo 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Desno cijeli ekran"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Gore cijeli ekran"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Gore 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Gore 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Gore 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Donji ekran kao cijeli ekran"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Korištenje načina rada jednom rukom"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Za izlaz prijeđite prstom od dna zaslona prema gore ili dodirnite bio gdje iznad aplikacije"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Pokretanje načina rada jednom rukom"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Izlaz iz načina rada jednom rukom"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Postavke za oblačiće aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Preklapanje"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Dodaj nazad u grupu"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> od aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"Obavještenje <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> i još <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Pomjeri gore lijevo"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Pomjerite gore desno"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Pomjeri dolje lijevo"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Pomjerite dolje desno"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Postavke aplikacije <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Odbaci oblačić"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nemoj prikazivati razgovor u oblačićima"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatajte koristeći oblačiće"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Novi razgovori se prikazuju kao plutajuće ikone ili oblačići. Dodirnite da otvorite oblačić. Prevucite da ga premjestite."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Upravljajte oblačićima u svakom trenutku"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Dodirnite Upravljaj da isključite oblačiće iz ove aplikacije"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Shvaćam"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Nema nedavnih oblačića"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Nedavni i odbačeni oblačići će se pojaviti ovdje"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Oblačić"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljaj"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblačić je odbačen."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-bs/strings_tv.xml b/libs/WindowManager/Shell/res/values-bs/strings_tv.xml
new file mode 100644
index 0000000..8e301b0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-bs/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Slika u slici"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program bez naslova)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Zatvori PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Cijeli ekran"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml
new file mode 100644
index 0000000..a80b7fb
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ca/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Tanca"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Desplega"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Configuració"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menú"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> està en pantalla en pantalla"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Si no vols que <xliff:g id="NAME">%s</xliff:g> utilitzi aquesta funció, toca per obrir la configuració i desactiva-la."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Reprodueix"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Posa en pausa"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Ves al següent"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Torna a l\'anterior"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Canvia la mida"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"És possible que l\'aplicació no funcioni amb la pantalla dividida."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"L\'aplicació no admet la pantalla dividida."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"És possible que l\'aplicació no funcioni en una pantalla secundària."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"L\'aplicació no es pot obrir en pantalles secundàries."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Divisor de pantalles"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Pantalla esquerra completa"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Pantalla esquerra al 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Pantalla esquerra al 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Pantalla esquerra al 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pantalla dreta completa"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Pantalla superior completa"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Pantalla superior al 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Pantalla superior al 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Pantalla superior al 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Pantalla inferior completa"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"S\'està utilitzant el mode d\'una mà"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Per sortir, llisca cap amunt des de la part inferior de la pantalla o toca qualsevol lloc a sobre de l\'aplicació"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Inicia el mode d\'una mà"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Surt del mode d\'una mà"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Configuració de les bombolles: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Menú addicional"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Torna a afegir a la pila"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de: <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>) i <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> més"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Mou a dalt a l\'esquerra"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Mou a dalt a la dreta"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Mou a baix a l\'esquerra"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Mou a baix a la dreta"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Configuració de l\'aplicació <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ignora la bombolla"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"No mostris la conversa com a bombolla"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Xateja amb bombolles"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Les converses noves es mostren com a icones flotants o bombolles. Toca per obrir una bombolla. Arrossega-la per moure-la."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Controla les bombolles en qualsevol moment"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Toca Gestiona per desactivar les bombolles d\'aquesta aplicació"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Entesos"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"No hi ha bombolles recents"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Les bombolles recents i les ignorades es mostraran aquí"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bombolla"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestiona"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"La bombolla s\'ha ignorat."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ca/strings_tv.xml b/libs/WindowManager/Shell/res/values-ca/strings_tv.xml
new file mode 100644
index 0000000..b80fc41
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ca/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Pantalla en pantalla"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programa sense títol)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Tanca PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Pantalla completa"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml
new file mode 100644
index 0000000..e8257bc
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-cs/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Zavřít"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Rozbalit"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Nastavení"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Nabídka"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"Aplikace <xliff:g id="NAME">%s</xliff:g> je v režimu obraz v obraze"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Pokud nechcete, aby aplikace <xliff:g id="NAME">%s</xliff:g> tuto funkci používala, klepnutím otevřete nastavení a funkci vypněte."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Přehrát"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pozastavit"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Přeskočit na další"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Přeskočit na předchozí"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Změnit velikost"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikace v režimu rozdělené obrazovky nemusí fungovat."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikace nepodporuje režim rozdělené obrazovky."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikace na sekundárním displeji nemusí fungovat."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikace nepodporuje spuštění na sekundárních displejích."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Čára rozdělující obrazovku"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Levá část na celou obrazovku"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70 % vlevo"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % vlevo"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30 % vlevo"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pravá část na celou obrazovku"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Horní část na celou obrazovku"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70 % nahoře"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50 % nahoře"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"30 % nahoře"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Dolní část na celou obrazovku"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Používání režimu jedné ruky"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Režim ukončíte, když přejedete prstem z dolní části obrazovky nahoru nebo klepnete kamkoli nad aplikaci"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Spustit režim jedné ruky"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Ukončit režim jedné ruky"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Nastavení bublin aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Rozbalovací nabídka"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Přidat zpět do sady"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"Oznámení <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikace <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikace <xliff:g id="APP_NAME">%2$s</xliff:g> a dalších (<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>)"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Přesunout vlevo nahoru"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Přesunout vpravo nahoru"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Přesunout vlevo dolů"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Přesunout vpravo dolů"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Nastavení <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Zavřít bublinu"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nezobrazovat konverzaci v bublinách"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatujte pomocí bublin"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nové konverzace se zobrazují jako plovoucí ikony, neboli bubliny. Klepnutím bublinu otevřete. Přetažením ji posunete."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Nastavení bublin můžete kdykoli upravit"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Bubliny pro tuto aplikaci můžete vypnout klepnutím na Spravovat"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Žádné nedávné bubliny"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Zde se budou zobrazovat nedávné bubliny a zavřené bubliny"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bublina"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Spravovat"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bublina byla zavřena."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-cs/strings_tv.xml b/libs/WindowManager/Shell/res/values-cs/strings_tv.xml
new file mode 100644
index 0000000..56abcbe
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-cs/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Obraz v obraze"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Bez názvu)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Ukončit obraz v obraze (PIP)"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Celá obrazovka"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml
new file mode 100644
index 0000000..17f8286
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-da/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Luk"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Udvid"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Indstillinger"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> vises som integreret billede"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Hvis du ikke ønsker, at <xliff:g id="NAME">%s</xliff:g> skal benytte denne funktion, kan du åbne indstillingerne og deaktivere den."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Afspil"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Sæt på pause"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Gå videre til næste"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Gå til forrige"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Rediger størrelse"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Appen fungerer muligvis ikke i opdelt skærm."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Appen understøtter ikke opdelt skærm."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Appen fungerer muligvis ikke på sekundære skærme."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Appen kan ikke åbnes på sekundære skærme."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Adskiller til opdelt skærm"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Vis venstre del i fuld skærm"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Venstre 70 %"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Venstre 50 %"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Venstre 30 %"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Vis højre del i fuld skærm"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Vis øverste del i fuld skærm"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Øverste 70 %"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Øverste 50 %"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Øverste 30 %"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Vis nederste del i fuld skærm"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Brug af enhåndstilstand"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Du kan afslutte ved at stryge opad fra bunden af skærmen eller trykke et vilkårligt sted over appen"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Start enhåndstilstand"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Afslut enhåndstilstand"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Indstillinger for <xliff:g id="APP_NAME">%1$s</xliff:g>-bobler"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Overløb"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Føj til stak igen"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g> og <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> andre"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Flyt op til venstre"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Flyt op til højre"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Flyt ned til venstre"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Flyt ned til højre"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Indstillinger for <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Afvis boble"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Vis ikke samtaler i bobler"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat ved hjælp af bobler"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nye samtaler vises som svævende ikoner eller bobler. Tryk for at åbne boblen. Træk for at flytte den."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Styr bobler når som helst"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tryk på Administrer for at deaktivere bobler fra denne app"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Ingen seneste bobler"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Nye bobler og afviste bobler vises her"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Boble"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Administrer"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Boblen blev lukket."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-da/strings_tv.xml b/libs/WindowManager/Shell/res/values-da/strings_tv.xml
new file mode 100644
index 0000000..fdb6b78
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-da/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Integreret billede"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program uden titel)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Luk integreret billede"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Fuld skærm"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml
new file mode 100644
index 0000000..4979a40
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-de/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Schließen"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Maximieren"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Einstellungen"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menü"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> ist in Bild im Bild"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Wenn du nicht möchtest, dass <xliff:g id="NAME">%s</xliff:g> diese Funktion verwendet, tippe, um die Einstellungen zu öffnen und die Funktion zu deaktivieren."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Wiedergeben"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pausieren"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Vorwärts springen"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Rückwärts springen"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Größe anpassen"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Das Teilen des Bildschirms wird in dieser App nicht unterstützt."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Die App funktioniert auf einem sekundären Display möglicherweise nicht."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Die App unterstützt den Start auf sekundären Displays nicht."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Bildschirmteiler"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Vollbild links"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70 % links"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % links"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30 % links"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Vollbild rechts"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Vollbild oben"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70 % oben"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50 % oben"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"30 % oben"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Vollbild unten"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Einstellungen für <xliff:g id="APP_NAME">%1$s</xliff:g>-Bubbles"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Mehr anzeigen"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Wieder dem Stapel hinzufügen"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> von <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> aus <xliff:g id="APP_NAME">%2$s</xliff:g> und <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> weiteren"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Nach oben links verschieben"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Nach rechts oben verschieben"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Nach unten links verschieben"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Nach unten rechts verschieben"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Einstellungen für <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Bubble schließen"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Unterhaltung nicht als Bubble anzeigen"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Bubbles zum Chatten verwenden"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Neue Unterhaltungen erscheinen als unverankerte Symbole, \"Bubbles\" genannt. Wenn du die Bubble öffnen möchtest, tippe sie an. Wenn du sie verschieben möchtest, zieh an ihr."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Bubble-Einstellungen festlegen"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tippe auf \"Verwalten\", um Bubbles für diese App zu deaktivieren"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Keine kürzlich geschlossenen Bubbles"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Hier werden aktuelle und geschlossene Bubbles angezeigt"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bubble"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Verwalten"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble verworfen."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-de/strings_tv.xml b/libs/WindowManager/Shell/res/values-de/strings_tv.xml
new file mode 100644
index 0000000..0432f1c
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-de/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Kein Sendungsname gefunden)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP schließen"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Vollbild"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml
new file mode 100644
index 0000000..cc329e8
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-el/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Κλείσιμο"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Ανάπτυξη"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Ρυθμίσεις"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Μενού"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"Η λειτουργία picture-in-picture είναι ενεργή σε <xliff:g id="NAME">%s</xliff:g>."</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Εάν δεν θέλετε να χρησιμοποιείται αυτή η λειτουργία από την εφαρμογή <xliff:g id="NAME">%s</xliff:g>, πατήστε για να ανοίξετε τις ρυθμίσεις και απενεργοποιήστε την."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Αναπαραγωγή"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Παύση"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Μετάβαση στο επόμενο"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Μετάβαση στο προηγούμενο"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Αλλαγή μεγέθους"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Η εφαρμογή ενδέχεται να μην λειτουργεί με διαχωρισμό οθόνης."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Η εφαρμογή δεν υποστηρίζει διαχωρισμό οθόνης."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Η εφαρμογή ίσως να μην λειτουργήσει σε δευτερεύουσα οθόνη."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Η εφαρμογή δεν υποστηρίζει την εκκίνηση σε δευτερεύουσες οθόνες."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Διαχωριστικό οθόνης"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Αριστερή πλήρης οθόνη"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Αριστερή 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Αριστερή 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Αριστερή 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Δεξιά πλήρης οθόνη"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Πάνω πλήρης οθόνη"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Πάνω 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Πάνω 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Πάνω 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Κάτω πλήρης οθόνη"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Χρήση λειτουργίας ενός χεριού"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Για έξοδο, σύρετε προς τα πάνω από το κάτω μέρος της οθόνης ή πατήστε οπουδήποτε πάνω από την εφαρμογή."</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Έναρξη λειτουργίας ενός χεριού"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"\'Έξοδος από τη λειτουργία ενός χεριού"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Ρυθμίσεις για συννεφάκια <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Υπερχείλιση"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Προσθήκη ξανά στη στοίβα"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> από <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> από την εφαρμογή <xliff:g id="APP_NAME">%2$s</xliff:g> και <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ακόμη"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Μετακίνηση επάνω αριστερά"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Μετακίνηση επάνω δεξιά"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Μετακίνηση κάτω αριστερά"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Μετακίνηση κάτω δεξιά"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Ρυθμίσεις <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Παράβλ. για συννεφ."</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Να μην γίνει προβολή της συζήτησης σε συννεφάκια."</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Συζητήστε χρησιμοποιώντας συννεφάκια."</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Οι νέες συζητήσεις εμφανίζονται ως κινούμενα εικονίδια ή συννεφάκια. Πατήστε για να ανοίξετε το συννεφάκι. Σύρετε για να το μετακινήσετε."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Ελέγξτε τα συννεφάκια ανά πάσα στιγμή."</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Πατήστε Διαχείριση για να απενεργοποιήσετε τα συννεφάκια από αυτήν την εφαρμογή."</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Το κατάλαβα"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Δεν υπάρχουν πρόσφατα συννεφάκια"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Τα πρόσφατα συννεφάκια και τα συννεφάκια που παραβλέψατε θα εμφανίζονται εδώ."</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Συννεφάκι"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Διαχείριση"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Το συννεφάκι παραβλέφθηκε."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-el/strings_tv.xml b/libs/WindowManager/Shell/res/values-el/strings_tv.xml
new file mode 100644
index 0000000..880ea37
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-el/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-Picture"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Δεν υπάρχει τίτλος προγράμματος)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Κλείσιμο PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Πλήρης οθόνη"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..90c71c0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Close"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Expand"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Settings"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> is in picture-in-picture"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"If you don\'t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Play"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pause"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Skip to next"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Skip to previous"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Resize"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"App may not work with split-screen."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"App does not support split-screen."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"App may not work on a secondary display."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"App does not support launch on secondary displays."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Split screen divider"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Left full screen"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Left 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Left 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Right full screen"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Top full screen"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Top 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Top 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Top 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Bottom full screen"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Using one-handed mode"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"To exit, swipe up from the bottom of the screen or tap anywhere above the app"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Start one-handed mode"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Exit one-handed mode"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Overflow"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Add back to stack"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Move top left"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Move top right"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Move bottom left"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Move bottom right"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> settings"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Dismiss bubble"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Don’t bubble conversation"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat using bubbles"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"New conversations appear as floating icons, or bubbles. Tap to open bubble. Drag to move it."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Control bubbles at any time"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tap Manage to turn off bubbles from this app"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"No recent bubbles"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Recent bubbles and dismissed bubbles will appear here"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bubble"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings_tv.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings_tv.xml
new file mode 100644
index 0000000..e3f08c8
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-en-rAU/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-picture"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(No title program)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Close PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Full screen"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..90c71c0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Close"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Expand"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Settings"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> is in picture-in-picture"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"If you don\'t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Play"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pause"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Skip to next"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Skip to previous"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Resize"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"App may not work with split-screen."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"App does not support split-screen."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"App may not work on a secondary display."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"App does not support launch on secondary displays."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Split screen divider"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Left full screen"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Left 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Left 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Right full screen"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Top full screen"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Top 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Top 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Top 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Bottom full screen"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Using one-handed mode"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"To exit, swipe up from the bottom of the screen or tap anywhere above the app"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Start one-handed mode"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Exit one-handed mode"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Overflow"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Add back to stack"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Move top left"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Move top right"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Move bottom left"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Move bottom right"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> settings"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Dismiss bubble"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Don’t bubble conversation"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat using bubbles"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"New conversations appear as floating icons, or bubbles. Tap to open bubble. Drag to move it."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Control bubbles at any time"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tap Manage to turn off bubbles from this app"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"No recent bubbles"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Recent bubbles and dismissed bubbles will appear here"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bubble"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rCA/strings_tv.xml b/libs/WindowManager/Shell/res/values-en-rCA/strings_tv.xml
new file mode 100644
index 0000000..e3f08c8
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-en-rCA/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-picture"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(No title program)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Close PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Full screen"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..90c71c0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Close"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Expand"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Settings"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> is in picture-in-picture"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"If you don\'t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Play"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pause"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Skip to next"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Skip to previous"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Resize"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"App may not work with split-screen."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"App does not support split-screen."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"App may not work on a secondary display."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"App does not support launch on secondary displays."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Split screen divider"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Left full screen"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Left 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Left 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Right full screen"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Top full screen"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Top 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Top 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Top 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Bottom full screen"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Using one-handed mode"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"To exit, swipe up from the bottom of the screen or tap anywhere above the app"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Start one-handed mode"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Exit one-handed mode"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Overflow"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Add back to stack"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Move top left"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Move top right"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Move bottom left"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Move bottom right"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> settings"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Dismiss bubble"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Don’t bubble conversation"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat using bubbles"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"New conversations appear as floating icons, or bubbles. Tap to open bubble. Drag to move it."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Control bubbles at any time"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tap Manage to turn off bubbles from this app"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"No recent bubbles"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Recent bubbles and dismissed bubbles will appear here"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bubble"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings_tv.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings_tv.xml
new file mode 100644
index 0000000..e3f08c8
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-en-rGB/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-picture"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(No title program)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Close PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Full screen"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..90c71c0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Close"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Expand"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Settings"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> is in picture-in-picture"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"If you don\'t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Play"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pause"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Skip to next"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Skip to previous"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Resize"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"App may not work with split-screen."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"App does not support split-screen."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"App may not work on a secondary display."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"App does not support launch on secondary displays."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Split screen divider"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Left full screen"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Left 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Left 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Right full screen"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Top full screen"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Top 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Top 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Top 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Bottom full screen"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Using one-handed mode"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"To exit, swipe up from the bottom of the screen or tap anywhere above the app"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Start one-handed mode"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Exit one-handed mode"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Overflow"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Add back to stack"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Move top left"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Move top right"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Move bottom left"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Move bottom right"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> settings"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Dismiss bubble"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Don’t bubble conversation"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat using bubbles"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"New conversations appear as floating icons, or bubbles. Tap to open bubble. Drag to move it."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Control bubbles at any time"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tap Manage to turn off bubbles from this app"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"No recent bubbles"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Recent bubbles and dismissed bubbles will appear here"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bubble"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings_tv.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings_tv.xml
new file mode 100644
index 0000000..e3f08c8
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-en-rIN/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-picture"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(No title program)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Close PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Full screen"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..d8b5b400
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‏‎‎‎‎‎‎‎‏‎‎‎‏‏‎‎‎‎‏‎‏‎‎‎‏‎‎‏‎‏‎‎‎‏‎‏‎‏‏‎‎‎‏‏‎‏‎‏‏‎‏‎Close‎‏‎‎‏‎"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‎‎‏‎‏‏‎‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‎‎‎Expand‎‏‎‎‏‎"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‎Settings‎‏‎‎‏‎"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‏‎‎‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎‎‎‎Menu‎‏‎‎‏‎"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‏‎‎‎‏‏‏‏‎‎‎‎‎‏‎‎‏‏‏‎‎‏‏‎‎‏‏‏‎‎‏‎‎‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="NAME">%s</xliff:g>‎‏‎‎‏‏‏‎ is in picture-in-picture‎‏‎‎‏‎"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‏‏‏‎‎‎‎‏‏‏‏‎‎‏‎‏‏‎‎‎‏‏‏‎‎‎If you don\'t want ‎‏‎‎‏‏‎<xliff:g id="NAME">%s</xliff:g>‎‏‎‎‏‏‏‎ to use this feature, tap to open settings and turn it off.‎‏‎‎‏‎"</string>
+    <string name="pip_play" msgid="3496151081459417097">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎Play‎‏‎‎‏‎"</string>
+    <string name="pip_pause" msgid="690688849510295232">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎‎‏‎‏‏‎‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎Pause‎‏‎‎‏‎"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‏‎‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‎‏‎Skip to next‎‏‎‎‏‎"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎‏‎‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎Skip to previous‎‏‎‎‏‎"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎‎Resize‎‏‎‎‏‎"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‏‎‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎App may not work with split-screen.‎‏‎‎‏‎"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‎‏‏‏‎‎‏‎‏‎‏‏‎‎‏‏‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‏‎App does not support split-screen.‎‏‎‎‏‎"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‏‎‏‏‏‏‎‏‏‏‎‏‏‎‏‏‎‎‎‏‎‎‏‎‎‏‎‎‏‏‏‏‎App may not work on a secondary display.‎‏‎‎‏‎"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‏‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‏‎‏‏‎‎‏‎App does not support launch on secondary displays.‎‏‎‎‏‎"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‏‎‎‏‎‎‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‏‏‏‎Split-screen divider‎‏‎‎‏‎"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‎‎‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‏‏‎‎‏‏‎‎‎‎Left full screen‎‏‎‎‏‎"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‏‎‎‏‎‏‎‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‏‏‎‎‏‏‎‎‏‎‎Left 70%‎‏‎‎‏‎"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‏‎‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‎‏‏‎‎‏‎Left 50%‎‏‎‎‏‎"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‎‎‎‎‎‏‎‏‎‏‎‏‎‎‏‏‎‎‎‎‏‏‎‏‎‏‎‏‏‎‏‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‏‏‎Left 30%‎‏‎‎‏‎"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‏‎‎‎‏‎‏‏‎‎‏‎‎‏‎‎‎‏‏‏‎Right full screen‎‏‎‎‏‎"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‎‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‎‎Top full screen‎‏‎‎‏‎"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‎‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‎‎‏‏‎‎‏‏‎‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎Top 70%‎‏‎‎‏‎"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎‏‏‎‏‎‏‎‎‎‏‏‏‎‎‏‎‎Top 50%‎‏‎‎‏‎"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‏‎‏‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎Top 30%‎‏‎‎‏‎"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‎‏‏‎‏‎‎‎‏‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‎‏‏‏‏‎‎‏‏‎‎‎Bottom full screen‎‏‎‎‏‎"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‏‎‎‎‎‏‎‎‎‎‎‏‎‎‎‎‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‎‏‏‏‎‎Using one-handed mode‎‏‎‎‏‎"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‎‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‎‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‎‎‎‏‏‏‎‏‎‏‏‎To exit, swipe up from the bottom of the screen or tap anywhere above the app‎‏‎‎‏‎"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‏‎‏‏‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‎‏‏‏‏‎‎‏‎‎Start one-handed mode‎‏‎‎‏‎"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‏‏‎‏‎‎‎‏‏‏‎‏‎‏‏‎‎‎‎‏‎‎‎‎‏‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎Exit one-handed mode‎‏‎‎‏‎"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‎‎‏‎‎‎‎‏‎‏‏‏‏‎‎‎‏‏‎‎‎‎‎Settings for ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ bubbles‎‏‎‎‏‎"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‎‎‏‏‎‎‏‏‎‏‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎Overflow‎‏‎‎‏‎"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‎‏‏‏‎‏‏‏‎‏‎‏‏‎‎‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‎‏‎Add back to stack‎‏‎‎‏‎"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>‎‏‎‎‏‏‏‎ from ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‎‎‎‏‎‎‏‎‎‏‎‏‏‎‏‎‏‎‏‎‏‎‏‎‎‎‎‏‎‏‎‎‏‏‎‎‏‏‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>‎‏‎‎‏‏‏‎ from ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ and ‎‏‎‎‏‏‎<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>‎‏‎‎‏‏‏‎ more‎‏‎‎‏‎"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‏‏‎‎‎‏‏‏‎‎‏‏‎‎‎‎‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‎‏‎‏‎‎‏‏‎‏‎‏‎‎‏‏‎‎Move top left‎‏‎‎‏‎"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‏‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‏‎‏‎Move top right‎‏‎‎‏‎"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‎‏‎‎‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‎‎Move bottom left‎‏‎‎‏‎"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎Move bottom right‎‏‎‎‏‎"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‏‏‎‏‎‏‎‏‎‏‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>‎‏‎‎‏‏‏‎ settings‎‏‎‎‏‎"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‎‏‎‏‏‎‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‎Dismiss bubble‎‏‎‎‏‎"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‏‎‏‎‏‎‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‎‎‎‎‏‎‎‏‎‎‏‏‎‏‎‏‎Don’t bubble conversation‎‏‎‎‏‎"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎Chat using bubbles‎‏‎‎‏‎"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‎‎‎‎‎‏‎‏‎‏‎‏‎‎‎‎‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‎‎‎‏‎‎‏‎‏‎‏‏‏‏‎New conversations appear as floating icons, or bubbles. Tap to open bubble. Drag to move it.‎‏‎‎‏‎"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‏‏‎‎‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‎‏‏‎‏‎‏‏‎‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‎Control bubbles anytime‎‏‎‎‏‎"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‎‎‏‎‎‎‏‎‏‏‎‎‎‎‏‎‏‏‎‎‏‏‏‎‎Tap Manage to turn off bubbles from this app‎‏‎‎‏‎"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎Got it‎‏‎‎‏‎"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‏‎‎‏‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‎‎‎‎‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‎No recent bubbles‎‏‎‎‏‎"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‏‏‎‏‏‎‎‏‏‏‎‏‏‎‏‎‏‎‏‏‏‎‏‎‎‏‏‏‎‏‏‎‏‎‎‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎Recent bubbles and dismissed bubbles will appear here‎‏‎‎‏‎"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‏‏‎‏‏‎‏‏‎‎‎‏‏‏‏‏‎‎‎‎‏‎‎Bubble‎‏‎‎‏‎"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‎‏‎‏‏‎‎‎‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‎‎‏‎‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‏‏‎Manage‎‏‎‎‏‎"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‏‏‏‏‏‎‏‎Bubble dismissed.‎‏‎‎‏‎"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rXC/strings_tv.xml b/libs/WindowManager/Shell/res/values-en-rXC/strings_tv.xml
new file mode 100644
index 0000000..3f9ef0e
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-en-rXC/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‏‎‎‎‎‎‏‏‎‎‏‏‎‎‎‎‏‎‎‎‎‎‎‎‏‏‎Picture-in-Picture‎‏‎‎‏‎"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‏‎‎‏‏‏‎‎‏‎‏‎‎‎‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎‏‏‏‎(No title program)‎‏‎‎‏‎"</string>
+    <string name="pip_close" msgid="9135220303720555525">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‏‎‏‎‎‏‎‎‏‏‏‎‏‏‏‎‎‏‏‏‏‎‎‎‎‏‏‎‎‏‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎Close PIP‎‏‎‎‏‎"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‎‎‎‏‏‎‏‎‎‎‏‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎‏‎‏‎‎‏‎‎‎‎‎‎‎‏‎‎‏‏‎‎‏‏‎‏‎‎Full screen‎‏‎‎‏‎"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..7244b1a
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Cerrar"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Expandir"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Configuración"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menú"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> está en modo de Pantalla en pantalla"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> use esta función, presiona para abrir la configuración y desactivarla."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Reproducir"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pausar"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Siguiente"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Anterior"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Cambiar el tamaño"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Es posible que la app no funcione en el modo de pantalla dividida."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"La app no es compatible con la función de pantalla dividida."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Es posible que la app no funcione en una pantalla secundaria."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"La app no puede iniciarse en pantallas secundarias."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Divisor de pantalla dividida"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Pantalla izquierda completa"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Izquierda: 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Izquierda: 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Izquierda: 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pantalla derecha completa"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Pantalla superior completa"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Superior: 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Superior: 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Superior: 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Pantalla inferior completa"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Cómo usar el modo de una mano"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para salir, desliza el dedo hacia arriba desde la parte inferior de la pantalla o presiona cualquier parte arriba de la app"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar el modo de una mano"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Salir del modo de una mano"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Configuración para burbujas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Menú ampliado"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Volver a agregar a la pila"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> y <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> más"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Ubicar arriba a la izquierda"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Ubicar arriba a la derecha"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Ubicar abajo a la izquierda"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Ubicar abajo a la derecha"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Configuración de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Descartar burbuja"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"No mostrar la conversación en burbujas"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat con burbujas"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Las conversaciones nuevas aparecen como elementos flotantes o burbujas. Presiona para abrir la burbuja. Arrástrala para moverla."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Controla las burbujas"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Presiona Administrar para desactivar las burbujas de esta app"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Entendido"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"No hay burbujas recientes"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Las burbujas recientes y las que se descartaron aparecerán aquí"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Cuadro"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Administrar"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Se descartó el cuadro."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings_tv.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings_tv.xml
new file mode 100644
index 0000000..5d5954a
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-es-rUS/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Pantalla en pantalla"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Sin título de programa)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Cerrar PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Pantalla completa"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml
new file mode 100644
index 0000000..360542e
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-es/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Cerrar"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Mostrar"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Ajustes"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menú"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> está en imagen en imagen"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca la notificación para abrir los ajustes y desactivarla."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Reproducir"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pausar"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Saltar al siguiente"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Volver al anterior"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Cambiar tamaño"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Es posible que la aplicación no funcione con la pantalla dividida."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"La aplicación no admite la pantalla dividida."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Es posible que la aplicación no funcione en una pantalla secundaria."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"La aplicación no se puede abrir en pantallas secundarias."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Dividir la pantalla"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Pantalla izquierda completa"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Izquierda 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Izquierda 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Izquierda 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pantalla derecha completa"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Pantalla superior completa"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Superior 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Superior 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Superior 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Pantalla inferior completa"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Utilizar modo una mano"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para salir, desliza dos dedos hacia arriba desde la parte inferior de la pantalla o toca cualquier zona que haya encima de la aplicación"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar modo una mano"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Abandonar modo una mano"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Ajustes de las burbujas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Menú adicional"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Volver a añadir a la pila"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> y <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> más"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Mover arriba a la izquierda"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Mover arriba a la derecha"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Mover abajo a la izquierda."</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Mover abajo a la derecha"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Ajustes de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Cerrar burbuja"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"No mostrar conversación en burbuja"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatea con burbujas"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Las conversaciones nuevas aparecen como iconos flotantes llamadas \"burbujas\". Toca para abrir la burbuja. Arrastra para moverla."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Controla las burbujas"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Toca Gestionar para desactivar las burbujas de esta aplicación"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Entendido"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"No hay burbujas recientes"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Las burbujas recientes y las cerradas aparecerán aquí"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Burbuja"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestionar"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Burbuja cerrada."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-es/strings_tv.xml b/libs/WindowManager/Shell/res/values-es/strings_tv.xml
new file mode 100644
index 0000000..d31b9b4
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-es/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Imagen en imagen"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programa sin título)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Cerrar PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Pantalla completa"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml
new file mode 100644
index 0000000..0ccfcfe
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-et/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Sule"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Laiendamine"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Seaded"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menüü"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> on režiimis Pilt pildis"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Kui te ei soovi, et rakendus <xliff:g id="NAME">%s</xliff:g> seda funktsiooni kasutaks, puudutage seadete avamiseks ja lülitage see välja."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Esita"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Peata"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Järgmise juurde"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Eelmise juurde"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Suuruse muutmine"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Rakendus ei pruugi poolitatud ekraaniga töötada."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Rakendus ei toeta jagatud ekraani."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Rakendus ei pruugi teisesel ekraanil töötada."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Rakendus ei toeta teisestel ekraanidel käivitamist."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Ekraanijagaja"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Vasak täisekraan"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Vasak: 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vasak: 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Vasak: 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Parem täisekraan"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Ülemine täisekraan"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Ülemine: 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Ülemine: 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Ülemine: 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Alumine täisekraan"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Ühekäerežiimi kasutamine"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Väljumiseks pühkige ekraani alaosast üles või puudutage rakenduse kohal olevat ala"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Ühekäerežiimi käivitamine"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Ühekäerežiimist väljumine"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> mullide seaded"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Ületäide"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Lisa tagasi virna"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> rakendusest <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> rakenduselt <xliff:g id="APP_NAME">%2$s</xliff:g> ja veel <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Teisalda üles vasakule"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Teisalda üles paremale"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Teisalda alla vasakule"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Teisalda alla paremale"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Rakenduse <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> seaded"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Sule mull"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ära kuva vestlust mullina"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Vestelge mullide abil"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Uued vestlused kuvatakse hõljuvate ikoonidena ehk mullidena. Puudutage mulli avamiseks. Lohistage mulli, et seda liigutada."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Juhtige mulle igal ajal"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Selle rakenduse puhul mullide väljalülitamiseks puudutage valikut Halda"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Selge"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Hiljutisi mulle pole"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Siin kuvatakse hiljutised ja suletud mullid."</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Mull"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Halda"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Mullist loobuti."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-et/strings_tv.xml b/libs/WindowManager/Shell/res/values-et/strings_tv.xml
new file mode 100644
index 0000000..bc7a6ad
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-et/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Pilt pildis"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programmi pealkiri puudub)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Sule PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Täisekraan"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml
new file mode 100644
index 0000000..6682ea8
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-eu/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Itxi"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Zabaldu"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Ezarpenak"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menua"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"Pantaila txiki gainjarrian dago <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Ez baduzu nahi <xliff:g id="NAME">%s</xliff:g> zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Erreproduzitu"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pausatu"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Saltatu hurrengora"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Saltatu aurrekora"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Aldatu tamaina"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Baliteke aplikazioak ez funtzionatzea pantaila zatituan."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikazioak ez du onartzen pantaila zatitua"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Baliteke aplikazioak ez funtzionatzea bigarren mailako pantailetan."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikazioa ezin da abiarazi bigarren mailako pantailatan."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Pantaila-zatitzailea"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ezarri ezkerraldea pantaila osoan"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Ezarri ezkerraldea % 70en"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ezarri ezkerraldea % 50en"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ezarri ezkerraldea % 30en"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Ezarri eskuinaldea pantaila osoan"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Ezarri goialdea pantaila osoan"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Ezarri goialdea % 70en"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Ezarri goialdea % 50en"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Ezarri goialdea % 30en"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Ezarri behealdea pantaila osoan"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Esku bakarreko modua erabiltzea"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Irteteko, pasatu hatza pantailaren behealdetik gora edo sakatu aplikazioaren gainaldea"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Abiarazi esku bakarreko modua"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Irten esku bakarreko modutik"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren ezarpenen burbuilak"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Gainezkatzea"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Gehitu berriro errenkadan"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>)"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> aplikazioaren \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\" jakinarazpena, eta beste <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Eraman goialdera, ezkerretara"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Eraman goialdera, eskuinetara"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Eraman behealdera, ezkerretara"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Eraman behealdera, eskuinetara"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> aplikazioaren ezarpenak"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Baztertu burbuila"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ez erakutsi elkarrizketak burbuila gisa"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Txateatu burbuilen bidez"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Elkarrizketa berriak ikono gainerakor edo burbuila gisa agertzen dira. Sakatu burbuila irekitzeko. Arrasta ezazu mugitzeko."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Kontrolatu burbuilak edonoiz"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Aplikazioaren burbuilak desaktibatzeko, sakatu Kudeatu"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Ados"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Ez dago azkenaldiko burbuilarik"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Azken burbuilak eta baztertutakoak agertuko dira hemen"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Burbuila"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Kudeatu"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Baztertu da globoa."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-eu/strings_tv.xml b/libs/WindowManager/Shell/res/values-eu/strings_tv.xml
new file mode 100644
index 0000000..cf5f988
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-eu/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Pantaila txiki gainjarria"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programa izengabea)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Itxi PIPa"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Pantaila osoa"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml
new file mode 100644
index 0000000..a41811d
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-fa/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"بستن"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"بزرگ کردن"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"تنظیمات"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"منو"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> درحالت تصویر در تصویر است"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"اگر نمی‌خواهید <xliff:g id="NAME">%s</xliff:g> از این قابلیت استفاده کند، با ضربه زدن، تنظیمات را باز کنید و آن را خاموش کنید."</string>
+    <string name="pip_play" msgid="3496151081459417097">"پخش"</string>
+    <string name="pip_pause" msgid="690688849510295232">"توقف موقت"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"رد شدن به بعدی"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"رد شدن به قبلی"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"تغییر اندازه"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"ممکن است برنامه با «صفحهٔ دونیمه» کار نکند."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"برنامه از تقسیم صفحه پشتیبانی نمی‌کند."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ممکن است برنامه در نمایشگر ثانویه کار نکند."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"برنامه از راه‌اندازی در نمایشگرهای ثانویه پشتیبانی نمی‌کند."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"تقسیم‌کننده صفحه"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"تمام‌صفحه چپ"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"٪۷۰ چپ"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"٪۵۰ چپ"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"٪۳۰ چپ"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"تمام‌صفحه راست"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"تمام‌صفحه بالا"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"٪۷۰ بالا"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"٪۵۰ بالا"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"٪۳۰ بالا"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"تمام‌صفحه پایین"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"استفاده از «حالت تک حرکت»"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"برای خارج شدن، از پایین صفحه‌نمایش تند به‌طرف بالا بکشید یا در هر جایی از بالای برنامه که می‌خواهید ضربه بزنید"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"آغاز «حالت تک حرکت»"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"خروج از «حالت تک حرکت»"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"تنظیمات برای حبابک‌های <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"لبریزشده"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"افزودن برگشت به پشته"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> از <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> از <xliff:g id="APP_NAME">%2$s</xliff:g> و <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> مورد بیشتر"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"انتقال به بالا سمت راست"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"انتقال به بالا سمت چپ"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"انتقال به پایین سمت راست"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"انتقال به پایین سمت چپ"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"تنظیمات <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"رد کردن حبابک"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"مکالمه در حباب نشان داده نشود"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"گپ بااستفاده از حبابک‌ها"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"مکالمه‌های جدید به‌صورت نمادهای شناور یا حبابک‌ها نشان داده می‌شوند. برای باز کردن حبابک‌ها ضربه بزنید. برای جابه‌جایی، آن را بکشید."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"کنترل حبابک‌ها در هرزمانی"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"برای خاموش کردن «حبابک‌ها» از این برنامه، روی «مدیریت» ضربه بزنید"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"متوجه‌ام"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"هیچ حبابک جدیدی وجود ندارد"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"حبابک‌ها اخیر و حبابک‌ها ردشده اینجا ظاهر خواهند شد"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"حباب"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"مدیریت"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"حبابک رد شد."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-fa/strings_tv.xml b/libs/WindowManager/Shell/res/values-fa/strings_tv.xml
new file mode 100644
index 0000000..5b815b4
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-fa/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"تصویر در تصویر"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(برنامه بدون عنوان)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"‏بستن PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"تمام صفحه"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml
new file mode 100644
index 0000000..fcdc70f
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-fi/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Sulje"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Laajenna"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Asetukset"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Valikko"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> on kuva kuvassa ‑tilassa"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Jos et halua, että <xliff:g id="NAME">%s</xliff:g> voi käyttää tätä ominaisuutta, avaa asetukset napauttamalla ja poista se käytöstä."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Toista"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Keskeytä"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Siirry seuraavaan"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Siirry edelliseen"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Muuta kokoa"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Sovellus ei ehkä toimi jaetulla näytöllä."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Sovellus ei tue jaetun näytön tilaa."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Sovellus ei ehkä toimi toissijaisella näytöllä."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Sovellus ei tue käynnistämistä toissijaisilla näytöillä."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Näytön jakaja"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Vasen koko näytölle"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Vasen 70 %"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vasen 50 %"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Vasen 30 %"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Oikea koko näytölle"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Yläosa koko näytölle"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Yläosa 70 %"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Yläosa 50 %"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Yläosa 30 %"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Alaosa koko näytölle"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Yhden käden moodin käyttö"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Poistu pyyhkäisemällä ylös näytön alareunasta tai napauttamalla sovelluksen yllä"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Käynnistä yhden käden moodi"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Poistu yhden käden moodista"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Kuplien asetukset: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Ylivuoto"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Lisää takaisin pinoon"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g>: <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>) ja <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> muuta"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Siirrä vasempaan yläreunaan"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Siirrä oikeaan yläreunaan"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Siirrä vasempaan alareunaan"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Siirrä oikeaan alareunaan"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>: asetukset"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ohita kupla"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Älä näytä kuplia keskusteluista"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chattaile kuplien avulla"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Uudet keskustelut näkyvät kelluvina kuvakkeina tai kuplina. Avaa kupla napauttamalla. Siirrä sitä vetämällä."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Muuta kuplien asetuksia milloin tahansa"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Valitse Ylläpidä, jos haluat poistaa kuplat käytöstä tästä sovelluksesta"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Okei"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Ei viimeaikaisia kuplia"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Viimeaikaiset ja äskettäin ohitetut kuplat näkyvät täällä"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Kupla"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Ylläpidä"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Kupla ohitettu."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-fi/strings_tv.xml b/libs/WindowManager/Shell/res/values-fi/strings_tv.xml
new file mode 100644
index 0000000..77ad6ee
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-fi/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Kuva kuvassa"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Nimetön)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Sulje PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Koko näyttö"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..ed82237
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Fermer"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Développer"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Paramètres"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> est en mode d\'incrustation d\'image"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Si vous ne voulez pas que <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, touchez l\'écran pour ouvrir les paramètres, puis désactivez-la."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Lire"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Interrompre"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Passer au suivant"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Revenir au précédent"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Redimensionner"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Il est possible que l\'application ne fonctionne pas en mode Écran partagé."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"L\'application n\'est pas compatible avec l\'écran partagé."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Il est possible que l\'application ne fonctionne pas sur un écran secondaire."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"L\'application ne peut pas être lancée sur des écrans secondaires."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Séparateur d\'écran partagé"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Plein écran à la gauche"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70 % à la gauche"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % à la gauche"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30 % à la gauche"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Plein écran à la droite"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Plein écran dans le haut"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70 % dans le haut"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50 % dans le haut"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"30 % dans le haut"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Plein écran dans le bas"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Utiliser le mode Une main"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Pour quitter, balayez l\'écran du bas vers le haut, ou touchez n\'importe où sur l\'écran en haut de l\'application"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Démarrer le mode Une main"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Quitter le mode Une main"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Paramètres pour les bulles de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Menu déroulant"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Replacer sur la pile"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> et <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> autres"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Déplacer dans coin sup. gauche"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Déplacer dans coin sup. droit"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Déplacer dans coin inf. gauche"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Déplacer dans coin inf. droit"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Paramètres <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ignorer la bulle"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ne pas afficher les conversations dans des bulles"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Clavarder en utilisant des bulles"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Les nouvelles conversations s\'affichent sous forme d\'icônes flottantes (de bulles). Touchez une bulle pour l\'ouvrir. Faites-la glisser pour la déplacer."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Paramètres des bulles"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Toucher Gérer pour désactiver les bulles de cette application"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Aucune bulle récente"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Les bulles récentes et les bulles ignorées s\'afficheront ici"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bulle"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Gérer"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bulle ignorée."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings_tv.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings_tv.xml
new file mode 100644
index 0000000..0ec7f40
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Incrustation d\'image"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Aucun programme de titre)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Fermer mode IDI"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Plein écran"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml
new file mode 100644
index 0000000..ad98b85
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-fr/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Fermer"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Développer"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Paramètres"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> est en mode Picture-in-picture"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Si vous ne voulez pas que l\'application <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, appuyez ici pour ouvrir les paramètres et la désactiver."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Lecture"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Suspendre"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Passer au contenu suivant"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Passer au contenu précédent"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Redimensionner"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Il est possible que l\'application ne fonctionne pas en mode Écran partagé."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Application incompatible avec l\'écran partagé."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Il est possible que l\'application ne fonctionne pas sur un écran secondaire."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"L\'application ne peut pas être lancée sur des écrans secondaires."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Séparateur d\'écran partagé"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Écran de gauche en plein écran"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Écran de gauche à 70 %"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Écran de gauche à 50 %"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Écran de gauche à 30 %"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Écran de droite en plein écran"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Écran du haut en plein écran"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Écran du haut à 70 %"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Écran du haut à 50 %"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Écran du haut à 30 %"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Écran du bas en plein écran"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Utiliser le mode une main"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Pour quitter, balayez l\'écran de bas en haut ou appuyez n\'importe où au-dessus de l\'application"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Démarrer le mode une main"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Quitter le mode une main"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Paramètres des bulles de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Dépassement"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Ajouter à nouveau l\'élément à la pile"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de l\'application <xliff:g id="APP_NAME">%2$s</xliff:g> et <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> autres"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Déplacer en haut à gauche"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Déplacer en haut à droite"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Déplacer en bas à gauche"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Déplacer en bas à droite"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Paramètres <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Fermer la bulle"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ne pas afficher la conversation dans une bulle"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatter en utilisant des bulles"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Les nouvelles conversations s\'affichent sous forme d\'icônes flottantes ou bulles. Appuyez sur la bulle pour l\'ouvrir. Faites-la glisser pour la déplacer."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Contrôler les paramètres des bulles"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Appuyez sur \"Gérer\" pour désactiver les bulles de cette application"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Aucune bulle récente"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Les bulles récentes et ignorées s\'afficheront ici"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bulle"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Gérer"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bulle fermée."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-fr/strings_tv.xml b/libs/WindowManager/Shell/res/values-fr/strings_tv.xml
new file mode 100644
index 0000000..27fd155
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-fr/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-picture"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programme sans titre)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Fermer mode PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Plein écran"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml
new file mode 100644
index 0000000..057881b
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-gl/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Pechar"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Despregar"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Configuración"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menú"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> está na pantalla superposta"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Se non queres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca a configuración para abrir as opcións e desactivar a función."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Reproducir"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pausar"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Ir ao seguinte"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Ir ao anterior"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Cambiar tamaño"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"A aplicación non é compatible coa función de pantalla dividida."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"É posible que a aplicación non funcione nunha pantalla secundaria."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"A aplicación non se pode iniciar en pantallas secundarias."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Divisor de pantalla dividida"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Pantalla completa á esquerda"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70 % á esquerda"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % á esquerda"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30 % á esquerda"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pantalla completa á dereita"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Pantalla completa arriba"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70 % arriba"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50 % arriba"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"30 % arriba"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Pantalla completa abaixo"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Configuración das burbullas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Mostrar menú adicional"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Engadir de novo á pilla"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> e <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> máis"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Mover á parte super. esquerda"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Mover á parte superior dereita"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Mover á parte infer. esquerda"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Mover á parte inferior dereita"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Configuración de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ignorar burbulla"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Non mostrar a conversa como burbulla"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatear usando burbullas"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"As conversas novas aparecen como iconas flotantes ou burbullas. Toca para abrir a burbulla e arrastra para movela."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Controla as burbullas"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Para desactivar as burbullas nesta aplicación, toca Xestionar"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Non hai burbullas recentes"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"As burbullas recentes e ignoradas aparecerán aquí."</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Burbulla"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Xestionar"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Ignorouse a burbulla."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-gl/strings_tv.xml b/libs/WindowManager/Shell/res/values-gl/strings_tv.xml
new file mode 100644
index 0000000..a896d88
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-gl/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programa sen título)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Pechar PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Pantalla completa"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml
new file mode 100644
index 0000000..d9950aa
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-gu/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"બંધ કરો"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"વિસ્તૃત કરો"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"સેટિંગ"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"મેનૂ"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> ચિત્રમાં-ચિત્રની અંદર છે"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"જો તમે નથી ઇચ્છતા કે <xliff:g id="NAME">%s</xliff:g> આ સુવિધાનો ઉપયોગ કરે, તો સેટિંગ ખોલવા માટે ટૅપ કરો અને તેને બંધ કરો."</string>
+    <string name="pip_play" msgid="3496151081459417097">"ચલાવો"</string>
+    <string name="pip_pause" msgid="690688849510295232">"થોભાવો"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"આગલા પર જાઓ"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"પહેલાંના પર જાઓ"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"કદ બદલો"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ઍપ્લિકેશન સ્ક્રીન-વિભાજનનું સમર્થન કરતી નથી."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ઍપ્લિકેશન ગૌણ ડિસ્પ્લે પર કદાચ કામ ન કરે."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ઍપ્લિકેશન ગૌણ ડિસ્પ્લે પર લૉન્ચનું સમર્થન કરતી નથી."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"સ્પ્લિટ-સ્ક્રીન વિભાજક"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ડાબી પૂર્ણ સ્ક્રીન"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ડાબે 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ડાબે 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ડાબે 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"જમણી સ્ક્રીન સ્ક્રીન"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"શીર્ષ પૂર્ણ સ્ક્રીન"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"શીર્ષ 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"શીર્ષ 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"શીર્ષ 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"તળિયાની પૂર્ણ સ્ક્રીન"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> બબલ માટેનાં સેટિંગ"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ઓવરફ્લો"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"સ્ટૅકમાં ફરી ઉમેરો"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> તરફથી <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> અને વધુ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> તરફથી <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"ઉપર ડાબે ખસેડો"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"ઉપર જમણે ખસેડો"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"નીચે ડાબે ખસેડો"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"નીચે જમણે ખસેડો"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> સેટિંગ"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"બબલને છોડી દો"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"વાતચીતને બબલ કરશો નહીં"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"બબલનો ઉપયોગ કરીને ચેટ કરો"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"નવી વાતચીત ફ્લોટિંગ આઇકન અથવા બબલ જેવી દેખાશે. બબલને ખોલવા માટે ટૅપ કરો. તેને ખસેડવા માટે ખેંચો."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"બબલને કોઈપણ સમયે નિયંત્રિત કરો"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"આ ઍપમાંથી બબલને બંધ કરવા માટે મેનેજ કરો પર ટૅપ કરો"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"તાજેતરના કોઈ બબલ નથી"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"એકદમ નવા બબલ અને છોડી દીધેલા બબલ અહીં દેખાશે"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"બબલ"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"મેનેજ કરો"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"બબલ છોડી દેવાયો."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-gu/strings_tv.xml b/libs/WindowManager/Shell/res/values-gu/strings_tv.xml
new file mode 100644
index 0000000..a5c0c31
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-gu/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(કોઈ ટાઇટલ પ્રોગ્રામ નથી)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP બંધ કરો"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"પૂર્ણ સ્ક્રીન"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml
new file mode 100644
index 0000000..34c1c85
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-hi/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"बंद करें"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"विस्तार करें"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"सेटिंग"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"मेन्यू"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> \"पिक्चर में पिक्चर\" के अंदर है"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"अगर आप नहीं चाहते कि <xliff:g id="NAME">%s</xliff:g> इस सुविधा का उपयोग करे, तो सेटिंग खोलने के लिए टैप करें और उसे बंद करें ."</string>
+    <string name="pip_play" msgid="3496151081459417097">"चलाएं"</string>
+    <string name="pip_pause" msgid="690688849510295232">"रोकें"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"अगले पर जाएं"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"पिछले पर जाएं"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"आकार बदलें"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"ऐप्लिकेशन शायद स्प्लिट स्क्रीन मोड में काम न करे."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ऐप विभाजित स्‍क्रीन का समर्थन नहीं करता है."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"हो सकता है कि ऐप प्राइमरी (मुख्य) डिस्प्ले के अलावा बाकी दूसरे डिस्प्ले पर काम न करे."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"प्राइमरी (मुख्य) डिस्प्ले के अलावा बाकी दूसरे डिस्प्ले पर ऐप लॉन्च नहीं किया जा सकता."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"विभाजित स्क्रीन विभाजक"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"बाईं स्क्रीन को फ़ुल स्क्रीन बनाएं"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"बाईं स्क्रीन को 70% बनाएं"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"बाईं स्क्रीन को 50% बनाएं"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"बाईं स्क्रीन को 30% बनाएं"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"दाईं स्क्रीन को फ़ुल स्क्रीन बनाएं"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ऊपर की स्क्रीन को फ़ुल स्क्रीन बनाएं"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ऊपर की स्क्रीन को 70% बनाएं"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ऊपर की स्क्रीन को 50% बनाएं"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ऊपर की स्क्रीन को 30% बनाएं"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"नीचे की स्क्रीन को फ़ुल स्क्रीन बनाएं"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"वन-हैंडेड मोड का इस्तेमाल करना"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"इस मोड से बाहर निकलने के लिए, स्क्रीन के सबसे निचले हिस्से से ऊपर की ओर स्वाइप करें या ऐप्लिकेशन के बाहर कहीं भी टैप करें"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"वन-हैंडेड मोड चालू करें"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"वन-हैंडेड मोड से बाहर निकलें"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> बबल्स की सेटिंग"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ओवरफ़्लो"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"स्टैक में वापस जोड़ें"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> से <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> और <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> अन्य ऐप्लिकेशन से <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"सबसे ऊपर बाईं ओर ले जाएं"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"सबसे ऊपर दाईं ओर ले जाएं"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"बाईं ओर सबसे नीचे ले जाएं"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"सबसे नीचे दाईं ओर ले जाएं"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> की सेटिंग"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"बबल खारिज करें"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"बातचीत को बबल न करें"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"बबल्स का इस्तेमाल करके चैट करें"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"नई बातचीत फ़्लोटिंग आइकॉन या बबल्स की तरह दिखेंगी. बबल को खोलने के लिए टैप करें. इसे एक जगह से दूसरी जगह ले जाने के लिए खींचें और छोड़ें."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"जब चाहें, बबल्स को कंट्रोल करें"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"इस ऐप्लिकेशन पर बबल्स को बंद करने के लिए \'प्रबंधित करें\' पर टैप करें"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"ठीक है"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"हाल ही के बबल्स मौजूद नहीं हैं"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"हाल ही के बबल्स और हटाए गए बबल्स यहां दिखेंगे"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"बबल"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"प्रबंधित करें"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"बबल खारिज किया गया."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-hi/strings_tv.xml b/libs/WindowManager/Shell/res/values-hi/strings_tv.xml
new file mode 100644
index 0000000..720bb6c
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-hi/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"पिक्चर में पिक्चर"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(कोई शीर्षक कार्यक्रम नहीं)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP बंद करें"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"फ़ुल स्‍क्रीन"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml
new file mode 100644
index 0000000..32b21aa
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-hr/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Zatvori"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Proširivanje"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Postavke"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Izbornik"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> jest na slici u slici"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Ako ne želite da aplikacija <xliff:g id="NAME">%s</xliff:g> upotrebljava tu značajku, dodirnite da biste otvorili postavke i isključili je."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Reproduciraj"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pauziraj"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Preskoči na sljedeće"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Preskoči na prethodno"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Promjena veličine"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacija možda neće funkcionirati s podijeljenim zaslonom."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacija ne podržava podijeljeni zaslon."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacija možda neće funkcionirati na sekundarnom zaslonu."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikacija ne podržava pokretanje na sekundarnim zaslonima."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Razdjelnik podijeljenog zaslona"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Lijevi zaslon u cijeli zaslon"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Lijevi zaslon na 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Lijevi zaslon na 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Lijevi zaslon na 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Desni zaslon u cijeli zaslon"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Gornji zaslon u cijeli zaslon"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Gornji zaslon na 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Gornji zaslon na 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Gornji zaslon na 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Donji zaslon u cijeli zaslon"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Korištenje načina rada jednom rukom"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Za izlaz prijeđite prstom od dna zaslona prema gore ili dodirnite bio gdje iznad aplikacije"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Pokretanje načina rada jednom rukom"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Izlaz iz načina rada jednom rukom"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Postavke za oblačiće za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Dodatno"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Dodajte natrag u nizove"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> i još <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Premjesti u gornji lijevi kut"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Premjesti u gornji desni kut"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Premjesti u donji lijevi kut"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Premjestite u donji desni kut"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Postavke za <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Odbaci oblačić"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Zaustavi razgovor u oblačićima"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Oblačići u chatu"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Novi razgovori pojavljuju se kao pomične ikone ili oblačići. Dodirnite za otvaranje oblačića. Povucite da biste ga premjestili."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Upravljanje oblačićima u svakom trenutku"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Dodirnite Upravljanje da biste isključili oblačiće iz ove aplikacije"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Shvaćam"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Nema nedavnih oblačića"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Ovdje će se prikazivati nedavni i odbačeni oblačići"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Oblačić"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljanje"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblačić odbačen."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-hr/strings_tv.xml b/libs/WindowManager/Shell/res/values-hr/strings_tv.xml
new file mode 100644
index 0000000..21f8cb6
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-hr/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Slika u slici"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program bez naslova)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Zatvori PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Cijeli zaslon"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml
new file mode 100644
index 0000000..123b127
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-hu/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Bezárás"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Kibontás"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Beállítások"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menü"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"A(z) <xliff:g id="NAME">%s</xliff:g> kép a képben funkciót használ"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Ha nem szeretné, hogy a(z) <xliff:g id="NAME">%s</xliff:g> használja ezt a funkciót, koppintson a beállítások megnyitásához, és kapcsolja ki."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Lejátszás"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Szüneteltetés"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Ugrás a következőre"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Ugrás az előzőre"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Átméretezés"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Lehet, hogy az alkalmazás nem működik osztott képernyős nézetben."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Az alkalmazás nem támogatja az osztott képernyős nézetet."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Előfordulhat, hogy az alkalmazás nem működik másodlagos kijelzőn."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Az alkalmazást nem lehet másodlagos kijelzőn elindítani."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Elválasztó az osztott nézetben"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Bal oldali teljes képernyőre"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Bal oldali 70%-ra"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Bal oldali 50%-ra"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Bal oldali 30%-ra"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Jobb oldali teljes képernyőre"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Felső teljes képernyőre"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Felső 70%-ra"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Felső 50%-ra"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Felső 30%-ra"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Alsó teljes képernyőre"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Egykezes mód használata"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"A kilépéshez csúsztasson felfelé a képernyő aljáról, vagy koppintson az alkalmazás felett a képernyő bármelyik részére"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Egykezes mód indítása"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Kilépés az egykezes módból"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g>-buborékok beállításai"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"További elemeket tartalmazó menü"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Visszaküldés a verembe"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> a(z) <xliff:g id="APP_NAME">%2$s</xliff:g> alkalmazásból és <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> további"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Áthelyezés fel és balra"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Áthelyezés fel és jobbra"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Áthelyezés le és balra"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Áthelyezés le és jobbra"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> beállításai"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Buborék elvetése"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ne jelenjen meg a beszélgetés buborékban"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Buborékokat használó csevegés"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Az új beszélgetések lebegő ikonként, vagyis buborékként jelennek meg. A buborék megnyitásához koppintson rá. Áthelyezéshez húzza a kívánt helyre."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Buborékok vezérlése bármikor"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"A Kezelés gombra koppintva kapcsolhatja ki az alkalmazásból származó buborékokat"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Értem"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Nincsenek buborékok a közelmúltból"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"A legutóbbi és az elvetett buborékok itt jelennek majd meg"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Buborék"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Kezelés"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Buborék elvetve."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-hu/strings_tv.xml b/libs/WindowManager/Shell/res/values-hu/strings_tv.xml
new file mode 100644
index 0000000..0010086
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-hu/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Kép a képben"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Cím nélküli program)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP bezárása"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Teljes képernyő"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml
new file mode 100644
index 0000000..b047cf1
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-hy/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Փակել"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Ընդարձակել"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Կարգավորումներ"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Ընտրացանկ"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g>-ը «Նկար նկարի մեջ» ռեժիմում է"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Եթե չեք ցանկանում, որ <xliff:g id="NAME">%s</xliff:g>-ն օգտագործի այս գործառույթը, հպեք՝ կարգավորումները բացելու և այն անջատելու համար։"</string>
+    <string name="pip_play" msgid="3496151081459417097">"Նվագարկել"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Դադարեցնել"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Անցնել հաջորդին"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Վերադառնալ նախորդին"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Փոխել չափը"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Հավելվածը չի կարող աշխատել տրոհված էկրանի ռեժիմում։"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Հավելվածը չի աջակցում էկրանի տրոհումը:"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Հավելվածը կարող է չաշխատել լրացուցիչ էկրանի վրա"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Հավելվածը չի աջակցում գործարկումը լրացուցիչ էկրանների վրա"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Տրոհված էկրանի բաժանիչ"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ձախ էկրանը՝ լիաէկրան"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Ձախ էկրանը՝ 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ձախ էկրանը՝ 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ձախ էկրանը՝ 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Աջ էկրանը՝ լիաէկրան"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Վերևի էկրանը՝ լիաէկրան"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Վերևի էկրանը՝ 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Վերևի էկրանը՝ 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Վերևի էկրանը՝ 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Ներքևի էկրանը՝ լիաէկրան"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Ինչպես օգտվել մեկ ձեռքի ռեժիմից"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Դուրս գալու համար մատը սահեցրեք էկրանի ներքևից վերև կամ հպեք հավելվածի վերևում որևէ տեղ։"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Գործարկել մեկ ձեռքի ռեժիմը"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Դուրս գալ մեկ ձեռքի ռեժիմից"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ի ամպիկների կարգավորումներ"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Լրացուցիչ ընտրացանկ"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Նորից ավելացնել զտիչներում"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>՝ <xliff:g id="APP_NAME">%2$s</xliff:g>-ից"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>` <xliff:g id="APP_NAME">%2$s</xliff:g>-ից ու ևս <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ամպիկ"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Տեղափոխել վերև՝ ձախ"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Տեղափոխել վերև՝ աջ"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Տեղափոխել ներքև՝ ձախ"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Տեղափոխել ներքև՝ աջ"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> – կարգավորումներ"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Փակել ամպիկը"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Զրույցը չցուցադրել ամպիկի տեսքով"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Զրույցի ամպիկներ"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Նոր զրույցները կհայտնվեն լողացող պատկերակների կամ ամպիկների տեսքով։ Հպեք՝ ամպիկը բացելու համար։ Քաշեք՝ այն տեղափոխելու համար։"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Ամպիկների կարգավորումներ"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Հպեք «Կառավարել» կոճակին՝ այս հավելվածի ամպիկներն անջատելու համար։"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Եղավ"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Ամպիկներ չկան"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Այստեղ կցուցադրվեն վերջերս օգտագործված և փակված ամպիկները, որոնք կկարողանաք հեշտությամբ վերաբացել"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Պղպջակ"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Կառավարել"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Ամպիկը փակվեց։"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-hy/strings_tv.xml b/libs/WindowManager/Shell/res/values-hy/strings_tv.xml
new file mode 100644
index 0000000..cb18762
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-hy/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Նկար նկարի մեջ"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Առանց վերնագրի ծրագիր)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Փակել PIP-ն"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Լիէկրան"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml
new file mode 100644
index 0000000..a75cdb4
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-in/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Tutup"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Luaskan"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Setelan"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> adalah picture-in-picture"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Jika Anda tidak ingin <xliff:g id="NAME">%s</xliff:g> menggunakan fitur ini, ketuk untuk membuka setelan dan menonaktifkannya."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Putar"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Jeda"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Lewati ke berikutnya"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Lewati ke sebelumnya"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Ubah ukuran"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikasi mungkin tidak berfungsi dengan layar terpisah."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"App tidak mendukung layar terpisah."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikasi mungkin tidak berfungsi pada layar sekunder."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikasi tidak mendukung peluncuran pada layar sekunder."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Pembagi layar terpisah"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Layar penuh di kiri"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Kiri 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kiri 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Kiri 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Layar penuh di kanan"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Layar penuh di atas"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Atas 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Atas 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Atas 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Layar penuh di bawah"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Menggunakan mode satu tangan"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Untuk keluar, geser layar dari bawah ke atas atau ketuk di mana saja di atas aplikasi"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Mulai mode satu tangan"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Keluar dari mode satu tangan"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Setelan untuk balon <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Tambahan"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Tambahkan kembali ke stack"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> dari <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> dari <xliff:g id="APP_NAME">%2$s</xliff:g> dan <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> lainnya"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Pindahkan ke kiri atas"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Pindahkan ke kanan atas"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Pindahkan ke kiri bawah"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Pindahkan ke kanan bawah"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Setelan <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Tutup balon"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Jangan gunakan percakapan balon"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat dalam tampilan balon"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Percakapan baru muncul sebagai ikon mengambang, atau balon. Ketuk untuk membuka balon. Tarik untuk memindahkannya."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Kontrol balon kapan saja"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Ketuk Kelola untuk menonaktifkan balon dari aplikasi ini"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Oke"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Tidak ada balon baru-baru ini"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Balon yang baru dipakai dan balon yang telah ditutup akan muncul di sini"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Balon"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Kelola"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balon ditutup."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-in/strings_tv.xml b/libs/WindowManager/Shell/res/values-in/strings_tv.xml
new file mode 100644
index 0000000..8f3a287
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-in/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-Picture"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program tanpa judul)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Tutup PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Layar penuh"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml
new file mode 100644
index 0000000..3b28148
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-is/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Loka"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Stækka"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Stillingar"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Valmynd"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> er með mynd í mynd"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Ef þú vilt ekki að <xliff:g id="NAME">%s</xliff:g> noti þennan eiginleika skaltu ýta til að opna stillingarnar og slökkva á því."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Spila"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Gera hlé"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Fara á næsta"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Fara á fyrra"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Breyta stærð"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Hugsanlega virkar forritið ekki með skjáskiptingu."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Forritið styður ekki að skjánum sé skipt."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Hugsanlegt er að forritið virki ekki á öðrum skjá."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Forrit styður ekki opnun á öðrum skjá."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Skjáskipting"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Vinstri á öllum skjánum"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Vinstri 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vinstri 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Vinstri 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Hægri á öllum skjánum"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Efri á öllum skjánum"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Efri 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Efri 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Efri 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Neðri á öllum skjánum"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Notkun einhentrar stillingar"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Til að loka skaltu strjúka upp frá neðri hluta skjásins eða ýta hvar sem er fyrir ofan forritið"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Ræsa einhenta stillingu"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Hætta í einhentri stillingu"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Stillingar fyrir blöðrur frá <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Yfirflæði"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Bæta aftur í stafla"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> frá <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ frá <xliff:g id="APP_NAME">%2$s</xliff:g> og <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> í viðbót"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Færa efst til vinstri"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Færa efst til hægri"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Færa neðst til vinstri"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Færðu neðst til hægri"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Stillingar <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Loka blöðru"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ekki setja samtal í blöðru"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Spjalla með blöðrum"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Ný samtöl birtast sem fljótandi tákn eða blöðrur. Ýttu til að opna blöðru. Dragðu hana til að færa."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Hægt er að stjórna blöðrum hvenær sem er"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Ýttu á „Stjórna“ til að slökkva á blöðrum frá þessu forriti"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Ég skil"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Engar nýlegar blöðrur"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Nýlegar blöðrur og blöðrur sem þú hefur lokað birtast hér"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Blaðra"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Stjórna"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Blöðru lokað."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-is/strings_tv.xml b/libs/WindowManager/Shell/res/values-is/strings_tv.xml
new file mode 100644
index 0000000..1f148d9
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-is/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Mynd í mynd"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Efni án titils)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Loka mynd í mynd"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Allur skjárinn"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml
new file mode 100644
index 0000000..8a2b9db
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-it/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Chiudi"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Espandi"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Impostazioni"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> è in Picture in picture"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Se non desideri che l\'app <xliff:g id="NAME">%s</xliff:g> utilizzi questa funzione, tocca per aprire le impostazioni e disattivarla."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Riproduci"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Metti in pausa"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Passa ai contenuti successivi"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Passa ai contenuti precedenti"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Ridimensiona"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"L\'app potrebbe non funzionare con lo schermo diviso."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"L\'app non supporta la modalità Schermo diviso."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"L\'app potrebbe non funzionare su un display secondario."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"L\'app non supporta l\'avvio su display secondari."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Strumento per schermo diviso"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Schermata sinistra a schermo intero"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Schermata sinistra al 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Schermata sinistra al 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Schermata sinistra al 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Schermata destra a schermo intero"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Schermata superiore a schermo intero"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Schermata superiore al 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Schermata superiore al 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Schermata superiore al 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Schermata inferiore a schermo intero"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Usare la modalità one-hand"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Per uscire, scorri verso l\'alto dalla parte inferiore dello schermo oppure tocca un punto qualsiasi sopra l\'app"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Avvia la modalità one-hand"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Esci dalla modalità one-hand"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Impostazioni per bolle <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Altre"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Aggiungi di nuovo all\'elenco"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> da <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> da <xliff:g id="APP_NAME">%2$s</xliff:g> e altre <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Sposta in alto a sinistra"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Sposta in alto a destra"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Sposta in basso a sinistra"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Sposta in basso a destra"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Impostazioni <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ignora bolla"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Non mettere la conversazione nella bolla"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatta utilizzando le bolle"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Le nuove conversazioni vengono visualizzate come icone mobili o bolle. Tocca per aprire la bolla. Trascinala per spostarla."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Controlla le bolle quando vuoi"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tocca Gestisci per disattivare le bolle dall\'app"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Nessuna bolla recente"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Le bolle recenti e ignorate appariranno qui"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Fumetto"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestisci"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Fumetto ignorato."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-it/strings_tv.xml b/libs/WindowManager/Shell/res/values-it/strings_tv.xml
new file mode 100644
index 0000000..127454c
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-it/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture in picture"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programma senza titolo)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Chiudi PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Schermo intero"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml
new file mode 100644
index 0000000..82ba220
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-iw/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"סגירה"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"הרחב"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"הגדרות"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"תפריט"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> במצב תמונה בתוך תמונה"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"אם אינך רוצה שהתכונה הזו תשמש את <xliff:g id="NAME">%s</xliff:g>, יש להקיש כדי לפתוח את ההגדרות ולכבות את התכונה."</string>
+    <string name="pip_play" msgid="3496151081459417097">"הפעל"</string>
+    <string name="pip_pause" msgid="690688849510295232">"השהה"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"אפשר לדלג אל הבא"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"אפשר לדלג אל הקודם"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"שינוי גודל"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"ייתכן שהאפליקציה לא תפעל במסך מפוצל."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"האפליקציה אינה תומכת במסך מפוצל."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ייתכן שהאפליקציה לא תפעל במסך משני."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"האפליקציה אינה תומכת בהפעלה במסכים משניים."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"מחלק מסך מפוצל"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"מסך שמאלי מלא"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"שמאלה 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"שמאלה 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"שמאלה 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"מסך ימני מלא"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"מסך עליון מלא"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"עליון 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"עליון 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"עליון 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"מסך תחתון מלא"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"איך להשתמש במצב שימוש ביד אחת"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"כדי לצאת, יש להחליק למעלה מתחתית המסך או להקיש במקום כלשהו במסך מעל האפליקציה"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"הפעלה של מצב שימוש ביד אחת"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"יציאה ממצב שימוש ביד אחת"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"הגדרות בשביל בועות של <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"גלישה"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"הוספה בחזרה לערימה"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> מהאפליקציה <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> מ-<xliff:g id="APP_NAME">%2$s</xliff:g> ועוד <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"העברה לפינה השמאלית העליונה"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"העברה לפינה הימנית העליונה"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"העברה לפינה השמאלית התחתונה"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"העברה לפינה הימנית התחתונה"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"הגדרות <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"סגירת בועה"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"אין להציג בועות לשיחה"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"לדבר בבועות"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"שיחות חדשות מופיעות כסמלים צפים, או בועות. יש להקיש כדי לפתוח בועה. יש לגרור כדי להזיז אותה."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"שליטה בבועות, בכל זמן"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"יש להקיש על \'ניהול\' כדי להשבית את הבועות מהאפליקציה הזו"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"הבנתי"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"אין בועות מהזמן האחרון"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"בועות אחרונות ובועות שנסגרו יופיעו כאן"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"בועה"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"ניהול"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"הבועה נסגרה."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-iw/strings_tv.xml b/libs/WindowManager/Shell/res/values-iw/strings_tv.xml
new file mode 100644
index 0000000..8ca54e0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-iw/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"תמונה בתוך תמונה"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(תוכנית ללא כותרת)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"‏סגור PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"מסך מלא"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml
new file mode 100644
index 0000000..fbb2951
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ja/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"閉じる"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"展開"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"設定"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"メニュー"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g>はピクチャー イン ピクチャーで表示中です"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g>でこの機能を使用しない場合は、タップして設定を開いて OFF にしてください。"</string>
+    <string name="pip_play" msgid="3496151081459417097">"再生"</string>
+    <string name="pip_pause" msgid="690688849510295232">"一時停止"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"次へスキップ"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"前へスキップ"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"サイズ変更"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"アプリは分割画面では動作しないことがあります。"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"アプリで分割画面がサポートされていません。"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"アプリはセカンダリ ディスプレイでは動作しないことがあります。"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"アプリはセカンダリ ディスプレイでの起動に対応していません。"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"分割画面の分割線"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"左全画面"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"左 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"左 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"左 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"右全画面"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"上部全画面"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"上 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"上 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"上 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"下部全画面"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"片手モードの使用"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"終了するには、画面を下から上にスワイプするか、アプリの任意の場所をタップします"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"片手モードを開始します"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"片手モードを終了します"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> のバブルの設定"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"オーバーフロー"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"スタックに戻す"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>(<xliff:g id="APP_NAME">%2$s</xliff:g>)"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>(<xliff:g id="APP_NAME">%2$s</xliff:g>)、他 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 件"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"左上に移動"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"右上に移動"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"左下に移動"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"右下に移動"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> の設定"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"バブルを閉じる"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"会話をバブルで表示しない"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"チャットでバブルを使う"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"新しい会話はフローティング アイコン(バブル)として表示されます。タップするとバブルが開きます。ドラッグしてバブルを移動できます。"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"いつでもバブルを管理"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"このアプリからのバブルを OFF にするには、[管理] をタップしてください"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"最近閉じたバブルはありません"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"最近表示されたバブルや閉じたバブルが、ここに表示されます"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"バブル"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ふきだしが非表示になっています。"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ja/strings_tv.xml b/libs/WindowManager/Shell/res/values-ja/strings_tv.xml
new file mode 100644
index 0000000..b7ab28c
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ja/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"ピクチャー イン ピクチャー"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(無題の番組)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP を閉じる"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"全画面表示"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml
new file mode 100644
index 0000000..f978481
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ka/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"დახურვა"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"გაშლა"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"პარამეტრები"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"მენიუ"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> იყენებს რეჟიმს „ეკრანი ეკრანში“"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"თუ არ გსურთ, რომ <xliff:g id="NAME">%s</xliff:g> ამ ფუნქციას იყენებდეს, აქ შეხებით შეგიძლიათ გახსნათ პარამეტრები და გამორთოთ ის."</string>
+    <string name="pip_play" msgid="3496151081459417097">"დაკვრა"</string>
+    <string name="pip_pause" msgid="690688849510295232">"დაპაუზება"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"შემდეგზე გადასვლა"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"წინაზე გადასვლა"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ზომის შეცვლა"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"აპმა შეიძლება არ იმუშაოს გაყოფილი ეკრანის რეჟიმში."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ეკრანის გაყოფა არ არის მხარდაჭერილი აპის მიერ."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"აპმა შეიძლება არ იმუშაოს მეორეულ ეკრანზე."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"აპს არ გააჩნია მეორეული ეკრანის მხარდაჭერა."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"გაყოფილი ეკრანის რეჟიმის გამყოფი"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"მარცხენა ნაწილის სრულ ეკრანზე გაშლა"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"მარცხენა ეკრანი — 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"მარცხენა ეკრანი — 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"მარცხენა ეკრანი — 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"მარჯვენა ნაწილის სრულ ეკრანზე გაშლა"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ზედა ნაწილის სრულ ეკრანზე გაშლა"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ზედა ეკრანი — 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ზედა ეკრანი — 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ზედა ეკრანი — 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"ქვედა ნაწილის სრულ ეკრანზე გაშლა"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"ცალი ხელის რეჟიმის გამოყენება"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"გასასვლელად გადაფურცლეთ ეკრანის ქვედა კიდიდან ზემოთ ან შეეხეთ ნებისმიერ ადგილას აპის ზემოთ"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"ცალი ხელის რეჟიმის დაწყება"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"ცალი ხელის რეჟიმიდან გამოსვლა"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"პარამეტრები <xliff:g id="APP_NAME">%1$s</xliff:g> ბუშტებისთვის"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"გადავსება"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ისევ დამატება დასტაზე"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> <xliff:g id="APP_NAME">%2$s</xliff:g>-ისგან"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> <xliff:g id="APP_NAME">%2$s</xliff:g>-დან და კიდევ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"ზევით და მარცხნივ გადატანა"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"გადაანაცვლეთ ზევით და მარჯვნივ"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"ქვევით და მარცხნივ გადატანა"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"გადაანაცვ. ქვემოთ და მარჯვნივ"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>-ის პარამეტრები"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"ბუშტის დახურვა"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"აიკრძალოს საუბრის ბუშტები"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"ჩეთი ბუშტების გამოყენებით"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"ახალი საუბრები გამოჩნდება როგორც მოტივტივე ხატულები ან ბუშტები. შეეხეთ ბუშტის გასახსნელად. გადაიტანეთ ჩავლებით."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ბუშტების ნებისმიერ დროს გაკონტროლება"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ამ აპის ბუშტების გამოსართავად შეეხეთ „მართვას“"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"გასაგებია"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ბოლო დროს გამოყენებული ბუშტები არ არის"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"აქ გამოჩნდება ბოლოდროინდელი ბუშტები და უარყოფილი ბუშტები"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"ბუშტი"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"მართვა"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ბუშტი დაიხურა."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ka/strings_tv.xml b/libs/WindowManager/Shell/res/values-ka/strings_tv.xml
new file mode 100644
index 0000000..1bf4b8e
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ka/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"ეკრანი ეკრანში"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(პროგრამის სათაურის გარეშე)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP-ის დახურვა"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"სრულ ეკრანზე"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml
new file mode 100644
index 0000000..0cda01e
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-kk/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Жабу"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Жаю"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Параметрлер"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Mәзір"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> \"суреттегі сурет\" режимінде"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g> деген пайдаланушының бұл мүмкіндікті пайдалануын қаламасаңыз, параметрлерді түртіп ашыңыз да, оларды өшіріңіз."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Ойнату"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Кідірту"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Келесіге өту"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Алдыңғысына оралу"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Өлшемін өзгерту"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Қодланба бөлінген экранды қолдамайды."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Қолданба қосымша дисплейде жұмыс істемеуі мүмкін."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Қолданба қосымша дисплейлерде іске қосуды қолдамайды."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Бөлінген экран бөлгіші"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Сол жағын толық экранға шығару"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70% сол жақта"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% сол жақта"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30% сол жақта"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Оң жағын толық экранға шығару"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Жоғарғы жағын толық экранға шығару"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70% жоғарғы жақта"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50% жоғарғы жақта"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"30% жоғарғы жақта"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Төменгісін толық экранға шығару"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> қалқыма хабарларының параметрлері"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Қосымша мәзір"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Стекке қайта енгізу"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> жіберген хабарландыру: <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> қолданбасы жіберген <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> және тағы <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Жоғарғы сол жаққа жылжыту"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Жоғары оң жаққа жылжыту"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Төменгі сол жаққа жылжыту"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Төменгі оң жаққа жылжыту"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> параметрлері"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Қалқымалы хабарды жабу"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Әңгіменің қалқыма хабары көрсетілмесін"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Қалқыма хабарлар арқылы сөйлесу"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Жаңа әңгімелер қалқыма белгішелер немесе хабарлар түрінде көрсетіледі. Қалқыма хабарды ашу үшін түртіңіз. Жылжыту үшін сүйреңіз."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Қалқыма хабарларды реттеу"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Бұл қолданбадан қалқыма хабарларды өшіру үшін \"Басқару\" түймесін түртіңіз."</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Жақындағы қалқыма хабарлар жоқ"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Соңғы және жабылған қалқыма хабарлар осы жерде көрсетіледі."</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Көпіршік"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Басқару"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Қалқымалы анықтама өшірілді."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-kk/strings_tv.xml b/libs/WindowManager/Shell/res/values-kk/strings_tv.xml
new file mode 100644
index 0000000..9b12cff
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-kk/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Атаусыз бағдарлама)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP жабу"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Толық экран"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml
new file mode 100644
index 0000000..d503b7a
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-km/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"បិទ"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"ពង្រីក"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"ការកំណត់"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"ម៉ឺនុយ"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> ស្ថិតក្នុងមុខងាររូបក្នុងរូប"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"ប្រសិនបើ​អ្នក​មិន​ចង់​ឲ្យ <xliff:g id="NAME">%s</xliff:g> ប្រើ​មុខងារ​នេះ​ សូមចុច​​បើក​ការកំណត់ រួច​បិទ​វា។"</string>
+    <string name="pip_play" msgid="3496151081459417097">"លេង"</string>
+    <string name="pip_pause" msgid="690688849510295232">"ផ្អាក"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"រំលងទៅបន្ទាប់"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"រំលងទៅក្រោយ"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ប្ដូរ​ទំហំ"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"កម្មវិធី​អាចនឹងមិន​ដំណើរការ​ជាមួយ​មុខងារបំបែកអេក្រង់​ទេ។"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"កម្មវិធីមិនគាំទ្រអេក្រង់បំបែកជាពីរទេ"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"កម្មវិធីនេះ​ប្រហែល​ជាមិនដំណើរការ​នៅលើ​អេក្រង់បន្ទាប់បន្សំទេ។"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"កម្មវិធី​នេះមិន​អាច​ចាប់ផ្តើម​នៅលើ​អេក្រង់បន្ទាប់បន្សំបានទេ។"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"កម្មវិធីចែកអេក្រង់បំបែក"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"អេក្រង់ពេញខាងឆ្វេង"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ឆ្វេង 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ឆ្វេង 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ឆ្វេង 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"អេក្រង់ពេញខាងស្តាំ"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"អេក្រង់ពេញខាងលើ"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ខាងលើ 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ខាងលើ 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ខាងលើ 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"អេក្រង់ពេញខាងក្រោម"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"កំពុងប្រើ​មុខងារប្រើដៃម្ខាង"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"ដើម្បីចាកចេញ សូមអូសឡើងលើ​ពីផ្នែកខាងក្រោមអេក្រង់ ឬចុចផ្នែកណាមួយ​នៅខាងលើកម្មវិធី"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"ចាប់ផ្ដើម​មុខងារប្រើដៃម្ខាង"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"ចាកចេញពី​មុខងារប្រើដៃម្ខាង"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"ការកំណត់​សម្រាប់​ពពុះ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ម៉ឺនុយបន្ថែម"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"បញ្ចូល​ទៅក្នុង​គំនរវិញ"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ពី <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ពី <xliff:g id="APP_NAME">%2$s</xliff:g> និង <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ទៀត"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"ផ្លាស់ទីទៅផ្នែកខាងលើខាងឆ្វេង"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"ផ្លាស់ទីទៅផ្នែកខាងលើខាងស្ដាំ"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"ផ្លាស់ទីទៅផ្នែកខាងក្រោមខាងឆ្វេង​"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"ផ្លាស់ទីទៅផ្នែកខាងក្រោម​ខាងស្ដាំ"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"ការកំណត់ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"ច្រានចោល​ពពុះ"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"កុំបង្ហាញ​ការសន្ទនា​ជាពពុះ"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"ជជែក​ដោយប្រើ​ពពុះ"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"ការសន្ទនាថ្មីៗ​បង្ហាញជា​​ពពុះ ឬរូបអណ្ដែត។ ចុច ដើម្បីបើក​ពពុះ។ អូស ដើម្បី​ផ្លាស់ទី​ពពុះនេះ។"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"គ្រប់គ្រង​​ពពុះ​បានគ្រប់ពេល"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ចុច \"គ្រប់គ្រង\" ដើម្បីបិទ​ពពុះពីកម្មវិធីនេះ"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"យល់ហើយ"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"មិនមាន​ពពុះ​ថ្មីៗ​ទេ"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"ពពុះថ្មីៗ​ និង​ពពុះដែលបានបិទ​​នឹង​បង្ហាញ​នៅទីនេះ"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"ពពុះ"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"គ្រប់គ្រង"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"បានច្រានចោល​សារលេចឡើង។"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-km/strings_tv.xml b/libs/WindowManager/Shell/res/values-km/strings_tv.xml
new file mode 100644
index 0000000..b559970
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-km/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"រូបក្នុងរូប"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(កម្មវិធី​គ្មានចំណងជើង)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"បិទ PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"ពេញអេក្រង់"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml
new file mode 100644
index 0000000..456dc06
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-kn/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"ಮುಚ್ಚಿ"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"ವಿಸ್ತೃತಗೊಳಿಸು"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"ಮೆನು"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರವಾಗಿದೆ"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g> ಈ ವೈಶಿಷ್ಟ್ಯ ಬಳಸುವುದನ್ನು ನೀವು ಬಯಸದಿದ್ದರೆ, ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಲು ಮತ್ತು ಅದನ್ನು ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+    <string name="pip_play" msgid="3496151081459417097">"ಪ್ಲೇ"</string>
+    <string name="pip_pause" msgid="690688849510295232">"ವಿರಾಮಗೊಳಿಸಿ"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"ಮುಂದಕ್ಕೆ ಸ್ಕಿಪ್‌ ಮಾಡಿ"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"ಹಿಂದಕ್ಕೆ ಸ್ಕಿಪ್‌ ಮಾಡಿ"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ಮರುಗಾತ್ರಗೊಳಿಸಿ"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ಅಪ್ಲಿಕೇಶನ್ ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ಸೆಕೆಂಡರಿ ಡಿಸ್‌ಪ್ಲೇಗಳಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್‌ ಕಾರ್ಯ ನಿರ್ವಹಿಸದೇ ಇರಬಹುದು."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ಸೆಕೆಂಡರಿ ಡಿಸ್‌ಪ್ಲೇಗಳಲ್ಲಿ ಪ್ರಾರಂಭಿಸುವಿಕೆಯನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"ಸ್ಪ್ಲಿಟ್-ಪರದೆ ಡಿವೈಡರ್"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ಎಡ ಪೂರ್ಣ ಪರದೆ"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70% ಎಡಕ್ಕೆ"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% ಎಡಕ್ಕೆ"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30% ಎಡಕ್ಕೆ"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ಬಲ ಪೂರ್ಣ ಪರದೆ"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ಮೇಲಿನ ಪೂರ್ಣ ಪರದೆ"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70% ಮೇಲಕ್ಕೆ"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50% ಮೇಲಕ್ಕೆ"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"30% ಮೇಲಕ್ಕೆ"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"ಕೆಳಗಿನ ಪೂರ್ಣ ಪರದೆ"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಬಬಲ್ಸ್‌ಗಾಗಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ಓವರ್‌ಫ್ಲೋ"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ಸ್ಟ್ಯಾಕ್‌ಗೆ ಪುನಃ ಸೇರಿಸಿ"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> ಆ್ಯಪ್‌ನ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> ಮತ್ತು <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ಹೆಚ್ಚಿನವುಗಳ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"ಎಡ ಮೇಲ್ಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"ಬಲ ಮೇಲ್ಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"ಸ್ಕ್ರೀನ್‌ನ ಎಡ ಕೆಳಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"ಕೆಳಗಿನ ಬಲಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"ಬಬಲ್ ವಜಾಗೊಳಿಸಿ"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"ಸಂಭಾಷಣೆಯನ್ನು ಬಬಲ್ ಮಾಡಬೇಡಿ"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"ಬಬಲ್ಸ್ ಬಳಸಿ ಚಾಟ್ ಮಾಡಿ"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"ಹೊಸ ಸಂಭಾಷಣೆಗಳು ತೇಲುವ ಐಕಾನ್‌ಗಳು ಅಥವಾ ಬಬಲ್ಸ್ ಆಗಿ ಗೋಚರಿಸುತ್ತವೆ. ಬಬಲ್ ತೆರೆಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಅದನ್ನು ಡ್ರ್ಯಾಗ್ ಮಾಡಲು ಎಳೆಯಿರಿ."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಬಬಲ್ಸ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ಈ ಆ್ಯಪ್‌ನಿಂದ ಬಬಲ್ಸ್ ಅನ್ನು ಆಫ್ ಮಾಡಲು ನಿರ್ವಹಿಸಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಇಲ್ಲ"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಮತ್ತು ವಜಾಗೊಳಿಸಿದ ಬಬಲ್ಸ್ ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"ಬಬಲ್"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"ನಿರ್ವಹಿಸಿ"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ಬಬಲ್ ವಜಾಗೊಳಿಸಲಾಗಿದೆ."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-kn/strings_tv.xml b/libs/WindowManager/Shell/res/values-kn/strings_tv.xml
new file mode 100644
index 0000000..699824a
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-kn/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ಶೀರ್ಷಿಕೆ ರಹಿತ ಕಾರ್ಯಕ್ರಮ)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP ಮುಚ್ಚಿ"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"ಪೂರ್ಣ ಪರದೆ"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml
new file mode 100644
index 0000000..ea7ad56
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ko/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"닫기"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"펼치기"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"설정"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"메뉴"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g>에서 PIP 사용 중"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g>에서 이 기능이 사용되는 것을 원하지 않는 경우 탭하여 설정을 열고 기능을 사용 중지하세요."</string>
+    <string name="pip_play" msgid="3496151081459417097">"재생"</string>
+    <string name="pip_pause" msgid="690688849510295232">"일시중지"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"다음으로 건너뛰기"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"이전으로 건너뛰기"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"크기 조절"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"앱이 분할 화면에서 작동하지 않을 수 있습니다."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"앱이 화면 분할을 지원하지 않습니다."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"앱이 보조 디스플레이에서 작동하지 않을 수도 있습니다."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"앱이 보조 디스플레이에서의 실행을 지원하지 않습니다."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"화면 분할기"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"왼쪽 화면 전체화면"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"왼쪽 화면 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"왼쪽 화면 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"왼쪽 화면 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"오른쪽 화면 전체화면"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"위쪽 화면 전체화면"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"위쪽 화면 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"위쪽 화면 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"위쪽 화면 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"아래쪽 화면 전체화면"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"한 손 사용 모드 사용하기"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"화면 하단에서 위로 스와이프하거나 앱 상단을 탭하여 종료합니다."</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"한 손 사용 모드 시작"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"한 손 사용 모드 종료"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> 대화창 설정"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"더보기"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"스택에 다시 추가"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g>의 <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> 외 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>개의 <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"왼쪽 상단으로 이동"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"오른쪽 상단으로 이동"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"왼쪽 하단으로 이동"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"오른쪽 하단으로 이동"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> 설정"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"대화창 닫기"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"대화를 대화창으로 표시하지 않기"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"대화창으로 채팅하기"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"새로운 대화가 플로팅 아이콘인 대화창으로 표시됩니다. 대화창을 열려면 탭하세요. 드래그하여 이동할 수 있습니다."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"언제든지 대화창을 제어하세요"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"이 앱에서 대화창을 사용 중지하려면 관리를 탭하세요."</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"확인"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"최근 대화창 없음"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"최근 대화창과 내가 닫은 대화창이 여기에 표시됩니다."</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"버블"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"관리"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"대화창을 닫았습니다."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ko/strings_tv.xml b/libs/WindowManager/Shell/res/values-ko/strings_tv.xml
new file mode 100644
index 0000000..46d6ad4
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ko/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"PIP 모드"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(제목 없는 프로그램)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP 닫기"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"전체화면"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml
new file mode 100644
index 0000000..611b2d6
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ky/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Жабуу"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Жайып көрсөтүү"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Жөндөөлөр"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Меню"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> – сүрөт ичиндеги сүрөт"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Эгер <xliff:g id="NAME">%s</xliff:g> колдонмосу бул функцияны пайдаланбасын десеңиз, жөндөөлөрдү ачып туруп, аны өчүрүп коюңуз."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Ойнотуу"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Тындыруу"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Кийинкисине өткөрүп жиберүү"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Мурункусуна өткөрүп жиберүү"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Өлчөмүн өзгөртүү"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Колдонмодо экран бөлүнбөшү мүмкүн."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Колдонмодо экран бөлүнбөйт."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Колдонмо кошумча экранда иштебей коюшу мүмкүн."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Колдонмону кошумча экрандарда иштетүүгө болбойт."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Экранды бөлгүч"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Сол жактагы экранды толук экран режимине өткөрүү"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Сол жактагы экранды 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Сол жактагы экранды 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Сол жактагы экранды 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Оң жактагы экранды толук экран режимине өткөрүү"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Үстүнкү экранды толук экран режимине өткөрүү"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Үстүнкү экранды 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Үстүнкү экранды 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Үстүнкү экранды 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Ылдыйкы экранды толук экран режимине өткөрүү"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Бир кол режимин колдонуу"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Чыгуу үчүн экранды ылдый жагынан өйдө көздөй сүрүңүз же колдонмонун өйдө жагын басыңыз"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Бир кол режимин баштоо"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Бир кол режиминен чыгуу"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> калкып чыкма билдирмелер жөндөөлөрү"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Кошумча меню"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Кайра топтомго кошуу"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> колдонмосунан <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> жана дагы <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> колдонмодон <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Жогорку сол жакка жылдыруу"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Жогорку оң жакка жылдырыңыз"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Төмөнкү сол жакка жылдыруу"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Төмөнкү оң жакка жылдырыңыз"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> жөндөөлөрү"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Калкып чыкма билдирмени жабуу"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Жазышууда калкып чыкма билдирмелер көрүнбөсүн"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Калкып чыкма билдирмелер аркылуу маектешүү"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Жаңы жазышуулар калкыма сүрөтчөлөр же калкып чыкма билдирмелер түрүндө көрүнөт. Калкып чыкма билдирмелерди ачуу үчүн таптап коюңуз. Жылдыруу үчүн сүйрөңүз."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Калкып чыкма билдирмелерди каалаган убакта көзөмөлдөңүз"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Бул колдонмодогу калкып чыкма билдирмелерди өчүрүү үчүн, \"Башкарууну\" басыңыз"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Түшүндүм"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Азырынча эч нерсе жок"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Акыркы жана жабылган калкып чыкма билдирмелер ушул жерде көрүнөт"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Көбүк"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Башкаруу"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Калкып чыкма билдирме жабылды."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ky/strings_tv.xml b/libs/WindowManager/Shell/res/values-ky/strings_tv.xml
new file mode 100644
index 0000000..d5d1d7e
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ky/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Сүрөттөгү сүрөт"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Аталышы жок программа)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP\'ти жабуу"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Толук экран"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml
new file mode 100644
index 0000000..a1c998c
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-lo/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"ປິດ"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"ຂະຫຍາຍ"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"ການຕັ້ງຄ່າ"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"ເມນູ"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> ແມ່ນເປັນການສະແດງຜົນຫຼາຍຢ່າງພ້ອມກັນ"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"ຫາກທ່ານບໍ່ຕ້ອງການ <xliff:g id="NAME">%s</xliff:g> ໃຫ້ໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ແຕະເພື່ອເປີດການຕັ້ງຄ່າ ແລ້ວປິດມັນໄວ້."</string>
+    <string name="pip_play" msgid="3496151081459417097">"ຫຼິ້ນ"</string>
+    <string name="pip_pause" msgid="690688849510295232">"ຢຸດຊົ່ວຄາວ"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"ຂ້າມໄປລາຍການໜ້າ"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"ຂ້າມໄປລາຍການກ່ອນນີ້"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ປ່ຽນຂະໜາດ"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"ແອັບອາດໃຊ້ບໍ່ໄດ້ກັບການແບ່ງໜ້າຈໍ."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ແອັບບໍ່ຮອງຮັບໜ້າຈໍແບບແຍກກັນ."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ແອັບອາດບໍ່ສາມາດໃຊ້ໄດ້ໃນໜ້າຈໍທີສອງ."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ແອັບບໍ່ຮອງຮັບການເປີດໃນໜ້າຈໍທີສອງ."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"ຕົວຂັ້ນການແບ່ງໜ້າຈໍ"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ເຕັມໜ້າຈໍຊ້າຍ"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ຊ້າຍ 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ຊ້າຍ 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ຊ້າຍ 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ເຕັມໜ້າຈໍຂວາ"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ເຕັມໜ້າຈໍເທິງສຸດ"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ເທິງສຸດ 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ເທິງສຸດ 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ເທິງສຸດ 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"ເຕັມໜ້າຈໍລຸ່ມສຸດ"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"ກຳລັງໃຊ້ໂໝດມືດຽວ"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"ເພື່ອອອກ, ໃຫ້ປັດຂຶ້ນຈາກລຸ່ມສຸດຂອງໜ້າຈໍ ຫຼື ແຕະບ່ອນໃດກໍໄດ້ຢູ່ເໜືອແອັບ"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"ເລີ່ມໂໝດມືດຽວ"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"ອອກຈາກໂໝດມືດຽວ"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"ການຕັ້ງຄ່າສຳລັບຟອງ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ລົ້ນ"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ເພີ່ມກັບໄປຫາການວາງຊ້ອນກັນ"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ຈາກ <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ຈາກ <xliff:g id="APP_NAME">%2$s</xliff:g> ແລະ ອີກ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"ຍ້າຍຊ້າຍເທິງ"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"ຍ້າຍຂວາເທິງ"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"ຍ້າຍຊ້າຍລຸ່ມ"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"ຍ້າຍຂວາລຸ່ມ"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"ການຕັ້ງຄ່າ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"ປິດຟອງໄວ້"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"ຢ່າໃຊ້ຟອງໃນການສົນທະນາ"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"ສົນທະນາໂດຍໃຊ້ຟອງ"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"ການສົນທະນາໃໝ່ຈະປາກົດເປັນໄອຄອນ ຫຼື ຟອງແບບລອຍ. ແຕະເພື່ອເປີດຟອງ. ລາກເພື່ອຍ້າຍມັນ."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ຄວບຄຸມຟອງຕອນໃດກໍໄດ້"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ແຕະຈັດການ ເພື່ອປິດຟອງຈາກແອັບນີ້"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"ເຂົ້າໃຈແລ້ວ"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ບໍ່ມີຟອງຫຼ້າສຸດ"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"ຟອງຫຼ້າສຸດ ແລະ ຟອງທີ່ປິດໄປຈະປາກົດຢູ່ບ່ອນນີ້"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"ຟອງ"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"ຈັດການ"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ປິດ Bubble ໄສ້ແລ້ວ."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-lo/strings_tv.xml b/libs/WindowManager/Shell/res/values-lo/strings_tv.xml
new file mode 100644
index 0000000..f6362c1
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-lo/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"ການສະແດງຜົນຊ້ອນກັນ"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ໂປຣແກຣມບໍ່ມີຊື່)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"ປິດ PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"ເຕັມໜ້າຈໍ"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml
new file mode 100644
index 0000000..b2ccd57
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-lt/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Uždaryti"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Išskleisti"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Nustatymai"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Meniu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> rodom. vaizdo vaizde"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Jei nenorite, kad „<xliff:g id="NAME">%s</xliff:g>“ naudotų šią funkciją, palietę atidarykite nustatymus ir išjunkite ją."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Leisti"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pristabdyti"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Praleisti ir eiti į kitą"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Praleisti ir eiti į ankstesnį"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Pakeisti dydį"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Programa gali neveikti naudojant išskaidyto ekrano režimą."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Programoje nepalaikomas skaidytas ekranas."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Programa gali neveikti antriniame ekrane."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Programa nepalaiko paleisties antriniuose ekranuose."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Skaidyto ekrano daliklis"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Kairysis ekranas viso ekrano režimu"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Kairysis ekranas 70 %"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kairysis ekranas 50 %"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Kairysis ekranas 30 %"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Dešinysis ekranas viso ekrano režimu"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Viršutinis ekranas viso ekrano režimu"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Viršutinis ekranas 70 %"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Viršutinis ekranas 50 %"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Viršutinis ekranas 30 %"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Apatinis ekranas viso ekrano režimu"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Vienos rankos režimo naudojimas"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Jei norite išeiti, perbraukite aukštyn nuo ekrano apačios arba palieskite bet kur virš programos"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Pradėti vienos rankos režimą"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Išeiti iš vienos rankos režimo"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ burbulų nustatymai"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Perpildymas"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Pridėti atgal į krūvą"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ iš „<xliff:g id="APP_NAME">%2$s</xliff:g>“"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ iš „<xliff:g id="APP_NAME">%2$s</xliff:g>“ ir dar <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Perkelti į viršų kairėje"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Perkelti į viršų dešinėje"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Perkelti į apačią kairėje"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Perkelti į apačią dešinėje"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ nustatymai"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Atsisakyti burbulo"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nerodyti pokalbio burbule"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Pokalbis naudojant burbulus"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nauji pokalbiai rodomi kaip slankiosios piktogramos arba burbulai. Palieskite, kad atidarytumėte burbulą. Vilkite, kad perkeltumėte."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Bet kada valdyti burbulus"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Palieskite „Tvarkyti“, kad išjungtumėte burbulus šioje programoje"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Supratau"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Nėra naujausių burbulų"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Naujausi ir atsisakyti burbulai bus rodomi čia"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Debesėlis"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Tvarkyti"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Debesėlio atsisakyta."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-lt/strings_tv.xml b/libs/WindowManager/Shell/res/values-lt/strings_tv.xml
new file mode 100644
index 0000000..e4695a0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-lt/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Vaizdas vaizde"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programa be pavadinimo)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Uždaryti PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Visas ekranas"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml
new file mode 100644
index 0000000..e6d0c77
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-lv/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Aizvērt"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Izvērst"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Iestatījumi"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Izvēlne"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> ir attēlā attēlā"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Ja nevēlaties lietotnē <xliff:g id="NAME">%s</xliff:g> izmantot šo funkciju, pieskarieties, lai atvērtu iestatījumus un izslēgtu funkciju."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Atskaņot"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Apturēt"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Pāriet uz nākamo"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Pāriet uz iepriekšējo"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Mainīt lielumu"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Iespējams, lietotne nedarbosies ekrāna sadalīšanas režīmā."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Lietotnē netiek atbalstīta ekrāna sadalīšana."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Lietotne, iespējams, nedarbosies sekundārajā displejā."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Lietotnē netiek atbalstīta palaišana sekundārajos displejos."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Ekrāna sadalītājs"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Kreisā daļa pa visu ekrānu"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Pa kreisi 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Pa kreisi 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Pa kreisi 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Labā daļa pa visu ekrānu"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Augšdaļa pa visu ekrānu"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Augšdaļa 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Augšdaļa 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Augšdaļa 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Apakšdaļu pa visu ekrānu"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Vienas rokas režīma izmantošana"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Lai izietu, velciet augšup no ekrāna apakšdaļas vai pieskarieties jebkurā vietā virs lietotnes"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Pāriet vienas rokas režīmā"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Iziet no vienas rokas režīma"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> burbuļu iestatījumi"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Pārpilde"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Pievienot atpakaļ kopai"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> no: <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> no lietotnes “<xliff:g id="APP_NAME">%2$s</xliff:g>” un vēl <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Pārvietot augšpusē pa kreisi"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Pārvietot augšpusē pa labi"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Pārvietot apakšpusē pa kreisi"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Pārvietot apakšpusē pa labi"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Lietotnes <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iestatījumi"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Nerādīt burbuli"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nerādīt sarunu burbuļos"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Tērzēšana, izmantojot burbuļus"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Jaunas sarunas tiek rādītas kā peldošas ikonas vai burbuļi. Pieskarieties, lai atvērtu burbuli. Velciet, lai to pārvietotu."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Allaž pārvaldīt burbuļus"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Pieskarieties pogai “Pārvaldīt”, lai izslēgtu burbuļus no šīs lietotnes."</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Labi"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Nav nesen aizvērtu burbuļu"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Šeit būs redzami nesen rādītie burbuļi un aizvērtie burbuļi"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Burbulis"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Pārvaldīt"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Burbulis ir noraidīts."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-lv/strings_tv.xml b/libs/WindowManager/Shell/res/values-lv/strings_tv.xml
new file mode 100644
index 0000000..f2b037f
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-lv/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Attēls attēlā"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programma bez nosaukuma)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Aizvērt PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Pilnekrāna režīms"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml
new file mode 100644
index 0000000..43f2881
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-mk/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Затвори"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Проширете"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Поставки"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Мени"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> е во слика во слика"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Ако не сакате <xliff:g id="NAME">%s</xliff:g> да ја користи функцијава, допрете за да ги отворите поставките и да ја исклучите."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Пушти"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Паузирај"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Прескокни до следната"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Прескокни до претходната"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Промени големина"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Апликацијата може да не работи со поделен екран."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Апликацијата не поддржува поделен екран."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Апликацијата може да не функционира на друг екран."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Апликацијата не поддржува стартување на други екрани."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Разделник на поделен екран"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Левиот на цел екран"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Левиот 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Левиот 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Левиот 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Десниот на цел екран"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Горниот на цел екран"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Горниот 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Горниот 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Горниот 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Долниот на цел екран"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Користење на режимот со една рака"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"За да излезете, повлечете нагоре од дното на екранот или допрете каде било над апликацијата"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Започни го режимот со една рака"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Излези од режимот со една рака"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Поставки за балончињата за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Прелевање"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Додајте назад во stack"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> од <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> од <xliff:g id="APP_NAME">%2$s</xliff:g> и уште <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Премести горе лево"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Премести горе десно"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Премести долу лево"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Премести долу десно"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Поставки за <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Отфрли балонче"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Не прикажувај го разговорот во балончиња"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Разговор во балончиња"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Новите разговори ќе се појавуваат како лебдечки икони или балончиња. Допрете за отворање на балончето. Повлечете за да го преместите."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Контролирајте ги балончињата во секое време"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Допрете „Управувајте“ за да ги исклучите балончињата од апликацијава"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Сфатив"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Нема неодамнешни балончиња"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Неодамнешните и отфрлените балончиња ќе се појавуваат тука"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Балонче"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Управувајте"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Балончето е отфрлено."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-mk/strings_tv.xml b/libs/WindowManager/Shell/res/values-mk/strings_tv.xml
new file mode 100644
index 0000000..25dc764
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-mk/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Слика во слика"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Програма без наслов)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Затвори PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Цел екран"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml
new file mode 100644
index 0000000..dfa4b22
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ml/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"അവസാനിപ്പിക്കുക"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"വികസിപ്പിക്കുക"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"ക്രമീകരണം"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"മെനു"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> ചിത്രത്തിനുള്ളിൽ ചിത്രം രീതിയിലാണ്"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g> ഈ ഫീച്ചർ ഉപയോഗിക്കേണ്ടെങ്കിൽ, ടാപ്പ് ചെയ്‌ത് ക്രമീകരണം തുറന്ന് അത് ഓഫാക്കുക."</string>
+    <string name="pip_play" msgid="3496151081459417097">"പ്ലേ ചെയ്യുക"</string>
+    <string name="pip_pause" msgid="690688849510295232">"താൽക്കാലികമായി നിർത്തുക"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"അടുത്തതിലേക്ക് പോകുക"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"മുമ്പത്തേതിലേക്ക് പോകുക"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"വലുപ്പം മാറ്റുക"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"സ്പ്ലിറ്റ്-സ്ക്രീനിനെ ആപ്പ് പിന്തുണയ്ക്കുന്നില്ല."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"രണ്ടാം ഡിസ്‌പ്ലേയിൽ ആപ്പ് പ്രവർത്തിച്ചേക്കില്ല."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"രണ്ടാം ഡിസ്‌പ്ലേകളിൽ സമാരംഭിക്കുന്നതിനെ ആപ്പ് അനുവദിക്കുന്നില്ല."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"സ്പ്ലിറ്റ്-സ്ക്രീൻ ഡിവൈഡർ"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ഇടത് പൂർണ്ണ സ്ക്രീൻ"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ഇടത് 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ഇടത് 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ഇടത് 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"വലത് പൂർണ്ണ സ്ക്രീൻ"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"മുകളിൽ പൂർണ്ണ സ്ക്രീൻ"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"മുകളിൽ 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"മുകളിൽ 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"മുകളിൽ 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"താഴെ പൂർണ്ണ സ്ക്രീൻ"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> ബബിളുകളുടെ ക്രമീകരണം"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ഓവർഫ്ലോ"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"അടുക്കുകളിലേക്ക് തിരിച്ച് ചേർക്കുക"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g>-ൽ നിന്നുള്ള <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> എന്നതിൽ നിന്നുള്ള <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> കൂടുതലും"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"മുകളിൽ ഇടതുഭാഗത്തേക്ക് നീക്കുക"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"മുകളിൽ വലതുഭാഗത്തേക്ക് നീക്കുക"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"ചുവടെ ഇടതുഭാഗത്തേക്ക് നീക്കുക"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"ചുവടെ വലതുഭാഗത്തേക്ക് നീക്കുക"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ക്രമീകരണം"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"ബബിൾ ഡിസ്മിസ് ചെയ്യൂ"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"സംഭാഷണം ബബിൾ ചെയ്യരുത്"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"ബബിളുകൾ ഉപയോഗിച്ച് ചാറ്റ് ചെയ്യുക"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"പുതിയ സംഭാഷണങ്ങൾ ഫ്ലോട്ടിംഗ് ഐക്കണുകളോ ബബിളുകളോ ആയി ദൃശ്യമാവുന്നു. ബബിൾ തുറക്കാൻ ടാപ്പ് ചെയ്യൂ. ഇത് നീക്കാൻ വലിച്ചിടുക."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ബബിളുകൾ ഏതുസമയത്തും നിയന്ത്രിക്കുക"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ഈ ആപ്പിൽ നിന്നുള്ള ബബിളുകൾ ഓഫാക്കാൻ മാനേജ് ചെയ്യുക ടാപ്പ് ചെയ്യുക"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"അടുത്തിടെയുള്ള ബബിളുകൾ ഒന്നുമില്ല"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"അടുത്തിടെയുള്ള ബബിളുകൾ, ഡിസ്മിസ് ചെയ്ത ബബിളുകൾ എന്നിവ ഇവിടെ ദൃശ്യമാവും"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"ബബ്ൾ"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"മാനേജ് ചെയ്യുക"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ബബ്ൾ ഡിസ്മിസ് ചെയ്തു."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ml/strings_tv.xml b/libs/WindowManager/Shell/res/values-ml/strings_tv.xml
new file mode 100644
index 0000000..7aaf79f
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ml/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(പേരില്ലാത്ത പ്രോഗ്രാം)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP അടയ്ക്കുക"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"പൂര്‍ണ്ണ സ്ക്രീന്‍"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml
new file mode 100644
index 0000000..044fd9f
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-mn/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Хаах"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Дэлгэх"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Тохиргоо"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Цэс"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> дэлгэцэн доторх дэлгэцэд байна"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Та <xliff:g id="NAME">%s</xliff:g>-д энэ онцлогийг ашиглуулахыг хүсэхгүй байвал тохиргоог нээгээд, үүнийг унтраана уу."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Тоглуулах"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Түр зогсоох"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Дараагийн медиад очих"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Өмнөх медиад очих"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Хэмжээг өөрчлөх"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Апп хуваагдсан дэлгэц дээр ажиллахгүй байж болзошгүй."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Энэ апп нь дэлгэц хуваах тохиргоог дэмждэггүй."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Апп хоёрдогч дэлгэцэд ажиллахгүй."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Аппыг хоёрдогч дэлгэцэд эхлүүлэх боломжгүй."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"\"Дэлгэц хуваах\" хуваагч"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Зүүн талын бүтэн дэлгэц"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Зүүн 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Зүүн 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Зүүн 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Баруун талын бүтэн дэлгэц"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Дээд талын бүтэн дэлгэц"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Дээд 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Дээд 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Дээд 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Доод бүтэн дэлгэц"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Нэг гарын горимыг ашиглаж байна"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Гарахын тулд дэлгэцийн доод хэсгээс дээш шударч эсвэл апп дээр хүссэн газраа товшино уу"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Нэг гарын горимыг эхлүүлэх"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Нэг гарын горимоос гарах"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н бөмбөлгүүдийн тохиргоо"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Халих"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Өрөлтөд буцааж нэмэх"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g>-н <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g>-н <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> болон бусад <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Зүүн дээш зөөх"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Баруун дээш зөөх"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Зүүн доош зөөх"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Баруун доош зөөх"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>-н тохиргоо"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Бөмбөлгийг хаах"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Харилцан яриаг бүү бөмбөлөг болго"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Бөмбөлөг ашиглан чатлаарай"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Шинэ харилцан яриа нь хөвөгч дүрс тэмдэг эсвэл бөмбөлөг хэлбэрээр харагддаг. Бөмбөлгийг нээхийн тулд товшино уу. Түүнийг зөөхийн тулд чирнэ үү."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Дурын үед бөмбөлгийг хянаарай"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Энэ аппын бөмбөлгүүдийг унтраахын тулд Удирдах дээр товшино уу"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Ойлголоо"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Саяхны бөмбөлөг алга байна"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Саяхны бөмбөлгүүд болон үл хэрэгссэн бөмбөлгүүд энд харагдана"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Бөмбөлөг"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Удирдах"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Бөмбөлгийг үл хэрэгссэн."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-mn/strings_tv.xml b/libs/WindowManager/Shell/res/values-mn/strings_tv.xml
new file mode 100644
index 0000000..55519d4
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-mn/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Дэлгэц доторх дэлгэц"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Гарчиггүй хөтөлбөр)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP-г хаах"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Бүтэн дэлгэц"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml
new file mode 100644
index 0000000..bd28756
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-mr/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"बंद करा"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"विस्तृत करा"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"सेटिंग्ज"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"मेनू"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> चित्रामध्ये चित्र मध्ये आहे"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g>ने हे वैशिष्ट्य वापरू नये असे तुम्हाला वाटत असल्यास, सेटिंग्ज उघडण्यासाठी टॅप करा आणि ते बंद करा."</string>
+    <string name="pip_play" msgid="3496151081459417097">"प्ले करा"</string>
+    <string name="pip_pause" msgid="690688849510295232">"थांबवा"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"डावलून पुढे जा"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"डावलून मागे जा"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"आकार बदला"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"अ‍ॅप स्क्रीन-विभाजनास समर्थन देत नाही."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"दुसऱ्या डिस्प्लेवर अ‍ॅप कदाचित चालणार नाही."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"दुसऱ्या डिस्प्लेवर अ‍ॅप लाँच होणार नाही."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"विभाजित-स्क्रीन विभाजक"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"डावी फुल स्क्रीन"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"डावी 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"डावी 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"डावी 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"उजवी फुल स्क्रीन"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"शीर्ष फुल स्क्रीन"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"शीर्ष 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"शीर्ष 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"शीर्ष 10"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"तळाशी फुल स्क्रीन"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> बबलसाठी सेटिंग्ज"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ओव्हरफ्लो"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"स्टॅकमध्ये परत जोडा"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> कडून <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> आणि आणखी <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> कडून <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"वर डावीकडे हलवा"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"वर उजवीकडे हलवा"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"तळाशी डावीकडे हलवा"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"तळाशी उजवीकडे हलवा"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> सेटिंग्ज"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"बबल डिसमिस करा"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"संभाषणाला बबल करू नका"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"बबल वापरून चॅट करा"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"नवीन संभाषणे फ्लोटिंग आयकन किंवा बबल म्हणून दिसतात. बबल उघडण्यासाठी टॅप करा. हे हलवण्यासाठी ड्रॅग करा."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"बबल कधीही नियंत्रित करा"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"या अ‍ॅपमधून बबल बंद करण्यासाठी व्यवस्थापित करा वर टॅप करा"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"अलीकडील कोणतेही बबल नाहीत"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"अलीकडील बबल आणि डिसमिस केलेले बबल येथे दिसतील"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"बबल"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"व्यवस्थापित करा"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"बबल डिसमिस केला."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-mr/strings_tv.xml b/libs/WindowManager/Shell/res/values-mr/strings_tv.xml
new file mode 100644
index 0000000..d9fc3b1
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-mr/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(शीर्षक नसलेला कार्यक्रम)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP बंद करा"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"फुल स्क्रीन"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml
new file mode 100644
index 0000000..6664f38
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ms/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Tutup"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Kembangkan"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Tetapan"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> terdapat dalam gambar dalam gambar"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Jika anda tidak mahu <xliff:g id="NAME">%s</xliff:g> menggunakan ciri ini, ketik untuk membuka tetapan dan matikan ciri."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Main"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Jeda"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Langkau ke seterusnya"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Langkau ke sebelumnya"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Ubah saiz"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Apl mungkin tidak berfungsi dengan skrin pisah."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Apl tidak menyokong skrin pisah."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Apl mungkin tidak berfungsi pada paparan kedua."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Apl tidak menyokong pelancaran pada paparan kedua."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Pembahagi skrin pisah"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Skrin penuh kiri"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Kiri 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kiri 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Kiri 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Skrin penuh kanan"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Skrin penuh atas"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Atas 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Atas 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Atas 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Skrin penuh bawah"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Menggunakan mod sebelah tangan"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Untuk keluar, leret ke atas daripada bahagian bawah skrin atau ketik pada mana-mana di bahagian atas apl"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Mulakan mod sebelah tangan"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Keluar daripada mod sebelah tangan"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Tetapan untuk gelembung <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Limpahan"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Tambah kembali pada tindanan"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> daripada <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> daripada <xliff:g id="APP_NAME">%2$s</xliff:g> dan <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> lagi"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Alihkan ke atas sebelah kiri"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Alihkan ke atas sebelah kanan"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Alihkan ke bawah sebelah kiri"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Alihkan ke bawah sebelah kanan"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Tetapan <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ketepikan gelembung"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Jangan jadikan perbualan dalam bentuk gelembung"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Bersembang menggunakan gelembung"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Perbualan baharu muncul sebagai ikon terapung atau gelembung. Ketik untuk membuka gelembung. Seret untuk mengalihkan gelembung tersebut."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Kawal gelembung pada bila-bila masa"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Ketik Urus untuk mematikan gelembung daripada apl ini"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Tiada gelembung terbaharu"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Gelembung baharu dan gelembung yang diketepikan akan dipaparkan di sini"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Gelembung"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Urus"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Gelembung diketepikan."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ms/strings_tv.xml b/libs/WindowManager/Shell/res/values-ms/strings_tv.xml
new file mode 100644
index 0000000..b2d7214
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ms/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Gambar dalam Gambar"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program tiada tajuk)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Tutup PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Skrin penuh"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml
new file mode 100644
index 0000000..b913a6b
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-my/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"ပိတ်ရန်"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"ချဲ့ရန်"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"ဆက်တင်များ"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"မီနူး"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> သည် တစ်ခုပေါ် တစ်ခုထပ်၍ ဖွင့်ထားသည်"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g> အား ဤဝန်ဆောင်မှုကို အသုံးမပြုစေလိုလျှင် ဆက်တင်ကိုဖွင့်ရန် တို့ပြီး ၎င်းဝန်ဆောင်မှုကို ပိတ်လိုက်ပါ။"</string>
+    <string name="pip_play" msgid="3496151081459417097">"ဖွင့်ရန်"</string>
+    <string name="pip_pause" msgid="690688849510295232">"ခေတ္တရပ်ရန်"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"နောက်တစ်ခုသို့ ကျော်ရန်"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"ယခင်တစ်ခုသို့ ပြန်သွားရန်"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"အရွယ်အစားပြောင်းရန်"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"အက်ပ်သည် မျက်နှာပြင်ခွဲပြရန် ပံ့ပိုးထားခြင်းမရှိပါ။"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ဤအက်ပ်အနေဖြင့် ဒုတိယဖန်သားပြင်ပေါ်တွင် အလုပ်လုပ်မည် မဟုတ်ပါ။"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ဤအက်ပ်အနေဖြင့် ဖွင့်ရန်စနစ်ကို ဒုတိယဖန်သားပြင်မှ အသုံးပြုရန် ပံ့ပိုးမထားပါ။"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"မျက်နှာပြင်ခွဲခြမ်း ပိုင်းခြားပေးသည့်စနစ်"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ဘယ်ဘက် မျက်နှာပြင်အပြည့်"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ဘယ်ဘက်မျက်နှာပြင် ၇၀%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ဘယ်ဘက် မျက်နှာပြင် ၅၀%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ဘယ်ဘက် မျက်နှာပြင် ၃၀%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ညာဘက် မျက်နှာပြင်အပြည့်"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"အပေါ်ဘက် မျက်နှာပြင်အပြည့်"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"အပေါ်ဘက် မျက်နှာပြင် ၇၀%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"အပေါ်ဘက် မျက်နှာပြင် ၅၀%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"အပေါ်ဘက် မျက်နှာပြင် ၃၀%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"အောက်ခြေ မျက်နှာပြင်အပြည့်"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> ပူဖောင်းကွက်အတွက် ဆက်တင်များ"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"အပိုများပြရန်"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ပူဖေါင်းတန်းသို့ ပြန်ထည့်ရန်"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> မှ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> နှင့် နောက်ထပ် <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ခုမှ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"ဘယ်ဘက်ထိပ်သို့ ရွှေ့ရန်"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"ညာဘက်ထိပ်သို့ ရွှေ့ပါ"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"ဘယ်အောက်ခြေသို့ ရွှေ့ရန်"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"ညာအောက်ခြေသို့ ရွှေ့ပါ"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ဆက်တင်များ"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"ပူဖောင်းကွက် ပယ်ရန်"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"စကားဝိုင်းကို ပူဖောင်းကွက် မပြုလုပ်ပါနှင့်"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"ပူဖောင်းကွက် သုံး၍ ချတ်လုပ်ခြင်း"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"စကားဝိုင်းအသစ်များကို မျောနေသည့် သင်္ကေတများ သို့မဟုတ် ပူဖောင်းကွက်များအဖြစ် မြင်ရပါမည်။ ပူဖောင်းကွက်ကိုဖွင့်ရန် တို့ပါ။ ရွှေ့ရန် ၎င်းကို ဖိဆွဲပါ။"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ပူဖောင်းကွက်ကို အချိန်မရွေး ထိန်းချုပ်ရန်"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ဤအက်ပ်မှနေ၍ ပူဖောင်းများကို ပိတ်ရန်အတွက် \'စီမံရန်\' ကို တို့ပါ"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"လတ်တလော ပူဖောင်းကွက်များ မရှိပါ"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"လတ်တလော ပူဖောင်းကွက်များနှင့် ပိတ်လိုက်သော ပူဖောင်းကွက်များကို ဤနေရာတွင် မြင်ရပါမည်"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"ပူဖောင်းဖောက်သံ"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"စီမံရန်"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ပူဖောင်းကွက် ဖယ်လိုက်သည်။"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-my/strings_tv.xml b/libs/WindowManager/Shell/res/values-my/strings_tv.xml
new file mode 100644
index 0000000..6d4d6f0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-my/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ခေါင်းစဉ်မဲ့ အစီအစဉ်)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP ကိုပိတ်ပါ"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"မျက်နှာပြင် အပြည့်"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml
new file mode 100644
index 0000000..986e890
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-nb/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Lukk"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Vis"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Innstillinger"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Meny"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> er i bilde-i-bilde"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Hvis du ikke vil at <xliff:g id="NAME">%s</xliff:g> skal bruke denne funksjonen, kan du trykke for å åpne innstillingene og slå den av."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Spill av"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Sett på pause"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Hopp til neste"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Hopp til forrige"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Endre størrelse"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Det kan hende at appen ikke fungerer med delt skjerm."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Appen støtter ikke delt skjerm."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Appen fungerer kanskje ikke på en sekundær skjerm."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Appen kan ikke kjøres på sekundære skjermer."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Skilleelement for delt skjerm"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Utvid den venstre delen av skjermen til hele skjermen"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Sett størrelsen på den venstre delen av skjermen til 70 %"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Sett størrelsen på den venstre delen av skjermen til 50 %"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Sett størrelsen på den venstre delen av skjermen til 30 %"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Utvid den høyre delen av skjermen til hele skjermen"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Utvid den øverste delen av skjermen til hele skjermen"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Sett størrelsen på den øverste delen av skjermen til 70 %"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Sett størrelsen på den øverste delen av skjermen til 50 %"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Sett størrelsen på den øverste delen av skjermen til 30 %"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Utvid den nederste delen av skjermen til hele skjermen"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Bruk av enhåndsmodus"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"For å avslutte, sveip opp fra bunnen av skjermen eller trykk hvor som helst over appen"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Start enhåndsmodus"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Avslutt enhåndsmodus"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Innstillinger for <xliff:g id="APP_NAME">%1$s</xliff:g>-bobler"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Overflyt"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Legg tilbake i stabelen"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g> og <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> flere"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Flytt til øverst til venstre"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Flytt til øverst til høyre"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Flytt til nederst til venstre"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Flytt til nederst til høyre"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>-innstillinger"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Lukk boblen"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ikke vis samtaler i bobler"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat med bobler"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nye samtaler vises som flytende ikoner eller bobler. Trykk for å åpne bobler. Dra for å flytte dem."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Kontrollér bobler når som helst"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Trykk på Administrer for å slå av bobler for denne appen"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Greit"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Ingen nylige bobler"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Nylige bobler og avviste bobler vises her"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Boble"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Administrer"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Boblen er avvist."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-nb/strings_tv.xml b/libs/WindowManager/Shell/res/values-nb/strings_tv.xml
new file mode 100644
index 0000000..8a7f315
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-nb/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Bilde-i-bilde"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program uten tittel)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Lukk PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Fullskjerm"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml
new file mode 100644
index 0000000..0369c6d
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ne/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"बन्द गर्नुहोस्"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"विस्तृत गर्नुहोस्"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"सेटिङहरू"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"मेनु"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> Picture-in-picture मा छ"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"तपाईं <xliff:g id="NAME">%s</xliff:g> ले सुविधा प्रयोग नगरोस् भन्ने चाहनुहुन्छ भने ट्याप गरेर सेटिङहरू खोल्नुहोस् र यसलाई निष्क्रिय पार्नुहोस्।"</string>
+    <string name="pip_play" msgid="3496151081459417097">"प्ले गर्नुहोस्"</string>
+    <string name="pip_pause" msgid="690688849510295232">"पज गर्नुहोस्"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"अर्कोमा जानुहोस्"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"अघिल्लोमा जानुहोस्"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"आकार बदल्नुहोस्"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"एप विभाजित स्क्रिनमा काम नगर्न सक्छ।"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"अनुप्रयोगले विभाजित-स्क्रिनलाई समर्थन गर्दैन।"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"यो अनुप्रयोगले सहायक प्रदर्शनमा काम नगर्नसक्छ।"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"अनुप्रयोगले सहायक प्रदर्शनहरूमा लञ्च सुविधालाई समर्थन गर्दैन।"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"विभाजित-स्क्रिन छुट्याउने"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"बायाँ भाग फुल स्क्रिन"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"बायाँ भाग ७०%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"बायाँ भाग ५०%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"बायाँ भाग ३०%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"दायाँ भाग फुल स्क्रिन"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"माथिल्लो भाग फुल स्क्रिन"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"माथिल्लो भाग ७०%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"माथिल्लो भाग ५०%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"माथिल्लो भाग ३०%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"तल्लो भाग फुल स्क्रिन"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"एक हाते मोड प्रयोग गरिँदै छ"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"बाहिर निस्कन, स्क्रिनको पुछारबाट माथितिर स्वाइप गर्नुहोस् वा एपभन्दा माथि जुनसुकै ठाउँमा ट्याप गर्नुहोस्"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"एक हाते मोड सुरु गर्नुहोस्"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"एक हाते मोडबाट बाहिरिनुहोस्"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> का बबलसम्बन्धी सेटिङहरू"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ओभरफ्लो देखाउनुहोस्"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"स्ट्याकमा फेरि थप्नुहोस्"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> को <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> का <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> र थप <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"शीर्ष भागको बायाँतिर सार्नुहोस्"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"सिरानमा दायाँतिर सार्नुहोस्"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"पुछारमा बायाँतिर सार्नुहोस्"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"पुछारमा दायाँतिर सार्नुहोस्"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> का सेटिङहरू"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"बबल खारेज गर्नुहोस्"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"वार्तालाप बबलको रूपमा नदेखाइयोस्"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"बबलहरू प्रयोग गरी कुराकानी गर्नुहोस्"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"नयाँ वार्तालापहरू तैरने आइकन वा बबलका रूपमा देखिन्छन्। बबल खोल्न ट्याप गर्नुहोस्। बबल सार्न सो बबललाई ड्र्याग गर्नुहोस्।"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"जुनसुकै बेला बबलहरू नियन्त्रण गर्नुहोस्"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"यो एपबाट आएका बबलहरू अफ गर्न \"व्यवस्थापन गर्नुहोस्\" बटनमा ट्याप गर्नुहोस्"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"बुझेँ"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"हालैका बबलहरू छैनन्"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"हालैका बबल र खारेज गरिएका बबलहरू यहाँ देखिने छन्"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"बबल"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"व्यवस्थापन गर्नुहोस्"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"बबल हटाइयो।"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ne/strings_tv.xml b/libs/WindowManager/Shell/res/values-ne/strings_tv.xml
new file mode 100644
index 0000000..87fa327
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ne/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-Picture"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(शीर्षकविहीन कार्यक्रम)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP लाई बन्द गर्नुहोस्"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"फुल स्क्रिन"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml
new file mode 100644
index 0000000..26c276e
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-nl/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Sluiten"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Uitvouwen"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Instellingen"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> is in scherm-in-scherm"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Afspelen"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Onderbreken"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Doorgaan naar volgende"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Teruggaan naar vorige"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Formaat aanpassen"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"De app werkt mogelijk niet met gesplitst scherm."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"App biedt geen ondersteuning voor gesplitst scherm."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"App werkt mogelijk niet op een secundair scherm."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"App kan niet op secundaire displays worden gestart."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Scheiding voor gesplitst scherm"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Linkerscherm op volledig scherm"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Linkerscherm 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Linkerscherm 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Linkerscherm 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Rechterscherm op volledig scherm"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Bovenste scherm op volledig scherm"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Bovenste scherm 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Bovenste scherm 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Bovenste scherm 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Onderste scherm op volledig scherm"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Bediening met één hand gebruiken"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Als je wilt afsluiten, swipe je omhoog vanaf de onderkant van het scherm of tik je ergens boven de app"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Bediening met één hand starten"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Bediening met één hand afsluiten"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Instellingen voor <xliff:g id="APP_NAME">%1$s</xliff:g>-bubbels"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Overloop"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Weer toevoegen aan stack"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> van <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> van <xliff:g id="APP_NAME">%2$s</xliff:g> en nog <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Naar linksboven verplaatsen"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Naar rechtsboven verplaatsen"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Naar linksonder verplaatsen"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Naar rechtsonder verplaatsen"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Instellingen voor <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Bubbel sluiten"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Gesprekken niet in bubbels weergeven"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatten met bubbels"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nieuwe gesprekken worden weergegeven als zwevende iconen of \'bubbels\'. Tik om een bubbel te openen. Sleep om de bubbel te verplaatsen."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Beheer bubbels wanneer je wilt"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tik op Beheren om bubbels van deze app uit te schakelen"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Geen recente bubbels"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Recente bubbels en gesloten bubbels worden hier weergegeven"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bubbel"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Beheren"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubbel gesloten."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-nl/strings_tv.xml b/libs/WindowManager/Shell/res/values-nl/strings_tv.xml
new file mode 100644
index 0000000..df3809e
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-nl/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Scherm-in-scherm"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Naamloos programma)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP sluiten"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Volledig scherm"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml
new file mode 100644
index 0000000..2b27c99
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-or/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"ବନ୍ଦ କରନ୍ତୁ"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"ବଢ଼ାନ୍ତୁ"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"ସେଟିଂସ୍"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"ମେନୁ"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> \"ଛବି-ଭିତରେ-ଛବି\"ରେ ଅଛି"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"ଏହି ବୈଶିଷ୍ଟ୍ୟ <xliff:g id="NAME">%s</xliff:g> ବ୍ୟବହାର ନକରିବାକୁ ଯଦି ଆପଣ ଚାହାଁନ୍ତି, ସେଟିଙ୍ଗ ଖୋଲିବାକୁ ଟାପ୍‍ କରନ୍ତୁ ଏବଂ ଏହା ଅଫ୍‍ କରିଦିଅନ୍ତୁ।"</string>
+    <string name="pip_play" msgid="3496151081459417097">"ପ୍ଲେ କରନ୍ତୁ"</string>
+    <string name="pip_pause" msgid="690688849510295232">"ପଜ୍‍ କରନ୍ତୁ"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"ପରବର୍ତ୍ତୀକୁ ଯାଆନ୍ତୁ"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"ପୂର୍ବବର୍ତ୍ତୀକୁ ଛାଡ଼ନ୍ତୁ"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ରିସାଇଜ୍ କରନ୍ତୁ"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ଆପ୍‍ ସ୍ପ୍ଲିଟ୍‍-ସ୍କ୍ରୀନକୁ ସପୋର୍ଟ କରେ ନାହିଁ।"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ସେକେଣ୍ଡାରୀ ଡିସପ୍ଲେରେ ଆପ୍‍ କାମ ନକରିପାରେ।"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ସେକେଣ୍ଡାରୀ ଡିସପ୍ଲେରେ ଆପ୍‍ ଲଞ୍ଚ ସପୋର୍ଟ କରେ ନାହିଁ।"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"ସ୍ପ୍ଲିଟ୍‍-ସ୍କ୍ରୀନ ବିଭାଜକ"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ବାମ ପଟକୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍‍ କରନ୍ତୁ"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ବାମ ପଟକୁ 70% କରନ୍ତୁ"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ବାମ ପଟକୁ 50% କରନ୍ତୁ"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ବାମ ପଟେ 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ଡାହାଣ ପଟକୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍‍ କରନ୍ତୁ"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ଉପର ଆଡ଼କୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍‍ କରନ୍ତୁ"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ଉପର ଆଡ଼କୁ 70% କରନ୍ତୁ"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ଉପର ଆଡ଼କୁ 50% କରନ୍ତୁ"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ଉପର ଆଡ଼କୁ 30% କରନ୍ତୁ"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"ତଳ ଅଂଶର ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍‍"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବବଲ୍‌ଗୁଡ଼ିକ ପାଇଁ ସେଟିଂସ୍"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ଓଭରଫ୍ଲୋ"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ଷ୍ଟାକରେ ପୁଣି ଯୋଗ କରନ୍ତୁ"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g>ରୁ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> ଏବଂ ଅଧିକ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>ଟିରୁ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"ଉପର ବାମକୁ ନିଅନ୍ତୁ"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"ଉପର-ଡାହାଣକୁ ନିଅନ୍ତୁ"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"ତଳ ବାମକୁ ନିଅନ୍ତୁ"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"ତଳ ଡାହାଣକୁ ନିଅନ୍ତୁ"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ସେଟିଂସ୍"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"ବବଲ୍ ଖାରଜ କରନ୍ତୁ"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"ବାର୍ତ୍ତାଳାପକୁ ବବଲ୍ କରନ୍ତୁ ନାହିଁ"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"ବବଲଗୁଡ଼ିକୁ ବ୍ୟବହାର କରି ଚାଟ୍ କରନ୍ତୁ"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"ନୂଆ ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ ଫ୍ଲୋଟିଂ ଆଇକନ୍ କିମ୍ବା ବବଲ୍ ଭାବେ ଦେଖାଯିବ। ବବଲ୍ ଖୋଲିବାକୁ ଟାପ୍ କରନ୍ତୁ। ଏହାକୁ ମୁଭ୍ କରିବାକୁ ଟାଣନ୍ତୁ।"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ଯେ କୌଣସି ସମୟରେ ବବଲଗୁଡ଼ିକ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ଏହି ଆପର ବବଲଗୁଡ଼ିକ ବନ୍ଦ କରିବା ପାଇଁ \'ପରିଚାଳନା କରନ୍ତୁ\' ବଟନରେ ଟାପ୍ କରନ୍ତୁ"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ବର୍ତ୍ତମାନ କୌଣସି ବବଲ୍ ନାହିଁ"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"ବର୍ତ୍ତମାନର ଏବଂ ଖାରଜ କରାଯାଇଥିବା ବବଲଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯିବ"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"ବବଲ୍"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"ପରିଚାଳନା କରନ୍ତୁ"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ବବଲ୍ ଖାରଜ କରାଯାଇଛି।"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-or/strings_tv.xml b/libs/WindowManager/Shell/res/values-or/strings_tv.xml
new file mode 100644
index 0000000..b57dd93
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-or/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(କୌଣସି ଟାଇଟଲ୍‍ ପ୍ରୋଗ୍ରାମ୍‍ ନାହିଁ)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP ବନ୍ଦ କରନ୍ତୁ"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍‍"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml
new file mode 100644
index 0000000..b9cb65e
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-pa/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"ਬੰਦ ਕਰੋ"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"ਵਿਸਤਾਰ ਕਰੋ"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"ਸੈਟਿੰਗਾਂ"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"ਮੀਨੂ"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> ਤਸਵੀਰ-ਅੰਦਰ-ਤਸਵੀਰ ਵਿੱਚ ਹੈ"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"ਜੇਕਰ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string>
+    <string name="pip_play" msgid="3496151081459417097">"ਚਲਾਓ"</string>
+    <string name="pip_pause" msgid="690688849510295232">"ਵਿਰਾਮ ਦਿਓ"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"ਅਗਲੇ \'ਤੇ ਜਾਓ"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"ਪਿਛਲੇ \'ਤੇ ਜਾਓ"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ਆਕਾਰ ਬਦਲੋ"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ਐਪ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਨੂੰ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ।"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇ \'ਤੇ ਕੰਮ ਨਾ ਕਰੇ।"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇਆਂ \'ਤੇ ਲਾਂਚ ਕਰਨ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਡਿਵਾਈਡਰ"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ਖੱਬੇ ਪੂਰੀ ਸਕ੍ਰੀਨ"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ਖੱਬੇ 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ਖੱਬੇ 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ਖੱਬੇ 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ਸੱਜੇ ਪੂਰੀ ਸਕ੍ਰੀਨ"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ਉੱਪਰ ਪੂਰੀ ਸਕ੍ਰੀਨ"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ਉੱਪਰ 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ਉੱਪਰ 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ਉੱਪਰ 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"ਹੇਠਾਂ ਪੂਰੀ ਸਕ੍ਰੀਨ"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਬਬਲ ਲਈ ਸੈਟਿੰਗਾਂ"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ਓਵਰਫ਼ਲੋ"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ਸਟੈਕ ਵਿੱਚ ਵਾਪਸ ਸ਼ਾਮਲ ਕਰੋ"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> ਤੋਂ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> ਅਤੇ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ਹੋਰਾਂ ਤੋਂ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"ਉੱਪਰ ਵੱਲ ਖੱਬੇ ਲਿਜਾਓ"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"ਉੱਪਰ ਵੱਲ ਸੱਜੇ ਲਿਜਾਓ"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"ਹੇਠਾਂ ਵੱਲ ਖੱਬੇ ਲਿਜਾਓ"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"ਹੇਠਾਂ ਵੱਲ ਸੱਜੇ ਲਿਜਾਓ"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ਸੈਟਿੰਗਾਂ"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"ਬਬਲ ਨੂੰ ਖਾਰਜ ਕਰੋ"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"ਗੱਲਬਾਤ \'ਤੇ ਬਬਲ ਨਾ ਲਾਓ"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"ਬਬਲ ਵਰਤਦੇ ਹੋਏ ਚੈਟ ਕਰੋ"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"ਨਵੀਆਂ ਗੱਲਾਂਬਾਤਾਂ ਫਲੋਟਿੰਗ ਪ੍ਰਤੀਕਾਂ ਜਾਂ ਬਬਲ ਦੇ ਰੂਪ ਵਿੱਚ ਦਿਸਦੀਆਂ ਹਨ। ਬਬਲ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ। ਇਸਨੂੰ ਲਿਜਾਣ ਲਈ ਘਸੀਟੋ।"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ਬਬਲ ਨੂੰ ਕਿਸੇ ਵੇਲੇ ਵੀ ਕੰਟਰੋਲ ਕਰੋ"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ਇਸ ਐਪ \'ਤੇ ਬਬਲ ਬੰਦ ਕਰਨ ਲਈ \'ਪ੍ਰਬੰਧਨ ਕਰੋ\' \'ਤੇ ਟੈਪ ਕਰੋ"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ਕੋਈ ਹਾਲੀਆ ਬਬਲ ਨਹੀਂ"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"ਹਾਲੀਆ ਬਬਲ ਅਤੇ ਖਾਰਜ ਕੀਤੇ ਬਬਲ ਇੱਥੇ ਦਿਸਣਗੇ"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"ਬੁਲਬੁਲਾ"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ਬਬਲ ਨੂੰ ਖਾਰਜ ਕੀਤਾ ਗਿਆ।"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-pa/strings_tv.xml b/libs/WindowManager/Shell/res/values-pa/strings_tv.xml
new file mode 100644
index 0000000..028a0a0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-pa/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ਸਿਰਲੇਖ-ਰਹਿਤ ਪ੍ਰੋਗਰਾਮ)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP ਬੰਦ ਕਰੋ"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"ਪੂਰੀ ਸਕ੍ਰੀਨ"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml
new file mode 100644
index 0000000..6b640b5
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-pl/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Zamknij"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Rozwiń"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Ustawienia"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"Aplikacja <xliff:g id="NAME">%s</xliff:g> działa w trybie obraz w obrazie"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Jeśli nie chcesz, by aplikacja <xliff:g id="NAME">%s</xliff:g> korzystała z tej funkcji, otwórz ustawienia i wyłącz ją."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Odtwórz"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Wstrzymaj"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Dalej"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Wstecz"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Zmień rozmiar"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacja może nie działać przy podzielonym ekranie."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacja nie obsługuje dzielonego ekranu."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacja może nie działać na dodatkowym ekranie."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikacja nie obsługuje uruchamiania na dodatkowych ekranach."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Linia dzielenia ekranu"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Lewa część ekranu na pełnym ekranie"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70% lewej części ekranu"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% lewej części ekranu"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30% lewej części ekranu"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Prawa część ekranu na pełnym ekranie"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Górna część ekranu na pełnym ekranie"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70% górnej części ekranu"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50% górnej części ekranu"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"30% górnej części ekranu"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Dolna część ekranu na pełnym ekranie"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Korzystanie z trybu jednej ręki"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Aby zamknąć, przesuń palcem z dołu ekranu w górę lub kliknij dowolne miejsce nad aplikacją"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Uruchom tryb jednej ręki"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Zamknij tryb jednej ręki"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Ustawienia dymków aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Przepełnienie"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Dodaj ponownie do stosu"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikacji <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikacji <xliff:g id="APP_NAME">%2$s</xliff:g> i jeszcze <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Przenieś w lewy górny róg"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Przenieś w prawy górny róg"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Przenieś w lewy dolny róg"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Przenieś w prawy dolny róg"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> – ustawienia"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Zamknij dymek"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nie wyświetlaj rozmowy jako dymka"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Czatuj, korzystając z dymków"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nowe rozmowy będą wyświetlane jako pływające ikony lub dymki. Kliknij, by otworzyć dymek. Przeciągnij, by go przenieść."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Zarządzaj dymkami w dowolnym momencie"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Kliknij Zarządzaj, aby wyłączyć dymki z tej aplikacji"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Brak ostatnich dymków"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Tutaj będą pojawiać się ostatnie i odrzucone dymki"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Dymek"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Zarządzaj"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Zamknięto dymek"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-pl/strings_tv.xml b/libs/WindowManager/Shell/res/values-pl/strings_tv.xml
new file mode 100644
index 0000000..286fd7b
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-pl/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Obraz w obrazie"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program bez tytułu)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Zamknij PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Pełny ekran"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..465d2d1
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Fechar"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Expandir"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Configurações"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> está em picture-in-picture"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Se você não quer que o app <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Reproduzir"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pausar"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Pular para a próxima"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Pular para a anterior"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Redimensionar"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"É possível que o app não funcione com a tela dividida."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"O app não é compatível com a divisão de tela."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"É possível que o app não funcione em uma tela secundária."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"O app não é compatível com a inicialização em telas secundárias."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Divisor de tela"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Lado esquerdo em tela cheia"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Esquerda a 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Esquerda a 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Esquerda a 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Lado direito em tela cheia"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Parte superior em tela cheia"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Parte superior a 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Parte superior a 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Parte superior a 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Parte inferior em tela cheia"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Como usar o modo para uma mão"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para sair, deslize de baixo para cima na tela ou toque em qualquer lugar acima do app"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar o modo para uma mão"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Sair do modo para uma mão"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Configurações de balões do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Menu flutuante"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Devolver à pilha"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> mais <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Mover para canto superior esquerdo"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Mover para canto superior direito"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Mover para canto inferior esquerdo"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Mover para canto inferior direito"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Configurações de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Dispensar balão"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Não criar balões de conversa"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Converse usando balões"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Novas conversas aparecerão como ícones flutuantes, ou balões. Toque para abrir o balão. Arraste para movê-lo."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Controle os balões a qualquer momento"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Toque em \"Gerenciar\" para desativar os balões desse app"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Ok"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Nenhum balão recente"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Os balões recentes e dispensados aparecerão aqui"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bolha"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Gerenciar"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balão dispensado."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings_tv.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings_tv.xml
new file mode 100644
index 0000000..57edcdf
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-picture"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(programa sem título)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Fechar PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Tela cheia"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..df841bf
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Fechar"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Expandir"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Definições"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"A app <xliff:g id="NAME">%s</xliff:g> está no modo de ecrã no ecrã"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Se não pretende que a app <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Reproduzir"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pausar"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Mudar para o seguinte"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Mudar para o anterior"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Redimensionar"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"A app pode não funcionar com o ecrã dividido."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"A app não é compatível com o ecrã dividido."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"A app pode não funcionar num ecrã secundário."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"A app não é compatível com o início em ecrãs secundários."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Divisor do ecrã dividido"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ecrã esquerdo inteiro"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"70% no ecrã esquerdo"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% no ecrã esquerdo"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30% no ecrã esquerdo"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Ecrã direito inteiro"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Ecrã superior inteiro"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70% no ecrã superior"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50% no ecrã superior"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"30% no ecrã superior"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Ecrã inferior inteiro"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Utilize o modo para uma mão"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para sair, deslize rapidamente para cima a partir da parte inferior do ecrã ou toque em qualquer ponto acima da app."</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar o modo para uma mão"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Sair do modo para uma mão"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Definições dos balões da app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Menu adicional"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Adicionar novamente à pilha"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> do <xliff:g id="APP_NAME">%2$s</xliff:g> e mais<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>."</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Mover p/ parte sup. esquerda"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Mover parte superior direita"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Mover p/ parte infer. esquerda"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Mover parte inferior direita"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Definições de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ignorar balão"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Não apresentar a conversa em balões"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Converse no chat através de balões"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"As novas conversas aparecem como ícones flutuantes ou balões. Toque para abrir o balão. Arraste para o mover."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Controle os balões em qualquer altura"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Toque em Gerir para desativar os balões desta app."</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Nenhum balão recente"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Os balões recentes e ignorados vão aparecer aqui."</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Balão"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Gerir"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balão ignorado."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings_tv.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings_tv.xml
new file mode 100644
index 0000000..9372e0f
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Ecrã no ecrã"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Sem título do programa)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Fechar PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Ecrã inteiro"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml
new file mode 100644
index 0000000..465d2d1
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-pt/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Fechar"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Expandir"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Configurações"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> está em picture-in-picture"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Se você não quer que o app <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Reproduzir"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pausar"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Pular para a próxima"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Pular para a anterior"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Redimensionar"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"É possível que o app não funcione com a tela dividida."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"O app não é compatível com a divisão de tela."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"É possível que o app não funcione em uma tela secundária."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"O app não é compatível com a inicialização em telas secundárias."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Divisor de tela"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Lado esquerdo em tela cheia"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Esquerda a 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Esquerda a 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Esquerda a 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Lado direito em tela cheia"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Parte superior em tela cheia"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Parte superior a 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Parte superior a 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Parte superior a 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Parte inferior em tela cheia"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Como usar o modo para uma mão"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para sair, deslize de baixo para cima na tela ou toque em qualquer lugar acima do app"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar o modo para uma mão"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Sair do modo para uma mão"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Configurações de balões do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Menu flutuante"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Devolver à pilha"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> mais <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Mover para canto superior esquerdo"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Mover para canto superior direito"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Mover para canto inferior esquerdo"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Mover para canto inferior direito"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Configurações de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Dispensar balão"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Não criar balões de conversa"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Converse usando balões"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Novas conversas aparecerão como ícones flutuantes, ou balões. Toque para abrir o balão. Arraste para movê-lo."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Controle os balões a qualquer momento"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Toque em \"Gerenciar\" para desativar os balões desse app"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Ok"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Nenhum balão recente"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Os balões recentes e dispensados aparecerão aqui"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bolha"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Gerenciar"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balão dispensado."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt/strings_tv.xml b/libs/WindowManager/Shell/res/values-pt/strings_tv.xml
new file mode 100644
index 0000000..57edcdf
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-pt/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-picture"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(programa sem título)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Fechar PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Tela cheia"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml
new file mode 100644
index 0000000..55a4376
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ro/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Închideți"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Extindeți"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Setări"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Meniu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> este în modul picture-in-picture"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Dacă nu doriți ca <xliff:g id="NAME">%s</xliff:g> să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Redați"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Întrerupeți"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Treceți la următorul"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Treceți la cel anterior"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Redimensionați"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Este posibil ca aplicația să nu funcționeze cu ecranul împărțit."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplicația nu acceptă ecranul împărțit."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Este posibil ca aplicația să nu funcționeze pe un ecran secundar."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplicația nu acceptă lansare pe ecrane secundare."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Separator pentru ecranul împărțit"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Partea stângă pe ecran complet"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Partea stângă: 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Partea stângă: 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Partea stângă: 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Partea dreaptă pe ecran complet"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Partea de sus pe ecran complet"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Partea de sus: 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Partea de sus: 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Partea de sus: 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Partea de jos pe ecran complet"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Folosirea modului cu o mână"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Pentru a ieși, glisați în sus din partea de jos a ecranului sau atingeți oriunde deasupra ferestrei aplicației"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Activați modul cu o mână"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Părăsiți modul cu o mână"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Setări pentru baloanele <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Suplimentar"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Adăugați înapoi în stivă"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de la <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de la <xliff:g id="APP_NAME">%2$s</xliff:g> și încă <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Mutați în stânga sus"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Mutați în dreapta sus"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Mutați în stânga jos"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Mutați în dreapta jos"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Setări <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Închideți balonul"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nu afișați conversația în balon"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chat cu baloane"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Conversațiile noi apar ca pictograme flotante sau baloane. Atingeți pentru a deschide balonul. Trageți pentru a-l muta."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Controlați oricând baloanele"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Atingeți Gestionați pentru a dezactiva baloanele din această aplicație"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Nu există baloane recente"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Baloanele recente și baloanele respinse vor apărea aici"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Balon"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestionați"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balonul a fost respins."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ro/strings_tv.xml b/libs/WindowManager/Shell/res/values-ro/strings_tv.xml
new file mode 100644
index 0000000..9438e49
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ro/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-picture"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program fără titlu)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Închideți PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Ecran complet"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml
new file mode 100644
index 0000000..8ae00d2
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ru/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Закрыть"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Развернуть"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Настройки"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Меню"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> находится в режиме \"Картинка в картинке\""</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Чтобы отключить эту функцию для приложения \"<xliff:g id="NAME">%s</xliff:g>\", перейдите в настройки."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Воспроизвести"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Приостановить"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Перейти к следующему"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Перейти к предыдущему"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Изменить размер"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"В режиме разделения экрана приложение может работать нестабильно."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Приложение не поддерживает разделение экрана."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Приложение может не работать на дополнительном экране"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Приложение не поддерживает запуск на дополнительных экранах"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Разделитель экрана"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Левый во весь экран"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Левый на 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Левый на 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Левый на 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Правый во весь экран"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Верхний во весь экран"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Верхний на 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Верхний на 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Верхний на 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Нижний во весь экран"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Использование режима управления одной рукой"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Чтобы выйти, проведите по экрану снизу вверх или коснитесь области за пределами приложения."</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Запустить режим управления одной рукой"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Выйти из режима управления одной рукой"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Настройки всплывающих чатов от приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Дополнительное меню"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Добавить обратно в стек"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> из приложения \"<xliff:g id="APP_NAME">%2$s</xliff:g>\""</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> от приложения \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" и ещё <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Перенести в левый верхний угол"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Перенести в правый верхний угол"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Перенести в левый нижний угол"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Перенести в правый нижний угол"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>: настройки"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Скрыть всплывающий чат"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Не показывать всплывающий чат для разговора"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Всплывающие чаты"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Новые разговоры будут появляться в виде плавающих значков, или всплывающих чатов. Чтобы открыть чат, нажмите на него, а чтобы переместить – перетащите."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Всплывающие чаты"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Чтобы отключить всплывающие чаты из этого приложения, нажмите \"Настроить\"."</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"ОК"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Нет недавних всплывающих чатов"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Здесь будут появляться недавние и скрытые всплывающие чаты."</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Всплывающая подсказка"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Настроить"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Всплывающий чат закрыт."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ru/strings_tv.xml b/libs/WindowManager/Shell/res/values-ru/strings_tv.xml
new file mode 100644
index 0000000..24785aa
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ru/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Картинка в картинке"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Без названия)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"\"Кадр в кадре\" – выйти"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Во весь экран"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml
new file mode 100644
index 0000000..081926f
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-si/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"වසන්න"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"දිග හරින්න"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"සැකසීම්"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"මෙනුව"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> පින්තූරය-තුළ-පින්තූරය තුළ වේ"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"ඔබට <xliff:g id="NAME">%s</xliff:g> මෙම විශේෂාංගය භාවිත කිරීමට අවශ්‍ය නැති නම්, සැකසීම් විවෘත කිරීමට තට්ටු කර එය ක්‍රියාවිරහිත කරන්න."</string>
+    <string name="pip_play" msgid="3496151081459417097">"ධාවනය කරන්න"</string>
+    <string name="pip_pause" msgid="690688849510295232">"විරාම කරන්න"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"ඊළඟ එකට පනින්න"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"පෙර එකට පනින්න"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ප්‍රතිප්‍රමාණ කරන්න"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"යෙදුම බෙදුම් තිරය සමග ක්‍රියා නොකළ හැකිය"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"යෙදුම බෙදුණු-තිරය සඳහා සහාය නොදක්වයි."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"යෙදුම ද්විතියික සංදර්ශකයක ක්‍රියා නොකළ හැකිය."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"යෙදුම ද්විතීයික සංදර්ශක මත දියත් කිරීම සඳහා සහාය නොදක්වයි."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"බෙදුම්-තිර වෙන්කරණය"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"වම් පූර්ණ තිරය"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"වම් 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"වම් 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"වම් 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"දකුණු පූර්ණ තිරය"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ඉහළම පූර්ණ තිරය"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ඉහළම 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ඉහළම 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ඉහළම 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"පහළ පූර්ණ තිරය"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"තනි-අත් ප්‍රකාරය භාවිත කරමින්"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"පිටවීමට, තිරයේ පහළ සිට ඉහළට ස්වයිප් කරන්න හෝ යෙදුමට ඉහළින් ඕනෑම තැනක තට්ටු කරන්න"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"තනි අත් ප්‍රකාරය ආරම්භ කරන්න"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"තනි අත් ප්‍රකාරයෙන් පිටවන්න"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> බුබුළු සඳහා සැකසීම්"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"පිටාර යාම"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"අට්ටිය වෙත ආපසු එක් කරන්න"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> වෙතින් <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> වෙතින් <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> සහ තවත් <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ක්"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"ඉහළ වමට ගෙන යන්න"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"ඉහළ දකුණට ගෙන යන්න"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"පහළ වමට ගෙන යන්න"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"පහළ දකුණට ගෙන යන්න"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> සැකසීම්"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"බුබුලු ඉවත ලන්න"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"සංවාදය බුබුලු නොදමන්න"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"බුබුලු භාවිතයෙන් කතාබහ කරන්න"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"නව සංවාද පාවෙන අයිකන හෝ බුබුලු ලෙස දිස් වේ. බුබුල විවෘත කිරීමට තට්ටු කරන්න. එය ගෙන යාමට අදින්න."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ඕනෑම වේලාවක බුබුලු පාලනය කරන්න"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"මෙම යෙදුමෙන් බුබුලු ක්‍රියාවිරහිත කිරීමට කළමනාකරණය කරන්න තට්ටු කරන්න"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"තේරුණා"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"මෑත බුබුලු නැත"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"මෑත බුබුලු සහ ඉවත ලූ බුබුලු මෙහි දිස් වනු ඇත"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"බුබුළු"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"කළමනා කරන්න"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"බුබුල ඉවත දමා ඇත."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-si/strings_tv.xml b/libs/WindowManager/Shell/res/values-si/strings_tv.xml
new file mode 100644
index 0000000..62ee6d4
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-si/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"පින්තූරය-තුළ-පින්තූරය"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(මාතෘකාවක් නැති වැඩසටහන)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP වසන්න"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"සම්පූර්ණ තිරය"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml
new file mode 100644
index 0000000..24fded7
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-sk/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Zavrieť"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Rozbaliť"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Nastavenia"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Ponuka"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> je v režime obraz v obraze"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Ak nechcete, aby aplikácia <xliff:g id="NAME">%s</xliff:g> používala túto funkciu, klepnutím otvorte nastavenia a vypnite ju."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Prehrať"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pozastaviť"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Preskočiť na ďalšie"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Preskočiť na predchádzajúce"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Zmeniť veľkosť"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikácia nemusí fungovať s rozdelenou obrazovkou."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikácia nepodporuje rozdelenú obrazovku."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikácia nemusí fungovať na sekundárnej obrazovke."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikácia nepodporuje spúšťanie na sekundárnych obrazovkách."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Rozdeľovač obrazovky"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ľavá – na celú obrazovku"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Ľavá – 70 %"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ľavá – 50 %"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ľavá – 30 %"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pravá– na celú obrazovku"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Horná – na celú obrazovku"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Horná – 70 %"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Horná – 50 %"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Horná – 30 %"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Dolná – na celú obrazovku"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Používanie režimu jednej ruky"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Ukončíte potiahnutím z dolnej časti obrazovky nahor alebo klepnutím kdekoľvek nad aplikáciu"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Spustiť režim jednej ruky"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Ukončiť režim jednej ruky"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Nastavenia bublín aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Rozšírená ponuka"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Pridať späť do zásobníka"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikácie <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikácie <xliff:g id="APP_NAME">%2$s</xliff:g> a ďalšie (<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>)"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Presunúť doľava nahor"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Presunúť doprava nahor"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Presunúť doľava nadol"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Presunúť doprava nadol"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Nastavenia aplikácie <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Zavrieť bublinu"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Nezobrazovať konverzáciu ako bublinu"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Čet pomocou bublín"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nové konverzácie sa zobrazujú ako plávajúce ikony či bubliny. Bublinu otvoríte klepnutím. Premiestnite ju presunutím."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Nastavenie bublín môžete kedykoľvek zmeniť"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Bubliny pre túto aplikáciu môžete vypnúť klepnutím na Spravovať"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Dobre"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Žiadne nedávne bubliny"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Tu sa budú zobrazovať nedávne a zavreté bubliny"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bublina"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Spravovať"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bublina bola zavretá."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-sk/strings_tv.xml b/libs/WindowManager/Shell/res/values-sk/strings_tv.xml
new file mode 100644
index 0000000..a7a515c
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-sk/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Obraz v obraze"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program bez názvu)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Zavrieť režim PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Celá obrazovka"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml
new file mode 100644
index 0000000..3f42530
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-sl/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Zapri"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Razširi"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Nastavitve"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Meni"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> je v načinu slika v sliki"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Če ne želite, da aplikacija <xliff:g id="NAME">%s</xliff:g> uporablja to funkcijo, se dotaknite, da odprete nastavitve, in funkcijo izklopite."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Predvajaj"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Začasno ustavi"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Preskoči na naslednjega"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Preskoči na prejšnjega"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Spremeni velikost"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacija morda ne deluje v načinu razdeljenega zaslona."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacija ne podpira načina razdeljenega zaslona."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacija morda ne bo delovala na sekundarnem zaslonu."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikacija ne podpira zagona na sekundarnih zaslonih."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Razdelilnik zaslonov"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Levi v celozaslonski način"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Levi 70 %"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Levi 50 %"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Levi 30 %"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Desni v celozaslonski način"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Zgornji v celozaslonski način"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Zgornji 70 %"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Zgornji 50 %"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Zgornji 30 %"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Spodnji v celozaslonski način"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Uporaba enoročnega načina"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Za izhod povlecite z dna zaslona navzgor ali se dotaknite na poljubnem mestu nad aplikacijo"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Zagon enoročnega načina"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Izhod iz enoročnega načina"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Nastavitve za oblačke aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Prelivanje"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Dodaj nazaj v sklad"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>)"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> in toliko drugih: <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Premakni zgoraj levo"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Premakni zgoraj desno"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Premakni spodaj levo"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Premakni spodaj desno"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Nastavitve za <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Opusti oblaček"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Pogovora ne prikaži v oblačku"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Klepet z oblački"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Novi pogovori so prikazani kot lebdeče ikone ali oblački. Če želite odpreti oblaček, se ga dotaknite. Če ga želite premakniti, ga povlecite."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Upravljanje oblačkov"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Dotaknite se »Upravljanje«, da izklopite oblačke iz te aplikacije"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"V redu"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Ni nedavnih oblačkov"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Tukaj bodo prikazani tako nedavni kot tudi opuščeni oblački"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Mehurček"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljanje"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblaček je bil opuščen."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-sl/strings_tv.xml b/libs/WindowManager/Shell/res/values-sl/strings_tv.xml
new file mode 100644
index 0000000..fe5c9ae
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-sl/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Slika v sliki"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program brez naslova)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Zapri način PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Celozaslonsko"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml
new file mode 100644
index 0000000..ddae724
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-sq/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Mbyll"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Zgjero"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Cilësimet"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menyja"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> është në figurë brenda figurës"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Nëse nuk dëshiron që <xliff:g id="NAME">%s</xliff:g> ta përdorë këtë funksion, trokit për të hapur cilësimet dhe për ta çaktivizuar."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Luaj"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Ndërprit"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Kalo te tjetra"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Kalo tek e mëparshmja"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Ndrysho përmasat"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacioni mund të mos funksionojë me ekranin e ndarë."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacioni nuk mbështet ekranin e ndarë."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacioni mund të mos funksionojë në një ekran dytësor."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikacioni nuk mbështet nisjen në ekrane dytësore."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Ndarësi i ekranit të ndarë"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ekrani i plotë majtas"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Majtas 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Majtas 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Majtas 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Ekrani i plotë djathtas"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Ekrani i plotë lart"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Lart 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Lart 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Lart 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Ekrani i plotë poshtë"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Po përdor modalitetin e përdorimit me një dorë"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Për të dalë, rrëshqit lart nga fundi i ekranit ose trokit diku mbi aplikacion"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Modaliteti i përdorimit me një dorë"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Dil nga modaliteti i përdorimit me një dorë"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Cilësimet për flluskat e <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Tejkalo"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Shto përsëri te stiva"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> nga <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> nga <xliff:g id="APP_NAME">%2$s</xliff:g> dhe <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> të tjera"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Zhvendos lart majtas"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Lëviz lart djathtas"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Zhvendos poshtë majtas"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Lëvize poshtë djathtas"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Cilësimet e <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Hiqe flluskën"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Mos e vendos bisedën në flluskë"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Bisedo duke përdorur flluskat"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Bisedat e reja shfaqen si ikona pluskuese ose flluska. Trokit për të hapur flluskën. Zvarrit për ta zhvendosur."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Kontrollo flluskat në çdo moment"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Trokit \"Menaxho\" për të çaktivizuar flluskat nga ky aplikacion"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"E kuptova"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Nuk ka flluska të fundit"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Flluskat e fundit dhe flluskat e hequra do të shfaqen këtu"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Flluskë"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Menaxho"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Flluska u hoq."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-sq/strings_tv.xml b/libs/WindowManager/Shell/res/values-sq/strings_tv.xml
new file mode 100644
index 0000000..1d5583b
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-sq/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Figurë brenda figurës"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program pa titull)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Mbyll PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Ekrani i plotë"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml
new file mode 100644
index 0000000..74c9ac0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-sr/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Затвори"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Прошири"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Подешавања"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Мени"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> је слика у слици"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Ако не желите да <xliff:g id="NAME">%s</xliff:g> користи ову функцију, додирните да бисте отворили подешавања и искључили је."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Пусти"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Паузирај"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Пређи на следеће"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Пређи на претходно"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Промените величину"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Апликација можда неће радити са подељеним екраном."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Апликација не подржава подељени екран."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Апликација можда неће функционисати на секундарном екрану."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Апликација не подржава покретање на секундарним екранима."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Разделник подељеног екрана"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Режим целог екрана за леви екран"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Леви екран 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Леви екран 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Леви екран 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Режим целог екрана за доњи екран"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Режим целог екрана за горњи екран"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Горњи екран 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Горњи екран 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Горњи екран 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Режим целог екрана за доњи екран"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Коришћење режима једном руком"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Да бисте изашли, превуците нагоре од дна екрана или додирните било где изнад апликације"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Покрените режим једном руком"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Изађите из режима једном руком"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Подешавања за <xliff:g id="APP_NAME">%1$s</xliff:g> облачиће"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Преклапање"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Додај поново у групу"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> из апликације <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> из апликације <xliff:g id="APP_NAME">%2$s</xliff:g> и још <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Премести горе лево"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Премести горе десно"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Премести доле лево"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Премести доле десно"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Подешавања за <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Одбаци облачић"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Не користи облачиће за конверзацију"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Ћаскајте у облачићима"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Нове конверзације се приказују као плутајуће иконе или облачићи. Додирните да бисте отворили облачић. Превуците да бисте га преместили."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Контролишите облачиће у било ком тренутку"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Додирните Управљајте да бисте искључили облачиће из ове апликације"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Важи"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Нема недавних облачића"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Овде се приказују недавни и одбачени облачићи"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Облачић"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Управљајте"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Облачић је одбачен."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-sr/strings_tv.xml b/libs/WindowManager/Shell/res/values-sr/strings_tv.xml
new file mode 100644
index 0000000..62ad1e8
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-sr/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Слика у слици"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Програм без наслова)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Затвори PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Цео екран"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml
new file mode 100644
index 0000000..81328a8
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-sv/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Stäng"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Utöka"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Inställningar"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Meny"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> visas i bild-i-bild"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Om du inte vill att den här funktionen används i <xliff:g id="NAME">%s</xliff:g> öppnar du inställningarna genom att trycka. Sedan inaktiverar du funktionen."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Spela upp"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pausa"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Hoppa till nästa"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Hoppa till föregående"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Ändra storlek"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Appen kanske inte fungerar med delad skärm."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Appen har inte stöd för delad skärm."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Appen kanske inte fungerar på en sekundär skärm."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Appen kan inte köras på en sekundär skärm."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Avdelare för delad skärm"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Helskärm på vänster skärm"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Vänster 70 %"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vänster 50 %"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Vänster 30 %"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Helskärm på höger skärm"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Helskärm på övre skärm"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Övre 70 %"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Övre 50 %"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Övre 30 %"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Helskärm på nedre skärm"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Använda enhandsläge"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Avsluta genom att svepa uppåt från skärmens nederkant eller trycka ovanför appen"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Starta enhandsläge"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Avsluta enhandsläge"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Inställningar för <xliff:g id="APP_NAME">%1$s</xliff:g>-bubblor"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Fler menyalternativ"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Lägg tillbaka på stack"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> från <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> från <xliff:g id="APP_NAME">%2$s</xliff:g> och <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> fler"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Flytta högst upp till vänster"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Flytta högst upp till höger"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Flytta längst ned till vänster"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Flytta längst ned till höger"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Inställningar för <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Stäng bubbla"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Visa inte konversationen i bubblor"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Chatta med bubblor"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Nya konversationer visas som flytande ikoner, så kallade bubblor. Tryck på bubblan om du vill öppna den. Dra den om du vill flytta den."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Styr bubblor när som helst"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Tryck på Hantera för att stänga av bubblor från den här appen"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Inga nya bubblor"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"De senaste bubblorna och ignorerade bubblor visas här"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bubbla"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Hantera"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubblan ignorerades."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-sv/strings_tv.xml b/libs/WindowManager/Shell/res/values-sv/strings_tv.xml
new file mode 100644
index 0000000..74fb590
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-sv/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Bild-i-bild"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Namnlöst program)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Stäng PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Helskärm"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml
new file mode 100644
index 0000000..4559832
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-sw/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Funga"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Panua"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Mipangilio"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menyu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> iko katika hali ya picha ndani ya picha nyingine"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Ikiwa hutaki <xliff:g id="NAME">%s</xliff:g> itumie kipengele hiki, gusa ili ufungue mipangilio na uizime."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Cheza"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Sitisha"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Ruka ufikie inayofuata"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Ruka ufikie iliyotangulia"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Badilisha ukubwa"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Huenda programu isifanye kazi kwenye skrini inayogawanywa."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Programu haiwezi kutumia skrini iliyogawanywa."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Huenda programu isifanye kazi kwenye dirisha lingine."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Programu hii haiwezi kufunguliwa kwenye madirisha mengine."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Kitenganishi cha skrini inayogawanywa"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Skrini nzima ya kushoto"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Kushoto 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kushoto 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Kushoto 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Skrini nzima ya kulia"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Skrini nzima ya juu"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Juu 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Juu 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Juu 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Skrini nzima ya chini"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Kutumia hali ya kutumia kwa mkono mmoja"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Ili ufunge, telezesha kidole juu kutoka sehemu ya chini ya skrini au uguse mahali popote juu ya programu"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Anzisha hali ya kutumia kwa mkono mmoja"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Funga hali ya kutumia kwa mkono mmoja"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Mipangilio ya viputo vya <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Vipengee vya ziada"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Rejesha kwenye rafu"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kutoka kwa <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kutoka kwa <xliff:g id="APP_NAME">%2$s</xliff:g> na nyingine<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Sogeza juu kushoto"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Sogeza juu kulia"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Sogeza chini kushoto"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Sogeza chini kulia"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Mipangilio ya <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Ondoa kiputo"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Usiweke viputo kwenye mazungumzo"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Piga gumzo ukitumia viputo"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Mazungumzo mapya huonekena kama aikoni au viputo vinavyoelea. Gusa ili ufungue kiputo. Buruta ili ukisogeze."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Dhibiti viputo wakati wowote"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Gusa Dhibiti ili uzime viputo kwenye programu hii"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Nimeelewa"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Hakuna viputo vya hivi majuzi"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Viputo vya hivi karibuni na vile vilivyoondolewa vitaonekana hapa"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Kiputo"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Dhibiti"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Umeondoa kiputo."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-sw/strings_tv.xml b/libs/WindowManager/Shell/res/values-sw/strings_tv.xml
new file mode 100644
index 0000000..cf0d8a9
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-sw/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Pachika Picha Ndani ya Picha Nyingine"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programu isiyo na jina)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Funga PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Skrini nzima"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml
new file mode 100644
index 0000000..586ee94
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ta/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"மூடு"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"விரி"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"அமைப்புகள்"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"மெனு"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> தற்போது பிக்ச்சர்-இன்-பிக்ச்சரில் உள்ளது"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g> இந்த அம்சத்தைப் பயன்படுத்த வேண்டாம் என நினைத்தால் இங்கு தட்டி அமைப்புகளைத் திறந்து இதை முடக்கவும்."</string>
+    <string name="pip_play" msgid="3496151081459417097">"இயக்கு"</string>
+    <string name="pip_pause" msgid="690688849510295232">"இடைநிறுத்து"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"அடுத்ததற்குச் செல்"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"முந்தையதற்குச் செல்"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"அளவு மாற்று"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"திரைப் பிரிப்பு அம்சத்தில் ஆப்ஸ் செயல்படாமல் போகக்கூடும்."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"திரையைப் பிரிப்பதைப் ஆப்ஸ் ஆதரிக்கவில்லை."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"இரண்டாம்நிலைத் திரையில் ஆப்ஸ் வேலை செய்யாமல் போகக்கூடும்."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"இரண்டாம்நிலைத் திரைகளில் பயன்பாட்டைத் தொடங்க முடியாது."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"திரையைப் பிரிக்கும் பிரிப்பான்"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"இடது புறம் முழுத் திரை"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"இடது புறம் 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"இடது புறம் 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"இடது புறம் 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"வலது புறம் முழுத் திரை"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"மேற்புறம் முழுத் திரை"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"மேலே 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"மேலே 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"மேலே 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"கீழ்ப்புறம் முழுத் திரை"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"ஒற்றைக் கைப் பயன்முறையைப் பயன்படுத்துதல்"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"வெளியேற, திரையின் கீழிருந்து மேல்நோக்கி ஸ்வைப் செய்யவும் அல்லது ஆப்ஸுக்கு மேலே ஏதேனும் ஓர் இடத்தில் தட்டவும்"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"ஒற்றைக் கைப் பயன்முறையைத் தொடங்கும்"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"ஒற்றைக் கைப் பயன்முறையில் இருந்து வெளியேறும்"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> குமிழ்களுக்கான அமைப்புகள்"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ஓவர்ஃப்லோ"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"மீண்டும் ஸ்டேக்கில் சேர்க்கவும்"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> இலிருந்து <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> மற்றும் மேலும் <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ஆப்ஸிலிருந்து வந்துள்ள அறிவிப்பு: <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"மேலே இடப்புறமாக நகர்த்து"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"மேலே வலப்புறமாக நகர்த்து"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"கீழே இடப்புறமாக நகர்த்து"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"கீழே வலதுபுறமாக நகர்த்து"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> அமைப்புகள்"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"குமிழை அகற்று"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"உரையாடலைக் குமிழாக்காதே"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"குமிழ்களைப் பயன்படுத்தி அரட்டையடியுங்கள்"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"புதிய உரையாடல்கள் மிதக்கும் ஐகான்களாகவோ குமிழ்களாகவோ தோன்றும். குமிழைத் திறக்க தட்டவும். நகர்த்த இழுக்கவும்."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"குமிழ்களை எப்போது வேண்டுமானாலும் கட்டுப்படுத்தலாம்"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"இந்த ஆப்ஸிலிருந்து வரும் குமிழ்களை முடக்க, நிர்வகி என்பதைத் தட்டவும்"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"சரி"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"சமீபத்திய குமிழ்கள் இல்லை"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"சமீபத்திய குமிழ்களும் நிராகரிக்கப்பட்ட குமிழ்களும் இங்கே தோன்றும்"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"பபிள்"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"நிர்வகி"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"குமிழ் நிராகரிக்கப்பட்டது."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ta/strings_tv.xml b/libs/WindowManager/Shell/res/values-ta/strings_tv.xml
new file mode 100644
index 0000000..8bca463
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ta/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"பிக்ச்சர்-இன்-பிக்ச்சர்"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(தலைப்பு இல்லை)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIPஐ மூடு"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"முழுத்திரை"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml
new file mode 100644
index 0000000..0d166d8
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-te/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"మూసివేయి"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"విస్తరింపజేయి"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"సెట్టింగ్‌లు"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"మెనూ"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> చిత్రంలో చిత్రం రూపంలో ఉంది"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g> ఈ లక్షణాన్ని ఉపయోగించకూడదు అని మీరు అనుకుంటే, సెట్టింగ్‌లను తెరవడానికి ట్యాప్ చేసి, దీన్ని ఆఫ్ చేయండి."</string>
+    <string name="pip_play" msgid="3496151081459417097">"ప్లే చేయి"</string>
+    <string name="pip_pause" msgid="690688849510295232">"పాజ్ చేయి"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"దాటవేసి తర్వాత దానికి వెళ్లు"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"దాటవేసి మునుపటి దానికి వెళ్లు"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"పరిమాణం మార్చు"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"అనువర్తనంలో స్క్రీన్ విభజనకు మద్దతు లేదు."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ప్రత్యామ్నాయ డిస్‌ప్లేలో యాప్ పని చేయకపోవచ్చు."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ప్రత్యామ్నాయ డిస్‌ప్లేల్లో ప్రారంభానికి యాప్ మద్దతు లేదు."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"విభజన స్క్రీన్ విభాగిని"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ఎడమవైపు పూర్తి స్క్రీన్"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ఎడమవైపు 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ఎడమవైపు 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ఎడమవైపు 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"కుడివైపు పూర్తి స్క్రీన్"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ఎగువ పూర్తి స్క్రీన్"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ఎగువ 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ఎగువ 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ఎగువ 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"దిగువ పూర్తి స్క్రీన్"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> బబుల్స్ సెట్టింగ్‌లు"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ఓవర్‌ఫ్లో"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"స్ట్యాక్‌కు తిరిగి జోడించండి"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> నుండి <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> నుండి <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> మరియు మరో <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"ఎగువ ఎడమవైపునకు జరుపు"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"ఎగువ కుడివైపునకు జరుపు"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"దిగువ ఎడమవైపునకు తరలించు"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"దిగవు కుడివైపునకు జరుపు"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> సెట్టింగ్‌లు"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"బబుల్‌ను విస్మరించు"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"సంభాషణను బబుల్ చేయవద్దు"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"బబుల్స్‌ను ఉపయోగించి చాట్ చేయండి"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"కొత్త సంభాషణలు తేలియాడే చిహ్నాలుగా లేదా బబుల్స్ లాగా కనిపిస్తాయి. బబుల్‌ని తెరవడానికి నొక్కండి. తరలించడానికి లాగండి."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"బబుల్స్‌ను ఎప్పుడైనా నియంత్రించండి"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ఈ యాప్ నుండి వచ్చే బబుల్స్‌ను ఆఫ్ చేయడానికి మేనేజ్ బటన్‌ను ట్యాప్ చేయండి"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ఇటీవలి బబుల్స్ ఏవీ లేవు"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"ఇటీవలి బబుల్స్ మరియు తీసివేసిన బబుల్స్ ఇక్కడ కనిపిస్తాయి"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"బబుల్"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"మేనేజ్ చేయండి"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"బబుల్ విస్మరించబడింది."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-te/strings_tv.xml b/libs/WindowManager/Shell/res/values-te/strings_tv.xml
new file mode 100644
index 0000000..f3019945
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-te/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(శీర్షిక లేని ప్రోగ్రామ్)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIPని మూసివేయి"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"పూర్తి స్క్రీన్"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml
new file mode 100644
index 0000000..442c3ca
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-th/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"ปิด"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"ขยาย"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"การตั้งค่า"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"เมนู"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> ใช้การแสดงภาพซ้อนภาพ"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้ฟีเจอร์นี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดฟีเจอร์"</string>
+    <string name="pip_play" msgid="3496151081459417097">"เล่น"</string>
+    <string name="pip_pause" msgid="690688849510295232">"หยุดชั่วคราว"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"ข้ามไปรายการถัดไป"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"ข้ามไปรายการก่อนหน้า"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ปรับขนาด"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"แอปไม่สนับสนุนการแยกหน้าจอ"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"แอปอาจไม่ทำงานในจอแสดงผลรอง"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"แอปไม่รองรับการเรียกใช้ในจอแสดงผลรอง"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"เส้นแบ่งหน้าจอ"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"เต็มหน้าจอทางซ้าย"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"ซ้าย 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ซ้าย 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ซ้าย 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"เต็มหน้าจอทางขวา"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"เต็มหน้าจอด้านบน"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ด้านบน 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ด้านบน 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ด้านบน 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"เต็มหน้าจอด้านล่าง"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"การตั้งค่าบับเบิล <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"รายการเพิ่มเติม"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"เพิ่มกลับไปที่สแต็ก"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> จาก <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> จาก <xliff:g id="APP_NAME">%2$s</xliff:g> และอีก <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> รายการ"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"ย้ายไปด้านซ้ายบน"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"ย้ายไปด้านขวาบน"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"ย้ายไปด้านซ้ายล่าง"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"ย้ายไปด้านขาวล่าง"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"การตั้งค่า <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"ปิดบับเบิล"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"ไม่ต้องแสดงการสนทนาเป็นบับเบิล"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"แชทโดยใช้บับเบิล"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"การสนทนาใหม่ๆ จะปรากฏเป็นไอคอนแบบลอยหรือบับเบิล แตะเพื่อเปิดบับเบิล ลากเพื่อย้ายที่"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ควบคุมบับเบิลได้ทุกเมื่อ"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"แตะ \"จัดการ\" เพื่อปิดบับเบิลจากแอปนี้"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ไม่มีบับเบิลเมื่อเร็วๆ นี้"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"บับเบิลที่แสดงและที่ปิดไปเมื่อเร็วๆ นี้จะปรากฏที่นี่"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"บับเบิล"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"จัดการ"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ปิดบับเบิลแล้ว"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-th/strings_tv.xml b/libs/WindowManager/Shell/res/values-th/strings_tv.xml
new file mode 100644
index 0000000..cd1b612
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-th/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ไม่มีชื่อรายการ)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"ปิด PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"เต็มหน้าจอ"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml
new file mode 100644
index 0000000..a76bf6f
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-tl/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Isara"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Palawakin"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Mga Setting"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"Nasa picture-in-picture ang <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Kung ayaw mong magamit ni <xliff:g id="NAME">%s</xliff:g> ang feature na ito, i-tap upang buksan ang mga setting at i-off ito."</string>
+    <string name="pip_play" msgid="3496151081459417097">"I-play"</string>
+    <string name="pip_pause" msgid="690688849510295232">"I-pause"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Lumaktaw sa susunod"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Lumaktaw sa nakaraan"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"I-resize"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Posibleng hindi gumana ang app sa split screen."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Hindi sinusuportahan ng app ang split-screen."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Maaaring hindi gumana ang app sa pangalawang display."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Hindi sinusuportahan ng app ang paglulunsad sa mga pangalawang display."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Divider ng split-screen"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"I-full screen ang nasa kaliwa"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Gawing 70% ang nasa kaliwa"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Gawing 50% ang nasa kaliwa"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Gawing 30% ang nasa kaliwa"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"I-full screen ang nasa kanan"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"I-full screen ang nasa itaas"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Gawing 70% ang nasa itaas"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Gawing 50% ang nasa itaas"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Gawing 30% ang nasa itaas"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"I-full screen ang nasa ibaba"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Paggamit ng one-hand mode"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para lumabas, mag-swipe pataas mula sa ibaba ng screen o mag-tap kahit saan sa itaas ng app"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Simulan ang one-hand mode"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Lumabas sa one-hand mode"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Mga setting para sa mga bubble ng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Overflow"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Idagdag ulit sa stack"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> mula sa <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> mula sa <xliff:g id="APP_NAME">%2$s</xliff:g> at <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> pa"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Ilipat sa kaliwa sa itaas"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Ilipat sa kanan sa itaas"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Ilipat sa kaliwa sa ibaba"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Ilipat sa kanan sa ibaba"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Mga setting ng <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"I-dismiss ang bubble"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Huwag ipakita sa bubble ang mga pag-uusap"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Mag-chat gamit ang bubbles"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Lumalabas bilang mga nakalutang na icon o bubble ang mga bagong pag-uusap. I-tap para buksan ang bubble. I-drag para ilipat ito."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Kontrolin ang mga bubble anumang oras"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"I-tap ang Pamahalaan para i-off ang mga bubble mula sa app na ito"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Walang kamakailang bubble"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Lalabas dito ang mga kamakailang bubble at na-dismiss na bubble"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bubble"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Pamahalaan"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Na-dismiss na ang bubble."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-tl/strings_tv.xml b/libs/WindowManager/Shell/res/values-tl/strings_tv.xml
new file mode 100644
index 0000000..b01c111
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-tl/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-Picture"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Walang pamagat na programa)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Isara ang PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Full screen"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml
new file mode 100644
index 0000000..b3276da
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-tr/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Kapat"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Genişlet"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Ayarlar"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menü"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g>, pencere içinde pencere özelliğini kullanıyor"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g> uygulamasının bu özelliği kullanmasını istemiyorsanız dokunarak ayarları açın ve söz konusu özelliği kapatın."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Oynat"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Duraklat"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Sonrakine atla"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Öncekine atla"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Yeniden boyutlandır"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Uygulama bölünmüş ekranda çalışmayabilir."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Uygulama bölünmüş ekranı desteklemiyor."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Uygulama ikincil ekranda çalışmayabilir."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Uygulama ikincil ekranlarda başlatılmayı desteklemiyor."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Bölünmüş ekran ayırıcı"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Solda tam ekran"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Solda %70"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Solda %50"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Solda %30"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Sağda tam ekran"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Üstte tam ekran"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Üstte %70"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Üstte %50"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Üstte %30"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Altta tam ekran"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Tek el modunu kullanma"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Çıkmak için ekranın alt kısmından yukarı kaydırın veya uygulamanın üzerinde herhangi bir yere dokunun"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Tek el modunu başlat"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Tek el modundan çık"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> baloncukları için ayarlar"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Taşma"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Yığına geri ekle"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> uygulamasından <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> uygulamasından <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ve diğer <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Sol üste taşı"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Sağ üste taşı"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Sol alta taşı"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Sağ alta taşı"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ayarları"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Baloncuğu kapat"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Görüşmeyi baloncuk olarak görüntüleme"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Baloncukları kullanarak sohbet edin"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Yeni görüşmeler kayan simgeler veya baloncuk olarak görünür. Açmak için baloncuğa dokunun. Baloncuğu taşımak için sürükleyin."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Baloncukları istediğiniz zaman kontrol edin"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Bu uygulamanın baloncuklarını kapatmak için Yönet\'e dokunun"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Anladım"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Son kapatılan baloncuk yok"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Son baloncuklar ve kapattığınız baloncuklar burada görünür"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Baloncuk"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Yönet"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balon kapatıldı."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-tr/strings_tv.xml b/libs/WindowManager/Shell/res/values-tr/strings_tv.xml
new file mode 100644
index 0000000..c92c4d0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-tr/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Pencere İçinde Pencere"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Başlıksız program)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"PIP\'yi kapat"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Tam ekran"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml
new file mode 100644
index 0000000..8e303cf
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-uk/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Закрити"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Розгорнути"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Налаштування"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Меню"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"У додатку <xliff:g id="NAME">%s</xliff:g> є функція \"Картинка в картинці\""</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Щоб додаток <xliff:g id="NAME">%s</xliff:g> не використовував цю функцію, вимкніть її в налаштуваннях."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Відтворити"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Призупинити"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Перейти далі"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Перейти назад"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Змінити розмір"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Додаток може не працювати в режимі розділеного екрана."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Додаток не підтримує розділення екрана."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Додаток може не працювати на додатковому екрані."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Додаток не підтримує запуск на додаткових екранах."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Розділювач екрана"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Ліве вікно на весь екран"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Ліве вікно на 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ліве вікно на 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ліве вікно на 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Праве вікно на весь екран"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Верхнє вікно на весь екран"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Верхнє вікно на 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Верхнє вікно на 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Верхнє вікно на 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Нижнє вікно на весь екран"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Як користуватися режимом керування однією рукою"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Щоб вийти, проведіть пальцем по екрану знизу вгору або торкніться екрана над додатком"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Увімкнути режим керування однією рукою"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Вийти з режиму керування однією рукою"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Налаштування спливаючих чатів від додатка <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Додаткове меню"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Додати в список"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"Cповіщення \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\" від додатка <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"Сповіщення \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\" від додатка <xliff:g id="APP_NAME">%2$s</xliff:g> (і ще <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>)"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Перемістити ліворуч угору"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Перемістити праворуч угору"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Перемістити ліворуч униз"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Перемістити праворуч униз"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Налаштування параметра \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\""</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Закрити підказку"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Не показувати спливаючі чати для розмов"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Спливаючий чат"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Нові повідомлення чату з\'являються у вигляді спливаючих значків. Щоб відкрити чат, натисніть його, а щоб перемістити – перетягніть."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Контроль спливаючих чатів"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Натисніть \"Налаштувати\", щоб вимкнути спливаючі чати від цього додатка"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Зрозуміло"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Немає нещодавніх спливаючих чатів"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Тут з\'являтимуться нещодавні й закриті спливаючі чати"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Спливаюче сповіщення"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Налаштувати"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Спливаюче сповіщення закрито."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-uk/strings_tv.xml b/libs/WindowManager/Shell/res/values-uk/strings_tv.xml
new file mode 100644
index 0000000..74d4723
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-uk/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Картинка в картинці"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Програма без назви)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Закрити PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"На весь екран"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml
new file mode 100644
index 0000000..cd6529f0
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ur/strings.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"بند کریں"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"پھیلائیں"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"ترتیبات"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"مینو"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> تصویر میں تصویر میں ہے"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"اگر آپ نہیں چاہتے ہیں کہ <xliff:g id="NAME">%s</xliff:g> اس خصوصیت کا استعمال کرے تو ترتیبات کھولنے کے لیے تھپتھپا کر اسے آف کرے۔"</string>
+    <string name="pip_play" msgid="3496151081459417097">"چلائیں"</string>
+    <string name="pip_pause" msgid="690688849510295232">"موقوف کریں"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"نظرانداز کرکے اگلے پر جائیں"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"نظرانداز کرکے پچھلے پر جائیں"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"سائز تبدیل کریں"</string>
+    <!-- no translation found for dock_forced_resizable (1749750436092293116) -->
+    <skip />
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ایپ سپلٹ اسکرین کو سپورٹ نہیں کرتی۔"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ممکن ہے ایپ ثانوی ڈسپلے پر کام نہ کرے۔"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ایپ ثانوی ڈسپلیز پر شروعات کا تعاون نہیں کرتی۔"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"سپلٹ اسکرین تقسیم کار"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"بائیں فل اسکرین"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"بائیں %70"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"بائیں %50"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"بائیں %30"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"دائیں فل اسکرین"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"بالائی فل اسکرین"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"اوپر %70"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"اوپر %50"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"اوپر %30"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"نچلی فل اسکرین"</string>
+    <!-- no translation found for one_handed_tutorial_title (4583241688067426350) -->
+    <skip />
+    <!-- no translation found for one_handed_tutorial_description (3486582858591353067) -->
+    <skip />
+    <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) -->
+    <skip />
+    <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) -->
+    <skip />
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> بلبلوں کے لیے ترتیبات"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"اوورفلو"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"انبار میں واپس شامل کریں"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g> کی جانب سے <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> اور <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> مزید سے <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"اوپر بائیں جانب لے جائیں"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"اوپر دائیں جانب لے جائيں"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"نیچے بائیں جانب لے جائیں"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"نیچے دائیں جانب لے جائیں"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ترتیبات"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"بلبلہ برخاست کریں"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"گفتگو بلبلہ نہ کریں"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"بلبلے کے ذریعے چیٹ کریں"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"نئی گفتگوئیں فلوٹنگ آئیکن یا بلبلے کے طور پر ظاہر ہوں گی۔ بلبلہ کھولنے کے لیے تھپتھپائیں۔ اسے منتقل کرنے کے لیے گھسیٹیں۔"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"کسی بھی وقت بلبلے کو کنٹرول کریں"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"اس ایپ سے بلبلوں کو آف کرنے کے لیے نظم کریں پر تھپتھپائیں"</string>
+    <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) -->
+    <skip />
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"کوئی حالیہ بلبلہ نہیں"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"حالیہ بلبلے اور برخاست شدہ بلبلے یہاں ظاہر ہوں گے"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"بلبلہ"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"نظم کریں"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"بلبلہ برخاست کر دیا گیا۔"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-ur/strings_tv.xml b/libs/WindowManager/Shell/res/values-ur/strings_tv.xml
new file mode 100644
index 0000000..64e5db5
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-ur/strings_tv.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- no translation found for notification_channel_tv_pip (2576686079160402435) -->
+    <skip />
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(بلا عنوان پروگرام)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"‏PIP بند کریں"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"فُل اسکرین"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml
new file mode 100644
index 0000000..24052c3
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-uz/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Yopish"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Yoyish"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Sozlamalar"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menyu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> tasvir ustida tasvir rejimida"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"<xliff:g id="NAME">%s</xliff:g> ilovasi uchun bu funksiyani sozlamalar orqali faolsizlantirish mumkin."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Ijro"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Pauza"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Keyingisiga o‘tish"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Avvalgisiga qaytish"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Oʻlchamini oʻzgartirish"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Ilova ekranni ikkiga bo‘lish rejimini qo‘llab-quvvatlamaydi."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Bu ilova ekranni bo‘lish xususiyatini qo‘llab-quvvatlamaydi."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Bu ilova qo‘shimcha ekranda ishlamasligi mumkin."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Bu ilova qo‘shimcha ekranlarda ishga tushmaydi."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Ekranni ikkiga bo‘lish chizig‘i"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Chapda to‘liq ekran"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Chapda 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Chapda 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Chapda 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"O‘ngda to‘liq ekran"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Tepada to‘liq ekran"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Tepada 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Tepada 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Tepada 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Pastda to‘liq ekran"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Ixcham rejimdan foydalaning"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Chiqish uchun ekran pastidan tepaga suring yoki ilovaning tepasidagi istalgan joyga bosing."</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Ixcham rejimni ishga tushirish"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Ixcham rejimdan chiqish"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> bulutchalari uchun sozlamalar"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Kengaytirilgan"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Yana toʻplamga kiritish"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g> ilovasidan <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> va yana <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ta bildirishnoma"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Yuqori chapga surish"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Yuqori oʻngga surish"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Quyi chapga surish"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Quyi oʻngga surish"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> sozlamalari"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Bulutchani yopish"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Suhbatlar bulutchalar shaklida chiqmasin"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Bulutchalar yordamida subhatlashish"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Yangi xabarlar qalqib chiquvchi belgilar yoki bulutchalar kabi chiqadi. Xabarni ochish uchun bildirishnoma ustiga bosing. Xabarni qayta joylash uchun bildirishnomani suring."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Bulutchalardagi bildirishnomalar"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Bu ilova bulutchalarini faolsizlantirish uchun Boshqarish tugmasini bosing"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"OK"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Avvalgi bulutchalar topilmadi"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Bu yerda oxirgi va yopilgan bulutcha shaklidagi bildirishnomalar chiqadi"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Pufaklar"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Boshqarish"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bulutcha yopildi."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-uz/strings_tv.xml b/libs/WindowManager/Shell/res/values-uz/strings_tv.xml
new file mode 100644
index 0000000..ae5a647
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-uz/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Tasvir ustida tasvir"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Nomsiz)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Kadr ichida kadr – chiqish"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Butun ekran"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml
new file mode 100644
index 0000000..ce37231
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-vi/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Đóng"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Mở rộng"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Cài đặt"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g> đang ở chế độ ảnh trong ảnh"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Nếu bạn không muốn <xliff:g id="NAME">%s</xliff:g> sử dụng tính năng này, hãy nhấn để mở cài đặt và tắt tính năng này."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Phát"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Tạm dừng"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Chuyển tới mục tiếp theo"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Chuyển về mục trước"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Đổi kích thước"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Ứng dụng có thể không hoạt động với tính năng chia đôi màn hình."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Ứng dụng không hỗ trợ chia đôi màn hình."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Ứng dụng có thể không hoạt động trên màn hình phụ."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Ứng dụng không hỗ trợ khởi chạy trên màn hình phụ."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Bộ chia chia đôi màn hình"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Toàn màn hình bên trái"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Trái 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Trái 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Trái 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Toàn màn hình bên phải"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Toàn màn hình phía trên"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Trên 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Trên 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Trên 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Toàn màn hình phía dưới"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Cách dùng chế độ một tay"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Để thoát, hãy vuốt lên từ cuối màn hình hoặc nhấn vào vị trí bất kỳ phía trên ứng dụng"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Bắt đầu chế độ một tay"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Thoát khỏi chế độ một tay"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Tùy chọn cài đặt cho bong bóng trò chuyện <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Trình đơn mục bổ sung"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Thêm lại vào ngăn xếp"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> của <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> từ <xliff:g id="APP_NAME">%2$s</xliff:g> và <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> bong bóng khác"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Chuyển lên trên cùng bên trái"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Chuyển lên trên cùng bên phải"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Chuyển tới dưới cùng bên trái"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Chuyển tới dưới cùng bên phải"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"Cài đặt <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Đóng bong bóng"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Dừng sử dụng bong bóng cho cuộc trò chuyện"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Trò chuyện bằng bong bóng trò chuyện"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Các cuộc trò chuyện mới sẽ xuất hiện dưới dạng biểu tượng nổi hoặc bong bóng trò chuyện. Nhấn để mở bong bóng trò chuyện. Kéo để di chuyển bong bóng trò chuyện."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Kiểm soát bong bóng bất cứ lúc nào"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Nhấn vào nút Quản lý để tắt bong bóng trò chuyện từ ứng dụng này"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Đã hiểu"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Không có bong bóng trò chuyện nào gần đây"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Bong bóng trò chuyện đã đóng và bong bóng trò chuyện gần đây sẽ xuất hiện ở đây"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Bong bóng"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Quản lý"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Đã đóng bong bóng."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-vi/strings_tv.xml b/libs/WindowManager/Shell/res/values-vi/strings_tv.xml
new file mode 100644
index 0000000..082d125
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-vi/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Hình trong hình"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Không có chương trình tiêu đề)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Đóng PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Toàn màn hình"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..3143130
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"关闭"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"展开"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"设置"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"菜单"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"<xliff:g id="NAME">%s</xliff:g>目前位于“画中画”中"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"如果您不想让“<xliff:g id="NAME">%s</xliff:g>”使用此功能,请点按以打开设置,然后关闭此功能。"</string>
+    <string name="pip_play" msgid="3496151081459417097">"播放"</string>
+    <string name="pip_pause" msgid="690688849510295232">"暂停"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"跳到下一个"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"跳到上一个"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"调整大小"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"应用可能无法在分屏模式下正常运行。"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"应用不支持分屏。"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"应用可能无法在辅显示屏上正常运行。"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"应用不支持在辅显示屏上启动。"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"分屏分隔线"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"左侧全屏"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"左侧 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"左侧 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"左侧 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"右侧全屏"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"顶部全屏"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"顶部 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"顶部 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"顶部 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"底部全屏"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"使用单手模式"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"如需退出,请从屏幕底部向上滑动,或点按应用上方的任意位置"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"启动单手模式"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"退出单手模式"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g>对话泡的设置"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"菜单"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"重新加入叠放"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g>:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"<xliff:g id="APP_NAME">%2$s</xliff:g>和另外 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 个应用:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"移至左上角"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"移至右上角"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"移至左下角"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"移至右下角"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>设置"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"关闭对话泡"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"不以对话泡形式显示对话"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"使用对话泡聊天"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"新对话会以浮动图标或对话泡形式显示。点按即可打开对话泡。拖动即可移动对话泡。"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"随时控制对话泡"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"点按“管理”按钮,可关闭来自此应用的对话泡"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"知道了"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"最近没有对话泡"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"此处会显示最近的对话泡和已关闭的对话泡"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"气泡"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"已关闭对话泡。"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings_tv.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings_tv.xml
new file mode 100644
index 0000000..cb3fcf7
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"画中画"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(节目没有标题)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"关闭画中画"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"全屏"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..b62d218
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"關閉"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"展開"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"設定"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"選單"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"「<xliff:g id="NAME">%s</xliff:g>」目前在畫中畫模式"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"如果您不想「<xliff:g id="NAME">%s</xliff:g>」使用此功能,請輕按以開啟設定,然後停用此功能。"</string>
+    <string name="pip_play" msgid="3496151081459417097">"播放"</string>
+    <string name="pip_pause" msgid="690688849510295232">"暫停"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"跳到下一個"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"跳到上一個"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"調整大小"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"應用程式可能無法在分割畫面中運作。"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"應用程式不支援分割畫面。"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"應用程式可能無法在次要顯示屏上運作。"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"應用程式無法在次要顯示屏上啟動。"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"分割畫面分隔線"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"左邊全螢幕"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"左邊 70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"左邊 50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"左邊 30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"右邊全螢幕"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"頂部全螢幕"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"頂部 70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"頂部 50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"頂部 30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"底部全螢幕"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"使用單手模式"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"如要退出,請從螢幕底部向上滑動,或輕觸應用程式上的任何位置"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"啟動單手模式"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"結束單手模式"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」小視窗設定"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"顯示更多"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"加回堆疊"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"來自「<xliff:g id="APP_NAME">%2$s</xliff:g>」的 <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"來自「<xliff:g id="APP_NAME">%2$s</xliff:g>」及另外 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 個應用程式的<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"移去左上角"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"移去右上角"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"移去左下角"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"移去右下角"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"「<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>」設定"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"關閉小視窗氣泡"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"不要透過小視窗顯示對話"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"使用小視窗進行即時通訊"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"新對話會以浮動圖示 (小視窗) 顯示。輕按即可開啟小視窗。拖曳即可移動小視窗。"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"隨時控制小視窗設定"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"輕按「管理」即可關閉此應用程式的小視窗"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"我知道了"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"沒有最近曾使用的小視窗"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"最近使用和關閉的小視窗會在這裡顯示"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"氣泡"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"對話氣泡已關閉。"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings_tv.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings_tv.xml
new file mode 100644
index 0000000..a9ca855
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"子母畫面"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(沒有標題的節目)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"關閉 PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"全螢幕"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..6fb8ed9
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"關閉"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"展開"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"設定"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"選單"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"「<xliff:g id="NAME">%s</xliff:g>」目前在子母畫面中"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"如果你不想讓「<xliff:g id="NAME">%s</xliff:g>」使用這項功能,請輕觸開啟設定頁面,然後停用此功能。"</string>
+    <string name="pip_play" msgid="3496151081459417097">"播放"</string>
+    <string name="pip_pause" msgid="690688849510295232">"暫停"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"跳到下一個"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"跳到上一個"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"調整大小"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"應用程式可能無法在分割畫面中運作。"</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"這個應用程式不支援分割畫面。"</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"應用程式可能無法在次要顯示器上運作。"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"應用程式無法在次要顯示器上啟動。"</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"分割畫面分隔線"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"以全螢幕顯示左側畫面"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"以 70% 的螢幕空間顯示左側畫面"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"以 50% 的螢幕空間顯示左側畫面"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"以 30% 的螢幕空間顯示左側畫面"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"以全螢幕顯示右側畫面"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"以全螢幕顯示頂端畫面"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"以 70% 的螢幕空間顯示頂端畫面"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"以 50% 的螢幕空間顯示頂端畫面"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"以 30% 的螢幕空間顯示頂端畫面"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"以全螢幕顯示底部畫面"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"使用單手模式"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"如要退出,請從螢幕底部向上滑動,或輕觸應用程式上的任何位置"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"啟動單手模式"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"結束單手模式"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」對話框的設定"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"溢位"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"重新加入堆疊"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"<xliff:g id="APP_NAME">%2$s</xliff:g>:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"「<xliff:g id="APP_NAME">%2$s</xliff:g>」和其他 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 個應用程式:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"移至左上方"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"移至右上方"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"移至左下方"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"移至右下方"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"「<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>」設定"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"關閉對話框"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"不要以對話框形式顯示對話"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"透過對話框來聊天"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"新的對話會以浮動圖示或對話框形式顯示。輕觸即可開啟對話框,拖曳則可移動對話框。"</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"你隨時可以控管對話框的各項設定"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"輕觸 [管理] 即可關閉來自這個應用程式的對話框"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"我知道了"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"最近沒有任何對話框"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"最近的對話框和已關閉的對話框會顯示在這裡"</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"泡泡"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"已關閉泡泡。"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings_tv.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings_tv.xml
new file mode 100644
index 0000000..08b2f4b
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"子母畫面"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(無標題的節目)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"關閉子母畫面"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"全螢幕"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml
new file mode 100644
index 0000000..cab2776
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-zu/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="pip_phone_close" msgid="5783752637260411309">"Vala"</string>
+    <string name="pip_phone_expand" msgid="2579292903468287504">"Nweba"</string>
+    <string name="pip_phone_settings" msgid="5468987116750491918">"Izilungiselelo"</string>
+    <string name="pip_menu_title" msgid="5393619322111827096">"Imenyu"</string>
+    <string name="pip_notification_title" msgid="1347104727641353453">"U-<xliff:g id="NAME">%s</xliff:g> ungaphakathi kwesithombe esiphakathi kwesithombe"</string>
+    <string name="pip_notification_message" msgid="8854051911700302620">"Uma ungafuni i-<xliff:g id="NAME">%s</xliff:g> ukuthi isebenzise lesi sici, thepha ukuze uvule izilungiselelo uphinde uyivale."</string>
+    <string name="pip_play" msgid="3496151081459417097">"Dlala"</string>
+    <string name="pip_pause" msgid="690688849510295232">"Misa isikhashana"</string>
+    <string name="pip_skip_to_next" msgid="8403429188794867653">"Yeqela kokulandelayo"</string>
+    <string name="pip_skip_to_prev" msgid="7172158111196394092">"Yeqela kokwangaphambilini"</string>
+    <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Shintsha usayizi"</string>
+    <string name="dock_forced_resizable" msgid="1749750436092293116">"Izinhlelo zokusebenza kungenzeka zingasebenzi ngesikrini esihlukanisiwe."</string>
+    <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Uhlelo lokusebenza alusekeli isikrini esihlukanisiwe."</string>
+    <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Uhlelo lokusebenza kungenzeka lungasebenzi kusibonisi sesibili."</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Uhlelo lokusebenza alusekeli ukuqalisa kuzibonisi zesibili."</string>
+    <string name="accessibility_divider" msgid="703810061635792791">"Isihlukanisi sokuhlukanisa isikrini"</string>
+    <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"Isikrini esigcwele esingakwesokunxele"</string>
+    <string name="accessibility_action_divider_left_70" msgid="8859845045360659250">"Kwesokunxele ngo-70%"</string>
+    <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kwesokunxele ngo-50%"</string>
+    <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Kwesokunxele ngo-30%"</string>
+    <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Isikrini esigcwele esingakwesokudla"</string>
+    <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Isikrini esigcwele esiphezulu"</string>
+    <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Okuphezulu okungu-70%"</string>
+    <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Okuphezulu okungu-50%"</string>
+    <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Okuphezulu okungu-30%"</string>
+    <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Ngaphansi kwesikrini esigcwele"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Ukusebenzisa imodi yesandla esisodwa"</string>
+    <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Ukuze uphume, swayipha ngaphezulu kusuka ngezansi kwesikrini noma thepha noma kuphi ngenhla kohlelo lokusebenza"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Qalisa imodi yesandla esisodwa"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Phuma kumodi yesandla esisodwa"</string>
+    <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Izilungiselelo zamabhamuza e-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Ukuphuphuma"</string>
+    <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Engeza emuva kusitaki"</string>
+    <string name="bubble_content_description_single" msgid="8495748092720065813">"I-<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kusuka ku-<xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
+    <string name="bubble_content_description_stack" msgid="8071515017164630429">"I-<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kusukela ku-<xliff:g id="APP_NAME">%2$s</xliff:g> nokungu-<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ngaphezulu"</string>
+    <string name="bubble_accessibility_action_move_top_left" msgid="2644118920500782758">"Hambisa phezulu kwesokunxele"</string>
+    <string name="bubble_accessibility_action_move_top_right" msgid="5864594920870245525">"Hambisa phezulu ngakwesokudla"</string>
+    <string name="bubble_accessibility_action_move_bottom_left" msgid="850271002773745634">"Hambisa inkinobho ngakwesokunxele"</string>
+    <string name="bubble_accessibility_action_move_bottom_right" msgid="2107626346109206352">"Hambisa inkinobho ngakwesokudla"</string>
+    <string name="bubbles_app_settings" msgid="3617224938701566416">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> izilungiselelo"</string>
+    <string name="bubble_dismiss_text" msgid="8816558050659478158">"Cashisa ibhamuza"</string>
+    <string name="bubbles_dont_bubble_conversation" msgid="310000317885712693">"Ungayibhamuzi ingxoxo"</string>
+    <string name="bubbles_user_education_title" msgid="2112319053732691899">"Xoxa usebenzisa amabhamuza"</string>
+    <string name="bubbles_user_education_description" msgid="4215862563054175407">"Izingxoxo ezintsha zivela njengezithonjana ezintantayo, noma amabhamuza. Thepha ukuze uvule ibhamuza. Hudula ukuze ulihambise."</string>
+    <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Lawula amabhamuza noma nini"</string>
+    <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Thepha okuthi Phatha ukuvala amabhamuza kusuka kulolu hlelo lokusebenza"</string>
+    <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Ngiyezwa"</string>
+    <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Awekho amabhamuza akamuva"</string>
+    <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Amabhamuza akamuva namabhamuza asusiwe azobonakala lapha."</string>
+    <string name="notification_bubble_title" msgid="6082910224488253378">"Ibhamuza"</string>
+    <string name="manage_bubbles_text" msgid="7730624269650594419">"Phatha"</string>
+    <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Ibhamuza licashisiwe."</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values-zu/strings_tv.xml b/libs/WindowManager/Shell/res/values-zu/strings_tv.xml
new file mode 100644
index 0000000..89c7f49
--- /dev/null
+++ b/libs/WindowManager/Shell/res/values-zu/strings_tv.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright (C) 2020 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Isithombe-esithombeni"</string>
+    <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Alukho uhlelo lwesihloko)"</string>
+    <string name="pip_close" msgid="9135220303720555525">"Vala i-PIP"</string>
+    <string name="pip_fullscreen" msgid="7278047353591302554">"Iskrini esigcwele"</string>
+</resources>
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index 8a60aaf..25d034c 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -99,12 +99,12 @@
     <dimen name="bubble_flyout_avatar_message_space">6dp</dimen>
     <!-- Padding between status bar and bubbles when displayed in expanded state -->
     <dimen name="bubble_padding_top">16dp</dimen>
+    <!-- Max amount of space between bubbles when expanded. -->
+    <dimen name="bubble_max_spacing">16dp</dimen>
     <!-- Size of individual bubbles. -->
     <dimen name="individual_bubble_size">60dp</dimen>
     <!-- Size of bubble bitmap. -->
     <dimen name="bubble_bitmap_size">52dp</dimen>
-    <!-- Size of bubble icon bitmap. -->
-    <dimen name="bubble_overflow_icon_bitmap_size">24dp</dimen>
     <!-- Extra padding added to the touchable rect for bubbles so they are easier to grab. -->
     <dimen name="bubble_touch_padding">12dp</dimen>
     <!-- Size of the circle around the bubbles when they're in the dismiss target. -->
@@ -136,6 +136,8 @@
     <dimen name="bubble_dismiss_slop">16dp</dimen>
     <!-- Height of button allowing users to adjust settings for bubbles. -->
     <dimen name="bubble_manage_button_height">48dp</dimen>
+    <!-- Height of an item in the bubble manage menu. -->
+    <dimen name="bubble_menu_item_height">60dp</dimen>
     <!-- Max width of the message bubble-->
     <dimen name="bubble_message_max_width">144dp</dimen>
     <!-- Min width of the message bubble -->
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellDump.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellDump.java
index 4ba84223..13089af 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellDump.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellDump.java
@@ -16,8 +16,8 @@
 
 package com.android.wm.shell;
 
-import com.android.wm.shell.common.DisplayImeController;
-import com.android.wm.shell.draganddrop.DragAndDropController;
+import com.android.wm.shell.apppairs.AppPairs;
+import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout;
 import com.android.wm.shell.onehanded.OneHanded;
 import com.android.wm.shell.pip.Pip;
 import com.android.wm.shell.splitscreen.SplitScreen;
@@ -33,16 +33,22 @@
     private final Optional<SplitScreen> mSplitScreenOptional;
     private final Optional<Pip> mPipOptional;
     private final Optional<OneHanded> mOneHandedOptional;
+    private final Optional<HideDisplayCutout> mHideDisplayCutout;
     private final ShellTaskOrganizer mShellTaskOrganizer;
+    private final Optional<AppPairs> mAppPairsOptional;
 
     public ShellDump(ShellTaskOrganizer shellTaskOrganizer,
             Optional<SplitScreen> splitScreenOptional,
             Optional<Pip> pipOptional,
-            Optional<OneHanded> oneHandedOptional) {
+            Optional<OneHanded> oneHandedOptional,
+            Optional<HideDisplayCutout> hideDisplayCutout,
+            Optional<AppPairs> appPairsOptional) {
         mShellTaskOrganizer = shellTaskOrganizer;
         mSplitScreenOptional = splitScreenOptional;
         mPipOptional = pipOptional;
         mOneHandedOptional = oneHandedOptional;
+        mHideDisplayCutout = hideDisplayCutout;
+        mAppPairsOptional = appPairsOptional;
     }
 
     public void dump(PrintWriter pw) {
@@ -52,5 +58,9 @@
         mPipOptional.ifPresent(pip -> pip.dump(pw));
         mSplitScreenOptional.ifPresent(splitScreen -> splitScreen.dump(pw));
         mOneHandedOptional.ifPresent(oneHanded -> oneHanded.dump(pw));
+        mHideDisplayCutout.ifPresent(hideDisplayCutout -> hideDisplayCutout.dump(pw));
+        pw.println();
+        pw.println();
+        mAppPairsOptional.ifPresent(appPairs -> appPairs.dump(pw, ""));
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellInit.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellInit.java
index 4269a90..d654f8a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellInit.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellInit.java
@@ -16,6 +16,7 @@
 
 package com.android.wm.shell;
 
+import com.android.wm.shell.apppairs.AppPairs;
 import com.android.wm.shell.common.DisplayImeController;
 import com.android.wm.shell.draganddrop.DragAndDropController;
 import com.android.wm.shell.splitscreen.SplitScreen;
@@ -31,15 +32,18 @@
     private final DragAndDropController mDragAndDropController;
     private final ShellTaskOrganizer mShellTaskOrganizer;
     private final Optional<SplitScreen> mSplitScreenOptional;
+    private final Optional<AppPairs> mAppPairsOptional;
 
     public ShellInit(DisplayImeController displayImeController,
             DragAndDropController dragAndDropController,
             ShellTaskOrganizer shellTaskOrganizer,
-            Optional<SplitScreen> splitScreenOptional) {
+            Optional<SplitScreen> splitScreenOptional,
+            Optional<AppPairs> appPairsOptional) {
         mDisplayImeController = displayImeController;
         mDragAndDropController = dragAndDropController;
         mShellTaskOrganizer = shellTaskOrganizer;
         mSplitScreenOptional = splitScreenOptional;
+        mAppPairsOptional = appPairsOptional;
     }
 
     public void init() {
@@ -47,6 +51,7 @@
         mDisplayImeController.startMonitorDisplays();
         // Register the shell organizer
         mShellTaskOrganizer.registerOrganizer();
+        mAppPairsOptional.ifPresent(AppPairs::onOrganizerRegistered);
         // Bind the splitscreen impl to the drag drop controller
         mDragAndDropController.setSplitScreenController(mSplitScreenOptional);
     }
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 ece063c..006fd9d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
@@ -26,7 +26,6 @@
 
 import android.annotation.IntDef;
 import android.app.ActivityManager.RunningTaskInfo;
-import android.app.WindowConfiguration.WindowingMode;
 import android.content.Context;
 import android.os.Binder;
 import android.os.IBinder;
@@ -39,6 +38,7 @@
 import android.window.TaskOrganizer;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.protolog.common.ProtoLog;
@@ -309,6 +309,15 @@
         }
     }
 
+    /** Gets running task by taskId. Returns {@code null} if no such task observed. */
+    @Nullable
+    public RunningTaskInfo getRunningTaskInfo(int taskId) {
+        synchronized (mLock) {
+            final TaskAppearedInfo info = mTasks.get(taskId);
+            return info != null ? info.getTaskInfo() : null;
+        }
+    }
+
     private boolean updateTaskListenerIfNeeded(RunningTaskInfo taskInfo, SurfaceControl leash,
             TaskListener oldListener, TaskListener newListener) {
         if (oldListener == newListener) return false;
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
new file mode 100644
index 0000000..d30acee
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.apppairs;
+
+import static android.app.ActivityTaskManager.INVALID_TASK_ID;
+import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
+
+import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_TASK_ORG;
+
+import android.app.ActivityManager;
+import android.graphics.Rect;
+import android.view.SurfaceControl;
+import android.window.WindowContainerToken;
+import android.window.WindowContainerTransaction;
+
+import androidx.annotation.NonNull;
+
+import com.android.internal.protolog.common.ProtoLog;
+import com.android.wm.shell.ShellTaskOrganizer;
+import com.android.wm.shell.common.SyncTransactionQueue;
+
+import java.io.PrintWriter;
+
+/**
+ * An app-pairs consisting of {@link #mRootTaskInfo} that acts as the hierarchy parent of
+ * {@link #mTaskInfo1} and {@link #mTaskInfo2} in the pair.
+ * Also includes all UI for managing the pair like the divider.
+ */
+// TODO: Add divider
+// TODO: Handle display rotation
+class AppPair implements ShellTaskOrganizer.TaskListener {
+    private static final String TAG = AppPair.class.getSimpleName();
+
+    private ActivityManager.RunningTaskInfo mRootTaskInfo;
+    private SurfaceControl mRootTaskLeash;
+    private ActivityManager.RunningTaskInfo mTaskInfo1;
+    private SurfaceControl mTaskLeash1;
+    private ActivityManager.RunningTaskInfo mTaskInfo2;
+    private SurfaceControl mTaskLeash2;
+
+    private final AppPairsController mController;
+    private final SyncTransactionQueue mSyncQueue;
+
+    AppPair(AppPairsController controller) {
+        mController = controller;
+        mSyncQueue = controller.getSyncTransactionQueue();
+    }
+
+    int getRootTaskId() {
+        return mRootTaskInfo != null ? mRootTaskInfo.taskId : INVALID_TASK_ID;
+    }
+
+    private int getTaskId1() {
+        return mTaskInfo1 != null ? mTaskInfo1.taskId : INVALID_TASK_ID;
+    }
+
+    private int getTaskId2() {
+        return mTaskInfo2 != null ? mTaskInfo2.taskId : INVALID_TASK_ID;
+    }
+
+    boolean contains(int taskId) {
+        return taskId == getRootTaskId() || taskId == getTaskId1() || taskId == getTaskId2();
+    }
+
+    boolean pair(ActivityManager.RunningTaskInfo task1, ActivityManager.RunningTaskInfo task2) {
+        ProtoLog.v(WM_SHELL_TASK_ORG, "pair task1=%d task2=%d in AppPair=%s",
+                task1.taskId, task2.taskId, this);
+
+        if (!task1.isResizeable || !task2.isResizeable) {
+            ProtoLog.e(WM_SHELL_TASK_ORG,
+                    "Can't pair unresizeable tasks task1.isResizeable=%b task1.isResizeable=%b",
+                    task1.isResizeable, task2.isResizeable);
+            return false;
+        }
+
+        mTaskInfo1 = task1;
+        mTaskInfo2 = task2;
+
+        // TODO: properly calculate bounds for pairs.
+        final Rect rootBounds = mRootTaskInfo.configuration.windowConfiguration.getBounds();
+        final Rect bounds1 = new Rect(
+                rootBounds.left, rootBounds.top, rootBounds.right / 2, rootBounds.bottom / 2);
+        final Rect bounds2 = new Rect(
+                bounds1.right, bounds1.bottom, rootBounds.right, rootBounds.bottom);
+        final WindowContainerToken token1 = task1.token;
+        final WindowContainerToken token2 = task2.token;
+        final WindowContainerTransaction wct = new WindowContainerTransaction();
+
+        wct.setHidden(mRootTaskInfo.token, false)
+                .reparent(token1, mRootTaskInfo.token, true /* onTop */)
+                .reparent(token2, mRootTaskInfo.token, true /* onTop */)
+                .setWindowingMode(token1, WINDOWING_MODE_MULTI_WINDOW)
+                .setWindowingMode(token2, WINDOWING_MODE_MULTI_WINDOW)
+                .setBounds(token1, bounds1)
+                .setBounds(token2, bounds2)
+                // Moving the root task to top after the child tasks were repareted , or the root
+                // task cannot be visible and focused.
+                .reorder(mRootTaskInfo.token, true);
+        mController.getTaskOrganizer().applyTransaction(wct);
+        return true;
+    }
+
+    void unpair() {
+        final WindowContainerToken token1 = mTaskInfo1.token;
+        final WindowContainerToken token2 = mTaskInfo2.token;
+        final WindowContainerTransaction wct = new WindowContainerTransaction();
+
+        // Reparent out of this container and reset windowing mode.
+        wct.setHidden(mRootTaskInfo.token, true)
+                .reorder(mRootTaskInfo.token, false)
+                .reparent(token1, null, false /* onTop */)
+                .reparent(token2, null, false /* onTop */)
+                .setWindowingMode(token1, WINDOWING_MODE_UNDEFINED)
+                .setWindowingMode(token2, WINDOWING_MODE_UNDEFINED);
+        mController.getTaskOrganizer().applyTransaction(wct);
+
+        mTaskInfo1 = null;
+        mTaskInfo2 = null;
+    }
+
+    @Override
+    public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) {
+        if (mRootTaskInfo == null || taskInfo.taskId == mRootTaskInfo.taskId) {
+            mRootTaskInfo = taskInfo;
+            mRootTaskLeash = leash;
+        } else if (taskInfo.taskId == getTaskId1()) {
+            mTaskInfo1 = taskInfo;
+            mTaskLeash1 = leash;
+        } else if (taskInfo.taskId == getTaskId2()) {
+            mTaskInfo2 = taskInfo;
+            mTaskLeash2 = leash;
+        } else {
+            throw new IllegalStateException("Unknown task=" + taskInfo.taskId);
+        }
+
+        if (mTaskLeash1 == null || mTaskLeash2 == null) return;
+
+        // TODO: Is there more we need to do here?
+        mSyncQueue.runInSync(t -> t
+                .setPosition(mTaskLeash1, mTaskInfo1.positionInParent.x,
+                        mTaskInfo1.positionInParent.y)
+                .setPosition(mTaskLeash2, mTaskInfo2.positionInParent.x,
+                        mTaskInfo2.positionInParent.y)
+                .show(mRootTaskLeash)
+                .show(mTaskLeash1)
+                .show(mTaskLeash2));
+    }
+
+    @Override
+    public void onTaskInfoChanged(ActivityManager.RunningTaskInfo taskInfo) {
+        if (taskInfo.taskId == getRootTaskId()) {
+            mRootTaskInfo = taskInfo;
+        } else if (taskInfo.taskId == getTaskId1()) {
+            mTaskInfo1 = taskInfo;
+        } else if (taskInfo.taskId == getTaskId2()) {
+            mTaskInfo2 = taskInfo;
+        } else {
+            throw new IllegalStateException("Unknown task=" + taskInfo.taskId);
+        }
+    }
+
+    @Override
+    public void onTaskVanished(ActivityManager.RunningTaskInfo taskInfo) {
+        if (taskInfo.taskId == getRootTaskId()) {
+            // We don't want to release this object back to the pool since the root task went away.
+            mController.unpair(mRootTaskInfo.taskId, false /* releaseToPool */);
+        } else if (taskInfo.taskId == getTaskId1() || taskInfo.taskId == getTaskId2()) {
+            mController.unpair(mRootTaskInfo.taskId);
+        }
+    }
+
+    @Override
+    public void dump(@NonNull PrintWriter pw, String prefix) {
+        final String innerPrefix = prefix + "  ";
+        final String childPrefix = innerPrefix + "  ";
+        pw.println(prefix + this);
+        pw.println(innerPrefix + "Root taskId=" + getRootTaskId()
+                + " winMode=" + mRootTaskInfo.getWindowingMode());
+        if (mTaskInfo1 != null) {
+            pw.println(innerPrefix + "1 taskId=" + mTaskInfo1.taskId
+                    + " winMode=" + mTaskInfo1.getWindowingMode());
+        }
+        if (mTaskInfo2 != null) {
+            pw.println(innerPrefix + "2 taskId=" + mTaskInfo2.taskId
+                    + " winMode=" + mTaskInfo2.getWindowingMode());
+        }
+    }
+
+    @Override
+    public String toString() {
+        return TAG + "#" + getRootTaskId();
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairs.java b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairs.java
new file mode 100644
index 0000000..ef3e3e0
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairs.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.apppairs;
+
+import android.app.ActivityManager;
+
+import androidx.annotation.NonNull;
+
+import java.io.PrintWriter;
+
+/**
+ * Interface to engage app pairs feature.
+ */
+public interface AppPairs {
+    /** Pairs indicated tasks. */
+    boolean pair(int task1, int task2);
+    /** Pairs indicated tasks. */
+    boolean pair(ActivityManager.RunningTaskInfo task1, ActivityManager.RunningTaskInfo task2);
+    /** Unpairs any app-pair containing this task id. */
+    void unpair(int taskId);
+    /** Dumps current status of app pairs. */
+    void dump(@NonNull PrintWriter pw, String prefix);
+    /** Called when the shell organizer has been registered. */
+    void onOrganizerRegistered();
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsController.java
new file mode 100644
index 0000000..e0c7ba9
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsController.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.apppairs;
+
+import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_TASK_ORG;
+
+import android.app.ActivityManager;
+import android.util.SparseArray;
+
+import androidx.annotation.NonNull;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.protolog.common.ProtoLog;
+import com.android.wm.shell.ShellTaskOrganizer;
+import com.android.wm.shell.common.SyncTransactionQueue;
+
+import java.io.PrintWriter;
+
+/**
+ * Class manages app-pairs multitasking mode and implements the main interface {@link AppPairs}.
+ */
+public class AppPairsController implements AppPairs {
+    private static final String TAG = AppPairsController.class.getSimpleName();
+
+    private final ShellTaskOrganizer mTaskOrganizer;
+    private final SyncTransactionQueue mSyncQueue;
+
+    private AppPairsPool mPairsPool;
+    // Active app-pairs mapped by root task id key.
+    private final SparseArray<AppPair> mActiveAppPairs = new SparseArray<>();
+
+    public AppPairsController(ShellTaskOrganizer organizer, SyncTransactionQueue syncQueue) {
+        mTaskOrganizer = organizer;
+        mSyncQueue = syncQueue;
+    }
+
+    @Override
+    public void onOrganizerRegistered() {
+        if (mPairsPool == null) {
+            setPairsPool(new AppPairsPool(this));
+        }
+    }
+
+    @VisibleForTesting
+    void setPairsPool(AppPairsPool pool) {
+        mPairsPool = pool;
+    }
+
+    @Override
+    public boolean pair(int taskId1, int taskId2) {
+        final ActivityManager.RunningTaskInfo task1 = mTaskOrganizer.getRunningTaskInfo(taskId1);
+        final ActivityManager.RunningTaskInfo task2 = mTaskOrganizer.getRunningTaskInfo(taskId2);
+        if (task1 == null || task2 == null) {
+            return false;
+        }
+        return pair(task1, task2);
+    }
+
+    @Override
+    public boolean pair(ActivityManager.RunningTaskInfo task1,
+            ActivityManager.RunningTaskInfo task2) {
+        return pairInner(task1, task2) != null;
+    }
+
+    @VisibleForTesting
+    AppPair pairInner(
+            @NonNull ActivityManager.RunningTaskInfo task1,
+            @NonNull ActivityManager.RunningTaskInfo task2) {
+        final AppPair pair = mPairsPool.acquire();
+        if (!pair.pair(task1, task2)) {
+            mPairsPool.release(pair);
+            return null;
+        }
+
+        mActiveAppPairs.put(pair.getRootTaskId(), pair);
+        return pair;
+    }
+
+    @Override
+    public void unpair(int taskId) {
+        unpair(taskId, true /* releaseToPool */);
+    }
+
+    void unpair(int taskId, boolean releaseToPool) {
+        AppPair pair = mActiveAppPairs.get(taskId);
+        if (pair == null) {
+            for (int i = mActiveAppPairs.size() - 1; i >= 0; --i) {
+                final AppPair candidate = mActiveAppPairs.valueAt(i);
+                if (candidate.contains(taskId)) {
+                    pair = candidate;
+                    break;
+                }
+            }
+        }
+        if (pair == null) {
+            ProtoLog.v(WM_SHELL_TASK_ORG, "taskId %d isn't isn't in an app-pair.", taskId);
+            return;
+        }
+
+        ProtoLog.v(WM_SHELL_TASK_ORG, "unpair taskId=%d pair=%s", taskId, pair);
+        mActiveAppPairs.remove(pair.getRootTaskId());
+        pair.unpair();
+        if (releaseToPool) {
+            mPairsPool.release(pair);
+        }
+    }
+
+    ShellTaskOrganizer getTaskOrganizer() {
+        return mTaskOrganizer;
+    }
+
+    SyncTransactionQueue getSyncTransactionQueue() {
+        return mSyncQueue;
+    }
+
+    @Override
+    public void dump(@NonNull PrintWriter pw, String prefix) {
+        final String innerPrefix = prefix + "  ";
+        final String childPrefix = innerPrefix + "  ";
+        pw.println(prefix + this);
+
+        for (int i = mActiveAppPairs.size() - 1; i >= 0; --i) {
+            mActiveAppPairs.valueAt(i).dump(pw, childPrefix);
+        }
+
+        if (mPairsPool != null) {
+            mPairsPool.dump(pw, prefix);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return TAG + "#" + mActiveAppPairs.size();
+    }
+
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsPool.java b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsPool.java
new file mode 100644
index 0000000..5c6037e
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsPool.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.apppairs;
+
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.view.Display.DEFAULT_DISPLAY;
+
+import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_TASK_ORG;
+
+import androidx.annotation.NonNull;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.protolog.common.ProtoLog;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+
+/**
+ * Class that manager pool of {@link AppPair} objects. Helps reduce the need to call system_server
+ *  to create a root task for the app-pair when needed since we always have one ready to go.
+ */
+class AppPairsPool {
+    private static final String TAG = AppPairsPool.class.getSimpleName();
+
+    @VisibleForTesting
+    final AppPairsController mController;
+    // The pool
+    private final ArrayList<AppPair> mPool = new ArrayList();
+
+    AppPairsPool(AppPairsController controller) {
+        mController = controller;
+        incrementPool();
+    }
+
+    AppPair acquire() {
+        final AppPair entry = mPool.remove(mPool.size() - 1);
+        ProtoLog.v(WM_SHELL_TASK_ORG, "acquire entry.taskId=%s listener=%s size=%d",
+                entry.getRootTaskId(), entry, mPool.size());
+        if (mPool.size() == 0) {
+            incrementPool();
+        }
+        return entry;
+    }
+
+    void release(AppPair entry) {
+        mPool.add(entry);
+        ProtoLog.v(WM_SHELL_TASK_ORG, "release entry.taskId=%s listener=%s size=%d",
+                entry.getRootTaskId(), entry, mPool.size());
+    }
+
+    @VisibleForTesting
+    void incrementPool() {
+        ProtoLog.v(WM_SHELL_TASK_ORG, "incrementPool size=%d", mPool.size());
+        final AppPair entry = new AppPair(mController);
+        // TODO: multi-display...
+        mController.getTaskOrganizer().createRootTask(
+                DEFAULT_DISPLAY, WINDOWING_MODE_FULLSCREEN, entry);
+        mPool.add(entry);
+    }
+
+    @VisibleForTesting
+    int poolSize() {
+        return mPool.size();
+    }
+
+    public void dump(@NonNull PrintWriter pw, String prefix) {
+        final String innerPrefix = prefix + "  ";
+        final String childPrefix = innerPrefix + "  ";
+        pw.println(prefix + this);
+        for (int i = mPool.size() - 1; i >= 0; --i) {
+            mPool.get(i).dump(pw, childPrefix);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return TAG + "#" + mPool.size();
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java
index 4d06c03..32c6e36 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java
@@ -31,7 +31,6 @@
 import android.widget.ImageView;
 
 import com.android.launcher3.icons.DotRenderer;
-import com.android.wm.shell.R;
 import com.android.wm.shell.animation.Interpolators;
 
 import java.util.EnumSet;
@@ -75,9 +74,8 @@
     private boolean mDotIsAnimating = false;
 
     private BubbleViewProvider mBubble;
+    private BubblePositioner mPositioner;
 
-    private int mBubbleBitmapSize;
-    private int mBubbleSize;
     private DotRenderer mDotRenderer;
     private DotRenderer.DrawParams mDrawParams;
     private boolean mOnLeft;
@@ -101,18 +99,21 @@
     public BadgedImageView(Context context, AttributeSet attrs, int defStyleAttr,
             int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
-        mBubbleBitmapSize = getResources().getDimensionPixelSize(R.dimen.bubble_bitmap_size);
-        mBubbleSize = getResources().getDimensionPixelSize(R.dimen.individual_bubble_size);
         mDrawParams = new DotRenderer.DrawParams();
 
-        Path iconPath = PathParser.createPathFromPathData(
-                getResources().getString(com.android.internal.R.string.config_icon_mask));
-        mDotRenderer = new DotRenderer(mBubbleBitmapSize, iconPath, DEFAULT_PATH_SIZE);
-
         setFocusable(true);
         setClickable(true);
     }
 
+    public void initialize(BubblePositioner positioner) {
+        mPositioner = positioner;
+
+        Path iconPath = PathParser.createPathFromPathData(
+                getResources().getString(com.android.internal.R.string.config_icon_mask));
+        mDotRenderer = new DotRenderer(mPositioner.getBubbleBitmapSize(),
+                iconPath, DEFAULT_PATH_SIZE);
+    }
+
     public void showDotAndBadge(boolean onLeft) {
         removeDotSuppressionFlag(BadgedImageView.SuppressionFlag.BEHIND_STACK);
         animateDotBadgePositions(onLeft);
@@ -186,7 +187,8 @@
      * @param iconPath The new icon path to use when calculating dot position.
      */
     void drawDot(Path iconPath) {
-        mDotRenderer = new DotRenderer(mBubbleBitmapSize, iconPath, DEFAULT_PATH_SIZE);
+        mDotRenderer = new DotRenderer(mPositioner.getBubbleBitmapSize(),
+                iconPath, DEFAULT_PATH_SIZE);
         invalidate();
     }
 
@@ -310,13 +312,13 @@
 
         bubbleCanvas.setDrawFilter(new PaintFlagsDrawFilter(DITHER_FLAG, FILTER_BITMAP_FLAG));
         bubbleCanvas.setBitmap(bubble);
-
-        final int badgeSize = (int) (ICON_BADGE_SCALE * mBubbleSize);
+        final int bubbleSize = bubble.getWidth();
+        final int badgeSize = (int) (ICON_BADGE_SCALE * bubbleSize);
         if (mOnLeft) {
-            badge.setBounds(0, mBubbleSize - badgeSize, badgeSize, mBubbleSize);
+            badge.setBounds(0, bubbleSize - badgeSize, badgeSize, bubbleSize);
         } else {
-            badge.setBounds(mBubbleSize - badgeSize, mBubbleSize - badgeSize,
-                    mBubbleSize, mBubbleSize);
+            badge.setBounds(bubbleSize - badgeSize, bubbleSize - badgeSize,
+                    bubbleSize, bubbleSize);
         }
         badge.draw(bubbleCanvas);
         bubbleCanvas.setBitmap(null);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
index 93ed395..122f917 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
@@ -310,7 +310,7 @@
      *
      * @param callback the callback to notify one the bubble is ready to be displayed.
      * @param context the context for the bubble.
-     * @param controller
+     * @param controller the bubble controller.
      * @param stackView the stackView the bubble is eventually added to.
      * @param iconFactory the iconfactory use to create badged images for the bubble.
      */
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
index 05acb55..eb3a3a2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
@@ -95,12 +95,6 @@
     private BubblePositioner mBubblePositioner;
     private SysuiProxy mSysuiProxy;
 
-    /**
-     * The relative position of the stack when we removed it and nulled it out. If the stack is
-     * re-created, it will re-appear at this position.
-     */
-    @Nullable private BubbleStackView.RelativeStackPosition mPositionFromRemovedStack;
-
     // Tracks the id of the current (foreground) user.
     private int mCurrentUserId;
     // Saves notification keys of active bubbles when users are switched.
@@ -176,12 +170,12 @@
             Handler mainHandler,
             ShellTaskOrganizer organizer) {
         BubbleLogger logger = new BubbleLogger(uiEventLogger);
-        return new BubbleController(context,
-                new BubbleData(context, logger), synchronizer,
-                floatingContentCoordinator, new BubbleDataRepository(context, launcherApps),
-                statusBarService, windowManager,
-                windowManagerShellWrapper, launcherApps, logger, mainHandler, organizer,
-                new BubblePositioner(context, windowManager));
+        BubblePositioner positioner = new BubblePositioner(context, windowManager);
+        BubbleData data = new BubbleData(context, logger, positioner);
+        return new BubbleController(context, data, synchronizer, floatingContentCoordinator,
+                new BubbleDataRepository(context, launcherApps),
+                statusBarService, windowManager, windowManagerShellWrapper, launcherApps,
+                logger, mainHandler, organizer, positioner);
     }
 
     /**
@@ -207,6 +201,7 @@
         mLogger = bubbleLogger;
         mMainHandler = mainHandler;
 
+        mBubblePositioner = positioner;
         mBubbleData = data;
         mBubbleData.setListener(mBubbleDataListener);
         mBubbleData.setSuppressionChangedListener(bubble -> {
@@ -249,7 +244,6 @@
 
         mBubbleIconFactory = new BubbleIconFactory(context);
         mTaskOrganizer = organizer;
-        mBubblePositioner = positioner;
 
         launcherApps.registerCallback(new LauncherApps.Callback() {
             @Override
@@ -388,8 +382,6 @@
         if (mStackView == null) {
             mStackView = new BubbleStackView(
                     mContext, this, mBubbleData, mSurfaceSynchronizer, mFloatingContentCoordinator);
-            mStackView.setStackStartPosition(mPositionFromRemovedStack);
-            mStackView.addView(mBubbleScrim);
             mStackView.onOrientationChanged();
             if (mExpandListener != null) {
                 mStackView.setExpandListener(mExpandListener);
@@ -429,7 +421,11 @@
 
         try {
             mAddedToWindowManager = true;
+            mBubbleData.getOverflow().initialize(this);
+            mStackView.addView(mBubbleScrim);
             mWindowManager.addView(mStackView, mWmLayoutParams);
+            // Position info is dependent on us being attached to a window
+            mBubblePositioner.update(mOrientation);
         } catch (IllegalStateException e) {
             // This means the stack has already been added. This shouldn't happen...
             e.printStackTrace();
@@ -449,10 +445,9 @@
         try {
             mAddedToWindowManager = false;
             if (mStackView != null) {
-                mPositionFromRemovedStack = mStackView.getRelativeStackPosition();
                 mWindowManager.removeView(mStackView);
                 mStackView.removeView(mBubbleScrim);
-                mStackView = null;
+                mBubbleData.getOverflow().cleanUpExpandedState();
             } else {
                 Log.w(TAG, "StackView added to WindowManager, but was null when removing!");
             }
@@ -544,7 +539,7 @@
             }
             if (newConfig.fontScale != mFontScale) {
                 mFontScale = newConfig.fontScale;
-                mStackView.updateFlyout(mFontScale);
+                mStackView.updateFontScale(mFontScale);
             }
             if (newConfig.getLayoutDirection() != mLayoutDirection) {
                 mLayoutDirection = newConfig.getLayoutDirection();
@@ -584,7 +579,7 @@
         if (mStackView == null) {
             return false;
         }
-        return mBubbleData.hasBubbles();
+        return mBubbleData.hasBubbles() || mBubbleData.isShowingOverflow();
     }
 
     @Override
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
index b6a97e2..e24ff06 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
@@ -69,7 +69,7 @@
         boolean selectionChanged;
         boolean orderChanged;
         boolean expanded;
-        @Nullable Bubble selectedBubble;
+        @Nullable BubbleViewProvider selectedBubble;
         @Nullable Bubble addedBubble;
         @Nullable Bubble updatedBubble;
         @Nullable Bubble addedOverflowBubble;
@@ -116,13 +116,15 @@
     }
 
     private final Context mContext;
+    private final BubblePositioner mPositioner;
     /** Bubbles that are actively in the stack. */
     private final List<Bubble> mBubbles;
     /** Bubbles that aged out to overflow. */
     private final List<Bubble> mOverflowBubbles;
     /** Bubbles that are being loaded but haven't been added to the stack just yet. */
     private final HashMap<String, Bubble> mPendingBubbles;
-    private Bubble mSelectedBubble;
+    private BubbleViewProvider mSelectedBubble;
+    private final BubbleOverflow mOverflow;
     private boolean mShowingOverflow;
     private boolean mExpanded;
     private final int mMaxBubbles;
@@ -153,9 +155,11 @@
      */
     private HashMap<String, String> mSuppressedGroupKeys = new HashMap<>();
 
-    public BubbleData(Context context, BubbleLogger bubbleLogger) {
+    public BubbleData(Context context, BubbleLogger bubbleLogger, BubblePositioner positioner) {
         mContext = context;
         mLogger = bubbleLogger;
+        mPositioner = positioner;
+        mOverflow = new BubbleOverflow(context, positioner);
         mBubbles = new ArrayList<>();
         mOverflowBubbles = new ArrayList<>();
         mPendingBubbles = new HashMap<>();
@@ -178,6 +182,10 @@
         return !mBubbles.isEmpty();
     }
 
+    public boolean hasOverflowBubbles() {
+        return !mOverflowBubbles.isEmpty();
+    }
+
     public boolean isExpanded() {
         return mExpanded;
     }
@@ -195,10 +203,14 @@
     }
 
     @Nullable
-    public Bubble getSelectedBubble() {
+    public BubbleViewProvider getSelectedBubble() {
         return mSelectedBubble;
     }
 
+    public BubbleOverflow getOverflow() {
+        return mOverflow;
+    }
+
     /** Return a read-only current active bubble lists. */
     public List<Bubble> getActiveBubbles() {
         return Collections.unmodifiableList(mBubbles);
@@ -212,7 +224,7 @@
         dispatchPendingChanges();
     }
 
-    public void setSelectedBubble(Bubble bubble) {
+    public void setSelectedBubble(BubbleViewProvider bubble) {
         if (DEBUG_BUBBLE_DATA) {
             Log.d(TAG, "setSelectedBubble: " + bubble);
         }
@@ -224,6 +236,10 @@
         mShowingOverflow = showingOverflow;
     }
 
+    boolean isShowingOverflow() {
+        return mShowingOverflow && (isExpanded() || mPositioner.showingInTaskbar());
+    }
+
     /**
      * Constructs a new bubble or returns an existing one. Does not add new bubbles to
      * bubble data, must go through {@link #notificationEntryUpdated(Bubble, boolean, boolean)}
@@ -264,8 +280,8 @@
 
     /**
      * When this method is called it is expected that all info in the bubble has completed loading.
-     * @see Bubble#inflate(BubbleViewInfoTask.Callback, Context,
-     * BubbleStackView, BubbleIconFactory, boolean).
+     * @see Bubble#inflate(BubbleViewInfoTask.Callback, Context, BubbleController, BubbleStackView,
+     * BubbleIconFactory, boolean)
      */
     void notificationEntryUpdated(Bubble bubble, boolean suppressFlyout, boolean showInShade) {
         if (DEBUG_BUBBLE_DATA) {
@@ -484,10 +500,17 @@
         Bubble bubbleToRemove = mBubbles.get(indexToRemove);
         bubbleToRemove.stopInflation();
         if (mBubbles.size() == 1) {
-            // Going to become empty, handle specially.
-            setExpandedInternal(false);
-            // Don't use setSelectedBubbleInternal because we don't want to trigger an applyUpdate
-            mSelectedBubble = null;
+            if (hasOverflowBubbles() && (mPositioner.showingInTaskbar() || isExpanded())) {
+                // No more active bubbles but we have stuff in the overflow -- select that view
+                // if we're already expanded or always showing.
+                setShowingOverflow(true);
+                setSelectedBubbleInternal(mOverflow);
+            } else {
+                setExpandedInternal(false);
+                // Don't use setSelectedBubbleInternal because we don't want to trigger an
+                // applyUpdate
+                mSelectedBubble = null;
+            }
         }
         if (indexToRemove < mBubbles.size() - 1) {
             // Removing anything but the last bubble means positions will change.
@@ -505,7 +528,7 @@
         if (Objects.equals(mSelectedBubble, bubbleToRemove)) {
             // Move selection to the new bubble at the same position.
             int newIndex = Math.min(indexToRemove, mBubbles.size() - 1);
-            Bubble newSelected = mBubbles.get(newIndex);
+            BubbleViewProvider newSelected = mBubbles.get(newIndex);
             setSelectedBubbleInternal(newSelected);
         }
         maybeSendDeleteIntent(reason, bubbleToRemove);
@@ -564,7 +587,7 @@
      *
      * @param bubble the new selected bubble
      */
-    private void setSelectedBubbleInternal(@Nullable Bubble bubble) {
+    private void setSelectedBubbleInternal(@Nullable BubbleViewProvider bubble) {
         if (DEBUG_BUBBLE_DATA) {
             Log.d(TAG, "setSelectedBubbleInternal: " + bubble);
         }
@@ -572,14 +595,17 @@
             return;
         }
         // Otherwise, if we are showing the overflow menu, return to the previously selected bubble.
-
-        if (bubble != null && !mBubbles.contains(bubble) && !mOverflowBubbles.contains(bubble)) {
+        boolean isOverflow = bubble != null && BubbleOverflow.KEY.equals(bubble.getKey());
+        if (bubble != null
+                && !mBubbles.contains(bubble)
+                && !mOverflowBubbles.contains(bubble)
+                && !isOverflow) {
             Log.e(TAG, "Cannot select bubble which doesn't exist!"
                     + " (" + bubble + ") bubbles=" + mBubbles);
             return;
         }
-        if (mExpanded && bubble != null) {
-            bubble.markAsAccessedAt(mTimeSource.currentTimeMillis());
+        if (mExpanded && bubble != null && !isOverflow) {
+            ((Bubble) bubble).markAsAccessedAt(mTimeSource.currentTimeMillis());
         }
         mSelectedBubble = bubble;
         mStateChange.selectedBubble = bubble;
@@ -629,7 +655,7 @@
             return;
         }
         if (shouldExpand) {
-            if (mBubbles.isEmpty()) {
+            if (mBubbles.isEmpty() && !mShowingOverflow) {
                 Log.e(TAG, "Attempt to expand stack when empty!");
                 return;
             }
@@ -637,7 +663,9 @@
                 Log.e(TAG, "Attempt to expand stack without selected bubble!");
                 return;
             }
-            mSelectedBubble.markAsAccessedAt(mTimeSource.currentTimeMillis());
+            if (mSelectedBubble instanceof Bubble) {
+                ((Bubble) mSelectedBubble).markAsAccessedAt(mTimeSource.currentTimeMillis());
+            }
             mStateChange.orderChanged |= repackAll();
         } else if (!mBubbles.isEmpty()) {
             // Apply ordering and grouping rules from expanded -> collapsed, then save
@@ -647,14 +675,18 @@
 
             if (mShowingOverflow) {
                 // Show previously selected bubble instead of overflow menu on next expansion.
-                setSelectedBubbleInternal(mSelectedBubble);
+                if (!mSelectedBubble.getKey().equals(mOverflow.getKey())) {
+                    setSelectedBubbleInternal(mSelectedBubble);
+                } else {
+                    setSelectedBubbleInternal(mBubbles.get(0));
+                }
             }
             if (mBubbles.indexOf(mSelectedBubble) > 0) {
                 // Move the selected bubble to the top while collapsed.
                 int index = mBubbles.indexOf(mSelectedBubble);
                 if (index != 0) {
-                    mBubbles.remove(mSelectedBubble);
-                    mBubbles.add(0, mSelectedBubble);
+                    mBubbles.remove((Bubble) mSelectedBubble);
+                    mBubbles.add(0, (Bubble) mSelectedBubble);
                     mStateChange.orderChanged = true;
                 }
             }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDebugConfig.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDebugConfig.java
index 53f4e87..dc2ace9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDebugConfig.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDebugConfig.java
@@ -45,6 +45,7 @@
     static final boolean DEBUG_EXPERIMENTS = true;
     static final boolean DEBUG_OVERFLOW = false;
     static final boolean DEBUG_USER_EDUCATION = false;
+    static final boolean DEBUG_POSITIONER = false;
 
     private static final boolean FORCE_SHOW_USER_EDUCATION = false;
     private static final String FORCE_SHOW_USER_EDUCATION_SETTING =
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
index 74521c7..45ffe6b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
@@ -29,6 +29,7 @@
 import android.annotation.NonNull;
 import android.annotation.SuppressLint;
 import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
 import android.app.PendingIntent;
 import android.content.ComponentName;
 import android.content.Context;
@@ -41,6 +42,7 @@
 import android.graphics.Rect;
 import android.graphics.drawable.ShapeDrawable;
 import android.os.Bundle;
+import android.os.RemoteException;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.SurfaceControl;
@@ -639,12 +641,21 @@
     }
 
     /**
-     * Cleans up anything related to the task and TaskView.
+     * Cleans up anything related to the task and TaskView. If this view should be reused after this
+     * method is called, then {@link #initialize(BubbleController, BubbleStackView)} must be invoked
+     * first.
      */
     public void cleanUpExpandedState() {
         if (DEBUG_BUBBLE_EXPANDED_VIEW) {
             Log.d(TAG, "cleanUpExpandedState: bubble=" + getBubbleKey() + " task=" + mTaskId);
         }
+        if (getTaskId() != INVALID_TASK_ID) {
+            try {
+                ActivityTaskManager.getService().removeTask(getTaskId());
+            } catch (RemoteException e) {
+                Log.w(TAG, e.getMessage());
+            }
+        }
         if (mTaskView != null) {
             mTaskView.release();
         }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java
index 460e0e7..19c3cf9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java
@@ -68,9 +68,8 @@
     private final int mFlyoutPadding;
     private final int mFlyoutSpaceFromBubble;
     private final int mPointerSize;
-    private final int mBubbleSize;
-    private final int mBubbleBitmapSize;
-    private final float mBubbleIconTopPadding;
+    private int mBubbleSize;
+    private int mBubbleBitmapSize;
 
     private final int mFlyoutElevation;
     private final int mBubbleElevation;
@@ -83,9 +82,9 @@
     private final TextView mMessageText;
 
     /** Values related to the 'new' dot which we use to figure out where to collapse the flyout. */
-    private final float mNewDotRadius;
-    private final float mNewDotSize;
-    private final float mOriginalDotSize;
+    private float mNewDotRadius;
+    private float mNewDotSize;
+    private float mOriginalDotSize;
 
     /**
      * The paint used to draw the background, whose color changes as the flyout transitions to the
@@ -169,17 +168,9 @@
         mFlyoutSpaceFromBubble = res.getDimensionPixelSize(R.dimen.bubble_flyout_space_from_bubble);
         mPointerSize = res.getDimensionPixelSize(R.dimen.bubble_flyout_pointer_size);
 
-        mBubbleSize = res.getDimensionPixelSize(R.dimen.individual_bubble_size);
-        mBubbleBitmapSize = res.getDimensionPixelSize(R.dimen.bubble_bitmap_size);
-        mBubbleIconTopPadding  = (mBubbleSize - mBubbleBitmapSize) / 2f;
-
         mBubbleElevation = res.getDimensionPixelSize(R.dimen.bubble_elevation);
         mFlyoutElevation = res.getDimensionPixelSize(R.dimen.bubble_flyout_elevation);
 
-        mOriginalDotSize = SIZE_PERCENTAGE * mBubbleBitmapSize;
-        mNewDotRadius = (DOT_SCALE * mOriginalDotSize) / 2f;
-        mNewDotSize = mNewDotRadius * 2f;
-
         final TypedArray ta = mContext.obtainStyledAttributes(
                 new int[] {
                         android.R.attr.colorBackgroundFloating,
@@ -306,7 +297,15 @@
             @Nullable Runnable onLayoutComplete,
             @Nullable Runnable onHide,
             float[] dotCenter,
-            boolean hideDot)  {
+            boolean hideDot,
+            BubblePositioner positioner)  {
+
+        mBubbleBitmapSize = positioner.getBubbleBitmapSize();
+        mBubbleSize = positioner.getBubbleSize();
+
+        mOriginalDotSize = SIZE_PERCENTAGE * mBubbleBitmapSize;
+        mNewDotRadius = (DOT_SCALE * mOriginalDotSize) / 2f;
+        mNewDotSize = mNewDotRadius * 2f;
 
         updateFlyoutMessage(flyoutMessage, parentWidth);
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt
index 686d2d4..8ab2f63 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt
@@ -29,14 +29,18 @@
 import android.util.PathParser
 import android.util.TypedValue
 import android.view.LayoutInflater
-import android.view.View
 import android.widget.FrameLayout
 import com.android.wm.shell.R
 
+/**
+ * The icon in the bubble overflow is scaled down, this is the percent of the normal bubble bitmap
+ * size to use.
+ */
+const val ICON_BITMAP_SIZE_PERCENT = 0.46f
+
 class BubbleOverflow(
     private val context: Context,
-    private val controller: BubbleController,
-    private val stack: BubbleStackView
+    private val positioner: BubblePositioner
 ) : BubbleViewProvider {
 
     private lateinit var bitmap: Bitmap
@@ -48,41 +52,42 @@
     private var showDot = false
 
     private val inflater: LayoutInflater = LayoutInflater.from(context)
-    private val expandedView: BubbleExpandedView = inflater
-        .inflate(R.layout.bubble_expanded_view, null /* root */, false /* attachToRoot */)
-            as BubbleExpandedView
-    private val overflowBtn: BadgedImageView = inflater
-        .inflate(R.layout.bubble_overflow_button, null /* root */, false /* attachToRoot */)
-            as BadgedImageView
+    private var expandedView: BubbleExpandedView?
+    private var overflowBtn: BadgedImageView?
+
     init {
         updateResources()
-        with(expandedView) {
-            initialize(controller, stack)
-            setOverflow(true)
-            applyThemeAttrs()
-        }
-        with(overflowBtn) {
-            setContentDescription(context.resources.getString(
-                R.string.bubble_overflow_button_content_description))
-            updateBtnTheme()
-        }
+        bitmapSize = positioner.bubbleBitmapSize
+        iconBitmapSize = (bitmapSize * ICON_BITMAP_SIZE_PERCENT).toInt()
+        expandedView = null
+        overflowBtn = null
+    }
+
+    /** Call before use and again if cleanUpExpandedState was called.  */
+    fun initialize(controller: BubbleController) {
+        getExpandedView()?.initialize(controller, controller.stackView)
+        getExpandedView()?.setOverflow(true)
+    }
+
+    fun cleanUpExpandedState() {
+        expandedView?.cleanUpExpandedState()
+        expandedView = null
     }
 
     fun update() {
         updateResources()
-        expandedView.applyThemeAttrs()
+        getExpandedView()?.applyThemeAttrs()
         // Apply inset and new style to fresh icon drawable.
-        overflowBtn.setImageResource(R.drawable.bubble_ic_overflow_button)
+        getIconView()?.setImageResource(R.drawable.bubble_ic_overflow_button)
         updateBtnTheme()
     }
 
     fun updateResources() {
-        bitmapSize = context.resources.getDimensionPixelSize(R.dimen.bubble_bitmap_size)
-        iconBitmapSize = context.resources.getDimensionPixelSize(
-                R.dimen.bubble_overflow_icon_bitmap_size)
-        val bubbleSize = context.resources.getDimensionPixelSize(R.dimen.individual_bubble_size)
-        overflowBtn.setLayoutParams(FrameLayout.LayoutParams(bubbleSize, bubbleSize))
-        expandedView.updateDimensions()
+        bitmapSize = positioner.bubbleBitmapSize
+        iconBitmapSize = (bitmapSize * 0.46f).toInt()
+        val bubbleSize = positioner.bubbleSize
+        overflowBtn?.setLayoutParams(FrameLayout.LayoutParams(bubbleSize, bubbleSize))
+        expandedView?.updateDimensions()
     }
 
     private fun updateBtnTheme() {
@@ -92,7 +97,7 @@
         val typedValue = TypedValue()
         context.theme.resolveAttribute(android.R.attr.colorAccent, typedValue, true)
         val colorAccent = res.getColor(typedValue.resourceId)
-        overflowBtn.drawable?.setTint(colorAccent)
+        overflowBtn?.drawable?.setTint(colorAccent)
         dotColor = colorAccent
 
         val iconFactory = BubbleIconFactory(context)
@@ -103,7 +108,7 @@
         val bg = ColorDrawable(res.getColor(
             if (nightMode) R.color.bubbles_dark else R.color.bubbles_light))
 
-        val fg = InsetDrawable(overflowBtn.drawable,
+        val fg = InsetDrawable(overflowBtn?.drawable,
             bitmapSize - iconBitmapSize /* inset */)
         bitmap = iconFactory.createBadgedIconBitmap(AdaptiveIconDrawable(bg, fg),
             null /* user */, true /* shrinkNonAdaptiveIcons */).icon
@@ -111,7 +116,7 @@
         // Update dot path
         dotPath = PathParser.createPathFromPathData(
             res.getString(com.android.internal.R.string.config_icon_mask))
-        val scale = iconFactory.normalizer.getScale(overflowBtn.getDrawable(),
+        val scale = iconFactory.normalizer.getScale(getIconView()!!.getDrawable(),
             null /* outBounds */, null /* path */, null /* outMaskShape */)
         val radius = BadgedImageView.DEFAULT_PATH_SIZE / 2f
         val matrix = Matrix()
@@ -120,20 +125,26 @@
         dotPath.transform(matrix)
 
         // Attach BubbleOverflow to BadgedImageView
-        overflowBtn.setRenderedBubble(this)
-        overflowBtn.removeDotSuppressionFlag(BadgedImageView.SuppressionFlag.FLYOUT_VISIBLE)
+        overflowBtn?.setRenderedBubble(this)
+        overflowBtn?.removeDotSuppressionFlag(BadgedImageView.SuppressionFlag.FLYOUT_VISIBLE)
     }
 
     fun setVisible(visible: Int) {
-        overflowBtn.visibility = visible
+        overflowBtn?.visibility = visible
     }
 
     fun setShowDot(show: Boolean) {
         showDot = show
-        overflowBtn.updateDotVisibility(true /* animate */)
+        overflowBtn?.updateDotVisibility(true /* animate */)
     }
 
     override fun getExpandedView(): BubbleExpandedView? {
+        if (expandedView == null) {
+            expandedView = inflater.inflate(R.layout.bubble_expanded_view,
+                    null /* root */, false /* attachToRoot */) as BubbleExpandedView
+            expandedView?.applyThemeAttrs()
+            updateResources()
+        }
         return expandedView
     }
 
@@ -158,10 +169,20 @@
     }
 
     override fun setContentVisibility(visible: Boolean) {
-        expandedView.setContentVisibility(visible)
+        expandedView?.setContentVisibility(visible)
     }
 
-    override fun getIconView(): View? {
+    override fun getIconView(): BadgedImageView? {
+        if (overflowBtn == null) {
+            overflowBtn = inflater.inflate(R.layout.bubble_overflow_button,
+                    null /* root */, false /* attachToRoot */) as BadgedImageView
+            overflowBtn?.initialize(positioner)
+            overflowBtn?.setContentDescription(context.resources.getString(
+                    R.string.bubble_overflow_button_content_description))
+            val bubbleSize = positioner.bubbleSize
+            overflowBtn?.setLayoutParams(FrameLayout.LayoutParams(bubbleSize, bubbleSize))
+            updateBtnTheme()
+        }
         return overflowBtn
     }
 
@@ -170,7 +191,7 @@
     }
 
     override fun getTaskId(): Int {
-        return if (expandedView != null) expandedView.getTaskId() else INVALID_TASK_ID
+        return if (expandedView != null) expandedView!!.getTaskId() else INVALID_TASK_ID
     }
 
     companion object {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowActivity.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowActivity.java
index 2759b59..cfd0066 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowActivity.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowActivity.java
@@ -111,11 +111,11 @@
             IBinder binder = intent.getExtras().getBinder(EXTRA_BUBBLE_CONTROLLER);
             if (binder instanceof ObjectWrapper) {
                 mController = ((ObjectWrapper<BubbleController>) binder).get();
+                updateOverflow();
             }
         } else {
             Log.w(TAG, "Bubble overflow activity created without bubble controller!");
         }
-        updateOverflow();
     }
 
     void updateOverflow() {
@@ -138,7 +138,9 @@
         final int viewHeight = recyclerViewHeight / rows;
 
         mAdapter = new BubbleOverflowAdapter(getApplicationContext(), mOverflowBubbles,
-                mController::promoteBubbleFromOverflow, viewWidth, viewHeight);
+                mController::promoteBubbleFromOverflow,
+                mController.getPositioner(),
+                viewWidth, viewHeight);
         mRecyclerView.setAdapter(mAdapter);
 
         mOverflowBubbles.clear();
@@ -257,15 +259,20 @@
 
     private Context mContext;
     private Consumer<Bubble> mPromoteBubbleFromOverflow;
+    private BubblePositioner mPositioner;
     private List<Bubble> mBubbles;
     private int mWidth;
     private int mHeight;
 
-    public BubbleOverflowAdapter(Context context, List<Bubble> list, Consumer<Bubble> promoteBubble,
+    BubbleOverflowAdapter(Context context,
+            List<Bubble> list,
+            Consumer<Bubble> promoteBubble,
+            BubblePositioner positioner,
             int width, int height) {
         mContext = context;
         mBubbles = list;
         mPromoteBubbleFromOverflow = promoteBubble;
+        mPositioner = positioner;
         mWidth = width;
         mHeight = height;
     }
@@ -295,7 +302,7 @@
         TextView viewName = overflowView.findViewById(R.id.bubble_view_name);
         viewName.setTextColor(textColor);
 
-        return new ViewHolder(overflowView);
+        return new ViewHolder(overflowView, mPositioner);
     }
 
     @Override
@@ -348,9 +355,10 @@
         public BadgedImageView iconView;
         public TextView textView;
 
-        public ViewHolder(LinearLayout v) {
+        ViewHolder(LinearLayout v, BubblePositioner positioner) {
             super(v);
             iconView = v.findViewById(R.id.bubble_view);
+            iconView.initialize(positioner);
             textView = v.findViewById(R.id.bubble_view_name);
         }
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
index eccd009..46e8e11 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
@@ -16,45 +16,99 @@
 
 package com.android.wm.shell.bubbles;
 
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+import android.annotation.IntDef;
 import android.content.Context;
 import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.graphics.Insets;
+import android.graphics.PointF;
 import android.graphics.Rect;
+import android.graphics.RectF;
+import android.util.Log;
+import android.view.View;
 import android.view.WindowInsets;
 import android.view.WindowManager;
 import android.view.WindowMetrics;
 
 import androidx.annotation.VisibleForTesting;
 
+import com.android.wm.shell.R;
+
+import java.lang.annotation.Retention;
+
 /**
  * Keeps track of display size, configuration, and specific bubble sizes. One place for all
  * placement and positioning calculations to refer to.
  */
 public class BubblePositioner {
+    private static final String TAG = BubbleDebugConfig.TAG_WITH_CLASS_NAME
+            ? "BubblePositioner"
+            : BubbleDebugConfig.TAG_BUBBLES;
 
+    @Retention(SOURCE)
+    @IntDef({TASKBAR_POSITION_RIGHT, TASKBAR_POSITION_LEFT, TASKBAR_POSITION_BOTTOM})
+    @interface TaskbarPosition {}
+    public static final int TASKBAR_POSITION_RIGHT = 0;
+    public static final int TASKBAR_POSITION_LEFT = 1;
+    public static final int TASKBAR_POSITION_BOTTOM = 2;
+
+    /**
+     * The bitmap in the bubble is slightly smaller than the overall size of the bubble.
+     * This is the percentage to scale the image down based on the overall bubble size.
+     */
+    private static final float BUBBLE_BITMAP_SIZE_PERCENT = 0.86f;
+
+    private Context mContext;
     private WindowManager mWindowManager;
     private Rect mPositionRect;
     private int mOrientation;
     private Insets mInsets;
 
+    private int mBubbleSize;
+    private int mBubbleBitmapSize;
+
+    private PointF mPinLocation;
+    private PointF mRestingStackPosition;
+
+    private boolean mShowingInTaskbar;
+    private @TaskbarPosition int mTaskbarPosition;
+    private int mTaskbarIconSize;
+
     public BubblePositioner(Context context, WindowManager windowManager) {
+        mContext = context;
         mWindowManager = windowManager;
         update(Configuration.ORIENTATION_UNDEFINED);
     }
 
+    /**
+     * Updates orientation, available space, and inset information. Call this when config changes
+     * occur or when added to a window.
+     */
     public void update(int orientation) {
         WindowMetrics windowMetrics = mWindowManager.getCurrentWindowMetrics();
-        mPositionRect = new Rect(windowMetrics.getBounds());
+        if (windowMetrics == null) {
+            return;
+        }
         WindowInsets metricInsets = windowMetrics.getWindowInsets();
 
         Insets insets = metricInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()
                 | WindowInsets.Type.statusBars()
                 | WindowInsets.Type.displayCutout());
-        update(orientation, insets, windowMetrics.getBounds());
+
+        if (BubbleDebugConfig.DEBUG_POSITIONER) {
+            Log.w(TAG, "update positioner:"
+                    + " landscape= " + (orientation == Configuration.ORIENTATION_LANDSCAPE)
+                    + " insets: " + insets
+                    + " bounds: " + windowMetrics.getBounds()
+                    + " showingInTaskbar: " + mShowingInTaskbar);
+        }
+        updateInternal(orientation, insets, windowMetrics.getBounds());
     }
 
     @VisibleForTesting
-    public void update(int orientation, Insets insets, Rect bounds) {
+    public void updateInternal(int orientation, Insets insets, Rect bounds) {
         mOrientation = orientation;
         mInsets = insets;
 
@@ -63,27 +117,156 @@
         mPositionRect.top += mInsets.top;
         mPositionRect.right -= mInsets.right;
         mPositionRect.bottom -= mInsets.bottom;
+
+        Resources res = mContext.getResources();
+        mBubbleSize = res.getDimensionPixelSize(R.dimen.individual_bubble_size);
+        mBubbleBitmapSize = res.getDimensionPixelSize(R.dimen.bubble_bitmap_size);
+        adjustForTaskbar();
     }
 
     /**
-     * @return a rect of available screen space for displaying bubbles in the correct orientation,
-     * accounting for system bars and cutouts.
+     * Updates position information to account for taskbar state.
+     *
+     * @param taskbarPosition which position the taskbar is displayed in.
+     * @param showingInTaskbar whether the taskbar is being shown.
+     */
+    public void updateForTaskbar(int iconSize,
+            @TaskbarPosition int taskbarPosition, boolean showingInTaskbar) {
+        mShowingInTaskbar = showingInTaskbar;
+        mTaskbarIconSize =  iconSize;
+        mTaskbarPosition = taskbarPosition;
+        update(mOrientation);
+    }
+
+    /**
+     * Taskbar insets appear as navigationBar insets, however, unlike navigationBar this should
+     * not inset bubbles UI as bubbles floats above the taskbar. This adjust the available space
+     * and insets to account for the taskbar.
+     */
+    // TODO(b/171559950): When the insets are reported correctly we can remove this logic
+    private void adjustForTaskbar() {
+        // When bar is showing on edges... subtract that inset because we appear on top
+        if (mShowingInTaskbar && mTaskbarPosition != TASKBAR_POSITION_BOTTOM) {
+            WindowInsets metricInsets = mWindowManager.getCurrentWindowMetrics().getWindowInsets();
+            Insets navBarInsets = metricInsets.getInsetsIgnoringVisibility(
+                    WindowInsets.Type.navigationBars());
+            int newInsetLeft = mInsets.left;
+            int newInsetRight = mInsets.right;
+            if (mTaskbarPosition == TASKBAR_POSITION_LEFT) {
+                mPositionRect.left -= navBarInsets.left;
+                newInsetLeft -= navBarInsets.left;
+            } else if (mTaskbarPosition == TASKBAR_POSITION_RIGHT) {
+                mPositionRect.right += navBarInsets.right;
+                newInsetRight -= navBarInsets.right;
+            }
+            mInsets = Insets.of(newInsetLeft, mInsets.top, newInsetRight, mInsets.bottom);
+        }
+    }
+
+    /**
+     * @return a rect of available screen space accounting for orientation, system bars and cutouts.
+     * Does not account for IME.
      */
     public Rect getAvailableRect() {
         return mPositionRect;
     }
 
     /**
-     * @return the current orientation.
-     */
-    public int getOrientation() {
-        return mOrientation;
-    }
-
-    /**
-     * @return the relevant insets (status bar, nav bar, cutouts).
+     * @return the relevant insets (status bar, nav bar, cutouts). If taskbar is showing, its
+     * inset is not included here.
      */
     public Insets getInsets() {
         return mInsets;
     }
+
+    /**
+     * @return whether the device is in landscape orientation.
+     */
+    public boolean isLandscape() {
+        return mOrientation == Configuration.ORIENTATION_LANDSCAPE;
+    }
+
+    /**
+     * Indicates how bubbles appear when expanded.
+     *
+     * When false, bubbles display at the top of the screen with the expanded view
+     * below them. When true, bubbles display at the edges of the screen with the expanded view
+     * to the left or right side.
+     */
+    public boolean showBubblesVertically() {
+        return mOrientation == Configuration.ORIENTATION_LANDSCAPE
+                || mShowingInTaskbar;
+    }
+
+    /** Size of the bubble account for badge & dot. */
+    public int getBubbleSize() {
+        int bsize = (mShowingInTaskbar && mTaskbarIconSize > 0)
+                ? mTaskbarIconSize
+                : mBubbleSize;
+        return bsize;
+    }
+
+    /** Size of the bitmap within the bubble */
+    public int getBubbleBitmapSize() {
+        float size =  (mShowingInTaskbar && mTaskbarIconSize > 0)
+                ? (mTaskbarIconSize * BUBBLE_BITMAP_SIZE_PERCENT)
+                : mBubbleBitmapSize;
+        return (int) size;
+    }
+
+    /**
+     * Sets the stack's most recent position along the edge of the screen. This is saved when the
+     * last bubble is removed, so that the stack can be restored in its previous position.
+     */
+    public void setRestingPosition(PointF position) {
+        if (mRestingStackPosition == null) {
+            mRestingStackPosition = new PointF(position);
+        } else {
+            mRestingStackPosition.set(position);
+        }
+    }
+
+    /** The position the bubble stack should rest at when collapsed. */
+    public PointF getRestingPosition() {
+        if (mPinLocation != null) {
+            return mPinLocation;
+        }
+        if (mRestingStackPosition == null) {
+            return getDefaultStartPosition();
+        }
+        return mRestingStackPosition;
+    }
+
+    /**
+     * @return the stack position to use if we don't have a saved location or if user education
+     * is being shown.
+     */
+    public PointF getDefaultStartPosition() {
+        // Start on the left if we're in LTR, right otherwise.
+        final boolean startOnLeft =
+                mContext.getResources().getConfiguration().getLayoutDirection()
+                        != View.LAYOUT_DIRECTION_RTL;
+        final float startingVerticalOffset = mContext.getResources().getDimensionPixelOffset(
+                R.dimen.bubble_stack_starting_offset_y);
+        // TODO: placement bug here because mPositionRect doesn't handle the overhanging edge
+        return new BubbleStackView.RelativeStackPosition(
+                startOnLeft,
+                startingVerticalOffset / mPositionRect.height())
+                .getAbsolutePositionInRegion(new RectF(mPositionRect));
+    }
+
+    /**
+     * @return whether the bubble stack is pinned to the taskbar.
+     */
+    public boolean showingInTaskbar() {
+        return mShowingInTaskbar;
+    }
+
+    /**
+     * In some situations bubbles will be pinned to a specific onscreen location. This sets the
+     * location to anchor the stack to.
+     */
+    public void setPinnedLocation(PointF point) {
+        mPinLocation = point;
+    }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
index 155f342..cbe9845 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
@@ -30,7 +30,6 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
-import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.ColorMatrix;
@@ -228,7 +227,7 @@
      * once it collapses.
      */
     @Nullable
-    private Bubble mBubbleToExpandAfterFlyoutCollapse = null;
+    private BubbleViewProvider mBubbleToExpandAfterFlyoutCollapse = null;
 
     /** Layout change listener that moves the stack to the nearest valid position on rotation. */
     private OnLayoutChangeListener mOrientationChangedListener;
@@ -572,6 +571,16 @@
                 mBubbleContainer.setActiveController(mStackAnimationController);
                 hideFlyoutImmediate();
 
+                if (!mPositioner.showingInTaskbar()) {
+                    // Also, save the magnetized stack so we can dispatch touch events to it.
+                    mMagnetizedObject = mStackAnimationController.getMagnetizedStack(
+                            mMagneticTarget);
+                    mMagnetizedObject.setMagnetListener(mStackMagnetListener);
+                } else {
+                    // In taskbar, the stack isn't draggable so we shouldn't dispatch touch events.
+                    mMagnetizedObject = null;
+                }
+
                 // Also, save the magnetized stack so we can dispatch touch events to it.
                 mMagnetizedObject = mStackAnimationController.getMagnetizedStack(mMagneticTarget);
                 mMagnetizedObject.setMagnetListener(mStackMagnetListener);
@@ -593,7 +602,9 @@
         public void onMove(@NonNull View v, @NonNull MotionEvent ev, float viewInitialX,
                 float viewInitialY, float dx, float dy) {
             // If we're expanding or collapsing, ignore all touch events.
-            if (mIsExpansionAnimating) {
+            if (mIsExpansionAnimating
+                    // Also ignore events if we shouldn't be draggable.
+                    || (mPositioner.showingInTaskbar() && !mIsExpanded)) {
                 return;
             }
 
@@ -603,7 +614,7 @@
             // First, see if the magnetized object consumes the event - if so, we shouldn't move the
             // bubble since it's stuck to the target.
             if (!passEventToMagnetizedObject(ev)) {
-                if (mBubbleData.isExpanded()) {
+                if (mBubbleData.isExpanded() || mPositioner.showingInTaskbar()) {
                     mExpandedAnimationController.dragBubbleOut(
                             v, viewInitialX + dx, viewInitialY + dy);
                 } else {
@@ -701,7 +712,6 @@
         }
     };
 
-    @Nullable
     private BubbleOverflow mBubbleOverflow;
     private StackEducationView mStackEduView;
     private ManageEducationView mManageEduView;
@@ -745,7 +755,7 @@
         ta.recycle();
 
         final Runnable onBubbleAnimatedOut = () -> {
-            if (getBubbleCount() == 0) {
+            if (getBubbleCount() == 0 && !mBubbleData.isShowingOverflow()) {
                 mBubbleController.onAllBubblesAnimatedOut();
             }
         };
@@ -818,15 +828,16 @@
         setFocusable(true);
         mBubbleContainer.bringToFront();
 
-        mBubbleOverflow = new BubbleOverflow(getContext(), bubbleController, this);
+        mBubbleOverflow = mBubbleData.getOverflow();
         mBubbleContainer.addView(mBubbleOverflow.getIconView(),
                 mBubbleContainer.getChildCount() /* index */,
-                new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
-                        ViewGroup.LayoutParams.WRAP_CONTENT));
+                new FrameLayout.LayoutParams(mPositioner.getBubbleSize(),
+                        mPositioner.getBubbleSize()));
         updateOverflow();
         mBubbleOverflow.getIconView().setOnClickListener((View v) -> {
-            setSelectedBubble(mBubbleOverflow);
-            showManageMenu(false);
+            mBubbleData.setShowingOverflow(true);
+            mBubbleData.setSelectedBubble(mBubbleOverflow);
+            mBubbleData.setExpanded(true);
         });
 
         setOnApplyWindowInsetsListener((View view, WindowInsets insets) -> {
@@ -997,11 +1008,12 @@
         mManageMenu.findViewById(R.id.bubble_manage_menu_settings_container).setOnClickListener(
                 view -> {
                     showManageMenu(false /* show */);
-                    final Bubble bubble = mBubbleData.getSelectedBubble();
+                    final BubbleViewProvider bubble = mBubbleData.getSelectedBubble();
                     if (bubble != null && mBubbleData.hasBubbleInStackWithKey(bubble.getKey())) {
-                        final Intent intent = bubble.getSettingsIntent(mContext);
+                        // If it's in the stack it's a proper Bubble.
+                        final Intent intent = ((Bubble) bubble).getSettingsIntent(mContext);
                         mBubbleData.setExpanded(false);
-                        mContext.startActivityAsUser(intent, bubble.getUser());
+                        mContext.startActivityAsUser(intent, ((Bubble) bubble).getUser());
                         logBubbleEvent(bubble,
                                 FrameworkStatsLog.BUBBLE_UICHANGED__ACTION__HEADER_GO_TO_SETTINGS);
                     }
@@ -1067,7 +1079,7 @@
             mStackEduView = new StackEducationView(mContext);
             addView(mStackEduView);
         }
-        return mStackEduView.show(mStackAnimationController.getStartPosition());
+        return mStackEduView.show(mPositioner.getDefaultStartPosition());
     }
 
     private void updateUserEdu() {
@@ -1093,7 +1105,7 @@
         addView(mFlyout, new FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
     }
 
-    void updateFlyout(float fontScale) {
+    void updateFontScale(float fontScale) {
         mFlyout.updateFontSize(fontScale);
     }
 
@@ -1130,7 +1142,9 @@
         Resources res = getContext().getResources();
         mBubblePaddingTop = res.getDimensionPixelSize(R.dimen.bubble_padding_top);
 
-        mRelativeStackPositionBeforeRotation = mStackAnimationController.getRelativeStackPosition();
+        mRelativeStackPositionBeforeRotation = new RelativeStackPosition(
+                mPositioner.getRestingPosition(),
+                mStackAnimationController.getAllowableStackPositionRegion());
         mManageMenu.setVisibility(View.INVISIBLE);
         mShowingManage = false;
 
@@ -1157,7 +1171,7 @@
 
         Resources res = getContext().getResources();
         mBubblePaddingTop = res.getDimensionPixelSize(R.dimen.bubble_padding_top);
-        mBubbleSize = getResources().getDimensionPixelSize(R.dimen.individual_bubble_size);
+        mBubbleSize = mPositioner.getBubbleSize();
         for (Bubble b : mBubbleData.getBubbles()) {
             if (b.getIconView() == null) {
                 Log.d(TAG, "Display size changed. Icon null: " + b);
@@ -1165,6 +1179,7 @@
             }
             b.getIconView().setLayoutParams(new LayoutParams(mBubbleSize, mBubbleSize));
         }
+        mBubbleOverflow.getIconView().setLayoutParams(new LayoutParams(mBubbleSize, mBubbleSize));
         mExpandedAnimationController.updateResources();
         mStackAnimationController.updateResources();
         mDismissView.updateResources();
@@ -1199,8 +1214,8 @@
         super.onDetachedFromWindow();
         getViewTreeObserver().removeOnPreDrawListener(mViewUpdater);
         getViewTreeObserver().removeOnComputeInternalInsetsListener(this);
-        if (mBubbleOverflow != null && mBubbleOverflow.getExpandedView() != null) {
-            mBubbleOverflow.getExpandedView().cleanUpExpandedState();
+        if (mBubbleOverflow != null) {
+            mBubbleOverflow.cleanUpExpandedState();
         }
     }
 
@@ -1390,8 +1405,7 @@
 
         if (getBubbleCount() == 0 && shouldShowStackEdu()) {
             // Override the default stack position if we're showing user education.
-            mStackAnimationController.setStackPosition(
-                    mStackAnimationController.getStartPosition());
+            mStackAnimationController.setStackPosition(mPositioner.getDefaultStartPosition());
         }
 
         if (getBubbleCount() == 0) {
@@ -1410,7 +1424,8 @@
         bubble.getIconView().setOnTouchListener(mBubbleTouchListener);
 
         mBubbleContainer.addView(bubble.getIconView(), 0,
-                new FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
+                new FrameLayout.LayoutParams(mPositioner.getBubbleSize(),
+                        mPositioner.getBubbleSize()));
         animateInFlyoutForBubble(bubble);
         requestUpdate();
         logBubbleEvent(bubble, FrameworkStatsLog.BUBBLE_UICHANGED__ACTION__POSTED);
@@ -1441,10 +1456,9 @@
     }
 
     private void updateOverflowVisibility() {
-        if (mBubbleOverflow == null) {
-            return;
-        }
-        mBubbleOverflow.setVisible(mIsExpanded ? VISIBLE : GONE);
+        mBubbleOverflow.setVisible((mIsExpanded || mBubbleData.isShowingOverflow())
+                ? VISIBLE
+                : GONE);
     }
 
     // via BubbleData.Listener
@@ -1614,6 +1628,11 @@
         mBubbleController.hideCurrentInputMethod();
     }
 
+    /** Set the stack position to whatever the positioner says. */
+    void updateStackPosition() {
+        mStackAnimationController.setStackPosition(mPositioner.getRestingPosition());
+    }
+
     private void beforeExpandedViewAnimation() {
         mIsExpansionAnimating = true;
         hideFlyoutImmediate();
@@ -1629,8 +1648,7 @@
 
     private void animateExpansion() {
         cancelDelayedExpandCollapseSwitchAnimations();
-        final boolean isLandscape =
-                mPositioner.getOrientation() == Configuration.ORIENTATION_LANDSCAPE;
+        final boolean showVertically = mPositioner.showBubblesVertically();
         mIsExpanded = true;
         if (mStackEduView != null) {
             mStackEduView.hide(true /* fromExpansion */);
@@ -1650,14 +1668,19 @@
         mExpandedViewContainer.setTranslationY(getExpandedViewY());
         mExpandedViewContainer.setAlpha(1f);
 
-        // X-value of the bubble we're expanding, once it's settled in its row.
+        int index;
+        if (mExpandedBubble != null && BubbleOverflow.KEY.equals(mExpandedBubble.getKey())) {
+            index = mBubbleData.getBubbles().size();
+        } else {
+            index = getBubbleIndex(mExpandedBubble);
+        }
+        // Position of the bubble we're expanding, once it's settled in its row.
         final float bubbleWillBeAt =
-                mExpandedAnimationController.getBubbleXOrYForOrientation(
-                        mBubbleData.getBubbles().indexOf(mExpandedBubble));
+                mExpandedAnimationController.getBubbleXOrYForOrientation(index);
 
         // How far horizontally the bubble will be animating. We'll wait a bit longer for bubbles
         // that are animating farther, so that the expanded view doesn't move as much.
-        final float relevantStackPosition = isLandscape
+        final float relevantStackPosition = showVertically
                 ? mStackAnimationController.getStackPosition().y
                 : mStackAnimationController.getStackPosition().x;
         final float distanceAnimated = Math.abs(bubbleWillBeAt - relevantStackPosition);
@@ -1674,7 +1697,7 @@
         }
 
         // Set the pivot point for the scale, so the expanded view animates out from the bubble.
-        if (isLandscape) {
+        if (showVertically) {
             float pivotX;
             float pivotY = bubbleWillBeAt + mBubbleSize / 2f;
             if (mStackOnLeftOrWillBe) {
@@ -1709,7 +1732,7 @@
                         if (mExpandedBubble == null || mExpandedBubble.getIconView() == null) {
                             return;
                         }
-                        float translation = isLandscape
+                        float translation = showVertically
                                 ? mExpandedBubble.getIconView().getTranslationY()
                                 : mExpandedBubble.getIconView().getTranslationX();
                         mExpandedViewContainerMatrix.postTranslate(
@@ -1761,13 +1784,17 @@
         // We want to visually collapse into this bubble during the animation.
         final View expandingFromBubble = mExpandedBubble.getIconView();
 
+        int index;
+        if (mExpandedBubble != null && BubbleOverflow.KEY.equals(mExpandedBubble.getKey())) {
+            index = mBubbleData.getBubbles().size();
+        } else {
+            index = mBubbleData.getBubbles().indexOf(mExpandedBubble);
+        }
         // Value the bubble is animating from (back into the stack).
         final float expandingFromBubbleAt =
-                mExpandedAnimationController.getBubbleXOrYForOrientation(
-                        mBubbleData.getBubbles().indexOf(mExpandedBubble));
-        final boolean isLandscape =
-                mPositioner.getOrientation() == Configuration.ORIENTATION_LANDSCAPE;
-        if (isLandscape) {
+                mExpandedAnimationController.getBubbleXOrYForOrientation(index);
+        final boolean showVertically = mPositioner.showBubblesVertically();
+        if (mPositioner.showBubblesVertically()) {
             float pivotX;
             float pivotY = expandingFromBubbleAt + mBubbleSize / 2f;
             if (mStackOnLeftOrWillBe) {
@@ -1792,7 +1819,7 @@
                 .addUpdateListener((target, values) -> {
                     if (expandingFromBubble != null) {
                         // Follow the bubble as it translates!
-                        if (isLandscape) {
+                        if (showVertically) {
                             mExpandedViewContainerMatrix.postTranslate(
                                     0f, expandingFromBubble.getTranslationY()
                                             - expandingFromBubbleAt);
@@ -1849,7 +1876,7 @@
                 .spring(DynamicAnimation.SCALE_Y, 0f, mScaleOutSpringConfig)
                 .withEndActions(this::releaseAnimatingOutBubbleBuffer);
 
-        if (mPositioner.getOrientation() == Configuration.ORIENTATION_LANDSCAPE) {
+        if (mPositioner.showBubblesVertically()) {
             float translationX = mStackAnimationController.isStackOnLeftSide()
                     ? mAnimatingOutSurfaceContainer.getTranslationX() + mBubbleSize * 2
                     : mAnimatingOutSurfaceContainer.getTranslationX();
@@ -1874,7 +1901,7 @@
         mExpandedViewContainer.setAlpha(1f);
         mExpandedViewContainer.setVisibility(View.VISIBLE);
 
-        if (mPositioner.getOrientation() == Configuration.ORIENTATION_LANDSCAPE) {
+        if (mPositioner.showBubblesVertically()) {
             float pivotX;
             float pivotY = expandingFromBubbleDestination + mBubbleSize / 2f;
             if (mStackOnLeftOrWillBe) {
@@ -2113,7 +2140,7 @@
         }
     }
 
-    private void dismissBubbleIfExists(@Nullable Bubble bubble) {
+    private void dismissBubbleIfExists(@Nullable BubbleViewProvider bubble) {
         if (bubble != null && mBubbleData.hasBubbleInStackWithKey(bubble.getKey())) {
             mBubbleData.dismissBubbleWithKey(bubble.getKey(), Bubbles.DISMISS_USER_GESTURE);
         }
@@ -2180,7 +2207,7 @@
      */
     float getExpandedViewY() {
         final int top = mPositioner.getAvailableRect().top;
-        if (mPositioner.getOrientation() == Configuration.ORIENTATION_LANDSCAPE) {
+        if (mPositioner.showBubblesVertically()) {
             return top + mExpandedViewPadding;
         } else {
             return top + mBubbleSize + mBubblePaddingTop;
@@ -2278,7 +2305,8 @@
                         expandFlyoutAfterDelay /* onLayoutComplete */,
                         mAfterFlyoutHidden,
                         bubble.getIconView().getDotCenter(),
-                        !bubble.showDot());
+                        !bubble.showDot(),
+                        mPositioner);
             }
             mFlyout.bringToFront();
         });
@@ -2321,7 +2349,7 @@
         }
 
         if (!mIsExpanded) {
-            if (getBubbleCount() > 0) {
+            if (getBubbleCount() > 0 || mBubbleData.isShowingOverflow()) {
                 mBubbleContainer.getChildAt(0).getBoundsOnScreen(outRect);
                 // Increase the touch target size of the bubble
                 outRect.top -= mBubbleTouchPadding;
@@ -2550,7 +2578,7 @@
         Insets insets = mPositioner.getInsets();
         int leftPadding = insets.left + mExpandedViewPadding;
         int rightPadding = insets.right + mExpandedViewPadding;
-        if (mPositioner.getOrientation() == Configuration.ORIENTATION_LANDSCAPE) {
+        if (mPositioner.showBubblesVertically()) {
             if (!mStackAnimationController.isStackOnLeftSide()) {
                 rightPadding += mPointerHeight + mBubbleSize;
             } else {
@@ -2581,7 +2609,9 @@
             bv.setZ((mMaxBubbles * mBubbleElevation) - i);
 
             if (mIsExpanded) {
-                bv.showDotAndBadge(false /* onLeft */);
+                // If we're not displaying vertically, we always show the badge on the left.
+                boolean onLeft = mPositioner.showBubblesVertically() && !mStackOnLeftOrWillBe;
+                bv.showDotAndBadge(onLeft);
             } else if (i == 0) {
                 bv.showDotAndBadge(!mStackOnLeftOrWillBe);
             } else {
@@ -2599,7 +2629,7 @@
             return;
         }
         float bubblePosition = mExpandedAnimationController.getBubbleXOrYForOrientation(index);
-        if (mPositioner.getOrientation() == Configuration.ORIENTATION_LANDSCAPE) {
+        if (mPositioner.showBubblesVertically()) {
             float x = mStackOnLeftOrWillBe
                     ? mPositioner.getAvailableRect().left
                     : mPositioner.getAvailableRect().right
@@ -2661,21 +2691,11 @@
                 .floatValue();
     }
 
-    /** Set the start position of the bubble stack. */
-    public void setStackStartPosition(RelativeStackPosition position) {
-        mStackAnimationController.setStackStartPosition(position);
-    }
-
     /** @return the position of the bubble stack. */
     public PointF getStackPosition() {
         return mStackAnimationController.getStackPosition();
     }
 
-    /** @return the relative position of the bubble stack. */
-    public RelativeStackPosition getRelativeStackPosition() {
-        return mStackAnimationController.getRelativeStackPosition();
-    }
-
     /**
      * Logs the bubble UI event.
      *
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
index 0b68306..e21ba63 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
@@ -134,6 +134,7 @@
                 LayoutInflater inflater = LayoutInflater.from(c);
                 info.imageView = (BadgedImageView) inflater.inflate(
                         R.layout.bubble_view, stackView, false /* attachToRoot */);
+                info.imageView.initialize(controller.getPositioner());
 
                 info.expandedView = (BubbleExpandedView) inflater.inflate(
                         R.layout.bubble_expanded_view, stackView, false /* attachToRoot */);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java
index 61fbf81..18aaa96 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java
@@ -84,7 +84,11 @@
     private float mBubbleSizePx;
     /** Max number of bubbles shown in row above expanded view. */
     private int mBubblesMaxRendered;
-
+    /** Max amount of space to have between bubbles when expanded. */
+    private int mBubblesMaxSpace;
+    /** Amount of space between the bubbles when expanded. */
+    private float mSpaceBetweenBubbles;
+    /** Whether the expand / collapse animation is running. */
     private boolean mAnimatingExpand = false;
 
     /**
@@ -205,8 +209,17 @@
         mBubblePaddingTop = res.getDimensionPixelSize(R.dimen.bubble_padding_top);
         mStackOffsetPx = res.getDimensionPixelSize(R.dimen.bubble_stack_offset);
         mBubblePaddingTop = res.getDimensionPixelSize(R.dimen.bubble_padding_top);
-        mBubbleSizePx = res.getDimensionPixelSize(R.dimen.individual_bubble_size);
+        mBubbleSizePx = mPositioner.getBubbleSize();
         mBubblesMaxRendered = res.getInteger(R.integer.bubbles_max_rendered);
+        mBubblesMaxSpace = res.getDimensionPixelSize(R.dimen.bubble_max_spacing);
+        final float availableSpace = mPositioner.isLandscape()
+                ? mPositioner.getAvailableRect().height()
+                : mPositioner.getAvailableRect().width();
+        final float spaceForMaxBubbles = (mExpandedViewPadding * 2)
+                + (mBubblesMaxRendered + 1) * mBubbleSizePx;
+        float spaceBetweenBubbles =
+                (availableSpace - spaceForMaxBubbles) / mBubblesMaxRendered;
+        mSpaceBetweenBubbles = Math.min(spaceBetweenBubbles, mBubblesMaxSpace);
     }
 
     /**
@@ -250,13 +263,15 @@
             final Path path = new Path();
             path.moveTo(bubble.getTranslationX(), bubble.getTranslationY());
 
-            final float expandedY = getExpandedY();
+            final float expandedY = mPositioner.showBubblesVertically()
+                    ? getBubbleXOrYForOrientation(index)
+                    : getExpandedY();
             if (expanding) {
                 // If we're expanding, first draw a line from the bubble's current position to the
                 // top of the screen.
                 path.lineTo(bubble.getTranslationX(), expandedY);
                 // Then, draw a line across the screen to the bubble's resting position.
-                if (mPositioner.getOrientation() == Configuration.ORIENTATION_LANDSCAPE) {
+                if (mPositioner.showBubblesVertically()) {
                     Rect availableRect = mPositioner.getAvailableRect();
                     boolean onLeft = mCollapsePoint != null
                             && mCollapsePoint.x < (availableRect.width() / 2f);
@@ -422,6 +437,9 @@
      * bubbles to accommodate it if it was previously dragged out past the threshold.
      */
     public void snapBubbleBack(View bubbleView, float velX, float velY) {
+        if (mLayout == null) {
+            return;
+        }
         final int index = mLayout.indexOfChild(bubbleView);
 
         animationForChildAtIndex(index)
@@ -580,7 +598,7 @@
                 return;
             }
 
-            if (mPositioner.getOrientation() == Configuration.ORIENTATION_LANDSCAPE) {
+            if (mPositioner.showBubblesVertically()) {
                 Rect availableRect = mPositioner.getAvailableRect();
                 boolean onLeft = mCollapsePoint != null
                         && mCollapsePoint.x < (availableRect.width() / 2f);
@@ -613,23 +631,15 @@
         if (mLayout == null) {
             return 0;
         }
+        final float positionInBar = index * (mBubbleSizePx + mSpaceBetweenBubbles);
         Rect availableRect = mPositioner.getAvailableRect();
-        final boolean isLandscape =
-                mPositioner.getOrientation() == Configuration.ORIENTATION_LANDSCAPE;
-        final float availableSpace = isLandscape
-                ? availableRect.height()
-                : availableRect.width();
-        final float spaceForMaxBubbles = (mExpandedViewPadding * 2)
-                + (mBubblesMaxRendered + 1) * mBubbleSizePx;
-        final float spaceBetweenBubbles =
-                (availableSpace - spaceForMaxBubbles) / mBubblesMaxRendered;
+        final boolean isLandscape = mPositioner.showBubblesVertically();
         final float expandedStackSize = (mLayout.getChildCount() * mBubbleSizePx)
-                + ((mLayout.getChildCount() - 1) * spaceBetweenBubbles);
+                + ((mLayout.getChildCount() - 1) * mSpaceBetweenBubbles);
         final float centerPosition = isLandscape
                 ? availableRect.centerY()
                 : availableRect.centerX();
         final float rowStart = centerPosition - (expandedStackSize / 2f);
-        final float positionInBar = index * (mBubbleSizePx + spaceBetweenBubbles);
         return rowStart + positionInBar;
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java
index d7f2e4b..24a8809d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java
@@ -133,12 +133,6 @@
     /** Whether or not the stack's start position has been set. */
     private boolean mStackMovedToStartPosition = false;
 
-    /**
-     * The stack's most recent position along the edge of the screen. This is saved when the last
-     * bubble is removed, so that the stack can be restored in its previous position.
-     */
-    private PointF mRestingStackPosition;
-
     /** The height of the most recently visible IME. */
     private float mImeHeight = 0f;
 
@@ -434,6 +428,9 @@
      * Where the stack would be if it were snapped to the nearest horizontal edge (left or right).
      */
     public PointF getStackPositionAlongNearestHorizontalEdge() {
+        if (mPositioner.showingInTaskbar()) {
+            return mPositioner.getRestingPosition();
+        }
         final PointF stackPos = getStackPosition();
         final boolean onLeft = mLayout.isFirstChildXLeftOfCenter(stackPos.x);
         final RectF bounds = getAllowableStackPositionRegion();
@@ -447,7 +444,7 @@
         pw.println("StackAnimationController state:");
         pw.print("  isActive:             "); pw.println(isActiveController());
         pw.print("  restingStackPos:      ");
-        pw.println(mRestingStackPosition != null ? mRestingStackPosition.toString() : "null");
+        pw.println(mPositioner.getRestingPosition().toString());
         pw.print("  currentStackPos:      "); pw.println(mStackPosition.toString());
         pw.print("  isMovingFromFlinging: "); pw.println(mIsMovingFromFlinging);
         pw.print("  withinDismiss:        "); pw.println(isStackStuckToTarget());
@@ -501,7 +498,7 @@
 
                 .addEndListener((animation, canceled, endValue, endVelocity) -> {
                     if (!canceled) {
-                        mRestingStackPosition.set(mStackPosition);
+                        mPositioner.setRestingPosition(mStackPosition);
 
                         springFirstBubbleWithStackFollowing(property, spring, endVelocity,
                                 finalPosition != null
@@ -679,7 +676,7 @@
                                 // resting position - the touch location is not a valid resting
                                 // position. We'll set this when the stack springs to the left or
                                 // right side of the screen after the touch gesture ends.
-                                mRestingStackPosition.set(mStackPosition);
+                                mPositioner.setRestingPosition(mStackPosition);
                             }
 
                             if (after != null) {
@@ -772,10 +769,9 @@
         if (getBubbleCount() > 0) {
             animationForChildAtIndex(0).translationX(mStackPosition.x).start();
         } else {
+            // TODO: still needed with positioner?
             // When all children are removed ensure stack position is sane
-            setStackPosition(mRestingStackPosition == null
-                    ? getStartPosition()
-                    : mRestingStackPosition);
+            mPositioner.setRestingPosition(mPositioner.getRestingPosition());
 
             // Remove the stack from the coordinator since we don't have any bubbles and aren't
             // visible.
@@ -848,8 +844,8 @@
         mSwapAnimationOffset = res.getDimensionPixelSize(R.dimen.bubble_swap_animation_offset);
         mMaxBubbles = res.getInteger(R.integer.bubbles_max_rendered);
         mElevation = res.getDimensionPixelSize(R.dimen.bubble_elevation);
-        mBubbleSize = res.getDimensionPixelSize(R.dimen.individual_bubble_size);
-        mBubbleBitmapSize = res.getDimensionPixelSize(R.dimen.bubble_bitmap_size);
+        mBubbleSize = mPositioner.getBubbleSize();
+        mBubbleBitmapSize = mPositioner.getBubbleBitmapSize();
         mBubblePaddingTop = res.getDimensionPixelSize(R.dimen.bubble_padding_top);
         mBubbleOffscreen = res.getDimensionPixelSize(R.dimen.bubble_stack_offscreen);
     }
@@ -873,9 +869,8 @@
         // Post to ensure that the layout's width and height have been calculated.
         mLayout.setVisibility(View.INVISIBLE);
         mLayout.post(() -> {
-            setStackPosition(mRestingStackPosition == null
-                    ? getStartPosition()
-                    : mRestingStackPosition);
+            setStackPosition(mPositioner.getRestingPosition());
+
             mStackMovedToStartPosition = true;
             mLayout.setVisibility(View.VISIBLE);
 
@@ -919,11 +914,7 @@
         Log.d(TAG, String.format("Setting position to (%f, %f).", pos.x, pos.y));
         mStackPosition.set(pos.x, pos.y);
 
-        if (mRestingStackPosition == null) {
-            mRestingStackPosition = new PointF();
-        }
-
-        mRestingStackPosition.set(mStackPosition);
+        mPositioner.setRestingPosition(mStackPosition);
 
         // If we're not the active controller, we don't want to physically move the bubble views.
         if (isActiveController()) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutout.java
new file mode 100644
index 0000000..38e0519
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutout.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.hidedisplaycutout;
+
+import android.content.res.Configuration;
+
+import androidx.annotation.NonNull;
+
+import java.io.PrintWriter;
+
+/**
+ * Interface to engage hide display cutout feature.
+ */
+public interface HideDisplayCutout {
+    /**
+     * Notifies {@link Configuration} changed.
+     * @param newConfig
+     */
+    void onConfigurationChanged(Configuration newConfig);
+
+    /**
+     * Dumps hide display cutout status.
+     */
+    void dump(@NonNull PrintWriter pw);
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutController.java
new file mode 100644
index 0000000..e4e2546
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutController.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.hidedisplaycutout;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.os.SystemProperties;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.wm.shell.common.DisplayController;
+
+import java.io.PrintWriter;
+
+/**
+ * Manages the hide display cutout status.
+ */
+public class HideDisplayCutoutController implements HideDisplayCutout {
+    private static final String TAG = "HideDisplayCutoutController";
+
+    private final Context mContext;
+    private final HideDisplayCutoutOrganizer mOrganizer;
+    @VisibleForTesting
+    boolean mEnabled;
+
+    HideDisplayCutoutController(Context context, HideDisplayCutoutOrganizer organizer) {
+        mContext = context;
+        mOrganizer = organizer;
+        updateStatus();
+    }
+
+    /**
+     * Creates {@link HideDisplayCutoutController}, returns {@code null} if the feature is not
+     * supported.
+     */
+    @Nullable
+    public static HideDisplayCutoutController create(
+            Context context, DisplayController displayController) {
+        // The SystemProperty is set for devices that support this feature and is used to control
+        // whether to create the HideDisplayCutout instance.
+        // It's defined in the device.mk (e.g. device/google/crosshatch/device.mk).
+        if (!SystemProperties.getBoolean("ro.support_hide_display_cutout", false)) {
+            return null;
+        }
+
+        HideDisplayCutoutOrganizer organizer =
+                new HideDisplayCutoutOrganizer(context, displayController);
+        return new HideDisplayCutoutController(context, organizer);
+    }
+
+    @VisibleForTesting
+    void updateStatus() {
+        // The config value is used for controlling enabling/disabling status of the feature and is
+        // defined in the config.xml in a "Hide Display Cutout" overlay package (e.g. device/google/
+        // crosshatch/crosshatch/overlay/packages/apps/overlays/NoCutoutOverlay).
+        final boolean enabled = mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_hideDisplayCutoutWithDisplayArea);
+        if (enabled == mEnabled) {
+            return;
+        }
+
+        mEnabled = enabled;
+        if (enabled) {
+            mOrganizer.enableHideDisplayCutout();
+        } else {
+            mOrganizer.disableHideDisplayCutout();
+        }
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        updateStatus();
+    }
+
+    @Override
+    public void dump(@NonNull PrintWriter pw) {
+        final String prefix = "  ";
+        pw.print(TAG);
+        pw.println(" states: ");
+        pw.print(prefix);
+        pw.print("mEnabled=");
+        pw.println(mEnabled);
+        mOrganizer.dump(pw);
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java
new file mode 100644
index 0000000..090d227
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java
@@ -0,0 +1,330 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.hidedisplaycutout;
+
+import static android.view.Display.DEFAULT_DISPLAY;
+
+import android.content.Context;
+import android.graphics.Insets;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.util.ArrayMap;
+import android.util.Log;
+import android.util.RotationUtils;
+import android.view.Display;
+import android.view.DisplayCutout;
+import android.view.Surface;
+import android.view.SurfaceControl;
+import android.window.DisplayAreaAppearedInfo;
+import android.window.DisplayAreaInfo;
+import android.window.DisplayAreaOrganizer;
+import android.window.WindowContainerToken;
+import android.window.WindowContainerTransaction;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.internal.R;
+import com.android.wm.shell.common.DisplayChangeController;
+import com.android.wm.shell.common.DisplayController;
+
+import java.io.PrintWriter;
+import java.util.List;
+
+/**
+ * Manages the display areas of hide display cutout feature.
+ */
+class HideDisplayCutoutOrganizer extends DisplayAreaOrganizer {
+    private static final String TAG = "HideDisplayCutoutOrganizer";
+
+    private final Context mContext;
+    private final DisplayController mDisplayController;
+
+    @VisibleForTesting
+    @GuardedBy("this")
+    ArrayMap<WindowContainerToken, SurfaceControl> mDisplayAreaMap = new ArrayMap();
+    // The default display bound in natural orientation.
+    private final Rect mDefaultDisplayBounds = new Rect();
+    @VisibleForTesting
+    final Rect mCurrentDisplayBounds = new Rect();
+    // The default display cutout in natural orientation.
+    private Insets mDefaultCutoutInsets;
+    private Insets mCurrentCutoutInsets;
+    private boolean mIsDefaultPortrait;
+    private int mStatusBarHeight;
+    @VisibleForTesting
+    int mOffsetX;
+    @VisibleForTesting
+    int mOffsetY;
+    @VisibleForTesting
+    int mRotation;
+
+    /**
+     * Handles rotation based on OnDisplayChangingListener callback.
+     */
+    private final DisplayChangeController.OnDisplayChangingListener mRotationController =
+            (display, fromRotation, toRotation, wct) -> {
+                mRotation = toRotation;
+                updateBoundsAndOffsets(true /* enable */);
+                final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+                applyAllBoundsAndOffsets(wct, t);
+                // Only apply t here since the server will do the wct.apply when the method
+                // finishes.
+                t.apply();
+            };
+
+    HideDisplayCutoutOrganizer(Context context, DisplayController displayController) {
+        mContext = context;
+        mDisplayController = displayController;
+    }
+
+    @Override
+    public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo,
+            @NonNull SurfaceControl leash) {
+        if (!addDisplayAreaInfoAndLeashToMap(displayAreaInfo, leash)) {
+            return;
+        }
+        final WindowContainerTransaction wct = new WindowContainerTransaction();
+        final SurfaceControl.Transaction tx = new SurfaceControl.Transaction();
+        applyBoundsAndOffsets(displayAreaInfo.token, leash, wct, tx);
+        applyTransaction(wct, tx);
+    }
+
+    @Override
+    public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {
+        synchronized (this) {
+            if (!mDisplayAreaMap.containsKey(displayAreaInfo.token)) {
+                Log.w(TAG, "Unrecognized token: " + displayAreaInfo.token);
+                return;
+            }
+
+            final WindowContainerTransaction wct = new WindowContainerTransaction();
+            final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+            applyBoundsAndOffsets(
+                    displayAreaInfo.token, mDisplayAreaMap.get(displayAreaInfo.token), wct, t);
+            applyTransaction(wct, t);
+            mDisplayAreaMap.remove(displayAreaInfo.token);
+        }
+    }
+
+    private void updateDisplayAreaMap(List<DisplayAreaAppearedInfo> displayAreaInfos) {
+        for (int i = 0; i < displayAreaInfos.size(); i++) {
+            final DisplayAreaInfo info = displayAreaInfos.get(i).getDisplayAreaInfo();
+            final SurfaceControl leash = displayAreaInfos.get(i).getLeash();
+            addDisplayAreaInfoAndLeashToMap(info, leash);
+        }
+    }
+
+    @VisibleForTesting
+    boolean addDisplayAreaInfoAndLeashToMap(@NonNull DisplayAreaInfo displayAreaInfo,
+            @NonNull SurfaceControl leash) {
+        synchronized (this) {
+            if (displayAreaInfo.displayId != DEFAULT_DISPLAY) {
+                return false;
+            }
+            if (mDisplayAreaMap.containsKey(displayAreaInfo.token)) {
+                Log.w(TAG, "Already appeared token: " + displayAreaInfo.token);
+                return false;
+            }
+            mDisplayAreaMap.put(displayAreaInfo.token, leash);
+            return true;
+        }
+    }
+
+    /**
+     * Enables hide display cutout.
+     */
+    void enableHideDisplayCutout() {
+        mDisplayController.addDisplayChangingController(mRotationController);
+        final Display display = mDisplayController.getDisplay(DEFAULT_DISPLAY);
+        if (display != null) {
+            mRotation = display.getRotation();
+        }
+        final List<DisplayAreaAppearedInfo> displayAreaInfos =
+                registerOrganizer(DisplayAreaOrganizer.FEATURE_HIDE_DISPLAY_CUTOUT);
+        updateDisplayAreaMap(displayAreaInfos);
+        updateBoundsAndOffsets(true /* enabled */);
+        final WindowContainerTransaction wct = new WindowContainerTransaction();
+        final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+        applyAllBoundsAndOffsets(wct, t);
+        applyTransaction(wct, t);
+    }
+
+    /**
+     * Disables hide display cutout.
+     */
+    void disableHideDisplayCutout() {
+        updateBoundsAndOffsets(false /* enabled */);
+        mDisplayController.removeDisplayChangingController(mRotationController);
+        unregisterOrganizer();
+    }
+
+    @VisibleForTesting
+    Insets getDisplayCutoutInsetsOfNaturalOrientation() {
+        final Display display = mDisplayController.getDisplay(DEFAULT_DISPLAY);
+        if (display == null) {
+            return Insets.NONE;
+        }
+        DisplayCutout cutout = display.getCutout();
+        Insets insets = cutout != null ? Insets.of(cutout.getSafeInsets()) : Insets.NONE;
+        return mRotation != Surface.ROTATION_0
+                ? RotationUtils.rotateInsets(insets, 4 /* total number of rotation */ - mRotation)
+                : insets;
+    }
+
+    @VisibleForTesting
+    Rect getDisplayBoundsOfNaturalOrientation() {
+        Point realSize = new Point(0, 0);
+        final Display display = mDisplayController.getDisplay(DEFAULT_DISPLAY);
+        if (display != null) {
+            display.getRealSize(realSize);
+        }
+        final boolean isDisplaySizeFlipped = isDisplaySizeFlipped();
+        return new Rect(
+                0,
+                0,
+                isDisplaySizeFlipped ? realSize.y : realSize.x,
+                isDisplaySizeFlipped ? realSize.x : realSize.y);
+    }
+
+    private boolean isDisplaySizeFlipped() {
+        return mRotation == Surface.ROTATION_90 || mRotation == Surface.ROTATION_270;
+    }
+
+    /**
+     * Updates bounds and offsets according to current state.
+     *
+     * @param enabled whether the hide display cutout feature is enabled.
+     */
+    @VisibleForTesting
+    void updateBoundsAndOffsets(boolean enabled) {
+        if (!enabled) {
+            resetBoundsAndOffsets();
+        } else {
+            initDefaultValuesIfNeeded();
+
+            // Reset to default values.
+            mCurrentDisplayBounds.set(mDefaultDisplayBounds);
+            mOffsetX = 0;
+            mOffsetY = 0;
+
+            // Update bounds and insets according to the rotation.
+            mCurrentCutoutInsets = RotationUtils.rotateInsets(mDefaultCutoutInsets, mRotation);
+            if (isDisplaySizeFlipped()) {
+                mCurrentDisplayBounds.set(
+                        mCurrentDisplayBounds.top,
+                        mCurrentDisplayBounds.left,
+                        mCurrentDisplayBounds.bottom,
+                        mCurrentDisplayBounds.right);
+            }
+            mCurrentDisplayBounds.inset(mCurrentCutoutInsets);
+
+            // Replace the top bound with the max(status bar height, cutout height) if there is
+            // cutout on the top side.
+            mStatusBarHeight = getStatusBarHeight();
+            if (mCurrentCutoutInsets.top != 0) {
+                mCurrentDisplayBounds.top = Math.max(mStatusBarHeight, mCurrentCutoutInsets.top);
+            }
+            mOffsetX = mCurrentDisplayBounds.left;
+            mOffsetY = mCurrentDisplayBounds.top;
+        }
+    }
+
+    private void resetBoundsAndOffsets() {
+        mCurrentDisplayBounds.setEmpty();
+        mOffsetX = 0;
+        mOffsetY = 0;
+    }
+
+    private void initDefaultValuesIfNeeded() {
+        if (!mDefaultDisplayBounds.isEmpty()) {
+            return;
+        }
+        mDefaultDisplayBounds.set(getDisplayBoundsOfNaturalOrientation());
+        mDefaultCutoutInsets = getDisplayCutoutInsetsOfNaturalOrientation();
+        mIsDefaultPortrait = mDefaultDisplayBounds.width() < mDefaultDisplayBounds.height();
+    }
+
+    private void applyAllBoundsAndOffsets(
+            WindowContainerTransaction wct, SurfaceControl.Transaction t) {
+        synchronized (this) {
+            mDisplayAreaMap.forEach((token, leash) -> {
+                applyBoundsAndOffsets(token, leash, wct, t);
+            });
+        }
+    }
+
+    @VisibleForTesting
+    void applyBoundsAndOffsets(WindowContainerToken token, SurfaceControl leash,
+            WindowContainerTransaction wct, SurfaceControl.Transaction t) {
+        wct.setBounds(token, mCurrentDisplayBounds.isEmpty() ? null : mCurrentDisplayBounds);
+        t.setPosition(leash, mOffsetX,  mOffsetY);
+    }
+
+    @VisibleForTesting
+    void applyTransaction(WindowContainerTransaction wct, SurfaceControl.Transaction t) {
+        applyTransaction(wct);
+        t.apply();
+    }
+
+    private int getStatusBarHeight() {
+        final boolean isLandscape =
+                mIsDefaultPortrait ? isDisplaySizeFlipped() : !isDisplaySizeFlipped();
+        return mContext.getResources().getDimensionPixelSize(
+                isLandscape ? R.dimen.status_bar_height_landscape
+                        : R.dimen.status_bar_height_portrait);
+    }
+
+    void dump(@NonNull PrintWriter pw) {
+        final String prefix = "  ";
+        pw.print(TAG);
+        pw.println(" states: ");
+        synchronized (this) {
+            pw.print(prefix);
+            pw.print("mDisplayAreaMap=");
+            pw.println(mDisplayAreaMap);
+        }
+        pw.print(prefix);
+        pw.print("getDisplayBoundsOfNaturalOrientation()=");
+        pw.println(getDisplayBoundsOfNaturalOrientation());
+        pw.print(prefix);
+        pw.print("mDefaultDisplayBounds=");
+        pw.println(mDefaultDisplayBounds);
+        pw.print(prefix);
+        pw.print("mCurrentDisplayBounds=");
+        pw.println(mCurrentDisplayBounds);
+        pw.print(prefix);
+        pw.print("mDefaultCutoutInsets=");
+        pw.println(mDefaultCutoutInsets);
+        pw.print(prefix);
+        pw.print("mCurrentCutoutInsets=");
+        pw.println(mCurrentCutoutInsets);
+        pw.print(prefix);
+        pw.print("mRotation=");
+        pw.println(mRotation);
+        pw.print(prefix);
+        pw.print("mStatusBarHeight=");
+        pw.println(mStatusBarHeight);
+        pw.print(prefix);
+        pw.print("mOffsetX=");
+        pw.println(mOffsetX);
+        pw.print(prefix);
+        pw.print("mOffsetY=");
+        pw.println(mOffsetY);
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
index e5212bd..1c5d5b8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
@@ -83,11 +83,10 @@
     private boolean mShowPipMenuOnAnimationEnd = false;
 
     /**
-     * Whether PIP stash is enabled or not. When enabled, if at the time of fling-release the
-     * PIP bounds is outside the left/right edge of the screen, it will be shown in "stashed" mode,
-     * where PIP will only show partially.
+     * Whether PIP stash is enabled or not. When enabled, if the user flings toward the edge of the
+     * screen, it will be shown in "stashed" mode, where PIP will only show partially.
      */
-    private boolean mEnableStash = false;
+    private boolean mEnableStash = true;
 
     // The reference inset bounds, used to determine the dismiss fraction
     private Rect mInsetBounds = new Rect();
@@ -196,13 +195,13 @@
         mEnableStash = DeviceConfig.getBoolean(
                 DeviceConfig.NAMESPACE_SYSTEMUI,
                 PIP_STASHING,
-                /* defaultValue = */ false);
+                /* defaultValue = */ true);
         DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
                 context.getMainExecutor(),
                 properties -> {
                     if (properties.getKeyset().contains(PIP_STASHING)) {
                         mEnableStash = properties.getBoolean(
-                                PIP_STASHING, /* defaultValue = */ false);
+                                PIP_STASHING, /* defaultValue = */ true);
                     }
                 });
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/PipController.java
index 9404380..56e97b9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/PipController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/PipController.java
@@ -44,7 +44,6 @@
 import android.os.UserHandle;
 import android.text.TextUtils;
 import android.util.Log;
-import android.util.Pair;
 import android.view.DisplayInfo;
 
 import com.android.wm.shell.R;
@@ -57,7 +56,6 @@
 import com.android.wm.shell.pip.PipBoundsState;
 import com.android.wm.shell.pip.PipMediaController;
 import com.android.wm.shell.pip.PipTaskOrganizer;
-import com.android.wm.shell.pip.PipUtils;
 
 import java.util.ArrayList;
 import java.util.List;
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 33b6902..728cc51 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
@@ -16,9 +16,10 @@
 
 package com.android.wm.shell.flicker.pip.tv
 
-import android.os.SystemClock
 import androidx.test.filters.RequiresDevice
-import org.junit.Assert.assertNotNull
+import androidx.test.uiautomator.UiObject2
+import com.android.wm.shell.flicker.SYSTEM_UI_PACKAGE_NAME
+import com.android.wm.shell.flicker.wait
 import org.junit.Assert.assertTrue
 import org.junit.Before
 import org.junit.Test
@@ -34,21 +35,27 @@
 class TvPipMenuTests(rotationName: String, rotation: Int)
     : TvPipTestBase(rotationName, rotation) {
 
+    private val systemUiResources =
+            packageManager.getResourcesForApplication(SYSTEM_UI_PACKAGE_NAME)
+    private val playButtonDescription = systemUiResources.run {
+        getString(getIdentifier("pip_play", "string", SYSTEM_UI_PACKAGE_NAME))
+    }
+    private val pauseButtonDescription = systemUiResources.run {
+        getString(getIdentifier("pip_pause", "string", SYSTEM_UI_PACKAGE_NAME))
+    }
+
     @Before
     override fun setUp() {
         super.setUp()
         // Launch the app and go to PiP
         testApp.launchViaIntent()
-        testApp.clickEnterPipButton()
     }
 
     @Test
     fun pipMenu_open() {
-        // Pressing the Window key should bring up Pip menu
-        uiDevice.pressWindowKey()
-        val pipMenu = uiDevice.waitForTvPipMenu()
-                ?: fail("Pip notification should have been dismissed")
+        val pipMenu = enterPip_openMenu_assertShown()
 
+        // Make sure it's fullscreen
         assertTrue("Pip menu should be shown fullscreen", pipMenu.isFullscreen(uiDevice))
 
         testApp.closePipWindow()
@@ -56,22 +63,29 @@
 
     @Test
     fun pipMenu_backButton() {
-        // Pressing the Window key should bring up Pip menu
-        uiDevice.pressWindowKey()
-        assertNotNull("Pip notification should have been dismissed", uiDevice.waitForTvPipMenu())
+        enterPip_openMenu_assertShown()
 
         // Pressing the Back key should close the Pip menu
         uiDevice.pressBack()
-        assertTrue("Pip notification should have closed", uiDevice.waitForTvPipMenuToClose())
+        assertTrue("Pip menu should have closed", uiDevice.waitForTvPipMenuToClose())
+
+        testApp.closePipWindow()
+    }
+
+    @Test
+    fun pipMenu_homeButton() {
+        enterPip_openMenu_assertShown()
+
+        // Pressing the Home key should close the Pip menu
+        uiDevice.pressHome()
+        assertTrue("Pip menu should have closed", uiDevice.waitForTvPipMenuToClose())
 
         testApp.closePipWindow()
     }
 
     @Test
     fun pipMenu_closeButton() {
-        // Pressing the Window key should bring up Pip menu
-        uiDevice.pressWindowKey()
-        assertNotNull("Pip notification should have been dismissed", uiDevice.waitForTvPipMenu())
+        enterPip_openMenu_assertShown()
 
         // PiP menu should contain the Close button
         val closeButton = uiDevice.findTvPipMenuCloseButton()
@@ -84,26 +98,53 @@
 
     @Test
     fun pipMenu_fullscreenButton() {
-        // Pressing the Window key should bring up Pip menu
-        uiDevice.pressWindowKey()
-        assertNotNull("Pip notification should have been dismissed", uiDevice.waitForTvPipMenu())
+        enterPip_openMenu_assertShown()
 
         // PiP menu should contain the Fullscreen button
         val fullscreenButton = 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 3 seconds, check the app is fullscreen
+        // Click, wait for the app to go fullscreen
         fullscreenButton.click()
-        SystemClock.sleep(3_000L)
         assertTrue("\"Full screen\" button should open the app fullscreen",
-                testApp.ui?.isFullscreen(uiDevice) ?: false)
+                wait { testApp.ui?.isFullscreen(uiDevice) ?: false })
 
         // Close the app
         uiDevice.pressBack()
         testApp.waitUntilClosed()
     }
 
+    @Test
+    fun pipMenu_mediaPlayPauseButtons() {
+        // Start media session before entering PiP
+        testApp.clickStartMediaSessionButton()
+
+        enterPip_openMenu_assertShown()
+
+        // PiP menu should contain the Pause button
+        val pauseButton = 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()
+
+        // PiP menu should contain the Play button now
+        uiDevice.waitForTvPipMenuElementWithDescription(playButtonDescription)
+                ?: fail("\"Play\" button should be shown in Pip menu if there is an active " +
+                        "paused media session.")
+
+        testApp.closePipWindow()
+    }
+
+    private fun enterPip_openMenu_assertShown(): UiObject2 {
+        testApp.clickEnterPipButton()
+        // Pressing the Window key should bring up Pip menu
+        uiDevice.pressWindowKey()
+        return uiDevice.waitForTvPipMenu() ?: fail("Pip menu should have been shown")
+    }
+
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipTestBase.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipTestBase.kt
index 05f4b0b..d4acae5 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipTestBase.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipTestBase.kt
@@ -16,13 +16,19 @@
 
 package com.android.wm.shell.flicker.pip.tv
 
+import android.app.ActivityManager
+import android.app.IActivityManager
+import android.app.IProcessObserver
 import android.content.pm.PackageManager.FEATURE_LEANBACK
 import android.content.pm.PackageManager.FEATURE_LEANBACK_ONLY
+import android.os.SystemClock
 import android.view.Surface.ROTATION_0
 import android.view.Surface.rotationToString
 import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
+import com.android.wm.shell.flicker.SYSTEM_UI_PACKAGE_NAME
 import com.android.wm.shell.flicker.pip.PipTestBase
 import org.junit.After
+import org.junit.Assert.assertFalse
 import org.junit.Assume
 import org.junit.Before
 
@@ -33,21 +39,61 @@
         get() = packageManager.run {
             hasSystemFeature(FEATURE_LEANBACK) || hasSystemFeature(FEATURE_LEANBACK_ONLY)
         }
+    private val systemUiProcessObserver = SystemUiProcessObserver()
 
     @Before
     open fun setUp() {
         Assume.assumeTrue(isTelevision)
+
+        systemUiProcessObserver.start()
+
         uiDevice.wakeUpAndGoToHomeScreen()
     }
 
     @After
     open fun tearDown() {
+        if (!isTelevision) return
+
         testApp.forceStop()
+
+        // Wait for 1 second, and check if the SystemUI has been alive and well since the start.
+        SystemClock.sleep(AFTER_TEXT_PROCESS_CHECK_DELAY)
+        systemUiProcessObserver.stop()
+        assertFalse("SystemUI has died during test execution", systemUiProcessObserver.hasDied)
     }
 
     protected fun fail(message: String): Nothing = throw AssertionError(message)
 
+    inner class SystemUiProcessObserver : IProcessObserver.Stub() {
+        private val activityManager: IActivityManager = ActivityManager.getService()
+        private val uiAutomation = instrumentation.uiAutomation
+        private val systemUiUid = packageManager.getPackageUid(SYSTEM_UI_PACKAGE_NAME, 0)
+        var hasDied: Boolean = false
+
+        fun start() {
+            hasDied = false
+            uiAutomation.adoptShellPermissionIdentity(
+                    android.Manifest.permission.SET_ACTIVITY_WATCHER)
+            activityManager.registerProcessObserver(this)
+        }
+
+        fun stop() {
+            activityManager.unregisterProcessObserver(this)
+            uiAutomation.dropShellPermissionIdentity()
+        }
+
+        override fun onForegroundActivitiesChanged(pid: Int, uid: Int, foreground: Boolean) {}
+
+        override fun onForegroundServicesChanged(pid: Int, uid: Int, serviceTypes: Int) {}
+
+        override fun onProcessDied(pid: Int, uid: Int) {
+            if (uid == systemUiUid) hasDied = true
+        }
+    }
+
     companion object {
+        private const val AFTER_TEXT_PROCESS_CHECK_DELAY = 1_000L // 1 sec
+
         @JvmStatic
         protected val rotationParams: Collection<Array<Any>> =
                 listOf(arrayOf(rotationToString(ROTATION_0), ROTATION_0))
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 d9e6ff3..8db8bc67 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
@@ -45,6 +45,19 @@
 fun UiDevice.findTvPipMenuFullscreenButton(): UiObject2? = findObject(
         By.res(SYSTEM_UI_PACKAGE_NAME, TV_PIP_MENU_FULLSCREEN_BUTTON_ID))
 
+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.waitForTvPipMenuElementWithDescription(desc: String): UiObject2? {
+    val buttonSelector = By.desc(desc)
+    val menuWithButtonSelector = By.copy(tvPipMenuSelector).hasDescendant(buttonSelector)
+    return wait(Until.findObject(menuWithButtonSelector), WAIT_TIME_MS)
+            ?.findObject(buttonSelector)
+}
+
 fun UiObject2.isFullscreen(uiDevice: UiDevice): Boolean = visibleBounds.run {
     height() == uiDevice.displayHeight && width() == uiDevice.displayWidth
 }
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/src/com/android/wm/shell/flicker/testapp/PipActivity.java b/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/src/com/android/wm/shell/flicker/testapp/PipActivity.java
index f70603e..b60068a 100644
--- a/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/src/com/android/wm/shell/flicker/testapp/PipActivity.java
+++ b/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/src/com/android/wm/shell/flicker/testapp/PipActivity.java
@@ -17,7 +17,8 @@
 package com.android.wm.shell.flicker.testapp;
 
 import static android.media.MediaMetadata.METADATA_KEY_TITLE;
-import static android.media.session.PlaybackState.ACTION_PLAY_PAUSE;
+import static android.media.session.PlaybackState.ACTION_PAUSE;
+import static android.media.session.PlaybackState.ACTION_PLAY;
 import static android.media.session.PlaybackState.ACTION_STOP;
 import static android.media.session.PlaybackState.STATE_PAUSED;
 import static android.media.session.PlaybackState.STATE_PLAYING;
@@ -48,7 +49,7 @@
 
     private MediaSession mMediaSession;
     private final PlaybackState.Builder mPlaybackStateBuilder = new PlaybackState.Builder()
-            .setActions(ACTION_PLAY_PAUSE | ACTION_STOP)
+            .setActions(ACTION_PLAY | ACTION_PAUSE | ACTION_STOP)
             .setState(STATE_STOPPED, 0, 1f);
     private PlaybackState mPlaybackState = mPlaybackStateBuilder.build();
     private final MediaMetadata.Builder mMediaMetadataBuilder = new MediaMetadata.Builder();
diff --git a/libs/WindowManager/Shell/tests/unittest/Android.bp b/libs/WindowManager/Shell/tests/unittest/Android.bp
index 9940ea5..dca2732 100644
--- a/libs/WindowManager/Shell/tests/unittest/Android.bp
+++ b/libs/WindowManager/Shell/tests/unittest/Android.bp
@@ -30,6 +30,7 @@
         "mockito-target-extended-minus-junit4",
         "truth-prebuilt",
         "testables",
+        "platform-test-annotations",
     ],
 
     libs: [
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/AppPairTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/AppPairTests.java
new file mode 100644
index 0000000..9ab0f89
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/AppPairTests.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.apppairs;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.ActivityManager;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import com.android.wm.shell.ShellTaskOrganizer;
+import com.android.wm.shell.common.SyncTransactionQueue;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/** Tests for {@link AppPair} */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AppPairTests {
+
+    private AppPairsController mController;
+    @Mock private SyncTransactionQueue mSyncQueue;
+    @Mock private ShellTaskOrganizer mTaskOrganizer;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mController = new TestAppPairsController(mTaskOrganizer, mSyncQueue);
+    }
+
+    @After
+    public void tearDown() {}
+
+    @Test
+    public void testContains() {
+        final ActivityManager.RunningTaskInfo task1 = new TestRunningTaskInfoBuilder().build();
+        final ActivityManager.RunningTaskInfo task2 = new TestRunningTaskInfoBuilder().build();
+
+        final AppPair pair = mController.pairInner(task1, task2);
+        assertThat(pair.contains(task1.taskId)).isTrue();
+        assertThat(pair.contains(task2.taskId)).isTrue();
+
+        pair.unpair();
+        assertThat(pair.contains(task1.taskId)).isFalse();
+        assertThat(pair.contains(task2.taskId)).isFalse();
+    }
+
+    @Test
+    public void testVanishUnpairs() {
+        final ActivityManager.RunningTaskInfo task1 = new TestRunningTaskInfoBuilder().build();
+        final ActivityManager.RunningTaskInfo task2 = new TestRunningTaskInfoBuilder().build();
+
+        final AppPair pair = mController.pairInner(task1, task2);
+        assertThat(pair.contains(task1.taskId)).isTrue();
+        assertThat(pair.contains(task2.taskId)).isTrue();
+
+        pair.onTaskVanished(task1);
+        assertThat(pair.contains(task1.taskId)).isFalse();
+        assertThat(pair.contains(task2.taskId)).isFalse();
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/AppPairsControllerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/AppPairsControllerTests.java
new file mode 100644
index 0000000..ed85b67
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/AppPairsControllerTests.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.apppairs;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.ActivityManager;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import com.android.wm.shell.ShellTaskOrganizer;
+import com.android.wm.shell.common.SyncTransactionQueue;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/** Tests for {@link AppPairsController} */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AppPairsControllerTests {
+    private TestAppPairsController mController;
+    private TestAppPairsPool mPool;
+    @Mock private SyncTransactionQueue mSyncQueue;
+    @Mock private ShellTaskOrganizer mTaskOrganizer;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mController = new TestAppPairsController(mTaskOrganizer, mSyncQueue);
+        mPool = mController.getPool();
+    }
+
+    @After
+    public void tearDown() {}
+
+    @Test
+    public void testPairUnpair() {
+        final ActivityManager.RunningTaskInfo task1 = new TestRunningTaskInfoBuilder().build();
+        final ActivityManager.RunningTaskInfo task2 = new TestRunningTaskInfoBuilder().build();
+
+        final AppPair pair = mController.pairInner(task1, task2);
+        assertThat(pair.contains(task1.taskId)).isTrue();
+        assertThat(pair.contains(task2.taskId)).isTrue();
+        assertThat(mPool.poolSize()).isGreaterThan(0);
+
+        mController.unpair(task2.taskId);
+        assertThat(pair.contains(task1.taskId)).isFalse();
+        assertThat(pair.contains(task2.taskId)).isFalse();
+        assertThat(mPool.poolSize()).isGreaterThan(1);
+    }
+
+    @Test
+    public void testUnpair_DontReleaseToPool() {
+        final ActivityManager.RunningTaskInfo task1 = new TestRunningTaskInfoBuilder().build();
+        final ActivityManager.RunningTaskInfo task2 = new TestRunningTaskInfoBuilder().build();
+
+        final AppPair pair = mController.pairInner(task1, task2);
+        assertThat(pair.contains(task1.taskId)).isTrue();
+        assertThat(pair.contains(task2.taskId)).isTrue();
+
+        mController.unpair(task2.taskId, false /* releaseToPool */);
+        assertThat(pair.contains(task1.taskId)).isFalse();
+        assertThat(pair.contains(task2.taskId)).isFalse();
+        assertThat(mPool.poolSize()).isEqualTo(1);
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/AppPairsPoolTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/AppPairsPoolTests.java
new file mode 100644
index 0000000..4a0fe0f
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/AppPairsPoolTests.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.apppairs;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import com.android.wm.shell.ShellTaskOrganizer;
+import com.android.wm.shell.common.SyncTransactionQueue;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/** Tests for {@link AppPairsPool} */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AppPairsPoolTests {
+    private TestAppPairsController mController;
+    private TestAppPairsPool mPool;
+    @Mock private SyncTransactionQueue mSyncQueue;
+    @Mock private ShellTaskOrganizer mTaskOrganizer;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mController = new TestAppPairsController(mTaskOrganizer, mSyncQueue);
+        mPool = mController.getPool();
+    }
+
+    @After
+    public void tearDown() {}
+
+    @Test
+    public void testInitialState() {
+        // Pool should always start off with at least 1 entry.
+        assertThat(mPool.poolSize()).isGreaterThan(0);
+    }
+
+    @Test
+    public void testAcquireRelease() {
+        assertThat(mPool.poolSize()).isGreaterThan(0);
+        final AppPair appPair = mPool.acquire();
+        assertThat(mPool.poolSize()).isGreaterThan(0);
+        mPool.release(appPair);
+        assertThat(mPool.poolSize()).isGreaterThan(1);
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestAppPairsController.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestAppPairsController.java
new file mode 100644
index 0000000..7ea5a1b
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestAppPairsController.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.apppairs;
+
+import com.android.wm.shell.ShellTaskOrganizer;
+import com.android.wm.shell.common.SyncTransactionQueue;
+
+public class TestAppPairsController extends AppPairsController {
+    TestAppPairsPool mPool;
+
+    public TestAppPairsController(ShellTaskOrganizer organizer, SyncTransactionQueue syncQueue) {
+        super(organizer, syncQueue);
+        mPool = new TestAppPairsPool(this);
+        setPairsPool(mPool);
+    }
+
+    TestAppPairsPool getPool() {
+        return mPool;
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestAppPairsPool.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestAppPairsPool.java
new file mode 100644
index 0000000..080f207
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestAppPairsPool.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.apppairs;
+
+import android.app.ActivityManager;
+
+public class TestAppPairsPool extends AppPairsPool{
+    TestAppPairsPool(AppPairsController controller) {
+        super(controller);
+    }
+
+    @Override
+    void incrementPool() {
+        final AppPair entry = new AppPair(mController);
+        final ActivityManager.RunningTaskInfo info =
+                new TestRunningTaskInfoBuilder().build();
+        entry.onTaskAppeared(info, null /* leash */);
+        release(entry);
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestRunningTaskInfoBuilder.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestRunningTaskInfoBuilder.java
new file mode 100644
index 0000000..76d3a6a
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestRunningTaskInfoBuilder.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.apppairs;
+
+import android.app.ActivityManager;
+import android.graphics.Rect;
+import android.window.IWindowContainerToken;
+import android.window.WindowContainerToken;
+
+public class TestRunningTaskInfoBuilder {
+    static int sNextTaskId = 500;
+    private Rect mBounds = new Rect(0, 0, 100, 100);
+    private WindowContainerToken mToken =
+            new WindowContainerToken(new IWindowContainerToken.Default());
+
+    TestRunningTaskInfoBuilder setBounds(Rect bounds) {
+        mBounds.set(bounds);
+        return this;
+    }
+
+    ActivityManager.RunningTaskInfo build() {
+        final ActivityManager.RunningTaskInfo info = new ActivityManager.RunningTaskInfo();
+        info.taskId = sNextTaskId++;
+        info.configuration.windowConfiguration.setBounds(mBounds);
+        info.token = mToken;
+        info.isResizeable = true;
+        return info;
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
index 7adc411..7c9b9c3 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
@@ -35,6 +35,7 @@
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.util.Pair;
+import android.view.WindowManager;
 
 import androidx.test.filters.SmallTest;
 
@@ -135,8 +136,9 @@
         mBubbleB2 = new Bubble(mEntryB2, mSuppressionListener, mPendingIntentCanceledListener);
         mBubbleB3 = new Bubble(mEntryB3, mSuppressionListener, mPendingIntentCanceledListener);
         mBubbleC1 = new Bubble(mEntryC1, mSuppressionListener, mPendingIntentCanceledListener);
-
-        mBubbleData = new BubbleData(getContext(), mBubbleLogger);
+        TestableBubblePositioner positioner = new TestableBubblePositioner(mContext,
+                mock(WindowManager.class));
+        mBubbleData = new BubbleData(getContext(), mBubbleLogger, positioner);
 
         // Used by BubbleData to set lastAccessedTime
         when(mTimeSource.currentTimeMillis()).thenReturn(1000L);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleFlyoutViewTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleFlyoutViewTest.java
index 5b77e4a..69d5244 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleFlyoutViewTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleFlyoutViewTest.java
@@ -19,7 +19,9 @@
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertNotSame;
 
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.graphics.Color;
 import android.graphics.PointF;
@@ -36,7 +38,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mockito;
+import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
 @SmallTest
@@ -48,11 +50,16 @@
     private TextView mSenderName;
     private float[] mDotCenter = new float[2];
     private Bubble.FlyoutMessage mFlyoutMessage;
+    @Mock
+    private BubblePositioner mPositioner;
 
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
 
+        when(mPositioner.getBubbleBitmapSize()).thenReturn(40);
+        when(mPositioner.getBubbleSize()).thenReturn(60);
+
         mFlyoutMessage = new Bubble.FlyoutMessage();
         mFlyoutMessage.senderName = "Josh";
         mFlyoutMessage.message = "Hello";
@@ -70,7 +77,8 @@
         mFlyout.setupFlyoutStartingAsDot(
                 mFlyoutMessage,
                 new PointF(100, 100), 500, true, Color.WHITE, null, null, mDotCenter,
-                false);
+                false,
+                mPositioner);
         mFlyout.setVisibility(View.VISIBLE);
 
         assertEquals("Hello", mFlyoutText.getText());
@@ -80,10 +88,11 @@
 
     @Test
     public void testFlyoutHide_runsCallback() {
-        Runnable after = Mockito.mock(Runnable.class);
+        Runnable after = mock(Runnable.class);
         mFlyout.setupFlyoutStartingAsDot(mFlyoutMessage,
                 new PointF(100, 100), 500, true, Color.WHITE, null, after, mDotCenter,
-                false);
+                false,
+                mPositioner);
         mFlyout.hideFlyout();
 
         verify(after).run();
@@ -93,7 +102,8 @@
     public void testSetCollapsePercent() {
         mFlyout.setupFlyoutStartingAsDot(mFlyoutMessage,
                 new PointF(100, 100), 500, true, Color.WHITE, null, null, mDotCenter,
-                false);
+                false,
+                mPositioner);
         mFlyout.setVisibility(View.VISIBLE);
 
         mFlyout.setCollapsePercent(1f);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/TestableBubblePositioner.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/TestableBubblePositioner.java
new file mode 100644
index 0000000..96bc533
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/TestableBubblePositioner.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.bubbles;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.graphics.Insets;
+import android.graphics.Rect;
+import android.view.WindowManager;
+
+public class TestableBubblePositioner extends BubblePositioner {
+
+    public TestableBubblePositioner(Context context,
+            WindowManager windowManager) {
+        super(context, windowManager);
+
+        updateInternal(Configuration.ORIENTATION_PORTRAIT,
+                Insets.of(0, 0, 0, 0),
+                new Rect(0, 0, 500, 1000));
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationControllerTest.java
index 9c4f341..1eba3c2 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationControllerTest.java
@@ -64,7 +64,7 @@
         super.setUp();
 
         BubblePositioner positioner = new BubblePositioner(getContext(), mock(WindowManager.class));
-        positioner.update(Configuration.ORIENTATION_PORTRAIT,
+        positioner.updateInternal(Configuration.ORIENTATION_PORTRAIT,
                 Insets.of(0, 0, 0, 0),
                 new Rect(0, 0, mDisplayWidth, mDisplayHeight));
         mExpandedController = new ExpandedAnimationController(positioner, mExpandedViewPadding,
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/StackAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/StackAnimationControllerTest.java
index 6b01462..f36dcbe 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/StackAnimationControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/StackAnimationControllerTest.java
@@ -27,6 +27,7 @@
 import android.graphics.PointF;
 import android.testing.AndroidTestingRunner;
 import android.view.View;
+import android.view.WindowManager;
 import android.widget.FrameLayout;
 
 import androidx.dynamicanimation.animation.DynamicAnimation;
@@ -34,7 +35,7 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.wm.shell.R;
-import com.android.wm.shell.bubbles.BubblePositioner;
+import com.android.wm.shell.bubbles.TestableBubblePositioner;
 import com.android.wm.shell.common.FloatingContentCoordinator;
 
 import org.junit.Before;
@@ -310,7 +311,7 @@
             super(floatingContentCoordinator,
                     bubbleCountSupplier,
                     onBubbleAnimatedOutAction,
-                    mock(BubblePositioner.class));
+                    new TestableBubblePositioner(mContext, mock(WindowManager.class)));
         }
 
         @Override
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutControllerTest.java
new file mode 100644
index 0000000..595440f
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutControllerTest.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.hidedisplaycutout;
+
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+
+import android.platform.test.annotations.Presubmit;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableContext;
+import android.testing.TestableLooper;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@Presubmit
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class HideDisplayCutoutControllerTest {
+    private TestableContext mContext = new TestableContext(
+            InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
+
+    private HideDisplayCutoutController mHideDisplayCutoutController;
+    @Mock
+    private HideDisplayCutoutOrganizer mMockDisplayAreaOrganizer;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mHideDisplayCutoutController = new HideDisplayCutoutController(
+                mContext, mMockDisplayAreaOrganizer);
+    }
+
+    @Test
+    public void testToggleHideDisplayCutout_On() {
+        mHideDisplayCutoutController.mEnabled = false;
+        mContext.getOrCreateTestableResources().addOverride(
+                com.android.internal.R.bool.config_hideDisplayCutoutWithDisplayArea, true);
+        reset(mMockDisplayAreaOrganizer);
+        mHideDisplayCutoutController.updateStatus();
+        verify(mMockDisplayAreaOrganizer).enableHideDisplayCutout();
+    }
+
+    @Test
+    public void testToggleHideDisplayCutout_Off() {
+        mHideDisplayCutoutController.mEnabled = true;
+        mContext.getOrCreateTestableResources().addOverride(
+                com.android.internal.R.bool.config_hideDisplayCutoutWithDisplayArea, false);
+        mHideDisplayCutoutController.updateStatus();
+        verify(mMockDisplayAreaOrganizer).disableHideDisplayCutout();
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizerTest.java
new file mode 100644
index 0000000..2e4fd6a
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizerTest.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.hidedisplaycutout;
+
+import static android.view.Display.DEFAULT_DISPLAY;
+import static android.window.DisplayAreaOrganizer.FEATURE_HIDE_DISPLAY_CUTOUT;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.res.Configuration;
+import android.graphics.Insets;
+import android.graphics.Rect;
+import android.os.Binder;
+import android.platform.test.annotations.Presubmit;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableContext;
+import android.testing.TestableLooper;
+import android.view.Display;
+import android.view.Surface;
+import android.view.SurfaceControl;
+import android.window.DisplayAreaAppearedInfo;
+import android.window.DisplayAreaInfo;
+import android.window.DisplayAreaOrganizer;
+import android.window.IWindowContainerToken;
+import android.window.WindowContainerToken;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
+import com.android.internal.R;
+import com.android.wm.shell.common.DisplayController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+
+@Presubmit
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class HideDisplayCutoutOrganizerTest {
+    private TestableContext mContext = new TestableContext(
+            InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
+
+    @Mock
+    private DisplayController mMockDisplayController;
+    private HideDisplayCutoutOrganizer mOrganizer;
+
+    private DisplayAreaInfo mDisplayAreaInfo;
+    private SurfaceControl mLeash;
+
+    @Mock
+    private Display mDisplay;
+    @Mock
+    private IWindowContainerToken mMockRealToken;
+    private WindowContainerToken mToken;
+
+    private final Rect mFakeDefaultBounds = new Rect(0, 0, 100, 200);
+    private final Insets mFakeDefaultCutoutInsets = Insets.of(0, 10, 0, 0);
+    private final int mFakeStatusBarHeightPortrait = 15;
+    private final int mFakeStatusBarHeightLandscape = 10;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+
+        when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay);
+
+        HideDisplayCutoutOrganizer organizer = new HideDisplayCutoutOrganizer(
+                mContext, mMockDisplayController);
+        mOrganizer = Mockito.spy(organizer);
+        doNothing().when(mOrganizer).unregisterOrganizer();
+        doNothing().when(mOrganizer).applyBoundsAndOffsets(any(), any(), any(), any());
+        doNothing().when(mOrganizer).applyTransaction(any(), any());
+
+        // It will be called when mDisplayAreaMap.containKey(token) is called.
+        Binder binder = new Binder();
+        doReturn(binder).when(mMockRealToken).asBinder();
+        mToken = new WindowContainerToken(mMockRealToken);
+        mLeash = new SurfaceControl();
+        mDisplayAreaInfo = new DisplayAreaInfo(
+                mToken, DEFAULT_DISPLAY, FEATURE_HIDE_DISPLAY_CUTOUT);
+        mDisplayAreaInfo.configuration.orientation = Configuration.ORIENTATION_PORTRAIT;
+        DisplayAreaAppearedInfo info = new DisplayAreaAppearedInfo(mDisplayAreaInfo, mLeash);
+        ArrayList<DisplayAreaAppearedInfo> infoList = new ArrayList<>();
+        infoList.add(info);
+        doReturn(infoList).when(mOrganizer).registerOrganizer(
+                DisplayAreaOrganizer.FEATURE_HIDE_DISPLAY_CUTOUT);
+    }
+
+    @Test
+    public void testEnableHideDisplayCutout() {
+        mOrganizer.enableHideDisplayCutout();
+
+        verify(mOrganizer).registerOrganizer(DisplayAreaOrganizer.FEATURE_HIDE_DISPLAY_CUTOUT);
+        verify(mOrganizer).addDisplayAreaInfoAndLeashToMap(mDisplayAreaInfo, mLeash);
+        verify(mOrganizer).updateBoundsAndOffsets(true);
+        assertThat(mOrganizer.mDisplayAreaMap.containsKey(mDisplayAreaInfo.token)).isTrue();
+        assertThat(mOrganizer.mDisplayAreaMap.containsValue(mLeash)).isTrue();
+    }
+
+    @Test
+    public void testOnDisplayAreaAppeared() {
+        mOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash);
+
+        assertThat(mOrganizer.mDisplayAreaMap.containsKey(mToken)).isTrue();
+        assertThat(mOrganizer.mDisplayAreaMap.containsValue(mLeash)).isTrue();
+    }
+
+    @Test
+    public void testOnDisplayAreaVanished() {
+        mOrganizer.mDisplayAreaMap.put(mDisplayAreaInfo.token, mLeash);
+        mOrganizer.onDisplayAreaVanished(mDisplayAreaInfo);
+
+        assertThat(mOrganizer.mDisplayAreaMap.containsKey(mDisplayAreaInfo.token)).isFalse();
+    }
+
+    @Test
+    public void testToggleHideDisplayCutout_enable_rot0() {
+        doReturn(mFakeDefaultBounds).when(mOrganizer).getDisplayBoundsOfNaturalOrientation();
+        doReturn(mFakeDefaultCutoutInsets).when(mOrganizer)
+                .getDisplayCutoutInsetsOfNaturalOrientation();
+        mContext.getOrCreateTestableResources().addOverride(
+                R.dimen.status_bar_height_portrait, mFakeStatusBarHeightPortrait);
+        doReturn(Surface.ROTATION_0).when(mDisplay).getRotation();
+        mOrganizer.enableHideDisplayCutout();
+
+        verify(mOrganizer).registerOrganizer(DisplayAreaOrganizer.FEATURE_HIDE_DISPLAY_CUTOUT);
+        verify(mOrganizer).addDisplayAreaInfoAndLeashToMap(mDisplayAreaInfo, mLeash);
+        verify(mOrganizer).updateBoundsAndOffsets(true);
+        assertThat(mOrganizer.mCurrentDisplayBounds).isEqualTo(new Rect(0, 15, 100, 200));
+        assertThat(mOrganizer.mOffsetX).isEqualTo(0);
+        assertThat(mOrganizer.mOffsetY).isEqualTo(15);
+        assertThat(mOrganizer.mRotation).isEqualTo(Surface.ROTATION_0);
+    }
+
+    @Test
+    public void testToggleHideDisplayCutout_enable_rot90() {
+        doReturn(mFakeDefaultBounds).when(mOrganizer).getDisplayBoundsOfNaturalOrientation();
+        doReturn(mFakeDefaultCutoutInsets).when(mOrganizer)
+                .getDisplayCutoutInsetsOfNaturalOrientation();
+        mContext.getOrCreateTestableResources().addOverride(
+                R.dimen.status_bar_height_landscape, mFakeStatusBarHeightLandscape);
+        doReturn(Surface.ROTATION_90).when(mDisplay).getRotation();
+        mOrganizer.enableHideDisplayCutout();
+
+        verify(mOrganizer).registerOrganizer(DisplayAreaOrganizer.FEATURE_HIDE_DISPLAY_CUTOUT);
+        verify(mOrganizer).addDisplayAreaInfoAndLeashToMap(mDisplayAreaInfo, mLeash);
+        verify(mOrganizer).updateBoundsAndOffsets(true);
+        assertThat(mOrganizer.mCurrentDisplayBounds).isEqualTo(new Rect(10, 0, 200, 100));
+        assertThat(mOrganizer.mOffsetX).isEqualTo(10);
+        assertThat(mOrganizer.mOffsetY).isEqualTo(0);
+        assertThat(mOrganizer.mRotation).isEqualTo(Surface.ROTATION_90);
+    }
+
+    @Test
+    public void testToggleHideDisplayCutout_enable_rot270() {
+        doReturn(mFakeDefaultBounds).when(mOrganizer).getDisplayBoundsOfNaturalOrientation();
+        doReturn(mFakeDefaultCutoutInsets).when(mOrganizer)
+                .getDisplayCutoutInsetsOfNaturalOrientation();
+        mContext.getOrCreateTestableResources().addOverride(
+                R.dimen.status_bar_height_landscape, mFakeStatusBarHeightLandscape);
+        doReturn(Surface.ROTATION_270).when(mDisplay).getRotation();
+        mOrganizer.enableHideDisplayCutout();
+
+        verify(mOrganizer).registerOrganizer(DisplayAreaOrganizer.FEATURE_HIDE_DISPLAY_CUTOUT);
+        verify(mOrganizer).addDisplayAreaInfoAndLeashToMap(mDisplayAreaInfo, mLeash);
+        verify(mOrganizer).updateBoundsAndOffsets(true);
+        assertThat(mOrganizer.mCurrentDisplayBounds).isEqualTo(new Rect(0, 0, 190, 100));
+        assertThat(mOrganizer.mOffsetX).isEqualTo(0);
+        assertThat(mOrganizer.mOffsetY).isEqualTo(0);
+        assertThat(mOrganizer.mRotation).isEqualTo(Surface.ROTATION_270);
+    }
+
+    @Test
+    public void testToggleHideDisplayCutout_disable() {
+        doReturn(mFakeDefaultBounds).when(mOrganizer).getDisplayBoundsOfNaturalOrientation();
+        doReturn(mFakeDefaultCutoutInsets).when(mOrganizer)
+                .getDisplayCutoutInsetsOfNaturalOrientation();
+        mContext.getOrCreateTestableResources().addOverride(
+                R.dimen.status_bar_height_portrait, mFakeStatusBarHeightPortrait);
+        mOrganizer.enableHideDisplayCutout();
+
+        // disable hide display cutout
+        mOrganizer.disableHideDisplayCutout();
+        verify(mOrganizer).updateBoundsAndOffsets(false);
+        verify(mOrganizer).unregisterOrganizer();
+        assertThat(mOrganizer.mCurrentDisplayBounds).isEqualTo(new Rect(0, 0, 0, 0));
+        assertThat(mOrganizer.mOffsetX).isEqualTo(0);
+        assertThat(mOrganizer.mOffsetY).isEqualTo(0);
+    }
+}
diff --git a/libs/androidfw/ConfigDescription.cpp b/libs/androidfw/ConfigDescription.cpp
index 1f3a89e..19ead95 100644
--- a/libs/androidfw/ConfigDescription.cpp
+++ b/libs/androidfw/ConfigDescription.cpp
@@ -887,13 +887,16 @@
   }
 
   // Locale de-duping is not-trivial, disable for now (b/62409213).
-  if (diff(o) & CONFIG_LOCALE) {
+  // We must also disable de-duping for all configuration qualifiers with precedence higher than
+  // locale (b/171892595)
+  if (diff(o) & (CONFIG_LOCALE | CONFIG_MCC | CONFIG_MNC)) {
     return false;
   }
 
   if (*this == DefaultConfig()) {
     return true;
   }
+
   return MatchWithDensity(o) && !o.MatchWithDensity(*this) &&
          !isMoreSpecificThan(o) && !o.HasHigherPrecedenceThan(*this);
 }
diff --git a/libs/hwui/canvas/CanvasOpBuffer.h b/libs/hwui/canvas/CanvasOpBuffer.h
index b80faeb..07e079a 100644
--- a/libs/hwui/canvas/CanvasOpBuffer.h
+++ b/libs/hwui/canvas/CanvasOpBuffer.h
@@ -46,6 +46,10 @@
     const SkMatrix& transform() const { return mTransform; }
 
     CanvasOp<T>* operator->() noexcept { return &mImpl; }
+    const CanvasOp<T>* operator->() const noexcept { return &mImpl; }
+
+    CanvasOp<T>& op() noexcept { return mImpl; }
+    const CanvasOp<T>& op() const noexcept { return mImpl; }
 };
 
 extern template class OpBuffer<CanvasOpType, CanvasOpContainer>;
diff --git a/libs/hwui/canvas/CanvasOpRasterizer.cpp b/libs/hwui/canvas/CanvasOpRasterizer.cpp
index 97c418a..25129f6 100644
--- a/libs/hwui/canvas/CanvasOpRasterizer.cpp
+++ b/libs/hwui/canvas/CanvasOpRasterizer.cpp
@@ -32,7 +32,7 @@
     std::vector<SkMatrix> globalMatrixStack;
     SkMatrix& currentGlobalTransform = globalMatrixStack.emplace_back(SkMatrix::I());
 
-    source.for_each([&]<CanvasOpType T>(CanvasOpContainer<T> * op) {
+    source.for_each([&]<CanvasOpType T>(const CanvasOpContainer<T> * op) {
         if constexpr (T == CanvasOpType::BeginZ || T == CanvasOpType::EndZ) {
             // Do beginZ or endZ
             LOG_ALWAYS_FATAL("TODO");
diff --git a/libs/hwui/canvas/CanvasOpTypes.h b/libs/hwui/canvas/CanvasOpTypes.h
index 895c6d0..f9df2f7 100644
--- a/libs/hwui/canvas/CanvasOpTypes.h
+++ b/libs/hwui/canvas/CanvasOpTypes.h
@@ -37,14 +37,24 @@
     // Drawing ops
     DrawColor,
     DrawRect,
+    DrawRegion,
     DrawRoundRect,
     DrawRoundRectProperty,
+    DrawDoubleRoundRect,
     DrawCircleProperty,
     DrawCircle,
     DrawOval,
     DrawArc,
     DrawPaint,
-
+    DrawPoint,
+    DrawPath,
+    DrawLine,
+    DrawVertices,
+    DrawImage,
+    DrawImageRect,
+    // DrawImageLattice also used to draw 9 patches
+    DrawImageLattice,
+    DrawPicture,
 
     // TODO: Rest
 
diff --git a/libs/hwui/canvas/CanvasOps.h b/libs/hwui/canvas/CanvasOps.h
index afd88c0..8c7113d 100644
--- a/libs/hwui/canvas/CanvasOps.h
+++ b/libs/hwui/canvas/CanvasOps.h
@@ -19,12 +19,18 @@
 #include <SkAndroidFrameworkUtils.h>
 #include <SkCanvas.h>
 #include <SkPath.h>
+#include <SkRegion.h>
+#include <SkVertices.h>
+#include <SkImage.h>
+#include <SkPicture.h>
+#include <hwui/Bitmap.h>
 #include <log/log.h>
 #include "CanvasProperty.h"
 
 #include "CanvasOpTypes.h"
 
 #include <experimental/type_traits>
+#include <utility>
 
 namespace android::uirenderer {
 
@@ -150,6 +156,15 @@
 };
 
 template <>
+struct CanvasOp<CanvasOpType::DrawPoint> {
+    float x;
+    float y;
+    SkPaint paint;
+    void draw(SkCanvas* canvas) const { canvas->drawPoint(x, y, paint); }
+    ASSERT_DRAWABLE()
+};
+
+template <>
 struct CanvasOp<CanvasOpType::DrawRect> {
     SkRect rect;
     SkPaint paint;
@@ -157,6 +172,14 @@
     ASSERT_DRAWABLE()
 };
 
+template <>
+struct CanvasOp<CanvasOpType::DrawRegion> {
+    SkRegion region;
+    SkPaint paint;
+    void draw(SkCanvas* canvas) const { canvas->drawRegion(region, paint); }
+    ASSERT_DRAWABLE()
+};
+
 template<>
 struct CanvasOp<CanvasOpType::DrawRoundRect> {
     SkRect rect;
@@ -170,6 +193,17 @@
 };
 
 template<>
+struct CanvasOp<CanvasOpType::DrawDoubleRoundRect> {
+    SkRRect outer;
+    SkRRect inner;
+    SkPaint paint;
+    void draw(SkCanvas* canvas) const {
+        canvas->drawDRRect(outer, inner, paint);
+    }
+    ASSERT_DRAWABLE()
+};
+
+template<>
 struct CanvasOp<CanvasOpType::DrawCircle> {
     SkScalar cx;
     SkScalar cy;
@@ -205,7 +239,132 @@
     ASSERT_DRAWABLE()
 };
 
+template<>
+struct CanvasOp<CanvasOpType::DrawPath> {
+    SkPath path;
+    SkPaint paint;
+
+    void draw(SkCanvas* canvas) const { canvas->drawPath(path, paint); }
+    ASSERT_DRAWABLE()
+};
+
+template<>
+struct CanvasOp<CanvasOpType::DrawLine> {
+    float startX;
+    float startY;
+    float endX;
+    float endY;
+    SkPaint paint;
+
+    void draw(SkCanvas* canvas) const {
+        canvas->drawLine(startX, startY, endX, endY, paint);
+    }
+    ASSERT_DRAWABLE()
+};
+
+template<>
+struct CanvasOp<CanvasOpType::DrawVertices> {
+    sk_sp<SkVertices> vertices;
+    SkBlendMode mode;
+    SkPaint paint;
+    void draw(SkCanvas* canvas) const {
+        canvas->drawVertices(vertices, mode, paint);
+    }
+    ASSERT_DRAWABLE()
+};
+
+template<>
+struct CanvasOp<CanvasOpType::DrawImage> {
+
+    CanvasOp<CanvasOpType::DrawImageRect>(
+        const sk_sp<Bitmap>& bitmap,
+        float left,
+        float top,
+        SkPaint paint
+    ) : left(left),
+        top(top),
+        paint(std::move(paint)),
+        bitmap(bitmap),
+        image(bitmap->makeImage()) { }
+
+    float left;
+    float top;
+    SkPaint paint;
+    sk_sp<Bitmap> bitmap;
+    sk_sp<SkImage> image;
+
+    void draw(SkCanvas* canvas) const {
+        canvas->drawImage(image, left, top, &paint);
+    }
+    ASSERT_DRAWABLE()
+};
+
+template<>
+struct CanvasOp<CanvasOpType::DrawImageRect> {
+
+    CanvasOp<CanvasOpType::DrawImageRect>(
+        const sk_sp<Bitmap>& bitmap,
+        SkRect src,
+        SkRect dst,
+        SkPaint paint
+    ) : src(src),
+        dst(dst),
+        paint(std::move(paint)),
+        bitmap(bitmap),
+        image(bitmap->makeImage()) { }
+
+    SkRect src;
+    SkRect dst;
+    SkPaint paint;
+    sk_sp<Bitmap> bitmap;
+    sk_sp<SkImage> image;
+
+    void draw(SkCanvas* canvas) const {
+        canvas->drawImageRect(image,
+                src,
+                dst,
+                &paint,
+                SkCanvas::kFast_SrcRectConstraint
+        );
+    }
+    ASSERT_DRAWABLE()
+};
+
+template<>
+struct CanvasOp<CanvasOpType::DrawImageLattice> {
+
+    CanvasOp<CanvasOpType::DrawImageLattice>(
+        const sk_sp<Bitmap>& bitmap,
+        SkRect dst,
+        SkCanvas::Lattice lattice,
+        SkPaint  paint
+    ):  dst(dst),
+        lattice(lattice),
+        bitmap(bitmap),
+        image(bitmap->makeImage()),
+        paint(std::move(paint)) {}
+
+    SkRect dst;
+    SkCanvas::Lattice lattice;
+    const sk_sp<Bitmap> bitmap;
+    const sk_sp<SkImage> image;
+
+    SkPaint paint;
+    void draw(SkCanvas* canvas) const {
+        canvas->drawImageLattice(image.get(), lattice, dst, &paint);
+    }
+    ASSERT_DRAWABLE()
+};
+
+template<>
+struct CanvasOp<CanvasOpType::DrawPicture> {
+    sk_sp<SkPicture> picture;
+    void draw(SkCanvas* canvas) const {
+        picture->playback(canvas);
+    }
+};
+
 // cleanup our macros
 #undef ASSERT_DRAWABLE
 
-}  // namespace android::uirenderer
\ No newline at end of file
+}  // namespace android::uirenderer
diff --git a/libs/hwui/canvas/OpBuffer.h b/libs/hwui/canvas/OpBuffer.h
index 398e090..98e385f 100644
--- a/libs/hwui/canvas/OpBuffer.h
+++ b/libs/hwui/canvas/OpBuffer.h
@@ -156,7 +156,7 @@
         using F_PTR = decltype(&f);
         using THUNK = void (*)(F_PTR, void*);
         static constexpr auto jump = std::array<THUNK, sizeof...(I)>{[](F_PTR fp, void* t) {
-            (*fp)(reinterpret_cast<ItemContainer<static_cast<ItemTypes>(I)>*>(t));
+            (*fp)(reinterpret_cast<const ItemContainer<static_cast<ItemTypes>(I)>*>(t));
         }...};
 
         // Do the actual iteration of each item
diff --git a/libs/hwui/jni/Typeface.cpp b/libs/hwui/jni/Typeface.cpp
index dc066da..b88ffa6 100644
--- a/libs/hwui/jni/Typeface.cpp
+++ b/libs/hwui/jni/Typeface.cpp
@@ -217,6 +217,20 @@
     return result;
 }
 
+
+static void Typeface_forceSetStaticFinalField(JNIEnv *env, jclass cls, jstring fieldName,
+        jobject typeface) {
+    ScopedUtfChars fieldNameChars(env, fieldName);
+    jfieldID fid =
+            env->GetStaticFieldID(cls, fieldNameChars.c_str(), "Landroid/graphics/Typeface;");
+    if (fid == 0) {
+        jniThrowRuntimeException(env, "Unable to find field");
+        return;
+    }
+    env->SetStaticObjectField(cls, fid, typeface);
+}
+
+
 ///////////////////////////////////////////////////////////////////////////////
 
 static const JNINativeMethod gTypefaceMethods[] = {
@@ -237,6 +251,8 @@
           (void*)Typeface_registerGenericFamily },
     { "nativeWriteTypefaces", "(Ljava/nio/ByteBuffer;[J)I", (void*)Typeface_writeTypefaces},
     { "nativeReadTypefaces", "(Ljava/nio/ByteBuffer;)[J", (void*)Typeface_readTypefaces},
+    { "nativeForceSetStaticFinalField", "(Ljava/lang/String;Landroid/graphics/Typeface;)V",
+          (void*)Typeface_forceSetStaticFinalField },
 };
 
 int register_android_graphics_Typeface(JNIEnv* env)
diff --git a/libs/hwui/tests/common/CallCountingCanvas.h b/libs/hwui/tests/common/CallCountingCanvas.h
index a965571..594afd0 100644
--- a/libs/hwui/tests/common/CallCountingCanvas.h
+++ b/libs/hwui/tests/common/CallCountingCanvas.h
@@ -80,7 +80,7 @@
 
     int drawPathCount = 0;
     void onDrawPath(const SkPath& path, const SkPaint& paint) override {
-        drawPaintCount++;
+        drawPathCount++;
     }
 
     int drawRegionCount = 0;
@@ -159,6 +159,12 @@
         drawPictureCount++;
     }
 
+    int drawVerticesCount = 0;
+    void onDrawVerticesObject (const SkVertices *vertices, SkBlendMode mode,
+                        const SkPaint &paint) override {
+        drawVerticesCount++;
+    }
+
 private:
     int END_MARKER;
 };
diff --git a/libs/hwui/tests/unit/CanvasOpTests.cpp b/libs/hwui/tests/unit/CanvasOpTests.cpp
index 2311924..b15c322 100644
--- a/libs/hwui/tests/unit/CanvasOpTests.cpp
+++ b/libs/hwui/tests/unit/CanvasOpTests.cpp
@@ -22,7 +22,9 @@
 
 #include <tests/common/CallCountingCanvas.h>
 
+#include "SkPictureRecorder.h"
 #include "SkColor.h"
+#include "SkLatticeIter.h"
 #include "pipeline/skia/AnimatedDrawables.h"
 
 using namespace android;
@@ -141,6 +143,20 @@
     EXPECT_EQ(tracker.alive(), 0);
 }
 
+TEST(CanvasOp, verifyConst) {
+    CanvasOpBuffer buffer;
+    buffer.push<Op::DrawColor>({
+        .color = SkColors::kBlack,
+        .mode = SkBlendMode::kSrcOver,
+    });
+    buffer.for_each([](auto op) {
+        static_assert(std::is_const_v<std::remove_reference_t<decltype(*op)>>,
+                "Expected container to be const");
+        static_assert(std::is_const_v<std::remove_reference_t<decltype(op->op())>>,
+                "Expected op to be const");
+    });
+}
+
 TEST(CanvasOp, simplePush) {
     CanvasOpBuffer buffer;
     EXPECT_EQ(buffer.size(), 0);
@@ -184,7 +200,7 @@
 TEST(CanvasOp, simpleDrawPaint) {
     CanvasOpBuffer buffer;
     EXPECT_EQ(buffer.size(), 0);
-    buffer.push(CanvasOp<Op::DrawColor> {
+    buffer.push<Op::DrawColor> ({
         .color = SkColor4f{1, 1, 1, 1},
         .mode = SkBlendMode::kSrcIn
     });
@@ -196,10 +212,44 @@
     EXPECT_EQ(1, canvas.sumTotalDrawCalls());
 }
 
+TEST(CanvasOp, simpleDrawPoint) {
+    CanvasOpBuffer buffer;
+    EXPECT_EQ(buffer.size(), 0);
+    buffer.push<Op::DrawPoint> ({
+        .x = 12,
+        .y = 42,
+        .paint = SkPaint{}
+    });
+
+    CallCountingCanvas canvas;
+    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
+    rasterizeCanvasBuffer(buffer, &canvas);
+    EXPECT_EQ(1, canvas.drawPoints);
+    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
+}
+
+TEST(CanvasOp, simpleDrawLine) {
+    CanvasOpBuffer buffer;
+    EXPECT_EQ(buffer.size(), 0);
+    buffer.push<Op::DrawLine> ({
+        .startX = 16,
+        .startY = 28,
+        .endX = 12,
+        .endY = 30,
+        .paint = SkPaint{}
+    });
+
+    CallCountingCanvas canvas;
+    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
+    rasterizeCanvasBuffer(buffer, &canvas);
+    EXPECT_EQ(1, canvas.drawPoints);
+    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
+}
+
 TEST(CanvasOp, simpleDrawRect) {
     CanvasOpBuffer buffer;
     EXPECT_EQ(buffer.size(), 0);
-    buffer.push(CanvasOp<Op::DrawRect> {
+    buffer.push<Op::DrawRect> ({
         .paint = SkPaint{},
         .rect = SkRect::MakeEmpty()
     });
@@ -211,10 +261,49 @@
     EXPECT_EQ(1, canvas.sumTotalDrawCalls());
 }
 
+TEST(CanvasOp, simpleDrawRegionRect) {
+    CanvasOpBuffer buffer;
+    EXPECT_EQ(buffer.size(), 0);
+    SkRegion region;
+    region.setRect(SkIRect::MakeWH(12, 50));
+    buffer.push<Op::DrawRegion> ({
+        .paint = SkPaint{},
+        .region = region
+    });
+
+    CallCountingCanvas canvas;
+    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
+    rasterizeCanvasBuffer(buffer, &canvas);
+    // If the region is a rectangle, drawRegion calls into drawRect as a fast path
+    EXPECT_EQ(1, canvas.drawRectCount);
+    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
+}
+
+TEST(CanvasOp, simpleDrawRegionPath) {
+    CanvasOpBuffer buffer;
+    EXPECT_EQ(buffer.size(), 0);
+    SkPath path;
+    path.addCircle(50, 50, 50);
+    SkRegion clip;
+    clip.setRect(SkIRect::MakeWH(100, 100));
+    SkRegion region;
+    region.setPath(path, clip);
+    buffer.push<Op::DrawRegion> ({
+        .paint = SkPaint{},
+        .region = region
+    });
+
+    CallCountingCanvas canvas;
+    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
+    rasterizeCanvasBuffer(buffer, &canvas);
+    EXPECT_EQ(1, canvas.drawRegionCount);
+    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
+}
+
 TEST(CanvasOp, simpleDrawRoundRect) {
     CanvasOpBuffer buffer;
     EXPECT_EQ(buffer.size(), 0);
-    buffer.push(CanvasOp<Op::DrawRoundRect> {
+    buffer.push<Op::DrawRoundRect> ({
         .paint = SkPaint{},
         .rect = SkRect::MakeEmpty(),
         .rx = 10,
@@ -228,10 +317,48 @@
     EXPECT_EQ(1, canvas.sumTotalDrawCalls());
 }
 
+TEST(CanvasOp, simpleDrawDoubleRoundRect) {
+    CanvasOpBuffer buffer;
+    EXPECT_EQ(buffer.size(), 0);
+    SkRect outer = SkRect::MakeLTRB(0, 0, 100, 100);
+    SkRect inner = SkRect::MakeLTRB(20, 20, 80, 80);
+
+    const int numPts = 4;
+    SkRRect outerRRect;
+
+    auto outerPts = std::make_unique<SkVector[]>(numPts);
+    outerPts[0].set(32, 16);
+    outerPts[1].set(48, 48);
+    outerPts[2].set(16, 32);
+    outerPts[3].set(20, 20);
+    outerRRect.setRectRadii(outer, outerPts.get());
+    outerRRect.setRect(outer);
+
+    SkRRect innerRRect;
+    auto innerPts = std::make_unique<SkVector[]>(numPts);
+    innerPts[0].set(16, 8);
+    innerPts[1].set(24, 24);
+    innerPts[2].set(8, 16);
+    innerPts[3].set(10, 10);
+    innerRRect.setRectRadii(inner, innerPts.get());
+
+    buffer.push<Op::DrawDoubleRoundRect> ({
+        .outer = outerRRect,
+        .inner = innerRRect,
+        .paint = SkPaint{}
+    });
+
+    CallCountingCanvas canvas;
+    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
+    rasterizeCanvasBuffer(buffer, &canvas);
+    EXPECT_EQ(1, canvas.drawDRRectCount);
+    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
+}
+
 TEST(CanvasOp, simpleDrawCircle) {
     CanvasOpBuffer buffer;
     EXPECT_EQ(buffer.size(), 0);
-    buffer.push(CanvasOp<Op::DrawCircle> {
+    buffer.push<Op::DrawCircle>({
         .cx = 5,
         .cy = 7,
         .radius = 10,
@@ -248,7 +375,7 @@
 TEST(CanvasOp, simpleDrawOval) {
     CanvasOpBuffer buffer;
     EXPECT_EQ(buffer.size(), 0);
-    buffer.push(CanvasOp<Op::DrawOval> {
+    buffer.push<Op::DrawOval> ({
         .oval = SkRect::MakeEmpty(),
         .paint = SkPaint{}
     });
@@ -263,7 +390,7 @@
 TEST(CanvasOp, simpleDrawArc) {
     CanvasOpBuffer buffer;
     EXPECT_EQ(buffer.size(), 0);
-    buffer.push(CanvasOp<Op::DrawArc> {
+    buffer.push<Op::DrawArc>({
         .oval = SkRect::MakeWH(100, 100),
         .startAngle = 120,
         .sweepAngle = 70,
@@ -278,6 +405,23 @@
     EXPECT_EQ(1, canvas.sumTotalDrawCalls());
 }
 
+TEST(CanvasOp, simpleDrawPath) {
+    CanvasOpBuffer buffer;
+    EXPECT_EQ(buffer.size(), 0);
+    SkPath path;
+    path.addCircle(50, 50, 30);
+    buffer.push<Op::DrawPath> ({
+        .path = path,
+        .paint = SkPaint{}
+    });
+
+    CallCountingCanvas canvas;
+    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
+    rasterizeCanvasBuffer(buffer, &canvas);
+    EXPECT_EQ(1, canvas.drawPathCount);
+    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
+}
+
 TEST(CanvasOp, simpleDrawRoundRectProperty) {
     CanvasOpBuffer buffer;
     EXPECT_EQ(buffer.size(), 0);
@@ -291,7 +435,7 @@
     auto propertyPaint =
             sp<uirenderer::CanvasPropertyPaint>(new uirenderer::CanvasPropertyPaint(SkPaint{}));
 
-    buffer.push(CanvasOp<Op::DrawRoundRectProperty> {
+    buffer.push<Op::DrawRoundRectProperty> ({
         .left = left,
         .top = top,
         .right = right,
@@ -318,7 +462,7 @@
     auto propertyPaint =
             sp<uirenderer::CanvasPropertyPaint>(new uirenderer::CanvasPropertyPaint(SkPaint{}));
 
-    buffer.push(CanvasOp<Op::DrawCircleProperty> {
+    buffer.push<Op::DrawCircleProperty> ({
         .x = x,
         .y = y,
         .radius = radius,
@@ -332,6 +476,131 @@
     EXPECT_EQ(1, canvas.sumTotalDrawCalls());
 }
 
+TEST(CanvasOp, simpleDrawVertices) {
+    CanvasOpBuffer buffer;
+    EXPECT_EQ(buffer.size(), 0);
+
+    SkPoint pts[3] = {{64, 32}, {0, 224}, {128, 224}};
+    SkColor colors[3] = {SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN};
+    sk_sp<SkVertices> vertices = SkVertices::MakeCopy(SkVertices::kTriangles_VertexMode, 3, pts,
+            nullptr, colors);
+    buffer.push<Op::DrawVertices> ({
+        .vertices = vertices,
+        .mode = SkBlendMode::kSrcOver,
+        .paint = SkPaint{}
+    });
+
+    CallCountingCanvas canvas;
+    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
+    rasterizeCanvasBuffer(buffer, &canvas);
+    EXPECT_EQ(1, canvas.drawVerticesCount);
+    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
+}
+
+TEST(CanvasOp, simpleDrawImage) {
+    CanvasOpBuffer buffer;
+    EXPECT_EQ(buffer.size(), 0);
+
+    SkImageInfo info =SkImageInfo::Make(5, 1,
+        kGray_8_SkColorType, kOpaque_SkAlphaType);
+    sk_sp<Bitmap> bitmap = Bitmap::allocateHeapBitmap(info);
+    buffer.push<Op::DrawImage> ({
+            bitmap,
+            7,
+            19,
+            SkPaint{}
+        }
+    );
+
+    CallCountingCanvas canvas;
+    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
+    rasterizeCanvasBuffer(buffer, &canvas);
+    EXPECT_EQ(1, canvas.drawImageCount);
+    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
+}
+
+TEST(CanvasOp, simpleDrawImageRect) {
+    CanvasOpBuffer buffer;
+    EXPECT_EQ(buffer.size(), 0);
+
+    SkImageInfo info = SkImageInfo::Make(5, 1,
+        kGray_8_SkColorType, kOpaque_SkAlphaType);
+
+    sk_sp<Bitmap> bitmap = Bitmap::allocateHeapBitmap(info);
+    buffer.push<Op::DrawImageRect> ({
+          bitmap, SkRect::MakeWH(100, 100),
+          SkRect::MakeLTRB(120, 110, 220, 210),
+          SkPaint{}
+        }
+    );
+
+    CallCountingCanvas canvas;
+    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
+    rasterizeCanvasBuffer(buffer, &canvas);
+    EXPECT_EQ(1, canvas.drawImageRectCount);
+    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
+}
+
+TEST(CanvasOp, simpleDrawImageLattice) {
+    CanvasOpBuffer buffer;
+    EXPECT_EQ(buffer.size(), 0);
+
+    SkBitmap skBitmap;
+    skBitmap.allocPixels(SkImageInfo::MakeN32Premul(60, 60));
+
+    const int xDivs[] = { 20, 50 };
+    const int yDivs[] = { 10, 40 };
+    SkCanvas::Lattice::RectType fillTypes[3][3];
+    memset(fillTypes, 0, sizeof(fillTypes));
+    fillTypes[1][1] = SkCanvas::Lattice::kTransparent;
+    SkColor colors[9];
+    SkCanvas::Lattice lattice = { xDivs, yDivs, fillTypes[0], 2,
+         2, nullptr, colors };
+    sk_sp<Bitmap> bitmap = Bitmap::allocateHeapBitmap(&skBitmap);
+    buffer.push<Op::DrawImageLattice>(
+        {
+            bitmap,
+            SkRect::MakeWH(5, 1),
+            lattice,
+            SkPaint{}
+        }
+    );
+
+    CallCountingCanvas canvas;
+    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
+    rasterizeCanvasBuffer(buffer, &canvas);
+    EXPECT_EQ(1, canvas.drawImageLatticeCount);
+    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
+}
+
+TEST(CanvasOp, simpleDrawPicture) {
+    CanvasOpBuffer buffer;
+    EXPECT_EQ(buffer.size(), 0);
+
+    SkPictureRecorder recorder;
+    SkCanvas* pictureCanvas = recorder.beginRecording({64, 64, 192, 192});
+    SkPaint paint;
+    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
+    paint.setColor(SK_ColorWHITE);
+    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    buffer.push<Op::DrawPicture> ({
+        .picture = picture
+    });
+
+    CallCountingCanvas canvas;
+    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
+    rasterizeCanvasBuffer(buffer, &canvas);
+    // Note because we are explicitly issuing 2 drawRect calls
+    // in the picture recorder above, when it is played back into
+    // CallCountingCanvas we will see 2 calls to drawRect instead of 1
+    // call to drawPicture.
+    // This is because SkiaCanvas::drawPicture uses picture.playback(canvas)
+    // instead of canvas->drawPicture.
+    EXPECT_EQ(2, canvas.drawRectCount);
+    EXPECT_EQ(2, canvas.sumTotalDrawCalls());
+}
+
 TEST(CanvasOp, immediateRendering) {
     auto canvas = std::make_shared<CallCountingCanvas>();
 
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 4fbcfe1..047b809 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -202,6 +202,7 @@
      *
      * @hide
      */
+    @SystemApi
     @TestApi
     public static final String FUSED_PROVIDER = "fused";
 
diff --git a/media/java/android/media/ApplicationMediaCapabilities.java b/media/java/android/media/ApplicationMediaCapabilities.java
index 4b28553..792e85f 100644
--- a/media/java/android/media/ApplicationMediaCapabilities.java
+++ b/media/java/android/media/ApplicationMediaCapabilities.java
@@ -23,11 +23,16 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 /**
  * ApplicationMediaCapabilities is an immutable class that encapsulates an application's
- * capabilities of handling advanced media formats.
+ * capabilities for handling newer video codec format and media features.
  *
- * The ApplicationMediaCapabilities class is used by the platform to to represent an application's
+ * The ApplicationMediaCapabilities class is used by the platform to represent an application's
  * media capabilities as defined in their manifest(TODO: Add link) in order to determine
  * whether modern media files need to be transcoded for that application (TODO: Add link).
  *
@@ -37,43 +42,55 @@
  * provided by applications at runtime like this override the default manifest capabilities for that
  * media access.
  *
- * TODO(huang): Correct openTypedAssetFileDescriptor with the new API after it is added.
- * TODO(hkuang): Add a link to seamless transcoding detail when it is published
- * TODO(hkuang): Add code sample on how to build a capability object with MediaCodecList
+ * <h3> Video Codec Support</h3>
+ * Newer video codes include HEVC, VP9 and AV1. Application only needs to indicate their support
+ * for newer format with this class as they are assumed to support older format like h.264.
  *
- * @hide
+ * <h4>Capability of handling HDR(high dynamic range) video</h4>
+ * There are four types of HDR video(Dolby-Vision, HDR10, HDR10+, HLG) supported by the platform,
+ * application will only need to specify individual types they supported.
+ *
+ * <h4>Capability of handling Slow Motion video</h4>
+ * There is no standard format for slow motion yet. If an application indicates support for slow
+ * motion, it is application's responsibility to parse the slow motion videos using their own parser
+ * or using support library.
  */
+// TODO(huang): Correct openTypedAssetFileDescriptor with the new API after it is added.
+// TODO(hkuang): Add a link to seamless transcoding detail when it is published
+// TODO(hkuang): Add code sample on how to build a capability object with MediaCodecList
+// TODO(hkuang): Add the support library page on parsing slow motion video.
 public final class ApplicationMediaCapabilities implements Parcelable {
     private static final String TAG = "ApplicationMediaCapabilities";
 
-    /** Whether handling of HEVC video is supported. */
-    private final boolean mIsHevcSupported;
+    /** List of supported video codec mime types. */
+    // TODO: init it with avc and mpeg4 as application is assuming to support them.
+    private Set<String> mSupportedVideoMimeTypes = new HashSet<>();
 
-    /** Whether handling of slow-motion video is supported. */
-    private final boolean mIsSlowMotionSupported;
+    /** List of supported hdr types. */
+    private Set<String> mSupportedHdrTypes = new HashSet<>();
 
-    /** Whether handling of high dynamic range video is supported. */
-    private final boolean mIsHdrSupported;
+    private boolean mIsSlowMotionSupported = false;
 
     private ApplicationMediaCapabilities(Builder b) {
-        mIsHevcSupported = b.mIsHevcSupported;
-        mIsHdrSupported = b.mIsHdrSupported;
+        mSupportedVideoMimeTypes.addAll(b.getSupportedVideoMimeTypes());
+        mSupportedHdrTypes.addAll(b.getSupportedHdrTypes());
         mIsSlowMotionSupported = b.mIsSlowMotionSupported;
     }
 
-    /** Whether handling of HEVC video is supported. */
-    public boolean isHevcSupported() {
-        return mIsHevcSupported;
+    /**
+     * Query if an video codec is supported by the application.
+     */
+    public boolean isVideoMimeTypeSupported(
+            @NonNull String videoMime) {
+        return mSupportedVideoMimeTypes.contains(videoMime);
     }
 
-    /** Whether handling of slow-motion video is supported. */
-    public boolean isSlowMotionSupported() {
-        return mIsSlowMotionSupported;
-    }
-
-    /** Whether handling of high dynamic range video is supported. */
-    public boolean isHdrSupported() {
-        return mIsHdrSupported;
+    /**
+     * Query if a hdr type is supported by the application.
+     */
+    public boolean isHdrTypeSupported(
+            @NonNull @MediaFeature.MediaHdrType String hdrType) {
+        return mSupportedHdrTypes.contains(hdrType);
     }
 
     @Override
@@ -82,12 +99,86 @@
     }
 
     @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeBoolean(mIsHevcSupported);
-        dest.writeBoolean(mIsHdrSupported);
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        // Write out the supported video mime types.
+        dest.writeInt(mSupportedVideoMimeTypes.size());
+        for (String cap : mSupportedVideoMimeTypes) {
+            dest.writeString(cap);
+        }
+        // Write out the supported hdr types.
+        dest.writeInt(mSupportedHdrTypes.size());
+        for (String cap : mSupportedHdrTypes) {
+            dest.writeString(cap);
+        }
+        // Write out the supported slow motion.
         dest.writeBoolean(mIsSlowMotionSupported);
     }
 
+    @Override
+    public String toString() {
+        String caps = new String(
+                "Supported Video MimeTypes: " + mSupportedVideoMimeTypes.toString());
+        caps += "Supported HDR types: " + mSupportedHdrTypes.toString();
+        caps += "Supported slow motion: " + mIsSlowMotionSupported;
+        return caps;
+    }
+
+    @NonNull
+    public static final Creator<ApplicationMediaCapabilities> CREATOR =
+            new Creator<ApplicationMediaCapabilities>() {
+                public ApplicationMediaCapabilities createFromParcel(Parcel in) {
+                    ApplicationMediaCapabilities.Builder builder =
+                            new ApplicationMediaCapabilities.Builder();
+
+                    // Parse supported video codec mime types.
+                    int count = in.readInt();
+                    for (int readCount = 0; readCount < count; ++readCount) {
+                        builder.addSupportedVideoMimeType(in.readString());
+                    }
+                    // Parse supported hdr types.
+                    count = in.readInt();
+                    for (int readCount = 0; readCount < count; ++readCount) {
+                        builder.addSupportedHdrType(in.readString());
+                    }
+
+                    boolean supported = in.readBoolean();
+                    builder.setSlowMotionSupported(supported);
+
+                    return builder.build();
+                }
+
+                public ApplicationMediaCapabilities[] newArray(int size) {
+                    return new ApplicationMediaCapabilities[size];
+                }
+            };
+
+    /*
+     * Returns a list that contains all the video codec mime types supported by the application.
+     * The list will be empty if no codecs are supported by the application.
+     * @return List of supported video codec mime types.
+     */
+    @NonNull
+    public List<String> getSupportedVideoMimeTypes() {
+        return new ArrayList<>(mSupportedVideoMimeTypes);
+    }
+
+    /*
+     * Returns a list that contains all hdr types supported by the application.
+     * The list will be empty if no hdr types are supported by the application.
+     * @return List of supported hdr types.
+     */
+    @NonNull
+    public List<String> getSupportedHdrTypes() {
+        return new ArrayList<>(mSupportedHdrTypes);
+    }
+
+    /*
+     * Whether handling of slow-motion video is supported
+     */
+    public boolean isSlowMotionSupported() {
+        return mIsSlowMotionSupported;
+    }
+
     /**
      * Builder class for {@link ApplicationMediaCapabilities} objects.
      * Use this class to configure and create an ApplicationMediaCapabilities instance. Builder
@@ -96,8 +187,12 @@
      * //TODO(hkuang): Add xml parsing support to the builder.
      */
     public final static class Builder {
-        private boolean mIsHevcSupported = false;
-        private boolean mIsHdrSupported = false;
+        /** List of supported video codec mime types. */
+        private Set<String> mSupportedVideoMimeTypes = new HashSet<>();
+
+        /** List of supported hdr types. */
+        private Set<String> mSupportedHdrTypes = new HashSet<>();
+
         private boolean mIsSlowMotionSupported = false;
 
         /**
@@ -112,37 +207,62 @@
          * @return a new {@link ApplicationMediaCapabilities} instance successfully initialized
          * with all the parameters set on this <code>Builder</code>.
          * @throws UnsupportedOperationException if the parameters set on the
-         *         <code>Builder</code> were incompatible, or if they are not supported by the
-         *         device.
+         *                                       <code>Builder</code> were incompatible, or if they
+         *                                       are not supported by the
+         *                                       device.
          */
         @NonNull
         public ApplicationMediaCapabilities build() {
-            if (mIsHdrSupported && !mIsHevcSupported) {
-                throw new UnsupportedOperationException("Must also support HEVC if support HDR.");
+            // If hdr is supported, application must also support hevc.
+            if (!mSupportedHdrTypes.isEmpty() && !mSupportedVideoMimeTypes.contains(
+                    MediaFormat.MIMETYPE_VIDEO_HEVC)) {
+                throw new UnsupportedOperationException("Only support HEVC mime type");
             }
             return new ApplicationMediaCapabilities(this);
         }
 
         /**
-         * Sets whether supports HEVC encoded video.
+         * Adds a supported video codec mime type.
+         *
+         * @param codecMime Supported codec mime types. Must be one of the mime type defined
+         *                  in {@link MediaFormat}.
+         * @throws UnsupportedOperationException if the codec mime type is not supported.
+         * @throws IllegalArgumentException      if mime type is not valid.
          */
         @NonNull
-        public Builder setHevcSupported(boolean hevcSupported) {
-            mIsHevcSupported = hevcSupported;
+        public Builder addSupportedVideoMimeType(
+                @NonNull String codecMime) {
+            mSupportedVideoMimeTypes.add(codecMime);
             return this;
         }
 
-        /**
-         * Sets whether supports high dynamic range video.
-         */
-        @NonNull
-        public Builder setHdrSupported(boolean hdrSupported) {
-            mIsHdrSupported = hdrSupported;
-            return this;
+        private List<String> getSupportedVideoMimeTypes() {
+            return new ArrayList<>(mSupportedVideoMimeTypes);
         }
 
         /**
-         * Sets whether supports slow-motion video.
+         * Adds a supported hdr type.
+         *
+         * @param hdrType Supported hdr types. Must be one of the String defined in
+         *                {@link MediaFeature.HdrType}.
+         * @throws IllegalArgumentException if hdrType is not valid.
+         */
+        @NonNull
+        public Builder addSupportedHdrType(
+                @NonNull @MediaFeature.MediaHdrType String hdrType) {
+            mSupportedHdrTypes.add(hdrType);
+            return this;
+        }
+
+        private List<String> getSupportedHdrTypes() {
+            return new ArrayList<>(mSupportedHdrTypes);
+        }
+
+        /**
+         * Sets whether slow-motion video is supported.
+         * If an application indicates support for slow-motion, it is application's responsibility
+         * to parse the slow-motion videos using their own parser or using support library.
+         * @see android.media.MediaFormat#KEY_SLOW_MOTION_MARKERS
          */
         @NonNull
         public Builder setSlowMotionSupported(boolean slowMotionSupported) {
diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java
index 477519c..b67851a 100644
--- a/media/java/android/media/AudioDeviceInfo.java
+++ b/media/java/android/media/AudioDeviceInfo.java
@@ -22,6 +22,7 @@
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
 import java.util.Objects;
 import java.util.TreeSet;
 
@@ -468,9 +469,32 @@
      * @see AudioFormat
      *
      * Note: an empty array indicates that the device supports arbitrary encodings.
+     * For forward compatibility, applications should ignore entries it does not recognize.
      */
     public @NonNull int[] getEncodings() {
-        return AudioFormat.filterPublicFormats(mPort.formats());
+        final int[] encodings = AudioFormat.filterPublicFormats(mPort.formats());
+        boolean hasFloat = false;
+        boolean hasExtendedIntegerPrecision = false;
+
+        for (int encoding : encodings) {
+            if (AudioFormat.isEncodingLinearPcm(encoding)) {
+                if (encoding == AudioFormat.ENCODING_PCM_FLOAT) {
+                    hasFloat = true;
+                } else if (AudioFormat.getBytesPerSample(encoding) > 2) {
+                    hasExtendedIntegerPrecision = true;
+                }
+            }
+        }
+        if (hasExtendedIntegerPrecision && !hasFloat) {
+            // R and earlier compatibility - add ENCODING_PCM_FLOAT to the end
+            // (replacing the zero pad). This ensures pre-S apps that look
+            // for ENCODING_PCM_FLOAT continue to see that encoding if the device supports
+            // extended precision integers.
+            int[] encodingsPlusFloat = Arrays.copyOf(encodings, encodings.length + 1);
+            encodingsPlusFloat[encodings.length] = AudioFormat.ENCODING_PCM_FLOAT;
+            return encodingsPlusFloat;
+        }
+        return encodings;
     }
 
     /**
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java
index a2861c2..255c15c 100644
--- a/media/java/android/media/AudioFormat.java
+++ b/media/java/android/media/AudioFormat.java
@@ -110,6 +110,24 @@
  * <code>AudioTrack</code> as of API {@link android.os.Build.VERSION_CODES#LOLLIPOP}
  * support <code>ENCODING_PCM_FLOAT</code>.
  * </li>
+ * <li> {@link #ENCODING_PCM_24BIT_PACKED}: Introduced in
+ * API {@link android.os.Build.VERSION_CODES#S},
+ * this encoding specifies the audio sample is an
+ * extended precision 24 bit signed integer
+ * stored as a 3 Java bytes in a {@code ByteBuffer} or byte array in native endian
+ * (see {@link java.nio.ByteOrder#nativeOrder()}).
+ * Each sample has full range from [-8388608, 8388607],
+ * and can be interpreted as fixed point Q.23 data.
+ * </li>
+ * <li> {@link #ENCODING_PCM_32BIT}: Introduced in
+ * API {@link android.os.Build.VERSION_CODES#S},
+ * this encoding specifies the audio sample is an
+ * extended precision 32 bit signed integer
+ * stored as a 4 Java bytes in a {@code ByteBuffer} or byte array in native endian
+ * (see {@link java.nio.ByteOrder#nativeOrder()}).
+ * Each sample has full range from [-2147483648, 2147483647],
+ * and can be interpreted as fixed point Q.31 data.
+ * </li>
  * </ul>
  * <p>For compressed audio, the encoding specifies the method of compression,
  * for example {@link #ENCODING_AC3} and {@link #ENCODING_DTS}. The compressed
@@ -285,6 +303,19 @@
     /** Audio data format: OPUS compressed. */
     public static final int ENCODING_OPUS = 20;
 
+    /** @hide
+     * We do not permit legacy short array reads or writes for encodings
+     * introduced after this threshold.
+     */
+    public static final int ENCODING_LEGACY_SHORT_ARRAY_THRESHOLD = ENCODING_OPUS;
+
+    /** Audio data format: PCM 24 bit per sample packed as 3 bytes.
+     * Not guaranteed to be supported by devices, may be emulated if not supported. */
+    public static final int ENCODING_PCM_24BIT_PACKED = 21;
+    /** Audio data format: PCM 32 bit per sample.
+     * Not guaranteed to be supported by devices, may be emulated if not supported. */
+    public static final int ENCODING_PCM_32BIT = 22;
+
     /** @hide */
     public static String toLogFriendlyEncoding(int enc) {
         switch(enc) {
@@ -328,6 +359,10 @@
                 return "ENCODING_DOLBY_MAT";
             case ENCODING_OPUS:
                 return "ENCODING_OPUS";
+            case ENCODING_PCM_24BIT_PACKED:
+                return "ENCODING_PCM_24BIT_PACKED";
+            case ENCODING_PCM_32BIT:
+                return "ENCODING_PCM_32BIT";
             default :
                 return "invalid encoding " + enc;
         }
@@ -517,17 +552,20 @@
     public static int getBytesPerSample(int audioFormat)
     {
         switch (audioFormat) {
-        case ENCODING_PCM_8BIT:
-            return 1;
-        case ENCODING_PCM_16BIT:
-        case ENCODING_IEC61937:
-        case ENCODING_DEFAULT:
-            return 2;
-        case ENCODING_PCM_FLOAT:
-            return 4;
-        case ENCODING_INVALID:
-        default:
-            throw new IllegalArgumentException("Bad audio format " + audioFormat);
+            case ENCODING_PCM_8BIT:
+                return 1;
+            case ENCODING_PCM_16BIT:
+            case ENCODING_IEC61937:
+            case ENCODING_DEFAULT:
+                return 2;
+            case ENCODING_PCM_24BIT_PACKED:
+                return 3;
+            case ENCODING_PCM_FLOAT:
+            case ENCODING_PCM_32BIT:
+                return 4;
+            case ENCODING_INVALID:
+            default:
+                throw new IllegalArgumentException("Bad audio format " + audioFormat);
         }
     }
 
@@ -554,6 +592,8 @@
             case ENCODING_E_AC3_JOC:
             case ENCODING_DOLBY_MAT:
             case ENCODING_OPUS:
+            case ENCODING_PCM_24BIT_PACKED:
+            case ENCODING_PCM_32BIT:
                 return true;
             default:
                 return false;
@@ -583,6 +623,8 @@
             case ENCODING_E_AC3_JOC:
             case ENCODING_DOLBY_MAT:
             case ENCODING_OPUS:
+            case ENCODING_PCM_24BIT_PACKED:
+            case ENCODING_PCM_32BIT:
                 return true;
             default:
                 return false;
@@ -597,6 +639,8 @@
             case ENCODING_PCM_16BIT:
             case ENCODING_PCM_8BIT:
             case ENCODING_PCM_FLOAT:
+            case ENCODING_PCM_24BIT_PACKED:
+            case ENCODING_PCM_32BIT:
             case ENCODING_DEFAULT:
                 return true;
             case ENCODING_AC3:
@@ -630,6 +674,8 @@
             case ENCODING_PCM_8BIT:
             case ENCODING_PCM_FLOAT:
             case ENCODING_IEC61937: // same size as stereo PCM
+            case ENCODING_PCM_24BIT_PACKED:
+            case ENCODING_PCM_32BIT:
             case ENCODING_DEFAULT:
                 return true;
             case ENCODING_AC3:
@@ -927,6 +973,8 @@
                 case ENCODING_E_AC3_JOC:
                 case ENCODING_DOLBY_MAT:
                 case ENCODING_OPUS:
+                case ENCODING_PCM_24BIT_PACKED:
+                case ENCODING_PCM_32BIT:
                     mEncoding = encoding;
                     break;
                 case ENCODING_INVALID:
@@ -1147,7 +1195,9 @@
         ENCODING_AC4,
         ENCODING_E_AC3_JOC,
         ENCODING_DOLBY_MAT,
-        ENCODING_OPUS }
+        ENCODING_OPUS,
+        ENCODING_PCM_24BIT_PACKED,
+        ENCODING_PCM_32BIT }
     )
     @Retention(RetentionPolicy.SOURCE)
     public @interface Encoding {}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 2947736..4578883 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -4009,8 +4009,8 @@
      * @deprecated use {@link #abandonAudioFocusRequest(AudioFocusRequest)}
      */
     @SystemApi
-    @SuppressLint("Doclava125") // no permission enforcement, but only "undoes" what would have been
-                                // done by a matching requestAudioFocus
+    @SuppressLint("RequiresPermission") // no permission enforcement, but only "undoes" what would
+    // have been done by a matching requestAudioFocus
     public int abandonAudioFocus(OnAudioFocusChangeListener l, AudioAttributes aa) {
         int status = AUDIOFOCUS_REQUEST_FAILED;
         unregisterAudioFocusRequest(l);
@@ -5602,7 +5602,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125") // FIXME is this still used?
+    @SuppressLint("RequiresPermission") // FIXME is this still used?
     public boolean isHdmiSystemAudioSupported() {
         try {
             return getService().isHdmiSystemAudioSupported();
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index 07c8ee5..65e6fea 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -850,17 +850,21 @@
         //--------------
         // audio format
         switch (audioFormat) {
-        case AudioFormat.ENCODING_DEFAULT:
-            mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;
-            break;
-        case AudioFormat.ENCODING_PCM_FLOAT:
-        case AudioFormat.ENCODING_PCM_16BIT:
-        case AudioFormat.ENCODING_PCM_8BIT:
-            mAudioFormat = audioFormat;
-            break;
-        default:
-            throw new IllegalArgumentException("Unsupported sample encoding " + audioFormat
-                    + ". Should be ENCODING_PCM_8BIT, ENCODING_PCM_16BIT, or ENCODING_PCM_FLOAT.");
+            case AudioFormat.ENCODING_DEFAULT:
+                mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;
+                break;
+            case AudioFormat.ENCODING_PCM_24BIT_PACKED:
+            case AudioFormat.ENCODING_PCM_32BIT:
+            case AudioFormat.ENCODING_PCM_FLOAT:
+            case AudioFormat.ENCODING_PCM_16BIT:
+            case AudioFormat.ENCODING_PCM_8BIT:
+                mAudioFormat = audioFormat;
+                break;
+            default:
+                throw new IllegalArgumentException("Unsupported sample encoding " + audioFormat
+                        + ". Should be ENCODING_PCM_8BIT, ENCODING_PCM_16BIT,"
+                        + " ENCODING_PCM_24BIT_PACKED, ENCODING_PCM_32BIT,"
+                        + " or ENCODING_PCM_FLOAT.");
         }
     }
 
@@ -1267,6 +1271,7 @@
      */
     public int read(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes,
             @ReadMode int readMode) {
+        // Note: we allow reads of extended integers into a byte array.
         if (mState != STATE_INITIALIZED  || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT) {
             return ERROR_INVALID_OPERATION;
         }
@@ -1339,7 +1344,10 @@
      */
     public int read(@NonNull short[] audioData, int offsetInShorts, int sizeInShorts,
             @ReadMode int readMode) {
-        if (mState != STATE_INITIALIZED || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT) {
+        if (mState != STATE_INITIALIZED
+                || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT
+                // use ByteBuffer instead for later encodings
+                || mAudioFormat > AudioFormat.ENCODING_LEGACY_SHORT_ARRAY_THRESHOLD) {
             return ERROR_INVALID_OPERATION;
         }
 
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index b2c2c4b..e8c6206 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -2892,7 +2892,7 @@
      */
     public int write(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes,
             @WriteMode int writeMode) {
-
+        // Note: we allow writes of extended integers and compressed formats from a byte array.
         if (mState == STATE_UNINITIALIZED || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT) {
             return ERROR_INVALID_OPERATION;
         }
@@ -3006,7 +3006,10 @@
     public int write(@NonNull short[] audioData, int offsetInShorts, int sizeInShorts,
             @WriteMode int writeMode) {
 
-        if (mState == STATE_UNINITIALIZED || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT) {
+        if (mState == STATE_UNINITIALIZED
+                || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT
+                // use ByteBuffer or byte[] instead for later encodings
+                || mAudioFormat > AudioFormat.ENCODING_LEGACY_SHORT_ARRAY_THRESHOLD) {
             return ERROR_INVALID_OPERATION;
         }
 
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
index 44890be..de885f49 100644
--- a/media/java/android/media/ExifInterface.java
+++ b/media/java/android/media/ExifInterface.java
@@ -32,7 +32,6 @@
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.os.FileUtils;
-import android.os.SystemProperties;
 import android.system.ErrnoException;
 import android.system.Os;
 import android.system.OsConstants;
@@ -79,7 +78,8 @@
 /**
  * This is a class for reading and writing Exif tags in various image file formats.
  * <p>
- * Supported for reading: JPEG, PNG, WebP, HEIF, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW, RAF.
+ * Supported for reading: JPEG, PNG, WebP, HEIF, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW, RAF,
+ * AVIF.
  * <p>
  * Supported for writing: JPEG, PNG, WebP.
  * <p>
@@ -543,6 +543,8 @@
     private static final byte[] HEIF_TYPE_FTYP = new byte[] {'f', 't', 'y', 'p'};
     private static final byte[] HEIF_BRAND_MIF1 = new byte[] {'m', 'i', 'f', '1'};
     private static final byte[] HEIF_BRAND_HEIC = new byte[] {'h', 'e', 'i', 'c'};
+    private static final byte[] HEIF_BRAND_AVIF = new byte[] {'a', 'v', 'i', 'f'};
+    private static final byte[] HEIF_BRAND_AVIS = new byte[] {'a', 'v', 'i', 's'};
 
     // See http://fileformats.archiveteam.org/wiki/Olympus_ORF
     private static final short ORF_SIGNATURE_1 = 0x4f52;
@@ -1525,8 +1527,7 @@
         if (fileDescriptor == null) {
             throw new NullPointerException("fileDescriptor cannot be null");
         }
-        boolean optimize = SystemProperties.getBoolean("fuse.sys.transcode_exif_optimize", false);
-        FileDescriptor modernFd = optimize ? FileUtils.convertToModernFd(fileDescriptor) : null;
+        FileDescriptor modernFd = FileUtils.convertToModernFd(fileDescriptor);
         if (modernFd != null) {
             fileDescriptor = modernFd;
         }
@@ -2546,9 +2547,7 @@
         mIsInputStream = false;
         try {
             in = new FileInputStream(filename);
-            boolean optimize = SystemProperties.getBoolean("fuse.sys.transcode_exif_optimize",
-                    false);
-            FileDescriptor modernFd = optimize ? FileUtils.convertToModernFd(in.getFD()) : null;
+            FileDescriptor modernFd = FileUtils.convertToModernFd(in.getFD());
             if (modernFd != null) {
                 legacyInputStream = in;
                 in = new FileInputStream(modernFd);
@@ -2662,6 +2661,7 @@
             byte[] brand = new byte[4];
             boolean isMif1 = false;
             boolean isHeic = false;
+            boolean isAvif = false;
             for (long i = 0; i < chunkDataSize / 4;  ++i) {
                 if (signatureInputStream.read(brand) != brand.length) {
                     return false;
@@ -2674,8 +2674,11 @@
                     isMif1 = true;
                 } else if (Arrays.equals(brand, HEIF_BRAND_HEIC)) {
                     isHeic = true;
+                } else if (Arrays.equals(brand, HEIF_BRAND_AVIF)
+                        || Arrays.equals(brand, HEIF_BRAND_AVIS)) {
+                    isAvif = true;
                 }
-                if (isMif1 && isHeic) {
+                if (isMif1 && (isHeic || isAvif)) {
                     return true;
                 }
             }
diff --git a/media/java/android/media/Image.java b/media/java/android/media/Image.java
index 610bffe..0ef4b94 100644
--- a/media/java/android/media/Image.java
+++ b/media/java/android/media/Image.java
@@ -200,6 +200,7 @@
      * @return The window transformation that needs to be applied for this frame.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract int getTransform();
 
     /**
@@ -207,6 +208,7 @@
      * @return The scaling mode that needs to be applied for this frame.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract int getScalingMode();
 
     /**
diff --git a/media/java/android/media/MediaCas.java b/media/java/android/media/MediaCas.java
index 5c1f893..9957975 100644
--- a/media/java/android/media/MediaCas.java
+++ b/media/java/android/media/MediaCas.java
@@ -20,7 +20,6 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.TestApi;
-import android.app.ActivityManager;
 import android.content.Context;
 import android.hardware.cas.V1_0.HidlCasPluginDescriptor;
 import android.hardware.cas.V1_0.ICas;
@@ -679,7 +678,7 @@
     private void createPlugin(int casSystemId) throws UnsupportedCasException {
         try {
             mCasSystemId = casSystemId;
-            mUserId = ActivityManager.getCurrentUser();
+            mUserId = Process.myUid();
             IMediaCasService service = getService();
             android.hardware.cas.V1_2.IMediaCasService serviceV12 =
                     android.hardware.cas.V1_2.IMediaCasService.castFrom(service);
diff --git a/media/java/android/media/MediaFeature.java b/media/java/android/media/MediaFeature.java
new file mode 100644
index 0000000..0e461888
--- /dev/null
+++ b/media/java/android/media/MediaFeature.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media;
+
+import android.annotation.StringDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * MediaFeature defines various media features, e.g. hdr type.
+ */
+public final class MediaFeature {
+     /**
+     * Defines tye type of HDR(high dynamic range) video.
+     */
+    public static final class HdrType {
+        private HdrType() {
+        }
+
+        /**
+         * HDR type for dolby-vision.
+         */
+        public static final String DOLBY_VISION = "android.media.feature.hdr.dolby_vision";
+        /**
+         * HDR type for hdr10.
+         */
+        public static final String HDR10 = "android.media.feature.hdr.hdr10";
+        /**
+         * HDR type for hdr10+.
+         */
+        public static final String HDR10_PLUS = "android.media.feature.hdr.hdr10_plus";
+        /**
+         * HDR type for hlg.
+         */
+        public static final String HLG = "android.media.feature.hdr.hlg";
+    }
+
+    /** @hide */
+    @StringDef({
+            HdrType.DOLBY_VISION,
+            HdrType.HDR10,
+            HdrType.HDR10_PLUS,
+            HdrType.HLG,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface MediaHdrType {
+    }
+}
diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java
index ca8b9b9..86d1d15 100644
--- a/media/java/android/media/MediaMetadataRetriever.java
+++ b/media/java/android/media/MediaMetadataRetriever.java
@@ -300,9 +300,7 @@
      */
     public void setDataSource(FileDescriptor fd, long offset, long length)
             throws IllegalArgumentException  {
-        boolean optimize = SystemProperties.getBoolean("fuse.sys.transcode_retriever_optimize",
-                false);
-        FileDescriptor modernFd = optimize ? FileUtils.convertToModernFd(fd) : null;
+        FileDescriptor modernFd = FileUtils.convertToModernFd(fd);
         if (modernFd == null) {
             _setDataSource(fd, offset, length);
         } else {
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index 6554544..973c2a8 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -1258,8 +1258,7 @@
      */
     public void setDataSource(FileDescriptor fd, long offset, long length)
             throws IOException, IllegalArgumentException, IllegalStateException {
-        boolean optimize = SystemProperties.getBoolean("fuse.sys.transcode_player_optimize", false);
-        FileDescriptor modernFd = optimize ? FileUtils.convertToModernFd(fd) : null;
+        FileDescriptor modernFd = FileUtils.convertToModernFd(fd);
         if (modernFd == null) {
             _setDataSource(fd, offset, length);
         } else {
diff --git a/media/java/android/media/MediaTranscodeManager.java b/media/java/android/media/MediaTranscodeManager.java
index 39511a5..4544d04 100644
--- a/media/java/android/media/MediaTranscodeManager.java
+++ b/media/java/android/media/MediaTranscodeManager.java
@@ -26,7 +26,6 @@
 import android.content.Context;
 import android.content.res.AssetFileDescriptor;
 import android.net.Uri;
-import android.os.Bundle;
 import android.os.ParcelFileDescriptor;
 import android.os.RemoteException;
 import android.os.ServiceManager;
@@ -901,29 +900,19 @@
 
             private MediaFormat mSrcVideoFormatHint;
             private MediaFormat mSrcAudioFormatHint;
-            private Bundle mClientCaps;
-
-            /**
-             * A key describing whether the client supports HEVC-encoded video.
-             *
-             * The value associated with this key is a boolean. If unspecified, it's up to
-             * the MediaFormatResolver to determine the default.
-             *
-             * @see #setClientCapabilities(Bundle)
-             */
-            public static final String CAPS_SUPPORTS_HEVC = "support-hevc";
+            private ApplicationMediaCapabilities mClientCaps;
 
             /**
              * Sets the abilities of the client consuming the media. Must be called
              * before {@link #shouldTranscode()} or {@link #resolveVideoFormat()}.
              *
-             * @param clientCaps A Bundle object containing the client's capabilities, such as
-             *                   {@link #CAPS_SUPPORTS_HEVC}.
+             * @param clientCaps An ApplicationMediaCapabilities object containing the client's
+             *                   capabilities.
              * @return the same VideoFormatResolver instance.
-             * @hide
              */
             @NonNull
-            public MediaFormatResolver setClientCapabilities(@NonNull Bundle clientCaps) {
+            public MediaFormatResolver setClientCapabilities(
+                    @NonNull ApplicationMediaCapabilities clientCaps) {
                 mClientCaps = clientCaps;
                 return this;
             }
@@ -964,7 +953,8 @@
              * Returns whether the source content should be transcoded.
              *
              * @return true if the source should be transcoded.
-             * @throws UnsupportedOperationException if {@link #setClientCapabilities(Bundle)}
+             * @throws UnsupportedOperationException
+             *         if {@link #setClientCapabilities(ApplicationMediaCapabilities)}
              *         or {@link #setSourceVideoFormatHint(MediaFormat)} was not called.
              */
             public boolean shouldTranscode() {
@@ -977,7 +967,8 @@
                     throw new UnsupportedOperationException(
                             "Source video format hint must be set!");
                 }
-                boolean supportHevc = mClientCaps.getBoolean(CAPS_SUPPORTS_HEVC, false);
+                boolean supportHevc = mClientCaps.isVideoMimeTypeSupported(
+                        MediaFormat.MIMETYPE_VIDEO_HEVC);
                 if (!supportHevc && MediaFormat.MIMETYPE_VIDEO_HEVC.equals(
                         mSrcVideoFormatHint.getString(MediaFormat.KEY_MIME))) {
                     return true;
@@ -992,7 +983,8 @@
              *
              * @return the video track format to be used if transcoding should be performed,
              *         and null otherwise.
-             * @throws UnsupportedOperationException if {@link #setClientCapabilities(Bundle)}
+             * @throws UnsupportedOperationException
+             *         if {@link #setClientCapabilities(ApplicationMediaCapabilities)}
              *         or {@link #setSourceVideoFormatHint(MediaFormat)} was not called.
              */
             @Nullable
@@ -1013,7 +1005,8 @@
              *
              * @return the audio track format to be used if transcoding should be performed, and
              *         null otherwise.
-             * @throws UnsupportedOperationException if {@link #setClientCapabilities(Bundle)}
+             * @throws UnsupportedOperationException
+             *         if {@link #setClientCapabilities(ApplicationMediaCapabilities)}
              *         or {@link #setSourceVideoFormatHint(MediaFormat)} was not called.
              * @hide
              */
diff --git a/media/java/android/media/ThumbnailUtils.java b/media/java/android/media/ThumbnailUtils.java
index fbf38dc..e6d95eb6 100644
--- a/media/java/android/media/ThumbnailUtils.java
+++ b/media/java/android/media/ThumbnailUtils.java
@@ -272,7 +272,8 @@
         if (mimeType.equals("image/heif")
                 || mimeType.equals("image/heif-sequence")
                 || mimeType.equals("image/heic")
-                || mimeType.equals("image/heic-sequence")) {
+                || mimeType.equals("image/heic-sequence")
+                || mimeType.equals("image/avif")) {
             try (MediaMetadataRetriever retriever = new MediaMetadataRetriever()) {
                 retriever.setDataSource(file.getAbsolutePath());
                 bitmap = retriever.getThumbnailImageAtIndex(-1,
diff --git a/media/java/android/media/soundtrigger/SoundTriggerManager.java b/media/java/android/media/soundtrigger/SoundTriggerManager.java
index 00e3bce..f60c708 100644
--- a/media/java/android/media/soundtrigger/SoundTriggerManager.java
+++ b/media/java/android/media/soundtrigger/SoundTriggerManager.java
@@ -41,6 +41,7 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.IBinder;
 import android.os.ParcelUuid;
 import android.os.RemoteException;
 import android.provider.Settings;
@@ -69,6 +70,7 @@
 
     private final Context mContext;
     private final ISoundTriggerSession mSoundTriggerSession;
+    private final IBinder mBinderToken = new Binder();
 
     // Stores a mapping from the sound model UUID to the SoundTriggerInstance created by
     // the createSoundTriggerDetector() call.
@@ -90,7 +92,8 @@
             originatorIdentity.packageName = ActivityThread.currentOpPackageName();
 
             try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
-                mSoundTriggerSession = soundTriggerService.attachAsOriginator(originatorIdentity);
+                mSoundTriggerSession = soundTriggerService.attachAsOriginator(originatorIdentity,
+                        mBinderToken);
             }
         } catch (RemoteException e) {
             throw e.rethrowAsRuntimeException();
diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java
index aa3143f..27b33ac 100644
--- a/media/java/android/media/tv/tuner/Tuner.java
+++ b/media/java/android/media/tv/tuner/Tuner.java
@@ -61,6 +61,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -369,6 +370,28 @@
         mTunerResourceManager.setFrontendInfoList(infos);
     }
 
+    /**
+     * Get frontend info list from native and build them into a {@link FrontendInfo} list. Any
+     * {@code null} FrontendInfo element would be removed.
+     */
+    private FrontendInfo[] getFrontendInfoListInternal() {
+        List<Integer> ids = getFrontendIds();
+        if (ids == null) {
+            return null;
+        }
+        FrontendInfo[] infos = new FrontendInfo[ids.size()];
+        for (int i = 0; i < ids.size(); i++) {
+            int id = ids.get(i);
+            FrontendInfo frontendInfo = getFrontendInfoById(id);
+            if (frontendInfo == null) {
+                Log.e(TAG, "Failed to get a FrontendInfo on frontend id:" + id + "!");
+                continue;
+            }
+            infos[i] = frontendInfo;
+        }
+        return Arrays.stream(infos).filter(Objects::nonNull).toArray(FrontendInfo[]::new);
+    }
+
     /** @hide */
     public static int getTunerVersion() {
         return sTunerVersion;
@@ -717,10 +740,14 @@
     @Result
     public int scan(@NonNull FrontendSettings settings, @ScanType int scanType,
             @NonNull @CallbackExecutor Executor executor, @NonNull ScanCallback scanCallback) {
-        if (mScanCallback != null || mScanCallbackExecutor != null) {
+        /**
+         * Scan can be called again for blink scan if scanCallback and executor are same as before.
+         */
+        if (((mScanCallback != null) && (mScanCallback != scanCallback))
+                || ((mScanCallbackExecutor != null) && (mScanCallbackExecutor != executor))) {
             throw new IllegalStateException(
-                    "Scan already in progress.  stopScan must be called before a new scan can be "
-                            + "started.");
+                    "Different Scan session already in progress.  stopScan must be called "
+                        + "before a new scan session can be " + "started.");
         }
         mFrontendType = settings.getType();
         if (mFrontendType == FrontendSettings.TYPE_DTMB) {
@@ -932,7 +959,7 @@
     }
 
     /**
-     * Gets the frontend information.
+     * Gets the initialized frontend information.
      *
      * @return The frontend information. {@code null} if the operation failed.
      */
@@ -950,6 +977,16 @@
         return mFrontendInfo;
     }
 
+    /**
+     * Get a list all the existed frontend information.
+     *
+     * @return The list of all the frontend information. {@code null} if the operation failed.
+     */
+    @Nullable
+    public List<FrontendInfo> getFrontendInfoList() {
+        return Arrays.asList(getFrontendInfoListInternal());
+    }
+
     /** @hide */
     public FrontendInfo getFrontendInfoById(int id) {
         return nativeGetFrontendInfo(id);
diff --git a/media/java/android/media/tv/tuner/filter/Filter.java b/media/java/android/media/tv/tuner/filter/Filter.java
index 2f2d8f7..82cc78d 100644
--- a/media/java/android/media/tv/tuner/filter/Filter.java
+++ b/media/java/android/media/tv/tuner/filter/Filter.java
@@ -25,6 +25,7 @@
 import android.media.tv.tuner.Tuner;
 import android.media.tv.tuner.Tuner.Result;
 import android.media.tv.tuner.TunerUtils;
+import android.media.tv.tuner.TunerVersionChecker;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -148,7 +149,6 @@
     public static final int SUBTYPE_PTP = 16;
 
 
-
     /** @hide */
     @IntDef(flag = true, prefix = "STATUS_", value = {STATUS_DATA_READY, STATUS_LOW_WATER,
             STATUS_HIGH_WATER, STATUS_OVERFLOW})
@@ -180,6 +180,31 @@
      */
     public static final int STATUS_OVERFLOW = Constants.DemuxFilterStatus.OVERFLOW;
 
+    /** @hide */
+    @IntDef(flag = true,
+            prefix = "SCRAMBLING_STATUS_",
+            value = {SCRAMBLING_STATUS_UNKNOWN, SCRAMBLING_STATUS_NOT_SCRAMBLED,
+                    SCRAMBLING_STATUS_SCRAMBLED})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ScramblingStatusMask {}
+
+    /**
+     * Content’s scrambling status is unknown
+     */
+    public static final int SCRAMBLING_STATUS_UNKNOWN =
+            android.hardware.tv.tuner.V1_1.Constants.ScramblingStatus.UNKNOWN;
+    /**
+     * Content is not scrambled.
+     */
+    public static final int SCRAMBLING_STATUS_NOT_SCRAMBLED =
+            android.hardware.tv.tuner.V1_1.Constants.ScramblingStatus.NOT_SCRAMBLED;
+    /**
+     * Content is scrambled.
+     */
+    public static final int SCRAMBLING_STATUS_SCRAMBLED =
+            android.hardware.tv.tuner.V1_1.Constants.ScramblingStatus.SCRAMBLED;
+
+
     private static final String TAG = "Filter";
 
     private long mNativeContext;
@@ -197,6 +222,7 @@
             int type, int subType, FilterConfiguration settings);
     private native int nativeGetId();
     private native long nativeGetId64Bit();
+    private native int nativeconfigureScramblingEvent(int scramblingStatusMask);
     private native int nativeSetDataSource(Filter source);
     private native int nativeStartFilter();
     private native int nativeStopFilter();
@@ -280,6 +306,38 @@
     }
 
     /**
+     * Configure the Filter to monitor specific Scrambling Status through
+     * {@link ScramblingStatusEvent}.
+     *
+     * <p>{@link ScramblingStatusEvent} should be sent at the following two scenarios:
+     *
+     * <ul>
+     *   <li>When this method is called, the first detected scrambling status should be sent.
+     *   <li>When the filter transits into the monitored statuses configured in
+     *       {@code scramblingStatusMask}, event should be sent.
+     *     <ul/>
+     *
+     * <p>This configuration is only supported in Tuner 1.1 or higher version. Unsupported version
+     * will cause no-op. Use {@link TunerVersionChecker.getTunerVersion()} to get the version
+     * information.
+     *
+     * @param scramblingStatusMask Scrambling Statuses to be monitored. Set corresponding bit to
+     *                             monitor it. Reset to stop monitoring.
+     * @return result status of the operation.
+     */
+    @Result
+    public int configureScramblingStatusEvent(@ScramblingStatusMask int scramblingStatusMask) {
+        synchronized (mLock) {
+            TunerUtils.checkResourceState(TAG, mIsClosed);
+            if (!TunerVersionChecker.checkHigherOrEqualVersionTo(
+                    TunerVersionChecker.TUNER_VERSION_1_1, "configureScramblingStatusEvent")) {
+                return Tuner.RESULT_UNAVAILABLE;
+            }
+            return nativeconfigureScramblingEvent(scramblingStatusMask);
+        }
+    }
+
+    /**
      * Sets the filter's data source.
      *
      * A filter uses demux as data source by default. If the data was packetized
diff --git a/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java b/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java
index 1031e33..1bbd6e3 100644
--- a/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java
+++ b/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java
@@ -94,7 +94,7 @@
      * {@link android.media.tv.tuner.TunerVersionChecker.getTunerVersion()} to get the version
      * information.
      */
-    public int getFirstMbInSlice() {
+    public int getFirstMacroblockInSlice() {
         return mFirstMbInSlice;
     }
 
diff --git a/media/java/android/media/tv/tuner/filter/ScramblingStatusEvent.java b/media/java/android/media/tv/tuner/filter/ScramblingStatusEvent.java
new file mode 100644
index 0000000..a78b96e
--- /dev/null
+++ b/media/java/android/media/tv/tuner/filter/ScramblingStatusEvent.java
@@ -0,0 +1,48 @@
+/*
+ * 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.media.tv.tuner.filter;
+
+import android.annotation.SystemApi;
+
+/**
+ * Scrambling Status event sent from {@link Filter} objects with Scrambling Status type.
+ *
+ * <p>This event is only sent in Tuner 1.1 or higher version. Use
+ * {@link TunerVersionChecker.getTunerVersion()} to get the version information.
+ *
+ * @hide
+ */
+@SystemApi
+public final class ScramblingStatusEvent extends FilterEvent {
+    private final int mScramblingStatus;
+
+    private ScramblingStatusEvent(@Filter.ScramblingStatusMask int scramblingStatus) {
+        mScramblingStatus = scramblingStatus;
+    }
+
+    /**
+     * Gets Scrambling Status Type.
+     *
+     * <p>This event field is only sent in Tuner 1.1 or higher version. Unsupported version returns
+     * default value 0. Use {@link TunerVersionChecker.getTunerVersion()} to get the version
+     * information.
+     */
+    @Filter.ScramblingStatusMask
+    public int getScramblingStatus() {
+        return mScramblingStatus;
+    }
+}
diff --git a/media/java/android/media/tv/tuner/filter/TsRecordEvent.java b/media/java/android/media/tv/tuner/filter/TsRecordEvent.java
index 6ea3bf8..2816199 100644
--- a/media/java/android/media/tv/tuner/filter/TsRecordEvent.java
+++ b/media/java/android/media/tv/tuner/filter/TsRecordEvent.java
@@ -99,7 +99,7 @@
      * {@link android.media.tv.tuner.TunerVersionChecker.getTunerVersion()} to get the version
      * information.
      */
-    public int getFirstMbInSlice() {
+    public int getFirstMacroblockInSlice() {
         return mFirstMbInSlice;
     }
 }
diff --git a/media/java/android/media/tv/tuner/frontend/FrontendInfo.java b/media/java/android/media/tv/tuner/frontend/FrontendInfo.java
index 68c0c96..f3e9476 100644
--- a/media/java/android/media/tv/tuner/frontend/FrontendInfo.java
+++ b/media/java/android/media/tv/tuner/frontend/FrontendInfo.java
@@ -22,6 +22,9 @@
 import android.media.tv.tuner.frontend.FrontendStatus.FrontendStatusType;
 import android.util.Range;
 
+import java.util.Arrays;
+import java.util.Objects;
+
 /**
  * This class is used to specify meta information of a frontend.
  *
@@ -118,4 +121,30 @@
     public FrontendCapabilities getFrontendCapabilities() {
         return mFrontendCap;
     }
+
+
+    /** @hide */
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || !(o instanceof FrontendInfo)) {
+            return false;
+        }
+        // TODO: compare FrontendCapabilities
+        FrontendInfo info = (FrontendInfo) o;
+        return mId == info.getId() && mType == info.getType()
+                && Objects.equals(mFrequencyRange, info.getFrequencyRange())
+                && Objects.equals(mSymbolRateRange, info.getSymbolRateRange())
+                && mAcquireRange == info.getAcquireRange()
+                && mExclusiveGroupId == info.getExclusiveGroupId()
+                && Arrays.equals(mStatusCaps, info.getStatusCapabilities());
+    }
+
+    /** @hide */
+    @Override
+    public int hashCode() {
+        return mId;
+    }
 }
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 2541750..b9e7848 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -4024,6 +4024,28 @@
                     ::android::hardware::tv::tuner::V1_1::Constant64Bit::INVALID_FILTER_ID_64BIT);
 }
 
+static jint android_media_tv_Tuner_configure_scrambling_status_event(
+        JNIEnv* env, jobject filter, int scramblingStatusMask) {
+    sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter();
+    if (iFilterSp == NULL) {
+        ALOGD("Failed to configure scrambling event: filter not found");
+        return (jint) Result::NOT_INITIALIZED;
+    }
+
+    sp<::android::hardware::tv::tuner::V1_1::IFilter> iFilterSp_1_1;
+    iFilterSp_1_1 = ::android::hardware::tv::tuner::V1_1::IFilter::castFrom(iFilterSp);
+    Result res;
+
+    if (iFilterSp_1_1 != NULL) {
+        res = iFilterSp_1_1->configureScramblingEvent(scramblingStatusMask);
+    } else {
+        ALOGW("configureScramblingEvent is not supported with the current HAL implementation.");
+        return (jint) Result::INVALID_STATE;
+    }
+
+    return (jint) res;
+}
+
 static jint android_media_tv_Tuner_set_filter_data_source(
         JNIEnv* env, jobject filter, jobject srcFilter) {
     sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter();
@@ -4695,6 +4717,8 @@
     { "nativeGetId", "()I", (void *)android_media_tv_Tuner_get_filter_id },
     { "nativeGetId64Bit", "()J",
             (void *)android_media_tv_Tuner_get_filter_64bit_id },
+    { "nativeconfigureScramblingEvent", "(I)I",
+            (void *)android_media_tv_Tuner_configure_scrambling_status_event },
     { "nativeSetDataSource", "(Landroid/media/tv/tuner/filter/Filter;)I",
             (void *)android_media_tv_Tuner_set_filter_data_source },
     { "nativeStartFilter", "()I", (void *)android_media_tv_Tuner_start_filter },
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/ApplicationMediaCapabilitiesTest.java b/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/ApplicationMediaCapabilitiesTest.java
index 8a668c6..3f3f49a 100644
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/ApplicationMediaCapabilitiesTest.java
+++ b/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/ApplicationMediaCapabilitiesTest.java
@@ -34,6 +34,8 @@
 import static org.testng.Assert.assertThrows;
 
 import android.media.ApplicationMediaCapabilities;
+import android.media.MediaFeature;
+import android.media.MediaFormat;
 import android.test.ActivityInstrumentationTestCase2;
 
 import org.junit.Test;
@@ -49,37 +51,39 @@
     @Test
     public void testSetSupportHevc() throws Exception {
         ApplicationMediaCapabilities capability =
-                new ApplicationMediaCapabilities.Builder().setHevcSupported(true).build();
-        assertTrue(capability.isHevcSupported());
+                new ApplicationMediaCapabilities.Builder().addSupportedVideoMimeType(
+                        MediaFormat.MIMETYPE_VIDEO_HEVC).build();
+        assertTrue(capability.isVideoMimeTypeSupported(MediaFormat.MIMETYPE_VIDEO_HEVC));
 
         ApplicationMediaCapabilities capability2 =
-                new ApplicationMediaCapabilities.Builder().setHevcSupported(false).build();
-        assertFalse(capability2.isHevcSupported());
+                new ApplicationMediaCapabilities.Builder().build();
+        assertFalse(capability2.isVideoMimeTypeSupported(MediaFormat.MIMETYPE_VIDEO_HEVC));
     }
 
     @Test
     public void testSetSupportHdr() throws Exception {
         ApplicationMediaCapabilities capability =
-                new ApplicationMediaCapabilities.Builder().setHdrSupported(true).setHevcSupported(
-                        true).build();
-        assertEquals(true, capability.isHdrSupported());
+                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();
+                new ApplicationMediaCapabilities.Builder().setSlowMotionSupported(true).build();
         assertTrue(capability.isSlowMotionSupported());
     }
 
     @Test
     public void testBuilder() throws Exception {
         ApplicationMediaCapabilities capability =
-                new ApplicationMediaCapabilities.Builder().setHdrSupported(
-                        true).setHevcSupported(true).setSlowMotionSupported(true).build();
-        assertTrue(capability.isHdrSupported());
-        assertTrue(capability.isSlowMotionSupported());
+                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());
     }
 
@@ -87,8 +91,8 @@
     public void testSupportHdrWithoutSupportHevc() throws Exception {
         assertThrows(UnsupportedOperationException.class, () -> {
             ApplicationMediaCapabilities capability =
-                    new ApplicationMediaCapabilities.Builder().setHdrSupported(
-                            true).setHevcSupported(false).build();
+                    new ApplicationMediaCapabilities.Builder().addSupportedHdrType(
+                            MediaFeature.HdrType.HDR10_PLUS).build();
         });
     }
 }
diff --git a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerTest.java b/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerTest.java
index f12ecd5..8231988 100644
--- a/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerTest.java
+++ b/media/tests/MediaTranscodingTest/src/com/android/mediatranscodingtest/MediaTranscodeManagerTest.java
@@ -20,6 +20,7 @@
 
 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;
@@ -454,8 +455,8 @@
         Uri destinationUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
                 + mContext.getCacheDir().getAbsolutePath() + "/HevcTranscode.mp4");
 
-        Bundle clientCaps = new Bundle();
-        clientCaps.putBoolean(MediaFormatResolver.CAPS_SUPPORTS_HEVC, false);
+        ApplicationMediaCapabilities clientCaps =
+                new ApplicationMediaCapabilities.Builder().build();
         MediaFormatResolver resolver = new MediaFormatResolver()
                 .setSourceVideoFormatHint(MediaFormat.createVideoFormat(
                         MediaFormat.MIMETYPE_VIDEO_HEVC, WIDTH, HEIGHT))
diff --git a/packages/CarSystemUI/Android.bp b/packages/CarSystemUI/Android.bp
deleted file mode 100644
index 08dd799..0000000
--- a/packages/CarSystemUI/Android.bp
+++ /dev/null
@@ -1,165 +0,0 @@
-//
-// Copyright (C) 2018 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-android_library {
-    name: "CarSystemUI-core",
-
-    srcs: [
-        "src/**/*.java",
-        "src/**/I*.aidl",
-    ],
-
-    resource_dirs: [
-        "res-keyguard",
-        "res",
-    ],
-
-    static_libs: [
-        "SystemUI-core",
-        "CarNotificationLib",
-        "SystemUIPluginLib",
-        "SystemUISharedLib",
-        "SettingsLib",
-        "car-ui-lib",
-        "android.car.userlib",
-        "androidx.legacy_legacy-support-v4",
-        "androidx.recyclerview_recyclerview",
-        "androidx.preference_preference",
-        "androidx.appcompat_appcompat",
-        "androidx.mediarouter_mediarouter",
-        "androidx.palette_palette",
-        "androidx.legacy_legacy-preference-v14",
-        "androidx.leanback_leanback",
-        "androidx.slice_slice-core",
-        "androidx.slice_slice-view",
-        "androidx.slice_slice-builders",
-        "androidx.arch.core_core-runtime",
-        "androidx.lifecycle_lifecycle-extensions",
-        "SystemUI-tags",
-        "SystemUI-proto",
-        "dagger2",
-        "//external/kotlinc:kotlin-annotations",
-    ],
-
-    libs: [
-        "android.car",
-    ],
-
-    manifest: "AndroidManifest.xml",
-
-    plugins: ["dagger2-compiler"],
-
-}
-
-android_library {
-    name: "CarSystemUI-tests",
-    manifest: "tests/AndroidManifest.xml",
-    resource_dirs: [
-        "tests/res",
-        "res-keyguard",
-        "res",
-    ],
-    srcs: [
-        "tests/src/**/*.java",
-        "src/**/*.java",
-        "src/**/I*.aidl",
-    ],
-    static_libs: [
-        "SystemUI-tests",
-        "CarNotificationLib",
-        "SystemUIPluginLib",
-        "SystemUISharedLib",
-        "SettingsLib",
-        "android.car.userlib",
-        "androidx.legacy_legacy-support-v4",
-        "androidx.recyclerview_recyclerview",
-        "androidx.preference_preference",
-        "androidx.appcompat_appcompat",
-        "androidx.mediarouter_mediarouter",
-        "androidx.palette_palette",
-        "androidx.legacy_legacy-preference-v14",
-        "androidx.leanback_leanback",
-        "androidx.slice_slice-core",
-        "androidx.slice_slice-view",
-        "androidx.slice_slice-builders",
-        "androidx.arch.core_core-runtime",
-        "androidx.lifecycle_lifecycle-extensions",
-        "car-ui-lib",
-        "SystemUI-tags",
-        "SystemUI-proto",
-        "metrics-helper-lib",
-        "androidx.test.rules", "hamcrest-library",
-        "mockito-target-inline-minus-junit4",
-        "testables",
-        "truth-prebuilt",
-        "dagger2",
-        "//external/kotlinc:kotlin-annotations",
-    ],
-    libs: [
-        "android.test.runner",
-        "android.test.base",
-        "android.car",
-    ],
-
-    aaptflags: [
-        "--extra-packages",
-        "com.android.systemui",
-    ],
-
-    plugins: ["dagger2-compiler"],
-}
-
-android_app {
-    name: "CarSystemUI",
-
-    static_libs: [
-        "CarSystemUI-core",
-    ],
-
-    export_package_resources: true,
-
-    libs: [
-        "android.car",
-    ],
-
-    resource_dirs: [],
-
-     overrides: [
-        "SystemUI",
-    ],
-
-    platform_apis: true,
-    system_ext_specific: true,
-    certificate: "platform",
-    privileged: true,
-
-    optimize: {
-        proguard_flags_files: [
-            "proguard.flags",
-        ],
-    },
-    dxflags: ["--multi-dex"],
-
-    aaptflags: [
-        "--extra-packages",
-        "com.android.keyguard",
-    ],
-
-    kotlincflags: ["-Xjvm-default=enable"],
-
-    plugins: ["dagger2-compiler"],
-
-    required: ["privapp_whitelist_com.android.systemui"],
-}
diff --git a/packages/CarSystemUI/AndroidManifest.xml b/packages/CarSystemUI/AndroidManifest.xml
deleted file mode 100644
index f0cf2a9..0000000
--- a/packages/CarSystemUI/AndroidManifest.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2018 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
-        package="com.android.systemui"
-        android:sharedUserId="android.uid.systemui"
-        coreApp="true">
-    <!-- This permission is required to monitor car power state. -->
-    <uses-permission android:name="android.car.permission.CAR_POWER" />
-    <!-- This permission is required to get the trusted device list of a user. -->
-    <uses-permission android:name="android.car.permission.CAR_ENROLL_TRUST"/>
-    <!-- This permission is required to monitor gear state. -->
-    <uses-permission android:name="android.car.permission.CAR_POWERTRAIN" />
-    <!-- This permission is required to get bluetooth broadcast. -->
-    <uses-permission android:name="android.permission.BLUETOOTH" />
-    <!-- These permissions are required to implement icons based on role holders. -->
-    <uses-permission android:name="android.permission.OBSERVE_ROLE_HOLDERS"/>
-    <uses-permission android:name="android.permission.MANAGE_ROLE_HOLDERS"/>
-    <!-- This permission is required to access app information from other users. -->
-    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>
-    <!-- This permission is required to check the foreground user id. -->
-    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
-</manifest>
diff --git a/packages/CarSystemUI/CleanSpec.mk b/packages/CarSystemUI/CleanSpec.mk
deleted file mode 100644
index ceac67c..0000000
--- a/packages/CarSystemUI/CleanSpec.mk
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright (C) 2019 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# If you don't need to do a full clean build but would like to touch
-# a file or delete some intermediate files, add a clean step to the end
-# of the list.  These steps will only be run once, if they haven't been
-# run before.
-#
-# E.g.:
-#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
-#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
-#
-# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
-# files that are missing or have been moved.
-#
-# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
-# Use $(OUT_DIR) to refer to the "out" directory.
-#
-# If you need to re-do something that's already mentioned, just copy
-# the command and add it to the bottom of the list.  E.g., if a change
-# that you made last week required touching a file and a change you
-# made today requires touching the same file, just copy the old
-# touch step and add it to the end of the list.
-#
-# *****************************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST ABOVE THE BANNER
-# *****************************************************************
-
-# For example:
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
-#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
-#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/product/priv-app/CarSystemUI)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/product/priv-app/CarSystemUI)
-# ******************************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST ABOVE THIS BANNER
-# ******************************************************************
diff --git a/packages/CarSystemUI/TEST_MAPPING b/packages/CarSystemUI/TEST_MAPPING
deleted file mode 100644
index 54afb90..0000000
--- a/packages/CarSystemUI/TEST_MAPPING
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "auto-end-to-end-presubmit": [
-    {
-      "name": "AndroidAutoUiTests",
-      "options" : [
-        {
-          "include-filter": "android.test.functional.auto.apps.HomeHelperTest"
-        }
-      ]
-    }
-  ],
-  "auto-end-to-end-postsubmit": [
-    {
-      "name": "AndroidAutoUiTests",
-      "options" : [
-        {
-          "include-filter": "android.test.functional.auto.apps.NotificationHelperTest"
-        }
-      ]
-    }
-  ],
-  "carsysui-presubmit": [
-    {
-      "name": "CarSystemUITests",
-      "options" : [
-        {
-          "include-annotation": "com.android.systemui.car.CarSystemUiTest"
-        }
-      ]
-    }
-  ]
-}
diff --git a/packages/CarSystemUI/proguard.flags b/packages/CarSystemUI/proguard.flags
deleted file mode 100644
index f0b20c1..0000000
--- a/packages/CarSystemUI/proguard.flags
+++ /dev/null
@@ -1,7 +0,0 @@
--keep class com.android.systemui.CarSystemUIFactory
--keep class com.android.car.notification.headsup.animationhelper.**
-
--keep class com.android.systemui.DaggerCarGlobalRootComponent { *; }
--keep class com.android.systemui.DaggerCarGlobalRootComponent$CarSysUIComponentImpl { *; }
-
--include ../SystemUI/proguard.flags
diff --git a/packages/CarSystemUI/res-keyguard/drawable/ic_backspace.xml b/packages/CarSystemUI/res-keyguard/drawable/ic_backspace.xml
deleted file mode 100644
index f3a2f0f..0000000
--- a/packages/CarSystemUI/res-keyguard/drawable/ic_backspace.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License")
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="36dp"
-        android:height="36dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M9,15.59L12.59,12L9,8.41L10.41,7L14,10.59L17.59,7L19,8.41L15.41,12L19,15.59L17.59,17L14,13.41L10.41,17L9,15.59zM21,6H8l-4.5,6L8,18h13V6M21,4c1.1,0 2,0.9 2,2v12c0,1.1 -0.9,2 -2,2H8c-0.63,0 -1.22,-0.3 -1.6,-0.8L1,12l5.4,-7.2C6.78,4.3 7.37,4 8,4H21L21,4z"/>
-</vector>
diff --git a/packages/CarSystemUI/res-keyguard/drawable/ic_done.xml b/packages/CarSystemUI/res-keyguard/drawable/ic_done.xml
deleted file mode 100644
index ef0aac2..0000000
--- a/packages/CarSystemUI/res-keyguard/drawable/ic_done.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License")
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="36dp"
-        android:height="36dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M9,16.2l-3.5,-3.5a0.984,0.984 0,0 0,-1.4 0,0.984 0.984,0 0,0 0,1.4l4.19,4.19c0.39,0.39 1.02,0.39 1.41,0L20.3,7.7a0.984,0.984 0,0 0,0 -1.4,0.984 0.984,0 0,0 -1.4,0L9,16.2z"/>
-</vector>
diff --git a/packages/CarSystemUI/res-keyguard/drawable/keyguard_button_background.xml b/packages/CarSystemUI/res-keyguard/drawable/keyguard_button_background.xml
deleted file mode 100644
index 8b2779d..0000000
--- a/packages/CarSystemUI/res-keyguard/drawable/keyguard_button_background.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License")
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_pressed="true">
-        <shape android:shape="rectangle">
-            <corners android:radius="@*android:dimen/car_button_radius"/>
-            <solid android:color="#131315"/>
-        </shape>
-    </item>
-    <item>
-        <shape android:shape="rectangle">
-            <corners android:radius="@*android:dimen/car_button_radius"/>
-            <solid android:color="@color/button_background"/>
-        </shape>
-    </item>
-</selector>
diff --git a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pattern_view.xml b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pattern_view.xml
deleted file mode 100644
index a465254..0000000
--- a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pattern_view.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- Car customizations
-     - Added title "Enter your Pattern" at the top
-     - Hid the emergency call at the bottom
--->
-
-<com.android.keyguard.KeyguardPatternView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/keyguard_pattern_view"
-    android:orientation="horizontal"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingHorizontal="@*android:dimen/car_margin">
-
-    <FrameLayout
-        android:layout_height="match_parent"
-        android:layout_width="0dp"
-        android:layout_weight="1">
-
-        <com.android.internal.widget.LockPatternView
-            android:id="@+id/lockPatternView"
-            android:layout_width="@dimen/keyguard_pattern_dimension"
-            android:layout_height="@dimen/keyguard_pattern_dimension"
-            android:layout_gravity="center"/>
-    </FrameLayout>
-
-    <LinearLayout
-        android:id="@+id/container"
-        android:layout_height="match_parent"
-        android:layout_width="0dp"
-        android:layout_weight="1"
-        android:orientation="vertical"
-        android:gravity="center_vertical">
-
-        <TextView
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_margin="@*android:dimen/car_padding_2"
-            android:gravity="center"
-            android:textColor="@android:color/white"
-            android:textSize="@*android:dimen/car_body1_size"
-            android:text="@string/keyguard_enter_your_pattern" />
-
-        <include layout="@layout/keyguard_message_area" />
-
-        <Button
-            android:id="@+id/cancel_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            style="@style/KeyguardButton"
-            android:text="@string/cancel"/>
-
-        <include layout="@layout/keyguard_eca"
-            android:id="@+id/keyguard_selector_fade_container"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            android:layout_gravity="bottom|center_horizontal"
-            android:gravity="center_horizontal"
-            android:visibility="gone" />
-    </LinearLayout>
-
-</com.android.keyguard.KeyguardPatternView>
diff --git a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml
deleted file mode 100644
index 5746102..0000000
--- a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml
+++ /dev/null
@@ -1,126 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License")
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-<!-- Car customizations
-     - Added title "Enter your PIN" under the entry field
-     - Put backspace and enter buttons in row 4
-     - PIN pad is on start side while entry field and title are on the end side
-     -  Hid the emergency call at the bottom
--->
-
-<com.android.keyguard.KeyguardPINView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/keyguard_pin_view"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="horizontal"
-    android:paddingHorizontal="@*android:dimen/car_margin">
-
-    <FrameLayout
-        android:layout_width="0dp"
-        android:layout_weight="1"
-        android:layout_height="match_parent">
-
-        <GridLayout
-            android:id="@+id/container"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            android:gravity="center"
-            android:columnCount="3">
-
-            <include layout="@layout/num_pad_keys"/>
-        </GridLayout>
-    </FrameLayout>
-
-    <LinearLayout
-        android:layout_width="0dp"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:gravity="center"
-        android:orientation="vertical">
-
-        <com.android.keyguard.PasswordTextView
-            android:id="@+id/pinEntry"
-            android:layout_width="@dimen/keyguard_security_width"
-            android:layout_height="@dimen/pin_entry_height"
-            android:gravity="center"
-            app:scaledTextSize="@integer/password_text_view_scale"
-            android:contentDescription="@string/keyguard_accessibility_pin_area" />
-
-        <View
-            android:id="@+id/divider"
-            android:layout_width="@dimen/keyguard_security_width"
-            android:layout_height="@dimen/divider_height"
-            android:background="@android:color/white" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_margin="@*android:dimen/car_padding_2"
-            android:gravity="center"
-            android:textColor="@android:color/white"
-            android:textSize="@*android:dimen/car_body1_size"
-            android:text="@string/keyguard_enter_your_pin" />
-
-        <include layout="@layout/keyguard_message_area" />
-
-        <Button
-            android:id="@+id/cancel_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            style="@style/KeyguardButton"
-            android:text="@string/cancel"/>
-    </LinearLayout>
-
-    <!-- KeyguardPinView references these resources ids in code so removing them will cause the
-         keyguard to crash. Instead put them down here where they are out of the way and set their
-         visibility to gone. -->
-    <com.android.keyguard.AlphaOptimizedRelativeLayout
-        android:id="@+id/row0"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:visibility="gone" />
-    <LinearLayout
-        android:id="@+id/row1"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:visibility="gone" />
-    <LinearLayout
-        android:id="@+id/row2"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:visibility="gone" />
-    <LinearLayout
-        android:id="@+id/row3"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:visibility="gone" />
-    <LinearLayout
-        android:id="@+id/row4"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:visibility="gone" />
-
-    <include layout="@layout/keyguard_eca"
-         android:id="@+id/keyguard_selector_fade_container"
-         android:layout_width="0dp"
-         android:layout_height="0dp"
-         android:visibility="gone" />
-</com.android.keyguard.KeyguardPINView>
diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_bouncer.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_bouncer.xml
deleted file mode 100644
index d105e44..0000000
--- a/packages/CarSystemUI/res-keyguard/layout/keyguard_bouncer.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<!-- Car customizations
-     Car has solid black background instead of a transparent one
--->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-             android:layout_width="match_parent"
-             android:layout_height="match_parent"
-             android:background="@android:color/black"
-             android:fitsSystemWindows="true">
-
-    <include
-        style="@style/BouncerSecurityContainer"
-        layout="@layout/keyguard_host_view"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content" />
-</FrameLayout>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml
deleted file mode 100644
index 3e35df9..0000000
--- a/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<!-- Car customizations
-     Car has solid black background instead of a transparent one
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/keyguard_container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:gravity="center"/>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_message_area.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_message_area.xml
deleted file mode 100644
index 09cf472..0000000
--- a/packages/CarSystemUI/res-keyguard/layout/keyguard_message_area.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<com.android.keyguard.KeyguardMessageArea
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:gravity="center"
-    style="@style/Keyguard.TextView"
-    android:id="@+id/keyguard_message_area"
-    android:singleLine="true"
-    android:ellipsize="marquee"
-    android:focusable="true"
-    android:layout_marginBottom="@*android:dimen/car_padding_4"
-    android:textSize="@*android:dimen/car_body2_size" />
diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_num_pad_key.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_num_pad_key.xml
deleted file mode 100644
index c7eda38..0000000
--- a/packages/CarSystemUI/res-keyguard/layout/keyguard_num_pad_key.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<!-- Car customizations
-     The mnemonics is not shown for car but KeyguardPinView references the resource id in code.
-     Removing it will cause the keyguard to crash. Hide them instead
--->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-    <TextView
-        android:id="@+id/digit_text"
-        style="@style/Widget.TextView.NumPadKey"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        />
-    <!-- The mnemonics is not shown for car but KeyguardPinView references the resource id in code.
-         Removing it will cause the keyguard to crash. Hide them instead -->
-    <TextView
-        android:id="@+id/klondike_text"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:visibility="gone"
-        />
-</merge>
-
diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_password_view.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_password_view.xml
deleted file mode 100644
index d57875f..0000000
--- a/packages/CarSystemUI/res-keyguard/layout/keyguard_password_view.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- Car customizations
-     - Added title "Enter your Password" below the password field
-     - Hid the emergency call at the bottom
--->
-
-<com.android.keyguard.KeyguardPasswordView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:androidprv="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/keyguard_password_view"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:gravity="center">
-
-    <include layout="@layout/keyguard_message_area" />
-
-    <!-- Password entry field -->
-    <LinearLayout
-         android:layout_height="wrap_content"
-         android:layout_width="wrap_content"
-         android:layout_gravity="center_horizontal"
-         android:orientation="vertical"
-         android:theme="?attr/passwordStyle">
-
-        <EditText
-            android:id="@+id/passwordEntry"
-            android:layout_width="@dimen/password_field_width"
-            android:layout_height="wrap_content"
-            android:gravity="center_horizontal"
-            android:singleLine="true"
-            android:textStyle="normal"
-            android:inputType="textPassword"
-            android:textSize="@*android:dimen/car_body1_size"
-            android:textColor="?attr/wallpaperTextColor"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:imeOptions="flagForceAscii|actionDone"
-            android:maxLength="@integer/password_max_length"
-         />
-
-        <TextView
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_margin="@*android:dimen/car_padding_2"
-            android:gravity="center"
-            android:textColor="@android:color/white"
-            android:textSize="@*android:dimen/car_body1_size"
-            android:text="@string/keyguard_enter_your_password" />
-
-        <Button
-            android:id="@+id/cancel_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            style="@style/KeyguardButton"
-            android:text="@string/cancel"/>
-
-        <ImageView android:id="@+id/switch_ime_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="12dp"
-            android:src="@drawable/ic_lockscreen_ime"
-            android:contentDescription="@string/accessibility_ime_switch_button"
-            android:clickable="true"
-            android:padding="8dp"
-            android:tint="@color/background_protected"
-            android:layout_gravity="end|center_vertical"
-            android:background="?android:attr/selectableItemBackground"
-            android:visibility="gone"
-        />
-    </LinearLayout>
-
-    <include layout="@layout/keyguard_eca"
-        android:id="@+id/keyguard_selector_fade_container"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="12dp"
-        android:orientation="vertical"
-        android:layout_gravity="bottom|center_horizontal"
-        android:gravity="center_horizontal"
-        android:visibility="gone"
-    />
-
-</com.android.keyguard.KeyguardPasswordView>
diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_pattern_view.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_pattern_view.xml
deleted file mode 100644
index bb69d44..0000000
--- a/packages/CarSystemUI/res-keyguard/layout/keyguard_pattern_view.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- Car customizations
-     - Added title "Enter your Pattern" at the top
-     - Hid the emergency call at the bottom
--->
-
-<com.android.keyguard.KeyguardPatternView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:androidprv="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/keyguard_pattern_view"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    androidprv:layout_maxWidth="@dimen/keyguard_security_width"
-    android:gravity="center_horizontal">
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-        <LinearLayout
-            android:id="@+id/container"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:orientation="vertical"
-            android:layout_gravity="center">
-
-            <TextView
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_margin="@*android:dimen/car_padding_2"
-                android:gravity="center"
-                android:textColor="@android:color/white"
-                android:textSize="@*android:dimen/car_body1_size"
-                android:text="@string/keyguard_enter_your_pattern" />
-
-            <include layout="@layout/keyguard_message_area" />
-
-            <com.android.internal.widget.LockPatternView
-                android:id="@+id/lockPatternView"
-                android:layout_width="@dimen/keyguard_pattern_dimension"
-                android:layout_height="@dimen/keyguard_pattern_dimension"
-                android:layout_marginVertical="@dimen/pin_pattern_pad_margin_vertical"
-                android:layout_gravity="center_horizontal"
-                android:gravity="center" />
-
-            <Button
-                android:id="@+id/cancel_button"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center"
-                style="@style/KeyguardButton"
-                android:text="@string/cancel"/>
-
-          <include layout="@layout/keyguard_eca"
-              android:id="@+id/keyguard_selector_fade_container"
-              android:layout_width="match_parent"
-              android:layout_height="wrap_content"
-              android:orientation="vertical"
-              android:layout_gravity="bottom|center_horizontal"
-              android:gravity="center_horizontal"
-              android:visibility="gone" />
-        </LinearLayout>
-    </FrameLayout>
-
-</com.android.keyguard.KeyguardPatternView>
diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_pin_view.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_pin_view.xml
deleted file mode 100644
index 815e67d..0000000
--- a/packages/CarSystemUI/res-keyguard/layout/keyguard_pin_view.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License")
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-<!-- Car customizations
-     - Added title "Enter your PIN" under the entry field
-     - Put backspace and enter buttons in row 4
-     - Hid the emergency call at the bottom
--->
-
-<com.android.keyguard.KeyguardPINView
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:id="@+id/keyguard_pin_view"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_marginLeft="@dimen/num_pad_margin_left"
-        android:layout_marginRight="@dimen/num_pad_margin_right"
-        android:orientation="vertical"
-        android:gravity="center">
-
-        <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:gravity="center"
-            android:orientation="vertical">
-
-            <com.android.keyguard.PasswordTextView
-                android:id="@+id/pinEntry"
-                android:layout_width="@dimen/keyguard_security_width"
-                android:layout_height="@dimen/pin_entry_height"
-                android:gravity="center"
-                app:scaledTextSize="@integer/password_text_view_scale"
-                android:contentDescription="@string/keyguard_accessibility_pin_area" />
-
-            <View
-                android:id="@+id/divider"
-                android:layout_width="@dimen/keyguard_security_width"
-                android:layout_height="@dimen/divider_height"
-                android:background="@android:color/white" />
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_margin="@*android:dimen/car_padding_2"
-                android:gravity="center"
-                android:textColor="@android:color/white"
-                android:textSize="@*android:dimen/car_body1_size"
-                android:text="@string/keyguard_enter_your_pin" />
-
-            <include layout="@layout/keyguard_message_area" />
-
-        </LinearLayout>
-
-        <GridLayout
-            android:id="@+id/container"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginVertical="@dimen/pin_pattern_pad_margin_vertical"
-            android:columnCount="3">
-
-            <include layout="@layout/num_pad_keys"/>
-        </GridLayout>
-
-        <Button
-            android:id="@+id/cancel_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            style="@style/KeyguardButton"
-            android:text="@string/cancel"/>
-
-    </LinearLayout>
-
-    <!-- KeyguardPinView references these resources ids in code so removing them will cause the
-         keyguard to crash. Instead put them down here where they are out of the way and set their
-         visibility to gone. -->
-    <com.android.keyguard.AlphaOptimizedRelativeLayout
-        android:id="@+id/row0"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:visibility="gone" />
-    <LinearLayout
-        android:id="@+id/row1"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:visibility="gone" />
-    <LinearLayout
-        android:id="@+id/row2"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:visibility="gone" />
-    <LinearLayout
-        android:id="@+id/row3"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:visibility="gone" />
-    <LinearLayout
-        android:id="@+id/row4"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:visibility="gone" />
-
-    <include
-        layout="@layout/keyguard_eca"
-        android:id="@+id/keyguard_selector_fade_container"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:visibility="gone" />
-</com.android.keyguard.KeyguardPINView>
diff --git a/packages/CarSystemUI/res-keyguard/layout/num_pad_keys.xml b/packages/CarSystemUI/res-keyguard/layout/num_pad_keys.xml
deleted file mode 100644
index 8306cb4..0000000
--- a/packages/CarSystemUI/res-keyguard/layout/num_pad_keys.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android"
-       xmlns:app="http://schemas.android.com/apk/res-auto">
-    <!-- Row 1 -->
-    <com.android.keyguard.NumPadKey
-        android:id="@+id/key1"
-        style="@style/NumPadKeyButton"
-        app:digit="1" />
-    <com.android.keyguard.NumPadKey
-        android:id="@+id/key2"
-        style="@style/NumPadKeyButton.MiddleColumn"
-        app:digit="2" />
-    <com.android.keyguard.NumPadKey
-        android:id="@+id/key3"
-        style="@style/NumPadKeyButton"
-        app:digit="3" />
-
-    <!-- Row 2 -->
-    <com.android.keyguard.NumPadKey
-        android:id="@+id/key4"
-        style="@style/NumPadKeyButton"
-        app:digit="4" />
-    <com.android.keyguard.NumPadKey
-        android:id="@+id/key5"
-        style="@style/NumPadKeyButton.MiddleColumn"
-        app:digit="5" />
-    <com.android.keyguard.NumPadKey
-        android:id="@+id/key6"
-        style="@style/NumPadKeyButton"
-        app:digit="6" />
-
-    <!-- Row 3 -->
-    <com.android.keyguard.NumPadKey
-        android:id="@+id/key7"
-        style="@style/NumPadKeyButton"
-        app:digit="7" />
-    <com.android.keyguard.NumPadKey
-        android:id="@+id/key8"
-        style="@style/NumPadKeyButton.MiddleColumn"
-        app:digit="8" />
-    <com.android.keyguard.NumPadKey
-        android:id="@+id/key9"
-        style="@style/NumPadKeyButton"
-        app:digit="9" />
-
-    <!-- Row 4 -->
-    <ImageButton
-        android:id="@+id/delete_button"
-        style="@style/NumPadKeyButton.LastRow"
-        android:gravity="center_vertical"
-        android:src="@drawable/ic_backspace"
-        android:clickable="true"
-        android:tint="@android:color/white"
-        android:background="@drawable/ripple_drawable"
-        android:contentDescription="@string/keyboardview_keycode_delete" />
-    <com.android.keyguard.NumPadKey
-        android:id="@+id/key0"
-        style="@style/NumPadKeyButton.LastRow.MiddleColumn"
-        app:digit="0" />
-    <ImageButton
-        android:id="@+id/key_enter"
-        style="@style/NumPadKeyButton.LastRow"
-        android:src="@drawable/ic_done"
-        android:tint="@android:color/white"
-        android:background="@drawable/ripple_drawable"
-        android:contentDescription="@string/keyboardview_keycode_enter" />
-</merge>
-
diff --git a/packages/CarSystemUI/res-keyguard/values-h1000dp/dimens.xml b/packages/CarSystemUI/res-keyguard/values-h1000dp/dimens.xml
deleted file mode 100644
index d055efa..0000000
--- a/packages/CarSystemUI/res-keyguard/values-h1000dp/dimens.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License")
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<resources>
-    <dimen name="pin_pattern_pad_margin_vertical">178dp</dimen>
-</resources>
diff --git a/packages/CarSystemUI/res-keyguard/values-land/dimens.xml b/packages/CarSystemUI/res-keyguard/values-land/dimens.xml
deleted file mode 100644
index c39e0e4..0000000
--- a/packages/CarSystemUI/res-keyguard/values-land/dimens.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License")
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<resources>
-    <dimen name="num_pad_key_margin_horizontal">@*android:dimen/car_padding_5</dimen>
-    <dimen name="num_pad_key_margin_bottom">@*android:dimen/car_padding_4</dimen>
-</resources>
diff --git a/packages/CarSystemUI/res-keyguard/values/colors.xml b/packages/CarSystemUI/res-keyguard/values/colors.xml
deleted file mode 100644
index ba9f060..0000000
--- a/packages/CarSystemUI/res-keyguard/values/colors.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License")
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-<resources>
-    <color name="button_background">@*android:color/car_dark_blue_grey_600</color>
-    <color name="button_text">@android:color/white</color>
-</resources>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res-keyguard/values/dimens.xml b/packages/CarSystemUI/res-keyguard/values/dimens.xml
deleted file mode 100644
index 8dfe171..0000000
--- a/packages/CarSystemUI/res-keyguard/values/dimens.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2017, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License")
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<resources>
-    <dimen name="num_pad_margin_left">112dp</dimen>
-    <dimen name="num_pad_margin_right">144dp</dimen>
-    <dimen name="num_pad_key_width">80dp</dimen>
-    <dimen name="num_pad_key_height">80dp</dimen>
-    <dimen name="num_pad_key_margin_horizontal">@*android:dimen/car_padding_5</dimen>
-    <dimen name="num_pad_key_margin_bottom">@*android:dimen/car_padding_5</dimen>
-    <dimen name="pin_entry_height">@dimen/num_pad_key_height</dimen>
-    <dimen name="divider_height">1dp</dimen>
-    <dimen name="key_enter_margin_top">128dp</dimen>
-    <dimen name="keyguard_pattern_dimension">400dp</dimen>
-    <dimen name="password_field_width">350dp</dimen>
-    <dimen name="pin_pattern_pad_margin_vertical">0dp</dimen>
-</resources>
diff --git a/packages/CarSystemUI/res-keyguard/values/integers.xml b/packages/CarSystemUI/res-keyguard/values/integers.xml
deleted file mode 100644
index bad1346..0000000
--- a/packages/CarSystemUI/res-keyguard/values/integers.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2017, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License")
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<resources>
-    <integer name="password_text_view_scale">40</integer>
-    <integer name="password_max_length">500</integer>
-</resources>
diff --git a/packages/CarSystemUI/res-keyguard/values/styles.xml b/packages/CarSystemUI/res-keyguard/values/styles.xml
deleted file mode 100644
index ecea30a..0000000
--- a/packages/CarSystemUI/res-keyguard/values/styles.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2017, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License")
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <!-- The style for the volume icons in the volume dialog. This style makes the icon scale to
-         fit its container since auto wants the icon to be larger. The padding is added to make it
-         so the icon does not press along the edges of the dialog. -->
-    <style name="NumPadKeyButton">
-        <item name="android:layout_width">@dimen/num_pad_key_width</item>
-        <item name="android:layout_height">@dimen/num_pad_key_height</item>
-        <item name="android:layout_marginBottom">@dimen/num_pad_key_margin_bottom</item>
-        <item name="textView">@id/pinEntry</item>
-    </style>
-
-    <style name="NumPadKeyButton.MiddleColumn">
-        <item name="android:layout_marginStart">@dimen/num_pad_key_margin_horizontal</item>
-        <item name="android:layout_marginEnd">@dimen/num_pad_key_margin_horizontal</item>
-    </style>
-
-    <style name="NumPadKeyButton.LastRow">
-        <item name="android:layout_marginBottom">0dp</item>
-    </style>
-
-    <style name="NumPadKeyButton.LastRow.MiddleColumn">
-        <item name="android:layout_marginStart">@dimen/num_pad_key_margin_horizontal</item>
-        <item name="android:layout_marginEnd">@dimen/num_pad_key_margin_horizontal</item>
-    </style>
-
-    <style name="KeyguardButton" parent="@android:style/Widget.DeviceDefault.Button">
-        <item name="android:background">@drawable/keyguard_button_background</item>
-        <item name="android:textColor">@color/button_text</item>
-        <item name="android:textAllCaps">false</item>
-    </style>
-
-    <style name="Widget.TextView.NumPadKey" parent="@android:style/Widget.TextView">
-        <!-- Only replaces the text size. -->
-        <item name="android:textSize">@*android:dimen/car_body1_size</item>
-    </style>
-</resources>
diff --git a/packages/CarSystemUI/res/anim/car_arrow_fade_in_rotate_down.xml b/packages/CarSystemUI/res/anim/car_arrow_fade_in_rotate_down.xml
deleted file mode 100644
index 74f38d4..0000000
--- a/packages/CarSystemUI/res/anim/car_arrow_fade_in_rotate_down.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-     android:ordering="together">
-  <objectAnimator
-      android:propertyName="rotation"
-      android:duration="0"
-      android:valueFrom="180"
-      android:valueTo="0"
-      android:interpolator="@android:interpolator/fast_out_slow_in" />
-  <objectAnimator
-      android:propertyName="alpha"
-      android:valueFrom="0.0"
-      android:valueTo="1.0"
-      android:valueType="floatType"
-      android:duration="300"
-      android:interpolator="@android:interpolator/fast_out_slow_in" />
-  <objectAnimator
-      android:propertyName="scaleX"
-      android:valueFrom="0.8"
-      android:valueTo="1.0"
-      android:valueType="floatType"
-      android:duration="300"
-      android:interpolator="@android:interpolator/fast_out_slow_in" />
-  <objectAnimator
-      android:propertyName="scaleY"
-      android:valueFrom="0.8"
-      android:valueTo="1.0"
-      android:valueType="floatType"
-      android:duration="300"
-      android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/anim/car_arrow_fade_in_rotate_up.xml b/packages/CarSystemUI/res/anim/car_arrow_fade_in_rotate_up.xml
deleted file mode 100644
index 0f28297..0000000
--- a/packages/CarSystemUI/res/anim/car_arrow_fade_in_rotate_up.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-     android:ordering="together">
-  <objectAnimator
-      android:propertyName="rotation"
-      android:duration="0"
-      android:valueFrom="0"
-      android:valueTo="180"
-      android:interpolator="@android:interpolator/fast_out_slow_in" />
-  <objectAnimator
-      android:propertyName="alpha"
-      android:valueFrom="0.0"
-      android:valueTo="1.0"
-      android:valueType="floatType"
-      android:duration="300"
-      android:interpolator="@android:interpolator/fast_out_slow_in" />
-  <objectAnimator
-      android:propertyName="scaleX"
-      android:valueFrom="0.8"
-      android:valueTo="1.0"
-      android:valueType="floatType"
-      android:duration="300"
-      android:interpolator="@android:interpolator/fast_out_slow_in" />
-  <objectAnimator
-      android:propertyName="scaleY"
-      android:valueFrom="0.8"
-      android:valueTo="1.0"
-      android:valueType="floatType"
-      android:duration="300"
-      android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/anim/car_arrow_fade_out.xml b/packages/CarSystemUI/res/anim/car_arrow_fade_out.xml
deleted file mode 100644
index e6757d2..0000000
--- a/packages/CarSystemUI/res/anim/car_arrow_fade_out.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-     android:ordering="together">
-  <objectAnimator
-      android:propertyName="alpha"
-      android:valueFrom="1.0"
-      android:valueTo="0.0"
-      android:valueType="floatType"
-      android:duration="300"
-      android:interpolator="@android:interpolator/fast_out_slow_in" />
-  <objectAnimator
-      android:propertyName="scaleX"
-      android:valueFrom="1.0"
-      android:valueTo="0.8"
-      android:valueType="floatType"
-      android:duration="300"
-      android:interpolator="@android:interpolator/fast_out_slow_in" />
-  <objectAnimator
-      android:propertyName="scaleY"
-      android:valueFrom="1.0"
-      android:valueTo="0.8"
-      android:valueType="floatType"
-      android:duration="300"
-      android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/anim/car_user_switcher_close_animation.xml b/packages/CarSystemUI/res/anim/car_user_switcher_close_animation.xml
deleted file mode 100644
index 6f12338..0000000
--- a/packages/CarSystemUI/res/anim/car_user_switcher_close_animation.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<animator xmlns:android="http://schemas.android.com/apk/res/android"
-    android:duration="133"
-    android:valueType="intType"
-    android:valueFrom="@dimen/car_user_switcher_container_height"
-    android:valueTo="0"
-    android:interpolator="@android:interpolator/fast_out_slow_in" />
diff --git a/packages/CarSystemUI/res/anim/car_user_switcher_close_icon_animation.xml b/packages/CarSystemUI/res/anim/car_user_switcher_close_icon_animation.xml
deleted file mode 100644
index 9f8c12e..0000000
--- a/packages/CarSystemUI/res/anim/car_user_switcher_close_icon_animation.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <objectAnimator
-        android:duration="167"
-        android:propertyName="rotation"
-        android:valueType="floatType"
-        android:valueFrom="180"
-        android:valueTo="0"
-        android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/anim/car_user_switcher_close_name_animation.xml b/packages/CarSystemUI/res/anim/car_user_switcher_close_name_animation.xml
deleted file mode 100644
index adc1f72..0000000
--- a/packages/CarSystemUI/res/anim/car_user_switcher_close_name_animation.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <objectAnimator
-        android:duration="83"
-        android:propertyName="alpha"
-        android:valueType="floatType"
-        android:valueFrom="0"
-        android:valueTo="1" />
-</set>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/anim/car_user_switcher_close_pages_animation.xml b/packages/CarSystemUI/res/anim/car_user_switcher_close_pages_animation.xml
deleted file mode 100644
index dec5c05..0000000
--- a/packages/CarSystemUI/res/anim/car_user_switcher_close_pages_animation.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <objectAnimator
-        android:duration="83"
-        android:propertyName="alpha"
-        android:valueType="floatType"
-        android:valueFrom="1"
-        android:valueTo="0" />
-</set>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/anim/car_user_switcher_close_pod_animation.xml b/packages/CarSystemUI/res/anim/car_user_switcher_close_pod_animation.xml
deleted file mode 100644
index 986a9cb..0000000
--- a/packages/CarSystemUI/res/anim/car_user_switcher_close_pod_animation.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-    android:ordering="together" >
-
-    <objectAnimator
-        android:duration="50"
-        android:propertyName="alpha"
-        android:valueType="floatType"
-        android:valueFrom="1"
-        android:valueTo="0" />
-</set>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/anim/car_user_switcher_open_animation.xml b/packages/CarSystemUI/res/anim/car_user_switcher_open_animation.xml
deleted file mode 100644
index 80b38b3..0000000
--- a/packages/CarSystemUI/res/anim/car_user_switcher_open_animation.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<animator xmlns:android="http://schemas.android.com/apk/res/android"
-    android:duration="200"
-    android:valueType="intType"
-    android:valueFrom="0"
-    android:valueTo="@dimen/car_user_switcher_container_height"
-    android:interpolator="@android:interpolator/fast_out_slow_in" />
diff --git a/packages/CarSystemUI/res/anim/car_user_switcher_open_icon_animation.xml b/packages/CarSystemUI/res/anim/car_user_switcher_open_icon_animation.xml
deleted file mode 100644
index 721376c..0000000
--- a/packages/CarSystemUI/res/anim/car_user_switcher_open_icon_animation.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <objectAnimator
-        android:duration="167"
-        android:propertyName="rotation"
-        android:valueType="floatType"
-        android:valueFrom="0"
-        android:valueTo="180"
-        android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/anim/car_user_switcher_open_name_animation.xml b/packages/CarSystemUI/res/anim/car_user_switcher_open_name_animation.xml
deleted file mode 100644
index 246099e..0000000
--- a/packages/CarSystemUI/res/anim/car_user_switcher_open_name_animation.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <objectAnimator
-        android:duration="83"
-        android:startOffset="83"
-        android:propertyName="alpha"
-        android:valueType="floatType"
-        android:valueFrom="1"
-        android:valueTo="0" />
-</set>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/anim/car_user_switcher_open_pages_animation.xml b/packages/CarSystemUI/res/anim/car_user_switcher_open_pages_animation.xml
deleted file mode 100644
index 9a1c642..0000000
--- a/packages/CarSystemUI/res/anim/car_user_switcher_open_pages_animation.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <objectAnimator
-        android:duration="83"
-        android:startOffset="83"
-        android:propertyName="alpha"
-        android:valueType="floatType"
-        android:valueFrom="0"
-        android:valueTo="1" />
-</set>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/anim/car_user_switcher_open_pod_animation.xml b/packages/CarSystemUI/res/anim/car_user_switcher_open_pod_animation.xml
deleted file mode 100644
index 1414b66..0000000
--- a/packages/CarSystemUI/res/anim/car_user_switcher_open_pod_animation.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-    android:ordering="together" >
-
-    <objectAnimator
-        android:duration="167"
-        android:startOffset="67"
-        android:propertyName="translationY"
-        android:valueType="floatType"
-        android:valueFrom="@dimen/car_user_switcher_container_anim_height"
-        android:valueTo="0"
-        android:interpolator="@android:interpolator/fast_out_slow_in" />
-    <objectAnimator
-        android:duration="83"
-        android:startOffset="117"
-        android:propertyName="alpha"
-        android:valueType="floatType"
-        android:valueFrom="0"
-        android:valueTo="1" />
-</set>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_add_circle_round.xml b/packages/CarSystemUI/res/drawable/car_add_circle_round.xml
deleted file mode 100644
index 13c7dd1..0000000
--- a/packages/CarSystemUI/res/drawable/car_add_circle_round.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-    <item>
-        <shape android:shape="oval">
-            <solid
-                android:color="@color/car_user_switcher_add_user_background_color"/>
-            <size
-                android:width="@dimen/car_user_switcher_image_avatar_size"
-                android:height="@dimen/car_user_switcher_image_avatar_size"/>
-        </shape>
-    </item>
-    <item
-        android:drawable="@drawable/car_ic_add_white"
-        android:gravity="center"/>
-</layer-list>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_add_white.xml b/packages/CarSystemUI/res/drawable/car_ic_add_white.xml
deleted file mode 100644
index 9d5ca26..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_add_white.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="@*android:dimen/car_touch_target_size"
-    android:height="@*android:dimen/car_touch_target_size"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-  <path
-      android:fillColor="@color/car_user_switcher_add_user_add_sign_color"
-      android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_apps.xml b/packages/CarSystemUI/res/drawable/car_ic_apps.xml
deleted file mode 100644
index e028a0e..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_apps.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/system_bar_icon_drawing_size"
-        android:height="@dimen/system_bar_icon_drawing_size"
-        android:viewportWidth="44"
-        android:viewportHeight="44">
-    <path
-        android:pathData="M7.33333333 14.6666667L14.6666667 14.6666667L14.6666667 7.33333333L7.33333333 7.33333333L7.33333333 14.6666667ZM18.3333333 36.6666667L25.6666667 36.6666667L25.6666667 29.3333333L18.3333333 29.3333333L18.3333333 36.6666667ZM7.33333333 36.6666667L14.6666667 36.6666667L14.6666667 29.3333333L7.33333333 29.3333333L7.33333333 36.6666667ZM7.33333333 25.6666667L14.6666667 25.6666667L14.6666667 18.3333333L7.33333333 18.3333333L7.33333333 25.6666667ZM18.3333333 25.6666667L25.6666667 25.6666667L25.6666667 18.3333333L18.3333333 18.3333333L18.3333333 25.6666667ZM29.3333333 7.33333333L29.3333333 14.6666667L36.6666667 14.6666667L36.6666667 7.33333333L29.3333333 7.33333333ZM18.3333333 14.6666667L25.6666667 14.6666667L25.6666667 7.33333333L18.3333333 7.33333333L18.3333333 14.6666667ZM29.3333333 25.6666667L36.6666667 25.6666667L36.6666667 18.3333333L29.3333333 18.3333333L29.3333333 25.6666667ZM29.3333333 36.6666667L36.6666667 36.6666667L36.6666667 29.3333333L29.3333333 29.3333333L29.3333333 36.6666667Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_apps_selected.xml b/packages/CarSystemUI/res/drawable/car_ic_apps_selected.xml
deleted file mode 100644
index 9504e61..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_apps_selected.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/system_bar_icon_drawing_size"
-        android:height="@dimen/system_bar_icon_drawing_size"
-        android:viewportWidth="44"
-        android:viewportHeight="44">
-    <path
-        android:pathData="M7.33333333 14.6666667L14.6666667 14.6666667L14.6666667 7.33333333L7.33333333 7.33333333L7.33333333 14.6666667ZM18.3333333 36.6666667L25.6666667 36.6666667L25.6666667 29.3333333L18.3333333 29.3333333L18.3333333 36.6666667ZM7.33333333 36.6666667L14.6666667 36.6666667L14.6666667 29.3333333L7.33333333 29.3333333L7.33333333 36.6666667ZM7.33333333 25.6666667L14.6666667 25.6666667L14.6666667 18.3333333L7.33333333 18.3333333L7.33333333 25.6666667ZM18.3333333 25.6666667L25.6666667 25.6666667L25.6666667 18.3333333L18.3333333 18.3333333L18.3333333 25.6666667ZM29.3333333 7.33333333L29.3333333 14.6666667L36.6666667 14.6666667L36.6666667 7.33333333L29.3333333 7.33333333ZM18.3333333 14.6666667L25.6666667 14.6666667L25.6666667 7.33333333L18.3333333 7.33333333L18.3333333 14.6666667ZM29.3333333 25.6666667L36.6666667 25.6666667L36.6666667 18.3333333L29.3333333 18.3333333L29.3333333 25.6666667ZM29.3333333 36.6666667L36.6666667 36.6666667L36.6666667 29.3333333L29.3333333 29.3333333L29.3333333 36.6666667Z"
-        android:fillColor="@color/car_nav_icon_fill_color_selected" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_arrow.xml b/packages/CarSystemUI/res/drawable/car_ic_arrow.xml
deleted file mode 100644
index cfacbf9..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_arrow.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48.0dp"
-        android:height="48.0dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M14.0,20.0l10.0,10.0 10.0,-10.0z"/>
-</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_arrow_drop_up.xml b/packages/CarSystemUI/res/drawable/car_ic_arrow_drop_up.xml
deleted file mode 100644
index 81e7262..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_arrow_drop_up.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48.0dp"
-        android:height="48.0dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M14 28l10-10 10 10z"/>
-</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_home.xml b/packages/CarSystemUI/res/drawable/car_ic_home.xml
deleted file mode 100644
index c78f0ed..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_home.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/system_bar_icon_drawing_size"
-        android:height="@dimen/system_bar_icon_drawing_size"
-        android:viewportWidth="24"
-        android:viewportHeight="24">
-    <path
-        android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_home_selected.xml b/packages/CarSystemUI/res/drawable/car_ic_home_selected.xml
deleted file mode 100644
index 16192df..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_home_selected.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/system_bar_icon_drawing_size"
-        android:height="@dimen/system_bar_icon_drawing_size"
-        android:viewportWidth="24"
-        android:viewportHeight="24">
-    <path
-        android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z"
-        android:fillColor="@color/car_nav_icon_fill_color_selected" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_hvac.xml b/packages/CarSystemUI/res/drawable/car_ic_hvac.xml
deleted file mode 100644
index 55c968e..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_hvac.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2018 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/system_bar_icon_drawing_size"
-        android:height="@dimen/system_bar_icon_drawing_size"
-        android:viewportWidth="24"
-        android:viewportHeight="24">
-    <path
-        android:pathData="M16.34,8.36l-2.29,0.82c-0.18,-0.13 -0.38,-0.25 -0.58,-0.34c0.17,-0.83 0.63,-1.58 1.36,-2.06C16.85,5.44 16.18,2 13.39,2C9,2 7.16,5.01 8.36,7.66l0.82,2.29c-0.13,0.18 -0.25,0.38 -0.34,0.58c-0.83,-0.17 -1.58,-0.63 -2.06,-1.36C5.44,7.15 2,7.82 2,10.61c0,4.4 3.01,6.24 5.66,5.03l2.29,-0.82c0.18,0.13 0.38,0.25 0.58,0.34c-0.17,0.83 -0.63,1.58 -1.36,2.06C7.15,18.56 7.82,22 10.61,22c4.4,0 6.24,-3.01 5.03,-5.66l-0.82,-2.29c0.13,-0.18 0.25,-0.38 0.34,-0.58c0.83,0.17 1.58,0.63 2.06,1.36c1.34,2.01 4.77,1.34 4.77,-1.45C22,9 18.99,7.16 16.34,8.36zM12,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5c0,-0.83 0.67,-1.5 1.5,-1.5c0.83,0 1.5,0.67 1.5,1.5C13.5,12.83 12.83,13.5 12,13.5zM10.24,5.22C10.74,4.44 11.89,4 13.39,4c0.79,0 0.71,0.86 0.34,1.11c-1.22,0.81 -2,2.06 -2.25,3.44c-0.21,0.03 -0.42,0.08 -0.62,0.15l-0.68,-1.88C10,6.42 9.86,5.81 10.24,5.22zM6.83,13.82c-0.4,0.18 -1.01,0.32 -1.61,-0.06C4.44,13.26 4,12.11 4,10.61c0,-0.79 0.86,-0.71 1.11,-0.34c0.81,1.22 2.06,2 3.44,2.25c0.03,0.21 0.08,0.42 0.15,0.62L6.83,13.82zM13.76,18.78c-0.5,0.77 -1.65,1.22 -3.15,1.22c-0.79,0 -0.71,-0.86 -0.34,-1.11c1.22,-0.81 2,-2.06 2.25,-3.44c0.21,-0.03 0.42,-0.08 0.62,-0.15l0.68,1.88C14,17.58 14.14,18.18 13.76,18.78zM18.89,13.73c-0.81,-1.22 -2.06,-2 -3.44,-2.25c-0.03,-0.21 -0.08,-0.42 -0.15,-0.62l1.88,-0.68c0.4,-0.18 1.01,-0.32 1.61,0.06c0.77,0.5 1.22,1.65 1.22,3.15C20,14.19 19.14,14.11 18.89,13.73z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_hvac_selected.xml b/packages/CarSystemUI/res/drawable/car_ic_hvac_selected.xml
deleted file mode 100644
index 817b714..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_hvac_selected.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/system_bar_icon_drawing_size"
-        android:height="@dimen/system_bar_icon_drawing_size"
-        android:viewportWidth="24"
-        android:viewportHeight="24">
-    <path
-        android:pathData="M16.34,8.36l-2.29,0.82c-0.18,-0.13 -0.38,-0.25 -0.58,-0.34c0.17,-0.83 0.63,-1.58 1.36,-2.06C16.85,5.44 16.18,2 13.39,2C9,2 7.16,5.01 8.36,7.66l0.82,2.29c-0.13,0.18 -0.25,0.38 -0.34,0.58c-0.83,-0.17 -1.58,-0.63 -2.06,-1.36C5.44,7.15 2,7.82 2,10.61c0,4.4 3.01,6.24 5.66,5.03l2.29,-0.82c0.18,0.13 0.38,0.25 0.58,0.34c-0.17,0.83 -0.63,1.58 -1.36,2.06C7.15,18.56 7.82,22 10.61,22c4.4,0 6.24,-3.01 5.03,-5.66l-0.82,-2.29c0.13,-0.18 0.25,-0.38 0.34,-0.58c0.83,0.17 1.58,0.63 2.06,1.36c1.34,2.01 4.77,1.34 4.77,-1.45C22,9 18.99,7.16 16.34,8.36zM12,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5c0,-0.83 0.67,-1.5 1.5,-1.5c0.83,0 1.5,0.67 1.5,1.5C13.5,12.83 12.83,13.5 12,13.5zM10.24,5.22C10.74,4.44 11.89,4 13.39,4c0.79,0 0.71,0.86 0.34,1.11c-1.22,0.81 -2,2.06 -2.25,3.44c-0.21,0.03 -0.42,0.08 -0.62,0.15l-0.68,-1.88C10,6.42 9.86,5.81 10.24,5.22zM6.83,13.82c-0.4,0.18 -1.01,0.32 -1.61,-0.06C4.44,13.26 4,12.11 4,10.61c0,-0.79 0.86,-0.71 1.11,-0.34c0.81,1.22 2.06,2 3.44,2.25c0.03,0.21 0.08,0.42 0.15,0.62L6.83,13.82zM13.76,18.78c-0.5,0.77 -1.65,1.22 -3.15,1.22c-0.79,0 -0.71,-0.86 -0.34,-1.11c1.22,-0.81 2,-2.06 2.25,-3.44c0.21,-0.03 0.42,-0.08 0.62,-0.15l0.68,1.88C14,17.58 14.14,18.18 13.76,18.78zM18.89,13.73c-0.81,-1.22 -2.06,-2 -3.44,-2.25c-0.03,-0.21 -0.08,-0.42 -0.15,-0.62l1.88,-0.68c0.4,-0.18 1.01,-0.32 1.61,0.06c0.77,0.5 1.22,1.65 1.22,3.15C20,14.19 19.14,14.11 18.89,13.73z"
-        android:fillColor="@color/car_nav_icon_fill_color_selected" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_keyboard_arrow_down.xml b/packages/CarSystemUI/res/drawable/car_ic_keyboard_arrow_down.xml
deleted file mode 100644
index 3709aa5..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_keyboard_arrow_down.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~
-  ~ Copyright (C) 2018 Google Inc.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  ~
- -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="44dp"
-    android:height="44dp"
-    android:viewportWidth="48.0"
-    android:viewportHeight="48.0">
-  <path
-      android:pathData="M14.83 16.42L24 25.59l9.17-9.17L36 19.25l-12 12-12-12z"
-      android:fillColor="#ffffff"/>
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_music.xml b/packages/CarSystemUI/res/drawable/car_ic_music.xml
deleted file mode 100644
index 6339ebb..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_music.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M22 5.5L22 24.8416667C20.9183333 24.2183333 19.6716667 23.8333333 18.3333333 23.8333333C14.2816667 23.8333333 11 27.115 11 31.1666667C11 35.2183333 14.2816667 38.5 18.3333333 38.5C22.385 38.5 25.6666667 35.2183333 25.6666667 31.1666667L25.6666667 12.8333333L33 12.8333333L33 5.5L22 5.5Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_music_selected.xml b/packages/CarSystemUI/res/drawable/car_ic_music_selected.xml
deleted file mode 100644
index a56bcb3..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_music_selected.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="44"
-        android:viewportHeight="44"
-        android:width="44dp"
-        android:height="44dp">
-    <path
-        android:pathData="M22 5.5L22 24.8416667C20.9183333 24.2183333 19.6716667 23.8333333 18.3333333 23.8333333C14.2816667 23.8333333 11 27.115 11 31.1666667C11 35.2183333 14.2816667 38.5 18.3333333 38.5C22.385 38.5 25.6666667 35.2183333 25.6666667 31.1666667L25.6666667 12.8333333L33 12.8333333L33 5.5L22 5.5Z"
-        android:fillColor="@color/car_nav_icon_fill_color_selected" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_navigation.xml b/packages/CarSystemUI/res/drawable/car_ic_navigation.xml
deleted file mode 100644
index e1fabe0..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_navigation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M39.8016667 20.6983333L23.3016667 4.19833333C22.5866667 3.48333333 21.4316667 3.48333333 20.7166667 4.19833333L4.21666667 20.6983333C3.50166667 21.4133333 3.50166667 22.5683333 4.21666667 23.2833333L20.7166667 39.7833333C21.4316667 40.4983333 22.5866667 40.4983333 23.3016667 39.7833333L39.8016667 23.2833333C40.5166667 22.5866667 40.5166667 21.4316667 39.8016667 20.6983333ZM25.6666667 26.5833333L25.6666667 22L18.3333333 22L18.3333333 27.5L14.6666667 27.5L14.6666667 20.1666667C14.6666667 19.1583333 15.4916667 18.3333333 16.5 18.3333333L25.6666667 18.3333333L25.6666667 13.75L32.0833333 20.1666667L25.6666667 26.5833333Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_navigation_selected.xml b/packages/CarSystemUI/res/drawable/car_ic_navigation_selected.xml
deleted file mode 100644
index d11cf28..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_navigation_selected.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="44"
-        android:viewportHeight="44"
-        android:width="44dp"
-        android:height="44dp">
-    <path
-        android:pathData="M39.8016667 20.6983333L23.3016667 4.19833333C22.5866667 3.48333333 21.4316667 3.48333333 20.7166667 4.19833333L4.21666667 20.6983333C3.50166667 21.4133333 3.50166667 22.5683333 4.21666667 23.2833333L20.7166667 39.7833333C21.4316667 40.4983333 22.5866667 40.4983333 23.3016667 39.7833333L39.8016667 23.2833333C40.5166667 22.5866667 40.5166667 21.4316667 39.8016667 20.6983333ZM25.6666667 26.5833333L25.6666667 22L18.3333333 22L18.3333333 27.5L14.6666667 27.5L14.6666667 20.1666667C14.6666667 19.1583333 15.4916667 18.3333333 16.5 18.3333333L25.6666667 18.3333333L25.6666667 13.75L32.0833333 20.1666667L25.6666667 26.5833333Z"
-        android:fillColor="@color/car_nav_icon_fill_color_selected" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_notification.xml b/packages/CarSystemUI/res/drawable/car_ic_notification.xml
deleted file mode 100644
index aabf916..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_notification.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/system_bar_icon_drawing_size"
-        android:height="@dimen/system_bar_icon_drawing_size"
-        android:viewportWidth="44"
-        android:viewportHeight="44">
-    <path
-        android:pathData="M22 39.125C23.925 39.125 25.5 37.55 25.5 35.625L18.5 35.625C18.5 37.55 20.0575 39.125 22 39.125ZM32.5 28.625L32.5 19.875C32.5 14.5025 29.63 10.005 24.625 8.815L24.625 7.625C24.625 6.1725 23.4525 5 22 5C20.5475 5 19.375 6.1725 19.375 7.625L19.375 8.815C14.3525 10.005 11.5 14.485 11.5 19.875L11.5 28.625L8 32.125L8 33.875L36 33.875L36 32.125L32.5 28.625Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_overview.xml b/packages/CarSystemUI/res/drawable/car_ic_overview.xml
deleted file mode 100644
index f185eb9..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_overview.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M36.92857 22.39286A14.53571 14.53571 0 0 1 7.857143 22.39286A14.53571 14.53571 0 0 1 36.92857 22.39286Z"
-        android:strokeColor="@color/car_nav_icon_fill_color"
-        android:strokeWidth="4" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_overview_selected.xml b/packages/CarSystemUI/res/drawable/car_ic_overview_selected.xml
deleted file mode 100644
index 19b5583..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_overview_selected.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="44"
-        android:viewportHeight="44"
-        android:width="44dp"
-        android:height="44dp">
-    <path
-        android:pathData="M36.92857 22.39286A14.53571 14.53571 0 0 1 7.857143 22.39286A14.53571 14.53571 0 0 1 36.92857 22.39286Z"
-        android:strokeColor="@color/car_nav_icon_fill_color_selected"
-        android:strokeWidth="4" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_phone.xml b/packages/CarSystemUI/res/drawable/car_ic_phone.xml
deleted file mode 100644
index 50e36b5..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_phone.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M12.1366667 19.7816667C14.7766667 24.97 19.03 29.205 24.2183333 31.8633333L28.2516667 27.83C28.7466667 27.335 29.48 27.17 30.1216667 27.39C32.175 28.0683333 34.3933333 28.435 36.6666667 28.435C37.675 28.435 38.5 29.26 38.5 30.2683333L38.5 36.6666667C38.5 37.675 37.675 38.5 36.6666667 38.5C19.4516667 38.5 5.5 24.5483333 5.5 7.33333333C5.5 6.325 6.325 5.5 7.33333333 5.5L13.75 5.5C14.7583333 5.5 15.5833333 6.325 15.5833333 7.33333333C15.5833333 9.625 15.95 11.825 16.6283333 13.8783333C16.83 14.52 16.6833333 15.235 16.17 15.7483333L12.1366667 19.7816667Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_phone_selected.xml b/packages/CarSystemUI/res/drawable/car_ic_phone_selected.xml
deleted file mode 100644
index 11b1687..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_phone_selected.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="44"
-        android:viewportHeight="44"
-        android:width="44dp"
-        android:height="44dp">
-    <path
-        android:pathData="M12.1366667 19.7816667C14.7766667 24.97 19.03 29.205 24.2183333 31.8633333L28.2516667 27.83C28.7466667 27.335 29.48 27.17 30.1216667 27.39C32.175 28.0683333 34.3933333 28.435 36.6666667 28.435C37.675 28.435 38.5 29.26 38.5 30.2683333L38.5 36.6666667C38.5 37.675 37.675 38.5 36.6666667 38.5C19.4516667 38.5 5.5 24.5483333 5.5 7.33333333C5.5 6.325 6.325 5.5 7.33333333 5.5L13.75 5.5C14.7583333 5.5 15.5833333 6.325 15.5833333 7.33333333C15.5833333 9.625 15.95 11.825 16.6283333 13.8783333C16.83 14.52 16.6833333 15.235 16.17 15.7483333L12.1366667 19.7816667Z"
-        android:fillColor="@color/car_nav_icon_fill_color_selected" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml b/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml
deleted file mode 100644
index 12993f5..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="70dp"
-    android:height="70dp"
-    android:viewportHeight="70.0"
-    android:viewportWidth="70.0">
-    <path
-        android:fillColor="?android:attr/colorAccent"
-        android:fillType="evenOdd"
-        android:pathData="M4,0L66,0A4,4 0,0 1,70 4L70,66A4,4 0,0 1,66 70L4,70A4,4 0,0 1,0 66L0,4A4,4 0,0 1,4 0z"
-        android:strokeColor="#00000000"
-        android:strokeWidth="1"/>
-</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_settings_icon.xml b/packages/CarSystemUI/res/drawable/car_ic_settings_icon.xml
deleted file mode 100644
index 147f539..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_settings_icon.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="@*android:dimen/status_bar_system_icon_size"
-    android:height="@*android:dimen/status_bar_system_icon_size"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-  <path
-      android:fillColor="@color/system_bar_icon_color"
-      android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4C9.75,2 9.54,2.18 9.51,2.42L9.13,5.07C8.52,5.32 7.96,5.66 7.44,6.05l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46C2.21,8.95 2.27,9.22 2.46,9.37l2.11,1.65C4.53,11.34 4.5,11.67 4.5,12s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65C9.54,21.82 9.75,22 10,22h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64L19.43,12.98zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5s3.5,1.57 3.5,3.5S13.93,15.5 12,15.5z"/>
-</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_unseen_indicator.xml b/packages/CarSystemUI/res/drawable/car_ic_unseen_indicator.xml
deleted file mode 100644
index 025fc9c..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_unseen_indicator.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="44"
-        android:viewportHeight="44"
-        android:width="44dp"
-        android:height="44dp">
-  <group
-      android:translateX="30"
-      android:translateY="2">
-    <path
-        android:fillColor="@color/car_nav_unseen_indicator_color"
-        android:strokeWidth="1"
-        android:pathData="M 6 0 C 9.31370849898 0 12 2.68629150102 12 6 C 12 9.31370849898 9.31370849898 12 6 12 C 2.68629150102 12 0 9.31370849898 0 6 C 0 2.68629150102 2.68629150102 0 6 0 Z" />
-  </group>
-</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_user_icon.xml b/packages/CarSystemUI/res/drawable/car_ic_user_icon.xml
deleted file mode 100644
index 270d932..0000000
--- a/packages/CarSystemUI/res/drawable/car_ic_user_icon.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="@dimen/system_bar_icon_drawing_size"
-    android:height="@dimen/system_bar_icon_drawing_size"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-  <path
-      android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"
-      android:fillColor="@color/system_bar_icon_color"/>
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_rounded_bg_bottom.xml b/packages/CarSystemUI/res/drawable/car_rounded_bg_bottom.xml
deleted file mode 100644
index 07227fb..0000000
--- a/packages/CarSystemUI/res/drawable/car_rounded_bg_bottom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-       android:shape="rectangle">
-    <solid android:color="?android:attr/colorBackgroundFloating" />
-    <corners
-        android:bottomLeftRadius="@*android:dimen/car_radius_3"
-        android:topLeftRadius="0dp"
-        android:bottomRightRadius="@*android:dimen/car_radius_3"
-        android:topRightRadius="0dp"
-        />
-</shape>
diff --git a/packages/CarSystemUI/res/drawable/car_seekbar_thumb.xml b/packages/CarSystemUI/res/drawable/car_seekbar_thumb.xml
deleted file mode 100644
index 2649a00..0000000
--- a/packages/CarSystemUI/res/drawable/car_seekbar_thumb.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-    <item>
-        <shape android:shape="oval">
-            <padding
-                android:bottom="@*android:dimen/car_padding_1"
-                android:left="@*android:dimen/car_padding_1"
-                android:right="@*android:dimen/car_padding_1"
-                android:top="@*android:dimen/car_padding_1"/>
-            <solid android:color="@android:color/black"/>
-        </shape>
-    </item>
-    <item>
-        <shape android:shape="oval">
-            <solid android:color="@*android:color/car_accent"/>
-            <size
-                android:width="@*android:dimen/car_seekbar_thumb_size"
-                android:height="@*android:dimen/car_seekbar_thumb_size"/>
-        </shape>
-    </item>
-</layer-list>
diff --git a/packages/CarSystemUI/res/drawable/car_stat_sys_data_bluetooth_indicator.xml b/packages/CarSystemUI/res/drawable/car_stat_sys_data_bluetooth_indicator.xml
deleted file mode 100644
index 34578fe..0000000
--- a/packages/CarSystemUI/res/drawable/car_stat_sys_data_bluetooth_indicator.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-Copyright (C) 2018 The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="17dp"
-        android:height="17dp"
-        android:viewportWidth="18.0"
-        android:viewportHeight="18.0">
-    <group
-        android:translateY="0.5"
-        android:translateX="0.5" >
-        <path
-            android:pathData="M9.57,8.5l2.79,-2.78c0.3,-0.3 0.3,-0.8 0,-1.1L9.04,1.29L9.02,1.27C8.7,0.98 8.21,1 7.91,1.31C7.78,1.45 7.71,1.64 7.71,1.84v4.79L4.69,3.61c-0.3,-0.3 -0.79,-0.3 -1.09,0s-0.3,0.79 0,1.09L7.39,8.5L3.6,12.29c-0.3,0.3 -0.3,0.79 0,1.09s0.79,0.3 1.09,0l3.01,-3.01v4.8c0,0.42 0.35,0.77 0.77,0.77c0.19,0 0.39,-0.07 0.53,-0.21l0.04,-0.04l3.32,-3.32c0.3,-0.3 0.3,-0.8 0,-1.1L9.57,8.5zM9.19,6.77v-3.2l1.6,1.6L9.19,6.77zM9.19,13.42v-3.2l1.6,1.6L9.19,13.42zM4.03,9.29c-0.44,0.44 -1.15,0.44 -1.58,0C2.02,8.86 2.02,8.16 2.45,7.72l0.01,-0.01C2.89,7.27 3.59,7.27 4.02,7.7l0.01,0.01C4.47,8.15 4.47,8.85 4.03,9.29zM14.44,7.71c0.44,0.44 0.44,1.15 0,1.58c-0.44,0.44 -1.15,0.44 -1.58,0c-0.44,-0.43 -0.44,-1.13 -0.01,-1.57l0.01,-0.01C13.3,7.28 14,7.27 14.43,7.7C14.44,7.7 14.44,7.71 14.44,7.71z"
-            android:fillColor="#FFFFFF"/>
-    </group>
-</vector>
diff --git a/packages/CarSystemUI/res/drawable/hvac_decrease_button.xml b/packages/CarSystemUI/res/drawable/hvac_decrease_button.xml
deleted file mode 100644
index 656e94a..0000000
--- a/packages/CarSystemUI/res/drawable/hvac_decrease_button.xml
+++ /dev/null
@@ -1,53 +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.
-  -->
-
-<layer-list
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:aapt="http://schemas.android.com/aapt">
-    <item android:gravity="center"
-          android:width="@dimen/system_bar_icon_drawing_size"
-          android:height="@dimen/system_bar_icon_drawing_size">
-        <aapt:attr name="android:drawable">
-            <shape android:shape="oval">
-                <size
-                    android:width="@dimen/system_bar_icon_drawing_size"
-                    android:height="@dimen/system_bar_icon_drawing_size"/>
-                <solid
-                    android:color="@color/hvac_temperature_adjust_button_color"/>
-            </shape>
-        </aapt:attr>
-    </item>
-    <item android:gravity="center"
-          android:width="@dimen/system_bar_icon_drawing_size"
-          android:height="@dimen/system_bar_icon_drawing_size">
-        <aapt:attr name="android:drawable">
-            <vector android:width="@dimen/system_bar_icon_drawing_size"
-                    android:height="@dimen/system_bar_icon_drawing_size"
-                    android:viewportWidth="24.0"
-                    android:viewportHeight="24.0">
-                <path
-                    android:fillColor="@color/hvac_temperature_decrease_arrow_color"
-                    android:pathData="M14,7l-5,5 5,5V7z"/>
-            </vector>
-        </aapt:attr>
-    </item>
-    <item>
-        <aapt:attr name="android:drawable">
-            <ripple android:color="?android:attr/colorControlHighlight"/>
-        </aapt:attr>
-    </item>
-</layer-list>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/hvac_increase_button.xml b/packages/CarSystemUI/res/drawable/hvac_increase_button.xml
deleted file mode 100644
index 57c07c8..0000000
--- a/packages/CarSystemUI/res/drawable/hvac_increase_button.xml
+++ /dev/null
@@ -1,53 +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.
-  -->
-
-<layer-list
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:aapt="http://schemas.android.com/aapt">
-    <item android:gravity="center"
-          android:width="@dimen/system_bar_icon_drawing_size"
-          android:height="@dimen/system_bar_icon_drawing_size">
-        <aapt:attr name="android:drawable">
-            <shape android:shape="oval">
-                <size
-                    android:width="@dimen/system_bar_icon_drawing_size"
-                    android:height="@dimen/system_bar_icon_drawing_size"/>
-                <solid
-                    android:color="@color/hvac_temperature_adjust_button_color"/>
-            </shape>
-        </aapt:attr>
-    </item>
-    <item android:gravity="center"
-          android:width="@dimen/system_bar_icon_drawing_size"
-          android:height="@dimen/system_bar_icon_drawing_size">
-        <aapt:attr name="android:drawable">
-            <vector android:width="@dimen/system_bar_icon_drawing_size"
-                    android:height="@dimen/system_bar_icon_drawing_size"
-                    android:viewportWidth="24.0"
-                    android:viewportHeight="24.0">
-                <path
-                    android:fillColor="@color/hvac_temperature_increase_arrow_color"
-                    android:pathData="M10,17l5,-5 -5,-5v10z"/>
-            </vector>
-        </aapt:attr>
-    </item>
-    <item>
-        <aapt:attr name="android:drawable">
-            <ripple android:color="?android:attr/colorControlHighlight"/>
-        </aapt:attr>
-    </item>
-</layer-list>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/ic_mic_white.xml b/packages/CarSystemUI/res/drawable/ic_mic_white.xml
deleted file mode 100644
index 71fcc53..0000000
--- a/packages/CarSystemUI/res/drawable/ic_mic_white.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/system_bar_icon_drawing_size"
-        android:height="@dimen/system_bar_icon_drawing_size"
-        android:viewportWidth="44"
-        android:viewportHeight="44">
-<path
-        android:pathData="M22 25.6666667C25.0433333 25.6666667 27.4816667 23.21 27.4816667 20.1666667L27.5 9.16666667C27.5 6.12333333 25.0433333 3.66666667 22 3.66666667C18.9566667 3.66666667 16.5 6.12333333 16.5 9.16666667L16.5 20.1666667C16.5 23.21 18.9566667 25.6666667 22 25.6666667ZM31.7166667 20.1666667C31.7166667 25.6666667 27.06 29.5166667 22 29.5166667C16.94 29.5166667 12.2833333 25.6666667 12.2833333 20.1666667L9.16666667 20.1666667C9.16666667 26.4183333 14.1533333 31.5883333 20.1666667 32.4866667L20.1666667 38.5L23.8333333 38.5L23.8333333 32.4866667C29.8466667 31.6066667 34.8333333 26.4366667 34.8333333 20.1666667L31.7166667 20.1666667Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/notification_handle_bar.xml b/packages/CarSystemUI/res/drawable/notification_handle_bar.xml
deleted file mode 100644
index 5ed7499..0000000
--- a/packages/CarSystemUI/res/drawable/notification_handle_bar.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2019 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<ripple
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="@android:color/white">
-    <item>
-        <shape android:shape="rectangle">
-            <corners android:radius="@dimen/clear_all_button_radius"/>
-            <solid android:color="@android:color/white"/>
-        </shape>
-    </item>
-</ripple>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/notification_material_bg.xml b/packages/CarSystemUI/res/drawable/notification_material_bg.xml
deleted file mode 100644
index 03746c8..0000000
--- a/packages/CarSystemUI/res/drawable/notification_material_bg.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="@color/notification_ripple_untinted_color">
-    <item>
-        <shape xmlns:android="http://schemas.android.com/apk/res/android">
-            <solid android:color="@color/notification_material_background_color"/>
-            <corners
-                android:radius="@dimen/notification_shadow_radius"/>
-        </shape>
-    </item>
-</ripple>
diff --git a/packages/CarSystemUI/res/drawable/notification_material_bg_dim.xml b/packages/CarSystemUI/res/drawable/notification_material_bg_dim.xml
deleted file mode 100644
index 03746c8..0000000
--- a/packages/CarSystemUI/res/drawable/notification_material_bg_dim.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="@color/notification_ripple_untinted_color">
-    <item>
-        <shape xmlns:android="http://schemas.android.com/apk/res/android">
-            <solid android:color="@color/notification_material_background_color"/>
-            <corners
-                android:radius="@dimen/notification_shadow_radius"/>
-        </shape>
-    </item>
-</ripple>
diff --git a/packages/CarSystemUI/res/drawable/stat_sys_signal_null.xml b/packages/CarSystemUI/res/drawable/stat_sys_signal_null.xml
deleted file mode 100644
index 2b487f9e..0000000
--- a/packages/CarSystemUI/res/drawable/stat_sys_signal_null.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-Copyright (C) 2014 The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:autoMirrored="true"
-        android:width="17dp"
-        android:height="17dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="?attr/backgroundColor"
-        android:pathData="M2.000000,22.000000l20.000000,0.000000L22.000000,2.000000L2.000000,22.000000zM20.000000,20.000000L6.800000,20.000000L20.000000,6.800000L20.000000,20.000000z"/>
-</vector>
diff --git a/packages/CarSystemUI/res/drawable/system_bar_background_pill.xml b/packages/CarSystemUI/res/drawable/system_bar_background_pill.xml
deleted file mode 100644
index 51d2b9d..0000000
--- a/packages/CarSystemUI/res/drawable/system_bar_background_pill.xml
+++ /dev/null
@@ -1,33 +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.
-  -->
-<layer-list
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:aapt="http://schemas.android.com/aapt">
-    <item>
-        <aapt:attr name="android:drawable">
-            <shape android:shape="rectangle">
-                <solid android:color="@color/system_bar_background_pill_color"/>
-                <corners android:radius="30dp"/>
-            </shape>
-        </aapt:attr>
-    </item>
-    <item>
-        <aapt:attr name="android:drawable">
-            <ripple android:color="?android:attr/colorControlHighlight"/>
-        </aapt:attr>
-    </item>
-</layer-list>
diff --git a/packages/CarSystemUI/res/drawable/volume_dialog_background.xml b/packages/CarSystemUI/res/drawable/volume_dialog_background.xml
deleted file mode 100644
index fa3ca8f..0000000
--- a/packages/CarSystemUI/res/drawable/volume_dialog_background.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <solid android:color="?android:attr/colorBackgroundFloating"/>
-    <padding
-        android:bottom="5dp"
-        android:left="5dp"
-        android:right="5dp"
-        android:top="5dp"/>
-    <corners android:bottomLeftRadius="20dp"
-        android:bottomRightRadius="20dp"/>
-</shape>
diff --git a/packages/CarSystemUI/res/layout/adjustable_temperature_view.xml b/packages/CarSystemUI/res/layout/adjustable_temperature_view.xml
deleted file mode 100644
index d197409..0000000
--- a/packages/CarSystemUI/res/layout/adjustable_temperature_view.xml
+++ /dev/null
@@ -1,50 +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="wrap_content"
-    android:layout_height="wrap_content"
-    android:orientation="horizontal"
-    android:gravity="center_vertical"
-    android:paddingEnd="@dimen/hvac_container_padding"
-    android:paddingStart="@dimen/hvac_container_padding">
-
-    <ImageView
-        android:id="@+id/hvac_decrease_button"
-        android:layout_width="@dimen/hvac_temperature_button_size"
-        android:layout_height="@dimen/hvac_temperature_button_size"
-        android:scaleType="center"
-        android:src="@drawable/hvac_decrease_button"/>
-
-    <TextView
-        android:id="@+id/hvac_temperature_text"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:textSize="@dimen/hvac_temperature_text_size"
-        android:textColor="@color/system_bar_text_color"
-        android:paddingStart="@dimen/hvac_temperature_text_padding"
-        android:paddingEnd="@dimen/hvac_temperature_text_padding"
-        android:gravity="center"/>
-
-    <ImageView
-        android:id="@+id/hvac_increase_button"
-        android:layout_width="@dimen/hvac_temperature_button_size"
-        android:layout_height="@dimen/hvac_temperature_button_size"
-        android:scaleType="center"
-        android:src="@drawable/hvac_increase_button" />
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/layout/car_fullscreen_user_pod.xml b/packages/CarSystemUI/res/layout/car_fullscreen_user_pod.xml
deleted file mode 100644
index a2a628d..0000000
--- a/packages/CarSystemUI/res/layout/car_fullscreen_user_pod.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-     Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:clipChildren="false"
-    android:alpha="0"
-    android:layout_height="wrap_content"
-    android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:gravity="center">
-
-    <ImageView
-        android:id="@+id/user_avatar"
-        android:layout_width="@dimen/car_user_switcher_image_avatar_size"
-        android:layout_height="@dimen/car_user_switcher_image_avatar_size"
-        android:background="?android:attr/selectableItemBackground"
-        android:gravity="center"/>
-
-    <TextView
-        android:id="@+id/user_name"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/car_user_switcher_vertical_spacing_between_name_and_avatar"
-        android:textSize="@dimen/car_user_switcher_name_text_size"
-        android:textColor="@color/car_user_switcher_name_text_color"
-        android:ellipsize="end"
-        android:singleLine="true"
-        android:gravity="center"/>
-
-</LinearLayout>
diff --git a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml b/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml
deleted file mode 100644
index 534c51e..0000000
--- a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/fullscreen_user_switcher"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@color/car_user_switcher_background_color">
-
-    <LinearLayout
-        android:id="@+id/container"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_alignParentTop="true"
-        android:orientation="vertical">
-
-        <include
-            layout="@layout/car_status_bar_header"
-            android:layout_alignParentTop="true"
-            android:theme="@android:style/Theme"/>
-
-
-        <FrameLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent">
-            <com.android.systemui.car.userswitcher.UserGridRecyclerView
-                android:id="@+id/user_grid"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:layout_marginTop="@dimen/car_user_switcher_margin_top"/>
-        </FrameLayout>
-
-    </LinearLayout>
-</FrameLayout>
diff --git a/packages/CarSystemUI/res/layout/car_left_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_left_navigation_bar.xml
deleted file mode 100644
index 94816f8..0000000
--- a/packages/CarSystemUI/res/layout/car_left_navigation_bar.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:background="@drawable/system_bar_background">
-
-    <LinearLayout
-        android:layout_height="match_parent"
-        android:layout_width="match_parent"
-        android:id="@+id/nav_buttons"
-        android:orientation="vertical"
-        android:gravity="top"
-        android:paddingTop="30dp"
-        android:layout_weight="1"
-        android:animateLayoutChanges="true">
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/home"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-            android:src="@drawable/car_ic_overview"
-            android:background="?android:attr/selectableItemBackground"
-            android:paddingTop="30dp"
-            android:paddingBottom="30dp"
-        />
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/grid"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;component=com.android.car.home/.AppGridActivity;end"
-            systemui:longIntent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-            android:src="@drawable/car_ic_apps"
-            android:background="?android:attr/selectableItemBackground"
-            android:paddingTop="30dp"
-            android:paddingBottom="30dp"
-        />
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/hvac"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
-            systemui:broadcast="true"
-            android:src="@drawable/car_ic_hvac"
-            android:background="?android:attr/selectableItemBackground"
-            android:paddingTop="30dp"
-            android:paddingBottom="30dp"
-        />
-
-    </LinearLayout>
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:gravity="bottom"
-        android:orientation="vertical">
-
-        <com.android.systemui.statusbar.AlphaOptimizedImageView
-            android:id="@+id/note"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            android:src="@drawable/car_ic_notification"
-            android:background="?android:attr/selectableItemBackground"
-            android:paddingTop="20dp"
-            android:paddingBottom="20dp"
-            android:alpha="0.7"
-        />
-
-
-        <com.android.systemui.statusbar.policy.Clock
-            android:id="@+id/clock"
-            android:textAppearance="@style/TextAppearance.StatusBar.Clock"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            android:singleLine="true"
-            android:paddingStart="@dimen/status_bar_clock_starting_padding"
-            android:paddingEnd="@dimen/status_bar_clock_end_padding"
-            android:gravity="center_horizontal"
-            android:paddingBottom="20dp"
-        />
-
-        <Space
-            android:layout_height="10dp"
-            android:layout_width="match_parent"/>
-
-    </LinearLayout>
-
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml b/packages/CarSystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml
deleted file mode 100644
index 9e6dd11..0000000
--- a/packages/CarSystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:background="@drawable/system_bar_background">
-
-    <LinearLayout
-        android:layout_height="match_parent"
-        android:layout_width="match_parent"
-        android:id="@+id/nav_buttons"
-        android:orientation="vertical"
-        android:gravity="top"
-        android:paddingTop="30dp"
-        android:layout_weight="1"
-        android:animateLayoutChanges="true">
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/home"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-            android:src="@drawable/car_ic_overview"
-            android:background="?android:attr/selectableItemBackground"
-            android:paddingTop="30dp"
-            android:paddingBottom="30dp"
-        />
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/hvac"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
-            systemui:broadcast="true"
-            android:src="@drawable/car_ic_hvac"
-            android:background="?android:attr/selectableItemBackground"
-            android:paddingTop="30dp"
-            android:paddingBottom="30dp"
-        />
-    </LinearLayout>
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/car_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_navigation_bar.xml
deleted file mode 100644
index 8314ba5..0000000
--- a/packages/CarSystemUI/res/layout/car_navigation_bar.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@drawable/system_bar_background"
-    android:gravity="center"
-    android:orientation="horizontal">
-
-    <RelativeLayout
-        android:id="@+id/nav_buttons"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layoutDirection="ltr">
-
-        <com.android.systemui.car.hvac.AdjustableTemperatureView
-            android:id="@+id/driver_hvac"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:gravity="center_vertical"
-            systemui:hvacAreaId="49"
-            systemui:hvacTempFormat="%.0f\u00B0" />
-
-        <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_centerInParent="true"
-            android:layout_weight="1"
-            android:gravity="center"
-            android:layoutDirection="ltr"
-            android:paddingEnd="@dimen/system_bar_button_group_padding"
-            android:paddingStart="@dimen/system_bar_button_group_padding">
-
-            <Space
-                android:layout_width="0dp"
-                android:layout_height="match_parent"
-                android:layout_weight="1"/>
-
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/home"
-                style="@style/NavigationBarButton"
-                systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
-                systemui:highlightWhenSelected="true"
-                systemui:icon="@drawable/car_ic_home"
-                systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"/>
-
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/phone_nav"
-                style="@style/NavigationBarButton"
-                systemui:highlightWhenSelected="true"
-                systemui:icon="@drawable/car_ic_phone"
-                systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;package=com.android.car.dialer;launchFlags=0x10000000;end"
-                systemui:packages="com.android.car.dialer"/>
-
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/grid_nav"
-                style="@style/NavigationBarButton"
-                systemui:componentNames="com.android.car.carlauncher/.AppGridActivity"
-                systemui:highlightWhenSelected="true"
-                systemui:icon="@drawable/car_ic_apps"
-                systemui:intent="intent:#Intent;component=com.android.car.carlauncher/.AppGridActivity;launchFlags=0x24000000;end"/>
-
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/hvac"
-                style="@style/NavigationBarButton"
-                systemui:highlightWhenSelected="true"
-                systemui:icon="@drawable/car_ic_hvac"
-                systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
-                systemui:broadcast="true"/>
-
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/notifications"
-                style="@style/NavigationBarButton"
-                systemui:highlightWhenSelected="true"
-                systemui:icon="@drawable/car_ic_notification"
-                systemui:longIntent="intent:#Intent;component=com.android.car.bugreport/.BugReportActivity;end"/>
-
-            <Space
-                android:layout_width="0dp"
-                android:layout_height="match_parent"
-                android:layout_weight="1"/>
-        </LinearLayout>
-
-        <com.android.systemui.car.hvac.AdjustableTemperatureView
-            android:id="@+id/passenger_hvac"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_alignParentEnd="true"
-            android:gravity="center_vertical"
-            systemui:hvacAreaId="68"
-            systemui:hvacTempFormat="%.0f\u00B0" />
-    </RelativeLayout>
-
-    <LinearLayout
-        android:id="@+id/lock_screen_nav_buttons"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:gravity="center"
-        android:layoutDirection="ltr"
-        android:paddingEnd="@dimen/car_keyline_1"
-        android:paddingStart="@dimen/car_keyline_1"
-        android:visibility="gone"
-    />
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml b/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml
deleted file mode 100644
index a040e80..0000000
--- a/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@drawable/system_bar_background"
-    android:orientation="vertical">
-
-    <LinearLayout
-        android:id="@+id/nav_buttons"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:paddingStart="@*android:dimen/car_padding_5"
-        android:paddingEnd="@*android:dimen/car_padding_5">
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/home"
-            android:layout_width="@*android:dimen/car_touch_target_size"
-            android:layout_height="match_parent"
-            android:background="?android:attr/selectableItemBackground"
-            systemui:icon="@drawable/car_ic_overview"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-            systemui:selectedIcon="@drawable/car_ic_overview_selected"
-            systemui:highlightWhenSelected="true"
-        />
-    </LinearLayout>
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
-
diff --git a/packages/CarSystemUI/res/layout/car_navigation_button.xml b/packages/CarSystemUI/res/layout/car_navigation_button.xml
deleted file mode 100644
index 9f79023..0000000
--- a/packages/CarSystemUI/res/layout/car_navigation_button.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-    <FrameLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:id="@+id/car_nav_button_icon"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:animateLayoutChanges="true"
-        android:orientation="vertical">
-
-        <com.android.systemui.statusbar.AlphaOptimizedImageView
-            android:id="@+id/car_nav_button_icon_image"
-            android:layout_height="@dimen/car_navigation_button_icon_height"
-            android:layout_width="match_parent"
-            android:layout_gravity="center"
-            android:animateLayoutChanges="true"
-            android:background="@android:color/transparent"
-            android:scaleType="fitCenter"
-            android:tintMode="src_in"
-            android:tint="@color/car_nav_icon_fill_color_selected"
-            android:clickable="false"
-        />
-
-        <com.android.systemui.statusbar.AlphaOptimizedImageView
-            android:id="@+id/car_nav_button_more_icon"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            android:layout_gravity="center"
-            android:animateLayoutChanges="true"
-            android:src="@drawable/car_ic_arrow"
-            android:background="@android:color/transparent"
-            android:scaleType="fitCenter"
-            android:clickable="false"
-            android:visibility="gone"
-        />
-
-        <ImageView
-            android:id="@+id/car_nav_button_unseen_icon"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            android:layout_gravity="center"
-            android:src="@drawable/car_ic_unseen_indicator"
-            android:background="@android:color/transparent"
-            android:scaleType="fitCenter"
-            android:clickable="false"
-        />
-
-    </FrameLayout>
-</merge>
diff --git a/packages/CarSystemUI/res/layout/car_right_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_right_navigation_bar.xml
deleted file mode 100644
index dc95833..0000000
--- a/packages/CarSystemUI/res/layout/car_right_navigation_bar.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:background="@drawable/system_bar_background">
-
-    <!-- phone.NavigationBarView has rot0 and rot90 but we expect the car head unit to have a fixed
-         rotation so skip this level of the hierarchy.
-    -->
-    <LinearLayout
-        android:layout_height="match_parent"
-        android:layout_width="match_parent"
-        android:id="@+id/nav_buttons"
-        android:orientation="vertical"
-        android:gravity="top"
-        android:paddingTop="30dp"
-        android:layout_weight="1"
-        android:animateLayoutChanges="true">
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/home"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-            android:src="@drawable/car_ic_overview"
-            android:background="?android:attr/selectableItemBackground"
-            android:paddingTop="30dp"
-            android:paddingBottom="30dp"
-        />
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/grid"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;component=com.android.car.home/.AppGridActivity;launchFlags=0x14000000;end"
-            systemui:longIntent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-            android:src="@drawable/car_ic_apps"
-            android:background="?android:attr/selectableItemBackground"
-            android:paddingTop="30dp"
-            android:paddingBottom="30dp"
-        />
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/hvac"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
-            systemui:broadcast="true"
-            android:src="@drawable/car_ic_hvac"
-            android:background="?android:attr/selectableItemBackground"
-            android:paddingTop="30dp"
-            android:paddingBottom="30dp"
-        />
-
-    </LinearLayout>
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:gravity="bottom"
-        android:orientation="vertical">
-
-        <com.android.systemui.statusbar.AlphaOptimizedImageView
-            android:id="@+id/note"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            android:src="@drawable/car_ic_notification"
-            android:background="?android:attr/selectableItemBackground"
-            android:paddingTop="20dp"
-            android:paddingBottom="20dp"
-            android:alpha="0.7"
-        />
-
-
-        <com.android.systemui.statusbar.policy.Clock
-            android:id="@+id/clock"
-            android:textAppearance="@style/TextAppearance.StatusBar.Clock"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            android:singleLine="true"
-            android:paddingStart="@dimen/status_bar_clock_starting_padding"
-            android:paddingEnd="@dimen/status_bar_clock_end_padding"
-            android:gravity="center_horizontal"
-            android:paddingBottom="20dp"
-        />
-
-        <Space
-            android:layout_height="10dp"
-            android:layout_width="match_parent"/>
-
-    </LinearLayout>
-
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml b/packages/CarSystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml
deleted file mode 100644
index 9e6dd11..0000000
--- a/packages/CarSystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:background="@drawable/system_bar_background">
-
-    <LinearLayout
-        android:layout_height="match_parent"
-        android:layout_width="match_parent"
-        android:id="@+id/nav_buttons"
-        android:orientation="vertical"
-        android:gravity="top"
-        android:paddingTop="30dp"
-        android:layout_weight="1"
-        android:animateLayoutChanges="true">
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/home"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-            android:src="@drawable/car_ic_overview"
-            android:background="?android:attr/selectableItemBackground"
-            android:paddingTop="30dp"
-            android:paddingBottom="30dp"
-        />
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/hvac"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
-            systemui:broadcast="true"
-            android:src="@drawable/car_ic_hvac"
-            android:background="?android:attr/selectableItemBackground"
-            android:paddingTop="30dp"
-            android:paddingBottom="30dp"
-        />
-    </LinearLayout>
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/car_status_bar_header.xml b/packages/CarSystemUI/res/layout/car_status_bar_header.xml
deleted file mode 100644
index 12c9f11..0000000
--- a/packages/CarSystemUI/res/layout/car_status_bar_header.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<!-- Extends LinearLayout -->
-<com.android.systemui.car.userswitcher.CarStatusBarHeader
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/header"
-    android:layout_width="match_parent"
-    android:layout_height="@dimen/status_bar_height">
-
-    <include layout="@layout/car_top_navigation_bar"
-        android:id="@+id/qs_car_top_bar"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-    />
-</com.android.systemui.car.userswitcher.CarStatusBarHeader>
diff --git a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml
deleted file mode 100644
index 7994b19..0000000
--- a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/car_top_bar"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@drawable/system_bar_background"
-    android:orientation="vertical">
-
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:layoutDirection="ltr">
-
-        <FrameLayout
-            android:id="@+id/system_icon_area"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_alignParentStart="true"
-            android:layout_marginTop="@dimen/car_padding_2"
-            android:layout_marginStart="@dimen/car_padding_2"
-            android:layout_centerVertical="true"
-            android:gravity="center_vertical"
-        >
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:background="@drawable/system_bar_background_pill"
-                android:layout_weight="1"
-                android:gravity="center_vertical"
-                systemui:intent="intent:#Intent;component=com.android.car.settings/.common.CarSettingActivities$QuickSettingActivity;launchFlags=0x24000000;end">
-
-                <include
-                    layout="@layout/system_icons"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:layout_marginStart="@dimen/car_padding_2"
-                    android:layout_marginEnd="@dimen/car_padding_2"
-                    android:gravity="center_vertical"
-                />
-            </com.android.systemui.car.navigationbar.CarNavigationButton>
-        </FrameLayout>
-
-        <FrameLayout
-            android:id="@+id/clock_container"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_centerInParent="true"
-        >
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/qs"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:background="@null"
-                systemui:intent="intent:#Intent;component=com.android.car.settings/.common.CarSettingActivities$QuickSettingActivity;launchFlags=0x24000000;end"
-            />
-            <com.android.systemui.statusbar.policy.Clock
-                android:id="@+id/clock"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center"
-                android:elevation="5dp"
-                android:singleLine="true"
-                android:textAppearance="@style/TextAppearance.SystemBar.Clock"
-                systemui:amPmStyle="normal"
-            />
-        </FrameLayout>
-
-        <FrameLayout
-            android:id="@+id/user_name_container"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_alignParentEnd="true"
-            android:layout_centerVertical="true"
-            android:layout_marginTop="@dimen/car_padding_2"
-        >
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/user_name"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:layout_marginEnd="@dimen/car_padding_2"
-                android:background="@drawable/system_bar_background_pill"
-                android:gravity="center_vertical"
-                systemui:intent="intent:#Intent;component=com.android.car.settings/.users.UserSwitcherActivity;launchFlags=0x24000000;end"
-            >
-                <LinearLayout
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:orientation="horizontal"
-                    android:layout_marginStart="@dimen/car_padding_2"
-                    android:layout_marginEnd="@dimen/car_padding_2"
-                    android:gravity="center_vertical"
-                >
-                    <ImageView
-                        android:id="@+id/user_avatar"
-                        android:layout_width="wrap_content"
-                        android:layout_height="match_parent"
-                        android:src="@drawable/car_ic_user_icon"
-                        android:layout_marginEnd="@dimen/system_bar_user_icon_padding"
-                    />
-                    <TextView
-                        android:id="@+id/user_name_text"
-                        android:layout_width="wrap_content"
-                        android:layout_height="match_parent"
-                        android:gravity="center_vertical"
-                        android:textAppearance="@style/TextAppearance.SystemBar.Username"
-                        android:maxLines="1"
-                        android:maxLength="10"
-                        android:layout_marginEnd="@dimen/system_bar_user_icon_padding"
-                    />
-                </LinearLayout>
-            </com.android.systemui.car.navigationbar.CarNavigationButton>
-        </FrameLayout>
-    </RelativeLayout>
-
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/car_top_navigation_bar_unprovisioned.xml b/packages/CarSystemUI/res/layout/car_top_navigation_bar_unprovisioned.xml
deleted file mode 100644
index b8ac2b4..0000000
--- a/packages/CarSystemUI/res/layout/car_top_navigation_bar_unprovisioned.xml
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/car_top_bar"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@drawable/system_bar_background"
-    android:orientation="vertical">
-
-  <RelativeLayout
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:layout_weight="1">
-
-    <FrameLayout
-        android:id="@+id/left_hvac_container"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_alignParentStart="true"
-        >
-
-      <com.android.systemui.car.navigationbar.CarNavigationButton
-          android:id="@+id/hvacleft"
-          android:layout_width="match_parent"
-          android:layout_height="match_parent"
-          android:background="@null"
-          systemui:broadcast="true"
-          systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
-          />
-
-      <com.android.systemui.car.hvac.AnimatedTemperatureView
-          android:id="@+id/lefttext"
-          android:layout_width="wrap_content"
-          android:layout_height="match_parent"
-          android:paddingStart="@*android:dimen/car_padding_4"
-          android:paddingEnd="16dp"
-          android:gravity="center_vertical|start"
-          android:minEms="4"
-          android:textAppearance="@style/TextAppearance.CarStatus"
-          systemui:hvacAreaId="49"
-          systemui:hvacPivotOffset="60dp"
-          />
-    </FrameLayout>
-
-    <FrameLayout
-        android:id="@+id/clock_container"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_centerInParent="true">
-      <com.android.systemui.car.navigationbar.CarNavigationButton
-          android:id="@+id/qs"
-          android:layout_width="match_parent"
-          android:layout_height="match_parent"
-          android:background="@null"/>
-      <com.android.systemui.statusbar.policy.Clock
-          android:id="@+id/clock"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:layout_gravity="center"
-          android:elevation="5dp"
-          android:singleLine="true"
-          android:textAppearance="@style/TextAppearance.StatusBar.Clock"/>
-    </FrameLayout>
-
-    <LinearLayout
-        android:id="@+id/system_icon_area"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_centerHorizontal="true"
-        android:layout_centerVertical="true"
-        android:layout_toEndOf="@+id/clock_container"
-        android:paddingStart="@*android:dimen/car_padding_1"
-        android:gravity="center_vertical"
-        android:orientation="horizontal"
-        >
-
-      <include
-          layout="@layout/system_icons"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:layout_weight="1"
-          android:paddingStart="4dp"
-          android:gravity="center_vertical"
-          />
-    </LinearLayout>
-
-    <FrameLayout
-        android:id="@+id/right_hvac_container"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_alignParentEnd="true"
-        >
-
-      <com.android.systemui.car.navigationbar.CarNavigationButton
-          android:id="@+id/hvacright"
-          android:layout_width="match_parent"
-          android:layout_height="match_parent"
-          android:background="@null"
-          systemui:broadcast="true"
-          systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
-          />
-
-      <com.android.systemui.car.hvac.AnimatedTemperatureView
-          android:id="@+id/righttext"
-          android:layout_width="wrap_content"
-          android:layout_height="match_parent"
-          android:paddingStart="16dp"
-          android:paddingEnd="@*android:dimen/car_padding_4"
-          android:gravity="center_vertical|end"
-          android:minEms="4"
-          android:textAppearance="@style/TextAppearance.CarStatus"
-          systemui:hvacAreaId="68"
-          systemui:hvacPivotOffset="60dp"
-          />
-    </FrameLayout>
-  </RelativeLayout>
-
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/car_user_switching_dialog.xml b/packages/CarSystemUI/res/layout/car_user_switching_dialog.xml
deleted file mode 100644
index 09fbf7a..0000000
--- a/packages/CarSystemUI/res/layout/car_user_switching_dialog.xml
+++ /dev/null
@@ -1,42 +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.
-  -->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:gravity="center"
-    android:background="@color/car_user_switching_dialog_background_color">
-  <LinearLayout
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:orientation="vertical"
-      android:layout_gravity="center"
-      android:gravity="center_horizontal">
-    <ImageView
-        android:id="@+id/user_loading_avatar"
-        android:layout_width="@dimen/car_fullscreen_user_pod_image_avatar_width"
-        android:layout_height="@dimen/car_fullscreen_user_pod_image_avatar_height"/>
-
-    <TextView
-        android:id="@+id/user_loading"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/car_user_switching_dialog_loading_text_margin_top"
-        android:textSize="@dimen/car_user_switching_dialog_loading_text_font_size"
-        android:textColor="@color/car_user_switching_dialog_loading_text_color"
-        android:layout_below="@id/user_loading_avatar"/>
-  </LinearLayout>
-</FrameLayout>
diff --git a/packages/CarSystemUI/res/layout/car_volume_dialog.xml b/packages/CarSystemUI/res/layout/car_volume_dialog.xml
deleted file mode 100644
index 35551ea..0000000
--- a/packages/CarSystemUI/res/layout/car_volume_dialog.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<androidx.recyclerview.widget.RecyclerView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/volume_list"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minWidth="@dimen/volume_dialog_panel_width"/>
diff --git a/packages/CarSystemUI/res/layout/car_volume_item.xml b/packages/CarSystemUI/res/layout/car_volume_item.xml
deleted file mode 100644
index 0b42904..0000000
--- a/packages/CarSystemUI/res/layout/car_volume_item.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2019 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@color/car_volume_dialog_background_color"
-    android:paddingStart="@dimen/car_volume_item_padding_start"
-    android:paddingEnd="@dimen/car_volume_item_padding_end"
-    android:minHeight="@dimen/car_volume_item_height">
-
-    <!-- Primary Action. -->
-    <ImageView
-        android:id="@+id/primary_icon"
-        android:layout_width="@dimen/car_volume_item_icon_size"
-        android:layout_centerVertical="true"
-        android:layout_alignParentStart="true"
-        android:layout_height="@dimen/car_volume_item_icon_size"/>
-
-    <!-- Note: the horizontal padding and offset are set to 0 so that the track and thumb
-             aligns with the proper keylines. -->
-    <SeekBar
-        android:id="@+id/seek_bar"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="@dimen/car_volume_item_seekbar_margin_vertical"
-        android:layout_marginTop="@dimen/car_volume_item_seekbar_margin_vertical"
-        android:min="0"
-        android:paddingBottom="@dimen/car_volume_item_seekbar_padding_vertical"
-        android:layout_centerVertical="true"
-        android:paddingEnd="0dp"
-        android:paddingStart="0dp"
-        android:paddingTop="@dimen/car_volume_item_seekbar_padding_vertical"
-        android:splitTrack="false"
-        android:layout_toStartOf="@id/supplemental_icon_divider"
-        android:layout_marginStart="@dimen/car_volume_item_seekbar_margin_start"
-        android:layout_marginEnd="@dimen/car_volume_item_seekbar_margin_end"
-        android:thumbOffset="0dp"/>
-
-    <!-- Supplemental action. -->
-    <View
-        android:id="@+id/supplemental_icon_divider"
-        android:layout_width="@dimen/car_volume_item_divider_width"
-        android:layout_height="@dimen/car_volume_item_divider_height"
-        android:layout_marginEnd="@dimen/car_volume_item_divider_margin_end"
-        android:layout_centerVertical="true"
-        android:layout_toStartOf="@id/supplemental_icon"
-        android:background="@color/car_volume_item_divider_color"/>
-    <ImageView
-        android:id="@+id/supplemental_icon"
-        android:layout_width="@dimen/car_volume_item_icon_size"
-        android:layout_height="@dimen/car_volume_item_icon_size"
-        android:background="?android:attr/selectableItemBackground"
-        android:layout_centerVertical="true"
-        android:layout_alignParentEnd="true"
-        android:scaleType="fitCenter"/>
-</RelativeLayout>
diff --git a/packages/CarSystemUI/res/layout/notification_center_activity.xml b/packages/CarSystemUI/res/layout/notification_center_activity.xml
deleted file mode 100644
index 0e45e43..0000000
--- a/packages/CarSystemUI/res/layout/notification_center_activity.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2018 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<com.android.car.notification.CarNotificationView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/notification_view"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@color/notification_shade_background_color">
-
-    <com.android.car.ui.FocusParkingView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"/>
-
-    <View
-        android:id="@+id/glass_pane"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:translationZ="2dp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-    />
-
-    <com.android.car.ui.FocusArea
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:orientation="vertical"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent">
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/notifications"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:paddingBottom="@dimen/notification_shade_list_padding_bottom"/>
-    </com.android.car.ui.FocusArea>
-
-    <include layout="@layout/notification_handle_bar"/>
-
-</com.android.car.notification.CarNotificationView>
diff --git a/packages/CarSystemUI/res/layout/notification_handle_bar.xml b/packages/CarSystemUI/res/layout/notification_handle_bar.xml
deleted file mode 100644
index 99c3a02..0000000
--- a/packages/CarSystemUI/res/layout/notification_handle_bar.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** 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.
-*/
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-    <View
-        android:id="@+id/handle_bar"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/notification_shade_handle_bar_height"
-        android:layout_marginBottom="@dimen/notification_shade_handle_bar_margin_bottom"
-        android:layout_marginEnd="@dimen/notification_shade_handle_bar_margin_start"
-        android:layout_marginStart="@dimen/notification_shade_handle_bar_margin_end"
-        android:layout_marginTop="@dimen/notification_shade_handle_bar_margin_top"
-        android:background="@drawable/notification_handle_bar"/>
-</merge>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/layout/notification_panel_container.xml b/packages/CarSystemUI/res/layout/notification_panel_container.xml
deleted file mode 100644
index 3b53c6a..0000000
--- a/packages/CarSystemUI/res/layout/notification_panel_container.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/notification_container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:visibility="invisible"/>
diff --git a/packages/CarSystemUI/res/layout/rear_view_camera.xml b/packages/CarSystemUI/res/layout/rear_view_camera.xml
deleted file mode 100644
index 9b9898c..0000000
--- a/packages/CarSystemUI/res/layout/rear_view_camera.xml
+++ /dev/null
@@ -1,31 +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:id="@+id/rear_view_camera_container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@android:color/transparent"
-    android:orientation="vertical">
-    <Button
-        android:id="@+id/close_button"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@color/rear_view_camera_button_background"
-        android:text="@string/rear_view_camera_close_button_text"
-        android:textAppearance="?android:attr/textAppearanceLarge"/>
-</LinearLayout>
diff --git a/packages/CarSystemUI/res/layout/status_bar_wifi_group.xml b/packages/CarSystemUI/res/layout/status_bar_wifi_group.xml
deleted file mode 100644
index 531e577..0000000
--- a/packages/CarSystemUI/res/layout/status_bar_wifi_group.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<com.android.systemui.statusbar.StatusBarWifiView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/wifi_combo"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent"
-    android:gravity="center_vertical">
-
-    <com.android.keyguard.AlphaOptimizedLinearLayout
-        android:id="@+id/wifi_group"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:paddingStart="2dp"
-        android:gravity="center_vertical"
-    >
-        <FrameLayout
-            android:id="@+id/inout_container"
-            android:layout_width="wrap_content"
-            android:layout_height="17dp"
-            android:gravity="center_vertical">
-            <ImageView
-                android:id="@+id/wifi_in"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:paddingEnd="2dp"
-                android:src="@drawable/ic_activity_down"
-                android:visibility="gone"
-            />
-            <ImageView
-                android:id="@+id/wifi_out"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:paddingEnd="2dp"
-                android:src="@drawable/ic_activity_up"
-                android:visibility="gone"
-            />
-        </FrameLayout>
-        <FrameLayout
-            android:id="@+id/wifi_combo"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:gravity="center_vertical">
-            <com.android.systemui.statusbar.AlphaOptimizedImageView
-                android:id="@+id/wifi_signal"
-                android:layout_width="@*android:dimen/status_bar_system_icon_size"
-                android:layout_height="@*android:dimen/status_bar_system_icon_size"
-                android:theme="?attr/lightIconTheme"/>
-        </FrameLayout>
-
-        <View
-            android:id="@+id/wifi_signal_spacer"
-            android:layout_width="@dimen/status_bar_wifi_signal_spacer_width"
-            android:layout_height="4dp"
-            android:visibility="gone"/>
-
-        <ViewStub
-            android:id="@+id/connected_device_signals_stub"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout="@layout/connected_device_signal"/>
-
-        <View
-            android:id="@+id/wifi_airplane_spacer"
-            android:layout_width="@dimen/status_bar_airplane_spacer_width"
-            android:layout_height="4dp"
-            android:visibility="gone"
-        />
-    </com.android.keyguard.AlphaOptimizedLinearLayout>
-</com.android.systemui.statusbar.StatusBarWifiView>
diff --git a/packages/CarSystemUI/res/layout/system_icons.xml b/packages/CarSystemUI/res/layout/system_icons.xml
deleted file mode 100644
index f6ffcc8..0000000
--- a/packages/CarSystemUI/res/layout/system_icons.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/system_icons"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:gravity="center_vertical"
-    android:orientation="horizontal">
-
-    <com.android.systemui.statusbar.phone.StatusIconContainer
-        android:id="@+id/statusIcons"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:scaleType="fitCenter"
-        android:gravity="center_vertical"
-        android:orientation="horizontal"
-    />
-
-    <ImageView
-        android:id="@+id/settingsIcon"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_marginStart="@dimen/car_padding_2"
-        android:src="@drawable/car_ic_settings_icon"
-    />
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/layout/sysui_overlay_window.xml b/packages/CarSystemUI/res/layout/sysui_overlay_window.xml
deleted file mode 100644
index 980265e..0000000
--- a/packages/CarSystemUI/res/layout/sysui_overlay_window.xml
+++ /dev/null
@@ -1,51 +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.
-  -->
-
-<!-- Fullscreen views in sysui should be listed here in increasing Z order. -->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:background="@android:color/transparent"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <ViewStub android:id="@+id/notification_panel_stub"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:layout="@layout/notification_panel_container"/>
-
-    <ViewStub android:id="@+id/keyguard_stub"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:layout="@layout/keyguard_container" />
-
-    <ViewStub android:id="@+id/fullscreen_user_switcher_stub"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:layout="@layout/car_fullscreen_user_switcher"/>
-
-    <ViewStub android:id="@+id/user_switching_dialog_stub"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:layout="@layout/car_user_switching_dialog"/>
-
-    <!-- Should be at bottom to get the highest Z-order. -->
-    <ViewStub android:id="@+id/rear_view_camera_stub"
-              android:layout_width="@dimen/rear_view_camera_width"
-              android:layout_height="@dimen/rear_view_camera_height"
-              android:layout_gravity="center"
-              android:layout="@layout/rear_view_camera"/>
-</FrameLayout>
diff --git a/packages/CarSystemUI/res/values-af/strings.xml b/packages/CarSystemUI/res/values-af/strings.xml
deleted file mode 100644
index cf288d7..0000000
--- a/packages/CarSystemUI/res/values-af/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Stemherkenning nou deur gekoppelde Bluetooth-toestel hanteer"</string>
-    <string name="car_guest" msgid="318393171202663722">"Gas"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Gas"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Voeg gebruiker by"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Nuwe gebruiker"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Wanneer jy \'n nuwe gebruiker byvoeg, moet daardie persoon hul spasie opstel."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Enige gebruiker kan programme vir al die ander gebruikers opdateer."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Laai tans"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Laai tans gebruiker (van <xliff:g id="FROM_USER">%1$d</xliff:g> na <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Maak toe"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-am/strings.xml b/packages/CarSystemUI/res/values-am/strings.xml
deleted file mode 100644
index 8281631..0000000
--- a/packages/CarSystemUI/res/values-am/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"ዝቅተኛ"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"ከፍተኛ"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"የድምፅ ለይቶ ማወቅ አሁን በተገናኘ የብሉቱዝ መሣሪያ ይስተናገዳል"</string>
-    <string name="car_guest" msgid="318393171202663722">"እንግዳ"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"እንግዳ"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"ተጠቃሚ አክል"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"አዲስ ተጠቃሚ"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"አዲስ ተጠቃሚ ሲያክሉ ያ ሰው የራሳቸውን ቦታ ማቀናበር አለባቸው።"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"ማንኛውም ተጠቃሚ መተግበሪያዎችን ለሌሎች ተጠቃሚዎች ሁሉ ማዘመን ይችላል።"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"በመጫን ላይ"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"ተጠቃሚን (ከ<xliff:g id="FROM_USER">%1$d</xliff:g> ወደ <xliff:g id="TO_USER">%2$d</xliff:g>) በመጫን ላይ"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"ዝጋ"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-ar/strings.xml b/packages/CarSystemUI/res/values-ar/strings.xml
deleted file mode 100644
index d9abb0a..0000000
--- a/packages/CarSystemUI/res/values-ar/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"حد أدنى"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"حد أقصى"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"تتم معالجة التعرّف على الصوت الآن من خلال جهاز بلوتوث متصل."</string>
-    <string name="car_guest" msgid="318393171202663722">"ضيف"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"ضيف"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"إضافة مستخدم"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"مستخدم جديد"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"عند إضافة مستخدم جديد، على هذا المستخدم إعداد مساحته."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"يمكن لأي مستخدم تحديث التطبيقات لجميع المستخدمين الآخرين."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"جارٍ التحميل"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"جارٍ تحميل الملف الشخصي الجديد للمستخدم (من <xliff:g id="FROM_USER">%1$d</xliff:g> إلى <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"إغلاق"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-as/strings.xml b/packages/CarSystemUI/res/values-as/strings.xml
deleted file mode 100644
index d871055..0000000
--- a/packages/CarSystemUI/res/values-as/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"সর্বনিম্ন"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"সৰ্বাধিক"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"কণ্ঠস্বৰৰ চিনাক্তকৰণ এতিয়া সংযুক্ত ব্লুটুথ ডিভাইচে নিয়ন্ত্ৰণ কৰে"</string>
-    <string name="car_guest" msgid="318393171202663722">"অতিথি"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"অতিথি"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"ব্যৱহাৰকাৰী যোগ দিয়ক"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"নতুন ব্যৱহাৰকাৰী"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"আপুনি যেতিয়া এজন নতুন ব্যৱহাৰকাৰীক যোগ কৰে, তেতিয়া তেওঁ নিজৰ ঠাই ছেট আপ কৰাটো প্ৰয়োজন হয়।"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"যিকোনো ব্যৱহাৰকাৰীয়ে অন্য ব্যৱহাৰকাৰীৰ বাবে এপ্‌সমূহ আপডে’ট কৰিব পাৰে।"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"ল’ড হৈ আছে"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"ব্যৱহাৰকাৰী ল’ড হৈ আছে (<xliff:g id="FROM_USER">%1$d</xliff:g>ৰ পৰা to <xliff:g id="TO_USER">%2$d</xliff:g>লৈ)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"বন্ধ কৰক"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-az/strings.xml b/packages/CarSystemUI/res/values-az/strings.xml
deleted file mode 100644
index 89c9eb4..0000000
--- a/packages/CarSystemUI/res/values-az/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Səs tanınması qoşulmuş Bluetooth cihazı ilə icra edilir"</string>
-    <string name="car_guest" msgid="318393171202663722">"Qonaq"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Qonaq"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"İstifadəçi əlavə edin"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Yeni İstifadəçi"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Yeni istifadəçi əlavə etdiyinizdə həmin şəxs öz yerini təyin etməlidir."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"İstənilən istifadəçi digər bütün istifadəçilər üçün tətbiqləri güncəlləyə bilər."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Yüklənir"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"İstifadəçi yüklənir (<xliff:g id="FROM_USER">%1$d</xliff:g>-<xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Qapadın"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-b+sr+Latn/strings.xml b/packages/CarSystemUI/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index 6aee013..0000000
--- a/packages/CarSystemUI/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Prepoznavanjem glasa sada upravlja povezani Bluetooth uređaj"</string>
-    <string name="car_guest" msgid="318393171202663722">"Gost"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Gost"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Dodaj korisnika"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Novi korisnik"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kada dodate novog korisnika, ta osoba treba da podesi svoj prostor."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Svaki korisnik može da ažurira aplikacije za sve ostale korisnike."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Učitava se"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Profil korisnika se učitava (iz<xliff:g id="FROM_USER">%1$d</xliff:g> u <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Zatvori"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-be/strings.xml b/packages/CarSystemUI/res/values-be/strings.xml
deleted file mode 100644
index fde4273..0000000
--- a/packages/CarSystemUI/res/values-be/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Мін"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Макс"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Распазнаванне голасу выконвае падключаная прылада Bluetooth"</string>
-    <string name="car_guest" msgid="318393171202663722">"Госць"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Госць"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Дадаць карыстальніка"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Новы карыстальнік"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Калі вы дадаяце новага карыстальніка, яму трэба наладзіць свой профіль."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Кожны карыстальнік прылады можа абнаўляць праграмы для ўсіх іншых карыстальнікаў."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Ідзе загрузка"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Ідзе загрузка профілю карыстальніка (ад <xliff:g id="FROM_USER">%1$d</xliff:g> да <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Закрыць"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-bg/strings.xml b/packages/CarSystemUI/res/values-bg/strings.xml
deleted file mode 100644
index 25f2845..0000000
--- a/packages/CarSystemUI/res/values-bg/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Мин."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Макс."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Гл. разпознаване се обработва от свързаното у-во с Bluetooth"</string>
-    <string name="car_guest" msgid="318393171202663722">"Гост"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Гост"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Добавяне на потребител"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Нов потребител"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Когато добавите нов потребител, той трябва да настрои работната си област."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Всеки потребител може да актуализира приложенията за всички останали потребители."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Зарежда се"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Потребителят се зарежда (от <xliff:g id="FROM_USER">%1$d</xliff:g> до <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Затваряне"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-bn/strings.xml b/packages/CarSystemUI/res/values-bn/strings.xml
deleted file mode 100644
index 5664cc1..0000000
--- a/packages/CarSystemUI/res/values-bn/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"সর্বনিম্ন"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"সর্বাধিক"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"কানেক্ট করা ব্লুটুথ ডিভাইস এখন ভয়েস শনাক্তকরণ ম্যানেজ করছে"</string>
-    <string name="car_guest" msgid="318393171202663722">"অতিথি"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"অতিথি"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"ব্যবহারকারীকে যোগ করুন"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"নতুন ব্যবহারকারী"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"নতুন ব্যবহারকারী যোগ করলে, তার স্পেস তাকে সেট-আপ করে নিতে হবে।"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"যেকোনও ব্যবহারকারী বাকি সব ব্যবহারকারীর জন্য অ্যাপ আপডেট করতে পারবেন।"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"লোড হচ্ছে"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"ব্যবহারকারীর প্রোফাইল লোড করা হচ্ছে (<xliff:g id="FROM_USER">%1$d</xliff:g> থেকে <xliff:g id="TO_USER">%2$d</xliff:g>-এ)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"বন্ধ করুন"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-bs/strings.xml b/packages/CarSystemUI/res/values-bs/strings.xml
deleted file mode 100644
index 588771e..0000000
--- a/packages/CarSystemUI/res/values-bs/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Prepoznavanjem glasa sada upravlja povezani Bluetooth uređaj"</string>
-    <string name="car_guest" msgid="318393171202663722">"Gost"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Gost"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Dodaj korisnika"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Novi korisnik"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kada dodate novog korisnika, ta osoba treba postaviti svoj prostor."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Bilo koji korisnik može ažurirati aplikacije za sve druge korisnike."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Učitavanje"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Učitavanje korisnika (od korisnika <xliff:g id="FROM_USER">%1$d</xliff:g> do korisnika <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Zatvori"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-ca/strings.xml b/packages/CarSystemUI/res/values-ca/strings.xml
deleted file mode 100644
index c151d48..0000000
--- a/packages/CarSystemUI/res/values-ca/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Mín."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Màx."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Reconeixement de veu gestionat per disp. Bluetooth connectat"</string>
-    <string name="car_guest" msgid="318393171202663722">"Convidat"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Convidat"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Afegeix un usuari"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Usuari nou"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Quan s\'afegeix un usuari nou, aquesta persona ha de configurar el seu espai."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Qualsevol usuari pot actualitzar les aplicacions de la resta d\'usuaris."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"S\'està carregant"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"S\'està carregant l\'usuari (de <xliff:g id="FROM_USER">%1$d</xliff:g> a <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Tanca"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-cs/strings.xml b/packages/CarSystemUI/res/values-cs/strings.xml
deleted file mode 100644
index 7657e32..0000000
--- a/packages/CarSystemUI/res/values-cs/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Rozpoznávání hlasu teď provádí připojené zařízení Bluetooth"</string>
-    <string name="car_guest" msgid="318393171202663722">"Host"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Host"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Přidat uživatele"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Nový uživatel"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Každý nově přidaný uživatel si musí nastavit vlastní prostor."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Každý uživatel může aktualizovat aplikace všech ostatních uživatelů."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Načítání"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Načítání uživatele (předchozí: <xliff:g id="FROM_USER">%1$d</xliff:g>, následující: <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Zavřít"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-da/strings.xml b/packages/CarSystemUI/res/values-da/strings.xml
deleted file mode 100644
index 120929e..0000000
--- a/packages/CarSystemUI/res/values-da/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Talegenkendelse sker nu med den forbundne Blutetooth-enhed"</string>
-    <string name="car_guest" msgid="318393171202663722">"Gæst"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Gæst"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Tilføj bruger"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Ny bruger"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Når du tilføjer en ny bruger, skal vedkommende konfigurere sit område."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Alle brugere kan opdatere apps for alle andre brugere."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Indlæser"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Indlæser bruger (fra <xliff:g id="FROM_USER">%1$d</xliff:g> til <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Luk"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-de/strings.xml b/packages/CarSystemUI/res/values-de/strings.xml
deleted file mode 100644
index e2437f0..0000000
--- a/packages/CarSystemUI/res/values-de/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Spracherkennung jetzt über das verbundene Bluetooth-Gerät"</string>
-    <string name="car_guest" msgid="318393171202663722">"Gast"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Gast"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Nutzer hinzufügen"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Neuer Nutzer"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Wenn du einen neuen Nutzer hinzufügst, muss dieser seinen Bereich einrichten."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Jeder Nutzer kann Apps für alle anderen Nutzer aktualisieren."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Wird geladen"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Nutzer wird geladen (von <xliff:g id="FROM_USER">%1$d</xliff:g> bis <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Schließen"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-el/strings.xml b/packages/CarSystemUI/res/values-el/strings.xml
deleted file mode 100644
index 9b24fa4..0000000
--- a/packages/CarSystemUI/res/values-el/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Ελάχ."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Μεγ."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Φωνητική αναγνωση από συνδεδεμένη συσκευή Bluetooth"</string>
-    <string name="car_guest" msgid="318393171202663722">"Επισκέπτης"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Επισκέπτης"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Προσθήκη χρήστη"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Νέος χρήστης"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει τον χώρο του."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Οποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Φόρτωση"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Φόρτωση χρήστη (από <xliff:g id="FROM_USER">%1$d</xliff:g> έως <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Κλείσιμο"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-en-rAU/strings.xml b/packages/CarSystemUI/res/values-en-rAU/strings.xml
deleted file mode 100644
index 8eb76c2..0000000
--- a/packages/CarSystemUI/res/values-en-rAU/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Voice recognition now handled by connected Bluetooth device"</string>
-    <string name="car_guest" msgid="318393171202663722">"Guest"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Guest"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Add user"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"New user"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"When you add a new user, that person needs to set up their space."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Any user can update apps for all other users."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Loading"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Loading user (from <xliff:g id="FROM_USER">%1$d</xliff:g> to <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Close"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-en-rCA/strings.xml b/packages/CarSystemUI/res/values-en-rCA/strings.xml
deleted file mode 100644
index 8eb76c2..0000000
--- a/packages/CarSystemUI/res/values-en-rCA/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Voice recognition now handled by connected Bluetooth device"</string>
-    <string name="car_guest" msgid="318393171202663722">"Guest"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Guest"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Add user"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"New user"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"When you add a new user, that person needs to set up their space."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Any user can update apps for all other users."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Loading"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Loading user (from <xliff:g id="FROM_USER">%1$d</xliff:g> to <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Close"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-en-rGB/strings.xml b/packages/CarSystemUI/res/values-en-rGB/strings.xml
deleted file mode 100644
index 8eb76c2..0000000
--- a/packages/CarSystemUI/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Voice recognition now handled by connected Bluetooth device"</string>
-    <string name="car_guest" msgid="318393171202663722">"Guest"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Guest"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Add user"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"New user"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"When you add a new user, that person needs to set up their space."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Any user can update apps for all other users."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Loading"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Loading user (from <xliff:g id="FROM_USER">%1$d</xliff:g> to <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Close"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-en-rIN/strings.xml b/packages/CarSystemUI/res/values-en-rIN/strings.xml
deleted file mode 100644
index 8eb76c2..0000000
--- a/packages/CarSystemUI/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Voice recognition now handled by connected Bluetooth device"</string>
-    <string name="car_guest" msgid="318393171202663722">"Guest"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Guest"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Add user"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"New user"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"When you add a new user, that person needs to set up their space."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Any user can update apps for all other users."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Loading"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Loading user (from <xliff:g id="FROM_USER">%1$d</xliff:g> to <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Close"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-en-rXC/strings.xml b/packages/CarSystemUI/res/values-en-rXC/strings.xml
deleted file mode 100644
index 37a568b..0000000
--- a/packages/CarSystemUI/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎Min‎‏‎‎‏‎"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎Max‎‏‎‎‏‎"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‏‎‏‎‎Voice recognition now handled by connected Bluetooth device‎‏‎‎‏‎"</string>
-    <string name="car_guest" msgid="318393171202663722">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‏‎‏‏‎‎‏‎‏‎‎‎‏‏‏‎‎‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‏‎‏‎‎‏‎‏‎‏‎‎Guest‎‏‎‎‏‎"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‎‏‎‎Guest‎‏‎‎‏‎"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‏‏‎‎‏‎‎‏‎‏‎‎‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎Add User‎‏‎‎‏‎"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‏‎‏‏‏‎‏‎‏‎‏‎‏‏‎‎‏‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‎‏‏‎‎‏‎‎‏‏‏‎‎‏‎New User‎‏‎‎‏‎"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‎‎‏‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‎‎‎‏‏‎When you add a new user, that person needs to set up their space.‎‏‎‎‏‎"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‎‎‎‎‎‎‎‏‏‎‎‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‏‏‎Any user can update apps for all other users.‎‏‎‎‏‎"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‏‎‎‏‎‏‏‎‎‏‏‏‏‎‏‏‏‏‏‎‏‎‎‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎‏‎‎Loading‎‏‎‎‏‎"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‎‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎‏‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎Loading user (from ‎‏‎‎‏‏‎<xliff:g id="FROM_USER">%1$d</xliff:g>‎‏‎‎‏‏‏‎ to ‎‏‎‎‏‏‎<xliff:g id="TO_USER">%2$d</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‎‎‎‏‎‏‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎Close‎‏‎‎‏‎"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-es-rUS/strings.xml b/packages/CarSystemUI/res/values-es-rUS/strings.xml
deleted file mode 100644
index e067594..0000000
--- a/packages/CarSystemUI/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Mín."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Máx."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"El dispositivo Bluetooth administra el reconocimiento de voz"</string>
-    <string name="car_guest" msgid="318393171202663722">"Invitado"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Invitado"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Agregar usuario"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Usuario nuevo"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Cuando agregues un usuario nuevo, esa persona deberá configurar su espacio."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Cualquier usuario puede actualizar las aplicaciones del resto de los usuarios."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Cargando"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Cargando usuario (de <xliff:g id="FROM_USER">%1$d</xliff:g> a <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Cerrar"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-es/strings.xml b/packages/CarSystemUI/res/values-es/strings.xml
deleted file mode 100644
index 8aad2ca..0000000
--- a/packages/CarSystemUI/res/values-es/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Mín."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Máx."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"El dispositivo Bluetooth gestiona el reconocimiento de voz"</string>
-    <string name="car_guest" msgid="318393171202663722">"Invitado"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Invitado"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Añadir usuario"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Nuevo usuario"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Cuando añades un usuario, esa persona debe configurar su espacio."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Cualquier usuario puede actualizar las aplicaciones del resto de los usuarios."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Cargando"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Cargando usuario (de <xliff:g id="FROM_USER">%1$d</xliff:g> a <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Cerrar"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-et/strings.xml b/packages/CarSystemUI/res/values-et/strings.xml
deleted file mode 100644
index 14ec9df..0000000
--- a/packages/CarSystemUI/res/values-et/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Häältuvastust haldab nüüd ühendatud Bluetoothi seade"</string>
-    <string name="car_guest" msgid="318393171202663722">"Külaline"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Külaline"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Lisa kasutaja"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Uus kasutaja"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kui lisate uue kasutaja, siis peab ta seadistama oma ruumi."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Iga kasutaja saab rakendusi värskendada kõigi teiste kasutajate jaoks."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Laadimine"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Kasutaja laadimine (<xliff:g id="FROM_USER">%1$d</xliff:g> &gt; <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Sule"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-eu/strings.xml b/packages/CarSystemUI/res/values-eu/strings.xml
deleted file mode 100644
index 9139e65..0000000
--- a/packages/CarSystemUI/res/values-eu/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Konektatutako Bluetooth bidezko gailuak kudeatzen du ahotsa ezagutzeko eginbidea"</string>
-    <string name="car_guest" msgid="318393171202663722">"Gonbidatua"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Gonbidatua"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Gehitu erabiltzaile bat"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Erabiltzaile berria"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Erabiltzaile bat gehitzen duzunean, bere eremua konfiguratu beharko du."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Edozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Kargatzen"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Erabiltzailea kargatzen (<xliff:g id="FROM_USER">%1$d</xliff:g> izatetik<xliff:g id="TO_USER">%2$d</xliff:g> izatera igaroko da)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Itxi"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-fa/strings.xml b/packages/CarSystemUI/res/values-fa/strings.xml
deleted file mode 100644
index 3f53b11..0000000
--- a/packages/CarSystemUI/res/values-fa/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"حداقل"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"حداکثر"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"اکنون تشخیص صدا را دستگاه بلوتوث متصل کنترل می‌کند"</string>
-    <string name="car_guest" msgid="318393171202663722">"مهمان"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"مهمان"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"افزودن کاربر"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"کاربر جدید"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"وقتی کاربر جدیدی اضافه می‌کنید، آن فرد باید فضای خود را تنظیم کند."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"هر کاربری می‌تواند برنامه‌ها را برای همه کاربران دیگر به‌روزرسانی کند."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"درحال بارگیری"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"بارگیری کاربر (از <xliff:g id="FROM_USER">%1$d</xliff:g> تا <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"بستن"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-fi/strings.xml b/packages/CarSystemUI/res/values-fi/strings.xml
deleted file mode 100644
index 4c20f85..0000000
--- a/packages/CarSystemUI/res/values-fi/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Alin"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Ylin"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Äänentunnistus tehdään nyt yhdistetyllä Bluetooth-laitteella"</string>
-    <string name="car_guest" msgid="318393171202663722">"Vieras"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Vieras"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Lisää käyttäjä"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Uusi käyttäjä"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kun lisäät uuden käyttäjän, hänen on valittava oman tilansa asetukset."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Kaikki käyttäjät voivat päivittää sovelluksia muille käyttäjille."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Ladataan"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Ladataan käyttäjäprofiilia (<xliff:g id="FROM_USER">%1$d</xliff:g>–<xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Sulje"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-fr-rCA/strings.xml b/packages/CarSystemUI/res/values-fr-rCA/strings.xml
deleted file mode 100644
index b190549..0000000
--- a/packages/CarSystemUI/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"La reconn. voc. est gérée par l\'appareil Bluetooth connecté"</string>
-    <string name="car_guest" msgid="318393171202663722">"Invité"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Invité"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Ajouter un utilisateur"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Nouvel utilisateur"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Tout utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Chargement en cours…"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Chargement de l\'utilisateur (de <xliff:g id="FROM_USER">%1$d</xliff:g> vers <xliff:g id="TO_USER">%2$d</xliff:g>) en cours…"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Fermer"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-fr/strings.xml b/packages/CarSystemUI/res/values-fr/strings.xml
deleted file mode 100644
index 5a905a0..0000000
--- a/packages/CarSystemUI/res/values-fr/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"L\'appareil Bluetooth connecté gère la reconnaissance vocale"</string>
-    <string name="car_guest" msgid="318393171202663722">"Invité"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Invité"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Ajouter un utilisateur"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Nouvel utilisateur"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"N\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Chargement…"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Chargement de l\'utilisateur (de <xliff:g id="FROM_USER">%1$d</xliff:g> à <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Fermer"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-gl/strings.xml b/packages/CarSystemUI/res/values-gl/strings.xml
deleted file mode 100644
index e77df4f..0000000
--- a/packages/CarSystemUI/res/values-gl/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Mín."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Máx."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"O dispositivo Bluetooth xestionará o recoñecemento de voz"</string>
-    <string name="car_guest" msgid="318393171202663722">"Convidado"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Convidado"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Engadir usuario"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Novo usuario"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Cando engadas un novo usuario, este deberá configurar o seu espazo."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Calquera usuario pode actualizar as aplicacións para o resto dos usuarios."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Cargando"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Cargando usuario (do <xliff:g id="FROM_USER">%1$d</xliff:g> ao <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Pechar"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-gu/strings.xml b/packages/CarSystemUI/res/values-gu/strings.xml
deleted file mode 100644
index 174d7a7..0000000
--- a/packages/CarSystemUI/res/values-gu/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"ન્યૂનતમ"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"મહત્તમ"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"અવાજની ઓળખ હવે કનેક્ટેડ બ્લૂટૂથ ડિવાઇસ વડે નિયંત્રિત થશે"</string>
-    <string name="car_guest" msgid="318393171202663722">"અતિથિ"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"અતિથિ"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"વપરાશકર્તા ઉમેરો"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"નવા વપરાશકર્તા"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિએ તેમની સ્પેસ સેટ કરવાની જરૂર રહે છે."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"કોઈપણ વપરાશકર્તા અન્ય બધા વપરાશકર્તાઓ માટે ઍપને અપડેટ કરી શકે છે."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"લોડ કરી રહ્યાં છીએ"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"વપરાશકર્તાને લોડ કરી રહ્યાં છીએ (<xliff:g id="FROM_USER">%1$d</xliff:g>માંથી <xliff:g id="TO_USER">%2$d</xliff:g>માં)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"બંધ કરો"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-hi/strings.xml b/packages/CarSystemUI/res/values-hi/strings.xml
deleted file mode 100644
index 83321fd..0000000
--- a/packages/CarSystemUI/res/values-hi/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"कम से कम"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"ज़्यादा से ज़्यादा"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"अब आवाज़ पहचानने का काम, कनेक्ट किए गए ब्लूटूथ डिवाइस करते हैं"</string>
-    <string name="car_guest" msgid="318393171202663722">"मेहमान प्रोफ़ाइल"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"मेहमान के तौर पर सेशन शुरू करें"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"उपयोगकर्ता जोड़ें"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"नया उपयोगकर्ता"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं, तब उसे अपनी जगह सेट करनी होती है."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"कोई भी उपयोगकर्ता, बाकी सभी उपयोगकर्ताओं के लिए ऐप्लिकेशन अपडेट कर सकता है."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"लोड हो रही है"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"उपयोगकर्ता को लोड किया जा रहा है (<xliff:g id="FROM_USER">%1$d</xliff:g> से <xliff:g id="TO_USER">%2$d</xliff:g> पर)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"बंद करें"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-hr/strings.xml b/packages/CarSystemUI/res/values-hr/strings.xml
deleted file mode 100644
index 872fc69..0000000
--- a/packages/CarSystemUI/res/values-hr/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Prepoznavanjem glasa rukuje se s povezanog Bluetooth uređaja"</string>
-    <string name="car_guest" msgid="318393171202663722">"Gost"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Gost"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Dodajte korisnika"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Novi korisnik"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kada dodate novog korisnika, ta osoba mora postaviti vlastiti prostor."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Svaki korisnik može ažurirati aplikacije za ostale korisnike."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Učitavanje"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Učitavanje korisnika (od <xliff:g id="FROM_USER">%1$d</xliff:g> do <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Zatvori"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-hu/strings.xml b/packages/CarSystemUI/res/values-hu/strings.xml
deleted file mode 100644
index 63328f3..0000000
--- a/packages/CarSystemUI/res/values-hu/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"A hangfelismerést a csatlakoztatott Bluetooth-eszköz kezeli"</string>
-    <string name="car_guest" msgid="318393171202663722">"Vendég"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Vendég"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Felhasználó hozzáadása"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Új felhasználó"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Ha új felhasználót ad hozzá, az illetőnek be kell állítania saját felületét."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Bármely felhasználó frissítheti az alkalmazásokat az összes felhasználó számára."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Betöltés"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Felhasználó betöltése (<xliff:g id="FROM_USER">%1$d</xliff:g> → <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Bezárás"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-hy/strings.xml b/packages/CarSystemUI/res/values-hy/strings.xml
deleted file mode 100644
index 778f695..0000000
--- a/packages/CarSystemUI/res/values-hy/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Նվազ․"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Առավ․"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Ձայնի ճանաչումը մշակվում է միացված Bluetooth սարքի կողմից"</string>
-    <string name="car_guest" msgid="318393171202663722">"Հյուր"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Հյուրի ռեժիմ"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Ավելացնել օգտատեր"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Նոր օգտատեր"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Երբ դուք նոր օգտատեր եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը։"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Ցանկացած օգտատեր կարող է թարմացնել հավելվածները բոլոր մյուս հաշիվների համար։"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Բեռնում"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Օգտատերը բեռնվում է (<xliff:g id="FROM_USER">%1$d</xliff:g> – <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Փակել"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-in/strings.xml b/packages/CarSystemUI/res/values-in/strings.xml
deleted file mode 100644
index 60525ad..0000000
--- a/packages/CarSystemUI/res/values-in/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Pengenalan suara ditangani perangkat Bluetooth terhubung"</string>
-    <string name="car_guest" msgid="318393171202663722">"Tamu"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Tamu"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Tambahkan Pengguna"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Pengguna Baru"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Jika ditambahkan, pengguna baru harus menyiapkan ruangnya sendiri."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Setiap pengguna dapat mengupdate aplikasi untuk semua pengguna lain."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Memuat"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Memuat pengguna (dari <xliff:g id="FROM_USER">%1$d</xliff:g> menjadi <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Tutup"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-is/strings.xml b/packages/CarSystemUI/res/values-is/strings.xml
deleted file mode 100644
index 5a927aa0..0000000
--- a/packages/CarSystemUI/res/values-is/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Lágm."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Hám."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Raddgreiningu er nú stjórnað af tengdu Bluetooth-tæki"</string>
-    <string name="car_guest" msgid="318393171202663722">"Gestur"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Gestur"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Bæta notanda við"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Nýr notandi"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Þegar þú bætir nýjum notanda við þarf viðkomandi að setja upp sitt eigið svæði."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Allir notendur geta uppfært forrit fyrir alla aðra notendur."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Hleður"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Hleður notanda (frá <xliff:g id="FROM_USER">%1$d</xliff:g> til <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Loka"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-it/strings.xml b/packages/CarSystemUI/res/values-it/strings.xml
deleted file mode 100644
index 41d7ad4..0000000
--- a/packages/CarSystemUI/res/values-it/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Riconoscimento vocale gestito da dispos. Bluetooth connesso"</string>
-    <string name="car_guest" msgid="318393171202663722">"Ospite"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Ospite"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Aggiungi utente"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Nuovo utente"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Il nuovo utente, una volta aggiunto, dovrà configurare il suo spazio."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Qualsiasi utente può aggiornare le app per tutti gli altri."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Caricamento"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Caricamento dell\'utente (da <xliff:g id="FROM_USER">%1$d</xliff:g> a <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Chiudi"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-iw/strings.xml b/packages/CarSystemUI/res/values-iw/strings.xml
deleted file mode 100644
index f419cac..0000000
--- a/packages/CarSystemUI/res/values-iw/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"מינ\'"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"מקס\'"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"הזיהוי הקולי מתבצע עכשיו במכשיר Bluetooth מחובר"</string>
-    <string name="car_guest" msgid="318393171202663722">"אורח"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"אורח"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"הוספת משתמש"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"משתמש חדש"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"בעת הוספת משתמש חדש, על משתמש זה להגדיר את המרחב שלו."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"כל משתמש יכול לעדכן אפליקציות לכל שאר המשתמשים."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"בטעינה"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"המשתמש בטעינה (מהמשתמש <xliff:g id="FROM_USER">%1$d</xliff:g> אל <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"סגירה"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-ja/strings.xml b/packages/CarSystemUI/res/values-ja/strings.xml
deleted file mode 100644
index 9cf056fd..0000000
--- a/packages/CarSystemUI/res/values-ja/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"最小"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"最大"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Bluetooth 接続デバイスで音声認識が処理されるようになりました"</string>
-    <string name="car_guest" msgid="318393171202663722">"ゲスト"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"ゲスト"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"ユーザーを追加"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"新しいユーザー"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"新しいユーザーを追加したら、そのユーザーは自分のスペースをセットアップする必要があります。"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"どのユーザーも他のすべてのユーザーに代わってアプリを更新できます。"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"読み込んでいます"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"ユーザーを読み込んでいます(<xliff:g id="FROM_USER">%1$d</xliff:g>~<xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"閉じる"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-ka/strings.xml b/packages/CarSystemUI/res/values-ka/strings.xml
deleted file mode 100644
index 7d62c62..0000000
--- a/packages/CarSystemUI/res/values-ka/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"მინ"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"მაქს"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"ხმის ამოცნობა დამუშავდება დაკავშირებული Bluetooth-მოწყობილობით"</string>
-    <string name="car_guest" msgid="318393171202663722">"სტუმარი"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"სტუმარი"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"მომხმარებლის დამატება"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"ახალი მომხმარებელი"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"ახალი მომხმარებლის დამატებისას, ამ მომხმარებელს საკუთარი სივრცის გამართვა მოუწევს."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"ნებისმიერ მომხმარებელს შეუძლია აპები ყველა სხვა მომხმარებლისათვის განაახლოს."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"იტვირთება"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"იტვირთება მომხმარებელი (<xliff:g id="FROM_USER">%1$d</xliff:g>-დან <xliff:g id="TO_USER">%2$d</xliff:g>-მდე)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"დახურვა"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-kk/strings.xml b/packages/CarSystemUI/res/values-kk/strings.xml
deleted file mode 100644
index 313fe81..0000000
--- a/packages/CarSystemUI/res/values-kk/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Мин."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Макс."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Дауысты тану үшін Bluetooth құрылғысы пайдаланылады."</string>
-    <string name="car_guest" msgid="318393171202663722">"Қонақ"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Қонақ"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Пайдаланушыны енгізу"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Жаңа пайдаланушы"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Қосылған жаңа пайдаланушы өз профилін реттеуі керек."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Кез келген пайдаланушы қолданбаларды басқа пайдаланушылар үшін жаңарта алады."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Жүктелуде"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Пайдаланушы профилі жүктелуде (<xliff:g id="FROM_USER">%1$d</xliff:g> – <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Жабу"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-km/strings.xml b/packages/CarSystemUI/res/values-km/strings.xml
deleted file mode 100644
index 709cfe5..0000000
--- a/packages/CarSystemUI/res/values-km/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"អប្បបរមា"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"អតិបរិមា"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"ឥឡូវនេះ ការសម្គាល់សំឡេងត្រូវបានចាត់ចែងដោយឧបករណ៍ដែលបានភ្ជាប់ប៊្លូធូស"</string>
-    <string name="car_guest" msgid="318393171202663722">"ភ្ញៀវ"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"ភ្ញៀវ"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"បញ្ចូល​អ្នក​ប្រើប្រាស់"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"អ្នក​ប្រើប្រាស់​ថ្មី"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"នៅពេលដែល​អ្នក​បញ្ចូល​អ្នក​ប្រើប្រាស់​ថ្មី បុគ្គល​នោះ​ត្រូវតែ​រៀបចំ​ទំហំ​ផ្ទុក​របស់គេ។"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"អ្នកប្រើប្រាស់​ណាក៏​អាច​ដំឡើងកំណែ​កម្មវិធី​សម្រាប់​អ្នកប្រើប្រាស់ទាំងអស់​ផ្សេងទៀត​បានដែរ។"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"កំពុងផ្ទុក"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"កំពុងផ្ទុក​អ្នកប្រើប្រាស់ (ពី <xliff:g id="FROM_USER">%1$d</xliff:g> ដល់ <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"បិទ"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-kn/strings.xml b/packages/CarSystemUI/res/values-kn/strings.xml
deleted file mode 100644
index b9667df..0000000
--- a/packages/CarSystemUI/res/values-kn/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"ಕನಿಷ್ಠ"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"ಗರಿಷ್ಠ"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"ಇದೀಗ ಕನೆಕ್ಟ್ ಆದ ಬ್ಲೂಟೂತ್ ಸಾಧನ ಧ್ವನಿ ಗುರುತಿಸುವಿಕೆ ನಿರ್ವಹಿಸಿದೆ"</string>
-    <string name="car_guest" msgid="318393171202663722">"ಅತಿಥಿ"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"ಅತಿಥಿ"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"ಹೊಸ ಬಳಕೆದಾರ"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"ನೀವು ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸೆಟಪ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"ಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಆ್ಯಪ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"ಲೋಡ್ ಆಗುತ್ತಿದೆ"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"ಬಳಕೆದಾರರನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ (<xliff:g id="FROM_USER">%1$d</xliff:g> ನಿಂದ <xliff:g id="TO_USER">%2$d</xliff:g> ವರೆಗೆ)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"ಮುಚ್ಚಿರಿ"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-ko/strings.xml b/packages/CarSystemUI/res/values-ko/strings.xml
deleted file mode 100644
index 17a2466..0000000
--- a/packages/CarSystemUI/res/values-ko/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"최소"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"최대"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"이제 연결된 블루투스 기기에서 음성 인식이 처리됩니다."</string>
-    <string name="car_guest" msgid="318393171202663722">"게스트"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"게스트"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"사용자 추가"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"신규 사용자"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"추가된 신규 사용자는 자신만의 공간을 설정해야 합니다."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"누구나 다른 모든 사용자를 위해 앱을 업데이트할 수 있습니다."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"로드 중"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"사용자 로드 중(<xliff:g id="FROM_USER">%1$d</xliff:g>님에서 <xliff:g id="TO_USER">%2$d</xliff:g>님으로)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"닫기"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-ky/strings.xml b/packages/CarSystemUI/res/values-ky/strings.xml
deleted file mode 100644
index 74150d0..0000000
--- a/packages/CarSystemUI/res/values-ky/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Мин."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Макс."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Үндү эми туташкан Bluetooth түзмөгү менен тааныса болот"</string>
-    <string name="car_guest" msgid="318393171202663722">"Конок"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Конок"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Колдонуучу кошуу"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Жаңы колдонуучу"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Жаңы колдонуучу кошулганда, ал өзүнүн профилин жөндөп алышы керек."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Колдонмолорду бир колдонуучу жаңыртканда, ал калган бардык колдонуучулар үчүн да жаңырат."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Жүктөлүүдө"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Колдонуучу тууралуу маалымат жүктөлүүдө (<xliff:g id="FROM_USER">%1$d</xliff:g> – <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Жабуу"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-lo/strings.xml b/packages/CarSystemUI/res/values-lo/strings.xml
deleted file mode 100644
index bc94a51..0000000
--- a/packages/CarSystemUI/res/values-lo/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"ນທ"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"ສູງສຸດ"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"ການຈຳແນກສຽງເວົ້າດຽວນີ້ຈັດການໂດຍອຸປະກອນ Bluetooth ທີ່ເຊື່ອມຕໍ່"</string>
-    <string name="car_guest" msgid="318393171202663722">"ແຂກ"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"ແຂກ"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"ເພີ່ມຜູ້ໃຊ້"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"ຜູ້ໃຊ້ໃໝ່"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"ເມື່ອທ່ານເພີ່ມຜູ້ໃຊ້ໃໝ່, ບຸກຄົນນັ້ນຈຳເປັນຕ້ອງຕັ້ງຄ່າພື້ນທີ່ຂອງເຂົາເຈົ້າ."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"ຜູ້ໃຊ້ຕ່າງໆສາມາດອັບເດດແອັບສຳລັບຜູ້ໃຊ້ອື່ນທັງໝົດໄດ້."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"ກຳລັງໂຫຼດ"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"ກຳລັງໂຫຼດຜູ້ໃຊ້ (ຈາກ <xliff:g id="FROM_USER">%1$d</xliff:g> ໄປຍັງ <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"ປິດ"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-lt/strings.xml b/packages/CarSystemUI/res/values-lt/strings.xml
deleted file mode 100644
index a47ad59..0000000
--- a/packages/CarSystemUI/res/values-lt/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Didž."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Balso atpažinimą dabar tvarko susietas „Bluetooth“ įrenginys"</string>
-    <string name="car_guest" msgid="318393171202663722">"Svečias"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Svečias"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Pridėti naudotoją"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Naujas naudotojas"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kai pridedate naują naudotoją, šis asmuo turi nustatyti savo vietą."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Bet kuris naudotojas gali atnaujinti visų kitų naudotojų programas."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Įkeliama"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Įkeliamas naudotojo profilis (<xliff:g id="FROM_USER">%1$d</xliff:g> – <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Uždaryti"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-lv/strings.xml b/packages/CarSystemUI/res/values-lv/strings.xml
deleted file mode 100644
index cb7c8b9..0000000
--- a/packages/CarSystemUI/res/values-lv/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Balss atpazīšanu tagad nodrošina pievienotā Bluetooth ierīce"</string>
-    <string name="car_guest" msgid="318393171202663722">"Viesis"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Viesis"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Pievienot lietotāju"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Jauns lietotājs"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kad pievienojat jaunu lietotāju, viņam ir jāizveido savs profils."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Ikviens lietotājs var atjaunināt lietotnes visu lietotāju vārdā."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Notiek ielāde…"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Notiek lietotāja profila ielāde (<xliff:g id="FROM_USER">%1$d</xliff:g>–<xliff:g id="TO_USER">%2$d</xliff:g>)…"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Aizvērt"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-mk/strings.xml b/packages/CarSystemUI/res/values-mk/strings.xml
deleted file mode 100644
index cd2ae97..0000000
--- a/packages/CarSystemUI/res/values-mk/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Мин."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Макс."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Поврзаниот уред со Bluetooth управува со препознавањето глас"</string>
-    <string name="car_guest" msgid="318393171202663722">"Гостин"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Гостин"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Додај корисник"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Нов корисник"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Кога додавате нов корисник, тоа лице треба да го постави својот простор."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Секој корисник може да ажурира апликации за сите други корисници."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Се вчитува"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Се вчитува корисникот (од <xliff:g id="FROM_USER">%1$d</xliff:g> до <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Затвори"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-ml/strings.xml b/packages/CarSystemUI/res/values-ml/strings.xml
deleted file mode 100644
index 613ea59..0000000
--- a/packages/CarSystemUI/res/values-ml/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"മിനിമം"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"മാക്സിമം"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"കണക്റ്റ് ചെയ്ത Bluetooth ഉപകരണം വഴി ഇപ്പോൾ വോയ്‌സ് തിരിച്ചറിയൽ കെെകാര്യം ചെയ്യുന്നു"</string>
-    <string name="car_guest" msgid="318393171202663722">"അതിഥി"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"അതിഥി"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"ഉപയോക്താവിനെ ചേർക്കുക"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"പുതിയ ഉപയോക്താവ്"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"നിങ്ങളൊരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തി സ്വന്തം ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"ഏതൊരു ഉപയോക്താവിനും മറ്റെല്ലാ ഉപയോക്താക്കൾക്കുമായി ആപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്യാനാവും."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"ലോഡ് ചെയ്യുന്നു"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"ഉപയോക്തൃ പ്രൊഫൈൽ ലോഡ് ചെയ്യുന്നു (<xliff:g id="FROM_USER">%1$d</xliff:g> എന്നതിൽ നിന്ന് <xliff:g id="TO_USER">%2$d</xliff:g> എന്നതിലേക്ക്)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"അടയ്ക്കുക"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-mn/strings.xml b/packages/CarSystemUI/res/values-mn/strings.xml
deleted file mode 100644
index 33bcd27..0000000
--- a/packages/CarSystemUI/res/values-mn/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Бага"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Их"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Одоо дуугаар танихыг холбогдсон Bluetooth төхөөрөмж удирдана"</string>
-    <string name="car_guest" msgid="318393171202663722">"Зочин"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Зочин"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Хэрэглэгч нэмэх"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Шинэ хэрэглэгч"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Та шинэ хэрэглэгч нэмэх үед тухайн хэрэглэгч хувийн орон зайгаа тохируулах шаардлагатай."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Бусад бүх хэрэглэгчийн аппыг дурын хэрэглэгч шинэчлэх боломжтой."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Ачаалж байна"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Хэрэглэгчийг ачаалж байна (<xliff:g id="FROM_USER">%1$d</xliff:g>-с <xliff:g id="TO_USER">%2$d</xliff:g> хүртэл)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Хаах"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-mr/strings.xml b/packages/CarSystemUI/res/values-mr/strings.xml
deleted file mode 100644
index b1c8a72..0000000
--- a/packages/CarSystemUI/res/values-mr/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"मि"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"कमाल"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"आता कनेक्ट केलेले ब्लूटूथ डिव्हाइस व्हॉइस रेकग्निशन हाताळते"</string>
-    <string name="car_guest" msgid="318393171202663722">"अतिथी"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"अतिथी"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"वापरकर्ता जोडा"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"नवीन वापरकर्ता"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"तुम्ही नवीन वापरकर्ता जोडता तेव्हा त्या व्यक्तीने त्यांची जागा सेट करणे आवश्यक असते."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"कोणताही वापरकर्ता इतर सर्व वापरकर्त्यांसाठी अ‍ॅप्स अपडेट करू शकतो."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"लोड करत आहे"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"वापरकर्ता लोड करत आहे (<xliff:g id="FROM_USER">%1$d</xliff:g> पासून <xliff:g id="TO_USER">%2$d</xliff:g> पर्यंत)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"बंद करा"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-ms/strings.xml b/packages/CarSystemUI/res/values-ms/strings.xml
deleted file mode 100644
index 0bb683b..0000000
--- a/packages/CarSystemUI/res/values-ms/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Pengecaman suara kini dikendalikan peranti Bluetooth tersmbg"</string>
-    <string name="car_guest" msgid="318393171202663722">"Tetamu"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Tetamu"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Tambah Pengguna"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Pengguna Baharu"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Apabila anda menambahkan pengguna baharu, orang itu perlu menyediakan ruang mereka."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Mana-mana pengguna boleh mengemas kini apl untuk semua pengguna lain."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Memuatkan"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Memuatkan pengguna (daripada <xliff:g id="FROM_USER">%1$d</xliff:g> hingga <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Tutup"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-my/strings.xml b/packages/CarSystemUI/res/values-my/strings.xml
deleted file mode 100644
index 4e7ca39..0000000
--- a/packages/CarSystemUI/res/values-my/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"နိမ့်"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"မြင့်"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"ချိတ်ထားသော ဘလူးတုသ်စက်ဖြင့် အသံမှတ်သားမှုကို ထိန်းချုပ်သည်"</string>
-    <string name="car_guest" msgid="318393171202663722">"ဧည့်သည်"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"ဧည့်သည်"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"အသုံးပြုသူ ထည့်ရန်"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"အသုံးပြုသူ အသစ်"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"အသုံးပြုသူအသစ် ထည့်သည့်အခါ ထိုသူသည် မိမိ၏ နေရာကို စနစ်ထည့်သွင်းရပါမည်။"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"မည်သူမဆို အသုံးပြုသူအားလုံးအတွက် အက်ပ်များကို အပ်ဒိတ်လုပ်နိုင်သည်။"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"ဖွင့်နေသည်"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"အသုံးပြုသူကို ဖွင့်နေသည် (<xliff:g id="FROM_USER">%1$d</xliff:g> မှ <xliff:g id="TO_USER">%2$d</xliff:g> သို့)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"ပိတ်ရန်"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-nb/strings.xml b/packages/CarSystemUI/res/values-nb/strings.xml
deleted file mode 100644
index 0b2856f..0000000
--- a/packages/CarSystemUI/res/values-nb/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Talegjenkjenning håndteres nå av tilkoblet Bluetooth-enhet"</string>
-    <string name="car_guest" msgid="318393171202663722">"Gjest"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Gjest"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Legg til bruker"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Ny bruker"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Når du legger til en ny bruker, må vedkommende konfigurere sitt eget område."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Alle brukere kan oppdatere apper for alle andre brukere."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Laster inn"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Laster inn brukeren (fra <xliff:g id="FROM_USER">%1$d</xliff:g> til <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Lukk"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-ne/strings.xml b/packages/CarSystemUI/res/values-ne/strings.xml
deleted file mode 100644
index 3a25d6e0..0000000
--- a/packages/CarSystemUI/res/values-ne/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"न्यूनतम"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"अधिकतम"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"अब ब्लुटुथ मार्फत जोडिएको यन्त्रले आवाज पहिचान गर्ने कार्य सम्हाल्छ"</string>
-    <string name="car_guest" msgid="318393171202663722">"अतिथि"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"अतिथि"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"प्रयोगकर्ता थप्नुहोस्"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"नयाँ प्रयोगकर्ता"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"तपाईंले नयाँ प्रयोगकर्ता थप्दा ती व्यक्तिले आफ्नो स्थान सेटअप गर्नु पर्छ।"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"सबै प्रयोगकर्ताले अन्य प्रयोगकर्ताका अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्।"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"लोड गरिँदै"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"प्रयोगकर्तासम्बन्धी जानकारी लोड गरिँदै (<xliff:g id="FROM_USER">%1$d</xliff:g> बाट <xliff:g id="TO_USER">%2$d</xliff:g> मा)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"बन्द गर्नुहोस्"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-night/colors.xml b/packages/CarSystemUI/res/values-night/colors.xml
deleted file mode 100644
index a2edd7dc..0000000
--- a/packages/CarSystemUI/res/values-night/colors.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-    <color name="car_accent">#356FE5</color>
-    <color name="status_bar_background_color">#ff000000</color>
-    <color name="system_bar_background_opaque">#ff0c1013</color>
-
-    <!-- The background color of the notification shade -->
-    <color name="notification_shade_background_color">#E0000000</color>
-    
-    <!-- The color of the ripples on the untinted notifications -->
-    <color name="notification_ripple_untinted_color">@color/ripple_material_dark</color>
-</resources>
diff --git a/packages/CarSystemUI/res/values-nl/strings.xml b/packages/CarSystemUI/res/values-nl/strings.xml
deleted file mode 100644
index 4765f71..0000000
--- a/packages/CarSystemUI/res/values-nl/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Spraakherkenning actief via een verbonden bluetooth-apparaat"</string>
-    <string name="car_guest" msgid="318393171202663722">"Gast"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Gast"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Gebruiker toevoegen"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Nieuwe gebruiker"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Als je een nieuwe gebruiker toevoegt, moet die persoon een eigen profiel instellen."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Elke gebruiker kan apps updaten voor alle andere gebruikers"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Laden"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Gebruiker laden (van <xliff:g id="FROM_USER">%1$d</xliff:g> naar <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Sluiten"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-or/strings.xml b/packages/CarSystemUI/res/values-or/strings.xml
deleted file mode 100644
index 4168d5a..0000000
--- a/packages/CarSystemUI/res/values-or/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"ସର୍ବନିମ୍ନ"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"ସର୍ବାଧିକ"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"ଭଏସ ଚିହ୍ନଟକରଣ ଏବେ ସଂଯୁକ୍ତ ଥିବା ବ୍ଲୁଟୁଥ ଡିଭାଇସ ଦ୍ୱାରା ପରିଚାଳିତ"</string>
-    <string name="car_guest" msgid="318393171202663722">"ଅତିଥି"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"ଅତିଥି"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଯୋଗ କରନ୍ତୁ"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"ଜଣେ ନୂଆ ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଯୋଗ କରିବା ବେଳେ ସେହି ବ୍ୟକ୍ତିଙ୍କୁ ତାଙ୍କ ସ୍ଥାନ ସେଟ୍ ଅପ୍ କରିବାର ଆବଶ୍ୟକତା ଅଛି।"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"ଯେ କୌଣସି ଉପଯୋଗକର୍ତ୍ତା ଅନ୍ୟ ସମସ୍ତ ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଆପଗୁଡ଼ିକୁ ଅପଡେଟ୍ କରିପାରିବେ।"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"ଲୋଡ୍ କରାଯାଉଛି"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଲୋଡ୍ କରାଯାଉଛି (<xliff:g id="FROM_USER">%1$d</xliff:g>ଙ୍କ ଠାରୁ <xliff:g id="TO_USER">%2$d</xliff:g> ପର୍ଯ୍ୟନ୍ତ)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"ବନ୍ଦ କରନ୍ତୁ"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-pa/strings.xml b/packages/CarSystemUI/res/values-pa/strings.xml
deleted file mode 100644
index 3d9d3a597..0000000
--- a/packages/CarSystemUI/res/values-pa/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"ਨਿਊਨਤਮ"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"ਅਧਿਕਤਮ"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"ਅਵਾਜ਼ ਦੀ ਪਛਾਣ ਨੂੰ ਹੁਣ ਕਨੈਕਟ ਕੀਤਾ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਸੰਭਾਲਦਾ ਹੈ"</string>
-    <string name="car_guest" msgid="318393171202663722">"ਮਹਿਮਾਨ"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"ਮਹਿਮਾਨ"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰੋ"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"ਜਦੋਂ ਤੁਸੀਂ ਕੋਈ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਉਸ ਵਿਅਕਤੀ ਨੂੰ ਆਪਣੀ ਜਗ੍ਹਾ ਸੈੱਟਅੱਪ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"ਕੋਈ ਵੀ ਵਰਤੋਂਕਾਰ ਹੋਰ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰ ਸਕਦਾ ਹੈ।"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"ਵਰਤੋਂਕਾਰ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ (<xliff:g id="FROM_USER">%1$d</xliff:g> ਤੋਂ <xliff:g id="TO_USER">%2$d</xliff:g> ਤੱਕ)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"ਬੰਦ ਕਰੋ"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-pl/strings.xml b/packages/CarSystemUI/res/values-pl/strings.xml
deleted file mode 100644
index 52b90f1..0000000
--- a/packages/CarSystemUI/res/values-pl/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Rozpoznawanie mowy przez połączone urządzenie Bluetooth"</string>
-    <string name="car_guest" msgid="318393171202663722">"Gość"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Gość"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Dodaj użytkownika"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Nowy użytkownik"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Gdy dodasz nowego użytkownika, musi on skonfigurować swój profil."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Każdy użytkownik może aktualizować aplikacje wszystkich innych użytkowników."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Ładuję"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Ładuję użytkownika (od <xliff:g id="FROM_USER">%1$d</xliff:g> do <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Zamknij"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-pt-rPT/strings.xml b/packages/CarSystemUI/res/values-pt-rPT/strings.xml
deleted file mode 100644
index 2dffa17..0000000
--- a/packages/CarSystemUI/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Mín."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Máx."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Reconhecimento de voz agora através do disp. Bluetooth lig."</string>
-    <string name="car_guest" msgid="318393171202663722">"Convidado"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Convidado"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Adicionar utilizador"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Novo utilizador"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Qualquer utilizador pode atualizar apps para todos os outros utilizadores."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"A carregar…"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"A carregar o utilizador (de <xliff:g id="FROM_USER">%1$d</xliff:g> para <xliff:g id="TO_USER">%2$d</xliff:g>)…"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Fechar"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-pt/strings.xml b/packages/CarSystemUI/res/values-pt/strings.xml
deleted file mode 100644
index a7c44d2..0000000
--- a/packages/CarSystemUI/res/values-pt/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Mín"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Máx"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Reconhecimento de voz com dispositivo Bluetooth conectado"</string>
-    <string name="car_guest" msgid="318393171202663722">"Convidado"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Convidado"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Adicionar usuário"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Novo usuário"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Quando você adiciona um usuário novo, essa pessoa precisa configurar o espaço dela."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Qualquer usuário pode atualizar apps para os demais usuários."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Carregando"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Carregando usuário (de <xliff:g id="FROM_USER">%1$d</xliff:g> para <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Fechar"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-ro/strings.xml b/packages/CarSystemUI/res/values-ro/strings.xml
deleted file mode 100644
index 1a4e71d..0000000
--- a/packages/CarSystemUI/res/values-ro/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Recunoașterea vocală acum gestionată de dispozitivul Bluetooth conectat"</string>
-    <string name="car_guest" msgid="318393171202663722">"Invitat"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Invitat"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Adăugați un utilizator"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Utilizator nou"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Când adăugați un utilizator nou, acesta trebuie să-și configureze spațiul."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Orice utilizator poate actualiza aplicațiile pentru toți ceilalți utilizatori."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Se încarcă"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Se încarcă utilizatorul (de la <xliff:g id="FROM_USER">%1$d</xliff:g> la <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Închideți"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-ru/strings.xml b/packages/CarSystemUI/res/values-ru/strings.xml
deleted file mode 100644
index 330ba2f..0000000
--- a/packages/CarSystemUI/res/values-ru/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Мин."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Макс."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Для распознавания речи используется Bluetooth-устройство."</string>
-    <string name="car_guest" msgid="318393171202663722">"Гость"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Гость"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Добавить пользователя"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Новый пользователь"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Когда вы добавите пользователя, ему потребуется настроить профиль."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Любой пользователь устройства может обновлять приложения для всех аккаунтов."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Загрузка…"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Загрузка профиля пользователя (с <xliff:g id="FROM_USER">%1$d</xliff:g> по <xliff:g id="TO_USER">%2$d</xliff:g>)…"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Закрыть"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-si/strings.xml b/packages/CarSystemUI/res/values-si/strings.xml
deleted file mode 100644
index 6391d28..0000000
--- a/packages/CarSystemUI/res/values-si/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"අවම"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"උපරිම"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"හඬ හැඳුනුම දැන් සම්බන්ධ බ්ලූටූත් උපාංගය මගින් හසුරුවනු ලැබේ"</string>
-    <string name="car_guest" msgid="318393171202663722">"අමුත්තා"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"අමුත්තා"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"පරිශීලක එක් කරන්න"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"නව පරිශීලක"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"ඔබ අලුත් පරිශීලකයෙකු එක් කරන විට, එම පුද්ගලයා තමන්ගේ ඉඩ සකසා ගැනීමට අවශ්‍ය වේ."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"සියලුම අනෙක් පරිශීලකයින් සඳහා ඕනෑම පරිශීලකයෙකුට යෙදුම් යාවත්කාලීන කළ හැක."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"පූරණය වෙමින්"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"පරිශීලකයා පූරණය වෙමින් (<xliff:g id="FROM_USER">%1$d</xliff:g> සිට <xliff:g id="TO_USER">%2$d</xliff:g> වෙත)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"වසන්න"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-sk/strings.xml b/packages/CarSystemUI/res/values-sk/strings.xml
deleted file mode 100644
index 80b9b5e..0000000
--- a/packages/CarSystemUI/res/values-sk/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"max."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Rozpoznávanie hlasu teraz prebieha v pripoj. zar. Bluetooth"</string>
-    <string name="car_guest" msgid="318393171202663722">"Hosť"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Hosť"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Pridať používateľa"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Nový používateľ"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Keď pridáte nového používateľa, musí si nastaviť vlastný priestor."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Každý používateľ môže aktualizovať aplikácie pre všetkých ostatných používateľov."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Načítava sa"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Načítava sa používateľ (predchádzajúci: <xliff:g id="FROM_USER">%1$d</xliff:g>, nasledujúci: <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Zavrieť"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-sl/strings.xml b/packages/CarSystemUI/res/values-sl/strings.xml
deleted file mode 100644
index b67002b..0000000
--- a/packages/CarSystemUI/res/values-sl/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Najn."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Najv."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Prepoznavanje glasu zdaj izvaja povezana naprava Bluetooth"</string>
-    <string name="car_guest" msgid="318393171202663722">"Gost"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Gost"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Dodaj uporabnika"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Nov uporabnik"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Ko dodate novega uporabnika, mora ta nastaviti svoj prostor."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Vsak uporabnik lahko posodobi aplikacije za vse druge uporabnike."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Nalaganje"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Nalaganje uporabnika (od uporabnika <xliff:g id="FROM_USER">%1$d</xliff:g> do uporabnika <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Zapri"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-sq/strings.xml b/packages/CarSystemUI/res/values-sq/strings.xml
deleted file mode 100644
index d19e158..0000000
--- a/packages/CarSystemUI/res/values-sq/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Njohja zanore trajtohet nga pajisja me Bluetooth-in e lidhur"</string>
-    <string name="car_guest" msgid="318393171202663722">"I ftuar"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"I ftuar"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Shto përdorues"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Përdorues i ri"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kur shton një përdorues të ri, ai person duhet të konfigurojë hapësirën e vet."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Çdo përdorues mund t\'i përditësojë aplikacionet për të gjithë përdoruesit e tjerë."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Po ngarkohet"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Përdoruesi po ngarkohet (nga <xliff:g id="FROM_USER">%1$d</xliff:g> te <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Mbyll"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-sr/strings.xml b/packages/CarSystemUI/res/values-sr/strings.xml
deleted file mode 100644
index a5fb5b4..0000000
--- a/packages/CarSystemUI/res/values-sr/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Мин."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maкс."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Препознавањем гласа сада управља повезани Bluetooth уређај"</string>
-    <string name="car_guest" msgid="318393171202663722">"Гост"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Гост"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Додај корисника"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Нови корисник"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Када додате новог корисника, та особа треба да подеси свој простор."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Сваки корисник може да ажурира апликације за све остале кориснике."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Учитава се"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Профил корисника се учитава (из<xliff:g id="FROM_USER">%1$d</xliff:g> у <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Затвори"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-sv/strings.xml b/packages/CarSystemUI/res/values-sv/strings.xml
deleted file mode 100644
index 8a942d6..0000000
--- a/packages/CarSystemUI/res/values-sv/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Nu hanteras röstigenkänning via en anstluten Bluetooth-enhet"</string>
-    <string name="car_guest" msgid="318393171202663722">"Gäst"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Gäst"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Lägg till användare"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Ny användare"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"När du lägger till en ny användare måste den personen konfigurera sitt utrymme."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Alla användare kan uppdatera appar för andra användare."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Läser in"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Läser in användare (från <xliff:g id="FROM_USER">%1$d</xliff:g> till <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Stäng"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-sw/strings.xml b/packages/CarSystemUI/res/values-sw/strings.xml
deleted file mode 100644
index be03373..0000000
--- a/packages/CarSystemUI/res/values-sw/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Chini"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Juu"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Utambuzi wa sauti sasa unashughulikiwa na kifaa kilichounganishwa cha Bluetooth"</string>
-    <string name="car_guest" msgid="318393171202663722">"Mgeni"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Mgeni"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Ongeza Mtumiaji"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Mtumiaji Mpya"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Ukiongeza mtumiaji mpya, ni lazima aweke kikundi chake."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Mtumiaji yeyote anaweza kusasisha programu za watumiaji wengine."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Inapakia"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Inapakia wasifu wa mtumiaji (kutoka <xliff:g id="FROM_USER">%1$d</xliff:g> kuwa <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Funga"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-ta/strings.xml b/packages/CarSystemUI/res/values-ta/strings.xml
deleted file mode 100644
index a82a2f8..0000000
--- a/packages/CarSystemUI/res/values-ta/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"குறைந்தபட்சம்"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"அதிகபட்சம்"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"இணைக்கப்பட்ட புளூடூத் சாதனத்தால் \'குரல் அறிதல்\' கையாளப்படுகிறது"</string>
-    <string name="car_guest" msgid="318393171202663722">"கெஸ்ட்"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"கெஸ்ட்"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"பயனரைச் சேருங்கள்"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"புதிய பயனர்"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"புதிய பயனரைச் சேர்க்கும்போது அவர் தனக்கான சேமிப்பிடத்தை அமைக்க வேண்டும்."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"எந்தப் பயனரும் பிற பயனர்கள் சார்பாக ஆப்ஸைப் புதுப்பிக்க முடியும்."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"ஏற்றுகிறது"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"பயனர் தகவலை ஏற்றுகிறது (<xliff:g id="FROM_USER">%1$d</xliff:g>லிருந்து <xliff:g id="TO_USER">%2$d</xliff:g> வரை)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"மூடுக"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-te/strings.xml b/packages/CarSystemUI/res/values-te/strings.xml
deleted file mode 100644
index cf74f80..0000000
--- a/packages/CarSystemUI/res/values-te/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"కని."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"గరి."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"నేడు వాయిస్ గుర్తింపును కనెక్ట్ అయిన బ్లూటూత్ నిర్వహిస్తోంది"</string>
-    <string name="car_guest" msgid="318393171202663722">"గెస్ట్"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"గెస్ట్"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"యూజర్‌ను జోడించండి"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"కొత్త యూజర్"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"మీరు కొత్త యూజర్‌ను జోడించినప్పుడు, ఆ వ్యక్తి తన స్పేస్‌ను సెటప్ చేసుకోవాలి."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"ఏ యూజర్ అయినా మిగతా యూజర్‌ల కోసం యాప్‌లను అప్‌డేట్ చేయవచ్చు."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"లోడ్ అవుతోంది"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"యూజర్‌ను లోడ్ చేస్తోంది (<xliff:g id="FROM_USER">%1$d</xliff:g> నుండి <xliff:g id="TO_USER">%2$d</xliff:g> వరకు)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"మూసివేయి"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-th/strings.xml b/packages/CarSystemUI/res/values-th/strings.xml
deleted file mode 100644
index dacf605..0000000
--- a/packages/CarSystemUI/res/values-th/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"ตอนนี้อุปกรณ์บลูทูธที่เชื่อมต่อจะจัดการการจดจำเสียง"</string>
-    <string name="car_guest" msgid="318393171202663722">"ผู้ใช้ชั่วคราว"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"ผู้ใช้ชั่วคราว"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"เพิ่มผู้ใช้"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"ผู้ใช้ใหม่"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"เมื่อคุณเพิ่มผู้ใช้ใหม่ ผู้ใช้ดังกล่าวจะต้องตั้งค่าพื้นที่ของตนเอง"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"ผู้ใช้ทุกคนจะอัปเดตแอปให้แก่ผู้ใช้คนอื่นๆ ได้"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"กำลังโหลด"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"กำลังโหลดผู้ใช้ (จาก <xliff:g id="FROM_USER">%1$d</xliff:g> ถึง <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"ปิด"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-tl/strings.xml b/packages/CarSystemUI/res/values-tl/strings.xml
deleted file mode 100644
index 89d8cd2..0000000
--- a/packages/CarSystemUI/res/values-tl/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Minuto"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Max"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Hawak na ngayon ng Bluetooth device ang Pagkilala ng boses"</string>
-    <string name="car_guest" msgid="318393171202663722">"Bisita"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Bisita"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Magdagdag ng User"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Bagong User"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kapag nagdagdag ka ng bagong user, kailangang i-set up ng taong iyon ang kanyang espasyo."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Puwedeng i-update ng sinumang user ang mga app para sa lahat ng iba pang user."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Naglo-load"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Nilo-load ang user (mula kay <xliff:g id="FROM_USER">%1$d</xliff:g> papunta kay <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Isara"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-tr/strings.xml b/packages/CarSystemUI/res/values-tr/strings.xml
deleted file mode 100644
index 36bf694..0000000
--- a/packages/CarSystemUI/res/values-tr/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Artık ses tanıma, bağlı Bluetooth cihazı tarafından işleniyor"</string>
-    <string name="car_guest" msgid="318393171202663722">"Misafir"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Misafir"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Kullanıcı Ekle"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Yeni Kullanıcı"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Yeni kullanıcı eklediğinizde, bu kişinin alanını ayarlaması gerekir."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Herhangi bir kullanıcı, diğer tüm kullanıcılar için uygulamaları güncelleyebilir."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Yükleniyor"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Kullanıcı yükleniyor (<xliff:g id="FROM_USER">%1$d</xliff:g> kullanıcısından <xliff:g id="TO_USER">%2$d</xliff:g> kullanıcısına)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Kapat"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-uk/strings.xml b/packages/CarSystemUI/res/values-uk/strings.xml
deleted file mode 100644
index 391513f..0000000
--- a/packages/CarSystemUI/res/values-uk/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Мін."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Макс."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Голос розпізнається через підключений пристрій Bluetooth"</string>
-    <string name="car_guest" msgid="318393171202663722">"Гість"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Гість"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Додати користувача"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Новий користувач"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Коли ви додаєте нового користувача, він має налаштувати свій профіль."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Усі користувачі можуть оновлювати додатки для решти людей."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Завантаження"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Завантаження профілю користувача (від <xliff:g id="FROM_USER">%1$d</xliff:g> до <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Закрити"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-ur/strings.xml b/packages/CarSystemUI/res/values-ur/strings.xml
deleted file mode 100644
index abe9214..0000000
--- a/packages/CarSystemUI/res/values-ur/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"کم از کم"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"زیادہ سے زیادہ"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"آواز کی شناخت اب منسلک کردہ بلوٹوتھ آلے سے ہوتی ہے"</string>
-    <string name="car_guest" msgid="318393171202663722">"مہمان"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"مہمان"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"صارف شامل کریں"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"نیا صارف"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"جب آپ ایک نیا صارف شامل کرتے ہیں تو اس شخص کو اپنی جگہ سیٹ کرنی ہوتی ہے۔"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"کوئی بھی صارف دیگر سبھی صارفین کے لیے ایپس کو اپ ڈیٹ کر سکتا ہے۔"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"لوڈ ہو رہی ہے"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"صارف کی نئی پروفائل لوڈ ہو رہی ہے (<xliff:g id="FROM_USER">%1$d</xliff:g> سے <xliff:g id="TO_USER">%2$d</xliff:g> کو)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"بند کریں"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-uz/strings.xml b/packages/CarSystemUI/res/values-uz/strings.xml
deleted file mode 100644
index 398d1f5..0000000
--- a/packages/CarSystemUI/res/values-uz/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Daq."</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Endi ovozni tanish Bluetooth qurilma ulanganda amalga oshadi"</string>
-    <string name="car_guest" msgid="318393171202663722">"Mehmon"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Mehmon"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Foydalanuvchi kiritish"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Yangi foydalanuvchi"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Yangi profil kiritilgach, uni sozlash lozim."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Qurilmaning istalgan foydalanuvchisi ilovalarni barcha hisoblar uchun yangilashi mumkin."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Yuklanmoqda"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Foydalanuvchi profili yuklanmoqda (<xliff:g id="FROM_USER">%1$d</xliff:g> – <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Yopish"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-vi/strings.xml b/packages/CarSystemUI/res/values-vi/strings.xml
deleted file mode 100644
index f15320f..0000000
--- a/packages/CarSystemUI/res/values-vi/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Tối thiểu"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Tối đa"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Thiết bị Bluetooth được kết nối đang xử lý vấn đề nhận dạng giọng nói"</string>
-    <string name="car_guest" msgid="318393171202663722">"Khách"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Khách"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Thêm người dùng"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Người dùng mới"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Khi bạn thêm một người dùng mới, người đó cần thiết lập không gian của mình."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Bất kỳ người dùng nào cũng có thể cập nhật ứng dụng cho tất cả những người dùng khác."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Đang tải"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Đang tải hồ sơ người dùng (từ <xliff:g id="FROM_USER">%1$d</xliff:g> sang <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Đóng"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-zh-rCN/strings.xml b/packages/CarSystemUI/res/values-zh-rCN/strings.xml
deleted file mode 100644
index a91f48c..0000000
--- a/packages/CarSystemUI/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"最小"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"最大"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"现在由已连接的蓝牙设备处理语音识别操作"</string>
-    <string name="car_guest" msgid="318393171202663722">"访客"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"访客"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"添加用户"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"新用户"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"当您添加新用户时,该用户需要自行设置个人空间。"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"任何用户均可为所有其他用户更新应用。"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"正在加载"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"正在加载用户(从 <xliff:g id="FROM_USER">%1$d</xliff:g> 到 <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"关闭"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-zh-rHK/strings.xml b/packages/CarSystemUI/res/values-zh-rHK/strings.xml
deleted file mode 100644
index 7aa6116..0000000
--- a/packages/CarSystemUI/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"最小"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"最大"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"現在由已連線的藍牙裝置處理語音辨識作業"</string>
-    <string name="car_guest" msgid="318393171202663722">"訪客"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"訪客"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"新增使用者"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"新使用者"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"新增的使用者需要自行設定個人空間。"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"任何使用者都可以為所有其他使用者更新應用程式。"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"正在載入"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"正在載入使用者 (由 <xliff:g id="FROM_USER">%1$d</xliff:g> 至 <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"關閉"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-zh-rTW/strings.xml b/packages/CarSystemUI/res/values-zh-rTW/strings.xml
deleted file mode 100644
index c062463..0000000
--- a/packages/CarSystemUI/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"最小"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"最大"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"現在由已連線的藍牙裝置處理語音辨識作業"</string>
-    <string name="car_guest" msgid="318393171202663722">"訪客"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"訪客"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"新增使用者"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"新使用者"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"新使用者必須自行設定個人空間。"</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"任何使用者都能為所有其他使用者更新應用程式。"</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"載入中"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"正在載入使用者 (從 <xliff:g id="FROM_USER">%1$d</xliff:g> 到 <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"關閉"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values-zu/strings.xml b/packages/CarSystemUI/res/values-zu/strings.xml
deleted file mode 100644
index 2dd33d8..0000000
--- a/packages/CarSystemUI/res/values-zu/strings.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="hvac_min_text" msgid="8167124789068494624">"Okuncane"</string>
-    <string name="hvac_max_text" msgid="3669693372074755551">"Okuningi"</string>
-    <string name="voice_recognition_toast" msgid="1149934534584052842">"Ukubonwa kwezwi manje kuphethwe idivayisi exhunyiwe ye-Bluetooth"</string>
-    <string name="car_guest" msgid="318393171202663722">"Isihambeli"</string>
-    <string name="start_guest_session" msgid="497784785761754874">"Isihambeli"</string>
-    <string name="car_add_user" msgid="4067337059622483269">"Engeza umsebenzisi"</string>
-    <string name="car_new_user" msgid="6637442369728092473">"Umsebenzisi omusha"</string>
-    <string name="user_add_user_message_setup" msgid="1035578846007352323">"Uma ungeza umsebenzisi omusha, loyo muntu udinga ukusetha izikhala zakhe."</string>
-    <string name="user_add_user_message_update" msgid="7061671307004867811">"Noma yimuphi umsebenzisi angabuyekeza izinhlelo zokusebenza zabanye abasebenzisi."</string>
-    <string name="car_loading_profile" msgid="4507385037552574474">"Iyalayisha"</string>
-    <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Ilayisha umsebenzisi (kusuka ku-<xliff:g id="FROM_USER">%1$d</xliff:g> kuya ku-<xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
-    <string name="rear_view_camera_close_button_text" msgid="8430918817320533693">"Vala"</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values/attrs.xml b/packages/CarSystemUI/res/values/attrs.xml
deleted file mode 100644
index 7883764..0000000
--- a/packages/CarSystemUI/res/values/attrs.xml
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<resources>
-    <attr name="icon" format="reference"/>
-    <attr name="selectedIcon" format="reference"/>
-    <attr name="intent" format="string"/>
-    <attr name="longIntent" format="string"/>
-    <attr name="selectedAlpha" format="float" />
-    <attr name="unselectedAlpha" format="float" />
-
-    <!-- Custom attributes to configure hvac values -->
-    <declare-styleable name="AnimatedTemperatureView">
-        <attr name="hvacAreaId" format="integer"/>
-        <attr name="hvacPropertyId" format="integer"/>
-        <attr name="hvacTempFormat" format="string"/>
-        <!-- how far away the animations should center around -->
-        <attr name="hvacPivotOffset" format="dimension"/>
-        <attr name="hvacMinValue" format="float"/>
-        <attr name="hvacMaxValue" format="float"/>
-        <attr name="hvacMinText" format="string|reference"/>
-        <attr name="hvacMaxText" format="string|reference"/>
-        <attr name="android:gravity"/>
-        <attr name="android:minEms"/>
-        <attr name="android:textAppearance"/>
-    </declare-styleable>
-
-    <!-- Allow for custom attribs to be added to a nav button -->
-    <declare-styleable name="CarNavigationButton">
-        <!-- intent to start when button is click -->
-        <attr name="intent" />
-        <!-- intent to start when a long press has happened -->
-        <attr name="longIntent" />
-        <!-- start the intent as a broad cast instead of an activity if true-->
-        <attr name="broadcast" format="boolean"/>
-        <!-- Alpha value to used when in selected state.  Defaults 1f  -->
-        <attr name="selectedAlpha" />
-        <!-- Alpha value to used when in un-selected state.  Defaults 0.7f  -->
-        <attr name="unselectedAlpha" />
-        <!-- icon to be rendered when in selected state -->
-        <attr name="selectedIcon" />
-        <!-- icon to be rendered (drawable) -->
-        <attr name="icon"/>
-        <!-- categories that will be added as extras to the fired intents -->
-        <attr name="categories" format="string"/>
-        <!-- package names that will be added as extras to the fired intents -->
-        <attr name="packages" format="string" />
-        <!-- componentName names that will be used for detecting selected state -->
-        <attr name="componentNames" format="string" />
-        <!-- whether to highlight the button when selected. Defaults false -->
-        <attr name="showMoreWhenSelected" format="boolean" />
-        <!-- whether to highlight the button when selected. Defaults false -->
-        <attr name="highlightWhenSelected" format="boolean" />
-        <!-- whether to show the icon of the app currently associated this button's role. Only
-             relevant for buttons associated to specific roles (e.g.: AssistantButton).
-             Defaults false -->
-        <attr name="useDefaultAppIconForRole" format="boolean"/>
-    </declare-styleable>
-
-    <!-- Custom attributes to configure hvac values -->
-    <declare-styleable name="TemperatureView">
-        <attr name="hvacAreaId" format="integer"/>
-        <attr name="hvacPropertyId" format="integer"/>
-        <attr name="hvacTempFormat" format="string"/>
-    </declare-styleable>
-
-    <declare-styleable name="carVolumeItems"/>
-    <declare-styleable name="carVolumeItems_item">
-        <!-- Align with AudioAttributes.USAGE_* -->
-        <attr name="usage">
-            <enum name="unknown" value="0"/>
-            <enum name="media" value="1"/>
-            <enum name="voice_communication" value="2"/>
-            <enum name="voice_communication_signalling" value="3"/>
-            <enum name="alarm" value="4"/>
-            <enum name="notification" value="5"/>
-            <enum name="notification_ringtone" value="6"/>
-            <enum name="notification_communication_request" value="7"/>
-            <enum name="notification_communication_instant" value="8"/>
-            <enum name="notification_communication_delayed" value="9"/>
-            <enum name="notification_event" value="10"/>
-            <enum name="assistance_accessibility" value="11"/>
-            <enum name="assistance_navigation_guidance" value="12"/>
-            <enum name="assistance_sonification" value="13"/>
-            <enum name="game" value="14"/>
-            <!-- hidden, do not use -->
-            <!-- enum name="virtual_source" value="15"/ -->
-            <enum name="assistant" value="16"/>
-            <enum name="call_assistant" value="17"/>
-            <enum name="emergency" value="1000"/>
-            <enum name="safety" value="1001"/>
-            <enum name="vehicle_status" value="1002"/>
-            <enum name="announcement" value="1003"/>
-        </attr>
-
-        <!-- Icon resource ids to render on UI -->
-        <attr name="icon" />
-    </declare-styleable>
-</resources>
diff --git a/packages/CarSystemUI/res/values/colors.xml b/packages/CarSystemUI/res/values/colors.xml
deleted file mode 100644
index 91d4166..0000000
--- a/packages/CarSystemUI/res/values/colors.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-    <!-- colors for user switcher -->
-    <color name="car_user_switcher_background_color">#000000</color>
-    <color name="car_user_switcher_name_text_color">@*android:color/car_body1_light</color>
-    <color name="car_user_switcher_add_user_background_color">#131313</color>
-    <color name="car_user_switcher_add_user_add_sign_color">@*android:color/car_body1_light</color>
-    <color name="car_nav_icon_fill_color">#8F8F8F</color>
-    <color name="car_nav_icon_fill_color_selected">#ffffff</color>
-    <!-- colors for seekbar -->
-    <color name="car_seekbar_track_background">#131315</color>
-    <color name="car_seekbar_track_secondary_progress">@*android:color/car_accent</color>
-    <!-- colors for volume dialog tint -->
-    <color name="car_volume_dialog_tint">@*android:color/car_tint</color>
-
-    <color name="docked_divider_background">@*android:color/car_grey_50</color>
-    <color name="system_bar_background_opaque">#ff172026</color>
-
-    <!-- colors for status bar -->
-    <color name="system_bar_background_pill_color">#282A2D</color>
-    <color name="system_bar_icon_color">#FFFFFF</color>
-    <color name="system_bar_text_color">#FFFFFF</color>
-    <color name="status_bar_background_color">#33000000</color>
-    <drawable name="system_bar_background">@color/status_bar_background_color</drawable>
-
-    <!-- colors for hvac temperature view -->
-    <color name="hvac_temperature_adjust_button_color">#3C4043</color>
-    <color name="hvac_temperature_decrease_arrow_color">#8AB4F8</color>
-    <color name="hvac_temperature_increase_arrow_color">#F28B82</color>
-
-    <!-- The background color of the notification shade -->
-    <color name="notification_shade_background_color">#D6000000</color>
-
-    <!-- The background color of the car volume dialog -->
-    <color name="car_volume_dialog_background_color">@color/system_bar_background_opaque</color>
-
-    <!-- The color of the dividing line between grouped notifications. -->
-    <color name="notification_divider_color">@*android:color/notification_action_list</color>
-
-    <!-- The color for the unseen indicator. -->
-    <color name="car_nav_unseen_indicator_color">#e25142</color>
-
-    <!-- The color of the ripples on the untinted notifications -->
-    <color name="notification_ripple_untinted_color">@color/ripple_material_light</color>
-
-    <color name="keyguard_button_text_color">@android:color/black</color>
-
-    <color name="list_divider_color">@*android:color/car_list_divider_light</color>
-    <color name="car_volume_item_divider_color">@*android:color/car_list_divider</color>
-    <color name="car_volume_item_background_color">@*android:color/car_card_dark</color>
-
-    <color name="car_user_switching_dialog_background_color">@android:color/black</color>
-    <color name="car_user_switching_dialog_loading_text_color">@*android:color/car_body1</color>
-
-    <color name="rear_view_camera_button_background">@*android:color/car_card_dark</color>
-</resources>
diff --git a/packages/CarSystemUI/res/values/config.xml b/packages/CarSystemUI/res/values/config.xml
deleted file mode 100644
index 61963ac..0000000
--- a/packages/CarSystemUI/res/values/config.xml
+++ /dev/null
@@ -1,159 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources>
-    <string name="config_statusBarComponent" translatable="false">
-        com.android.systemui.statusbar.car.CarStatusBar
-    </string>
-    <string name="config_systemUIFactoryComponent" translatable="false">
-        com.android.systemui.CarSystemUIFactory
-    </string>
-
-    <bool name="config_enableFullscreenUserSwitcher">true</bool>
-
-    <!-- Configure which system bars should be displayed. -->
-    <bool name="config_enableTopNavigationBar">true</bool>
-    <bool name="config_enableLeftNavigationBar">false</bool>
-    <bool name="config_enableRightNavigationBar">false</bool>
-    <bool name="config_enableBottomNavigationBar">true</bool>
-
-    <!-- Configure the type of each system bar. Each system bar must have a unique type. -->
-    <!--    STATUS_BAR = 0-->
-    <!--    NAVIGATION_BAR = 1-->
-    <!--    STATUS_BAR_EXTRA = 2-->
-    <!--    NAVIGATION_BAR_EXTRA = 3-->
-    <integer name="config_topSystemBarType">0</integer>
-    <integer name="config_leftSystemBarType">2</integer>
-    <integer name="config_rightSystemBarType">3</integer>
-    <integer name="config_bottomSystemBarType">1</integer>
-
-    <!-- Configure the relative z-order among the system bars. When two system bars overlap (e.g.
-         if both top bar and left bar are enabled, it creates an overlapping space in the upper left
-         corner), the system bar with the higher z-order takes the overlapping space and padding is
-         applied to the other bar.-->
-    <!-- NOTE: If two overlapping system bars have the same z-order, SystemBarConfigs will throw a
-         RuntimeException, since their placing order cannot be determined. Bars that do not overlap
-         are allowed to have the same z-order. -->
-    <!-- NOTE: If the z-order of a bar is 10 or above, it will also appear on top of HUN's.    -->
-    <integer name="config_topSystemBarZOrder">1</integer>
-    <integer name="config_leftSystemBarZOrder">0</integer>
-    <integer name="config_rightSystemBarZOrder">0</integer>
-    <integer name="config_bottomSystemBarZOrder">10</integer>
-
-    <!-- If set to true, the corresponding system bar will be hidden when Keyboard (IME) appears.
-         NOTE: hideBottomSystemBarKeyboard must not be overlaid directly here. To change its value,
-         overlay config_automotiveHideNavBarForKeyboard in framework/base/core/res/res. -->
-    <bool name="config_hideTopSystemBarForKeyboard">false</bool>
-    <bool name="config_hideBottomSystemBarForKeyboard">@*android:bool/config_automotiveHideNavBarForKeyboard</bool>
-    <bool name="config_hideLeftSystemBarForKeyboard">false</bool>
-    <bool name="config_hideRightSystemBarForKeyboard">false</bool>
-
-    <!-- Disable normal notification rendering; we handle that ourselves -->
-    <bool name="config_renderNotifications">false</bool>
-
-    <!-- Whether navigationBar touch events should be consumed before reaching the CarFacetButton \
-         when the notification panel is open. -->
-    <bool name="config_consumeNavigationBarTouchWhenNotificationPanelOpen">false</bool>
-
-    <!-- Whether heads-up notifications should be shown when shade is open. -->
-    <bool name="config_enableHeadsUpNotificationWhenNotificationShadeOpen">true</bool>
-
-    <bool name="config_hideNavWhenKeyguardBouncerShown">true</bool>
-    <bool name="config_enablePersistentDockedActivity">false</bool>
-    <string name="config_persistentDockedActivityIntentUri" translatable="false"></string>
-
-    <!-- How many icons may be shown at once in the system bar. Includes any
-         slots that may be reused for things like IME control. -->
-    <integer name="config_maxNotificationIcons">0</integer>
-
-    <!--
-        Initial alpha percent value for the background when the notification
-        shade is open. Should be a number between, and inclusive, 0 and 100.
-        If the number is 0, then the background alpha starts off fully
-        transparent. If the number if 100, then the background alpha starts off
-        fully opaque. -->
-    <integer name="config_initialNotificationBackgroundAlpha">0</integer>
-    <!--
-        Final alpha percent value for the background when the notification
-        shade is fully open. Should be a number between, and inclusive, 0 and
-        100. If this value is smaller than
-        config_initialNotificationBackgroundAlpha, the background will default
-        to a constant alpha percent value using the initial alpha. -->
-    <integer name="config_finalNotificationBackgroundAlpha">100</integer>
-
-    <!-- Car System UI's OverlayViewsMediator.
-         Whenever a new class is added, make sure to also add that class to OverlayWindowModule. -->
-    <string-array name="config_carSystemUIOverlayViewsMediators" translatable="false">
-        <item>@string/config_notificationPanelViewMediator</item>
-        <item>com.android.systemui.car.keyguard.CarKeyguardViewMediator</item>
-        <item>com.android.systemui.car.userswitcher.FullscreenUserSwitcherViewMediator</item>
-        <item>com.android.systemui.car.userswitcher.UserSwitchTransitionViewMediator</item>
-        <item>com.android.systemui.car.rvc.RearViewCameraViewMediator</item>
-    </string-array>
-
-    <!--
-        Car SystemUI's notification mediator. Replace with other notification mediators to have
-        the notification panel show from another system bar. The system bar should be enabled to
-        use the mediator with that system bar.
-        Example: config_enableBottomNavigationBar=true
-                 config_notificationPanelViewMediator=
-                    com.android.systemui.car.notification.BottomNotificationPanelViewMediator -->
-    <string name="config_notificationPanelViewMediator" translatable="false">
-        com.android.systemui.car.notification.TopNotificationPanelViewMediator</string>
-
-    <!-- List of package names that are allowed sources of app installation. -->
-    <string-array name="config_allowedAppInstallSources" translatable="false">
-        <item>com.android.vending</item>
-    </string-array>
-
-    <!-- The list of components to exclude from config_systemUIServiceComponents. -->
-    <string-array name="config_systemUIServiceComponentsExclude" translatable="false">
-        <item>com.android.systemui.recents.Recents</item>
-        <item>com.android.systemui.volume.VolumeUI</item>
-        <item>com.android.systemui.statusbar.phone.StatusBar</item>
-        <item>com.android.systemui.keyboard.KeyboardUI</item>
-        <item>com.android.systemui.shortcut.ShortcutKeyDispatcher</item>
-        <item>com.android.systemui.LatencyTester</item>
-        <item>com.android.systemui.globalactions.GlobalActionsComponent</item>
-        <item>com.android.systemui.SliceBroadcastRelayHandler</item>
-        <item>com.android.systemui.statusbar.notification.InstantAppNotifier</item>
-        <item>com.android.systemui.accessibility.WindowMagnification</item>
-        <item>com.android.systemui.accessibility.SystemActions</item>
-    </string-array>
-
-    <!-- The list of components to append to config_systemUIServiceComponents. -->
-    <string-array name="config_systemUIServiceComponentsInclude" translatable="false">
-        <item>com.android.systemui.car.navigationbar.CarNavigationBar</item>
-        <item>com.android.systemui.car.voicerecognition.ConnectedDeviceVoiceRecognitionNotifier</item>
-        <item>com.android.systemui.car.window.SystemUIOverlayWindowManager</item>
-        <item>com.android.systemui.car.volume.VolumeUI</item>
-    </string-array>
-
-    <!-- How many milliseconds to wait before force hiding the UserSwitchTransitionView -->
-    <integer name="config_userSwitchTransitionViewShownTimeoutMs" translatable="false">5000</integer>
-
-    <!-- The Activity name for the Rear View Camera, if empty, the feature will be disabled. -->
-    <string name="config_rearViewCameraActivity" translatable="false"></string>
-
-    <!-- Whether the Notification Panel should be inset by the top system bar. -->
-    <bool name="config_notif_panel_inset_by_top_systembar" translatable="false">false</bool>
-    <!-- Whether the Notification Panel should be inset by the bottom system bar. -->
-    <bool name="config_notif_panel_inset_by_bottom_systembar" translatable="false">true</bool>
-    <!-- Whether the Notification Panel should be inset by the left system bar. -->
-    <bool name="config_notif_panel_inset_by_left_systembar" translatable="false">false</bool>
-    <!-- Whether the Notification Panel should be inset by the right system bar. -->
-    <bool name="config_notif_panel_inset_by_right_systembar" translatable="false">false</bool>
-</resources>
diff --git a/packages/CarSystemUI/res/values/dimens.xml b/packages/CarSystemUI/res/values/dimens.xml
deleted file mode 100644
index a7d8ab5..0000000
--- a/packages/CarSystemUI/res/values/dimens.xml
+++ /dev/null
@@ -1,234 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources>
-    <!-- Text size for car -->
-    <dimen name="car_title_size">32sp</dimen>
-    <dimen name="car_title2_size">32sp</dimen>
-    <dimen name="car_headline1_size">45sp</dimen>
-    <dimen name="car_headline2_size">32sp</dimen>
-    <dimen name="car_headline3_size">24sp</dimen>
-    <dimen name="car_headline4_size">20sp</dimen>
-    <dimen name="car_body1_size">32sp</dimen>
-    <dimen name="car_body2_size">28sp</dimen>
-    <dimen name="car_body3_size">26sp</dimen>
-    <dimen name="car_body4_size">24sp</dimen>
-    <!-- car_body5_size is deprecated -->
-    <dimen name="car_body5_size">18sp</dimen>
-    <dimen name="car_label1_size">26sp</dimen>
-    <dimen name="car_label2_size">64sp</dimen>
-    <dimen name="car_action1_size">26sp</dimen>
-    <dimen name="car_action2_size">26sp</dimen>
-    <!-- Paddings -->
-    <dimen name="car_padding_0">4dp</dimen>
-    <dimen name="car_padding_1">8dp</dimen>
-    <dimen name="car_padding_2">16dp</dimen>
-    <dimen name="car_padding_3">24dp</dimen>
-    <dimen name="car_padding_4">32dp</dimen>
-    <dimen name="car_padding_5">64dp</dimen>
-    <dimen name="car_padding_6">96dp</dimen>
-
-    <!--
-       Note: status bar height and navigation bar heights are defined
-       in frameworks/base/core package and thus will have no effect if
-       set here. See car_product overlay for car specific defaults-->
-
-    <!-- Overrides the space between each status icon in the system bar -->
-    <dimen name="status_bar_system_icon_spacing">16dp</dimen>
-    <!-- Overrides the size of the network signal icon -->
-    <dimen name="signal_icon_size">32dp</dimen>
-    <dimen name="system_bar_user_icon_padding">16dp</dimen>
-    <dimen name="system_bar_user_icon_drawing_size">36dp</dimen>
-    <!-- Padding on either side of the group of all system bar buttons -->
-    <dimen name="system_bar_button_group_padding">64dp</dimen>
-    <dimen name="system_bar_icon_drawing_size">44dp</dimen>
-    <dimen name="system_bar_button_size">76dp</dimen>
-    <!-- Margin between the system bar buttons -->
-    <dimen name="system_bar_button_margin">32dp</dimen>
-    <!-- Padding between the system bar button and the icon within it -->
-    <dimen name="system_bar_button_padding">16dp</dimen>
-
-    <!-- The amount by which to scale up the status bar icons. -->
-    <item name="status_bar_icon_scale_factor" format="float" type="dimen">1.75</item>
-
-    <dimen name="car_primary_icon_size">@*android:dimen/car_primary_icon_size</dimen>
-
-    <dimen name="hvac_container_padding">16dp</dimen>
-    <dimen name="hvac_temperature_text_size">56sp</dimen>
-    <dimen name="hvac_temperature_text_padding">8dp</dimen>
-    <dimen name="hvac_temperature_button_size">76dp</dimen>
-    <!--These values represent MIN and MAX for hvac-->
-    <item name="hvac_min_value_celsius" format="float" type="dimen">10</item>
-    <item name="hvac_max_value_celsius" format="float" type="dimen">35</item>
-
-    <!-- Largest size an avatar might need to be drawn in the user picker, status bar, or
-         quick settings header -->
-    <dimen name="max_avatar_size">128dp</dimen>
-
-    <!-- Standard image button size for volume dialog buttons -->
-    <dimen name="volume_button_size">84dp</dimen>
-    <!-- The maximum width allowed for the volume dialog. For auto, we allow this to span a good
-         deal of the screen. This value accounts for the side margins. -->
-    <dimen name="volume_dialog_panel_width">1920dp</dimen>
-    <dimen name="volume_dialog_side_margin">@dimen/side_margin</dimen>
-
-    <dimen name="volume_dialog_elevation">6dp</dimen>
-
-    <dimen name="volume_dialog_row_margin_end">@*android:dimen/car_keyline_3</dimen>
-
-    <dimen name="volume_dialog_row_padding_end">0dp</dimen>
-
-    <dimen name="line_item_height">128dp</dimen>
-    <dimen name="volume_icon_size">96dp</dimen>
-    <dimen name="side_margin">148dp</dimen>
-    <dimen name="car_keyline_1">24dp</dimen>
-    <dimen name="car_keyline_2">96dp</dimen>
-    <dimen name="car_keyline_3">128dp</dimen>
-
-    <!-- Height of icons in Ongoing App Ops dialog. Both App Op icon and application icon -->
-    <dimen name="ongoing_appops_dialog_icon_height">48dp</dimen>
-    <!-- Margin between text lines in Ongoing App Ops dialog -->
-    <dimen name="ongoing_appops_dialog_text_margin">15dp</dimen>
-    <!-- Padding around Ongoing App Ops dialog content -->
-    <dimen name="ongoing_appops_dialog_content_padding">24dp</dimen>
-    <!-- Margins around the Ongoing App Ops chip. In landscape, the side margins are 0 -->
-    <dimen name="ongoing_appops_chip_margin">12dp</dimen>
-    <!-- Start and End padding for Ongoing App Ops chip -->
-    <dimen name="ongoing_appops_chip_side_padding">6dp</dimen>
-    <!-- Padding between background of Ongoing App Ops chip and content -->
-    <dimen name="ongoing_appops_chip_bg_padding">4dp</dimen>
-    <!-- Radius of Ongoing App Ops chip corners -->
-    <dimen name="ongoing_appops_chip_bg_corner_radius">12dp</dimen>
-
-    <!-- Car volume dimens. -->
-    <dimen name="car_volume_item_icon_size">@dimen/car_primary_icon_size</dimen>
-    <dimen name="car_volume_item_height">@*android:dimen/car_single_line_list_item_height</dimen>
-    <dimen name="car_volume_item_padding_start">@*android:dimen/car_keyline_1</dimen>
-    <dimen name="car_volume_item_padding_end">@*android:dimen/car_keyline_1</dimen>
-    <dimen name="car_volume_item_seekbar_margin_vertical">@*android:dimen/car_padding_1</dimen>
-    <dimen name="car_volume_item_seekbar_margin_start">@*android:dimen/car_keyline_3</dimen>
-    <dimen name="car_volume_item_seekbar_margin_end">@*android:dimen/car_padding_4</dimen>
-    <dimen name="car_volume_item_seekbar_padding_vertical">@*android:dimen/car_seekbar_padding</dimen>
-    <dimen name="car_volume_item_divider_height">60dp</dimen>
-    <dimen name="car_volume_item_divider_width">1dp</dimen>
-    <dimen name="car_volume_item_divider_margin_end">@*android:dimen/car_padding_4</dimen>
-    <dimen name="car_volume_item_corner_radius">@*android:dimen/car_radius_3</dimen>
-
-    <!-- Car notification shade-->
-    <dimen name="notification_shade_handle_bar_height">10dp</dimen>
-    <dimen name="notification_shade_handle_bar_radius">20dp</dimen>
-    <dimen name="notification_shade_handle_bar_margin_start">200dp</dimen>
-    <dimen name="notification_shade_handle_bar_margin_end">200dp</dimen>
-    <dimen name="notification_shade_handle_bar_margin_top">20dp</dimen>
-    <dimen name="notification_shade_handle_bar_margin_bottom">10dp</dimen>
-    <dimen name="notification_shade_list_padding_bottom">50dp</dimen>
-
-    <!-- The alpha for the scrim behind the notification shade. This value is 1 so that the
-     scrim has no transparency. -->
-    <item name="scrim_behind_alpha" format="float" type="dimen">1.0</item>
-
-    <!-- The width of panel holding the notification card. -->
-    <dimen name="notification_panel_width">522dp</dimen>
-
-    <!-- Height of a small notification in the status bar-->
-    <dimen name="notification_min_height">192dp</dimen>
-
-    <!-- Height of a small notification in the status bar which was used before android N -->
-    <dimen name="notification_min_height_legacy">192dp</dimen>
-
-    <!-- Height of a large notification in the status bar -->
-    <dimen name="notification_max_height">400dp</dimen>
-
-    <!-- Height of a heads up notification in the status bar for legacy custom views -->
-    <dimen name="notification_max_heads_up_height_legacy">400dp</dimen>
-
-    <!-- Height of a heads up notification in the status bar -->
-    <dimen name="notification_max_heads_up_height">400dp</dimen>
-
-    <!-- Height of the status bar header bar -->
-    <dimen name="status_bar_header_height">54dp</dimen>
-
-    <!-- The height of the divider between the individual notifications. -->
-    <dimen name="notification_divider_height">16dp</dimen>
-
-    <!-- The height of the divider between the individual notifications when the notification
-         wants it to be increased. This value is the same as notification_divider_height so that
-         the spacing between all notifications will always be the same. -->
-    <dimen name="notification_divider_height_increased">@dimen/notification_divider_height</dimen>
-
-    <!-- The alpha of the dividing line between child notifications of a notification group. -->
-    <item name="notification_divider_alpha" format="float" type="dimen">1.0</item>
-
-    <!-- The width of each individual notification card. -->
-    <dimen name="notification_child_width">522dp</dimen>
-
-    <!-- The top margin of the notification panel. -->
-    <dimen name="notification_panel_margin_top">32dp</dimen>
-
-    <!-- The bottom margin of the panel that holds the list of notifications. -->
-    <dimen name="notification_panel_margin_bottom">@dimen/notification_divider_height</dimen>
-
-    <!-- The corner radius of the shadow behind the notification. -->
-    <dimen name="notification_shadow_radius">16dp</dimen>
-
-    <!-- The amount of space below the notification list. This value is 0 so the list scrolls
-         all the way to the bottom. -->
-    <dimen name="close_handle_underlap">0dp</dimen>
-
-    <!-- The height of the divider between the individual notifications in a notification group. -->
-    <dimen name="notification_children_container_divider_height">1dp</dimen>
-
-    <!-- The height of the header for a container containing child notifications. -->
-    <dimen name="notification_children_container_header_height">76dp</dimen>
-
-    <!-- The top margin for the notification children container in its non-expanded form. This
-         value is smaller than notification_children_container_header_height to bring the first
-         child closer so there is less wasted space. -->
-    <dimen name="notification_children_container_margin_top">68dp</dimen>
-
-    <!-- dimensions for the car user switcher -->
-    <dimen name="car_user_switcher_name_text_size">@*android:dimen/car_body1_size</dimen>
-    <dimen name="car_user_switcher_image_avatar_size">@*android:dimen/car_large_avatar_size</dimen>
-    <dimen name="car_user_switcher_vertical_spacing_between_users">@*android:dimen/car_padding_5</dimen>
-    <dimen name="car_user_switcher_vertical_spacing_between_name_and_avatar">@*android:dimen/car_padding_4</dimen>
-    <dimen name="car_user_switcher_margin_top">@*android:dimen/car_padding_4</dimen>
-
-    <dimen name="car_navigation_button_width">64dp</dimen>
-    <dimen name="car_navigation_button_icon_height">44dp</dimen>
-    <dimen name="car_navigation_bar_width">760dp</dimen>
-    <dimen name="car_left_navigation_bar_width">96dp</dimen>
-    <dimen name="car_right_navigation_bar_width">96dp</dimen>
-    <!-- In order to change the height of the bottom nav bar, overlay navigation_bar_height in
-         frameworks/base/core/res/res instead. -->
-    <dimen name="car_bottom_navigation_bar_height">@*android:dimen/navigation_bar_height</dimen>
-    <!-- In order to change the height of the top nav bar, overlay status_bar_height in
-         frameworks/base/core/res/res instead. -->
-    <dimen name="car_top_navigation_bar_height">@*android:dimen/status_bar_height</dimen>
-
-    <dimen name="car_user_switcher_container_height">420dp</dimen>
-    <!-- This must be the negative of car_user_switcher_container_height for the animation. -->
-    <dimen name="car_user_switcher_container_anim_height">-420dp</dimen>
-
-    <!-- dimensions for car user switching dialog -->
-    <dimen name="car_fullscreen_user_pod_image_avatar_width">96dp</dimen>
-    <dimen name="car_fullscreen_user_pod_image_avatar_height">96dp</dimen>
-    <dimen name="car_user_switching_dialog_loading_text_margin_top">@*android:dimen/car_padding_4</dimen>
-    <dimen name="car_user_switching_dialog_loading_text_font_size">@*android:dimen/car_body1_size</dimen>
-
-    <!-- dimensions for rear view camera -->
-    <dimen name="rear_view_camera_width">600dp</dimen>
-    <dimen name="rear_view_camera_height">500dp</dimen>
-</resources>
diff --git a/packages/CarSystemUI/res/values/ids.xml b/packages/CarSystemUI/res/values/ids.xml
deleted file mode 100644
index 05194a4..0000000
--- a/packages/CarSystemUI/res/values/ids.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<resources>
-    <!-- Values used for finding elements on the system ui nav bars -->
-    <item type="id" name="lock_screen_nav_buttons"/>
-</resources>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/values/integers.xml b/packages/CarSystemUI/res/values/integers.xml
deleted file mode 100644
index 5ae5555..0000000
--- a/packages/CarSystemUI/res/values/integers.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (c) 2018, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-<resources>
-    <!-- Full screen user switcher column number -->
-    <integer name="user_fullscreen_switcher_num_col">3</integer>
-
-    <!--Percentage of the screen height, from the bottom, that a notification panel being
-    partially closed at will result in it remaining open if released-->
-    <integer name="notification_settle_open_percentage">20</integer>
-    <!--Percentage of the screen height, from the bottom, that a notification panel being peeked
-    at will result in remaining closed the panel if released-->
-    <integer name="notification_settle_close_percentage">80</integer>
-
-    <!-- Timeout values in milliseconds for displaying volume dialog-->
-    <integer name="car_volume_dialog_display_normal_timeout">3000</integer>
-    <integer name="car_volume_dialog_display_hovering_timeout">16000</integer>
-    <integer name="car_volume_dialog_display_expanded_normal_timeout">6000</integer>
-    <integer name="car_volume_dialog_display_expanded_hovering_timeout">32000</integer>
-</resources>
diff --git a/packages/CarSystemUI/res/values/strings.xml b/packages/CarSystemUI/res/values/strings.xml
deleted file mode 100644
index 2644565..0000000
--- a/packages/CarSystemUI/res/values/strings.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (c) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- Format for HVAC temperature (No decimal and the degree symbol) -->
-    <string name="hvac_temperature_format" translatable="false">%.0f\u00B0</string>
-    <!-- String to represent lowest setting of an HVAC system [CHAR LIMIT=10]-->
-    <string name="hvac_min_text">Min</string>
-    <!-- String to represent largest setting of an HVAC system [CHAR LIMIT=10]-->
-    <string name="hvac_max_text">Max</string>
-    <!-- String to display when no HVAC temperature is available -->
-    <string name="hvac_null_temp_text" translatable="false">--</string>
-    <!-- Text for voice recognition toast. [CHAR LIMIT=60] -->
-    <string name="voice_recognition_toast">Voice recognition now handled by connected Bluetooth device</string>
-    <!-- Name of Guest Profile. [CHAR LIMIT=35] -->
-    <string name="car_guest">Guest</string>
-    <!-- Title for button that starts a guest session. [CHAR LIMIT=35] -->
-    <string name="start_guest_session">Guest</string>
-    <!-- Title for button that  adds a new user. [CHAR LIMIT=30] -->
-    <string name="car_add_user">Add User</string>
-    <!-- Default name of the new user created. [CHAR LIMIT=30] -->
-    <string name="car_new_user">New User</string>
-    <!-- Message to inform user that creation of new user requires that user to set up their space. [CHAR LIMIT=100] -->
-    <string name="user_add_user_message_setup">When you add a new user, that person needs to set up their space.</string>
-    <!-- Message to inform user that the newly created user will have permissions to update apps for all other users. [CHAR LIMIT=100] -->
-    <string name="user_add_user_message_update">Any user can update apps for all other users.</string>
-    <!-- Message to inform user that the new user profile is loading. [CHAR LIMIT=20] -->
-    <string name="car_loading_profile">Loading</string>
-    <!-- Message to inform user that the new user profile is loading with additional information on the previous and the next user. [CHAR LIMIT=100] -->
-    <string name="car_loading_profile_developer_message">Loading user (from <xliff:g id="from_user" example="10">%1$d</xliff:g> to <xliff:g id="to_user" example="12">%2$d</xliff:g>)</string>
-    <!-- Text for the close button in Rear View Camera [CHAR LIMIT=30] -->
-    <string name="rear_view_camera_close_button_text">Close</string>
-</resources>
diff --git a/packages/CarSystemUI/res/values/styles.xml b/packages/CarSystemUI/res/values/styles.xml
deleted file mode 100644
index f5de2fd..0000000
--- a/packages/CarSystemUI/res/values/styles.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <!-- The style for the volume icons in the volume dialog. This style makes the icon scale to
-         fit its container since auto wants the icon to be larger. The padding is added to make it
-         so the icon does not press along the edges of the dialog. -->
-    <style name="VolumeButtons" parent="@android:style/Widget.Material.Button.Borderless">
-        <item name="android:background">@drawable/btn_borderless_rect</item>
-        <item name="android:scaleType">fitCenter</item>
-        <item name="android:padding">22dp</item>
-    </style>
-
-    <style name="TextAppearance.SystemBar.Clock"
-           parent="@*android:style/TextAppearance.StatusBar.Icon">
-        <item name="android:textSize">@dimen/car_body1_size</item>
-        <item name="android:textColor">@*android:color/car_headline3</item>
-    </style>
-
-    <style name="TextAppearance.SystemBar.Username"
-           parent="@android:style/TextAppearance.DeviceDefault">
-        <item name="android:textSize">@dimen/car_body3_size</item>
-        <item name="android:textColor">@color/system_bar_text_color</item>
-    </style>
-
-    <style name="TextAppearance.CarStatus" parent="@android:style/TextAppearance.DeviceDefault">
-        <item name="android:textSize">@*android:dimen/car_body2_size</item>
-        <item name="android:textColor">@color/system_bar_text_color</item>
-    </style>
-
-    <style name="NavigationBarButton">
-        <item name="android:layout_height">@dimen/system_bar_button_size</item>
-        <item name="android:layout_width">@dimen/system_bar_button_size</item>
-        <item name="android:layout_marginEnd">@dimen/system_bar_button_margin</item>
-        <item name="android:padding">@dimen/system_bar_button_padding</item>
-        <item name="android:gravity">center</item>
-        <item name="android:background">?android:attr/selectableItemBackground</item>
-        <item name="unselectedAlpha">0.56</item>
-    </style>
-</resources>
\ No newline at end of file
diff --git a/packages/CarSystemUI/res/xml/car_volume_items.xml b/packages/CarSystemUI/res/xml/car_volume_items.xml
deleted file mode 100644
index d371a64..0000000
--- a/packages/CarSystemUI/res/xml/car_volume_items.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<!--
-  Defines all possible items on car volume settings UI, keyed by usage.
--->
-<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
-  <item car:usage="unknown"
-        car:icon="@drawable/car_ic_music"/>
-  <item car:usage="media"
-        car:icon="@drawable/car_ic_music"/>
-  <item car:usage="assistance_navigation_guidance"
-        car:icon="@drawable/car_ic_navigation"/>
-  <item car:usage="voice_communication_signalling"
-        car:icon="@*android:drawable/ic_audio_ring_notif"/>
-  <item car:usage="alarm"
-        car:icon="@drawable/ic_volume_alarm"/>
-  <item car:usage="notification"
-        car:icon="@drawable/car_ic_notification"/>
-  <item car:usage="notification_ringtone"
-        car:icon="@drawable/car_ic_notification"/>
-  <item car:usage="notification_communication_request"
-        car:icon="@drawable/car_ic_notification"/>
-  <item car:usage="notification_communication_instant"
-        car:icon="@drawable/car_ic_notification"/>
-  <item car:usage="notification_communication_delayed"
-        car:icon="@drawable/car_ic_notification"/>
-  <item car:usage="notification_event"
-        car:icon="@drawable/car_ic_notification"/>
-  <item car:usage="assistance_accessibility"
-        car:icon="@drawable/car_ic_notification"/>
-  <item car:usage="voice_communication"
-        car:icon="@*android:drawable/ic_audio_ring_notif"/>
-  <item car:usage="assistance_sonification"
-        car:icon="@drawable/car_ic_notification"/>
-  <item car:usage="game"
-        car:icon="@drawable/car_ic_music"/>
-  <item car:usage="assistant"
-        car:icon="@drawable/car_ic_music"/>
-  <item car:usage="call_assistant"
-        car:icon="@*android:drawable/ic_audio_ring_notif"/>
-  <item car:usage="emergency"
-        car:icon="@drawable/ic_volume_alarm"/>
-  <item car:usage="safety"
-        car:icon="@drawable/ic_volume_alarm"/>
-  <item car:usage="vehicle_status"
-        car:icon="@drawable/car_ic_notification"/>
-  <item car:usage="announcement"
-        car:icon="@drawable/car_ic_notification"/>
-</carVolumeItems>
-
diff --git a/packages/CarSystemUI/samples/sample1/rro/Android.bp b/packages/CarSystemUI/samples/sample1/rro/Android.bp
deleted file mode 100644
index 5b0347f..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/Android.bp
+++ /dev/null
@@ -1,27 +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.
-//
-
-android_app {
-    name: "CarSystemUISampleOneRRO",
-    resource_dirs: ["res"],
-    certificate: "platform",
-    platform_apis: true,
-    manifest: "AndroidManifest.xml",
-    aaptflags: [
-        "--no-resource-deduping",
-        "--no-resource-removal",
-     ]
-}
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_apps.xml b/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_apps.xml
deleted file mode 100644
index a8d8a2f..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_apps.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="44"
-        android:viewportHeight="44"
-        android:width="44dp"
-        android:height="44dp">
-<path
-    android:pathData="M7.33333333 14.6666667L14.6666667 14.6666667L14.6666667 7.33333333L7.33333333 7.33333333L7.33333333 14.6666667ZM18.3333333 36.6666667L25.6666667 36.6666667L25.6666667 29.3333333L18.3333333 29.3333333L18.3333333 36.6666667ZM7.33333333 36.6666667L14.6666667 36.6666667L14.6666667 29.3333333L7.33333333 29.3333333L7.33333333 36.6666667ZM7.33333333 25.6666667L14.6666667 25.6666667L14.6666667 18.3333333L7.33333333 18.3333333L7.33333333 25.6666667ZM18.3333333 25.6666667L25.6666667 25.6666667L25.6666667 18.3333333L18.3333333 18.3333333L18.3333333 25.6666667ZM29.3333333 7.33333333L29.3333333 14.6666667L36.6666667 14.6666667L36.6666667 7.33333333L29.3333333 7.33333333ZM18.3333333 14.6666667L25.6666667 14.6666667L25.6666667 7.33333333L18.3333333 7.33333333L18.3333333 14.6666667ZM29.3333333 25.6666667L36.6666667 25.6666667L36.6666667 18.3333333L29.3333333 18.3333333L29.3333333 25.6666667ZM29.3333333 36.6666667L36.6666667 36.6666667L36.6666667 29.3333333L29.3333333 29.3333333L29.3333333 36.6666667Z"
-    android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_apps_selected.xml b/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_apps_selected.xml
deleted file mode 100644
index 2a4e91a..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_apps_selected.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="44"
-        android:viewportHeight="44"
-        android:width="44dp"
-        android:height="44dp">
-    <path
-        android:pathData="M7.33333333 14.6666667L14.6666667 14.6666667L14.6666667 7.33333333L7.33333333 7.33333333L7.33333333 14.6666667ZM18.3333333 36.6666667L25.6666667 36.6666667L25.6666667 29.3333333L18.3333333 29.3333333L18.3333333 36.6666667ZM7.33333333 36.6666667L14.6666667 36.6666667L14.6666667 29.3333333L7.33333333 29.3333333L7.33333333 36.6666667ZM7.33333333 25.6666667L14.6666667 25.6666667L14.6666667 18.3333333L7.33333333 18.3333333L7.33333333 25.6666667ZM18.3333333 25.6666667L25.6666667 25.6666667L25.6666667 18.3333333L18.3333333 18.3333333L18.3333333 25.6666667ZM29.3333333 7.33333333L29.3333333 14.6666667L36.6666667 14.6666667L36.6666667 7.33333333L29.3333333 7.33333333ZM18.3333333 14.6666667L25.6666667 14.6666667L25.6666667 7.33333333L18.3333333 7.33333333L18.3333333 14.6666667ZM29.3333333 25.6666667L36.6666667 25.6666667L36.6666667 18.3333333L29.3333333 18.3333333L29.3333333 25.6666667ZM29.3333333 36.6666667L36.6666667 36.6666667L36.6666667 29.3333333L29.3333333 29.3333333L29.3333333 36.6666667Z"
-        android:fillColor="@color/car_nav_icon_fill_color_selected" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_music.xml b/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_music.xml
deleted file mode 100644
index 6339ebb..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_music.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M22 5.5L22 24.8416667C20.9183333 24.2183333 19.6716667 23.8333333 18.3333333 23.8333333C14.2816667 23.8333333 11 27.115 11 31.1666667C11 35.2183333 14.2816667 38.5 18.3333333 38.5C22.385 38.5 25.6666667 35.2183333 25.6666667 31.1666667L25.6666667 12.8333333L33 12.8333333L33 5.5L22 5.5Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_music_selected.xml b/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_music_selected.xml
deleted file mode 100644
index a56bcb3..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_music_selected.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="44"
-        android:viewportHeight="44"
-        android:width="44dp"
-        android:height="44dp">
-    <path
-        android:pathData="M22 5.5L22 24.8416667C20.9183333 24.2183333 19.6716667 23.8333333 18.3333333 23.8333333C14.2816667 23.8333333 11 27.115 11 31.1666667C11 35.2183333 14.2816667 38.5 18.3333333 38.5C22.385 38.5 25.6666667 35.2183333 25.6666667 31.1666667L25.6666667 12.8333333L33 12.8333333L33 5.5L22 5.5Z"
-        android:fillColor="@color/car_nav_icon_fill_color_selected" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_navigation.xml b/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_navigation.xml
deleted file mode 100644
index e1fabe0..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_navigation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M39.8016667 20.6983333L23.3016667 4.19833333C22.5866667 3.48333333 21.4316667 3.48333333 20.7166667 4.19833333L4.21666667 20.6983333C3.50166667 21.4133333 3.50166667 22.5683333 4.21666667 23.2833333L20.7166667 39.7833333C21.4316667 40.4983333 22.5866667 40.4983333 23.3016667 39.7833333L39.8016667 23.2833333C40.5166667 22.5866667 40.5166667 21.4316667 39.8016667 20.6983333ZM25.6666667 26.5833333L25.6666667 22L18.3333333 22L18.3333333 27.5L14.6666667 27.5L14.6666667 20.1666667C14.6666667 19.1583333 15.4916667 18.3333333 16.5 18.3333333L25.6666667 18.3333333L25.6666667 13.75L32.0833333 20.1666667L25.6666667 26.5833333Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_navigation_selected.xml b/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_navigation_selected.xml
deleted file mode 100644
index d11cf28..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_navigation_selected.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="44"
-        android:viewportHeight="44"
-        android:width="44dp"
-        android:height="44dp">
-    <path
-        android:pathData="M39.8016667 20.6983333L23.3016667 4.19833333C22.5866667 3.48333333 21.4316667 3.48333333 20.7166667 4.19833333L4.21666667 20.6983333C3.50166667 21.4133333 3.50166667 22.5683333 4.21666667 23.2833333L20.7166667 39.7833333C21.4316667 40.4983333 22.5866667 40.4983333 23.3016667 39.7833333L39.8016667 23.2833333C40.5166667 22.5866667 40.5166667 21.4316667 39.8016667 20.6983333ZM25.6666667 26.5833333L25.6666667 22L18.3333333 22L18.3333333 27.5L14.6666667 27.5L14.6666667 20.1666667C14.6666667 19.1583333 15.4916667 18.3333333 16.5 18.3333333L25.6666667 18.3333333L25.6666667 13.75L32.0833333 20.1666667L25.6666667 26.5833333Z"
-        android:fillColor="@color/car_nav_icon_fill_color_selected" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_overview.xml b/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_overview.xml
deleted file mode 100644
index f185eb9..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_overview.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M36.92857 22.39286A14.53571 14.53571 0 0 1 7.857143 22.39286A14.53571 14.53571 0 0 1 36.92857 22.39286Z"
-        android:strokeColor="@color/car_nav_icon_fill_color"
-        android:strokeWidth="4" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_overview_selected.xml b/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_overview_selected.xml
deleted file mode 100644
index 19b5583..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_overview_selected.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="44"
-        android:viewportHeight="44"
-        android:width="44dp"
-        android:height="44dp">
-    <path
-        android:pathData="M36.92857 22.39286A14.53571 14.53571 0 0 1 7.857143 22.39286A14.53571 14.53571 0 0 1 36.92857 22.39286Z"
-        android:strokeColor="@color/car_nav_icon_fill_color_selected"
-        android:strokeWidth="4" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_phone.xml b/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_phone.xml
deleted file mode 100644
index 50e36b5..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_phone.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M12.1366667 19.7816667C14.7766667 24.97 19.03 29.205 24.2183333 31.8633333L28.2516667 27.83C28.7466667 27.335 29.48 27.17 30.1216667 27.39C32.175 28.0683333 34.3933333 28.435 36.6666667 28.435C37.675 28.435 38.5 29.26 38.5 30.2683333L38.5 36.6666667C38.5 37.675 37.675 38.5 36.6666667 38.5C19.4516667 38.5 5.5 24.5483333 5.5 7.33333333C5.5 6.325 6.325 5.5 7.33333333 5.5L13.75 5.5C14.7583333 5.5 15.5833333 6.325 15.5833333 7.33333333C15.5833333 9.625 15.95 11.825 16.6283333 13.8783333C16.83 14.52 16.6833333 15.235 16.17 15.7483333L12.1366667 19.7816667Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_phone_selected.xml b/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_phone_selected.xml
deleted file mode 100644
index 11b1687..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/drawable/car_ic_phone_selected.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="44"
-        android:viewportHeight="44"
-        android:width="44dp"
-        android:height="44dp">
-    <path
-        android:pathData="M12.1366667 19.7816667C14.7766667 24.97 19.03 29.205 24.2183333 31.8633333L28.2516667 27.83C28.7466667 27.335 29.48 27.17 30.1216667 27.39C32.175 28.0683333 34.3933333 28.435 36.6666667 28.435C37.675 28.435 38.5 29.26 38.5 30.2683333L38.5 36.6666667C38.5 37.675 37.675 38.5 36.6666667 38.5C19.4516667 38.5 5.5 24.5483333 5.5 7.33333333C5.5 6.325 6.325 5.5 7.33333333 5.5L13.75 5.5C14.7583333 5.5 15.5833333 6.325 15.5833333 7.33333333C15.5833333 9.625 15.95 11.825 16.6283333 13.8783333C16.83 14.52 16.6833333 15.235 16.17 15.7483333L12.1366667 19.7816667Z"
-        android:fillColor="@color/car_nav_icon_fill_color_selected" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/drawable/system_bar_background.xml b/packages/CarSystemUI/samples/sample1/rro/res/drawable/system_bar_background.xml
deleted file mode 100644
index 6161ad9..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/drawable/system_bar_background.xml
+++ /dev/null
@@ -1,33 +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.
-  -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
-    <corners
-        android:topLeftRadius="0dp"
-        android:topRightRadius="10dp"
-        android:bottomLeftRadius="0dp"
-        android:bottomRightRadius="0dp"
-    />
-    <solid
-        android:color="#404040"
-    />
-    <padding
-        android:left="0dp"
-        android:top="0dp"
-        android:right="0dp"
-        android:bottom="0dp"
-    />
-</shape>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/drawable/system_bar_background_2.xml b/packages/CarSystemUI/samples/sample1/rro/res/drawable/system_bar_background_2.xml
deleted file mode 100644
index 3582142..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/drawable/system_bar_background_2.xml
+++ /dev/null
@@ -1,33 +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.
-  -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
-    <corners
-        android:topLeftRadius="10dp"
-        android:topRightRadius="0dp"
-        android:bottomLeftRadius="0dp"
-        android:bottomRightRadius="0dp"
-    />
-    <solid
-        android:color="#404040"
-    />
-    <padding
-        android:left="0dp"
-        android:top="0dp"
-        android:right="0dp"
-        android:bottom="0dp"
-    />
-</shape>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/drawable/system_bar_background_3.xml b/packages/CarSystemUI/samples/sample1/rro/res/drawable/system_bar_background_3.xml
deleted file mode 100644
index afa5b32..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/drawable/system_bar_background_3.xml
+++ /dev/null
@@ -1,33 +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.
-  -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
-    <corners
-        android:topLeftRadius="0dp"
-        android:topRightRadius="0dp"
-        android:bottomLeftRadius="10dp"
-        android:bottomRightRadius="0dp"
-    />
-    <solid
-        android:color="#404040"
-    />
-    <padding
-        android:left="0dp"
-        android:top="0dp"
-        android:right="0dp"
-        android:bottom="0dp"
-    />
-</shape>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/layout/car_navigation_bar.xml b/packages/CarSystemUI/samples/sample1/rro/res/layout/car_navigation_bar.xml
deleted file mode 100644
index 4358d97..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/layout/car_navigation_bar.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@android:color/transparent"
-    android:orientation="horizontal">
-    <!--The 20dp padding is the difference between the background selected icon size and the ripple
-        that was chosen, thus it's a hack to make it look pretty and not an official margin value-->
-    <LinearLayout
-        android:id="@+id/nav_buttons"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:background="@drawable/system_bar_background"
-        android:gravity="center"
-        android:layoutDirection="ltr"
-        android:paddingEnd="20dp"
-        android:paddingStart="20dp">
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/home"
-            style="@style/NavigationBarButton"
-            systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
-            systemui:icon="@drawable/car_ic_overview"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-            systemui:selectedIcon="@drawable/car_ic_overview_selected"
-            systemui:highlightWhenSelected="true"
-        />
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/maps_nav"
-            style="@style/NavigationBarButton"
-            systemui:categories="android.intent.category.APP_MAPS"
-            systemui:icon="@drawable/car_ic_navigation"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_MAPS;launchFlags=0x14000000;end"
-            systemui:selectedIcon="@drawable/car_ic_navigation_selected"
-            systemui:highlightWhenSelected="true"
-        />
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/music_nav"
-            style="@style/NavigationBarButton"
-            systemui:categories="android.intent.category.APP_MUSIC"
-            systemui:icon="@drawable/car_ic_music"
-            systemui:intent="intent:#Intent;action=android.car.intent.action.MEDIA_TEMPLATE;launchFlags=0x10000000;end"
-            systemui:packages="com.android.car.media"
-            systemui:selectedIcon="@drawable/car_ic_music_selected"
-            systemui:highlightWhenSelected="true"
-        />
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/phone_nav"
-            style="@style/NavigationBarButton"
-            systemui:icon="@drawable/car_ic_phone"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;package=com.android.car.dialer;launchFlags=0x10000000;end"
-            systemui:packages="com.android.car.dialer"
-            systemui:selectedIcon="@drawable/car_ic_phone_selected"
-            systemui:highlightWhenSelected="true"
-        />
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/grid_nav"
-            style="@style/NavigationBarButton"
-            systemui:componentNames="com.android.car.carlauncher/.AppGridActivity"
-            systemui:icon="@drawable/car_ic_apps"
-            systemui:intent="intent:#Intent;component=com.android.car.carlauncher/.AppGridActivity;launchFlags=0x24000000;end"
-            systemui:selectedIcon="@drawable/car_ic_apps_selected"
-            systemui:highlightWhenSelected="true"
-        />
-
-    </LinearLayout>
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/layout/car_right_navigation_bar.xml b/packages/CarSystemUI/samples/sample1/rro/res/layout/car_right_navigation_bar.xml
deleted file mode 100644
index dc1d0d64..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/layout/car_right_navigation_bar.xml
+++ /dev/null
@@ -1,141 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:baselineAligned="false"
-    android:background="@android:color/transparent">
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="110dp"
-        android:background="@drawable/system_bar_background_3">
-        <FrameLayout
-            android:id="@+id/clock_container"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_centerInParent="true">
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/qs"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:background="@null"
-                systemui:intent="intent:#Intent;component=com.android.car.settings/.common.CarSettingActivities$QuickSettingActivity;launchFlags=0x24000000;end"
-            />
-            <com.android.systemui.statusbar.policy.Clock
-                android:id="@+id/clock"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center"
-                android:elevation="5dp"
-                android:singleLine="true"
-                android:textAppearance="@style/TextAppearance.StatusBar.Clock"
-            />
-        </FrameLayout>
-    </RelativeLayout>
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1"
-    />
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="110dp"
-        android:layout_gravity="bottom"
-        android:orientation="horizontal"
-        android:background="@drawable/system_bar_background_2">
-
-        <FrameLayout
-            android:id="@+id/left_hvac_container"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_alignParentStart="true">
-
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/hvacleft"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:background="@null"
-                systemui:broadcast="true"
-                systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
-            />
-
-            <com.android.systemui.car.hvac.AnimatedTemperatureView
-                android:id="@+id/lefttext"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:paddingStart="@*android:dimen/car_padding_4"
-                android:paddingEnd="16dp"
-                android:gravity="center_vertical|start"
-                android:minEms="4"
-                android:textAppearance="@style/TextAppearance.CarStatus"
-                systemui:hvacAreaId="49"
-                systemui:hvacMaxText="Max"
-                systemui:hvacMaxValue="126"
-                systemui:hvacMinText="Min"
-                systemui:hvacMinValue="0"
-                systemui:hvacPivotOffset="60dp"
-                systemui:hvacPropertyId="358614275"
-                systemui:hvacTempFormat="%.0f\u00B0"
-            />
-        </FrameLayout>
-        <View
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="1"
-        />
-        <FrameLayout
-            android:id="@+id/right_hvac_container"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_alignParentEnd="true">
-
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/hvacright"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:background="@null"
-                systemui:broadcast="true"
-                systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
-            />
-
-            <com.android.systemui.car.hvac.AnimatedTemperatureView
-                android:id="@+id/righttext"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:paddingStart="16dp"
-                android:paddingEnd="@*android:dimen/car_padding_4"
-                android:gravity="center_vertical|end"
-                android:minEms="4"
-                android:textAppearance="@style/TextAppearance.CarStatus"
-                systemui:hvacAreaId="68"
-                systemui:hvacMaxText="Max"
-                systemui:hvacMaxValue="126"
-                systemui:hvacMinText="Min"
-                systemui:hvacMinValue="0"
-                systemui:hvacPivotOffset="60dp"
-                systemui:hvacPropertyId="358614275"
-                systemui:hvacTempFormat="%.0f\u00B0"
-            />
-        </FrameLayout>
-    </LinearLayout>
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/layout/system_icons.xml b/packages/CarSystemUI/samples/sample1/rro/res/layout/system_icons.xml
deleted file mode 100644
index d235792..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/layout/system_icons.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/system_icons"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:gravity="center_vertical">
-
-    <com.android.systemui.statusbar.phone.StatusIconContainer
-        android:id="@+id/statusIcons"
-        android:layout_width="0dp"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:paddingEnd="4dp"
-        android:gravity="center_vertical"
-        android:orientation="horizontal"
-    />
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/values/attrs.xml b/packages/CarSystemUI/samples/sample1/rro/res/values/attrs.xml
deleted file mode 100644
index e02f9e6..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/values/attrs.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<resources>
-    <attr name="broadcast" format="boolean"/>
-    <attr name="icon" format="reference"/>
-    <attr name="selectedIcon" format="reference"/>
-    <attr name="intent" format="string"/>
-    <attr name="longIntent" format="string"/>
-    <attr name="componentNames" format="string" />
-    <attr name="highlightWhenSelected" format="boolean" />
-    <attr name="categories" format="string"/>
-    <attr name="packages" format="string" />
-
-    <!-- Custom attributes to configure hvac values -->
-    <declare-styleable name="AnimatedTemperatureView">
-        <attr name="hvacAreaId" format="integer"/>
-        <attr name="hvacPropertyId" format="integer"/>
-        <attr name="hvacTempFormat" format="string"/>
-        <!-- how far away the animations should center around -->
-        <attr name="hvacPivotOffset" format="dimension"/>
-        <attr name="hvacMinValue" format="float"/>
-        <attr name="hvacMaxValue" format="float"/>
-        <attr name="hvacMinText" format="string|reference"/>
-        <attr name="hvacMaxText" format="string|reference"/>
-        <attr name="android:gravity"/>
-        <attr name="android:minEms"/>
-        <attr name="android:textAppearance"/>
-    </declare-styleable>
-</resources>
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/values/colors.xml b/packages/CarSystemUI/samples/sample1/rro/res/values/colors.xml
deleted file mode 100644
index c32d638..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/values/colors.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.
-  -->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-    <color name="car_nav_icon_fill_color">#8F8F8F</color>
-    <color name="car_nav_icon_fill_color_selected">#FFFFFF</color>
-</resources>
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/values/config.xml b/packages/CarSystemUI/samples/sample1/rro/res/values/config.xml
deleted file mode 100644
index 2ec90e9..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/values/config.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<resources>
-    <!-- Configure which system bars should be displayed. -->
-    <bool name="config_enableTopNavigationBar">false</bool>
-    <bool name="config_enableLeftNavigationBar">false</bool>
-    <bool name="config_enableRightNavigationBar">true</bool>
-    <bool name="config_enableBottomNavigationBar">true</bool>
-
-    <!-- Configure the type of each system bar. Each system bar must have a unique type. -->
-    <!--    STATUS_BAR = 0-->
-    <!--    NAVIGATION_BAR = 1-->
-    <!--    STATUS_BAR_EXTRA = 2-->
-    <!--    NAVIGATION_BAR_EXTRA = 3-->
-    <integer name="config_topSystemBarType">0</integer>
-    <integer name="config_leftSystemBarType">0</integer>
-    <integer name="config_rightSystemBarType">0</integer>
-    <integer name="config_bottomSystemBarType">1</integer>
-
-    <!-- Configure the relative z-order among the system bars. When two system bars overlap (e.g.
-         if both top bar and left bar are enabled, it creates an overlapping space in the upper left
-         corner), the system bar with the higher z-order takes the overlapping space and padding is
-         applied to the other bar.-->
-    <!-- NOTE: If two overlapping system bars have the same z-order, SystemBarConfigs will throw a
-         RuntimeException, since their placing order cannot be determined. Bars that do not overlap
-         are allowed to have the same z-order. -->
-    <!-- NOTE: If the z-order of a bar is 10 or above, it will also appear on top of HUN's.    -->
-    <integer name="config_topSystemBarZOrder">0</integer>
-    <integer name="config_leftSystemBarZOrder">0</integer>
-    <integer name="config_rightSystemBarZOrder">11</integer>
-    <integer name="config_bottomSystemBarZOrder">10</integer>
-
-    <!-- Whether heads-up notifications should be shown on the bottom. If false, heads-up
-         notifications will be shown pushed to the top of their parent container. If true, they will
-         be shown pushed to the bottom of their parent container. If true, then should override
-         config_headsUpNotificationAnimationHelper to use a different AnimationHelper, such as
-         com.android.car.notification.headsup.animationhelper.
-         CarHeadsUpNotificationBottomAnimationHelper. -->
-    <bool name="config_showHeadsUpNotificationOnBottom">true</bool>
-
-    <string name="config_notificationPanelViewMediator" translatable="false">
-        com.android.systemui.car.notification.BottomNotificationPanelViewMediator</string>
-</resources>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/values/dimens.xml b/packages/CarSystemUI/samples/sample1/rro/res/values/dimens.xml
deleted file mode 100644
index cdfed27..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/values/dimens.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources>
-    <dimen name="car_right_navigation_bar_width">280dp</dimen>
-</resources>
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/values/styles.xml b/packages/CarSystemUI/samples/sample1/rro/res/values/styles.xml
deleted file mode 100644
index 136dc3b..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/values/styles.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.
-  -->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-    <style name="TextAppearance.StatusBar.Clock"
-           parent="@*android:style/TextAppearance.StatusBar.Icon">
-        <item name="android:textSize">40sp</item>
-        <item name="android:fontFamily">sans-serif-regular</item>
-        <item name="android:textColor">#FFFFFF</item>
-    </style>
-
-    <style name="NavigationBarButton">
-        <item name="android:layout_height">96dp</item>
-        <item name="android:layout_width">96dp</item>
-        <item name="android:background">?android:attr/selectableItemBackground</item>
-    </style>
-
-    <style name="TextAppearance.CarStatus" parent="@android:style/TextAppearance.DeviceDefault">
-        <item name="android:textSize">30sp</item>
-        <item name="android:textColor">#FFFFFF</item>
-    </style>
-</resources>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample1/rro/res/xml/car_sysui_overlays.xml b/packages/CarSystemUI/samples/sample1/rro/res/xml/car_sysui_overlays.xml
deleted file mode 100644
index 20aa5f7..0000000
--- a/packages/CarSystemUI/samples/sample1/rro/res/xml/car_sysui_overlays.xml
+++ /dev/null
@@ -1,76 +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.
-  -->
-
-<overlay>
-    <item target="layout/car_navigation_bar" value="@layout/car_navigation_bar"/>
-    <item target="layout/system_icons" value="@layout/system_icons"/>
-    <item target="layout/car_right_navigation_bar" value="@layout/car_right_navigation_bar"/>
-
-    <item target="attr/icon" value="@attr/icon"/>
-    <item target="attr/selectedIcon" value="@attr/selectedIcon"/>
-    <item target="attr/intent" value="@attr/intent"/>
-    <item target="attr/longIntent" value="@attr/longIntent"/>
-    <item target="attr/componentNames" value="@attr/componentNames"/>
-    <item target="attr/highlightWhenSelected" value="@attr/highlightWhenSelected"/>
-    <item target="attr/categories" value="@attr/categories"/>
-    <item target="attr/packages" value="@attr/packages"/>
-    <item target="attr/hvacAreaId" value="@attr/hvacAreaId"/>
-    <item target="attr/hvacPropertyId" value="@attr/hvacPropertyId"/>
-    <item target="attr/hvacTempFormat" value="@attr/hvacTempFormat"/>
-    <item target="attr/hvacPivotOffset" value="@attr/hvacPivotOffset"/>
-    <item target="attr/hvacMinValue" value="@attr/hvacMinValue"/>
-    <item target="attr/hvacMaxValue" value="@attr/hvacMaxValue"/>
-    <item target="attr/hvacMinText" value="@attr/hvacMinText"/>
-    <item target="attr/hvacMaxText" value="@attr/hvacMaxText"/>
-    <!-- start the intent as a broad cast instead of an activity if true-->
-    <item target="attr/broadcast" value="@attr/broadcast"/>
-
-    <item target="drawable/car_ic_overview" value="@drawable/car_ic_overview" />
-    <item target="drawable/car_ic_overview_selected" value="@drawable/car_ic_overview_selected" />
-    <item target="drawable/car_ic_apps" value="@drawable/car_ic_apps" />
-    <item target="drawable/car_ic_apps_selected" value="@drawable/car_ic_apps_selected" />
-    <item target="drawable/car_ic_music" value="@drawable/car_ic_music" />
-    <item target="drawable/car_ic_music_selected" value="@drawable/car_ic_music_selected" />
-    <item target="drawable/car_ic_phone" value="@drawable/car_ic_phone" />
-    <item target="drawable/car_ic_phone_selected" value="@drawable/car_ic_phone_selected" />
-    <item target="drawable/car_ic_navigation" value="@drawable/car_ic_navigation" />
-    <item target="drawable/car_ic_navigation_selected" value="@drawable/car_ic_navigation_selected" />
-
-    <item target="dimen/car_right_navigation_bar_width" value="@dimen/car_right_navigation_bar_width" />
-
-    <item target="style/NavigationBarButton" value="@style/NavigationBarButton"/>
-
-    <item target="color/car_nav_icon_fill_color" value="@color/car_nav_icon_fill_color" />
-
-    <item target="bool/config_enableTopNavigationBar" value="@bool/config_enableTopNavigationBar"/>
-    <item target="bool/config_enableLeftNavigationBar" value="@bool/config_enableLeftNavigationBar"/>
-    <item target="bool/config_enableRightNavigationBar" value="@bool/config_enableRightNavigationBar"/>
-    <item target="bool/config_enableBottomNavigationBar" value="@bool/config_enableBottomNavigationBar"/>
-    <item target="bool/config_showHeadsUpNotificationOnBottom" value="@bool/config_showHeadsUpNotificationOnBottom"/>
-
-    <item target="integer/config_topSystemBarType" value="@integer/config_topSystemBarType"/>
-    <item target="integer/config_leftSystemBarType" value="@integer/config_leftSystemBarType"/>
-    <item target="integer/config_rightSystemBarType" value="@integer/config_rightSystemBarType"/>
-    <item target="integer/config_bottomSystemBarType" value="@integer/config_bottomSystemBarType"/>
-
-    <item target="integer/config_topSystemBarZOrder" value="@integer/config_topSystemBarZOrder"/>
-    <item target="integer/config_leftSystemBarZOrder" value="@integer/config_leftSystemBarZOrder"/>
-    <item target="integer/config_rightSystemBarZOrder" value="@integer/config_rightSystemBarZOrder"/>
-    <item target="integer/config_bottomSystemBarZOrder" value="@integer/config_bottomSystemBarZOrder"/>
-
-    <item target="string/config_notificationPanelViewMediator" value="@string/config_notificationPanelViewMediator"/>
-</overlay>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample2/rro/Android.bp b/packages/CarSystemUI/samples/sample2/rro/Android.bp
deleted file mode 100644
index bf68e41..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/Android.bp
+++ /dev/null
@@ -1,27 +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.
-//
-
-android_app {
-    name: "CarSystemUISampleTwoRRO",
-    resource_dirs: ["res"],
-    certificate: "platform",
-    platform_apis: true,
-    manifest: "AndroidManifest.xml",
-    aaptflags: [
-        "--no-resource-deduping",
-        "--no-resource-removal",
-     ]
-}
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample2/rro/AndroidManifest.xml b/packages/CarSystemUI/samples/sample2/rro/AndroidManifest.xml
deleted file mode 100644
index 5c25056..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/AndroidManifest.xml
+++ /dev/null
@@ -1,24 +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.
-  -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.android.systemui.rro">
-    <overlay
-        android:targetPackage="com.android.systemui"
-        android:isStatic="false"
-        android:resourcesMap="@xml/car_sysui_overlays"
-    />
-</manifest>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_apps.xml b/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_apps.xml
deleted file mode 100644
index a8d8a2f..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_apps.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="44"
-        android:viewportHeight="44"
-        android:width="44dp"
-        android:height="44dp">
-<path
-    android:pathData="M7.33333333 14.6666667L14.6666667 14.6666667L14.6666667 7.33333333L7.33333333 7.33333333L7.33333333 14.6666667ZM18.3333333 36.6666667L25.6666667 36.6666667L25.6666667 29.3333333L18.3333333 29.3333333L18.3333333 36.6666667ZM7.33333333 36.6666667L14.6666667 36.6666667L14.6666667 29.3333333L7.33333333 29.3333333L7.33333333 36.6666667ZM7.33333333 25.6666667L14.6666667 25.6666667L14.6666667 18.3333333L7.33333333 18.3333333L7.33333333 25.6666667ZM18.3333333 25.6666667L25.6666667 25.6666667L25.6666667 18.3333333L18.3333333 18.3333333L18.3333333 25.6666667ZM29.3333333 7.33333333L29.3333333 14.6666667L36.6666667 14.6666667L36.6666667 7.33333333L29.3333333 7.33333333ZM18.3333333 14.6666667L25.6666667 14.6666667L25.6666667 7.33333333L18.3333333 7.33333333L18.3333333 14.6666667ZM29.3333333 25.6666667L36.6666667 25.6666667L36.6666667 18.3333333L29.3333333 18.3333333L29.3333333 25.6666667ZM29.3333333 36.6666667L36.6666667 36.6666667L36.6666667 29.3333333L29.3333333 29.3333333L29.3333333 36.6666667Z"
-    android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_music.xml b/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_music.xml
deleted file mode 100644
index 6339ebb..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_music.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M22 5.5L22 24.8416667C20.9183333 24.2183333 19.6716667 23.8333333 18.3333333 23.8333333C14.2816667 23.8333333 11 27.115 11 31.1666667C11 35.2183333 14.2816667 38.5 18.3333333 38.5C22.385 38.5 25.6666667 35.2183333 25.6666667 31.1666667L25.6666667 12.8333333L33 12.8333333L33 5.5L22 5.5Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_navigation.xml b/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_navigation.xml
deleted file mode 100644
index e1fabe0..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_navigation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M39.8016667 20.6983333L23.3016667 4.19833333C22.5866667 3.48333333 21.4316667 3.48333333 20.7166667 4.19833333L4.21666667 20.6983333C3.50166667 21.4133333 3.50166667 22.5683333 4.21666667 23.2833333L20.7166667 39.7833333C21.4316667 40.4983333 22.5866667 40.4983333 23.3016667 39.7833333L39.8016667 23.2833333C40.5166667 22.5866667 40.5166667 21.4316667 39.8016667 20.6983333ZM25.6666667 26.5833333L25.6666667 22L18.3333333 22L18.3333333 27.5L14.6666667 27.5L14.6666667 20.1666667C14.6666667 19.1583333 15.4916667 18.3333333 16.5 18.3333333L25.6666667 18.3333333L25.6666667 13.75L32.0833333 20.1666667L25.6666667 26.5833333Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_notification.xml b/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_notification.xml
deleted file mode 100644
index 3c3fefc..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_notification.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="44dp"
-        android:height="44dp"
-        android:viewportWidth="44"
-        android:viewportHeight="44">
-    <path
-        android:pathData="M22 39.125C23.925 39.125 25.5 37.55 25.5 35.625L18.5 35.625C18.5 37.55 20.0575 39.125 22 39.125ZM32.5 28.625L32.5 19.875C32.5 14.5025 29.63 10.005 24.625 8.815L24.625 7.625C24.625 6.1725 23.4525 5 22 5C20.5475 5 19.375 6.1725 19.375 7.625L19.375 8.815C14.3525 10.005 11.5 14.485 11.5 19.875L11.5 28.625L8 32.125L8 33.875L36 33.875L36 32.125L32.5 28.625Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_overview.xml b/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_overview.xml
deleted file mode 100644
index f185eb9..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_overview.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M36.92857 22.39286A14.53571 14.53571 0 0 1 7.857143 22.39286A14.53571 14.53571 0 0 1 36.92857 22.39286Z"
-        android:strokeColor="@color/car_nav_icon_fill_color"
-        android:strokeWidth="4" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_phone.xml b/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_phone.xml
deleted file mode 100644
index 50e36b5..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/res/drawable/car_ic_phone.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M12.1366667 19.7816667C14.7766667 24.97 19.03 29.205 24.2183333 31.8633333L28.2516667 27.83C28.7466667 27.335 29.48 27.17 30.1216667 27.39C32.175 28.0683333 34.3933333 28.435 36.6666667 28.435C37.675 28.435 38.5 29.26 38.5 30.2683333L38.5 36.6666667C38.5 37.675 37.675 38.5 36.6666667 38.5C19.4516667 38.5 5.5 24.5483333 5.5 7.33333333C5.5 6.325 6.325 5.5 7.33333333 5.5L13.75 5.5C14.7583333 5.5 15.5833333 6.325 15.5833333 7.33333333C15.5833333 9.625 15.95 11.825 16.6283333 13.8783333C16.83 14.52 16.6833333 15.235 16.17 15.7483333L12.1366667 19.7816667Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample2/rro/res/drawable/system_bar_background.xml b/packages/CarSystemUI/samples/sample2/rro/res/drawable/system_bar_background.xml
deleted file mode 100644
index 6161ad9..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/res/drawable/system_bar_background.xml
+++ /dev/null
@@ -1,33 +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.
-  -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
-    <corners
-        android:topLeftRadius="0dp"
-        android:topRightRadius="10dp"
-        android:bottomLeftRadius="0dp"
-        android:bottomRightRadius="0dp"
-    />
-    <solid
-        android:color="#404040"
-    />
-    <padding
-        android:left="0dp"
-        android:top="0dp"
-        android:right="0dp"
-        android:bottom="0dp"
-    />
-</shape>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample2/rro/res/layout/car_left_navigation_bar.xml b/packages/CarSystemUI/samples/sample2/rro/res/layout/car_left_navigation_bar.xml
deleted file mode 100644
index bd6065c..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/res/layout/car_left_navigation_bar.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:background="@drawable/system_bar_background">
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/home"
-        style="@style/NavigationBarButton"
-        systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
-        systemui:icon="@drawable/car_ic_overview"
-        systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-        systemui:highlightWhenSelected="true"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/maps_nav"
-        style="@style/NavigationBarButton"
-        systemui:categories="android.intent.category.APP_MAPS"
-        systemui:icon="@drawable/car_ic_navigation"
-        systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_MAPS;launchFlags=0x14000000;end"
-        systemui:highlightWhenSelected="true"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/music_nav"
-        style="@style/NavigationBarButton"
-        systemui:categories="android.intent.category.APP_MUSIC"
-        systemui:icon="@drawable/car_ic_music"
-        systemui:intent="intent:#Intent;action=android.car.intent.action.MEDIA_TEMPLATE;launchFlags=0x10000000;end"
-        systemui:packages="com.android.car.media"
-        systemui:highlightWhenSelected="true"
-    />
-
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/grid_nav"
-        style="@style/NavigationBarButton"
-        systemui:componentNames="com.android.car.carlauncher/.AppGridActivity"
-        systemui:icon="@drawable/car_ic_apps"
-        systemui:intent="intent:#Intent;component=com.android.car.carlauncher/.AppGridActivity;launchFlags=0x24000000;end"
-        systemui:highlightWhenSelected="true"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/phone_nav"
-        style="@style/NavigationBarButton"
-        systemui:icon="@drawable/car_ic_phone"
-        systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;package=com.android.car.dialer;launchFlags=0x10000000;end"
-        systemui:packages="com.android.car.dialer"
-        systemui:highlightWhenSelected="true"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/notifications"
-        style="@style/NavigationBarButton"
-        systemui:highlightWhenSelected="true"
-        systemui:icon="@drawable/car_ic_notification"
-        systemui:longIntent="intent:#Intent;component=com.android.car.bugreport/.BugReportActivity;end"/>
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:gravity="bottom"
-        android:orientation="vertical">
-
-        <com.android.systemui.statusbar.policy.Clock
-            android:id="@+id/clock"
-            android:textAppearance="@style/TextAppearance.StatusBar.Clock"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            android:singleLine="true"
-            android:gravity="center_horizontal"
-            android:paddingBottom="20dp"
-        />
-
-        <Space
-            android:layout_height="10dp"
-            android:layout_width="match_parent"/>
-
-    </LinearLayout>
-
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/samples/sample2/rro/res/values/attrs.xml b/packages/CarSystemUI/samples/sample2/rro/res/values/attrs.xml
deleted file mode 100644
index 7ba3334..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/res/values/attrs.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<resources>
-    <attr name="broadcast" format="boolean"/>
-    <attr name="icon" format="reference"/>
-    <attr name="selectedIcon" format="reference"/>
-    <attr name="intent" format="string"/>
-    <attr name="longIntent" format="string"/>
-    <attr name="componentNames" format="string" />
-    <attr name="highlightWhenSelected" format="boolean" />
-    <attr name="categories" format="string"/>
-    <attr name="packages" format="string" />
-</resources>
diff --git a/packages/CarSystemUI/samples/sample2/rro/res/values/colors.xml b/packages/CarSystemUI/samples/sample2/rro/res/values/colors.xml
deleted file mode 100644
index c32d638..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/res/values/colors.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.
-  -->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-    <color name="car_nav_icon_fill_color">#8F8F8F</color>
-    <color name="car_nav_icon_fill_color_selected">#FFFFFF</color>
-</resources>
diff --git a/packages/CarSystemUI/samples/sample2/rro/res/values/config.xml b/packages/CarSystemUI/samples/sample2/rro/res/values/config.xml
deleted file mode 100644
index 89c7bd4..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/res/values/config.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<resources>
-    <!-- Configure which system bars should be displayed. -->
-    <bool name="config_enableTopNavigationBar">false</bool>
-    <bool name="config_enableLeftNavigationBar">true</bool>
-    <bool name="config_enableRightNavigationBar">false</bool>
-    <bool name="config_enableBottomNavigationBar">false</bool>
-
-    <!-- Configure the type of each system bar. Each system bar must have a unique type. -->
-    <!--    STATUS_BAR = 0-->
-    <!--    NAVIGATION_BAR = 1-->
-    <!--    STATUS_BAR_EXTRA = 2-->
-    <!--    NAVIGATION_BAR_EXTRA = 3-->
-    <integer name="config_topSystemBarType">0</integer>
-    <integer name="config_leftSystemBarType">1</integer>
-    <integer name="config_rightSystemBarType">2</integer>
-    <integer name="config_bottomSystemBarType">3</integer>
-
-    <!-- Configure the relative z-order among the system bars. When two system bars overlap (e.g.
-         if both top bar and left bar are enabled, it creates an overlapping space in the upper left
-         corner), the system bar with the higher z-order takes the overlapping space and padding is
-         applied to the other bar.-->
-    <!-- NOTE: If two overlapping system bars have the same z-order, SystemBarConfigs will throw a
-         RuntimeException, since their placing order cannot be determined. Bars that do not overlap
-         are allowed to have the same z-order. -->
-    <!-- NOTE: If the z-order of a bar is 10 or above, it will also appear on top of HUN's.    -->
-    <integer name="config_topSystemBarZOrder">0</integer>
-    <integer name="config_leftSystemBarZOrder">10</integer>
-    <integer name="config_rightSystemBarZOrder">10</integer>
-    <integer name="config_bottomSystemBarZOrder">10</integer>
-
-    <!-- Whether heads-up notifications should be shown on the bottom. If false, heads-up
-         notifications will be shown pushed to the top of their parent container. If true, they will
-         be shown pushed to the bottom of their parent container. If true, then should override
-         config_headsUpNotificationAnimationHelper to use a different AnimationHelper, such as
-         com.android.car.notification.headsup.animationhelper.
-         CarHeadsUpNotificationBottomAnimationHelper. -->
-    <bool name="config_showHeadsUpNotificationOnBottom">true</bool>
-
-    <string name="config_notificationPanelViewMediator" translatable="false">com.android.systemui.car.notification.NotificationPanelViewMediator</string>
-</resources>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample2/rro/res/values/styles.xml b/packages/CarSystemUI/samples/sample2/rro/res/values/styles.xml
deleted file mode 100644
index 136dc3b..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/res/values/styles.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.
-  -->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-    <style name="TextAppearance.StatusBar.Clock"
-           parent="@*android:style/TextAppearance.StatusBar.Icon">
-        <item name="android:textSize">40sp</item>
-        <item name="android:fontFamily">sans-serif-regular</item>
-        <item name="android:textColor">#FFFFFF</item>
-    </style>
-
-    <style name="NavigationBarButton">
-        <item name="android:layout_height">96dp</item>
-        <item name="android:layout_width">96dp</item>
-        <item name="android:background">?android:attr/selectableItemBackground</item>
-    </style>
-
-    <style name="TextAppearance.CarStatus" parent="@android:style/TextAppearance.DeviceDefault">
-        <item name="android:textSize">30sp</item>
-        <item name="android:textColor">#FFFFFF</item>
-    </style>
-</resources>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample2/rro/res/xml/car_sysui_overlays.xml b/packages/CarSystemUI/samples/sample2/rro/res/xml/car_sysui_overlays.xml
deleted file mode 100644
index 58a535b..0000000
--- a/packages/CarSystemUI/samples/sample2/rro/res/xml/car_sysui_overlays.xml
+++ /dev/null
@@ -1,66 +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.
-  -->
-
-<overlay>
-    <item target="layout/car_left_navigation_bar" value="@layout/car_left_navigation_bar"/>
-
-    <item target="attr/icon" value="@attr/icon"/>
-    <item target="attr/selectedIcon" value="@attr/selectedIcon"/>
-    <item target="attr/intent" value="@attr/intent"/>
-    <item target="attr/longIntent" value="@attr/longIntent"/>
-    <item target="attr/componentNames" value="@attr/componentNames"/>
-    <item target="attr/highlightWhenSelected" value="@attr/highlightWhenSelected"/>
-    <item target="attr/categories" value="@attr/categories"/>
-    <item target="attr/packages" value="@attr/packages"/>
-    <!-- start the intent as a broad cast instead of an activity if true-->
-    <item target="attr/broadcast" value="@attr/broadcast"/>
-
-    <item target="drawable/car_ic_overview" value="@drawable/car_ic_overview" />
-    <item target="drawable/car_ic_apps" value="@drawable/car_ic_apps" />
-    <item target="drawable/car_ic_music" value="@drawable/car_ic_music" />
-    <item target="drawable/car_ic_phone" value="@drawable/car_ic_phone" />
-    <item target="drawable/car_ic_navigation" value="@drawable/car_ic_navigation" />
-
-    <item target="style/NavigationBarButton" value="@style/NavigationBarButton"/>
-
-    <item target="color/car_nav_icon_fill_color" value="@color/car_nav_icon_fill_color" />
-
-    <item target="bool/config_enableTopNavigationBar" value="@bool/config_enableTopNavigationBar"/>
-    <item target="bool/config_enableLeftNavigationBar" value="@bool/config_enableLeftNavigationBar"/>
-    <item target="bool/config_enableRightNavigationBar" value="@bool/config_enableRightNavigationBar"/>
-    <item target="bool/config_enableBottomNavigationBar" value="@bool/config_enableBottomNavigationBar"/>
-    <item target="bool/config_showHeadsUpNotificationOnBottom" value="@bool/config_showHeadsUpNotificationOnBottom"/>
-
-    <item target="integer/config_topSystemBarType" value="@integer/config_topSystemBarType"/>
-    <item target="integer/config_leftSystemBarType" value="@integer/config_leftSystemBarType"/>
-    <item target="integer/config_rightSystemBarType" value="@integer/config_rightSystemBarType"/>
-    <item target="integer/config_bottomSystemBarType" value="@integer/config_bottomSystemBarType"/>
-
-    <item target="integer/config_topSystemBarZOrder" value="@integer/config_topSystemBarZOrder"/>
-    <item target="integer/config_leftSystemBarZOrder" value="@integer/config_leftSystemBarZOrder"/>
-    <item target="integer/config_rightSystemBarZOrder" value="@integer/config_rightSystemBarZOrder"/>
-    <item target="integer/config_bottomSystemBarZOrder" value="@integer/config_bottomSystemBarZOrder"/>
-
-    <item target="string/config_notificationPanelViewMediator" value="@string/config_notificationPanelViewMediator"/>
-
-    <item target="id/home" value="@id/home"/>
-    <item target="id/maps_nav" value="@id/maps_nav"/>
-    <item target="id/music_nav" value="@id/music_nav"/>
-    <item target="id/grid_nav" value="@id/grid_nav"/>
-    <item target="id/phone_nav" value="@id/phone_nav"/>
-    <item target="id/notifications" value="@id/notifications"/>
-</overlay>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample3/rro/AndroidManifest.xml b/packages/CarSystemUI/samples/sample3/rro/AndroidManifest.xml
deleted file mode 100644
index 5c25056..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/AndroidManifest.xml
+++ /dev/null
@@ -1,24 +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.
-  -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.android.systemui.rro">
-    <overlay
-        android:targetPackage="com.android.systemui"
-        android:isStatic="false"
-        android:resourcesMap="@xml/car_sysui_overlays"
-    />
-</manifest>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_apps.xml b/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_apps.xml
deleted file mode 100644
index a8d8a2f..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_apps.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="44"
-        android:viewportHeight="44"
-        android:width="44dp"
-        android:height="44dp">
-<path
-    android:pathData="M7.33333333 14.6666667L14.6666667 14.6666667L14.6666667 7.33333333L7.33333333 7.33333333L7.33333333 14.6666667ZM18.3333333 36.6666667L25.6666667 36.6666667L25.6666667 29.3333333L18.3333333 29.3333333L18.3333333 36.6666667ZM7.33333333 36.6666667L14.6666667 36.6666667L14.6666667 29.3333333L7.33333333 29.3333333L7.33333333 36.6666667ZM7.33333333 25.6666667L14.6666667 25.6666667L14.6666667 18.3333333L7.33333333 18.3333333L7.33333333 25.6666667ZM18.3333333 25.6666667L25.6666667 25.6666667L25.6666667 18.3333333L18.3333333 18.3333333L18.3333333 25.6666667ZM29.3333333 7.33333333L29.3333333 14.6666667L36.6666667 14.6666667L36.6666667 7.33333333L29.3333333 7.33333333ZM18.3333333 14.6666667L25.6666667 14.6666667L25.6666667 7.33333333L18.3333333 7.33333333L18.3333333 14.6666667ZM29.3333333 25.6666667L36.6666667 25.6666667L36.6666667 18.3333333L29.3333333 18.3333333L29.3333333 25.6666667ZM29.3333333 36.6666667L36.6666667 36.6666667L36.6666667 29.3333333L29.3333333 29.3333333L29.3333333 36.6666667Z"
-    android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_home.xml b/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_home.xml
deleted file mode 100644
index c78f0ed..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_home.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/system_bar_icon_drawing_size"
-        android:height="@dimen/system_bar_icon_drawing_size"
-        android:viewportWidth="24"
-        android:viewportHeight="24">
-    <path
-        android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_hvac.xml b/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_hvac.xml
deleted file mode 100644
index 55c968e..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_hvac.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2018 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/system_bar_icon_drawing_size"
-        android:height="@dimen/system_bar_icon_drawing_size"
-        android:viewportWidth="24"
-        android:viewportHeight="24">
-    <path
-        android:pathData="M16.34,8.36l-2.29,0.82c-0.18,-0.13 -0.38,-0.25 -0.58,-0.34c0.17,-0.83 0.63,-1.58 1.36,-2.06C16.85,5.44 16.18,2 13.39,2C9,2 7.16,5.01 8.36,7.66l0.82,2.29c-0.13,0.18 -0.25,0.38 -0.34,0.58c-0.83,-0.17 -1.58,-0.63 -2.06,-1.36C5.44,7.15 2,7.82 2,10.61c0,4.4 3.01,6.24 5.66,5.03l2.29,-0.82c0.18,0.13 0.38,0.25 0.58,0.34c-0.17,0.83 -0.63,1.58 -1.36,2.06C7.15,18.56 7.82,22 10.61,22c4.4,0 6.24,-3.01 5.03,-5.66l-0.82,-2.29c0.13,-0.18 0.25,-0.38 0.34,-0.58c0.83,0.17 1.58,0.63 2.06,1.36c1.34,2.01 4.77,1.34 4.77,-1.45C22,9 18.99,7.16 16.34,8.36zM12,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5c0,-0.83 0.67,-1.5 1.5,-1.5c0.83,0 1.5,0.67 1.5,1.5C13.5,12.83 12.83,13.5 12,13.5zM10.24,5.22C10.74,4.44 11.89,4 13.39,4c0.79,0 0.71,0.86 0.34,1.11c-1.22,0.81 -2,2.06 -2.25,3.44c-0.21,0.03 -0.42,0.08 -0.62,0.15l-0.68,-1.88C10,6.42 9.86,5.81 10.24,5.22zM6.83,13.82c-0.4,0.18 -1.01,0.32 -1.61,-0.06C4.44,13.26 4,12.11 4,10.61c0,-0.79 0.86,-0.71 1.11,-0.34c0.81,1.22 2.06,2 3.44,2.25c0.03,0.21 0.08,0.42 0.15,0.62L6.83,13.82zM13.76,18.78c-0.5,0.77 -1.65,1.22 -3.15,1.22c-0.79,0 -0.71,-0.86 -0.34,-1.11c1.22,-0.81 2,-2.06 2.25,-3.44c0.21,-0.03 0.42,-0.08 0.62,-0.15l0.68,1.88C14,17.58 14.14,18.18 13.76,18.78zM18.89,13.73c-0.81,-1.22 -2.06,-2 -3.44,-2.25c-0.03,-0.21 -0.08,-0.42 -0.15,-0.62l1.88,-0.68c0.4,-0.18 1.01,-0.32 1.61,0.06c0.77,0.5 1.22,1.65 1.22,3.15C20,14.19 19.14,14.11 18.89,13.73z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_music.xml b/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_music.xml
deleted file mode 100644
index 6339ebb..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_music.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M22 5.5L22 24.8416667C20.9183333 24.2183333 19.6716667 23.8333333 18.3333333 23.8333333C14.2816667 23.8333333 11 27.115 11 31.1666667C11 35.2183333 14.2816667 38.5 18.3333333 38.5C22.385 38.5 25.6666667 35.2183333 25.6666667 31.1666667L25.6666667 12.8333333L33 12.8333333L33 5.5L22 5.5Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_navigation.xml b/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_navigation.xml
deleted file mode 100644
index e1fabe0..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_navigation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M39.8016667 20.6983333L23.3016667 4.19833333C22.5866667 3.48333333 21.4316667 3.48333333 20.7166667 4.19833333L4.21666667 20.6983333C3.50166667 21.4133333 3.50166667 22.5683333 4.21666667 23.2833333L20.7166667 39.7833333C21.4316667 40.4983333 22.5866667 40.4983333 23.3016667 39.7833333L39.8016667 23.2833333C40.5166667 22.5866667 40.5166667 21.4316667 39.8016667 20.6983333ZM25.6666667 26.5833333L25.6666667 22L18.3333333 22L18.3333333 27.5L14.6666667 27.5L14.6666667 20.1666667C14.6666667 19.1583333 15.4916667 18.3333333 16.5 18.3333333L25.6666667 18.3333333L25.6666667 13.75L32.0833333 20.1666667L25.6666667 26.5833333Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_notification.xml b/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_notification.xml
deleted file mode 100644
index aabf916..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_notification.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/system_bar_icon_drawing_size"
-        android:height="@dimen/system_bar_icon_drawing_size"
-        android:viewportWidth="44"
-        android:viewportHeight="44">
-    <path
-        android:pathData="M22 39.125C23.925 39.125 25.5 37.55 25.5 35.625L18.5 35.625C18.5 37.55 20.0575 39.125 22 39.125ZM32.5 28.625L32.5 19.875C32.5 14.5025 29.63 10.005 24.625 8.815L24.625 7.625C24.625 6.1725 23.4525 5 22 5C20.5475 5 19.375 6.1725 19.375 7.625L19.375 8.815C14.3525 10.005 11.5 14.485 11.5 19.875L11.5 28.625L8 32.125L8 33.875L36 33.875L36 32.125L32.5 28.625Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_overview.xml b/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_overview.xml
deleted file mode 100644
index f185eb9..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_overview.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M36.92857 22.39286A14.53571 14.53571 0 0 1 7.857143 22.39286A14.53571 14.53571 0 0 1 36.92857 22.39286Z"
-        android:strokeColor="@color/car_nav_icon_fill_color"
-        android:strokeWidth="4" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_phone.xml b/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_phone.xml
deleted file mode 100644
index 50e36b5..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/drawable/car_ic_phone.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:viewportWidth="44"
-    android:viewportHeight="44"
-    android:width="44dp"
-    android:height="44dp">
-    <path
-        android:pathData="M12.1366667 19.7816667C14.7766667 24.97 19.03 29.205 24.2183333 31.8633333L28.2516667 27.83C28.7466667 27.335 29.48 27.17 30.1216667 27.39C32.175 28.0683333 34.3933333 28.435 36.6666667 28.435C37.675 28.435 38.5 29.26 38.5 30.2683333L38.5 36.6666667C38.5 37.675 37.675 38.5 36.6666667 38.5C19.4516667 38.5 5.5 24.5483333 5.5 7.33333333C5.5 6.325 6.325 5.5 7.33333333 5.5L13.75 5.5C14.7583333 5.5 15.5833333 6.325 15.5833333 7.33333333C15.5833333 9.625 15.95 11.825 16.6283333 13.8783333C16.83 14.52 16.6833333 15.235 16.17 15.7483333L12.1366667 19.7816667Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
-</vector>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/drawable/system_bar_background.xml b/packages/CarSystemUI/samples/sample3/rro/res/drawable/system_bar_background.xml
deleted file mode 100644
index 66da21c..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/drawable/system_bar_background.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.
-  -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
-    <solid
-        android:color="#404040"
-    />
-</shape>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/layout/car_left_navigation_bar.xml b/packages/CarSystemUI/samples/sample3/rro/res/layout/car_left_navigation_bar.xml
deleted file mode 100644
index 3d1cd08..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/layout/car_left_navigation_bar.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:background="@android:color/transparent">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:gravity="bottom"
-        android:orientation="vertical">
-
-        <com.android.systemui.statusbar.policy.Clock
-            android:id="@+id/clock"
-            android:textAppearance="@style/TextAppearance.StatusBar.Clock"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            android:singleLine="true"
-            android:gravity="center_horizontal"
-            android:paddingBottom="20dp"
-        />
-
-        <Space
-            android:layout_height="50dp"
-            android:layout_width="match_parent"/>
-
-    </LinearLayout>
-
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/layout/car_navigation_bar.xml b/packages/CarSystemUI/samples/sample3/rro/res/layout/car_navigation_bar.xml
deleted file mode 100644
index 8314ba5..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/layout/car_navigation_bar.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project.
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@drawable/system_bar_background"
-    android:gravity="center"
-    android:orientation="horizontal">
-
-    <RelativeLayout
-        android:id="@+id/nav_buttons"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layoutDirection="ltr">
-
-        <com.android.systemui.car.hvac.AdjustableTemperatureView
-            android:id="@+id/driver_hvac"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:gravity="center_vertical"
-            systemui:hvacAreaId="49"
-            systemui:hvacTempFormat="%.0f\u00B0" />
-
-        <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_centerInParent="true"
-            android:layout_weight="1"
-            android:gravity="center"
-            android:layoutDirection="ltr"
-            android:paddingEnd="@dimen/system_bar_button_group_padding"
-            android:paddingStart="@dimen/system_bar_button_group_padding">
-
-            <Space
-                android:layout_width="0dp"
-                android:layout_height="match_parent"
-                android:layout_weight="1"/>
-
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/home"
-                style="@style/NavigationBarButton"
-                systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
-                systemui:highlightWhenSelected="true"
-                systemui:icon="@drawable/car_ic_home"
-                systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"/>
-
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/phone_nav"
-                style="@style/NavigationBarButton"
-                systemui:highlightWhenSelected="true"
-                systemui:icon="@drawable/car_ic_phone"
-                systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;package=com.android.car.dialer;launchFlags=0x10000000;end"
-                systemui:packages="com.android.car.dialer"/>
-
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/grid_nav"
-                style="@style/NavigationBarButton"
-                systemui:componentNames="com.android.car.carlauncher/.AppGridActivity"
-                systemui:highlightWhenSelected="true"
-                systemui:icon="@drawable/car_ic_apps"
-                systemui:intent="intent:#Intent;component=com.android.car.carlauncher/.AppGridActivity;launchFlags=0x24000000;end"/>
-
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/hvac"
-                style="@style/NavigationBarButton"
-                systemui:highlightWhenSelected="true"
-                systemui:icon="@drawable/car_ic_hvac"
-                systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
-                systemui:broadcast="true"/>
-
-            <com.android.systemui.car.navigationbar.CarNavigationButton
-                android:id="@+id/notifications"
-                style="@style/NavigationBarButton"
-                systemui:highlightWhenSelected="true"
-                systemui:icon="@drawable/car_ic_notification"
-                systemui:longIntent="intent:#Intent;component=com.android.car.bugreport/.BugReportActivity;end"/>
-
-            <Space
-                android:layout_width="0dp"
-                android:layout_height="match_parent"
-                android:layout_weight="1"/>
-        </LinearLayout>
-
-        <com.android.systemui.car.hvac.AdjustableTemperatureView
-            android:id="@+id/passenger_hvac"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_alignParentEnd="true"
-            android:gravity="center_vertical"
-            systemui:hvacAreaId="68"
-            systemui:hvacTempFormat="%.0f\u00B0" />
-    </RelativeLayout>
-
-    <LinearLayout
-        android:id="@+id/lock_screen_nav_buttons"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:gravity="center"
-        android:layoutDirection="ltr"
-        android:paddingEnd="@dimen/car_keyline_1"
-        android:paddingStart="@dimen/car_keyline_1"
-        android:visibility="gone"
-    />
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/values/attrs.xml b/packages/CarSystemUI/samples/sample3/rro/res/values/attrs.xml
deleted file mode 100644
index bc7ded2..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/values/attrs.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<resources>
-    <attr name="broadcast" format="boolean"/>
-    <attr name="icon" format="reference"/>
-    <attr name="intent" format="string"/>
-    <attr name="longIntent" format="string"/>
-    <attr name="componentNames" format="string" />
-    <attr name="highlightWhenSelected" format="boolean" />
-    <attr name="categories" format="string"/>
-    <attr name="packages" format="string" />
-
-    <!-- Custom attributes to configure hvac values -->
-    <declare-styleable name="AnimatedTemperatureView">
-        <attr name="hvacAreaId" format="integer"/>
-        <attr name="hvacPropertyId" format="integer"/>
-        <attr name="hvacTempFormat" format="string"/>
-        <!-- how far away the animations should center around -->
-        <attr name="hvacPivotOffset" format="dimension"/>
-        <attr name="hvacMinValue" format="float"/>
-        <attr name="hvacMaxValue" format="float"/>
-        <attr name="hvacMinText" format="string|reference"/>
-        <attr name="hvacMaxText" format="string|reference"/>
-        <attr name="android:gravity"/>
-        <attr name="android:minEms"/>
-        <attr name="android:textAppearance"/>
-    </declare-styleable>
-</resources>
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/values/config.xml b/packages/CarSystemUI/samples/sample3/rro/res/values/config.xml
deleted file mode 100644
index 2148e7c..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/values/config.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<resources>
-    <!-- Configure which system bars should be displayed. -->
-    <bool name="config_enableTopNavigationBar">false</bool>
-    <bool name="config_enableLeftNavigationBar">true</bool>
-    <bool name="config_enableRightNavigationBar">false</bool>
-    <bool name="config_enableBottomNavigationBar">true</bool>
-
-    <!-- Configure the type of each system bar. Each system bar must have a unique type. -->
-    <!--    STATUS_BAR = 0-->
-    <!--    NAVIGATION_BAR = 1-->
-    <!--    STATUS_BAR_EXTRA = 2-->
-    <!--    NAVIGATION_BAR_EXTRA = 3-->
-    <integer name="config_topSystemBarType">2</integer>
-    <integer name="config_leftSystemBarType">0</integer>
-    <integer name="config_rightSystemBarType">3</integer>
-    <integer name="config_bottomSystemBarType">1</integer>
-
-    <!-- Configure the relative z-order among the system bars. When two system bars overlap (e.g.
-         if both top bar and left bar are enabled, it creates an overlapping space in the upper left
-         corner), the system bar with the higher z-order takes the overlapping space and padding is
-         applied to the other bar.-->
-    <!-- NOTE: If two overlapping system bars have the same z-order, SystemBarConfigs will throw a
-         RuntimeException, since their placing order cannot be determined. Bars that do not overlap
-         are allowed to have the same z-order. -->
-    <!-- NOTE: If the z-order of a bar is 10 or above, it will also appear on top of HUN's.    -->
-    <integer name="config_topSystemBarZOrder">0</integer>
-    <integer name="config_leftSystemBarZOrder">10</integer>
-    <integer name="config_rightSystemBarZOrder">0</integer>
-    <integer name="config_bottomSystemBarZOrder">15</integer>
-
-    <!-- Whether heads-up notifications should be shown on the bottom. If false, heads-up
-         notifications will be shown pushed to the top of their parent container. If true, they will
-         be shown pushed to the bottom of their parent container. If true, then should override
-         config_headsUpNotificationAnimationHelper to use a different AnimationHelper, such as
-         com.android.car.notification.headsup.animationhelper.
-         CarHeadsUpNotificationBottomAnimationHelper. -->
-    <bool name="config_showHeadsUpNotificationOnBottom">false</bool>
-
-    <string name="config_notificationPanelViewMediator" translatable="false">com.android.systemui.car.notification.BottomNotificationPanelViewMediator</string>
-</resources>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/values/dimens.xml b/packages/CarSystemUI/samples/sample3/rro/res/values/dimens.xml
deleted file mode 100644
index c89f949..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/values/dimens.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<resources>
-    <dimen name="car_left_navigation_bar_width">280dp</dimen>
-    <dimen name="car_keyline_1">24dp</dimen>
-    <dimen name="system_bar_button_group_padding">64dp</dimen>
-    <dimen name="system_bar_icon_drawing_size">44dp</dimen>
-</resources>
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/values/styles.xml b/packages/CarSystemUI/samples/sample3/rro/res/values/styles.xml
deleted file mode 100644
index bad3691..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/values/styles.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-    <style name="TextAppearance.StatusBar.Clock"
-           parent="@*android:style/TextAppearance.StatusBar.Icon">
-        <item name="android:textSize">40sp</item>
-        <item name="android:fontFamily">sans-serif-regular</item>
-        <item name="android:textColor">#FFFFFF</item>
-    </style>
-
-    <style name="NavigationBarButton">
-        <item name="android:layout_height">96dp</item>
-        <item name="android:layout_width">96dp</item>
-        <item name="android:background">?android:attr/selectableItemBackground</item>
-    </style>
-</resources>
\ No newline at end of file
diff --git a/packages/CarSystemUI/samples/sample3/rro/res/xml/car_sysui_overlays.xml b/packages/CarSystemUI/samples/sample3/rro/res/xml/car_sysui_overlays.xml
deleted file mode 100644
index f08d968..0000000
--- a/packages/CarSystemUI/samples/sample3/rro/res/xml/car_sysui_overlays.xml
+++ /dev/null
@@ -1,75 +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.
-  -->
-
-<overlay>
-    <item target="layout/car_navigation_bar" value="@layout/car_navigation_bar"/>
-    <item target="layout/car_left_navigation_bar" value="@layout/car_left_navigation_bar"/>
-
-    <item target="bool/config_enableTopNavigationBar" value="@bool/config_enableTopNavigationBar"/>
-    <item target="bool/config_enableLeftNavigationBar" value="@bool/config_enableLeftNavigationBar"/>
-    <item target="bool/config_enableRightNavigationBar" value="@bool/config_enableRightNavigationBar"/>
-    <item target="bool/config_enableBottomNavigationBar" value="@bool/config_enableBottomNavigationBar"/>
-    <item target="bool/config_showHeadsUpNotificationOnBottom" value="@bool/config_showHeadsUpNotificationOnBottom"/>
-
-    <item target="attr/icon" value="@attr/icon"/>
-    <item target="attr/intent" value="@attr/intent"/>
-    <item target="attr/longIntent" value="@attr/longIntent"/>
-    <item target="attr/componentNames" value="@attr/componentNames"/>
-    <item target="attr/highlightWhenSelected" value="@attr/highlightWhenSelected"/>
-    <item target="attr/categories" value="@attr/categories"/>
-    <item target="attr/packages" value="@attr/packages"/>
-    <item target="attr/hvacAreaId" value="@attr/hvacAreaId"/>
-    <item target="attr/hvacPropertyId" value="@attr/hvacPropertyId"/>
-    <item target="attr/hvacTempFormat" value="@attr/hvacTempFormat"/>
-    <item target="attr/hvacPivotOffset" value="@attr/hvacPivotOffset"/>
-    <item target="attr/hvacMinValue" value="@attr/hvacMinValue"/>
-    <item target="attr/hvacMaxValue" value="@attr/hvacMaxValue"/>
-    <item target="attr/hvacMinText" value="@attr/hvacMinText"/>
-    <item target="attr/hvacMaxText" value="@attr/hvacMaxText"/>
-    <!-- start the intent as a broad cast instead of an activity if true-->
-    <item target="attr/broadcast" value="@attr/broadcast"/>
-
-    <item target="color/car_nav_icon_fill_color" value="@color/car_nav_icon_fill_color" />
-
-    <item target="drawable/car_ic_overview" value="@drawable/car_ic_overview" />
-    <item target="drawable/car_ic_home" value="@drawable/car_ic_home" />
-    <item target="drawable/car_ic_hvac" value="@drawable/car_ic_hvac" />
-    <item target="drawable/car_ic_apps" value="@drawable/car_ic_apps" />
-    <item target="drawable/car_ic_music" value="@drawable/car_ic_music" />
-    <item target="drawable/car_ic_notification" value="@drawable/car_ic_notification" />
-    <item target="drawable/car_ic_phone" value="@drawable/car_ic_phone" />
-    <item target="drawable/car_ic_navigation" value="@drawable/car_ic_navigation" />
-
-    <item target="dimen/car_left_navigation_bar_width" value="@dimen/car_left_navigation_bar_width" />
-    <item target="dimen/car_keyline_1" value="@dimen/car_keyline_1" />
-    <item target="dimen/system_bar_button_group_padding" value="@dimen/system_bar_button_group_padding" />
-    <item target="dimen/system_bar_icon_drawing_size" value="@dimen/system_bar_icon_drawing_size" />
-
-    <item target="integer/config_topSystemBarType" value="@integer/config_topSystemBarType"/>
-    <item target="integer/config_leftSystemBarType" value="@integer/config_leftSystemBarType"/>
-    <item target="integer/config_rightSystemBarType" value="@integer/config_rightSystemBarType"/>
-    <item target="integer/config_bottomSystemBarType" value="@integer/config_bottomSystemBarType"/>
-
-    <item target="integer/config_topSystemBarZOrder" value="@integer/config_topSystemBarZOrder"/>
-    <item target="integer/config_leftSystemBarZOrder" value="@integer/config_leftSystemBarZOrder"/>
-    <item target="integer/config_rightSystemBarZOrder" value="@integer/config_rightSystemBarZOrder"/>
-    <item target="integer/config_bottomSystemBarZOrder" value="@integer/config_bottomSystemBarZOrder"/>
-
-    <item target="string/config_notificationPanelViewMediator" value="@string/config_notificationPanelViewMediator"/>
-
-    <item target="style/NavigationBarButton" value="@style/NavigationBarButton"/>
-</overlay>
\ No newline at end of file
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarComponentBinder.java b/packages/CarSystemUI/src/com/android/systemui/CarComponentBinder.java
deleted file mode 100644
index d84b2f9..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/CarComponentBinder.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui;
-
-import com.android.systemui.dagger.DefaultActivityBinder;
-import com.android.systemui.dagger.DefaultBroadcastReceiverBinder;
-import com.android.systemui.dagger.DefaultServiceBinder;
-
-import dagger.Module;
-
-/**
- * Supply Activities, Services, and SystemUI Objects for CarSystemUI.
- */
-@Module(includes = {
-        DefaultActivityBinder.class,
-        DefaultBroadcastReceiverBinder.class,
-        DefaultServiceBinder.class})
-public class CarComponentBinder {
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarGlobalRootComponent.java b/packages/CarSystemUI/src/com/android/systemui/CarGlobalRootComponent.java
deleted file mode 100644
index b056dcf..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/CarGlobalRootComponent.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui;
-
-import com.android.systemui.dagger.GlobalModule;
-import com.android.systemui.dagger.GlobalRootComponent;
-import com.android.systemui.dagger.WMModule;
-import com.android.systemui.wmshell.CarWMComponent;
-
-import javax.inject.Singleton;
-
-import dagger.Component;
-
-/** Car subclass for GlobalRootComponent. */
-@Singleton
-@Component(
-        modules = {
-                GlobalModule.class,
-                CarSysUIComponentModule.class,
-                WMModule.class
-        })
-public interface CarGlobalRootComponent extends GlobalRootComponent {
-    /**
-     * Builder for a CarGlobalRootComponent.
-     */
-    @Component.Builder
-    interface Builder extends GlobalRootComponent.Builder {
-        CarGlobalRootComponent build();
-    }
-
-    /**
-     * Builder for a WMComponent.
-     */
-    @Override
-    CarWMComponent.Builder getWMComponentBuilder();
-
-    @Override
-    CarSysUIComponent.Builder getSysUIComponent();
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponent.java b/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponent.java
deleted file mode 100644
index 51855dc..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponent.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui;
-
-import com.android.systemui.dagger.DependencyProvider;
-import com.android.systemui.dagger.SysUIComponent;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.SystemUIModule;
-
-import dagger.Subcomponent;
-
-/**
- * Dagger Subcomponent for Core SysUI.
- */
-@SysUISingleton
-@Subcomponent(modules = {
-        CarComponentBinder.class,
-        DependencyProvider.class,
-        SystemUIModule.class,
-        CarSystemUIModule.class,
-        CarSystemUIBinder.class})
-public interface CarSysUIComponent extends SysUIComponent {
-
-    /**
-     * Builder for a CarSysUIComponent.
-     */
-    @Subcomponent.Builder
-    interface Builder extends SysUIComponent.Builder {
-        CarSysUIComponent build();
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java
deleted file mode 100644
index ec1240f..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui;
-
-import com.android.systemui.biometrics.AuthController;
-import com.android.systemui.car.navigationbar.CarNavigationBar;
-import com.android.systemui.car.notification.CarNotificationModule;
-import com.android.systemui.car.sideloaded.SideLoadedAppController;
-import com.android.systemui.car.voicerecognition.ConnectedDeviceVoiceRecognitionNotifier;
-import com.android.systemui.car.volume.VolumeUI;
-import com.android.systemui.car.window.OverlayWindowModule;
-import com.android.systemui.car.window.SystemUIOverlayWindowManager;
-import com.android.systemui.globalactions.GlobalActionsComponent;
-import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.keyguard.dagger.KeyguardModule;
-import com.android.systemui.power.PowerUI;
-import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.RecentsModule;
-import com.android.systemui.shortcut.ShortcutKeyDispatcher;
-import com.android.systemui.statusbar.dagger.StatusBarModule;
-import com.android.systemui.statusbar.notification.InstantAppNotifier;
-import com.android.systemui.statusbar.notification.dagger.NotificationsModule;
-import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.theme.ThemeOverlayController;
-import com.android.systemui.toast.ToastUI;
-import com.android.systemui.util.leak.GarbageMonitor;
-import com.android.systemui.wmshell.WMShell;
-
-import dagger.Binds;
-import dagger.Module;
-import dagger.multibindings.ClassKey;
-import dagger.multibindings.IntoMap;
-
-/** Binder for car specific {@link SystemUI} modules. */
-@Module(includes = {RecentsModule.class, StatusBarModule.class, NotificationsModule.class,
-        KeyguardModule.class, OverlayWindowModule.class, CarNotificationModule.class})
-public abstract class CarSystemUIBinder {
-    /** Inject into AuthController. */
-    @Binds
-    @IntoMap
-    @ClassKey(AuthController.class)
-    public abstract SystemUI bindAuthController(AuthController sysui);
-
-    /** Inject Car Navigation Bar. */
-    @Binds
-    @IntoMap
-    @ClassKey(CarNavigationBar.class)
-    public abstract SystemUI bindCarNavigationBar(CarNavigationBar sysui);
-
-    /** Inject into GarbageMonitor.Service. */
-    @Binds
-    @IntoMap
-    @ClassKey(GarbageMonitor.Service.class)
-    public abstract SystemUI bindGarbageMonitorService(GarbageMonitor.Service sysui);
-
-    /** Inject into GlobalActionsComponent. */
-    @Binds
-    @IntoMap
-    @ClassKey(GlobalActionsComponent.class)
-    public abstract SystemUI bindGlobalActionsComponent(GlobalActionsComponent sysui);
-
-    /** Inject into InstantAppNotifier. */
-    @Binds
-    @IntoMap
-    @ClassKey(InstantAppNotifier.class)
-    public abstract SystemUI bindInstantAppNotifier(InstantAppNotifier sysui);
-
-    /** Inject into KeyguardViewMediator. */
-    @Binds
-    @IntoMap
-    @ClassKey(KeyguardViewMediator.class)
-    public abstract SystemUI bindKeyguardViewMediator(KeyguardViewMediator sysui);
-
-    /** Inject into LatencyTests. */
-    @Binds
-    @IntoMap
-    @ClassKey(LatencyTester.class)
-    public abstract SystemUI bindLatencyTester(LatencyTester sysui);
-
-    /** Inject into PowerUI. */
-    @Binds
-    @IntoMap
-    @ClassKey(PowerUI.class)
-    public abstract SystemUI bindPowerUI(PowerUI sysui);
-
-    /** Inject into Recents. */
-    @Binds
-    @IntoMap
-    @ClassKey(Recents.class)
-    public abstract SystemUI bindRecents(Recents sysui);
-
-    /** Inject into ScreenDecorations. */
-    @Binds
-    @IntoMap
-    @ClassKey(ScreenDecorations.class)
-    public abstract SystemUI bindScreenDecorations(ScreenDecorations sysui);
-
-    /** Inject into ShortcutKeyDispatcher. */
-    @Binds
-    @IntoMap
-    @ClassKey(ShortcutKeyDispatcher.class)
-    public abstract SystemUI bindsShortcutKeyDispatcher(ShortcutKeyDispatcher sysui);
-
-    /** Inject into SizeCompatModeActivityController. */
-    @Binds
-    @IntoMap
-    @ClassKey(SizeCompatModeActivityController.class)
-    public abstract SystemUI bindsSizeCompatModeActivityController(
-            SizeCompatModeActivityController sysui);
-
-    /** Inject into SliceBroadcastRelayHandler. */
-    @Binds
-    @IntoMap
-    @ClassKey(SliceBroadcastRelayHandler.class)
-    public abstract SystemUI bindSliceBroadcastRelayHandler(SliceBroadcastRelayHandler sysui);
-
-    /** Inject into ThemeOverlayController. */
-    @Binds
-    @IntoMap
-    @ClassKey(ThemeOverlayController.class)
-    public abstract SystemUI bindThemeOverlayController(ThemeOverlayController sysui);
-
-    /** Inject into StatusBar. */
-    @Binds
-    @IntoMap
-    @ClassKey(StatusBar.class)
-    public abstract SystemUI bindsStatusBar(StatusBar sysui);
-
-    /** Inject into VolumeUI. */
-    @Binds
-    @IntoMap
-    @ClassKey(VolumeUI.class)
-    public abstract SystemUI bindVolumeUI(VolumeUI sysui);
-
-    /** Inject into ToastUI. */
-    @Binds
-    @IntoMap
-    @ClassKey(ToastUI.class)
-    public abstract SystemUI bindToastUI(ToastUI service);
-
-    /** Inject into ConnectedDeviceVoiceRecognitionNotifier. */
-    @Binds
-    @IntoMap
-    @ClassKey(ConnectedDeviceVoiceRecognitionNotifier.class)
-    public abstract SystemUI bindConnectedDeviceVoiceRecognitionNotifier(
-            ConnectedDeviceVoiceRecognitionNotifier sysui);
-
-    /** Inject into SystemUIOverlayWindowManager. */
-    @Binds
-    @IntoMap
-    @ClassKey(SystemUIOverlayWindowManager.class)
-    public abstract SystemUI bindSystemUIPrimaryWindowManager(SystemUIOverlayWindowManager sysui);
-
-    /** Inject into SideLoadedAppController. */
-    @Binds
-    @IntoMap
-    @ClassKey(SideLoadedAppController.class)
-    public abstract SystemUI bindSideLoadedAppController(SideLoadedAppController sysui);
-
-    /** Inject into WMShell. */
-    @Binds
-    @IntoMap
-    @ClassKey(WMShell.class)
-    public abstract SystemUI bindWMShell(WMShell sysui);
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java
deleted file mode 100644
index a65edc5..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.systemui;
-
-import android.content.Context;
-import android.content.res.Resources;
-
-import com.android.systemui.dagger.GlobalRootComponent;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Class factory to provide car specific SystemUI components.
- */
-public class CarSystemUIFactory extends SystemUIFactory {
-
-    @Override
-    protected GlobalRootComponent buildGlobalRootComponent(Context context) {
-        return DaggerCarGlobalRootComponent.builder()
-                .context(context)
-                .build();
-    }
-
-    @Override
-    public String[] getSystemUIServiceComponents(Resources resources) {
-        Set<String> names = new HashSet<>();
-
-        for (String s : super.getSystemUIServiceComponents(resources)) {
-            names.add(s);
-        }
-
-        for (String s : resources.getStringArray(R.array.config_systemUIServiceComponentsExclude)) {
-            names.remove(s);
-        }
-
-        for (String s : resources.getStringArray(R.array.config_systemUIServiceComponentsInclude)) {
-            names.add(s);
-        }
-
-        String[] finalNames = new String[names.size()];
-        names.toArray(finalNames);
-
-        return finalNames;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java
deleted file mode 100644
index 1d35bbb..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui;
-
-import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME;
-import static com.android.systemui.Dependency.LEAK_REPORT_EMAIL_NAME;
-
-import android.content.Context;
-import android.os.Handler;
-import android.os.PowerManager;
-
-import com.android.keyguard.KeyguardViewController;
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarDeviceProvisionedControllerImpl;
-import com.android.systemui.car.keyguard.CarKeyguardViewController;
-import com.android.systemui.car.notification.NotificationShadeWindowControllerImpl;
-import com.android.systemui.car.statusbar.DozeServiceHost;
-import com.android.systemui.car.volume.CarVolumeDialogComponent;
-import com.android.systemui.dagger.GlobalRootComponent;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Background;
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.demomode.DemoModeController;
-import com.android.systemui.dock.DockManager;
-import com.android.systemui.dock.DockManagerImpl;
-import com.android.systemui.doze.DozeHost;
-import com.android.systemui.plugins.qs.QSFactory;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.power.EnhancedEstimates;
-import com.android.systemui.power.EnhancedEstimatesImpl;
-import com.android.systemui.qs.dagger.QSModule;
-import com.android.systemui.qs.tileimpl.QSFactoryImpl;
-import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.RecentsImplementation;
-import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.NotificationLockscreenUserManager;
-import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl;
-import com.android.systemui.statusbar.NotificationShadeWindowController;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
-import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
-import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
-import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.phone.KeyguardEnvironmentImpl;
-import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.ShadeControllerImpl;
-import com.android.systemui.statusbar.policy.BatteryController;
-import com.android.systemui.statusbar.policy.BatteryControllerImpl;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-import com.android.systemui.statusbar.policy.DeviceProvisionedController;
-import com.android.systemui.statusbar.policy.HeadsUpManager;
-import com.android.systemui.volume.VolumeDialogComponent;
-
-import javax.inject.Named;
-
-import dagger.Binds;
-import dagger.Module;
-import dagger.Provides;
-
-@Module(
-        includes = {
-                QSModule.class
-        })
-abstract class CarSystemUIModule {
-
-    @SysUISingleton
-    @Provides
-    @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME)
-    static boolean provideAllowNotificationLongPress() {
-        return false;
-    }
-
-    @SysUISingleton
-    @Provides
-    static HeadsUpManagerPhone provideHeadsUpManagerPhone(
-            Context context,
-            StatusBarStateController statusBarStateController,
-            KeyguardBypassController bypassController,
-            GroupMembershipManager groupManager,
-            ConfigurationController configurationController) {
-        return new HeadsUpManagerPhone(context, statusBarStateController, bypassController,
-                groupManager, configurationController);
-    }
-
-    @SysUISingleton
-    @Provides
-    @Named(LEAK_REPORT_EMAIL_NAME)
-    static String provideLeakReportEmail() {
-        return "buganizer-system+181579@google.com";
-    }
-
-    @Provides
-    @SysUISingleton
-    static Recents provideRecents(Context context, RecentsImplementation recentsImplementation,
-            CommandQueue commandQueue) {
-        return new Recents(context, recentsImplementation, commandQueue);
-    }
-
-    @Binds
-    abstract HeadsUpManager bindHeadsUpManagerPhone(HeadsUpManagerPhone headsUpManagerPhone);
-
-    @Binds
-    abstract EnhancedEstimates bindEnhancedEstimates(EnhancedEstimatesImpl enhancedEstimates);
-
-    @Binds
-    abstract NotificationLockscreenUserManager bindNotificationLockscreenUserManager(
-            NotificationLockscreenUserManagerImpl notificationLockscreenUserManager);
-
-    @Provides
-    @SysUISingleton
-    static BatteryController provideBatteryController(Context context,
-            EnhancedEstimates enhancedEstimates, PowerManager powerManager,
-            BroadcastDispatcher broadcastDispatcher, DemoModeController demoModeController,
-            @Main Handler mainHandler,
-            @Background Handler bgHandler) {
-        BatteryController bC = new BatteryControllerImpl(context, enhancedEstimates, powerManager,
-                broadcastDispatcher, demoModeController, mainHandler, bgHandler);
-        bC.init();
-        return bC;
-    }
-
-    @Binds
-    @SysUISingleton
-    public abstract QSFactory bindQSFactory(QSFactoryImpl qsFactoryImpl);
-
-    @Binds
-    abstract DockManager bindDockManager(DockManagerImpl dockManager);
-
-    @Binds
-    abstract NotificationEntryManager.KeyguardEnvironment bindKeyguardEnvironment(
-            KeyguardEnvironmentImpl keyguardEnvironment);
-
-    @Binds
-    abstract ShadeController provideShadeController(ShadeControllerImpl shadeController);
-
-    @Binds
-    abstract GlobalRootComponent bindGlobalRootComponent(
-            CarGlobalRootComponent globalRootComponent);
-
-    @Binds
-    abstract VolumeDialogComponent bindVolumeDialogComponent(
-            CarVolumeDialogComponent carVolumeDialogComponent);
-
-    @Binds
-    abstract KeyguardViewController bindKeyguardViewController(
-            CarKeyguardViewController carKeyguardViewController);
-
-    @Binds
-    abstract NotificationShadeWindowController bindNotificationShadeController(
-            NotificationShadeWindowControllerImpl notificationPanelViewController);
-
-    @Binds
-    abstract DeviceProvisionedController bindDeviceProvisionedController(
-            CarDeviceProvisionedControllerImpl deviceProvisionedController);
-
-    @Binds
-    abstract CarDeviceProvisionedController bindCarDeviceProvisionedController(
-            CarDeviceProvisionedControllerImpl deviceProvisionedController);
-
-    @Binds
-    abstract DozeHost bindDozeHost(DozeServiceHost dozeServiceHost);
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/CarDeviceProvisionedController.java b/packages/CarSystemUI/src/com/android/systemui/car/CarDeviceProvisionedController.java
deleted file mode 100644
index 44e43fe..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/CarDeviceProvisionedController.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car;
-
-import com.android.systemui.statusbar.policy.DeviceProvisionedController;
-
-/**
- * This interface defines controller that monitors the status of SUW progress for each user in
- * addition to the functionality defined by {@link DeviceProvisionedController}.
- */
-public interface CarDeviceProvisionedController extends DeviceProvisionedController {
-    /**
-     * Returns {@code true} when SUW is in progress for the given user.
-     */
-    boolean isUserSetupInProgress(int user);
-
-    /**
-     * Returns {@code true} when SUW is in progress for the current user.
-     */
-    default boolean isCurrentUserSetupInProgress() {
-        return isUserSetupInProgress(getCurrentUser());
-    }
-
-    /**
-     * Returns {@code true} when the user is setup and not currently in SUW.
-     */
-    default boolean isCurrentUserFullySetup() {
-        return isCurrentUserSetup() && !isCurrentUserSetupInProgress();
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/CarDeviceProvisionedControllerImpl.java b/packages/CarSystemUI/src/com/android/systemui/car/CarDeviceProvisionedControllerImpl.java
deleted file mode 100644
index fef0324..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/CarDeviceProvisionedControllerImpl.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car;
-
-import android.annotation.NonNull;
-import android.app.ActivityManager;
-import android.car.settings.CarSettings;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Handler;
-
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.statusbar.policy.DeviceProvisionedControllerImpl;
-import com.android.systemui.util.settings.GlobalSettings;
-import com.android.systemui.util.settings.SecureSettings;
-
-import javax.inject.Inject;
-
-/**
- * A controller that monitors the status of SUW progress for each user in addition to the
- * functionality provided by {@link DeviceProvisionedControllerImpl}.
- */
-@SysUISingleton
-public class CarDeviceProvisionedControllerImpl extends DeviceProvisionedControllerImpl implements
-        CarDeviceProvisionedController {
-    private final Uri mUserSetupInProgressUri;
-    private final ContentObserver mCarSettingsObserver;
-    private final Handler mMainHandler;
-    private final SecureSettings mSecureSettings;
-
-    @Inject
-    public CarDeviceProvisionedControllerImpl(@Main Handler mainHandler,
-            BroadcastDispatcher broadcastDispatcher, GlobalSettings globalSetting,
-            SecureSettings secureSettings) {
-        super(mainHandler, broadcastDispatcher, globalSetting, secureSettings);
-        mMainHandler = mainHandler;
-        mSecureSettings = secureSettings;
-        mUserSetupInProgressUri = mSecureSettings.getUriFor(
-                CarSettings.Secure.KEY_SETUP_WIZARD_IN_PROGRESS);
-        mCarSettingsObserver = new ContentObserver(mMainHandler) {
-            @Override
-            public void onChange(boolean selfChange, Uri uri, int flags) {
-                if (mUserSetupInProgressUri.equals(uri)) {
-                    notifyUserSetupInProgressChanged();
-                }
-            }
-        };
-    }
-
-    @Override
-    public boolean isUserSetupInProgress(int user) {
-        return mSecureSettings.getIntForUser(
-                CarSettings.Secure.KEY_SETUP_WIZARD_IN_PROGRESS, /* def= */ 0, user) != 0;
-    }
-
-    @Override
-    public boolean isCurrentUserSetupInProgress() {
-        return isUserSetupInProgress(ActivityManager.getCurrentUser());
-    }
-
-    @Override
-    public void addCallback(@NonNull DeviceProvisionedListener listener) {
-        super.addCallback(listener);
-        if (listener instanceof CarDeviceProvisionedListener) {
-            ((CarDeviceProvisionedListener) listener).onUserSetupInProgressChanged();
-        }
-    }
-
-    @Override
-    protected void startListening(int user) {
-        mSecureSettings.registerContentObserverForUser(
-                mUserSetupInProgressUri, /* notifyForDescendants= */ true,
-                mCarSettingsObserver, user);
-        // The SUW Flag observer is registered before super.startListening() so that the observer is
-        // in place before DeviceProvisionedController starts to track user switches which avoids
-        // an edge case where our observer gets registered twice.
-        super.startListening(user);
-    }
-
-    @Override
-    protected void stopListening() {
-        super.stopListening();
-        mSecureSettings.unregisterContentObserver(mCarSettingsObserver);
-    }
-
-    @Override
-    public void onUserSwitched(int newUserId) {
-        super.onUserSwitched(newUserId);
-        mSecureSettings.unregisterContentObserver(mCarSettingsObserver);
-        mSecureSettings.registerContentObserverForUser(
-                mUserSetupInProgressUri, /* notifyForDescendants= */ true,
-                mCarSettingsObserver, newUserId);
-    }
-
-    private void notifyUserSetupInProgressChanged() {
-        for (int i = mListeners.size() - 1; i >= 0; --i) {
-            DeviceProvisionedListener listener = mListeners.get(i);
-            if (listener instanceof CarDeviceProvisionedListener) {
-                ((CarDeviceProvisionedListener) listener).onUserSetupInProgressChanged();
-            }
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/CarDeviceProvisionedListener.java b/packages/CarSystemUI/src/com/android/systemui/car/CarDeviceProvisionedListener.java
deleted file mode 100644
index 0086322..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/CarDeviceProvisionedListener.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car;
-
-import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
-
-/**
- * A listener that listens for changes in SUW progress for a user in addition to the
- * functionality defined by {@link DeviceProvisionedListener}.
- */
-public interface CarDeviceProvisionedListener extends DeviceProvisionedListener {
-    @Override
-    default void onUserSwitched() {
-        onUserSetupChanged();
-        onUserSetupInProgressChanged();
-    }
-    /**
-     * A callback for when a change occurs in SUW progress for a user.
-     */
-    default void onUserSetupInProgressChanged() {
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/CarServiceProvider.java b/packages/CarSystemUI/src/com/android/systemui/car/CarServiceProvider.java
deleted file mode 100644
index 5778d66..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/CarServiceProvider.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car;
-
-import android.car.Car;
-import android.content.Context;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.systemui.dagger.SysUISingleton;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.inject.Inject;
-
-/** Provides a common connection to the car service that can be shared. */
-@SysUISingleton
-public class CarServiceProvider {
-
-    private final Context mContext;
-    private final List<CarServiceOnConnectedListener> mListeners = new ArrayList<>();
-    private Car mCar;
-
-    @Inject
-    public CarServiceProvider(Context context) {
-        mContext = context;
-        mCar = Car.createCar(mContext, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT,
-                (car, ready) -> {
-                    mCar = car;
-
-                    synchronized (mListeners) {
-                        for (CarServiceOnConnectedListener listener : mListeners) {
-                            if (ready) {
-                                listener.onConnected(mCar);
-                            }
-                        }
-                    }
-                });
-    }
-
-    @VisibleForTesting
-    public CarServiceProvider(Context context, Car car) {
-        mContext = context;
-        mCar = car;
-    }
-
-    /**
-     * Let's other components hook into the connection to the car service. If we're already
-     * connected to the car service, the callback is immediately triggered.
-     */
-    public void addListener(CarServiceOnConnectedListener listener) {
-        if (mCar.isConnected()) {
-            listener.onConnected(mCar);
-        }
-        mListeners.add(listener);
-    }
-
-    /**
-     * Listener which is triggered when Car Service is connected.
-     */
-    public interface CarServiceOnConnectedListener {
-        /** This will be called when the car service has successfully been connected. */
-        void onConnected(Car car);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/CarSystemUiTest.java b/packages/CarSystemUI/src/com/android/systemui/car/CarSystemUiTest.java
deleted file mode 100644
index 5f593b0..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/CarSystemUiTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotates that a test class should be run as part of CarSystemUI presubmit
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-@Documented
-public @interface CarSystemUiTest {
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/bluetooth/CarBatteryController.java b/packages/CarSystemUI/src/com/android/systemui/car/bluetooth/CarBatteryController.java
deleted file mode 100644
index 9b5e2712..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/bluetooth/CarBatteryController.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.bluetooth;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadsetClient;
-import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothProfile.ServiceListener;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.util.Log;
-
-import com.android.systemui.statusbar.policy.BatteryController;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-
-/**
- * A {@link BatteryController} that is specific to the Auto use-case. For Auto, the battery icon
- * displays the battery status of a device that is connected via bluetooth and not the system's
- * battery.
- */
-public class CarBatteryController extends BroadcastReceiver implements BatteryController {
-    private static final String TAG = "CarBatteryController";
-
-    // According to the Bluetooth HFP 1.5 specification, battery levels are indicated by a
-    // value from 1-5, where these values represent the following:
-    // 0%% - 0, 1-25%% - 1, 26-50%% - 2, 51-75%% - 3, 76-99%% - 4, 100%% - 5
-    // As a result, set the level as the average within that range.
-    private static final int BATTERY_LEVEL_EMPTY = 0;
-    private static final int BATTERY_LEVEL_1 = 12;
-    private static final int BATTERY_LEVEL_2 = 28;
-    private static final int BATTERY_LEVEL_3 = 63;
-    private static final int BATTERY_LEVEL_4 = 87;
-    private static final int BATTERY_LEVEL_FULL = 100;
-
-    private static final int INVALID_BATTERY_LEVEL = -1;
-
-    private final Context mContext;
-
-    private final BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();
-    private final ArrayList<BatteryStateChangeCallback> mChangeCallbacks = new ArrayList<>();
-    private BluetoothHeadsetClient mBluetoothHeadsetClient;
-    private final ServiceListener mHfpServiceListener = new ServiceListener() {
-        @Override
-        public void onServiceConnected(int profile, BluetoothProfile proxy) {
-            if (profile == BluetoothProfile.HEADSET_CLIENT) {
-                mBluetoothHeadsetClient = (BluetoothHeadsetClient) proxy;
-            }
-        }
-
-        @Override
-        public void onServiceDisconnected(int profile) {
-            if (profile == BluetoothProfile.HEADSET_CLIENT) {
-                mBluetoothHeadsetClient = null;
-            }
-        }
-    };
-    private int mLevel;
-    private BatteryViewHandler mBatteryViewHandler;
-
-    public CarBatteryController(Context context) {
-        mContext = context;
-
-        if (mAdapter == null) {
-            return;
-        }
-
-        mAdapter.getProfileProxy(context.getApplicationContext(), mHfpServiceListener,
-                BluetoothProfile.HEADSET_CLIENT);
-    }
-
-    @Override
-    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        pw.println("CarBatteryController state:");
-        pw.print("    mLevel=");
-        pw.println(mLevel);
-    }
-
-    @Override
-    public void setPowerSaveMode(boolean powerSave) {
-        // No-op. No power save mode for the car.
-    }
-
-    @Override
-    public void addCallback(BatteryController.BatteryStateChangeCallback cb) {
-        mChangeCallbacks.add(cb);
-
-        // There is no way to know if the phone is plugged in or charging via bluetooth, so pass
-        // false for these values.
-        cb.onBatteryLevelChanged(mLevel, false /* pluggedIn */, false /* charging */);
-        cb.onPowerSaveChanged(false /* isPowerSave */);
-    }
-
-    @Override
-    public void removeCallback(BatteryController.BatteryStateChangeCallback cb) {
-        mChangeCallbacks.remove(cb);
-    }
-
-    /** Sets {@link BatteryViewHandler}. */
-    public void addBatteryViewHandler(BatteryViewHandler batteryViewHandler) {
-        mBatteryViewHandler = batteryViewHandler;
-    }
-
-    /** Starts listening for bluetooth broadcast messages. */
-    public void startListening() {
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED);
-        filter.addAction(BluetoothHeadsetClient.ACTION_AG_EVENT);
-        mContext.registerReceiver(this, filter);
-    }
-
-    /** Stops listening for bluetooth broadcast messages. */
-    public void stopListening() {
-        mContext.unregisterReceiver(this);
-    }
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        String action = intent.getAction();
-
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "onReceive(). action: " + action);
-        }
-
-        if (BluetoothHeadsetClient.ACTION_AG_EVENT.equals(action)) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Received ACTION_AG_EVENT");
-            }
-
-            int batteryLevel = intent.getIntExtra(BluetoothHeadsetClient.EXTRA_BATTERY_LEVEL,
-                    INVALID_BATTERY_LEVEL);
-
-            updateBatteryLevel(batteryLevel);
-
-            if (batteryLevel != INVALID_BATTERY_LEVEL && mBatteryViewHandler != null) {
-                mBatteryViewHandler.showBatteryView();
-            }
-        } else if (BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
-            int newState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                int oldState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, -1);
-                Log.d(TAG, "ACTION_CONNECTION_STATE_CHANGED event: "
-                        + oldState + " -> " + newState);
-
-            }
-            BluetoothDevice device =
-                    (BluetoothDevice) intent.getExtra(BluetoothDevice.EXTRA_DEVICE);
-            updateBatteryIcon(device, newState);
-        }
-    }
-
-    /**
-     * Converts the battery level to a percentage that can be displayed on-screen and notifies
-     * any {@link BatteryStateChangeCallback}s of this.
-     */
-    private void updateBatteryLevel(int batteryLevel) {
-        if (batteryLevel == INVALID_BATTERY_LEVEL) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Battery level invalid. Ignoring.");
-            }
-            return;
-        }
-
-        // The battery level is a value between 0-5. Let the default battery level be 0.
-        switch (batteryLevel) {
-            case 5:
-                mLevel = BATTERY_LEVEL_FULL;
-                break;
-            case 4:
-                mLevel = BATTERY_LEVEL_4;
-                break;
-            case 3:
-                mLevel = BATTERY_LEVEL_3;
-                break;
-            case 2:
-                mLevel = BATTERY_LEVEL_2;
-                break;
-            case 1:
-                mLevel = BATTERY_LEVEL_1;
-                break;
-            case 0:
-            default:
-                mLevel = BATTERY_LEVEL_EMPTY;
-        }
-
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Battery level: " + batteryLevel + "; setting mLevel as: " + mLevel);
-        }
-
-        notifyBatteryLevelChanged();
-    }
-
-    /**
-     * Updates the display of the battery icon depending on the given connection state from the
-     * given {@link BluetoothDevice}.
-     */
-    private void updateBatteryIcon(BluetoothDevice device, int newState) {
-        if (newState == BluetoothProfile.STATE_CONNECTED) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Device connected");
-            }
-
-            if (mBatteryViewHandler != null) {
-                mBatteryViewHandler.showBatteryView();
-            }
-
-            if (mBluetoothHeadsetClient == null || device == null) {
-                return;
-            }
-
-            // Check if battery information is available and immediately update.
-            Bundle featuresBundle = mBluetoothHeadsetClient.getCurrentAgEvents(device);
-            if (featuresBundle == null) {
-                return;
-            }
-
-            int batteryLevel = featuresBundle.getInt(BluetoothHeadsetClient.EXTRA_BATTERY_LEVEL,
-                    INVALID_BATTERY_LEVEL);
-            updateBatteryLevel(batteryLevel);
-        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Device disconnected");
-            }
-
-            if (mBatteryViewHandler != null) {
-                mBatteryViewHandler.hideBatteryView();
-            }
-        }
-    }
-
-    @Override
-    public void dispatchDemoCommand(String command, Bundle args) {
-        // TODO: Car demo mode.
-    }
-
-    @Override
-    public boolean isPluggedIn() {
-        return true;
-    }
-
-    @Override
-    public boolean isPowerSave() {
-        // Power save is not valid for the car, so always return false.
-        return false;
-    }
-
-    @Override
-    public boolean isAodPowerSave() {
-        return false;
-    }
-
-    private void notifyBatteryLevelChanged() {
-        for (int i = 0, size = mChangeCallbacks.size(); i < size; i++) {
-            mChangeCallbacks.get(i)
-                    .onBatteryLevelChanged(mLevel, false /* pluggedIn */, false /* charging */);
-        }
-    }
-
-    /**
-     * An interface indicating the container of a View that will display what the information
-     * in the {@link CarBatteryController}.
-     */
-    public interface BatteryViewHandler {
-        /** Hides the battery view. */
-        void hideBatteryView();
-
-        /** Shows the battery view. */
-        void showBatteryView();
-    }
-
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/bluetooth/ConnectedDeviceSignalController.java b/packages/CarSystemUI/src/com/android/systemui/car/bluetooth/ConnectedDeviceSignalController.java
deleted file mode 100644
index 4642868..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/bluetooth/ConnectedDeviceSignalController.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.bluetooth;
-
-import static com.android.systemui.statusbar.phone.StatusBar.DEBUG;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadsetClient;
-import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothProfile.ServiceListener;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.telephony.SignalStrength;
-import android.util.Log;
-import android.util.TypedValue;
-import android.view.View;
-import android.widget.ImageView;
-
-import com.android.settingslib.graph.SignalDrawable;
-import com.android.systemui.Dependency;
-import com.android.systemui.R;
-import com.android.systemui.statusbar.ScalingDrawableWrapper;
-import com.android.systemui.statusbar.policy.BluetoothController;
-
-/**
- * Controller that monitors signal strength for a device that is connected via bluetooth.
- */
-public class ConnectedDeviceSignalController extends BroadcastReceiver implements
-        BluetoothController.Callback {
-    private static final String TAG = "DeviceSignalCtlr";
-
-    /**
-     * The value that indicates if a network is unavailable. This value is according ot the
-     * Bluetooth HFP 1.5 spec, which indicates this value is one of two: 0 or 1. These stand
-     * for network unavailable and available respectively.
-     */
-    private static final int NETWORK_UNAVAILABLE = 0;
-    private static final int NETWORK_UNAVAILABLE_ICON_ID = R.drawable.stat_sys_signal_null;
-
-    /**
-     * All possible signal strength icons. According to the Bluetooth HFP 1.5 specification,
-     * signal strength is indicated by a value from 1-5, where these values represent the following:
-     *
-     * <p>0%% - 0, 1-25%% - 1, 26-50%% - 2, 51-75%% - 3, 76-99%% - 4, 100%% - 5
-     *
-     * <p>As a result, these are treated as an index into this array for the corresponding icon.
-     * Note that the icon is the same for 0 and 1.
-     */
-    private static final int[] SIGNAL_STRENGTH_ICONS = {
-            0,
-            0,
-            1,
-            2,
-            3,
-            4,
-    };
-
-    private static final int INVALID_SIGNAL = -1;
-
-    private final BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();
-    private final Context mContext;
-    private final BluetoothController mController;
-
-    private final View mSignalsView;
-    private final ImageView mNetworkSignalView;
-
-    private final float mIconScaleFactor;
-    private final SignalDrawable mSignalDrawable;
-
-    private BluetoothHeadsetClient mBluetoothHeadsetClient;
-    private final ServiceListener mHfpServiceListener = new ServiceListener() {
-        @Override
-        public void onServiceConnected(int profile, BluetoothProfile proxy) {
-            if (profile == BluetoothProfile.HEADSET_CLIENT) {
-                mBluetoothHeadsetClient = (BluetoothHeadsetClient) proxy;
-            }
-        }
-
-        @Override
-        public void onServiceDisconnected(int profile) {
-            if (profile == BluetoothProfile.HEADSET_CLIENT) {
-                mBluetoothHeadsetClient = null;
-            }
-        }
-    };
-
-    public ConnectedDeviceSignalController(Context context, View signalsView) {
-        mContext = context;
-        mController = Dependency.get(BluetoothController.class);
-
-        mSignalsView = signalsView;
-        mNetworkSignalView = (ImageView)
-                mSignalsView.findViewById(R.id.connected_device_network_signal);
-
-        TypedValue typedValue = new TypedValue();
-        context.getResources().getValue(R.dimen.status_bar_icon_scale_factor, typedValue, true);
-        mIconScaleFactor = typedValue.getFloat();
-        mSignalDrawable = new SignalDrawable(mNetworkSignalView.getContext());
-        mNetworkSignalView.setImageDrawable(
-                new ScalingDrawableWrapper(mSignalDrawable, mIconScaleFactor));
-
-        if (mAdapter == null) {
-            return;
-        }
-
-        mAdapter.getProfileProxy(context.getApplicationContext(), mHfpServiceListener,
-                BluetoothProfile.HEADSET_CLIENT);
-    }
-
-    /** Starts listening for bluetooth broadcast messages. */
-    public void startListening() {
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED);
-        filter.addAction(BluetoothHeadsetClient.ACTION_AG_EVENT);
-        mContext.registerReceiver(this, filter);
-
-        mController.addCallback(this);
-    }
-
-    /** Stops listening for bluetooth broadcast messages. */
-    public void stopListening() {
-        mContext.unregisterReceiver(this);
-        mController.removeCallback(this);
-    }
-
-    @Override
-    public void onBluetoothDevicesChanged() {
-        // Nothing to do here because this Controller is not displaying a list of possible
-        // bluetooth devices.
-    }
-
-    @Override
-    public void onBluetoothStateChange(boolean enabled) {
-        if (DEBUG) {
-            Log.d(TAG, "onBluetoothStateChange(). enabled: " + enabled);
-        }
-
-        // Only need to handle the case if bluetooth has been disabled, in which case the
-        // signal indicators are hidden. If bluetooth has been enabled, then this class should
-        // receive updates to the connection state via onReceive().
-        if (!enabled) {
-            mNetworkSignalView.setVisibility(View.GONE);
-            mSignalsView.setVisibility(View.GONE);
-        }
-    }
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        String action = intent.getAction();
-
-        if (DEBUG) {
-            Log.d(TAG, "onReceive(). action: " + action);
-        }
-
-        if (BluetoothHeadsetClient.ACTION_AG_EVENT.equals(action)) {
-            if (DEBUG) {
-                Log.d(TAG, "Received ACTION_AG_EVENT");
-            }
-
-            processActionAgEvent(intent);
-        } else if (BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
-            int newState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
-
-            if (DEBUG) {
-                int oldState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, -1);
-                Log.d(TAG, "ACTION_CONNECTION_STATE_CHANGED event: "
-                        + oldState + " -> " + newState);
-            }
-            BluetoothDevice device =
-                    (BluetoothDevice) intent.getExtra(BluetoothDevice.EXTRA_DEVICE);
-            updateViewVisibility(device, newState);
-        }
-    }
-
-    /**
-     * Processes an {@link Intent} that had an action of
-     * {@link BluetoothHeadsetClient#ACTION_AG_EVENT}.
-     */
-    private void processActionAgEvent(Intent intent) {
-        int networkStatus = intent.getIntExtra(BluetoothHeadsetClient.EXTRA_NETWORK_STATUS,
-                INVALID_SIGNAL);
-        if (networkStatus != INVALID_SIGNAL) {
-            if (DEBUG) {
-                Log.d(TAG, "EXTRA_NETWORK_STATUS: " + " " + networkStatus);
-            }
-
-            if (networkStatus == NETWORK_UNAVAILABLE) {
-                setNetworkSignalIcon(NETWORK_UNAVAILABLE_ICON_ID);
-            }
-        }
-
-        int signalStrength = intent.getIntExtra(
-                BluetoothHeadsetClient.EXTRA_NETWORK_SIGNAL_STRENGTH, INVALID_SIGNAL);
-        if (signalStrength != INVALID_SIGNAL) {
-            if (DEBUG) {
-                Log.d(TAG, "EXTRA_NETWORK_SIGNAL_STRENGTH: " + signalStrength);
-            }
-
-            setNetworkSignalIcon(SIGNAL_STRENGTH_ICONS[signalStrength]);
-        }
-
-        int roamingStatus = intent.getIntExtra(BluetoothHeadsetClient.EXTRA_NETWORK_ROAMING,
-                INVALID_SIGNAL);
-        if (roamingStatus != INVALID_SIGNAL) {
-            if (DEBUG) {
-                Log.d(TAG, "EXTRA_NETWORK_ROAMING: " + roamingStatus);
-            }
-        }
-    }
-
-    private void setNetworkSignalIcon(int level) {
-        // Setting the icon on a child view of mSignalView, so toggle this container visible.
-        mSignalsView.setVisibility(View.VISIBLE);
-
-        mSignalDrawable.setLevel(SignalDrawable.getState(level,
-                SignalStrength.NUM_SIGNAL_STRENGTH_BINS, false));
-        mNetworkSignalView.setVisibility(View.VISIBLE);
-    }
-
-    private void updateViewVisibility(BluetoothDevice device, int newState) {
-        if (newState == BluetoothProfile.STATE_CONNECTED) {
-            if (DEBUG) {
-                Log.d(TAG, "Device connected");
-            }
-
-            if (mBluetoothHeadsetClient == null || device == null) {
-                return;
-            }
-
-            // Check if battery information is available and immediately update.
-            Bundle featuresBundle = mBluetoothHeadsetClient.getCurrentAgEvents(device);
-            if (featuresBundle == null) {
-                return;
-            }
-
-            int signalStrength = featuresBundle.getInt(
-                    BluetoothHeadsetClient.EXTRA_NETWORK_SIGNAL_STRENGTH, INVALID_SIGNAL);
-            if (signalStrength != INVALID_SIGNAL) {
-                if (DEBUG) {
-                    Log.d(TAG, "EXTRA_NETWORK_SIGNAL_STRENGTH: " + signalStrength);
-                }
-
-                setNetworkSignalIcon(SIGNAL_STRENGTH_ICONS[signalStrength]);
-            }
-        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
-            if (DEBUG) {
-                Log.d(TAG, "Device disconnected");
-            }
-
-            mNetworkSignalView.setVisibility(View.GONE);
-            mSignalsView.setVisibility(View.GONE);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/AdjustableTemperatureView.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/AdjustableTemperatureView.java
deleted file mode 100644
index af2a1d3..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/hvac/AdjustableTemperatureView.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.hvac;
-
-import static com.android.systemui.car.hvac.HvacController.convertToCelsius;
-import static com.android.systemui.car.hvac.HvacController.convertToFahrenheit;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.systemui.R;
-
-/**
- * Displays temperature with a button to decrease and a button to increase on either side.
- * Properties configured in the XML:
- * hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
- */
-public class AdjustableTemperatureView extends LinearLayout implements TemperatureView {
-
-    private final int mAreaId;
-    private TextView mTempTextView;
-    private float mMinTempC;
-    private float mMaxTempC;
-    private String mTempFormat;
-    private String mNullTempText;
-    private String mMinTempText;
-    private String mMaxTempText;
-    private boolean mDisplayInFahrenheit = false;
-
-    private HvacController mHvacController;
-    private float mCurrentTempC;
-
-    public AdjustableTemperatureView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TemperatureView);
-        mAreaId = typedArray.getInt(R.styleable.TemperatureView_hvacAreaId, -1);
-    }
-
-    @Override
-    public void onFinishInflate() {
-        super.onFinishInflate();
-        LayoutInflater.from(getContext()).inflate(R.layout.adjustable_temperature_view,
-                /* root= */ this);
-        mTempFormat = getResources().getString(R.string.hvac_temperature_format);
-        mMinTempC = getResources().getFloat(R.dimen.hvac_min_value_celsius);
-        mMaxTempC = getResources().getFloat(R.dimen.hvac_max_value_celsius);
-        mNullTempText = getResources().getString(R.string.hvac_null_temp_text);
-        mMinTempText = getResources().getString(R.string.hvac_min_text);
-        mMaxTempText = getResources().getString(R.string.hvac_max_text);
-        initializeButtons();
-    }
-
-    @Override
-    public void setHvacController(HvacController controller) {
-        mHvacController = controller;
-    }
-
-    @Override
-    public void setTemp(float tempC) {
-        if (mTempTextView == null) {
-            mTempTextView = findViewById(R.id.hvac_temperature_text);
-        }
-        if (Float.isNaN(tempC)) {
-            mTempTextView.setText(mNullTempText);
-            return;
-        }
-        if (tempC <= mMinTempC) {
-            mTempTextView.setText(mMinTempText);
-            mCurrentTempC = mMinTempC;
-            return;
-        }
-        if (tempC >= mMaxTempC) {
-            mTempTextView.setText(mMaxTempText);
-            mCurrentTempC = mMaxTempC;
-            return;
-        }
-        mTempTextView.setText(String.format(mTempFormat,
-                mDisplayInFahrenheit ? convertToFahrenheit(tempC) : tempC));
-        mCurrentTempC = tempC;
-    }
-
-    @Override
-    public void setDisplayInFahrenheit(boolean displayFahrenheit) {
-        mDisplayInFahrenheit = displayFahrenheit;
-        setTemp(mCurrentTempC);
-    }
-
-    @Override
-    public int getAreaId() {
-        return mAreaId;
-    }
-
-    private void initializeButtons() {
-        findViewById(R.id.hvac_decrease_button).setOnClickListener(v -> {
-            float newTemp = mDisplayInFahrenheit ? convertToCelsius(
-                    convertToFahrenheit(mCurrentTempC) - 1) : (mCurrentTempC - 1);
-            setTemperature(newTemp, mAreaId);
-        });
-
-        findViewById(R.id.hvac_increase_button).setOnClickListener(v -> {
-            float newTemp = mDisplayInFahrenheit ? convertToCelsius(
-                    convertToFahrenheit(mCurrentTempC) + 1) : (mCurrentTempC + 1);
-            setTemperature(newTemp, mAreaId);
-        });
-    }
-
-    private void setTemperature(float tempC, int zone) {
-        if (tempC < mMaxTempC && tempC > mMinTempC && mHvacController != null) {
-            mHvacController.setTemperature(tempC, zone);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/AnimatedTemperatureView.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/AnimatedTemperatureView.java
deleted file mode 100644
index b98b680..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/hvac/AnimatedTemperatureView.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.hvac;
-
-import static com.android.systemui.car.hvac.HvacController.convertToFahrenheit;
-
-import android.animation.ObjectAnimator;
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Color;
-import android.graphics.Rect;
-import android.graphics.drawable.ColorDrawable;
-import android.util.AttributeSet;
-import android.util.Property;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.TextSwitcher;
-import android.widget.TextView;
-
-import com.android.systemui.R;
-
-/**
- * Simple text display of HVAC properties, It is designed to show mTemperature and is configured in
- * the XML.
- * XML properties:
- * hvacAreaId - Example: VehicleAreaSeat.SEAT_ROW_1_LEFT (1)
- * hvacOrientaion = Example: left
- */
-public class AnimatedTemperatureView extends FrameLayout implements TemperatureView {
-
-    private static final float TEMPERATURE_EQUIVALENT_DELTA = .01f;
-    private static final Property<ColorDrawable, Integer> COLOR_PROPERTY =
-            new Property<ColorDrawable, Integer>(Integer.class, "color") {
-
-                @Override
-                public Integer get(ColorDrawable object) {
-                    return object.getColor();
-                }
-
-                @Override
-                public void set(ColorDrawable object, Integer value) {
-                    object.setColor(value);
-                }
-            };
-
-    static boolean isHorizontal(int gravity) {
-        return Gravity.isHorizontal(gravity)
-                && (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) != Gravity.CENTER_HORIZONTAL;
-    }
-
-    @SuppressLint("RtlHardcoded")
-    static boolean isLeft(int gravity, int layoutDirection) {
-        return Gravity
-                .getAbsoluteGravity(gravity & Gravity.HORIZONTAL_GRAVITY_MASK, layoutDirection)
-                == Gravity.LEFT;
-    }
-
-    static boolean isVertical(int gravity) {
-        return Gravity.isVertical(gravity)
-                && (gravity & Gravity.VERTICAL_GRAVITY_MASK) != Gravity.CENTER_VERTICAL;
-    }
-
-    static boolean isTop(int gravity) {
-        return (gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.TOP;
-    }
-
-    private final int mAreaId;
-    private final int mPivotOffset;
-    private final int mGravity;
-    private final int mTextAppearanceRes;
-    private final int mMinEms;
-    private final Rect mPaddingRect;
-    private final float mMinValue;
-    private final float mMaxValue;
-
-    private final ColorDrawable mBackgroundColor;
-
-    private final TemperatureColorStore mColorStore = new TemperatureColorStore();
-    private final TemperatureBackgroundAnimator mBackgroundAnimator;
-    private final TemperatureTextAnimator mTextAnimator;
-    boolean mDisplayInFahrenheit = false;
-
-    private HvacController mHvacController;
-
-    public AnimatedTemperatureView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        TypedArray typedArray = context.obtainStyledAttributes(attrs,
-                R.styleable.AnimatedTemperatureView);
-        mAreaId = typedArray.getInt(R.styleable.AnimatedTemperatureView_hvacAreaId, -1);
-        mPivotOffset =
-                typedArray.getDimensionPixelOffset(
-                        R.styleable.AnimatedTemperatureView_hvacPivotOffset, 0);
-        mGravity = typedArray.getInt(R.styleable.AnimatedTemperatureView_android_gravity,
-                Gravity.START);
-        mTextAppearanceRes =
-                typedArray.getResourceId(R.styleable.AnimatedTemperatureView_android_textAppearance,
-                        0);
-        mMinEms = typedArray.getInteger(R.styleable.AnimatedTemperatureView_android_minEms, 0);
-        mMinValue = getResources().getFloat(R.dimen.hvac_min_value_celsius);
-        mMaxValue = getResources().getFloat(R.dimen.hvac_max_value_celsius);
-
-        mPaddingRect =
-                new Rect(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom());
-        setPadding(0, 0, 0, 0);
-
-        setClipChildren(false);
-        setClipToPadding(false);
-
-        // init Views
-        TextSwitcher textSwitcher = new TextSwitcher(context);
-        textSwitcher.setFactory(this::generateTextView);
-        ImageView background = new ImageView(context);
-        mBackgroundColor = new ColorDrawable(Color.TRANSPARENT);
-        background.setImageDrawable(mBackgroundColor);
-        background.setVisibility(View.GONE);
-
-        mBackgroundAnimator = new TemperatureBackgroundAnimator(this, background);
-
-        mTextAnimator = new TemperatureTextAnimator(this, textSwitcher,
-                getResources().getString(R.string.hvac_temperature_format), mPivotOffset,
-                getResources().getString(R.string.hvac_min_text),
-                getResources().getString(R.string.hvac_max_text));
-
-        addView(background, ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT);
-        addView(textSwitcher, ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT);
-
-        typedArray.recycle();
-    }
-
-
-    private TextView generateTextView() {
-        TextView textView = new TextView(getContext());
-        textView.setTextAppearance(mTextAppearanceRes);
-        textView.setAllCaps(true);
-        textView.setMinEms(mMinEms);
-        textView.setGravity(mGravity);
-        textView.setPadding(mPaddingRect.left, mPaddingRect.top, mPaddingRect.right,
-                mPaddingRect.bottom);
-        textView.getViewTreeObserver()
-                .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
-                    @Override
-                    public boolean onPreDraw() {
-                        if (isHorizontal(mGravity)) {
-                            if (isLeft(mGravity, getLayoutDirection())) {
-                                textView.setPivotX(-mPivotOffset);
-                            } else {
-                                textView.setPivotX(textView.getWidth() + mPivotOffset);
-                            }
-                        }
-                        textView.getViewTreeObserver().removeOnPreDrawListener(this);
-                        return true;
-                    }
-                });
-        textView.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT));
-
-        return textView;
-    }
-
-    @Override
-    public void setHvacController(HvacController controller) {
-        mHvacController = controller;
-    }
-
-    /**
-     * Formats the float for display
-     *
-     * @param temp - The current temp or NaN
-     */
-    @Override
-    public void setTemp(float temp) {
-        if (mDisplayInFahrenheit) {
-            temp = convertToFahrenheit(temp);
-        }
-        mTextAnimator.setTemp(temp);
-        if (Float.isNaN(temp)) {
-            mBackgroundAnimator.hideCircle();
-            return;
-        }
-        int color;
-        if (isMinValue(temp)) {
-            color = mColorStore.getMinColor();
-        } else if (isMaxValue(temp)) {
-            color = mColorStore.getMaxColor();
-        } else {
-            color = mColorStore.getColorForTemperature(temp);
-        }
-        if (mBackgroundAnimator.isOpen()) {
-            ObjectAnimator colorAnimator =
-                    ObjectAnimator.ofInt(mBackgroundColor, COLOR_PROPERTY, color);
-            colorAnimator.setEvaluator((fraction, startValue, endValue) -> mColorStore
-                    .lerpColor(fraction, (int) startValue, (int) endValue));
-            colorAnimator.start();
-        } else {
-            mBackgroundColor.setColor(color);
-        }
-
-        mBackgroundAnimator.animateOpen();
-    }
-
-    @Override
-    public void setDisplayInFahrenheit(boolean displayInFahrenheit) {
-        mDisplayInFahrenheit = displayInFahrenheit;
-    }
-
-    boolean isMinValue(float temp) {
-        return !Float.isNaN(mMinValue) && isApproxEqual(temp, mMinValue);
-    }
-
-    boolean isMaxValue(float temp) {
-        return !Float.isNaN(mMaxValue) && isApproxEqual(temp, mMaxValue);
-    }
-
-    private boolean isApproxEqual(float left, float right) {
-        return Math.abs(left - right) <= TEMPERATURE_EQUIVALENT_DELTA;
-    }
-
-    int getGravity() {
-        return mGravity;
-    }
-
-    int getPivotOffset() {
-        return mPivotOffset;
-    }
-
-    Rect getPaddingRect() {
-        return mPaddingRect;
-    }
-
-    /**
-     * @return hvac AreaId - Example: VehicleAreaSeat.SEAT_ROW_1_LEFT (1)
-     */
-    @Override
-    public int getAreaId() {
-        return mAreaId;
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        mBackgroundAnimator.stopAnimations();
-    }
-}
-
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/HvacController.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/HvacController.java
deleted file mode 100644
index 10a361c..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/hvac/HvacController.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.hvac;
-
-import static android.car.VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL;
-import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS;
-import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_SET;
-
-import android.car.Car;
-import android.car.VehicleUnit;
-import android.car.hardware.CarPropertyValue;
-import android.car.hardware.property.CarPropertyManager;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.UiBackground;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Executor;
-
-import javax.inject.Inject;
-
-/**
- * Manages the connection to the Car service and delegates value changes to the registered
- * {@link TemperatureView}s
- */
-@SysUISingleton
-public class HvacController {
-    public static final String TAG = "HvacController";
-    private static final boolean DEBUG = true;
-
-    private final Executor mBackgroundExecutor;
-    private final CarServiceProvider mCarServiceProvider;
-    private final Set<TemperatureView> mRegisteredViews = new HashSet<>();
-
-    private CarPropertyManager mCarPropertyManager;
-    private HashMap<Integer, List<TemperatureView>> mTempComponents = new HashMap<>();
-
-    private final CarPropertyManager.CarPropertyEventCallback mHvacTemperatureSetCallback =
-            new CarPropertyManager.CarPropertyEventCallback() {
-                @Override
-                public void onChangeEvent(CarPropertyValue value) {
-                    try {
-                        int areaId = value.getAreaId();
-                        List<TemperatureView> temperatureViews = mTempComponents.get(areaId);
-                        if (temperatureViews != null && !temperatureViews.isEmpty()) {
-                            float newTemp = (float) value.getValue();
-                            if (DEBUG) {
-                                Log.d(TAG, "onChangeEvent: " + areaId + ":" + value);
-                            }
-                            for (TemperatureView view : temperatureViews) {
-                                view.setTemp(newTemp);
-                            }
-                        }
-                    } catch (Exception e) {
-                        Log.e(TAG, "Failed handling hvac change event", e);
-                    }
-                }
-
-                @Override
-                public void onErrorEvent(int propId, int zone) {
-                    Log.d(TAG, "HVAC error event, propertyId: " + propId + " zone: " + zone);
-                }
-            };
-
-    private final CarPropertyManager.CarPropertyEventCallback mTemperatureUnitChangeCallback =
-            new CarPropertyManager.CarPropertyEventCallback() {
-                @Override
-                public void onChangeEvent(CarPropertyValue value) {
-                    if (!mRegisteredViews.isEmpty()) {
-                        for (TemperatureView view : mRegisteredViews) {
-                            view.setDisplayInFahrenheit(
-                                    value.getValue().equals(VehicleUnit.FAHRENHEIT));
-                        }
-                    }
-                }
-
-                @Override
-                public void onErrorEvent(int propId, int zone) {
-                    Log.d(TAG, "HVAC error event, propertyId: " + propId + " zone: " + zone);
-                }
-            };
-
-    private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceLifecycleListener =
-            car -> {
-                try {
-                    mCarPropertyManager = (CarPropertyManager) car.getCarManager(
-                            Car.PROPERTY_SERVICE);
-                    mCarPropertyManager.registerCallback(mHvacTemperatureSetCallback,
-                            HVAC_TEMPERATURE_SET, CarPropertyManager.SENSOR_RATE_ONCHANGE);
-                    mCarPropertyManager.registerCallback(mTemperatureUnitChangeCallback,
-                            HVAC_TEMPERATURE_DISPLAY_UNITS,
-                            CarPropertyManager.SENSOR_RATE_ONCHANGE);
-                    initComponents();
-                } catch (Exception e) {
-                    Log.e(TAG, "Failed to correctly connect to HVAC", e);
-                }
-            };
-
-    @Inject
-    public HvacController(CarServiceProvider carServiceProvider,
-            @UiBackground Executor backgroundExecutor) {
-        mCarServiceProvider = carServiceProvider;
-        mBackgroundExecutor = backgroundExecutor;
-    }
-
-    /**
-     * Create connection to the Car service.
-     */
-    public void connectToCarService() {
-        mCarServiceProvider.addListener(mCarServiceLifecycleListener);
-    }
-
-    /**
-     * Add component to list and initialize it if the connection is up.
-     */
-    private void addHvacTextView(TemperatureView temperatureView) {
-        if (mRegisteredViews.contains(temperatureView)) {
-            return;
-        }
-
-        int areaId = temperatureView.getAreaId();
-        if (!mTempComponents.containsKey(areaId)) {
-            mTempComponents.put(areaId, new ArrayList<>());
-        }
-        mTempComponents.get(areaId).add(temperatureView);
-        initComponent(temperatureView);
-
-        mRegisteredViews.add(temperatureView);
-    }
-
-    private void initComponents() {
-        for (Map.Entry<Integer, List<TemperatureView>> next : mTempComponents.entrySet()) {
-            List<TemperatureView> temperatureViews = next.getValue();
-            for (TemperatureView view : temperatureViews) {
-                initComponent(view);
-            }
-        }
-    }
-
-    private void initComponent(TemperatureView view) {
-        int zone = view.getAreaId();
-        if (DEBUG) {
-            Log.d(TAG, "initComponent: " + zone);
-        }
-
-        try {
-            if (mCarPropertyManager != null && mCarPropertyManager.isPropertyAvailable(
-                    HVAC_TEMPERATURE_DISPLAY_UNITS, VEHICLE_AREA_TYPE_GLOBAL)) {
-                if (mCarPropertyManager.getIntProperty(HVAC_TEMPERATURE_DISPLAY_UNITS,
-                        VEHICLE_AREA_TYPE_GLOBAL) == VehicleUnit.FAHRENHEIT) {
-                    view.setDisplayInFahrenheit(true);
-                }
-            }
-            if (mCarPropertyManager == null || !mCarPropertyManager.isPropertyAvailable(
-                    HVAC_TEMPERATURE_SET, zone)) {
-                view.setTemp(Float.NaN);
-                return;
-            }
-            view.setTemp(
-                    mCarPropertyManager.getFloatProperty(HVAC_TEMPERATURE_SET, zone));
-            view.setHvacController(this);
-        } catch (Exception e) {
-            view.setTemp(Float.NaN);
-            Log.e(TAG, "Failed to get value from hvac service", e);
-        }
-    }
-
-    /**
-     * Removes all registered components. This is useful if you need to rebuild the UI since
-     * components self register.
-     */
-    public void removeAllComponents() {
-        mTempComponents.clear();
-        mRegisteredViews.clear();
-    }
-
-    /**
-     * Iterate through a view, looking for {@link TemperatureView} instances and add them to the
-     * controller if found.
-     */
-    public void addTemperatureViewToController(View v) {
-        if (v instanceof TemperatureView) {
-            addHvacTextView((TemperatureView) v);
-        } else if (v instanceof ViewGroup) {
-            ViewGroup viewGroup = (ViewGroup) v;
-            for (int i = 0; i < viewGroup.getChildCount(); i++) {
-                addTemperatureViewToController(viewGroup.getChildAt(i));
-            }
-        }
-    }
-
-    /**
-     * Set the temperature in Celsius of the specified zone
-     */
-    public void setTemperature(float tempC, int zone) {
-        if (mCarPropertyManager != null) {
-            // Internally, all temperatures are represented in floating point Celsius
-            mBackgroundExecutor.execute(
-                    () -> mCarPropertyManager.setFloatProperty(HVAC_TEMPERATURE_SET, zone, tempC));
-        }
-    }
-
-    /**
-     * Convert the given temperature in Celsius into Fahrenheit
-     *
-     * @param tempC - The temperature in Celsius
-     * @return Temperature in Fahrenheit.
-     */
-    public static float convertToFahrenheit(float tempC) {
-        return (tempC * 9f / 5f) + 32;
-    }
-
-    /**
-     * Convert the given temperature in Fahrenheit to Celsius
-     *
-     * @param tempF - The temperature in Fahrenheit.
-     * @return Temperature in Celsius.
-     */
-    public static float convertToCelsius(float tempF) {
-        return (tempF - 32) * 5f / 9f;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureBackgroundAnimator.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureBackgroundAnimator.java
deleted file mode 100644
index a4c4573..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureBackgroundAnimator.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.hvac;
-
-import static com.android.systemui.car.hvac.AnimatedTemperatureView.isHorizontal;
-import static com.android.systemui.car.hvac.AnimatedTemperatureView.isLeft;
-import static com.android.systemui.car.hvac.AnimatedTemperatureView.isTop;
-import static com.android.systemui.car.hvac.AnimatedTemperatureView.isVertical;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.annotation.IntDef;
-import android.graphics.Rect;
-import android.view.View;
-import android.view.ViewAnimationUtils;
-import android.view.animation.AnticipateInterpolator;
-import android.widget.ImageView;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Controls circular reveal animation of temperature background
- */
-class TemperatureBackgroundAnimator {
-
-    private static final AnticipateInterpolator ANTICIPATE_INTERPOLATOR =
-            new AnticipateInterpolator();
-    private static final float MAX_OPACITY = .6f;
-
-    private final View mAnimatedView;
-
-    private int mPivotX;
-    private int mPivotY;
-    private int mGoneRadius;
-    private int mOvershootRadius;
-    private int mRestingRadius;
-    private int mBumpRadius;
-
-    @CircleState
-    private int mCircleState;
-
-    private Animator mCircularReveal;
-    private boolean mAnimationsReady;
-
-    @IntDef({CircleState.GONE, CircleState.ENTERING, CircleState.OVERSHOT, CircleState.RESTING,
-            CircleState.RESTED, CircleState.BUMPING, CircleState.BUMPED, CircleState.EXITING})
-    private @interface CircleState {
-        int GONE = 0;
-        int ENTERING = 1;
-        int OVERSHOT = 2;
-        int RESTING = 3;
-        int RESTED = 4;
-        int BUMPING = 5;
-        int BUMPED = 6;
-        int EXITING = 7;
-    }
-
-    TemperatureBackgroundAnimator(
-            AnimatedTemperatureView parent,
-            ImageView animatedView) {
-        mAnimatedView = animatedView;
-        mAnimatedView.setAlpha(0);
-
-        parent.addOnLayoutChangeListener(
-                (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) ->
-                        setupAnimations(parent.getGravity(), parent.getPivotOffset(),
-                                parent.getPaddingRect(), parent.getWidth(), parent.getHeight()));
-    }
-
-    private void setupAnimations(int gravity, int pivotOffset, Rect paddingRect,
-            int width, int height) {
-        int padding;
-        if (isHorizontal(gravity)) {
-            mGoneRadius = pivotOffset;
-            if (isLeft(gravity, mAnimatedView.getLayoutDirection())) {
-                mPivotX = -pivotOffset;
-                padding = paddingRect.right;
-            } else {
-                mPivotX = width + pivotOffset;
-                padding = paddingRect.left;
-            }
-            mPivotY = height / 2;
-            mOvershootRadius = pivotOffset + width;
-        } else if (isVertical(gravity)) {
-            mGoneRadius = pivotOffset;
-            if (isTop(gravity)) {
-                mPivotY = -pivotOffset;
-                padding = paddingRect.bottom;
-            } else {
-                mPivotY = height + pivotOffset;
-                padding = paddingRect.top;
-            }
-            mPivotX = width / 2;
-            mOvershootRadius = pivotOffset + height;
-        } else {
-            mPivotX = width / 2;
-            mPivotY = height / 2;
-            mGoneRadius = 0;
-            if (width > height) {
-                mOvershootRadius = height;
-                padding = Math.max(paddingRect.top, paddingRect.bottom);
-            } else {
-                mOvershootRadius = width;
-                padding = Math.max(paddingRect.left, paddingRect.right);
-            }
-        }
-        mRestingRadius = mOvershootRadius - padding;
-        mBumpRadius = mOvershootRadius - padding / 3;
-        mAnimationsReady = true;
-    }
-
-    boolean isOpen() {
-        return mCircleState != CircleState.GONE;
-    }
-
-    void animateOpen() {
-        if (!mAnimationsReady
-                || !mAnimatedView.isAttachedToWindow()
-                || mCircleState == CircleState.ENTERING) {
-            return;
-        }
-
-        AnimatorSet set = new AnimatorSet();
-        List<Animator> animators = new ArrayList<>();
-        switch (mCircleState) {
-            case CircleState.ENTERING:
-                throw new AssertionError("Should not be able to reach this statement");
-            case CircleState.GONE: {
-                Animator startCircle = createEnterAnimator();
-                markState(startCircle, CircleState.ENTERING);
-                animators.add(startCircle);
-                Animator holdOvershoot = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mOvershootRadius,
-                                mOvershootRadius);
-                holdOvershoot.setDuration(50);
-                markState(holdOvershoot, CircleState.OVERSHOT);
-                animators.add(holdOvershoot);
-                Animator rest = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mOvershootRadius,
-                                mRestingRadius);
-                markState(rest, CircleState.RESTING);
-                animators.add(rest);
-                Animator holdRest = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mRestingRadius,
-                                mRestingRadius);
-                markState(holdRest, CircleState.RESTED);
-                holdRest.setDuration(1000);
-                animators.add(holdRest);
-                Animator exit = createExitAnimator(mRestingRadius);
-                markState(exit, CircleState.EXITING);
-                animators.add(exit);
-            }
-            break;
-            case CircleState.RESTED:
-            case CircleState.RESTING:
-            case CircleState.EXITING:
-            case CircleState.OVERSHOT:
-                int startRadius =
-                        mCircleState == CircleState.OVERSHOT ? mOvershootRadius : mRestingRadius;
-                Animator bump = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, startRadius,
-                                mBumpRadius);
-                bump.setDuration(50);
-                markState(bump, CircleState.BUMPING);
-                animators.add(bump);
-                // fallthrough intentional
-            case CircleState.BUMPED:
-            case CircleState.BUMPING:
-                Animator holdBump = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mBumpRadius,
-                                mBumpRadius);
-                holdBump.setDuration(100);
-                markState(holdBump, CircleState.BUMPED);
-                animators.add(holdBump);
-                Animator rest = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mBumpRadius,
-                                mRestingRadius);
-                markState(rest, CircleState.RESTING);
-                animators.add(rest);
-                Animator holdRest = ViewAnimationUtils
-                        .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mRestingRadius,
-                                mRestingRadius);
-                holdRest.setDuration(1000);
-                markState(holdRest, CircleState.RESTED);
-                animators.add(holdRest);
-                Animator exit = createExitAnimator(mRestingRadius);
-                markState(exit, CircleState.EXITING);
-                animators.add(exit);
-                break;
-        }
-        set.playSequentially(animators);
-        set.addListener(new AnimatorListenerAdapter() {
-            private boolean mCanceled = false;
-
-            @Override
-            public void onAnimationStart(Animator animation) {
-                if (mCircularReveal != null) {
-                    mCircularReveal.cancel();
-                }
-                mCircularReveal = animation;
-                mAnimatedView.setVisibility(View.VISIBLE);
-            }
-
-            @Override
-            public void onAnimationCancel(Animator animation) {
-                mCanceled = true;
-            }
-
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                if (mCanceled) {
-                    return;
-                }
-                mCircularReveal = null;
-                mCircleState = CircleState.GONE;
-                mAnimatedView.setVisibility(View.GONE);
-            }
-        });
-
-        set.start();
-    }
-
-    private Animator createEnterAnimator() {
-        AnimatorSet animatorSet = new AnimatorSet();
-        Animator circularReveal = ViewAnimationUtils
-                .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mGoneRadius,
-                        mOvershootRadius);
-        Animator fade = ObjectAnimator.ofFloat(mAnimatedView, View.ALPHA, MAX_OPACITY);
-        animatorSet.playTogether(circularReveal, fade);
-        return animatorSet;
-    }
-
-    private Animator createExitAnimator(int startRadius) {
-        AnimatorSet animatorSet = new AnimatorSet();
-        Animator circularHide = ViewAnimationUtils
-                .createCircularReveal(mAnimatedView, mPivotX, mPivotY, startRadius,
-                        (mGoneRadius + startRadius) / 2);
-        circularHide.setInterpolator(ANTICIPATE_INTERPOLATOR);
-        Animator fade = ObjectAnimator.ofFloat(mAnimatedView, View.ALPHA, 0);
-        fade.setStartDelay(50);
-        animatorSet.playTogether(circularHide, fade);
-        return animatorSet;
-    }
-
-    void hideCircle() {
-        if (!mAnimationsReady || mCircleState == CircleState.GONE
-                || mCircleState == CircleState.EXITING) {
-            return;
-        }
-
-        int startRadius;
-        switch (mCircleState) {
-            // Unreachable, but here to exhaust switch cases
-            //noinspection ConstantConditions
-            case CircleState.EXITING:
-                //noinspection ConstantConditions
-            case CircleState.GONE:
-                throw new AssertionError("Should not be able to reach this statement");
-            case CircleState.BUMPED:
-            case CircleState.BUMPING:
-                startRadius = mBumpRadius;
-                break;
-            case CircleState.OVERSHOT:
-                startRadius = mOvershootRadius;
-                break;
-            case CircleState.ENTERING:
-            case CircleState.RESTED:
-            case CircleState.RESTING:
-                startRadius = mRestingRadius;
-                break;
-            default:
-                throw new IllegalStateException("Unknown CircleState: " + mCircleState);
-        }
-
-        Animator hideAnimation = createExitAnimator(startRadius);
-        if (startRadius == mRestingRadius) {
-            hideAnimation.setInterpolator(ANTICIPATE_INTERPOLATOR);
-        }
-        hideAnimation.addListener(new AnimatorListenerAdapter() {
-            private boolean mCanceled = false;
-
-            @Override
-            public void onAnimationStart(Animator animation) {
-                mCircleState = CircleState.EXITING;
-                if (mCircularReveal != null) {
-                    mCircularReveal.cancel();
-                }
-                mCircularReveal = animation;
-            }
-
-            @Override
-            public void onAnimationCancel(Animator animation) {
-                mCanceled = true;
-            }
-
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                if (mCanceled) {
-                    return;
-                }
-                mCircularReveal = null;
-                mCircleState = CircleState.GONE;
-                mAnimatedView.setVisibility(View.GONE);
-            }
-        });
-        hideAnimation.start();
-    }
-
-    void stopAnimations() {
-        if (mCircularReveal != null) {
-            mCircularReveal.end();
-        }
-    }
-
-    private void markState(Animator animator, @CircleState int startState) {
-        animator.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationStart(Animator animation) {
-                mCircleState = startState;
-            }
-        });
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureColorStore.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureColorStore.java
deleted file mode 100644
index 9a7b0b9..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureColorStore.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.hvac;
-
-import android.graphics.Color;
-
-/**
- * Contains the logic for mapping colors to temperatures
- */
-class TemperatureColorStore {
-
-    private static class TemperatureColorValue {
-        final float mTemperature;
-        final int mColor;
-
-        private TemperatureColorValue(float temperature, int color) {
-            this.mTemperature = temperature;
-            this.mColor = color;
-        }
-
-        float getTemperature() {
-            return mTemperature;
-        }
-
-        int getColor() {
-            return mColor;
-        }
-    }
-
-    private static TemperatureColorValue tempToColor(float temperature, int color) {
-        return new TemperatureColorValue(temperature, color);
-    }
-
-    private static final int COLOR_COLDEST = 0xFF406DFF;
-    private static final int COLOR_COLD = 0xFF4094FF;
-    private static final int COLOR_NEUTRAL = 0xFFF4F4F4;
-    private static final int COLOR_WARM = 0xFFFF550F;
-    private static final int COLOR_WARMEST = 0xFFFF0000;
-    // must be sorted by temperature
-    private static final TemperatureColorValue[] sTemperatureColorValues =
-            {
-                    // Celsius
-                    tempToColor(19, COLOR_COLDEST),
-                    tempToColor(21, COLOR_COLD),
-                    tempToColor(23, COLOR_NEUTRAL),
-                    tempToColor(25, COLOR_WARM),
-                    tempToColor(27, COLOR_WARMEST),
-
-                    // Switch over
-                    tempToColor(45, COLOR_WARMEST),
-                    tempToColor(45.00001f, COLOR_COLDEST),
-
-                    // Farenheight
-                    tempToColor(66, COLOR_COLDEST),
-                    tempToColor(70, COLOR_COLD),
-                    tempToColor(74, COLOR_NEUTRAL),
-                    tempToColor(76, COLOR_WARM),
-                    tempToColor(80, COLOR_WARMEST)
-            };
-
-    private static final int COLOR_UNSET = Color.BLACK;
-
-    private final float[] mTempHsv1 = new float[3];
-    private final float[] mTempHsv2 = new float[3];
-    private final float[] mTempHsv3 = new float[3];
-
-    int getMinColor() {
-        return COLOR_COLDEST;
-    }
-
-    int getMaxColor() {
-        return COLOR_WARMEST;
-    }
-
-    int getColorForTemperature(float temperature) {
-        if (Float.isNaN(temperature)) {
-            return COLOR_UNSET;
-        }
-        TemperatureColorValue bottomValue = sTemperatureColorValues[0];
-        if (temperature <= bottomValue.getTemperature()) {
-            return bottomValue.getColor();
-        }
-        TemperatureColorValue topValue =
-                sTemperatureColorValues[sTemperatureColorValues.length - 1];
-        if (temperature >= topValue.getTemperature()) {
-            return topValue.getColor();
-        }
-
-        int index = binarySearch(temperature);
-        if (index >= 0) {
-            return sTemperatureColorValues[index].getColor();
-        }
-
-        index = -index - 1; // move to the insertion point
-
-        TemperatureColorValue startValue = sTemperatureColorValues[index - 1];
-        TemperatureColorValue endValue = sTemperatureColorValues[index];
-        float fraction = (temperature - startValue.getTemperature()) / (endValue.getTemperature()
-                - startValue.getTemperature());
-        return lerpColor(fraction, startValue.getColor(), endValue.getColor());
-    }
-
-    int lerpColor(float fraction, int startColor, int endColor) {
-        float[] startHsv = mTempHsv1;
-        Color.colorToHSV(startColor, startHsv);
-        float[] endHsv = mTempHsv2;
-        Color.colorToHSV(endColor, endHsv);
-
-        // If a target color is white/gray, it should use the same hue as the other target
-        if (startHsv[1] == 0) {
-            startHsv[0] = endHsv[0];
-        }
-        if (endHsv[1] == 0) {
-            endHsv[0] = startHsv[0];
-        }
-
-        float[] outColor = mTempHsv3;
-        outColor[0] = hueLerp(fraction, startHsv[0], endHsv[0]);
-        outColor[1] = lerp(fraction, startHsv[1], endHsv[1]);
-        outColor[2] = lerp(fraction, startHsv[2], endHsv[2]);
-
-        return Color.HSVToColor(outColor);
-    }
-
-    private float hueLerp(float fraction, float start, float end) {
-        // If in flat part of curve, no interpolation necessary
-        if (start == end) {
-            return start;
-        }
-
-        // If the hues are more than 180 degrees apart, go the other way around the color wheel
-        // by moving the smaller value above 360
-        if (Math.abs(start - end) > 180f) {
-            if (start < end) {
-                start += 360f;
-            } else {
-                end += 360f;
-            }
-        }
-        // Lerp and ensure the final output is within [0, 360)
-        return lerp(fraction, start, end) % 360f;
-
-    }
-
-    private float lerp(float fraction, float start, float end) {
-        // If in flat part of curve, no interpolation necessary
-        if (start == end) {
-            return start;
-        }
-
-        // If outside bounds, use boundary value
-        if (fraction >= 1) {
-            return end;
-        }
-        if (fraction <= 0) {
-            return start;
-        }
-
-        return (end - start) * fraction + start;
-    }
-
-    private int binarySearch(float temperature) {
-        int low = 0;
-        int high = sTemperatureColorValues.length;
-
-        while (low <= high) {
-            int mid = (low + high) >>> 1;
-            float midVal = sTemperatureColorValues[mid].getTemperature();
-
-            if (midVal < temperature) {
-                low = mid + 1;  // Neither val is NaN, thisVal is smaller
-            } else if (midVal > temperature) {
-                high = mid - 1; // Neither val is NaN, thisVal is larger
-            } else {
-                int midBits = Float.floatToIntBits(midVal);
-                int keyBits = Float.floatToIntBits(temperature);
-                if (midBits == keyBits) {    // Values are equal
-                    return mid;             // Key found
-                } else if (midBits < keyBits) { // (-0.0, 0.0) or (!NaN, NaN)
-                    low = mid + 1;
-                } else {                        /* (0.0, -0.0) or (NaN, !NaN)*/
-                    high = mid - 1;
-                }
-            }
-        }
-        return -(low + 1);  // key not found.
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextAnimator.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextAnimator.java
deleted file mode 100644
index 74d9704..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextAnimator.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.hvac;
-
-import static com.android.systemui.car.hvac.AnimatedTemperatureView.isHorizontal;
-import static com.android.systemui.car.hvac.AnimatedTemperatureView.isLeft;
-
-import android.annotation.NonNull;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.view.animation.AlphaAnimation;
-import android.view.animation.Animation;
-import android.view.animation.AnimationSet;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.RotateAnimation;
-import android.view.animation.TranslateAnimation;
-import android.widget.TextSwitcher;
-
-/**
- * Controls animating TemperatureView's text
- */
-class TemperatureTextAnimator {
-
-    private static final DecelerateInterpolator DECELERATE_INTERPOLATOR =
-            new DecelerateInterpolator();
-    private static final AccelerateDecelerateInterpolator ACCELERATE_DECELERATE_INTERPOLATOR =
-            new AccelerateDecelerateInterpolator();
-
-    private static final int ROTATION_DEGREES = 15;
-    private static final int DURATION_MILLIS = 200;
-
-    private AnimatedTemperatureView mParent;
-    private final TextSwitcher mTextSwitcher;
-    private final String mTempFormat;
-    private final int mPivotOffset;
-    private final CharSequence mMinText;
-    private final CharSequence mMaxText;
-
-    private Animation mTextInAnimationUp;
-    private Animation mTextOutAnimationUp;
-    private Animation mTextInAnimationDown;
-    private Animation mTextOutAnimationDown;
-    private Animation mTextFadeInAnimation;
-    private Animation mTextFadeOutAnimation;
-
-    private float mLastTemp = Float.NaN;
-
-    TemperatureTextAnimator(AnimatedTemperatureView parent, TextSwitcher textSwitcher,
-            String tempFormat, int pivotOffset,
-            CharSequence minText, CharSequence maxText) {
-        mParent = parent;
-        mTextSwitcher = textSwitcher;
-        mTempFormat = tempFormat;
-        mPivotOffset = pivotOffset;
-        mMinText = minText;
-        mMaxText = maxText;
-
-        mParent.addOnLayoutChangeListener(
-                (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) ->
-                        setupAnimations(mParent.getGravity()));
-    }
-
-    void setTemp(float temp) {
-        if (Float.isNaN(temp)) {
-            mTextSwitcher.setInAnimation(mTextFadeInAnimation);
-            mTextSwitcher.setOutAnimation(mTextFadeOutAnimation);
-            mTextSwitcher.setText("--");
-            mLastTemp = temp;
-            return;
-        }
-        boolean isMinValue = mParent.isMinValue(temp);
-        boolean isMaxValue = mParent.isMaxValue(temp);
-        if (Float.isNaN(mLastTemp)) {
-            mTextSwitcher.setInAnimation(mTextFadeInAnimation);
-            mTextSwitcher.setOutAnimation(mTextFadeOutAnimation);
-        } else if (!isMinValue && (isMaxValue || temp > mLastTemp)) {
-            mTextSwitcher.setInAnimation(mTextInAnimationUp);
-            mTextSwitcher.setOutAnimation(mTextOutAnimationUp);
-        } else {
-            mTextSwitcher.setInAnimation(mTextInAnimationDown);
-            mTextSwitcher.setOutAnimation(mTextOutAnimationDown);
-        }
-        CharSequence text;
-        if (isMinValue) {
-            text = mMinText;
-        } else if (isMaxValue) {
-            text = mMaxText;
-        } else {
-            text = String.format(mTempFormat, temp);
-        }
-        mTextSwitcher.setText(text);
-        mLastTemp = temp;
-    }
-
-    private void setupAnimations(int gravity) {
-        mTextFadeInAnimation = createFadeAnimation(true);
-        mTextFadeOutAnimation = createFadeAnimation(false);
-        if (!isHorizontal(gravity)) {
-            mTextInAnimationUp = createTranslateFadeAnimation(true, true);
-            mTextOutAnimationUp = createTranslateFadeAnimation(false, true);
-            mTextInAnimationDown = createTranslateFadeAnimation(true, false);
-            mTextOutAnimationDown = createTranslateFadeAnimation(false, false);
-        } else {
-            boolean isLeft = isLeft(gravity, mTextSwitcher.getLayoutDirection());
-            mTextInAnimationUp = createRotateFadeAnimation(true, isLeft, true);
-            mTextOutAnimationUp = createRotateFadeAnimation(false, isLeft, true);
-            mTextInAnimationDown = createRotateFadeAnimation(true, isLeft, false);
-            mTextOutAnimationDown = createRotateFadeAnimation(false, isLeft, false);
-        }
-    }
-
-    @NonNull
-    private Animation createFadeAnimation(boolean in) {
-        AnimationSet set = new AnimationSet(true);
-        AlphaAnimation alphaAnimation = new AlphaAnimation(in ? 0 : 1, in ? 1 : 0);
-        alphaAnimation.setDuration(DURATION_MILLIS);
-        set.addAnimation(new RotateAnimation(0, 0)); // Undo any previous rotation
-        set.addAnimation(alphaAnimation);
-        return set;
-    }
-
-    @NonNull
-    private Animation createTranslateFadeAnimation(boolean in, boolean up) {
-        AnimationSet set = new AnimationSet(true);
-        set.setInterpolator(ACCELERATE_DECELERATE_INTERPOLATOR);
-        set.setDuration(DURATION_MILLIS);
-        int fromYDelta = in ? (up ? 1 : -1) : 0;
-        int toYDelta = in ? 0 : (up ? -1 : 1);
-        set.addAnimation(
-                new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0,
-                        Animation.RELATIVE_TO_SELF, fromYDelta, Animation.RELATIVE_TO_SELF,
-                        toYDelta));
-        set.addAnimation(new AlphaAnimation(in ? 0 : 1, in ? 1 : 0));
-        return set;
-    }
-
-    @NonNull
-    private Animation createRotateFadeAnimation(boolean in, boolean isLeft, boolean up) {
-        AnimationSet set = new AnimationSet(true);
-        set.setInterpolator(DECELERATE_INTERPOLATOR);
-        set.setDuration(DURATION_MILLIS);
-
-        float degrees = isLeft == up ? -ROTATION_DEGREES : ROTATION_DEGREES;
-        int pivotX = isLeft ? -mPivotOffset : mParent.getWidth() + mPivotOffset;
-        set.addAnimation(
-                new RotateAnimation(in ? -degrees : 0f, in ? 0f : degrees, Animation.ABSOLUTE,
-                        pivotX, Animation.ABSOLUTE, 0f));
-        set.addAnimation(new AlphaAnimation(in ? 0 : 1, in ? 1 : 0));
-        return set;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextView.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextView.java
deleted file mode 100644
index 90df15c..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextView.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.hvac;
-
-import static com.android.systemui.car.hvac.HvacController.convertToFahrenheit;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.util.AttributeSet;
-import android.widget.TextView;
-
-import com.android.systemui.R;
-
-/**
- * Simple text display of HVAC properties, It is designed to show temperature and is configured in
- * the XML.
- * XML properties:
- * hvacAreaId - Example: VehicleAreaSeat.SEAT_ROW_1_LEFT (1)
- */
-public class TemperatureTextView extends TextView implements TemperatureView {
-
-    private final int mAreaId;
-    private final String mTempFormat;
-    private HvacController mHvacController;
-    private boolean mDisplayFahrenheit = false;
-
-    public TemperatureTextView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TemperatureView);
-        mAreaId = typedArray.getInt(R.styleable.TemperatureView_hvacAreaId, -1);
-        mTempFormat = getResources().getString(R.string.hvac_temperature_format);
-    }
-
-    @Override
-    public void setHvacController(HvacController controller) {
-        mHvacController = controller;
-    }
-
-    /**
-     * Formats the float for display
-     *
-     * @param temp - The current temp or NaN
-     */
-    @Override
-    public void setTemp(float temp) {
-        if (Float.isNaN(temp)) {
-            setText("--");
-            return;
-        }
-        if (mDisplayFahrenheit) {
-            temp = convertToFahrenheit(temp);
-        }
-        setText(String.format(mTempFormat, temp));
-    }
-
-    @Override
-    public void setDisplayInFahrenheit(boolean displayFahrenheit) {
-        mDisplayFahrenheit = displayFahrenheit;
-    }
-
-    /**
-     * @return hvac AreaId - Example: VehicleAreaSeat.SEAT_ROW_1_LEFT (1)
-     */
-    @Override
-    public int getAreaId() {
-        return mAreaId;
-    }
-}
-
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureView.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureView.java
deleted file mode 100644
index 6edf254..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureView.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.hvac;
-
-/**
- * Interface for Views that display temperature HVAC properties.
- */
-public interface TemperatureView {
-
-    /**
-     * Sets the {@link HvacController} to handle changes to HVAC properties. The View is only
-     * responsible for the UI to display temperature. It should not contain logic that makes direct
-     * changes to HVAC properties and instead use this {@link HvacController}.
-     */
-    void setHvacController(HvacController controller);
-
-    /**
-     * Formats the float for display
-     *
-     * @param temp - The current temp in Celsius or NaN
-     */
-    void setTemp(float temp);
-
-    /**
-     * Render the displayed temperature in Fahrenheit
-     *
-     * @param displayFahrenheit - True if temperature should be displayed in Fahrenheit
-     */
-    void setDisplayInFahrenheit(boolean displayFahrenheit);
-
-    /**
-     * @return hvac AreaId - Example: VehicleAreaSeat.SEAT_ROW_1_LEFT (1)
-     */
-    int getAreaId();
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
deleted file mode 100644
index c190ae54..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.keyguard;
-
-import android.car.Car;
-import android.car.user.CarUserManager;
-import android.os.Bundle;
-import android.os.Handler;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewRootImpl;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.keyguard.KeyguardViewController;
-import com.android.keyguard.ViewMediatorCallback;
-import com.android.systemui.R;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.car.navigationbar.CarNavigationBarController;
-import com.android.systemui.car.window.OverlayViewController;
-import com.android.systemui.car.window.OverlayViewGlobalStateController;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.statusbar.phone.BiometricUnlockController;
-import com.android.systemui.statusbar.phone.KeyguardBouncer;
-import com.android.systemui.statusbar.phone.KeyguardBouncer.Factory;
-import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.phone.NotificationPanelViewController;
-import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-
-import javax.inject.Inject;
-
-import dagger.Lazy;
-
-/**
- * Automotive implementation of the {@link KeyguardViewController}. It controls the Keyguard View
- * that is mounted to the SystemUIOverlayWindow.
- */
-@SysUISingleton
-public class CarKeyguardViewController extends OverlayViewController implements
-        KeyguardViewController {
-    private static final String TAG = "CarKeyguardViewController";
-    private static final boolean DEBUG = true;
-
-    private final Handler mHandler;
-    private final CarServiceProvider mCarServiceProvider;
-    private final KeyguardStateController mKeyguardStateController;
-    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
-    private final Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy;
-    private final ViewMediatorCallback mViewMediatorCallback;
-    private final CarNavigationBarController mCarNavigationBarController;
-    private final Factory mKeyguardBouncerFactory;
-    // Needed to instantiate mBouncer.
-    private final KeyguardBouncer.BouncerExpansionCallback
-            mExpansionCallback = new KeyguardBouncer.BouncerExpansionCallback() {
-                @Override
-                public void onFullyShown() {
-                }
-
-                @Override
-                public void onStartingToHide() {
-                }
-
-                @Override
-                public void onStartingToShow() {
-                }
-
-                @Override
-                public void onFullyHidden() {
-                }
-            };
-    private final CarUserManager.UserLifecycleListener mUserLifecycleListener = (e) -> {
-        if (e.getEventType() == CarUserManager.USER_LIFECYCLE_EVENT_TYPE_SWITCHING) {
-            revealKeyguardIfBouncerPrepared();
-        }
-    };
-
-    private KeyguardBouncer mBouncer;
-    private OnKeyguardCancelClickedListener mKeyguardCancelClickedListener;
-    private boolean mShowing;
-    private boolean mIsOccluded;
-
-    @Inject
-    public CarKeyguardViewController(
-            @Main Handler mainHandler,
-            CarServiceProvider carServiceProvider,
-            OverlayViewGlobalStateController overlayViewGlobalStateController,
-            KeyguardStateController keyguardStateController,
-            KeyguardUpdateMonitor keyguardUpdateMonitor,
-            Lazy<BiometricUnlockController> biometricUnlockControllerLazy,
-            ViewMediatorCallback viewMediatorCallback,
-            CarNavigationBarController carNavigationBarController,
-            KeyguardBouncer.Factory keyguardBouncerFactory) {
-
-        super(R.id.keyguard_stub, overlayViewGlobalStateController);
-
-        mHandler = mainHandler;
-        mCarServiceProvider = carServiceProvider;
-        mKeyguardStateController = keyguardStateController;
-        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
-        mBiometricUnlockControllerLazy = biometricUnlockControllerLazy;
-        mViewMediatorCallback = viewMediatorCallback;
-        mCarNavigationBarController = carNavigationBarController;
-        mKeyguardBouncerFactory = keyguardBouncerFactory;
-
-        registerUserSwitchedListener();
-    }
-
-    @Override
-    protected boolean shouldShowNavigationBarInsets() {
-        return true;
-    }
-
-    @Override
-    public void onFinishInflate() {
-        mBouncer = mKeyguardBouncerFactory
-                .create(getLayout().findViewById(R.id.keyguard_container), mExpansionCallback);
-        mBiometricUnlockControllerLazy.get().setKeyguardViewController(this);
-    }
-
-    @Override
-    public void notifyKeyguardAuthenticated(boolean strongAuth) {
-        if (mBouncer != null) {
-            mBouncer.notifyKeyguardAuthenticated(strongAuth);
-        }
-    }
-
-    @Override
-    public void showBouncer(boolean scrimmed) {
-        if (mShowing && !mBouncer.isShowing()) {
-            mBouncer.show(/* resetSecuritySelection= */ false);
-        }
-    }
-
-    @Override
-    public void show(Bundle options) {
-        if (mShowing) return;
-
-        mShowing = true;
-        mKeyguardStateController.notifyKeyguardState(mShowing, /* occluded= */ false);
-        mCarNavigationBarController.showAllKeyguardButtons(/* isSetUp= */ true);
-        start();
-        reset(/* hideBouncerWhenShowing= */ false);
-        notifyKeyguardUpdateMonitor();
-    }
-
-    @Override
-    public void hide(long startTime, long fadeoutDuration) {
-        if (!mShowing) return;
-
-        mViewMediatorCallback.readyForKeyguardDone();
-        mShowing = false;
-        mKeyguardStateController.notifyKeyguardState(mShowing, /* occluded= */ false);
-        mBouncer.hide(/* destroyView= */ true);
-        mCarNavigationBarController.hideAllKeyguardButtons(/* isSetUp= */ true);
-        stop();
-        mKeyguardStateController.notifyKeyguardDoneFading();
-        mHandler.post(mViewMediatorCallback::keyguardGone);
-        notifyKeyguardUpdateMonitor();
-    }
-
-    @Override
-    public void reset(boolean hideBouncerWhenShowing) {
-        if (mShowing) {
-            if (mBouncer != null) {
-                if (!mBouncer.isSecure()) {
-                    dismissAndCollapse();
-                }
-                mBouncer.show(/* resetSecuritySelection= */ true);
-            }
-            mKeyguardUpdateMonitor.sendKeyguardReset();
-            notifyKeyguardUpdateMonitor();
-        } else {
-            // This is necessary in order to address an inconsistency between the keyguard service
-            // and the keyguard views.
-            // TODO: Investigate the source of the inconsistency.
-            show(/* options= */ null);
-        }
-    }
-
-    @Override
-    public void onFinishedGoingToSleep() {
-        if (mBouncer != null) {
-            mBouncer.onScreenTurnedOff();
-        }
-    }
-
-    @Override
-    public void setOccluded(boolean occluded, boolean animate) {
-        mIsOccluded = occluded;
-        getOverlayViewGlobalStateController().setOccluded(occluded);
-        if (!occluded) {
-            reset(/* hideBouncerWhenShowing= */ false);
-        }
-    }
-
-    @Override
-    public void onCancelClicked() {
-        if (mBouncer == null) return;
-
-        getOverlayViewGlobalStateController().setWindowNeedsInput(/* needsInput= */ false);
-
-        mBouncer.hide(/* destroyView= */ true);
-        mKeyguardCancelClickedListener.onCancelClicked();
-    }
-
-    @Override
-    public boolean isShowing() {
-        return mShowing;
-    }
-
-    @Override
-    public void dismissAndCollapse() {
-        // If dismissing and collapsing Keyguard is requested (e.g. by a Keyguard-dismissing
-        // Activity) while Keyguard is occluded, unocclude Keyguard so the user can authenticate to
-        // dismiss Keyguard.
-        if (mIsOccluded) {
-            setOccluded(/* occluded= */ false, /* animate= */ false);
-        }
-        if (!mBouncer.isSecure()) {
-            hide(/* startTime= */ 0, /* fadeoutDuration= */ 0);
-        }
-    }
-
-    @Override
-    public void startPreHideAnimation(Runnable finishRunnable) {
-        if (mBouncer == null) return;
-
-        mBouncer.startPreHideAnimation(finishRunnable);
-    }
-
-    @Override
-    public void setNeedsInput(boolean needsInput) {
-        getOverlayViewGlobalStateController().setWindowNeedsInput(needsInput);
-    }
-
-    /**
-     * Add listener for keyguard cancel clicked.
-     */
-    public void registerOnKeyguardCancelClickedListener(
-            OnKeyguardCancelClickedListener keyguardCancelClickedListener) {
-        mKeyguardCancelClickedListener = keyguardCancelClickedListener;
-    }
-
-    /**
-     * Remove listener for keyguard cancel clicked.
-     */
-    public void unregisterOnKeyguardCancelClickedListener(
-            OnKeyguardCancelClickedListener keyguardCancelClickedListener) {
-        mKeyguardCancelClickedListener = null;
-    }
-
-    @Override
-    public ViewRootImpl getViewRootImpl() {
-        return ((View) getLayout().getParent()).getViewRootImpl();
-    }
-
-    @Override
-    public boolean isBouncerShowing() {
-        return mBouncer != null && mBouncer.isShowing();
-    }
-
-    @Override
-    public boolean bouncerIsOrWillBeShowing() {
-        return mBouncer != null && (mBouncer.isShowing() || mBouncer.inTransit());
-    }
-
-    @Override
-    public void keyguardGoingAway() {
-        // no-op
-    }
-
-    @Override
-    public void setKeyguardGoingAwayState(boolean isKeyguardGoingAway) {
-        // no-op
-    }
-
-    @Override
-    public void onStartedGoingToSleep() {
-        // no-op
-    }
-
-    @Override
-    public void onStartedWakingUp() {
-        // no-op
-    }
-
-    @Override
-    public void onScreenTurningOn() {
-        // no-op
-    }
-
-    @Override
-    public void onScreenTurnedOn() {
-        // no-op
-    }
-
-    @Override
-    public boolean shouldDisableWindowAnimationsForUnlock() {
-        return false;
-    }
-
-    @Override
-    public boolean isGoingToNotificationShade() {
-        return false;
-    }
-
-    @Override
-    public boolean isUnlockWithWallpaper() {
-        return false;
-    }
-
-    @Override
-    public boolean shouldSubtleWindowAnimationsForUnlock() {
-        return false;
-    }
-
-    @Override
-    public void registerStatusBar(StatusBar statusBar, ViewGroup container,
-            NotificationPanelViewController notificationPanelViewController,
-            BiometricUnlockController biometricUnlockController,
-            ViewGroup lockIconContainer,
-            View notificationContainer, KeyguardBypassController bypassController) {
-        // no-op
-    }
-
-    /**
-     *  Hides Keyguard so that the transitioning Bouncer can be hidden until it is prepared. To be
-     *  called by {@link com.android.systemui.car.userswitcher.FullscreenUserSwitcherViewMediator}
-     *  when a new user is selected.
-     */
-    public void hideKeyguardToPrepareBouncer() {
-        getLayout().setVisibility(View.INVISIBLE);
-    }
-
-    @VisibleForTesting
-    void setKeyguardBouncer(KeyguardBouncer keyguardBouncer) {
-        mBouncer = keyguardBouncer;
-    }
-
-    private void revealKeyguardIfBouncerPrepared() {
-        int reattemptDelayMillis = 50;
-        Runnable revealKeyguard = () -> {
-            if (mBouncer == null) {
-                if (DEBUG) {
-                    Log.d(TAG, "revealKeyguardIfBouncerPrepared: revealKeyguard request is ignored "
-                                    + "since the Bouncer has not been initialized yet.");
-                }
-                return;
-            }
-            if (!mBouncer.inTransit() || !mBouncer.isSecure()) {
-                getLayout().setVisibility(View.VISIBLE);
-            } else {
-                if (DEBUG) {
-                    Log.d(TAG, "revealKeyguardIfBouncerPrepared: Bouncer is not prepared "
-                            + "yet so reattempting after " + reattemptDelayMillis + "ms.");
-                }
-                mHandler.postDelayed(this::revealKeyguardIfBouncerPrepared, reattemptDelayMillis);
-            }
-        };
-        mHandler.post(revealKeyguard);
-    }
-
-    private void notifyKeyguardUpdateMonitor() {
-        mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(mShowing);
-        if (mBouncer != null) {
-            mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(isBouncerShowing());
-        }
-    }
-
-    private void registerUserSwitchedListener() {
-        mCarServiceProvider.addListener(car -> {
-            CarUserManager userManager = (CarUserManager) car.getCarManager(Car.CAR_USER_SERVICE);
-            userManager.addListener(Runnable::run, mUserLifecycleListener);
-        });
-    }
-
-    /**
-     * Defines a callback for keyguard cancel button clicked listeners.
-     */
-    public interface OnKeyguardCancelClickedListener {
-        /**
-         * Called when keyguard cancel button is clicked.
-         */
-        void onCancelClicked();
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewMediator.java
deleted file mode 100644
index 155b73e..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewMediator.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.keyguard;
-
-import com.android.systemui.car.userswitcher.FullScreenUserSwitcherViewController;
-import com.android.systemui.car.window.OverlayViewMediator;
-import com.android.systemui.dagger.SysUISingleton;
-
-import javax.inject.Inject;
-
-/**
- * Manages events originating from the Keyguard service that cause Keyguard or other OverlayWindow
- * Components to appear or disappear.
- */
-@SysUISingleton
-public class CarKeyguardViewMediator implements OverlayViewMediator {
-
-    private final CarKeyguardViewController mCarKeyguardViewController;
-    private final FullScreenUserSwitcherViewController mFullScreenUserSwitcherViewController;
-
-    @Inject
-    public CarKeyguardViewMediator(
-            CarKeyguardViewController carKeyguardViewController,
-            FullScreenUserSwitcherViewController fullScreenUserSwitcherViewController
-    ) {
-        mCarKeyguardViewController = carKeyguardViewController;
-        mFullScreenUserSwitcherViewController = fullScreenUserSwitcherViewController;
-    }
-
-    @Override
-    public void registerListeners() {
-        mCarKeyguardViewController.registerOnKeyguardCancelClickedListener(
-                mFullScreenUserSwitcherViewController::start);
-    }
-
-    @Override
-    public void setupOverlayContentViewControllers() {
-        // no-op
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/AssitantButton.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/AssitantButton.java
deleted file mode 100644
index ede4696..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/AssitantButton.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_ASSIST_GESTURE;
-
-import android.app.role.RoleManager;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.util.Log;
-
-import com.android.internal.app.AssistUtils;
-import com.android.internal.app.IVoiceInteractionSessionShowCallback;
-
-/**
- * AssitantButton is a ui component that will trigger the Voice Interaction Service.
- */
-public class AssitantButton extends CarNavigationButton {
-    private static final String TAG = "AssistantButton";
-    private final AssistUtils mAssistUtils;
-    private IVoiceInteractionSessionShowCallback mShowCallback =
-            new IVoiceInteractionSessionShowCallback.Stub() {
-                @Override
-                public void onFailed() {
-                    Log.w(TAG, "Failed to show VoiceInteractionSession");
-                }
-
-                @Override
-                public void onShown() {
-                    Log.d(TAG, "IVoiceInteractionSessionShowCallback onShown()");
-                }
-            };
-
-    public AssitantButton(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mAssistUtils = new AssistUtils(context);
-        setOnClickListener(v -> showAssistant());
-    }
-
-    private void showAssistant() {
-        final Bundle args = new Bundle();
-        mAssistUtils.showSessionForActiveService(args,
-                SHOW_SOURCE_ASSIST_GESTURE, mShowCallback, /*activityToken=*/ null);
-    }
-
-    @Override
-    protected void setUpIntents(TypedArray typedArray) {
-        // left blank because for the assistant button Intent will not be passed from the layout.
-    }
-
-    @Override
-    protected String getRoleName() {
-        return RoleManager.ROLE_ASSISTANT;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonRoleHolderController.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonRoleHolderController.java
deleted file mode 100644
index f8cd20f..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonRoleHolderController.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import android.annotation.Nullable;
-import android.app.role.OnRoleHoldersChangedListener;
-import android.app.role.RoleManager;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
-import android.os.UserHandle;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.dagger.SysUISingleton;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-/**
- * Some CarNavigationButtons can be associated to a {@link RoleManager} role. When they are, it is
- * possible to have them display the icon of the default application (role holder) for the given
- * role.
- *
- * This class monitors the current role holders for each role type and updates the button icon for
- * this buttons with have this feature enabled.
- */
-@SysUISingleton
-public class ButtonRoleHolderController {
-    private static final String TAG = "ButtonRoleHolderController";
-
-    private final Context mContext;
-    private final PackageManager mPackageManager;
-    private final RoleManager mRoleManager;
-    private final CarDeviceProvisionedController mDeviceController;
-    private final Map<String, CarNavigationButton> mButtonMap = new HashMap<>();
-    private final OnRoleHoldersChangedListener mListener = this::onRoleChanged;
-    private boolean mRegistered;
-
-    @Inject
-    public ButtonRoleHolderController(Context context, PackageManager packageManager,
-            RoleManager roleManager, CarDeviceProvisionedController deviceController) {
-        mContext = context;
-        mPackageManager = packageManager;
-        mRoleManager = roleManager;
-        mDeviceController = deviceController;
-    }
-
-    /**
-     * Iterate through a view looking for CarNavigationButton and add it to this controller if it
-     * opted to be associated with a {@link RoleManager} role type.
-     *
-     * @param v the View that may contain CarFacetButtons
-     */
-    void addAllButtonsWithRoleName(View v) {
-        if (v instanceof CarNavigationButton) {
-            CarNavigationButton button = (CarNavigationButton) v;
-            String roleName = button.getRoleName();
-            if (roleName != null && button.isDefaultAppIconForRoleEnabled()) {
-                addButtonWithRoleName(button, roleName);
-            }
-        } else if (v instanceof ViewGroup) {
-            ViewGroup viewGroup = (ViewGroup) v;
-            for (int i = 0; i < viewGroup.getChildCount(); i++) {
-                addAllButtonsWithRoleName(viewGroup.getChildAt(i));
-            }
-        }
-    }
-
-    private void addButtonWithRoleName(CarNavigationButton button, String roleName) {
-        mButtonMap.put(roleName, button);
-        updateIcon(roleName);
-        if (!mRegistered) {
-            mRoleManager.addOnRoleHoldersChangedListenerAsUser(mContext.getMainExecutor(),
-                    mListener, UserHandle.ALL);
-            mRegistered = true;
-        }
-    }
-
-    void removeAll() {
-        mButtonMap.clear();
-        if (mRegistered) {
-            mRoleManager.removeOnRoleHoldersChangedListenerAsUser(mListener, UserHandle.ALL);
-            mRegistered = false;
-        }
-    }
-
-    @VisibleForTesting
-    void onRoleChanged(String roleName, UserHandle user) {
-        if (RoleManager.ROLE_ASSISTANT.equals(roleName)
-                && user.getIdentifier() == mDeviceController.getCurrentUser()) {
-            updateIcon(roleName);
-        }
-    }
-
-    private void updateIcon(String roleName) {
-        CarNavigationButton button = mButtonMap.get(roleName);
-        if (button == null) {
-            return;
-        }
-        List<String> holders = mRoleManager.getRoleHoldersAsUser(button.getRoleName(),
-                UserHandle.of(mDeviceController.getCurrentUser()));
-        if (holders == null || holders.isEmpty()) {
-            button.setAppIcon(null);
-        } else {
-            button.setAppIcon(loadIcon(holders.get(0)));
-        }
-    }
-
-    @Nullable
-    private Drawable loadIcon(String packageName) {
-        try {
-            ApplicationInfo appInfo = mPackageManager.getApplicationInfo(packageName,
-                    PackageManager.MATCH_ANY_USER);
-            return appInfo.loadIcon(mPackageManager);
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(ButtonRoleHolderController.TAG, "Package not found: " + packageName, e);
-            return null;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateController.java
deleted file mode 100644
index 2dc4756..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateController.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import android.app.ActivityTaskManager.RootTaskInfo;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.view.Display;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.systemui.dagger.SysUISingleton;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.inject.Inject;
-
-/**
- * CarNavigationButtons can optionally have selection state that toggles certain visual indications
- * based on whether the active application on screen is associated with it. This is basically a
- * similar concept to a radio button group.
- *
- * This class controls the selection state of CarNavigationButtons that have opted in to have such
- * selection state-dependent visual indications.
- */
-@SysUISingleton
-public class ButtonSelectionStateController {
-
-    private final Set<CarNavigationButton> mRegisteredViews = new HashSet<>();
-
-    protected ButtonMap mButtonsByCategory = new ButtonMap();
-    protected ButtonMap mButtonsByPackage = new ButtonMap();
-    protected ButtonMap mButtonsByComponentName = new ButtonMap();
-    protected HashSet<CarNavigationButton> mSelectedButtons;
-    protected Context mContext;
-
-    @Inject
-    public ButtonSelectionStateController(Context context) {
-        mContext = context;
-        mSelectedButtons = new HashSet<>();
-    }
-
-    /**
-     * Iterate through a view looking for CarNavigationButton and add it to the controller if it
-     * opted in to be highlighted when the active application is associated with it.
-     *
-     * @param v the View that may contain CarFacetButtons
-     */
-    protected void addAllButtonsWithSelectionState(View v) {
-        if (v instanceof CarNavigationButton) {
-            if (((CarNavigationButton) v).hasSelectionState()) {
-                addButtonWithSelectionState((CarNavigationButton) v);
-            }
-        } else if (v instanceof ViewGroup) {
-            ViewGroup viewGroup = (ViewGroup) v;
-            for (int i = 0; i < viewGroup.getChildCount(); i++) {
-                addAllButtonsWithSelectionState(viewGroup.getChildAt(i));
-            }
-        }
-    }
-
-    /** Removes all buttons from the button maps. */
-    protected void removeAll() {
-        mButtonsByCategory.clear();
-        mButtonsByPackage.clear();
-        mButtonsByComponentName.clear();
-        mSelectedButtons.clear();
-        mRegisteredViews.clear();
-    }
-
-    /**
-     * This will unselect the currently selected CarNavigationButton and determine which one should
-     * be selected next. It does this by reading the properties on the CarNavigationButton and
-     * seeing if they are a match with the supplied StackInfo list.
-     * The order of selection detection is ComponentName, PackageName then Category
-     * They will then be compared with the supplied StackInfo list.
-     * The StackInfo is expected to be supplied in order of recency and StackInfo will only be used
-     * for consideration if it has the same displayId as the CarNavigationButton.
-     *
-     * @param taskInfoList of the currently running application
-     * @param validDisplay index of the valid display
-     */
-
-    protected void taskChanged(List<RootTaskInfo> taskInfoList, int validDisplay) {
-        RootTaskInfo validTaskInfo = null;
-        for (RootTaskInfo taskInfo : taskInfoList) {
-            // Find the first stack info with a topActivity in the primary display.
-            // TODO: We assume that CarFacetButton will launch an app only in the primary display.
-            // We need to extend the functionality to handle the multiple display properly.
-            if (taskInfo.topActivity != null && taskInfo.displayId == validDisplay) {
-                validTaskInfo = taskInfo;
-                break;
-            }
-        }
-
-        if (validTaskInfo == null) {
-            // No stack was found that was on the same display as the buttons thus return
-            return;
-        }
-        int displayId = validTaskInfo.displayId;
-
-        mSelectedButtons.forEach(carNavigationButton -> {
-            if (carNavigationButton.getDisplayId() == displayId) {
-                carNavigationButton.setSelected(false);
-            }
-        });
-        mSelectedButtons.clear();
-
-        HashSet<CarNavigationButton> selectedButtons = findSelectedButtons(validTaskInfo);
-
-        if (selectedButtons != null) {
-            selectedButtons.forEach(carNavigationButton -> {
-                if (carNavigationButton.getDisplayId() == displayId) {
-                    carNavigationButton.setSelected(true);
-                    mSelectedButtons.add(carNavigationButton);
-                }
-            });
-        }
-    }
-
-    /**
-     * Defaults to Display.DEFAULT_DISPLAY when no parameter is provided for the validDisplay.
-     *
-     * @param taskInfoList
-     */
-    protected void taskChanged(List<RootTaskInfo> taskInfoList) {
-        taskChanged(taskInfoList, Display.DEFAULT_DISPLAY);
-    }
-
-    /**
-     * Add navigation button to this controller if it uses selection state.
-     */
-    private void addButtonWithSelectionState(CarNavigationButton carNavigationButton) {
-        if (mRegisteredViews.contains(carNavigationButton)) {
-            return;
-        }
-        String[] categories = carNavigationButton.getCategories();
-        for (int i = 0; i < categories.length; i++) {
-            mButtonsByCategory.add(categories[i], carNavigationButton);
-        }
-
-        String[] packages = carNavigationButton.getPackages();
-        for (int i = 0; i < packages.length; i++) {
-            mButtonsByPackage.add(packages[i], carNavigationButton);
-        }
-        String[] componentNames = carNavigationButton.getComponentName();
-        for (int i = 0; i < componentNames.length; i++) {
-            mButtonsByComponentName.add(componentNames[i], carNavigationButton);
-        }
-
-        mRegisteredViews.add(carNavigationButton);
-    }
-
-    private HashSet<CarNavigationButton> findSelectedButtons(RootTaskInfo validTaskInfo) {
-        String packageName = validTaskInfo.topActivity.getPackageName();
-
-        HashSet<CarNavigationButton> selectedButtons =
-                findButtonsByComponentName(validTaskInfo.topActivity);
-        if (selectedButtons == null) {
-            selectedButtons = mButtonsByPackage.get(packageName);
-        }
-        if (selectedButtons == null) {
-            String category = getPackageCategory(packageName);
-            if (category != null) {
-                selectedButtons = mButtonsByCategory.get(category);
-            }
-        }
-
-        return selectedButtons;
-    }
-
-    private HashSet<CarNavigationButton> findButtonsByComponentName(
-            ComponentName componentName) {
-        HashSet<CarNavigationButton> buttons =
-                mButtonsByComponentName.get(componentName.flattenToShortString());
-        return (buttons != null) ? buttons :
-                mButtonsByComponentName.get(componentName.flattenToString());
-    }
-
-    private String getPackageCategory(String packageName) {
-        PackageManager pm = mContext.getPackageManager();
-        Set<String> supportedCategories = mButtonsByCategory.keySet();
-        for (String category : supportedCategories) {
-            Intent intent = new Intent();
-            intent.setPackage(packageName);
-            intent.setAction(Intent.ACTION_MAIN);
-            intent.addCategory(category);
-            List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
-            if (list.size() > 0) {
-                // Cache this package name into ButtonsByPackage map, so we won't have to query
-                // all categories next time this package name shows up.
-                mButtonsByPackage.put(packageName, mButtonsByCategory.get(category));
-                return category;
-            }
-        }
-        return null;
-    }
-
-    // simple multi-map
-    private static class ButtonMap extends HashMap<String, HashSet<CarNavigationButton>> {
-
-        public boolean add(String key, CarNavigationButton value) {
-            if (containsKey(key)) {
-                return get(key).add(value);
-            }
-            HashSet<CarNavigationButton> set = new HashSet<>();
-            set.add(value);
-            put(key, set);
-            return true;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateListener.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateListener.java
deleted file mode 100644
index f74bd4f..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateListener.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import android.app.ActivityTaskManager;
-import android.util.Log;
-
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.shared.system.TaskStackChangeListener;
-
-import javax.inject.Inject;
-
-/**
- * An implementation of TaskStackChangeListener, that listens for changes in the system
- * task stack and notifies the navigation bar.
- */
-@SysUISingleton
-class ButtonSelectionStateListener extends TaskStackChangeListener {
-    private static final String TAG = ButtonSelectionStateListener.class.getSimpleName();
-
-    private final ButtonSelectionStateController mButtonSelectionStateController;
-
-    @Inject
-    ButtonSelectionStateListener(ButtonSelectionStateController carNavigationButtonController) {
-        mButtonSelectionStateController = carNavigationButtonController;
-    }
-
-    @Override
-    public void onTaskStackChanged() {
-        try {
-            mButtonSelectionStateController.taskChanged(
-                    ActivityTaskManager.getService().getAllRootTaskInfos());
-        } catch (Exception e) {
-            Log.e(TAG, "Getting RootTaskInfo from activity task manager failed", e);
-        }
-    }
-
-    @Override
-    public void onTaskDisplayChanged(int taskId, int newDisplayId) {
-        try {
-            mButtonSelectionStateController.taskChanged(
-                    ActivityTaskManager.getService().getAllRootTaskInfos());
-        } catch (Exception e) {
-            Log.e(TAG, "Getting RootTaskInfo from activity task manager failed", e);
-        }
-
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java
deleted file mode 100644
index c7db3f6..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java
+++ /dev/null
@@ -1,590 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
-import static android.view.InsetsState.ITYPE_STATUS_BAR;
-import static android.view.InsetsState.containsType;
-import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
-
-import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
-import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.inputmethodservice.InputMethodService;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.view.Display;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowInsetsController;
-import android.view.WindowManager;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.internal.statusbar.IStatusBarService;
-import com.android.internal.statusbar.RegisterStatusBarResult;
-import com.android.internal.view.AppearanceRegion;
-import com.android.systemui.SystemUI;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarDeviceProvisionedListener;
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.dagger.qualifiers.UiBackground;
-import com.android.systemui.plugins.DarkIconDispatcher;
-import com.android.systemui.shared.system.ActivityManagerWrapper;
-import com.android.systemui.statusbar.AutoHideUiElement;
-import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.phone.AutoHideController;
-import com.android.systemui.statusbar.phone.BarTransitions;
-import com.android.systemui.statusbar.phone.LightBarController;
-import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-import com.android.systemui.statusbar.phone.StatusBarSignalPolicy;
-import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.concurrent.Executor;
-
-import javax.inject.Inject;
-
-import dagger.Lazy;
-
-/** Navigation bars customized for the automotive use case. */
-public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks {
-    private final Resources mResources;
-    private final CarNavigationBarController mCarNavigationBarController;
-    private final SysuiDarkIconDispatcher mStatusBarIconController;
-    private final WindowManager mWindowManager;
-    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
-    private final CommandQueue mCommandQueue;
-    private final AutoHideController mAutoHideController;
-    private final ButtonSelectionStateListener mButtonSelectionStateListener;
-    private final Handler mMainHandler;
-    private final Executor mUiBgExecutor;
-    private final IStatusBarService mBarService;
-    private final Lazy<KeyguardStateController> mKeyguardStateControllerLazy;
-    private final Lazy<PhoneStatusBarPolicy> mIconPolicyLazy;
-    private final Lazy<StatusBarIconController> mIconControllerLazy;
-
-    private final int mDisplayId;
-    private final SystemBarConfigs mSystemBarConfigs;
-
-    private StatusBarSignalPolicy mSignalPolicy;
-    private ActivityManagerWrapper mActivityManagerWrapper;
-
-    // If the nav bar should be hidden when the soft keyboard is visible.
-    private boolean mHideTopBarForKeyboard;
-    private boolean mHideLeftBarForKeyboard;
-    private boolean mHideRightBarForKeyboard;
-    private boolean mHideBottomBarForKeyboard;
-
-    private boolean mBottomNavBarVisible;
-
-    // Nav bar views.
-    private ViewGroup mTopNavigationBarWindow;
-    private ViewGroup mBottomNavigationBarWindow;
-    private ViewGroup mLeftNavigationBarWindow;
-    private ViewGroup mRightNavigationBarWindow;
-    private CarNavigationBarView mTopNavigationBarView;
-    private CarNavigationBarView mBottomNavigationBarView;
-    private CarNavigationBarView mLeftNavigationBarView;
-    private CarNavigationBarView mRightNavigationBarView;
-
-    // To be attached to the navigation bars such that they can close the notification panel if
-    // it's open.
-    private boolean mDeviceIsSetUpForUser = true;
-    private boolean mIsUserSetupInProgress = false;
-
-    private AppearanceRegion[] mAppearanceRegions = new AppearanceRegion[0];
-    @BarTransitions.TransitionMode
-    private int mStatusBarMode;
-    @BarTransitions.TransitionMode
-    private int mNavigationBarMode;
-    private boolean mStatusBarTransientShown;
-    private boolean mNavBarTransientShown;
-
-    @Inject
-    public CarNavigationBar(Context context,
-            @Main Resources resources,
-            CarNavigationBarController carNavigationBarController,
-            // TODO(b/156052638): Should not need to inject LightBarController
-            LightBarController lightBarController,
-            DarkIconDispatcher darkIconDispatcher,
-            WindowManager windowManager,
-            CarDeviceProvisionedController deviceProvisionedController,
-            CommandQueue commandQueue,
-            AutoHideController autoHideController,
-            ButtonSelectionStateListener buttonSelectionStateListener,
-            @Main Handler mainHandler,
-            @UiBackground Executor uiBgExecutor,
-            IStatusBarService barService,
-            Lazy<KeyguardStateController> keyguardStateControllerLazy,
-            Lazy<PhoneStatusBarPolicy> iconPolicyLazy,
-            Lazy<StatusBarIconController> iconControllerLazy,
-            SystemBarConfigs systemBarConfigs
-    ) {
-        super(context);
-        mResources = resources;
-        mCarNavigationBarController = carNavigationBarController;
-        mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher;
-        mWindowManager = windowManager;
-        mCarDeviceProvisionedController = deviceProvisionedController;
-        mCommandQueue = commandQueue;
-        mAutoHideController = autoHideController;
-        mButtonSelectionStateListener = buttonSelectionStateListener;
-        mMainHandler = mainHandler;
-        mUiBgExecutor = uiBgExecutor;
-        mBarService = barService;
-        mKeyguardStateControllerLazy = keyguardStateControllerLazy;
-        mIconPolicyLazy = iconPolicyLazy;
-        mIconControllerLazy = iconControllerLazy;
-        mSystemBarConfigs = systemBarConfigs;
-
-        mDisplayId = context.getDisplayId();
-    }
-
-    @Override
-    public void start() {
-        // Set initial state.
-        mHideTopBarForKeyboard = mSystemBarConfigs.getHideForKeyboardBySide(SystemBarConfigs.TOP);
-        mHideBottomBarForKeyboard = mSystemBarConfigs.getHideForKeyboardBySide(
-                SystemBarConfigs.BOTTOM);
-        mHideLeftBarForKeyboard = mSystemBarConfigs.getHideForKeyboardBySide(SystemBarConfigs.LEFT);
-        mHideRightBarForKeyboard = mSystemBarConfigs.getHideForKeyboardBySide(
-                SystemBarConfigs.RIGHT);
-
-        mBottomNavBarVisible = false;
-
-        // Connect into the status bar manager service
-        mCommandQueue.addCallback(this);
-
-        RegisterStatusBarResult result = null;
-        try {
-            result = mBarService.registerStatusBar(mCommandQueue);
-        } catch (RemoteException ex) {
-            ex.rethrowFromSystemServer();
-        }
-
-        onSystemBarAppearanceChanged(mDisplayId, result.mAppearance, result.mAppearanceRegions,
-                result.mNavbarColorManagedByIme);
-
-        // StatusBarManagerService has a back up of IME token and it's restored here.
-        setImeWindowStatus(mDisplayId, result.mImeToken, result.mImeWindowVis,
-                result.mImeBackDisposition, result.mShowImeSwitcher);
-
-        // Set up the initial icon state
-        int numIcons = result.mIcons.size();
-        for (int i = 0; i < numIcons; i++) {
-            mCommandQueue.setIcon(result.mIcons.keyAt(i), result.mIcons.valueAt(i));
-        }
-
-        mAutoHideController.setStatusBar(new AutoHideUiElement() {
-            @Override
-            public void synchronizeState() {
-                // No op.
-            }
-
-            @Override
-            public boolean isVisible() {
-                return mStatusBarTransientShown;
-            }
-
-            @Override
-            public void hide() {
-                clearTransient();
-            }
-        });
-
-        mAutoHideController.setNavigationBar(new AutoHideUiElement() {
-            @Override
-            public void synchronizeState() {
-                // No op.
-            }
-
-            @Override
-            public boolean isVisible() {
-                return mNavBarTransientShown;
-            }
-
-            @Override
-            public void hide() {
-                clearTransient();
-            }
-        });
-
-        mDeviceIsSetUpForUser = mCarDeviceProvisionedController.isCurrentUserSetup();
-        mIsUserSetupInProgress = mCarDeviceProvisionedController.isCurrentUserSetupInProgress();
-        mCarDeviceProvisionedController.addCallback(
-                new CarDeviceProvisionedListener() {
-                    @Override
-                    public void onUserSetupInProgressChanged() {
-                        mMainHandler.post(() -> restartNavBarsIfNecessary());
-                    }
-
-                    @Override
-                    public void onUserSetupChanged() {
-                        mMainHandler.post(() -> restartNavBarsIfNecessary());
-                    }
-
-                    @Override
-                    public void onUserSwitched() {
-                        mMainHandler.post(() -> restartNavBarsIfNecessary());
-                    }
-                });
-
-        createNavigationBar(result);
-
-        mActivityManagerWrapper = ActivityManagerWrapper.getInstance();
-        mActivityManagerWrapper.registerTaskStackListener(mButtonSelectionStateListener);
-
-        mUiBgExecutor.execute(mCarNavigationBarController::connectToHvac);
-
-        // Lastly, call to the icon policy to install/update all the icons.
-        // Must be called on the main thread due to the use of observeForever() in
-        // mIconPolicy.init().
-        mMainHandler.post(() -> {
-            mIconPolicyLazy.get().init();
-            mSignalPolicy = new StatusBarSignalPolicy(mContext, mIconControllerLazy.get());
-        });
-    }
-
-    private void restartNavBarsIfNecessary() {
-        boolean currentUserSetup = mCarDeviceProvisionedController.isCurrentUserSetup();
-        boolean currentUserSetupInProgress = mCarDeviceProvisionedController
-                .isCurrentUserSetupInProgress();
-        if (mIsUserSetupInProgress != currentUserSetupInProgress
-                || mDeviceIsSetUpForUser != currentUserSetup) {
-            mDeviceIsSetUpForUser = currentUserSetup;
-            mIsUserSetupInProgress = currentUserSetupInProgress;
-            restartNavBars();
-        }
-    }
-
-    /**
-     * Remove all content from navbars and rebuild them. Used to allow for different nav bars
-     * before and after the device is provisioned. . Also for change of density and font size.
-     */
-    private void restartNavBars() {
-        // remove and reattach all components such that we don't keep a reference to unused ui
-        // elements
-        mCarNavigationBarController.removeAll();
-
-        if (mTopNavigationBarWindow != null) {
-            mTopNavigationBarWindow.removeAllViews();
-            mTopNavigationBarView = null;
-        }
-
-        if (mBottomNavigationBarWindow != null) {
-            mBottomNavigationBarWindow.removeAllViews();
-            mBottomNavigationBarView = null;
-        }
-
-        if (mLeftNavigationBarWindow != null) {
-            mLeftNavigationBarWindow.removeAllViews();
-            mLeftNavigationBarView = null;
-        }
-
-        if (mRightNavigationBarWindow != null) {
-            mRightNavigationBarWindow.removeAllViews();
-            mRightNavigationBarView = null;
-        }
-
-        buildNavBarContent();
-        // If the UI was rebuilt (day/night change or user change) while the keyguard was up we need
-        // to correctly respect that state.
-        if (mKeyguardStateControllerLazy.get().isShowing()) {
-            mCarNavigationBarController.showAllKeyguardButtons(isDeviceSetupForUser());
-        } else {
-            mCarNavigationBarController.hideAllKeyguardButtons(isDeviceSetupForUser());
-        }
-
-        // Upon restarting the Navigation Bar, CarFacetButtonController should immediately apply the
-        // selection state that reflects the current task stack.
-        mButtonSelectionStateListener.onTaskStackChanged();
-    }
-
-    private boolean isDeviceSetupForUser() {
-        return mDeviceIsSetUpForUser && !mIsUserSetupInProgress;
-    }
-
-    private void createNavigationBar(RegisterStatusBarResult result) {
-        buildNavBarWindows();
-        buildNavBarContent();
-        attachNavBarWindows();
-
-        // Try setting up the initial state of the nav bar if applicable.
-        if (result != null) {
-            setImeWindowStatus(Display.DEFAULT_DISPLAY, result.mImeToken,
-                    result.mImeWindowVis, result.mImeBackDisposition,
-                    result.mShowImeSwitcher);
-        }
-    }
-
-    private void buildNavBarWindows() {
-        mTopNavigationBarWindow = mCarNavigationBarController.getTopWindow();
-        mBottomNavigationBarWindow = mCarNavigationBarController.getBottomWindow();
-        mLeftNavigationBarWindow = mCarNavigationBarController.getLeftWindow();
-        mRightNavigationBarWindow = mCarNavigationBarController.getRightWindow();
-    }
-
-    private void buildNavBarContent() {
-        mTopNavigationBarView = mCarNavigationBarController.getTopBar(isDeviceSetupForUser());
-        if (mTopNavigationBarView != null) {
-            mSystemBarConfigs.insetSystemBar(SystemBarConfigs.TOP, mTopNavigationBarView);
-            mSystemBarConfigs.setInsetUpdater(SystemBarConfigs.TOP, mTopNavigationBarView);
-            mTopNavigationBarWindow.addView(mTopNavigationBarView);
-        }
-
-        mBottomNavigationBarView = mCarNavigationBarController.getBottomBar(isDeviceSetupForUser());
-        if (mBottomNavigationBarView != null) {
-            mSystemBarConfigs.insetSystemBar(SystemBarConfigs.BOTTOM, mBottomNavigationBarView);
-            mSystemBarConfigs.setInsetUpdater(SystemBarConfigs.BOTTOM, mBottomNavigationBarView);
-            mBottomNavigationBarWindow.addView(mBottomNavigationBarView);
-        }
-
-        mLeftNavigationBarView = mCarNavigationBarController.getLeftBar(isDeviceSetupForUser());
-        if (mLeftNavigationBarView != null) {
-            mSystemBarConfigs.insetSystemBar(SystemBarConfigs.LEFT, mLeftNavigationBarView);
-            mSystemBarConfigs.setInsetUpdater(SystemBarConfigs.LEFT, mLeftNavigationBarView);
-            mLeftNavigationBarWindow.addView(mLeftNavigationBarView);
-        }
-
-        mRightNavigationBarView = mCarNavigationBarController.getRightBar(isDeviceSetupForUser());
-        if (mRightNavigationBarView != null) {
-            mSystemBarConfigs.insetSystemBar(SystemBarConfigs.RIGHT, mRightNavigationBarView);
-            mSystemBarConfigs.setInsetUpdater(SystemBarConfigs.RIGHT, mRightNavigationBarView);
-            mRightNavigationBarWindow.addView(mRightNavigationBarView);
-        }
-    }
-
-    private void attachNavBarWindows() {
-        mSystemBarConfigs.getSystemBarSidesByZOrder().forEach(this::attachNavBarBySide);
-    }
-
-    private void attachNavBarBySide(int side) {
-        switch (side) {
-            case SystemBarConfigs.TOP:
-                if (mTopNavigationBarWindow != null) {
-                    mWindowManager.addView(mTopNavigationBarWindow,
-                            mSystemBarConfigs.getLayoutParamsBySide(SystemBarConfigs.TOP));
-                }
-                break;
-            case SystemBarConfigs.BOTTOM:
-                if (mBottomNavigationBarWindow != null && !mBottomNavBarVisible) {
-                    mBottomNavBarVisible = true;
-
-                    mWindowManager.addView(mBottomNavigationBarWindow,
-                            mSystemBarConfigs.getLayoutParamsBySide(SystemBarConfigs.BOTTOM));
-                }
-                break;
-            case SystemBarConfigs.LEFT:
-                if (mLeftNavigationBarWindow != null) {
-                    mWindowManager.addView(mLeftNavigationBarWindow,
-                            mSystemBarConfigs.getLayoutParamsBySide(SystemBarConfigs.LEFT));
-                }
-                break;
-            case SystemBarConfigs.RIGHT:
-                if (mRightNavigationBarWindow != null) {
-                    mWindowManager.addView(mRightNavigationBarWindow,
-                            mSystemBarConfigs.getLayoutParamsBySide(SystemBarConfigs.RIGHT));
-                }
-                break;
-            default:
-                return;
-        }
-    }
-
-    /**
-     * We register for soft keyboard visibility events such that we can hide the navigation bar
-     * giving more screen space to the IME. Note: this is optional and controlled by
-     * {@code com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard}.
-     */
-    @Override
-    public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
-            boolean showImeSwitcher) {
-        if (mContext.getDisplayId() != displayId) {
-            return;
-        }
-
-        boolean isKeyboardVisible = (vis & InputMethodService.IME_VISIBLE) != 0;
-
-        if (mHideTopBarForKeyboard) {
-            mCarNavigationBarController.setTopWindowVisibility(
-                    isKeyboardVisible ? View.GONE : View.VISIBLE);
-        }
-
-        if (mHideBottomBarForKeyboard) {
-            mCarNavigationBarController.setBottomWindowVisibility(
-                    isKeyboardVisible ? View.GONE : View.VISIBLE);
-        }
-
-        if (mHideLeftBarForKeyboard) {
-            mCarNavigationBarController.setLeftWindowVisibility(
-                    isKeyboardVisible ? View.GONE : View.VISIBLE);
-        }
-        if (mHideRightBarForKeyboard) {
-            mCarNavigationBarController.setRightWindowVisibility(
-                    isKeyboardVisible ? View.GONE : View.VISIBLE);
-        }
-    }
-
-    @Override
-    public void onSystemBarAppearanceChanged(
-            int displayId,
-            @WindowInsetsController.Appearance int appearance,
-            AppearanceRegion[] appearanceRegions,
-            boolean navbarColorManagedByIme) {
-        if (displayId != mDisplayId) {
-            return;
-        }
-        boolean barModeChanged = updateStatusBarMode(
-                mStatusBarTransientShown ? MODE_SEMI_TRANSPARENT : MODE_TRANSPARENT);
-        int numStacks = appearanceRegions.length;
-        boolean stackAppearancesChanged = mAppearanceRegions.length != numStacks;
-        for (int i = 0; i < numStacks && !stackAppearancesChanged; i++) {
-            stackAppearancesChanged |= !appearanceRegions[i].equals(mAppearanceRegions[i]);
-        }
-        if (stackAppearancesChanged || barModeChanged) {
-            mAppearanceRegions = appearanceRegions;
-            updateStatusBarAppearance();
-        }
-    }
-
-    private void updateStatusBarAppearance() {
-        int numStacks = mAppearanceRegions.length;
-        int numLightStacks = 0;
-
-        // We can only have maximum one light stack.
-        int indexLightStack = -1;
-
-        for (int i = 0; i < numStacks; i++) {
-            if (isLight(mAppearanceRegions[i].getAppearance())) {
-                numLightStacks++;
-                indexLightStack = i;
-            }
-        }
-
-        // If all stacks are light, all icons become dark.
-        if (numLightStacks == numStacks) {
-            mStatusBarIconController.setIconsDarkArea(null);
-            mStatusBarIconController.getTransitionsController().setIconsDark(
-                    /* dark= */ true, /* animate= */ false);
-        } else if (numLightStacks == 0) {
-            // If no one is light, all icons become white.
-            mStatusBarIconController.getTransitionsController().setIconsDark(
-                    /* dark= */ false, /* animate= */ false);
-        } else {
-            // Not the same for every stack, update icons in area only.
-            mStatusBarIconController.setIconsDarkArea(
-                    mAppearanceRegions[indexLightStack].getBounds());
-            mStatusBarIconController.getTransitionsController().setIconsDark(
-                    /* dark= */ true, /* animate= */ false);
-        }
-    }
-
-    private static boolean isLight(int appearance) {
-        return (appearance & APPEARANCE_LIGHT_STATUS_BARS) != 0;
-    }
-
-    @Override
-    public void showTransient(int displayId, int[] types) {
-        if (displayId != mDisplayId) {
-            return;
-        }
-        if (containsType(types, ITYPE_STATUS_BAR)) {
-            if (!mStatusBarTransientShown) {
-                mStatusBarTransientShown = true;
-                handleTransientChanged();
-            }
-        }
-        if (containsType(types, ITYPE_NAVIGATION_BAR)) {
-            if (!mNavBarTransientShown) {
-                mNavBarTransientShown = true;
-                handleTransientChanged();
-            }
-        }
-    }
-
-    @Override
-    public void abortTransient(int displayId, int[] types) {
-        if (displayId != mDisplayId) {
-            return;
-        }
-        if (!containsType(types, ITYPE_STATUS_BAR) && !containsType(types, ITYPE_NAVIGATION_BAR)) {
-            return;
-        }
-        clearTransient();
-    }
-
-    private void clearTransient() {
-        if (mStatusBarTransientShown) {
-            mStatusBarTransientShown = false;
-            handleTransientChanged();
-        }
-        if (mNavBarTransientShown) {
-            mNavBarTransientShown = false;
-            handleTransientChanged();
-        }
-    }
-
-    @VisibleForTesting
-    boolean isStatusBarTransientShown() {
-        return mStatusBarTransientShown;
-    }
-
-    @VisibleForTesting
-    boolean isNavBarTransientShown() {
-        return mNavBarTransientShown;
-    }
-
-    @Override
-    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        pw.print("  mTaskStackListener=");
-        pw.println(mButtonSelectionStateListener);
-        pw.print("  mBottomNavigationBarView=");
-        pw.println(mBottomNavigationBarView);
-    }
-
-    private void handleTransientChanged() {
-        updateStatusBarMode(mStatusBarTransientShown ? MODE_SEMI_TRANSPARENT : MODE_TRANSPARENT);
-        updateNavBarMode(mNavBarTransientShown ? MODE_SEMI_TRANSPARENT : MODE_TRANSPARENT);
-    }
-
-    // Returns true if the status bar mode has changed.
-    private boolean updateStatusBarMode(int barMode) {
-        if (mStatusBarMode != barMode) {
-            mStatusBarMode = barMode;
-            mAutoHideController.touchAutoHide();
-            return true;
-        }
-        return false;
-    }
-
-    // Returns true if the nav bar mode has changed.
-    private boolean updateNavBarMode(int barMode) {
-        if (mNavigationBarMode != barMode) {
-            mNavigationBarMode = barMode;
-            mAutoHideController.touchAutoHide();
-            return true;
-        }
-        return false;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java
deleted file mode 100644
index 4fb5220..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import android.content.Context;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.annotation.Nullable;
-
-import com.android.systemui.car.hvac.HvacController;
-import com.android.systemui.car.statusbar.UserNameViewController;
-import com.android.systemui.dagger.SysUISingleton;
-
-import javax.inject.Inject;
-
-import dagger.Lazy;
-
-/** A single class which controls the navigation bar views. */
-@SysUISingleton
-public class CarNavigationBarController {
-
-    private final Context mContext;
-    private final NavigationBarViewFactory mNavigationBarViewFactory;
-    private final ButtonSelectionStateController mButtonSelectionStateController;
-    private final ButtonRoleHolderController mButtonRoleHolderController;
-    private final Lazy<HvacController> mHvacControllerLazy;
-    private final Lazy<UserNameViewController> mUserNameViewControllerLazy;
-
-    private boolean mShowTop;
-    private boolean mShowBottom;
-    private boolean mShowLeft;
-    private boolean mShowRight;
-
-    private View.OnTouchListener mTopBarTouchListener;
-    private View.OnTouchListener mBottomBarTouchListener;
-    private View.OnTouchListener mLeftBarTouchListener;
-    private View.OnTouchListener mRightBarTouchListener;
-    private NotificationsShadeController mNotificationsShadeController;
-
-    private CarNavigationBarView mTopView;
-    private CarNavigationBarView mBottomView;
-    private CarNavigationBarView mLeftView;
-    private CarNavigationBarView mRightView;
-
-    @Inject
-    public CarNavigationBarController(Context context,
-            NavigationBarViewFactory navigationBarViewFactory,
-            ButtonSelectionStateController buttonSelectionStateController,
-            Lazy<HvacController> hvacControllerLazy,
-            Lazy<UserNameViewController> userNameViewControllerLazy,
-            ButtonRoleHolderController buttonRoleHolderController,
-            SystemBarConfigs systemBarConfigs) {
-        mContext = context;
-        mNavigationBarViewFactory = navigationBarViewFactory;
-        mButtonSelectionStateController = buttonSelectionStateController;
-        mHvacControllerLazy = hvacControllerLazy;
-        mUserNameViewControllerLazy = userNameViewControllerLazy;
-        mButtonRoleHolderController = buttonRoleHolderController;
-
-        // Read configuration.
-        mShowTop = systemBarConfigs.getEnabledStatusBySide(SystemBarConfigs.TOP);
-        mShowBottom = systemBarConfigs.getEnabledStatusBySide(SystemBarConfigs.BOTTOM);
-        mShowLeft = systemBarConfigs.getEnabledStatusBySide(SystemBarConfigs.LEFT);
-        mShowRight = systemBarConfigs.getEnabledStatusBySide(SystemBarConfigs.RIGHT);
-    }
-
-    /**
-     * Hides all system bars.
-     */
-    public void hideBars() {
-        setTopWindowVisibility(View.GONE);
-        setBottomWindowVisibility(View.GONE);
-        setLeftWindowVisibility(View.GONE);
-        setRightWindowVisibility(View.GONE);
-    }
-
-    /**
-     * Shows all system bars.
-     */
-    public void showBars() {
-        setTopWindowVisibility(View.VISIBLE);
-        setBottomWindowVisibility(View.VISIBLE);
-        setLeftWindowVisibility(View.VISIBLE);
-        setRightWindowVisibility(View.VISIBLE);
-    }
-
-    /** Connect to hvac service. */
-    public void connectToHvac() {
-        mHvacControllerLazy.get().connectToCarService();
-    }
-
-    /** Clean up */
-    public void removeAll() {
-        mHvacControllerLazy.get().removeAllComponents();
-        mButtonSelectionStateController.removeAll();
-        mButtonRoleHolderController.removeAll();
-        mUserNameViewControllerLazy.get().removeAll();
-    }
-
-    /** Gets the top window if configured to do so. */
-    @Nullable
-    public ViewGroup getTopWindow() {
-        return mShowTop ? mNavigationBarViewFactory.getTopWindow() : null;
-    }
-
-    /** Gets the bottom window if configured to do so. */
-    @Nullable
-    public ViewGroup getBottomWindow() {
-        return mShowBottom ? mNavigationBarViewFactory.getBottomWindow() : null;
-    }
-
-    /** Gets the left window if configured to do so. */
-    @Nullable
-    public ViewGroup getLeftWindow() {
-        return mShowLeft ? mNavigationBarViewFactory.getLeftWindow() : null;
-    }
-
-    /** Gets the right window if configured to do so. */
-    @Nullable
-    public ViewGroup getRightWindow() {
-        return mShowRight ? mNavigationBarViewFactory.getRightWindow() : null;
-    }
-
-    /** Toggles the top nav bar visibility. */
-    public boolean setTopWindowVisibility(@View.Visibility int visibility) {
-        return setWindowVisibility(getTopWindow(), visibility);
-    }
-
-    /** Toggles the bottom nav bar visibility. */
-    public boolean setBottomWindowVisibility(@View.Visibility int visibility) {
-        return setWindowVisibility(getBottomWindow(), visibility);
-    }
-
-    /** Toggles the left nav bar visibility. */
-    public boolean setLeftWindowVisibility(@View.Visibility int visibility) {
-        return setWindowVisibility(getLeftWindow(), visibility);
-    }
-
-    /** Toggles the right nav bar visibility. */
-    public boolean setRightWindowVisibility(@View.Visibility int visibility) {
-        return setWindowVisibility(getRightWindow(), visibility);
-    }
-
-    private boolean setWindowVisibility(ViewGroup window, @View.Visibility int visibility) {
-        if (window == null) {
-            return false;
-        }
-
-        if (window.getVisibility() == visibility) {
-            return false;
-        }
-
-        window.setVisibility(visibility);
-        return true;
-    }
-
-    /** Gets the top navigation bar with the appropriate listeners set. */
-    @Nullable
-    public CarNavigationBarView getTopBar(boolean isSetUp) {
-        if (!mShowTop) {
-            return null;
-        }
-
-        mTopView = mNavigationBarViewFactory.getTopBar(isSetUp);
-        setupBar(mTopView, mTopBarTouchListener, mNotificationsShadeController);
-        return mTopView;
-    }
-
-    /** Gets the bottom navigation bar with the appropriate listeners set. */
-    @Nullable
-    public CarNavigationBarView getBottomBar(boolean isSetUp) {
-        if (!mShowBottom) {
-            return null;
-        }
-
-        mBottomView = mNavigationBarViewFactory.getBottomBar(isSetUp);
-        setupBar(mBottomView, mBottomBarTouchListener, mNotificationsShadeController);
-        return mBottomView;
-    }
-
-    /** Gets the left navigation bar with the appropriate listeners set. */
-    @Nullable
-    public CarNavigationBarView getLeftBar(boolean isSetUp) {
-        if (!mShowLeft) {
-            return null;
-        }
-
-        mLeftView = mNavigationBarViewFactory.getLeftBar(isSetUp);
-        setupBar(mLeftView, mLeftBarTouchListener, mNotificationsShadeController);
-        return mLeftView;
-    }
-
-    /** Gets the right navigation bar with the appropriate listeners set. */
-    @Nullable
-    public CarNavigationBarView getRightBar(boolean isSetUp) {
-        if (!mShowRight) {
-            return null;
-        }
-
-        mRightView = mNavigationBarViewFactory.getRightBar(isSetUp);
-        setupBar(mRightView, mRightBarTouchListener, mNotificationsShadeController);
-        return mRightView;
-    }
-
-    private void setupBar(CarNavigationBarView view, View.OnTouchListener statusBarTouchListener,
-            NotificationsShadeController notifShadeController) {
-        view.setStatusBarWindowTouchListener(statusBarTouchListener);
-        view.setNotificationsPanelController(notifShadeController);
-        mButtonSelectionStateController.addAllButtonsWithSelectionState(view);
-        mButtonRoleHolderController.addAllButtonsWithRoleName(view);
-        mHvacControllerLazy.get().addTemperatureViewToController(view);
-        mUserNameViewControllerLazy.get().addUserNameView(view);
-    }
-
-    /** Sets a touch listener for the top navigation bar. */
-    public void registerTopBarTouchListener(View.OnTouchListener listener) {
-        mTopBarTouchListener = listener;
-        if (mTopView != null) {
-            mTopView.setStatusBarWindowTouchListener(mTopBarTouchListener);
-        }
-    }
-
-    /** Sets a touch listener for the bottom navigation bar. */
-    public void registerBottomBarTouchListener(View.OnTouchListener listener) {
-        mBottomBarTouchListener = listener;
-        if (mBottomView != null) {
-            mBottomView.setStatusBarWindowTouchListener(mBottomBarTouchListener);
-        }
-    }
-
-    /** Sets a touch listener for the left navigation bar. */
-    public void registerLeftBarTouchListener(View.OnTouchListener listener) {
-        mLeftBarTouchListener = listener;
-        if (mLeftView != null) {
-            mLeftView.setStatusBarWindowTouchListener(mLeftBarTouchListener);
-        }
-    }
-
-    /** Sets a touch listener for the right navigation bar. */
-    public void registerRightBarTouchListener(View.OnTouchListener listener) {
-        mRightBarTouchListener = listener;
-        if (mRightView != null) {
-            mRightView.setStatusBarWindowTouchListener(mRightBarTouchListener);
-        }
-    }
-
-    /** Sets a notification controller which toggles the notification panel. */
-    public void registerNotificationController(
-            NotificationsShadeController notificationsShadeController) {
-        mNotificationsShadeController = notificationsShadeController;
-        if (mTopView != null) {
-            mTopView.setNotificationsPanelController(mNotificationsShadeController);
-        }
-        if (mBottomView != null) {
-            mBottomView.setNotificationsPanelController(mNotificationsShadeController);
-        }
-        if (mLeftView != null) {
-            mLeftView.setNotificationsPanelController(mNotificationsShadeController);
-        }
-        if (mRightView != null) {
-            mRightView.setNotificationsPanelController(mNotificationsShadeController);
-        }
-    }
-
-    /**
-     * Shows all of the keyguard specific buttons on the valid instances of
-     * {@link CarNavigationBarView}.
-     */
-    public void showAllKeyguardButtons(boolean isSetUp) {
-        checkAllBars(isSetUp);
-        if (mTopView != null) {
-            mTopView.showKeyguardButtons();
-        }
-        if (mBottomView != null) {
-            mBottomView.showKeyguardButtons();
-        }
-        if (mLeftView != null) {
-            mLeftView.showKeyguardButtons();
-        }
-        if (mRightView != null) {
-            mRightView.showKeyguardButtons();
-        }
-    }
-
-    /**
-     * Hides all of the keyguard specific buttons on the valid instances of
-     * {@link CarNavigationBarView}.
-     */
-    public void hideAllKeyguardButtons(boolean isSetUp) {
-        checkAllBars(isSetUp);
-        if (mTopView != null) {
-            mTopView.hideKeyguardButtons();
-        }
-        if (mBottomView != null) {
-            mBottomView.hideKeyguardButtons();
-        }
-        if (mLeftView != null) {
-            mLeftView.hideKeyguardButtons();
-        }
-        if (mRightView != null) {
-            mRightView.hideKeyguardButtons();
-        }
-    }
-
-    /** Toggles whether the notifications icon has an unseen indicator or not. */
-    public void toggleAllNotificationsUnseenIndicator(boolean isSetUp, boolean hasUnseen) {
-        checkAllBars(isSetUp);
-        if (mTopView != null) {
-            mTopView.toggleNotificationUnseenIndicator(hasUnseen);
-        }
-        if (mBottomView != null) {
-            mBottomView.toggleNotificationUnseenIndicator(hasUnseen);
-        }
-        if (mLeftView != null) {
-            mLeftView.toggleNotificationUnseenIndicator(hasUnseen);
-        }
-        if (mRightView != null) {
-            mRightView.toggleNotificationUnseenIndicator(hasUnseen);
-        }
-    }
-
-    /** Interface for controlling the notifications shade. */
-    public interface NotificationsShadeController {
-        /** Toggles the visibility of the notifications shade. */
-        void togglePanel();
-
-        /** Returns {@code true} if the panel is open. */
-        boolean isNotificationPanelOpen();
-    }
-
-    private void checkAllBars(boolean isSetUp) {
-        mTopView = getTopBar(isSetUp);
-        mBottomView = getBottomBar(isSetUp);
-        mLeftView = getLeftBar(isSetUp);
-        mRightView = getRightBar(isSetUp);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarView.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarView.java
deleted file mode 100644
index ab401bb..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarView.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.LinearLayout;
-
-import com.android.systemui.Dependency;
-import com.android.systemui.R;
-import com.android.systemui.car.navigationbar.CarNavigationBarController.NotificationsShadeController;
-import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-
-/**
- * A custom navigation bar for the automotive use case.
- * <p>
- * The navigation bar in the automotive use case is more like a list of shortcuts, rendered
- * in a linear layout.
- */
-public class CarNavigationBarView extends LinearLayout {
-    private final boolean mConsumeTouchWhenPanelOpen;
-
-    private View mNavButtons;
-    private CarNavigationButton mNotificationsButton;
-    private NotificationsShadeController mNotificationsShadeController;
-    private View mLockScreenButtons;
-    // used to wire in open/close gestures for notifications
-    private OnTouchListener mStatusBarWindowTouchListener;
-
-    public CarNavigationBarView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mConsumeTouchWhenPanelOpen = getResources().getBoolean(
-                R.bool.config_consumeNavigationBarTouchWhenNotificationPanelOpen);
-    }
-
-    @Override
-    public void onFinishInflate() {
-        mNavButtons = findViewById(R.id.nav_buttons);
-        mLockScreenButtons = findViewById(R.id.lock_screen_nav_buttons);
-
-        mNotificationsButton = findViewById(R.id.notifications);
-        if (mNotificationsButton != null) {
-            mNotificationsButton.setOnClickListener(this::onNotificationsClick);
-        }
-        View mStatusIcons = findViewById(R.id.statusIcons);
-        if (mStatusIcons != null) {
-            // Attach the controllers for Status icons such as wifi and bluetooth if the standard
-            // container is in the view.
-            StatusBarIconController.DarkIconManager mDarkIconManager =
-                    new StatusBarIconController.DarkIconManager(
-                            mStatusIcons.findViewById(R.id.statusIcons),
-                            Dependency.get(CommandQueue.class));
-            mDarkIconManager.setShouldLog(true);
-            Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager);
-        }
-        // Needs to be clickable so that it will receive ACTION_MOVE events.
-        setClickable(true);
-        // Needs to not be focusable so rotary won't highlight the entire nav bar.
-        setFocusable(false);
-    }
-
-    // Used to forward touch events even if the touch was initiated from a child component
-    @Override
-    public boolean onInterceptTouchEvent(MotionEvent ev) {
-        if (mStatusBarWindowTouchListener != null) {
-            boolean shouldConsumeEvent = mNotificationsShadeController == null ? false
-                    : mNotificationsShadeController.isNotificationPanelOpen();
-
-            // Forward touch events to the status bar window so it can drag
-            // windows if required (Notification shade)
-            mStatusBarWindowTouchListener.onTouch(this, ev);
-
-            if (mConsumeTouchWhenPanelOpen && shouldConsumeEvent) {
-                return true;
-            }
-        }
-        return super.onInterceptTouchEvent(ev);
-    }
-
-    /** Sets the notifications panel controller. */
-    public void setNotificationsPanelController(NotificationsShadeController controller) {
-        mNotificationsShadeController = controller;
-    }
-
-    /** Gets the notifications panel controller. */
-    public NotificationsShadeController getNotificationsPanelController() {
-        return mNotificationsShadeController;
-    }
-
-    /**
-     * Sets a touch listener that will be called from onInterceptTouchEvent and onTouchEvent
-     *
-     * @param statusBarWindowTouchListener The listener to call from touch and intercept touch
-     */
-    public void setStatusBarWindowTouchListener(OnTouchListener statusBarWindowTouchListener) {
-        mStatusBarWindowTouchListener = statusBarWindowTouchListener;
-    }
-
-    /** Gets the touch listener that will be called from onInterceptTouchEvent and onTouchEvent. */
-    public OnTouchListener getStatusBarWindowTouchListener() {
-        return mStatusBarWindowTouchListener;
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        if (mStatusBarWindowTouchListener != null) {
-            mStatusBarWindowTouchListener.onTouch(this, event);
-        }
-        return super.onTouchEvent(event);
-    }
-
-    protected void onNotificationsClick(View v) {
-        if (mNotificationsShadeController != null) {
-            mNotificationsShadeController.togglePanel();
-        }
-    }
-
-    /**
-     * If there are buttons declared in the layout they will be shown and the normal
-     * Nav buttons will be hidden.
-     */
-    public void showKeyguardButtons() {
-        if (mLockScreenButtons == null) {
-            return;
-        }
-        mLockScreenButtons.setVisibility(View.VISIBLE);
-        mNavButtons.setVisibility(View.GONE);
-    }
-
-    /**
-     * If there are buttons declared in the layout they will be hidden and the normal
-     * Nav buttons will be shown.
-     */
-    public void hideKeyguardButtons() {
-        if (mLockScreenButtons == null) return;
-
-        mNavButtons.setVisibility(View.VISIBLE);
-        mLockScreenButtons.setVisibility(View.GONE);
-    }
-
-    /**
-     * Toggles the notification unseen indicator on/off.
-     *
-     * @param hasUnseen true if the unseen notification count is great than 0.
-     */
-    public void toggleNotificationUnseenIndicator(Boolean hasUnseen) {
-        if (mNotificationsButton == null) return;
-
-        mNotificationsButton.setUnseen(hasUnseen);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationButton.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationButton.java
deleted file mode 100644
index d2b931b..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationButton.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import android.app.ActivityOptions;
-import android.app.role.RoleManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.os.UserHandle;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.Display;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.R;
-import com.android.systemui.statusbar.AlphaOptimizedImageView;
-
-import java.net.URISyntaxException;
-
-/**
- * CarNavigationButton is an image button that allows for a bit more configuration at the
- * xml file level. This allows for more control via overlays instead of having to update
- * code.
- */
-public class CarNavigationButton extends LinearLayout {
-
-    protected static final float DEFAULT_SELECTED_ALPHA = 1f;
-    protected static final float DEFAULT_UNSELECTED_ALPHA = 0.75f;
-
-    private static final String TAG = "CarNavigationButton";
-    private static final String BUTTON_FILTER_DELIMITER = ";";
-    private static final String EXTRA_BUTTON_CATEGORIES = "categories";
-    private static final String EXTRA_BUTTON_PACKAGES = "packages";
-
-    private Context mContext;
-    private AlphaOptimizedImageView mIcon;
-    private AlphaOptimizedImageView mMoreIcon;
-    private ImageView mUnseenIcon;
-    private String mIntent;
-    private String mLongIntent;
-    private boolean mBroadcastIntent;
-    private boolean mHasUnseen = false;
-    private boolean mSelected = false;
-    private float mSelectedAlpha;
-    private float mUnselectedAlpha;
-    private int mSelectedIconResourceId;
-    private int mIconResourceId;
-    private Drawable mAppIcon;
-    private boolean mIsDefaultAppIconForRoleEnabled;
-    private String[] mComponentNames;
-    /** App categories that are to be used with this widget */
-    private String[] mButtonCategories;
-    /** App packages that are allowed to be used with this widget */
-    private String[] mButtonPackages;
-    /** Whether to display more icon beneath the primary icon when the button is selected */
-    private boolean mShowMoreWhenSelected = false;
-    /** Whether to highlight the button if the active application is associated with it */
-    private boolean mHighlightWhenSelected = false;
-
-    public CarNavigationButton(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mContext = context;
-        View.inflate(mContext, R.layout.car_navigation_button, /* root= */ this);
-        // CarNavigationButton attrs
-        TypedArray typedArray = context.obtainStyledAttributes(attrs,
-                R.styleable.CarNavigationButton);
-
-        setUpIntents(typedArray);
-        setUpIcons(typedArray);
-        typedArray.recycle();
-    }
-
-    /**
-     * @param selected true if should indicate if this is a selected state, false otherwise
-     */
-    public void setSelected(boolean selected) {
-        super.setSelected(selected);
-        mSelected = selected;
-
-        if (mHighlightWhenSelected) {
-            setAlpha(mSelected ? mSelectedAlpha : mUnselectedAlpha);
-        }
-
-        if (mShowMoreWhenSelected && mMoreIcon != null) {
-            mMoreIcon.setVisibility(selected ? VISIBLE : GONE);
-        }
-        updateImage();
-    }
-
-    /**
-     * @param hasUnseen true if should indicate if this is a Unseen state, false otherwise.
-     */
-    public void setUnseen(boolean hasUnseen) {
-        mHasUnseen = hasUnseen;
-        updateImage();
-    }
-
-    /**
-     * Sets the current icon of the default application associated with this button.
-     */
-    public void setAppIcon(Drawable appIcon) {
-        mAppIcon = appIcon;
-        updateImage();
-    }
-
-    /** Gets the icon of the app currently associated to the role of this button. */
-    @VisibleForTesting
-    protected Drawable getAppIcon() {
-        return mAppIcon;
-    }
-
-    /** Gets whether the icon is in an unseen state. */
-    public boolean getUnseen() {
-        return mHasUnseen;
-    }
-
-    /**
-     * @return The app categories the component represents
-     */
-    public String[] getCategories() {
-        if (mButtonCategories == null) {
-            return new String[0];
-        }
-        return mButtonCategories;
-    }
-
-    /**
-     * @return The valid packages that should be considered.
-     */
-    public String[] getPackages() {
-        if (mButtonPackages == null) {
-            return new String[0];
-        }
-        return mButtonPackages;
-    }
-
-    /**
-     * @return The list of component names.
-     */
-    public String[] getComponentName() {
-        if (mComponentNames == null) {
-            return new String[0];
-        }
-        return mComponentNames;
-    }
-
-    /**
-     * Subclasses should override this method to return the {@link RoleManager} role associated
-     * with this button.
-     */
-    protected String getRoleName() {
-        return null;
-    }
-
-    /**
-     * @return true if this button should show the icon of the default application for the
-     * role returned by {@link #getRoleName()}.
-     */
-    protected boolean isDefaultAppIconForRoleEnabled() {
-        return mIsDefaultAppIconForRoleEnabled;
-    }
-
-    /**
-     * @return The id of the display the button is on or Display.INVALID_DISPLAY if it's not yet on
-     * a display.
-     */
-    protected int getDisplayId() {
-        Display display = getDisplay();
-        if (display == null) {
-            return Display.INVALID_DISPLAY;
-        }
-        return display.getDisplayId();
-    }
-
-    protected boolean hasSelectionState() {
-        return mHighlightWhenSelected || mShowMoreWhenSelected;
-    }
-
-    /**
-     * Sets up intents for click, long touch, and broadcast.
-     */
-    protected void setUpIntents(TypedArray typedArray) {
-        mIntent = typedArray.getString(R.styleable.CarNavigationButton_intent);
-        mLongIntent = typedArray.getString(R.styleable.CarNavigationButton_longIntent);
-        mBroadcastIntent = typedArray.getBoolean(R.styleable.CarNavigationButton_broadcast, false);
-
-        String categoryString = typedArray.getString(R.styleable.CarNavigationButton_categories);
-        String packageString = typedArray.getString(R.styleable.CarNavigationButton_packages);
-        String componentNameString =
-                typedArray.getString(R.styleable.CarNavigationButton_componentNames);
-
-        try {
-            if (mIntent != null) {
-                final Intent intent = Intent.parseUri(mIntent, Intent.URI_INTENT_SCHEME);
-                setOnClickListener(getButtonClickListener(intent));
-                if (packageString != null) {
-                    mButtonPackages = packageString.split(BUTTON_FILTER_DELIMITER);
-                    intent.putExtra(EXTRA_BUTTON_PACKAGES, mButtonPackages);
-                }
-                if (categoryString != null) {
-                    mButtonCategories = categoryString.split(BUTTON_FILTER_DELIMITER);
-                    intent.putExtra(EXTRA_BUTTON_CATEGORIES, mButtonCategories);
-                }
-                if (componentNameString != null) {
-                    mComponentNames = componentNameString.split(BUTTON_FILTER_DELIMITER);
-                }
-            }
-        } catch (URISyntaxException e) {
-            throw new RuntimeException("Failed to attach intent", e);
-        }
-
-        try {
-            if (mLongIntent != null && (Build.IS_ENG || Build.IS_USERDEBUG)) {
-                final Intent intent = Intent.parseUri(mLongIntent, Intent.URI_INTENT_SCHEME);
-                setOnLongClickListener(getButtonLongClickListener(intent));
-            }
-        } catch (URISyntaxException e) {
-            throw new RuntimeException("Failed to attach long press intent", e);
-        }
-    }
-
-    /** Defines the behavior of a button click. */
-    protected OnClickListener getButtonClickListener(Intent toSend) {
-        return v -> {
-            mContext.sendBroadcastAsUser(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS),
-                    UserHandle.CURRENT);
-            try {
-                if (mBroadcastIntent) {
-                    mContext.sendBroadcastAsUser(toSend, UserHandle.CURRENT);
-                    return;
-                }
-                ActivityOptions options = ActivityOptions.makeBasic();
-                options.setLaunchDisplayId(mContext.getDisplayId());
-                mContext.startActivityAsUser(toSend, options.toBundle(),
-                        UserHandle.CURRENT);
-            } catch (Exception e) {
-                Log.e(TAG, "Failed to launch intent", e);
-            }
-        };
-    }
-
-    /** Defines the behavior of a long click. */
-    protected OnLongClickListener getButtonLongClickListener(Intent toSend) {
-        return v -> {
-            mContext.sendBroadcastAsUser(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS),
-                    UserHandle.CURRENT);
-            try {
-                ActivityOptions options = ActivityOptions.makeBasic();
-                options.setLaunchDisplayId(mContext.getDisplayId());
-                mContext.startActivityAsUser(toSend, options.toBundle(),
-                        UserHandle.CURRENT);
-            } catch (Exception e) {
-                Log.e(TAG, "Failed to launch intent", e);
-            }
-            // consume event either way
-            return true;
-        };
-    }
-
-    /**
-     * Initializes view-related aspects of the button.
-     */
-    private void setUpIcons(TypedArray typedArray) {
-        mSelectedAlpha = typedArray.getFloat(
-                R.styleable.CarNavigationButton_selectedAlpha, DEFAULT_SELECTED_ALPHA);
-        mUnselectedAlpha = typedArray.getFloat(
-                R.styleable.CarNavigationButton_unselectedAlpha, DEFAULT_UNSELECTED_ALPHA);
-        mHighlightWhenSelected = typedArray.getBoolean(
-                R.styleable.CarNavigationButton_highlightWhenSelected,
-                mHighlightWhenSelected);
-        mShowMoreWhenSelected = typedArray.getBoolean(
-                R.styleable.CarNavigationButton_showMoreWhenSelected,
-                mShowMoreWhenSelected);
-
-        mIconResourceId = typedArray.getResourceId(
-                R.styleable.CarNavigationButton_icon, 0);
-        mSelectedIconResourceId = typedArray.getResourceId(
-                R.styleable.CarNavigationButton_selectedIcon, mIconResourceId);
-        mIsDefaultAppIconForRoleEnabled = typedArray.getBoolean(
-                R.styleable.CarNavigationButton_useDefaultAppIconForRole, false);
-        mIcon = findViewById(R.id.car_nav_button_icon_image);
-        // Always apply un-selected alpha regardless of if the button toggles alpha based on
-        // selection state.
-        setAlpha(mHighlightWhenSelected ? mUnselectedAlpha : mSelectedAlpha);
-        mMoreIcon = findViewById(R.id.car_nav_button_more_icon);
-        mUnseenIcon = findViewById(R.id.car_nav_button_unseen_icon);
-        updateImage();
-    }
-
-    private void updateImage() {
-        if (mIsDefaultAppIconForRoleEnabled && mAppIcon != null) {
-            mIcon.setImageDrawable(mAppIcon);
-        } else {
-            mIcon.setImageResource(mSelected ? mSelectedIconResourceId : mIconResourceId);
-        }
-        mUnseenIcon.setVisibility(mHasUnseen ? VISIBLE : GONE);
-    }
-
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java
deleted file mode 100644
index a473bb7..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import android.content.Context;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.annotation.LayoutRes;
-
-import com.android.car.ui.FocusParkingView;
-import com.android.systemui.R;
-import com.android.systemui.dagger.SysUISingleton;
-
-import javax.inject.Inject;
-
-/** A factory that creates and caches views for navigation bars. */
-@SysUISingleton
-public class NavigationBarViewFactory {
-
-    private static final String TAG = NavigationBarViewFactory.class.getSimpleName();
-    private static final ArrayMap<Type, Integer> sLayoutMap = setupLayoutMapping();
-
-    private static ArrayMap<Type, Integer> setupLayoutMapping() {
-        ArrayMap<Type, Integer> map = new ArrayMap<>();
-        map.put(Type.TOP, R.layout.car_top_navigation_bar);
-        map.put(Type.TOP_UNPROVISIONED, R.layout.car_top_navigation_bar_unprovisioned);
-        map.put(Type.BOTTOM, R.layout.car_navigation_bar);
-        map.put(Type.BOTTOM_UNPROVISIONED, R.layout.car_navigation_bar_unprovisioned);
-        map.put(Type.LEFT, R.layout.car_left_navigation_bar);
-        map.put(Type.LEFT_UNPROVISIONED, R.layout.car_left_navigation_bar_unprovisioned);
-        map.put(Type.RIGHT, R.layout.car_right_navigation_bar);
-        map.put(Type.RIGHT_UNPROVISIONED, R.layout.car_right_navigation_bar_unprovisioned);
-        return map;
-    }
-
-    private final Context mContext;
-    private final ArrayMap<Type, CarNavigationBarView> mCachedViewMap = new ArrayMap<>(
-            Type.values().length);
-    private final ArrayMap<Type, ViewGroup> mCachedContainerMap = new ArrayMap<>();
-
-    /** Type of navigation bar to be created. */
-    private enum Type {
-        TOP,
-        TOP_UNPROVISIONED,
-        BOTTOM,
-        BOTTOM_UNPROVISIONED,
-        LEFT,
-        LEFT_UNPROVISIONED,
-        RIGHT,
-        RIGHT_UNPROVISIONED
-    }
-
-    @Inject
-    public NavigationBarViewFactory(Context context) {
-        mContext = context;
-    }
-
-    /** Gets the top window. */
-    public ViewGroup getTopWindow() {
-        return getWindowCached(Type.TOP);
-    }
-
-    /** Gets the bottom window. */
-    public ViewGroup getBottomWindow() {
-        return getWindowCached(Type.BOTTOM);
-    }
-
-    /** Gets the left window. */
-    public ViewGroup getLeftWindow() {
-        return getWindowCached(Type.LEFT);
-    }
-
-    /** Gets the right window. */
-    public ViewGroup getRightWindow() {
-        return getWindowCached(Type.RIGHT);
-    }
-
-    /** Gets the top bar. */
-    public CarNavigationBarView getTopBar(boolean isSetUp) {
-        return getBar(isSetUp, Type.TOP, Type.TOP_UNPROVISIONED);
-    }
-
-    /** Gets the bottom bar. */
-    public CarNavigationBarView getBottomBar(boolean isSetUp) {
-        return getBar(isSetUp, Type.BOTTOM, Type.BOTTOM_UNPROVISIONED);
-    }
-
-    /** Gets the left bar. */
-    public CarNavigationBarView getLeftBar(boolean isSetUp) {
-        return getBar(isSetUp, Type.LEFT, Type.LEFT_UNPROVISIONED);
-    }
-
-    /** Gets the right bar. */
-    public CarNavigationBarView getRightBar(boolean isSetUp) {
-        return getBar(isSetUp, Type.RIGHT, Type.RIGHT_UNPROVISIONED);
-    }
-
-    private ViewGroup getWindowCached(Type type) {
-        if (mCachedContainerMap.containsKey(type)) {
-            return mCachedContainerMap.get(type);
-        }
-
-        ViewGroup window = (ViewGroup) View.inflate(mContext,
-                R.layout.navigation_bar_window, /* root= */ null);
-        mCachedContainerMap.put(type, window);
-        return mCachedContainerMap.get(type);
-    }
-
-    private CarNavigationBarView getBar(boolean isSetUp, Type provisioned, Type unprovisioned) {
-        CarNavigationBarView view;
-        if (isSetUp) {
-            view = getBarCached(provisioned, sLayoutMap.get(provisioned));
-        } else {
-            view = getBarCached(unprovisioned, sLayoutMap.get(unprovisioned));
-        }
-
-        if (view == null) {
-            String name = isSetUp ? provisioned.name() : unprovisioned.name();
-            Log.e(TAG, "CarStatusBar failed inflate for " + name);
-            throw new RuntimeException(
-                    "Unable to build " + name + " nav bar due to missing layout");
-        }
-        return view;
-    }
-
-    private CarNavigationBarView getBarCached(Type type, @LayoutRes int barLayout) {
-        if (mCachedViewMap.containsKey(type)) {
-            return mCachedViewMap.get(type);
-        }
-
-        CarNavigationBarView view = (CarNavigationBarView) View.inflate(mContext, barLayout,
-                /* root= */ null);
-
-        // Include a FocusParkingView at the beginning. The rotary controller "parks" the focus here
-        // when the user navigates to another window. This is also used to prevent wrap-around.
-        view.addView(new FocusParkingView(mContext), 0);
-
-        mCachedViewMap.put(type, view);
-        return mCachedViewMap.get(type);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/SystemBarConfigs.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/SystemBarConfigs.java
deleted file mode 100644
index 92cf600..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/SystemBarConfigs.java
+++ /dev/null
@@ -1,548 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import android.annotation.IntDef;
-import android.content.res.Resources;
-import android.graphics.PixelFormat;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.InsetsState;
-import android.view.ViewGroup;
-import android.view.WindowInsets;
-import android.view.WindowManager;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.R;
-import com.android.systemui.car.notification.BottomNotificationPanelViewMediator;
-import com.android.systemui.car.notification.TopNotificationPanelViewMediator;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.inject.Inject;
-
-/**
- * Reads configs for system bars for each side (TOP, BOTTOM, LEFT, and RIGHT) and returns the
- * corresponding {@link android.view.WindowManager.LayoutParams} per the configuration.
- */
-@SysUISingleton
-public class SystemBarConfigs {
-
-    private static final String TAG = SystemBarConfigs.class.getSimpleName();
-    // The z-order from which system bars will start to appear on top of HUN's.
-    private static final int HUN_ZORDER = 10;
-
-    @IntDef(value = {TOP, BOTTOM, LEFT, RIGHT})
-    @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
-    private @interface SystemBarSide {
-    }
-
-    public static final int TOP = 0;
-    public static final int BOTTOM = 1;
-    public static final int LEFT = 2;
-    public static final int RIGHT = 3;
-
-    /*
-        NOTE: The elements' order in the map below must be preserved as-is since the correct
-        corresponding values are obtained by the index.
-     */
-    private static final int[] BAR_TYPE_MAP = {
-            InsetsState.ITYPE_STATUS_BAR,
-            InsetsState.ITYPE_NAVIGATION_BAR,
-            InsetsState.ITYPE_CLIMATE_BAR,
-            InsetsState.ITYPE_EXTRA_NAVIGATION_BAR
-    };
-
-    private static final Map<@SystemBarSide Integer, Integer> BAR_GRAVITY_MAP = new ArrayMap<>();
-    private static final Map<@SystemBarSide Integer, String> BAR_TITLE_MAP = new ArrayMap<>();
-    private static final Map<@SystemBarSide Integer, Integer> BAR_GESTURE_MAP = new ArrayMap<>();
-
-    private final Resources mResources;
-    private final Map<@SystemBarSide Integer, SystemBarConfig> mSystemBarConfigMap =
-            new ArrayMap<>();
-    private final List<@SystemBarSide Integer> mSystemBarSidesByZOrder = new ArrayList<>();
-
-    private boolean mTopNavBarEnabled;
-    private boolean mBottomNavBarEnabled;
-    private boolean mLeftNavBarEnabled;
-    private boolean mRightNavBarEnabled;
-
-    @Inject
-    public SystemBarConfigs(@Main Resources resources) {
-        mResources = resources;
-
-        populateMaps();
-        readConfigs();
-
-        checkEnabledBarsHaveUniqueBarTypes();
-        checkAllOverlappingBarsHaveDifferentZOrders();
-        checkSystemBarEnabledForNotificationPanel();
-        checkHideBottomBarForKeyboardConfigSync();
-
-        setInsetPaddingsForOverlappingCorners();
-        sortSystemBarSidesByZOrder();
-    }
-
-    protected WindowManager.LayoutParams getLayoutParamsBySide(@SystemBarSide int side) {
-        return mSystemBarConfigMap.get(side) != null
-                ? mSystemBarConfigMap.get(side).getLayoutParams() : null;
-    }
-
-    protected boolean getEnabledStatusBySide(@SystemBarSide int side) {
-        switch (side) {
-            case TOP:
-                return mTopNavBarEnabled;
-            case BOTTOM:
-                return mBottomNavBarEnabled;
-            case LEFT:
-                return mLeftNavBarEnabled;
-            case RIGHT:
-                return mRightNavBarEnabled;
-            default:
-                return false;
-        }
-    }
-
-    protected boolean getHideForKeyboardBySide(@SystemBarSide int side) {
-        return mSystemBarConfigMap.get(side) != null
-                && mSystemBarConfigMap.get(side).getHideForKeyboard();
-    }
-
-    protected void insetSystemBar(@SystemBarSide int side, CarNavigationBarView view) {
-        if (mSystemBarConfigMap.get(side) == null) return;
-
-        int[] paddings = mSystemBarConfigMap.get(side).getPaddings();
-        view.setPadding(paddings[2], paddings[0], paddings[3], paddings[1]);
-    }
-
-    protected void setInsetUpdater(@SystemBarSide int side, CarNavigationBarView view) {
-        view.setOnApplyWindowInsetsListener((v, insets) -> {
-            updateInsetPaddings(side, getSystemBarsVisibility(insets));
-            insetSystemBar(side, view);
-            return insets;
-        });
-    }
-
-    protected List<Integer> getSystemBarSidesByZOrder() {
-        return mSystemBarSidesByZOrder;
-    }
-
-    @VisibleForTesting
-    void updateInsetPaddings(@SystemBarSide int side,
-            Map<@SystemBarSide Integer, Boolean> barVisibilities) {
-        SystemBarConfig currentConfig = mSystemBarConfigMap.get(side);
-
-        if (currentConfig == null) return;
-
-        if (isHorizontalBar(side)) {
-            if (mLeftNavBarEnabled && currentConfig.getZOrder() < mSystemBarConfigMap.get(
-                    LEFT).getZOrder()) {
-                currentConfig.setPaddingBySide(LEFT,
-                        barVisibilities.get(LEFT) ? mSystemBarConfigMap.get(LEFT).getGirth() : 0);
-            }
-            if (mRightNavBarEnabled && currentConfig.getZOrder() < mSystemBarConfigMap.get(
-                    RIGHT).getZOrder()) {
-                currentConfig.setPaddingBySide(RIGHT,
-                        barVisibilities.get(RIGHT) ? mSystemBarConfigMap.get(RIGHT).getGirth() : 0);
-            }
-        }
-        if (isVerticalBar(side)) {
-            if (mTopNavBarEnabled && currentConfig.getZOrder() < mSystemBarConfigMap.get(
-                    TOP).getZOrder()) {
-                currentConfig.setPaddingBySide(TOP,
-                        barVisibilities.get(TOP) ? mSystemBarConfigMap.get(TOP).getGirth() : 0);
-            }
-            if (mBottomNavBarEnabled && currentConfig.getZOrder() < mSystemBarConfigMap.get(
-                    BOTTOM).getZOrder()) {
-                currentConfig.setPaddingBySide(BOTTOM,
-                        barVisibilities.get(BOTTOM) ? mSystemBarConfigMap.get(BOTTOM).getGirth()
-                                : 0);
-            }
-        }
-    }
-
-    @VisibleForTesting
-    static int getHunZOrder() {
-        return HUN_ZORDER;
-    }
-
-    private static void populateMaps() {
-        BAR_GRAVITY_MAP.put(TOP, Gravity.TOP);
-        BAR_GRAVITY_MAP.put(BOTTOM, Gravity.BOTTOM);
-        BAR_GRAVITY_MAP.put(LEFT, Gravity.LEFT);
-        BAR_GRAVITY_MAP.put(RIGHT, Gravity.RIGHT);
-
-        BAR_TITLE_MAP.put(TOP, "TopCarSystemBar");
-        BAR_TITLE_MAP.put(BOTTOM, "BottomCarSystemBar");
-        BAR_TITLE_MAP.put(LEFT, "LeftCarSystemBar");
-        BAR_TITLE_MAP.put(RIGHT, "RightCarSystemBar");
-
-        BAR_GESTURE_MAP.put(TOP, InsetsState.ITYPE_TOP_MANDATORY_GESTURES);
-        BAR_GESTURE_MAP.put(BOTTOM, InsetsState.ITYPE_BOTTOM_MANDATORY_GESTURES);
-        BAR_GESTURE_MAP.put(LEFT, InsetsState.ITYPE_LEFT_MANDATORY_GESTURES);
-        BAR_GESTURE_MAP.put(RIGHT, InsetsState.ITYPE_RIGHT_MANDATORY_GESTURES);
-    }
-
-    private void readConfigs() {
-        mTopNavBarEnabled = mResources.getBoolean(R.bool.config_enableTopNavigationBar);
-        mBottomNavBarEnabled = mResources.getBoolean(R.bool.config_enableBottomNavigationBar);
-        mLeftNavBarEnabled = mResources.getBoolean(R.bool.config_enableLeftNavigationBar);
-        mRightNavBarEnabled = mResources.getBoolean(R.bool.config_enableRightNavigationBar);
-
-        if (mTopNavBarEnabled) {
-            SystemBarConfig topBarConfig =
-                    new SystemBarConfigBuilder()
-                            .setSide(TOP)
-                            .setGirth(mResources.getDimensionPixelSize(
-                                    R.dimen.car_top_navigation_bar_height))
-                            .setBarType(mResources.getInteger(R.integer.config_topSystemBarType))
-                            .setZOrder(mResources.getInteger(R.integer.config_topSystemBarZOrder))
-                            .setHideForKeyboard(mResources.getBoolean(
-                                    R.bool.config_hideTopSystemBarForKeyboard))
-                            .build();
-            mSystemBarConfigMap.put(TOP, topBarConfig);
-        }
-
-        if (mBottomNavBarEnabled) {
-            SystemBarConfig bottomBarConfig =
-                    new SystemBarConfigBuilder()
-                            .setSide(BOTTOM)
-                            .setGirth(mResources.getDimensionPixelSize(
-                                    R.dimen.car_bottom_navigation_bar_height))
-                            .setBarType(mResources.getInteger(R.integer.config_bottomSystemBarType))
-                            .setZOrder(
-                                    mResources.getInteger(R.integer.config_bottomSystemBarZOrder))
-                            .setHideForKeyboard(mResources.getBoolean(
-                                    R.bool.config_hideBottomSystemBarForKeyboard))
-                            .build();
-            mSystemBarConfigMap.put(BOTTOM, bottomBarConfig);
-        }
-
-        if (mLeftNavBarEnabled) {
-            SystemBarConfig leftBarConfig =
-                    new SystemBarConfigBuilder()
-                            .setSide(LEFT)
-                            .setGirth(mResources.getDimensionPixelSize(
-                                    R.dimen.car_left_navigation_bar_width))
-                            .setBarType(mResources.getInteger(R.integer.config_leftSystemBarType))
-                            .setZOrder(mResources.getInteger(R.integer.config_leftSystemBarZOrder))
-                            .setHideForKeyboard(mResources.getBoolean(
-                                    R.bool.config_hideLeftSystemBarForKeyboard))
-                            .build();
-            mSystemBarConfigMap.put(LEFT, leftBarConfig);
-        }
-
-        if (mRightNavBarEnabled) {
-            SystemBarConfig rightBarConfig =
-                    new SystemBarConfigBuilder()
-                            .setSide(RIGHT)
-                            .setGirth(mResources.getDimensionPixelSize(
-                                    R.dimen.car_right_navigation_bar_width))
-                            .setBarType(mResources.getInteger(R.integer.config_rightSystemBarType))
-                            .setZOrder(mResources.getInteger(R.integer.config_rightSystemBarZOrder))
-                            .setHideForKeyboard(mResources.getBoolean(
-                                    R.bool.config_hideRightSystemBarForKeyboard))
-                            .build();
-            mSystemBarConfigMap.put(RIGHT, rightBarConfig);
-        }
-    }
-
-    private void checkEnabledBarsHaveUniqueBarTypes() throws RuntimeException {
-        Set<Integer> barTypesUsed = new ArraySet<>();
-        int enabledNavBarCount = mSystemBarConfigMap.size();
-
-        for (SystemBarConfig systemBarConfig : mSystemBarConfigMap.values()) {
-            barTypesUsed.add(systemBarConfig.getBarType());
-        }
-
-        // The number of bar types used cannot be fewer than that of enabled system bars.
-        if (barTypesUsed.size() < enabledNavBarCount) {
-            throw new RuntimeException("Each enabled system bar must have a unique bar type. Check "
-                    + "the configuration in config.xml");
-        }
-    }
-
-    private void checkAllOverlappingBarsHaveDifferentZOrders() {
-        checkOverlappingBarsHaveDifferentZOrders(TOP, LEFT);
-        checkOverlappingBarsHaveDifferentZOrders(TOP, RIGHT);
-        checkOverlappingBarsHaveDifferentZOrders(BOTTOM, LEFT);
-        checkOverlappingBarsHaveDifferentZOrders(BOTTOM, RIGHT);
-    }
-
-    private void checkSystemBarEnabledForNotificationPanel() throws RuntimeException {
-        String notificationPanelMediatorName =
-                mResources.getString(R.string.config_notificationPanelViewMediator);
-        if (notificationPanelMediatorName == null) {
-            return;
-        }
-
-        Class<?> notificationPanelMediatorUsed = null;
-        try {
-            notificationPanelMediatorUsed = Class.forName(notificationPanelMediatorName);
-        } catch (ClassNotFoundException e) {
-            e.printStackTrace();
-        }
-
-        if (!mTopNavBarEnabled && TopNotificationPanelViewMediator.class.isAssignableFrom(
-                notificationPanelMediatorUsed)) {
-            throw new RuntimeException(
-                    "Top System Bar must be enabled to use " + notificationPanelMediatorName);
-        }
-
-        if (!mBottomNavBarEnabled && BottomNotificationPanelViewMediator.class.isAssignableFrom(
-                notificationPanelMediatorUsed)) {
-            throw new RuntimeException("Bottom System Bar must be enabled to use "
-                    + notificationPanelMediatorName);
-        }
-    }
-
-    private void checkHideBottomBarForKeyboardConfigSync() throws RuntimeException {
-        if (mBottomNavBarEnabled) {
-            boolean actual = mResources.getBoolean(R.bool.config_hideBottomSystemBarForKeyboard);
-            boolean expected = mResources.getBoolean(
-                    com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard);
-
-            if (actual != expected) {
-                throw new RuntimeException("config_hideBottomSystemBarForKeyboard must not be "
-                        + "overlaid directly and should always refer to"
-                        + "config_automotiveHideNavBarForKeyboard. However, their values "
-                        + "currently do not sync. Set config_hideBottomSystemBarForKeyguard to "
-                        + "@*android:bool/config_automotiveHideNavBarForKeyboard. To change its "
-                        + "value, overlay config_automotiveHideNavBarForKeyboard in "
-                        + "framework/base/core/res/res.");
-            }
-        }
-    }
-
-    private void setInsetPaddingsForOverlappingCorners() {
-        Map<@SystemBarSide Integer, Boolean> systemBarVisibilityOnInit =
-                getSystemBarsVisibilityOnInit();
-        updateInsetPaddings(TOP, systemBarVisibilityOnInit);
-        updateInsetPaddings(BOTTOM, systemBarVisibilityOnInit);
-        updateInsetPaddings(LEFT, systemBarVisibilityOnInit);
-        updateInsetPaddings(RIGHT, systemBarVisibilityOnInit);
-    }
-
-    private void sortSystemBarSidesByZOrder() {
-        List<SystemBarConfig> systemBarsByZOrder = new ArrayList<>(mSystemBarConfigMap.values());
-
-        systemBarsByZOrder.sort(new Comparator<SystemBarConfig>() {
-            @Override
-            public int compare(SystemBarConfig o1, SystemBarConfig o2) {
-                return o1.getZOrder() - o2.getZOrder();
-            }
-        });
-
-        systemBarsByZOrder.forEach(systemBarConfig -> {
-            mSystemBarSidesByZOrder.add(systemBarConfig.getSide());
-        });
-    }
-
-    @InsetsState.InternalInsetsType
-    private int getSystemBarTypeBySide(@SystemBarSide int side) {
-        return mSystemBarConfigMap.get(side) != null
-                ? mSystemBarConfigMap.get(side).getBarType() : null;
-    }
-
-    // On init, system bars are visible as long as they are enabled.
-    private Map<@SystemBarSide Integer, Boolean> getSystemBarsVisibilityOnInit() {
-        ArrayMap<@SystemBarSide Integer, Boolean> visibilityMap = new ArrayMap<>();
-        visibilityMap.put(TOP, mTopNavBarEnabled);
-        visibilityMap.put(BOTTOM, mBottomNavBarEnabled);
-        visibilityMap.put(LEFT, mLeftNavBarEnabled);
-        visibilityMap.put(RIGHT, mRightNavBarEnabled);
-        return visibilityMap;
-    }
-
-    private Map<@SystemBarSide Integer, Boolean> getSystemBarsVisibility(WindowInsets insets) {
-        ArrayMap<@SystemBarSide Integer, Boolean> visibilityMap = new ArrayMap<>();
-        if (mTopNavBarEnabled) {
-            visibilityMap.put(TOP, getSystemBarInsetVisibleBySide(TOP, insets));
-        }
-        if (mBottomNavBarEnabled) {
-            visibilityMap.put(BOTTOM, getSystemBarInsetVisibleBySide(BOTTOM, insets));
-        }
-        if (mLeftNavBarEnabled) {
-            visibilityMap.put(LEFT, getSystemBarInsetVisibleBySide(LEFT, insets));
-        }
-        if (mRightNavBarEnabled) {
-            visibilityMap.put(RIGHT, getSystemBarInsetVisibleBySide(RIGHT, insets));
-        }
-        return visibilityMap;
-    }
-
-    private boolean getSystemBarInsetVisibleBySide(@SystemBarSide int side, WindowInsets insets) {
-        if (mSystemBarConfigMap.get(side) == null) return false;
-
-        int internalInsetType = BAR_TYPE_MAP[getSystemBarTypeBySide(side)];
-        int publicInsetType = InsetsState.toPublicType(internalInsetType);
-
-        return insets.isVisible(publicInsetType);
-    }
-
-    private void checkOverlappingBarsHaveDifferentZOrders(@SystemBarSide int horizontalSide,
-            @SystemBarSide int verticalSide) {
-
-        if (isVerticalBar(horizontalSide) || isHorizontalBar(verticalSide)) {
-            Log.w(TAG, "configureBarPaddings: Returning immediately since the horizontal and "
-                    + "vertical sides were not provided correctly.");
-            return;
-        }
-
-        SystemBarConfig horizontalBarConfig = mSystemBarConfigMap.get(horizontalSide);
-        SystemBarConfig verticalBarConfig = mSystemBarConfigMap.get(verticalSide);
-
-        if (verticalBarConfig != null && horizontalBarConfig != null) {
-            int horizontalBarZOrder = horizontalBarConfig.getZOrder();
-            int verticalBarZOrder = verticalBarConfig.getZOrder();
-
-            if (horizontalBarZOrder == verticalBarZOrder) {
-                throw new RuntimeException(
-                        BAR_TITLE_MAP.get(horizontalSide) + " " + BAR_TITLE_MAP.get(verticalSide)
-                                + " have the same Z-Order, and so their placing order cannot be "
-                                + "determined. Determine which bar should be placed on top of the "
-                                + "other bar and change the Z-order in config.xml accordingly."
-                );
-            }
-        }
-    }
-
-    private static boolean isHorizontalBar(@SystemBarSide int side) {
-        return side == TOP || side == BOTTOM;
-    }
-
-    private static boolean isVerticalBar(@SystemBarSide int side) {
-        return side == LEFT || side == RIGHT;
-    }
-
-    private static final class SystemBarConfig {
-        private final int mSide;
-        private final int mBarType;
-        private final int mGirth;
-        private final int mZOrder;
-        private final boolean mHideForKeyboard;
-
-        private int[] mPaddings = new int[]{0, 0, 0, 0};
-
-        private SystemBarConfig(@SystemBarSide int side, int barType, int girth, int zOrder,
-                boolean hideForKeyboard) {
-            mSide = side;
-            mBarType = barType;
-            mGirth = girth;
-            mZOrder = zOrder;
-            mHideForKeyboard = hideForKeyboard;
-        }
-
-        private int getSide() {
-            return mSide;
-        }
-
-        private int getBarType() {
-            return mBarType;
-        }
-
-        private int getGirth() {
-            return mGirth;
-        }
-
-        private int getZOrder() {
-            return mZOrder;
-        }
-
-        private boolean getHideForKeyboard() {
-            return mHideForKeyboard;
-        }
-
-        private int[] getPaddings() {
-            return mPaddings;
-        }
-
-        private WindowManager.LayoutParams getLayoutParams() {
-            WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
-                    isHorizontalBar(mSide) ? ViewGroup.LayoutParams.MATCH_PARENT : mGirth,
-                    isHorizontalBar(mSide) ? mGirth : ViewGroup.LayoutParams.MATCH_PARENT,
-                    mapZOrderToBarType(mZOrder),
-                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                            | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
-                            | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
-                            | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
-                    PixelFormat.TRANSLUCENT);
-            lp.setTitle(BAR_TITLE_MAP.get(mSide));
-            lp.providesInsetsTypes = new int[]{BAR_TYPE_MAP[mBarType], BAR_GESTURE_MAP.get(mSide)};
-            lp.setFitInsetsTypes(0);
-            lp.windowAnimations = 0;
-            lp.gravity = BAR_GRAVITY_MAP.get(mSide);
-            return lp;
-        }
-
-        private int mapZOrderToBarType(int zOrder) {
-            return zOrder >= HUN_ZORDER ? WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL
-                    : WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL;
-        }
-
-        private void setPaddingBySide(@SystemBarSide int side, int padding) {
-            mPaddings[side] = padding;
-        }
-    }
-
-    private static final class SystemBarConfigBuilder {
-        private int mSide;
-        private int mBarType;
-        private int mGirth;
-        private int mZOrder;
-        private boolean mHideForKeyboard;
-
-        private SystemBarConfigBuilder setSide(@SystemBarSide int side) {
-            mSide = side;
-            return this;
-        }
-
-        private SystemBarConfigBuilder setBarType(int type) {
-            mBarType = type;
-            return this;
-        }
-
-        private SystemBarConfigBuilder setGirth(int girth) {
-            mGirth = girth;
-            return this;
-        }
-
-        private SystemBarConfigBuilder setZOrder(int zOrder) {
-            mZOrder = zOrder;
-            return this;
-        }
-
-        private SystemBarConfigBuilder setHideForKeyboard(boolean hide) {
-            mHideForKeyboard = hide;
-            return this;
-        }
-
-        private SystemBarConfig build() {
-            return new SystemBarConfig(mSide, mBarType, mGirth, mZOrder, mHideForKeyboard);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/BottomNotificationPanelViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/BottomNotificationPanelViewMediator.java
deleted file mode 100644
index 8468bef..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/BottomNotificationPanelViewMediator.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.notification;
-
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.navigationbar.CarNavigationBarController;
-import com.android.systemui.car.window.OverlayPanelViewController;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-
-import javax.inject.Inject;
-
-/**
- * Implementation of NotificationPanelViewMediator that sets the notification panel to be opened
- * from the top navigation bar.
- */
-@SysUISingleton
-public class BottomNotificationPanelViewMediator extends NotificationPanelViewMediator {
-
-    @Inject
-    public BottomNotificationPanelViewMediator(
-            CarNavigationBarController carNavigationBarController,
-            NotificationPanelViewController notificationPanelViewController,
-
-            PowerManagerHelper powerManagerHelper,
-            BroadcastDispatcher broadcastDispatcher,
-
-            CarDeviceProvisionedController carDeviceProvisionedController,
-            ConfigurationController configurationController
-    ) {
-        super(carNavigationBarController,
-                notificationPanelViewController,
-                powerManagerHelper,
-                broadcastDispatcher,
-                carDeviceProvisionedController,
-                configurationController);
-        notificationPanelViewController.setOverlayDirection(
-                OverlayPanelViewController.OVERLAY_FROM_BOTTOM_BAR);
-    }
-
-    @Override
-    public void registerListeners() {
-        super.registerListeners();
-        getCarNavigationBarController().registerBottomBarTouchListener(
-                getNotificationPanelViewController().getDragOpenTouchListener());
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java
deleted file mode 100644
index 98b1fc4..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.notification;
-
-import android.content.Context;
-import android.graphics.PixelFormat;
-import android.view.Gravity;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-
-import com.android.car.notification.headsup.CarHeadsUpNotificationContainer;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.window.OverlayViewGlobalStateController;
-import com.android.systemui.dagger.SysUISingleton;
-
-import javax.inject.Inject;
-
-/**
- * A controller for SysUI's HUN display.
- *
- * Used to attach HUNs views to window and determine whether to show HUN panel.
- */
-@SysUISingleton
-public class CarHeadsUpNotificationSystemContainer extends CarHeadsUpNotificationContainer {
-    private static final String WINDOW_TITLE = "HeadsUpNotification";
-    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
-    private final OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-
-    @Inject
-    CarHeadsUpNotificationSystemContainer(Context context,
-            CarDeviceProvisionedController deviceProvisionedController,
-            WindowManager windowManager,
-            OverlayViewGlobalStateController overlayViewGlobalStateController) {
-        super(context, windowManager);
-        mCarDeviceProvisionedController = deviceProvisionedController;
-        mOverlayViewGlobalStateController = overlayViewGlobalStateController;
-    }
-
-    @Override
-    protected WindowManager.LayoutParams getWindowManagerLayoutParams() {
-        // Use TYPE_STATUS_BAR_SUB_PANEL window type since we need to find a window that is above
-        // status bar but below navigation bar.
-        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                WindowManager.LayoutParams.WRAP_CONTENT,
-                WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL,
-                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
-                PixelFormat.TRANSLUCENT);
-
-        lp.gravity = getShowHunOnBottom() ? Gravity.BOTTOM : Gravity.TOP;
-        lp.setTitle(WINDOW_TITLE);
-
-        return lp;
-    }
-
-    @Override
-    public boolean shouldShowHunPanel() {
-        return mCarDeviceProvisionedController.isCurrentUserFullySetup()
-                && mOverlayViewGlobalStateController.shouldShowHUN();
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarNotificationModule.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarNotificationModule.java
deleted file mode 100644
index 8a3bcfc..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarNotificationModule.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.notification;
-
-import android.content.Context;
-
-import com.android.car.notification.CarHeadsUpNotificationManager;
-import com.android.car.notification.CarNotificationListener;
-import com.android.car.notification.CarUxRestrictionManagerWrapper;
-import com.android.car.notification.NotificationClickHandlerFactory;
-import com.android.car.notification.NotificationDataManager;
-import com.android.car.notification.headsup.CarHeadsUpNotificationContainer;
-import com.android.internal.statusbar.IStatusBarService;
-import com.android.systemui.dagger.SysUISingleton;
-
-import dagger.Binds;
-import dagger.Module;
-import dagger.Provides;
-
-/**
- * Module for Car SysUI Notifications
- */
-@Module
-public abstract class CarNotificationModule {
-    @Provides
-    @SysUISingleton
-    static NotificationClickHandlerFactory provideNotificationClickHandlerFactory(
-            IStatusBarService barService) {
-        return new NotificationClickHandlerFactory(barService);
-    }
-
-    @Provides
-    @SysUISingleton
-    static NotificationDataManager provideNotificationDataManager() {
-        return new NotificationDataManager();
-    }
-
-    @Provides
-    @SysUISingleton
-    static CarUxRestrictionManagerWrapper provideCarUxRestrictionManagerWrapper() {
-        return new CarUxRestrictionManagerWrapper();
-    }
-
-    @Provides
-    @SysUISingleton
-    static CarNotificationListener provideCarNotificationListener(Context context,
-            CarUxRestrictionManagerWrapper carUxRestrictionManagerWrapper,
-            CarHeadsUpNotificationManager carHeadsUpNotificationManager,
-            NotificationDataManager notificationDataManager) {
-        CarNotificationListener listener = new CarNotificationListener();
-        listener.registerAsSystemService(context, carUxRestrictionManagerWrapper,
-                carHeadsUpNotificationManager, notificationDataManager);
-        return listener;
-    }
-
-    @Provides
-    @SysUISingleton
-    static CarHeadsUpNotificationManager provideCarHeadsUpNotificationManager(Context context,
-            NotificationClickHandlerFactory notificationClickHandlerFactory,
-            NotificationDataManager notificationDataManager,
-            CarHeadsUpNotificationContainer headsUpNotificationDisplay) {
-        return new CarHeadsUpNotificationManager(context, notificationClickHandlerFactory,
-                notificationDataManager, headsUpNotificationDisplay);
-    }
-
-    @Binds
-    abstract CarHeadsUpNotificationContainer bindsCarHeadsUpNotificationContainer(
-            CarHeadsUpNotificationSystemContainer carHeadsUpNotificationSystemContainer);
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java
deleted file mode 100644
index 599e69c..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java
+++ /dev/null
@@ -1,602 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.notification;
-
-import android.app.ActivityManager;
-import android.car.Car;
-import android.car.drivingstate.CarUxRestrictionsManager;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.inputmethodservice.InputMethodService;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-import android.view.GestureDetector;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowInsets;
-
-import androidx.annotation.NonNull;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.car.notification.CarNotificationListener;
-import com.android.car.notification.CarNotificationView;
-import com.android.car.notification.CarUxRestrictionManagerWrapper;
-import com.android.car.notification.NotificationClickHandlerFactory;
-import com.android.car.notification.NotificationDataManager;
-import com.android.car.notification.NotificationViewController;
-import com.android.car.notification.PreprocessingManager;
-import com.android.internal.statusbar.IStatusBarService;
-import com.android.systemui.R;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.car.window.OverlayPanelViewController;
-import com.android.systemui.car.window.OverlayViewController;
-import com.android.systemui.car.window.OverlayViewGlobalStateController;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.dagger.qualifiers.UiBackground;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.StatusBarState;
-import com.android.wm.shell.animation.FlingAnimationUtils;
-
-import java.util.concurrent.Executor;
-
-import javax.inject.Inject;
-
-/** View controller for the notification panel. */
-@SysUISingleton
-public class NotificationPanelViewController extends OverlayPanelViewController
-        implements CommandQueue.Callbacks {
-
-    private static final boolean DEBUG = true;
-    private static final String TAG = "NotificationPanelViewController";
-
-    private final Context mContext;
-    private final Resources mResources;
-    private final CarServiceProvider mCarServiceProvider;
-    private final IStatusBarService mBarService;
-    private final CommandQueue mCommandQueue;
-    private final Executor mUiBgExecutor;
-    private final NotificationDataManager mNotificationDataManager;
-    private final CarUxRestrictionManagerWrapper mCarUxRestrictionManagerWrapper;
-    private final CarNotificationListener mCarNotificationListener;
-    private final NotificationClickHandlerFactory mNotificationClickHandlerFactory;
-    private final StatusBarStateController mStatusBarStateController;
-    private final boolean mEnableHeadsUpNotificationWhenNotificationShadeOpen;
-    private final NotificationVisibilityLogger mNotificationVisibilityLogger;
-
-    private final boolean mFitTopSystemBarInset;
-    private final boolean mFitBottomSystemBarInset;
-    private final boolean mFitLeftSystemBarInset;
-    private final boolean mFitRightSystemBarInset;
-
-    private float mInitialBackgroundAlpha;
-    private float mBackgroundAlphaDiff;
-
-    private CarNotificationView mNotificationView;
-    private View mHandleBar;
-    private RecyclerView mNotificationList;
-    private NotificationViewController mNotificationViewController;
-
-    private boolean mNotificationListAtEnd;
-    private float mFirstTouchDownOnGlassPane;
-    private boolean mNotificationListAtEndAtTimeOfTouch;
-    private boolean mIsSwipingVerticallyToClose;
-    private boolean mIsNotificationCardSwiping;
-    private boolean mImeVisible = false;
-
-    private OnUnseenCountUpdateListener mUnseenCountUpdateListener;
-
-    @Inject
-    public NotificationPanelViewController(
-            Context context,
-            @Main Resources resources,
-            OverlayViewGlobalStateController overlayViewGlobalStateController,
-            FlingAnimationUtils.Builder flingAnimationUtilsBuilder,
-            @UiBackground Executor uiBgExecutor,
-
-            /* Other things */
-            CarServiceProvider carServiceProvider,
-            CarDeviceProvisionedController carDeviceProvisionedController,
-
-            /* Things needed for notifications */
-            IStatusBarService barService,
-            CommandQueue commandQueue,
-            NotificationDataManager notificationDataManager,
-            CarUxRestrictionManagerWrapper carUxRestrictionManagerWrapper,
-            CarNotificationListener carNotificationListener,
-            NotificationClickHandlerFactory notificationClickHandlerFactory,
-            NotificationVisibilityLogger notificationVisibilityLogger,
-
-            /* Things that need to be replaced */
-            StatusBarStateController statusBarStateController
-    ) {
-        super(context, resources, R.id.notification_panel_stub, overlayViewGlobalStateController,
-                flingAnimationUtilsBuilder, carDeviceProvisionedController);
-        mContext = context;
-        mResources = resources;
-        mCarServiceProvider = carServiceProvider;
-        mBarService = barService;
-        mCommandQueue = commandQueue;
-        mUiBgExecutor = uiBgExecutor;
-        mNotificationDataManager = notificationDataManager;
-        mCarUxRestrictionManagerWrapper = carUxRestrictionManagerWrapper;
-        mCarNotificationListener = carNotificationListener;
-        mNotificationClickHandlerFactory = notificationClickHandlerFactory;
-        mStatusBarStateController = statusBarStateController;
-        mNotificationVisibilityLogger = notificationVisibilityLogger;
-
-        mCommandQueue.addCallback(this);
-
-        // Notification background setup.
-        mInitialBackgroundAlpha = (float) mResources.getInteger(
-                R.integer.config_initialNotificationBackgroundAlpha) / 100;
-        if (mInitialBackgroundAlpha < 0 || mInitialBackgroundAlpha > 100) {
-            throw new RuntimeException(
-                    "Unable to setup notification bar due to incorrect initial background alpha"
-                            + " percentage");
-        }
-        float finalBackgroundAlpha = Math.max(
-                mInitialBackgroundAlpha,
-                (float) mResources.getInteger(
-                        R.integer.config_finalNotificationBackgroundAlpha) / 100);
-        if (finalBackgroundAlpha < 0 || finalBackgroundAlpha > 100) {
-            throw new RuntimeException(
-                    "Unable to setup notification bar due to incorrect final background alpha"
-                            + " percentage");
-        }
-        mBackgroundAlphaDiff = finalBackgroundAlpha - mInitialBackgroundAlpha;
-
-        mEnableHeadsUpNotificationWhenNotificationShadeOpen = mResources.getBoolean(
-                com.android.car.notification.R.bool
-                        .config_enableHeadsUpNotificationWhenNotificationShadeOpen);
-
-        mFitTopSystemBarInset = mResources.getBoolean(
-                R.bool.config_notif_panel_inset_by_top_systembar);
-        mFitBottomSystemBarInset = mResources.getBoolean(
-                R.bool.config_notif_panel_inset_by_bottom_systembar);
-        mFitLeftSystemBarInset = mResources.getBoolean(
-                R.bool.config_notif_panel_inset_by_left_systembar);
-        mFitRightSystemBarInset = mResources.getBoolean(
-                R.bool.config_notif_panel_inset_by_right_systembar);
-    }
-
-    // CommandQueue.Callbacks
-
-    @Override
-    public void animateExpandNotificationsPanel() {
-        if (!isPanelExpanded()) {
-            toggle();
-        }
-    }
-
-    @Override
-    public void animateCollapsePanels(int flags, boolean force) {
-        if (isPanelExpanded()) {
-            toggle();
-        }
-    }
-
-    @Override
-    public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
-            boolean showImeSwitcher) {
-        if (mContext.getDisplayId() != displayId) {
-            return;
-        }
-        mImeVisible = (vis & InputMethodService.IME_VISIBLE) != 0;
-    }
-
-    // OverlayViewController
-
-    @Override
-    protected void onFinishInflate() {
-        reinflate();
-    }
-
-    @Override
-    protected void hideInternal() {
-        super.hideInternal();
-        mNotificationVisibilityLogger.stop();
-    }
-
-    @Override
-    protected boolean shouldShowNavigationBarInsets() {
-        return true;
-    }
-
-    @Override
-    protected boolean shouldShowStatusBarInsets() {
-        return true;
-    }
-
-    @Override
-    protected int getInsetSidesToFit() {
-        int insetSidesToFit = OverlayViewController.NO_INSET_SIDE;
-
-        if (mFitTopSystemBarInset) {
-            insetSidesToFit = insetSidesToFit | WindowInsets.Side.TOP;
-        }
-
-        if (mFitBottomSystemBarInset) {
-            insetSidesToFit = insetSidesToFit | WindowInsets.Side.BOTTOM;
-        }
-
-        if (mFitLeftSystemBarInset) {
-            insetSidesToFit = insetSidesToFit | WindowInsets.Side.LEFT;
-        }
-
-        if (mFitRightSystemBarInset) {
-            insetSidesToFit = insetSidesToFit | WindowInsets.Side.RIGHT;
-        }
-
-        return insetSidesToFit;
-    }
-
-    @Override
-    protected boolean shouldShowHUN() {
-        return mEnableHeadsUpNotificationWhenNotificationShadeOpen;
-    }
-
-    @Override
-    protected boolean shouldUseStableInsets() {
-        // When IME is visible, then the inset from the nav bar should not be applied.
-        return !mImeVisible;
-    }
-
-    /** Reinflates the view. */
-    public void reinflate() {
-        ViewGroup container = (ViewGroup) getLayout();
-        container.removeView(mNotificationView);
-
-        mNotificationView = (CarNotificationView) LayoutInflater.from(mContext).inflate(
-                R.layout.notification_center_activity, container,
-                /* attachToRoot= */ false);
-
-        container.addView(mNotificationView);
-        onNotificationViewInflated();
-    }
-
-    private void onNotificationViewInflated() {
-        // Find views.
-        mNotificationView = getLayout().findViewById(R.id.notification_view);
-        setupHandleBar();
-        setupNotificationPanel();
-
-        mNotificationClickHandlerFactory.registerClickListener((launchResult, alertEntry) -> {
-            if (launchResult == ActivityManager.START_TASK_TO_FRONT
-                    || launchResult == ActivityManager.START_SUCCESS) {
-                animateCollapsePanel();
-            }
-        });
-
-        mNotificationDataManager.setOnUnseenCountUpdateListener(() -> {
-            if (mUnseenCountUpdateListener != null) {
-                mUnseenCountUpdateListener.onUnseenCountUpdate(
-                        mNotificationDataManager.getUnseenNotificationCount());
-            }
-            mCarNotificationListener.setNotificationsShown(
-                    mNotificationDataManager.getSeenNotifications());
-            // This logs both when the notification panel is expanded and when the notification
-            // panel is scrolled.
-            mNotificationVisibilityLogger.log(isPanelExpanded());
-        });
-
-        mNotificationClickHandlerFactory.setNotificationDataManager(mNotificationDataManager);
-        mNotificationView.setClickHandlerFactory(mNotificationClickHandlerFactory);
-        mNotificationView.setNotificationDataManager(mNotificationDataManager);
-
-        mCarServiceProvider.addListener(car -> {
-            CarUxRestrictionsManager carUxRestrictionsManager =
-                    (CarUxRestrictionsManager)
-                            car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
-            mCarUxRestrictionManagerWrapper.setCarUxRestrictionsManager(
-                    carUxRestrictionsManager);
-
-            mNotificationViewController = new NotificationViewController(
-                    mNotificationView,
-                    PreprocessingManager.getInstance(mContext),
-                    mCarNotificationListener,
-                    mCarUxRestrictionManagerWrapper,
-                    mNotificationDataManager);
-            mNotificationViewController.enable();
-        });
-    }
-
-    private void setupHandleBar() {
-        mHandleBar = mNotificationView.findViewById(R.id.handle_bar);
-        GestureDetector handleBarCloseNotificationGestureDetector = new GestureDetector(mContext,
-                new HandleBarCloseGestureListener());
-        mHandleBar.setOnTouchListener((v, event) -> {
-            handleBarCloseNotificationGestureDetector.onTouchEvent(event);
-            maybeCompleteAnimation(event);
-            return true;
-        });
-    }
-
-    private void setupNotificationPanel() {
-        View glassPane = mNotificationView.findViewById(R.id.glass_pane);
-        mNotificationList = mNotificationView.findViewById(R.id.notifications);
-        GestureDetector closeGestureDetector = new GestureDetector(mContext,
-                new CloseGestureListener() {
-                    @Override
-                    protected void close() {
-                        if (isPanelExpanded()) {
-                            animateCollapsePanel();
-                        }
-                    }
-                });
-
-        // The glass pane is used to view touch events before passed to the notification list.
-        // This allows us to initialize gesture listeners and detect when to close the notifications
-        glassPane.setOnTouchListener((v, event) -> {
-            if (isClosingAction(event)) {
-                mNotificationListAtEndAtTimeOfTouch = false;
-            }
-            if (isOpeningAction(event)) {
-                mFirstTouchDownOnGlassPane = event.getRawX();
-                mNotificationListAtEndAtTimeOfTouch = mNotificationListAtEnd;
-                // Reset the tracker when there is a touch down on the glass pane.
-                setIsTracking(false);
-                // Pass the down event to gesture detector so that it knows where the touch event
-                // started.
-                closeGestureDetector.onTouchEvent(event);
-            }
-            return false;
-        });
-
-        mNotificationList.addOnScrollListener(new RecyclerView.OnScrollListener() {
-            @Override
-            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
-                super.onScrolled(recyclerView, dx, dy);
-                // Check if we can scroll vertically in the animation direction.
-                if (!mNotificationList.canScrollVertically(mAnimateDirection)) {
-                    mNotificationListAtEnd = true;
-                    return;
-                }
-                mNotificationListAtEnd = false;
-                mIsSwipingVerticallyToClose = false;
-                mNotificationListAtEndAtTimeOfTouch = false;
-            }
-        });
-
-        mNotificationList.setOnTouchListener((v, event) -> {
-            mIsNotificationCardSwiping = Math.abs(mFirstTouchDownOnGlassPane - event.getRawX())
-                    > SWIPE_MAX_OFF_PATH;
-            if (mNotificationListAtEndAtTimeOfTouch && mNotificationListAtEnd) {
-                // We need to save the state here as if notification card is swiping we will
-                // change the mNotificationListAtEndAtTimeOfTouch. This is to protect
-                // closing the notification shade while the notification card is being swiped.
-                mIsSwipingVerticallyToClose = true;
-            }
-
-            // If the card is swiping we should not allow the notification shade to close.
-            // Hence setting mNotificationListAtEndAtTimeOfTouch to false will stop that
-            // for us. We are also checking for isTracking() because while swiping the
-            // notification shade to close if the user goes a bit horizontal while swiping
-            // upwards then also this should close.
-            if (mIsNotificationCardSwiping && !isTracking()) {
-                mNotificationListAtEndAtTimeOfTouch = false;
-            }
-
-            boolean handled = closeGestureDetector.onTouchEvent(event);
-            boolean isTracking = isTracking();
-            Rect rect = getLayout().getClipBounds();
-            float clippedHeight = 0;
-            if (rect != null) {
-                clippedHeight = rect.bottom;
-            }
-            if (!handled && isClosingAction(event) && mIsSwipingVerticallyToClose) {
-                if (getSettleClosePercentage() < getPercentageFromEndingEdge() && isTracking) {
-                    animatePanel(DEFAULT_FLING_VELOCITY, false);
-                } else if (clippedHeight != getLayout().getHeight() && isTracking) {
-                    // this can be caused when user is at the end of the list and trying to
-                    // fling to top of the list by scrolling down.
-                    animatePanel(DEFAULT_FLING_VELOCITY, true);
-                }
-            }
-
-            // Updating the mNotificationListAtEndAtTimeOfTouch state has to be done after
-            // the event has been passed to the closeGestureDetector above, such that the
-            // closeGestureDetector sees the up event before the state has changed.
-            if (isClosingAction(event)) {
-                mNotificationListAtEndAtTimeOfTouch = false;
-            }
-            return handled || isTracking;
-        });
-    }
-
-    /** Called when the car power state is changed to ON. */
-    public void onCarPowerStateOn() {
-        if (mNotificationClickHandlerFactory != null) {
-            mNotificationClickHandlerFactory.clearAllNotifications();
-        }
-        mNotificationDataManager.clearAll();
-    }
-
-    // OverlayPanelViewController
-
-    @Override
-    protected boolean shouldAnimateCollapsePanel() {
-        return true;
-    }
-
-    @Override
-    protected void onAnimateCollapsePanel() {
-        // No op.
-    }
-
-    @Override
-    protected boolean shouldAnimateExpandPanel() {
-        return mCommandQueue.panelsEnabled();
-    }
-
-    @Override
-    protected void onAnimateExpandPanel() {
-        mNotificationList.scrollToPosition(0);
-    }
-
-    @Override
-    protected void onCollapseAnimationEnd() {
-        mNotificationViewController.onVisibilityChanged(false);
-    }
-
-    @Override
-    protected void onExpandAnimationEnd() {
-        mNotificationViewController.onVisibilityChanged(true);
-        mNotificationView.setVisibleNotificationsAsSeen();
-    }
-
-    @Override
-    protected void onPanelVisible(boolean visible) {
-        super.onPanelVisible(visible);
-        mUiBgExecutor.execute(() -> {
-            try {
-                if (visible) {
-                    // When notification panel is open even just a bit, we want to clear
-                    // notification effects.
-                    boolean clearNotificationEffects =
-                            mStatusBarStateController.getState() != StatusBarState.KEYGUARD;
-                    mBarService.onPanelRevealed(clearNotificationEffects,
-                            mNotificationDataManager.getVisibleNotifications().size());
-                } else {
-                    mBarService.onPanelHidden();
-                }
-            } catch (RemoteException ex) {
-                // Won't fail unless the world has ended.
-                Log.e(TAG, String.format(
-                        "Unable to notify StatusBarService of panel visibility: %s", visible));
-            }
-        });
-
-    }
-
-    @Override
-    protected void onPanelExpanded(boolean expand) {
-        super.onPanelExpanded(expand);
-
-        if (expand && mStatusBarStateController.getState() != StatusBarState.KEYGUARD) {
-            if (DEBUG) {
-                Log.v(TAG, "clearing notification effects from setExpandedHeight");
-            }
-            clearNotificationEffects();
-        }
-        if (!expand) {
-            mNotificationVisibilityLogger.log(isPanelExpanded());
-        }
-    }
-
-    /**
-     * Clear Buzz/Beep/Blink.
-     */
-    private void clearNotificationEffects() {
-        try {
-            mBarService.clearNotificationEffects();
-        } catch (RemoteException e) {
-            // Won't fail unless the world has ended.
-        }
-    }
-
-    @Override
-    protected void onOpenScrollStart() {
-        mNotificationList.scrollToPosition(0);
-    }
-
-    @Override
-    protected void onScroll(int y) {
-        if (mHandleBar != null) {
-            ViewGroup.MarginLayoutParams lp =
-                    (ViewGroup.MarginLayoutParams) mHandleBar.getLayoutParams();
-            // Adjust handlebar to new pointer position, and a little more depending on the
-            // animate direction so the bar can be seen fully.
-            if (mAnimateDirection > 0) {
-                mHandleBar.setTranslationY(y - mHandleBar.getHeight() - lp.bottomMargin);
-            } else {
-                mHandleBar.setTranslationY(y + mHandleBar.getHeight() + lp.topMargin);
-            }
-        }
-
-        if (mNotificationView.getHeight() > 0) {
-            Drawable background = mNotificationView.getBackground().mutate();
-            background.setAlpha((int) (getBackgroundAlpha(y) * 255));
-            mNotificationView.setBackground(background);
-        }
-    }
-
-    @Override
-    protected boolean shouldAllowClosingScroll() {
-        // Unless the notification list is at the end, the panel shouldn't be allowed to
-        // collapse on scroll.
-        return mNotificationListAtEndAtTimeOfTouch;
-    }
-
-    /**
-     * Calculates the alpha value for the background based on how much of the notification
-     * shade is visible to the user. When the notification shade is completely open then
-     * alpha value will be 1.
-     */
-    private float getBackgroundAlpha(int y) {
-        float fractionCovered =
-                ((float) (mAnimateDirection > 0 ? y : mNotificationView.getHeight() - y))
-                        / mNotificationView.getHeight();
-        return mInitialBackgroundAlpha + fractionCovered * mBackgroundAlphaDiff;
-    }
-
-    /** Sets the unseen count listener. */
-    public void setOnUnseenCountUpdateListener(OnUnseenCountUpdateListener listener) {
-        mUnseenCountUpdateListener = listener;
-    }
-
-    /** Listener that is updated when the number of unseen notifications changes. */
-    public interface OnUnseenCountUpdateListener {
-        /**
-         * This method is automatically called whenever there is an update to the number of unseen
-         * notifications. This method can be extended by OEMs to customize the desired logic.
-         */
-        void onUnseenCountUpdate(int unseenNotificationCount);
-    }
-
-    /**
-     * To be installed on the handle bar.
-     */
-    private class HandleBarCloseGestureListener extends
-            GestureDetector.SimpleOnGestureListener {
-
-        @Override
-        public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
-                float distanceY) {
-            calculatePercentageFromEndingEdge(event2.getRawY());
-            // To prevent the jump in the clip bounds while closing the notification panel using
-            // the handle bar we should calculate the height using the diff of event1 and event2.
-            // This will help the notification shade to clip smoothly as the event2 value changes
-            // as event1 value will be fixed.
-            float diff = mAnimateDirection * (event1.getRawY() - event2.getRawY());
-            float y = mAnimateDirection > 0
-                    ? getLayout().getHeight() - diff
-                    : diff;
-            // Ensure the position is within the overlay panel.
-            y = Math.max(0, Math.min(y, getLayout().getHeight()));
-            setViewClipBounds((int) y);
-            return true;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java
deleted file mode 100644
index 17b6b74..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.notification;
-
-import android.car.hardware.power.CarPowerManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Configuration;
-import android.os.UserHandle;
-import android.util.Log;
-
-import androidx.annotation.CallSuper;
-
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.navigationbar.CarNavigationBarController;
-import com.android.systemui.car.window.OverlayViewMediator;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-
-import javax.inject.Inject;
-
-/**
- * The view mediator which attaches the view controller to other elements of the system ui. Disables
- * drag open behavior of the notification panel from any navigation bar.
- */
-@SysUISingleton
-public class NotificationPanelViewMediator implements OverlayViewMediator,
-        ConfigurationController.ConfigurationListener {
-
-    private static final boolean DEBUG = false;
-    private static final String TAG = "NotificationPanelVM";
-
-    private final CarNavigationBarController mCarNavigationBarController;
-    private final NotificationPanelViewController mNotificationPanelViewController;
-    private final PowerManagerHelper mPowerManagerHelper;
-    private final BroadcastDispatcher mBroadcastDispatcher;
-    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
-    private final ConfigurationController mConfigurationController;
-
-    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (DEBUG) Log.v(TAG, "onReceive: " + intent);
-            String action = intent.getAction();
-            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
-                if (mNotificationPanelViewController.isPanelExpanded()) {
-                    mNotificationPanelViewController.toggle();
-                }
-            }
-        }
-    };
-
-    @Inject
-    public NotificationPanelViewMediator(
-            CarNavigationBarController carNavigationBarController,
-            NotificationPanelViewController notificationPanelViewController,
-
-            PowerManagerHelper powerManagerHelper,
-            BroadcastDispatcher broadcastDispatcher,
-
-            CarDeviceProvisionedController carDeviceProvisionedController,
-            ConfigurationController configurationController
-    ) {
-        mCarNavigationBarController = carNavigationBarController;
-        mNotificationPanelViewController = notificationPanelViewController;
-        mPowerManagerHelper = powerManagerHelper;
-        mBroadcastDispatcher = broadcastDispatcher;
-        mCarDeviceProvisionedController = carDeviceProvisionedController;
-        mConfigurationController = configurationController;
-    }
-
-    @Override
-    @CallSuper
-    public void registerListeners() {
-        mCarNavigationBarController.registerTopBarTouchListener(
-                mNotificationPanelViewController.getDragCloseTouchListener());
-        mCarNavigationBarController.registerBottomBarTouchListener(
-                mNotificationPanelViewController.getDragCloseTouchListener());
-        mCarNavigationBarController.registerLeftBarTouchListener(
-                mNotificationPanelViewController.getDragCloseTouchListener());
-        mCarNavigationBarController.registerRightBarTouchListener(
-                mNotificationPanelViewController.getDragCloseTouchListener());
-
-        mCarNavigationBarController.registerNotificationController(
-                new CarNavigationBarController.NotificationsShadeController() {
-                    @Override
-                    public void togglePanel() {
-                        mNotificationPanelViewController.toggle();
-                    }
-
-                    @Override
-                    public boolean isNotificationPanelOpen() {
-                        return mNotificationPanelViewController.isPanelExpanded();
-                    }
-                });
-
-        mBroadcastDispatcher.registerReceiver(mBroadcastReceiver,
-                new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS), null, UserHandle.ALL);
-    }
-
-    @Override
-    public void setupOverlayContentViewControllers() {
-        mNotificationPanelViewController.setOnUnseenCountUpdateListener(unseenNotificationCount -> {
-            boolean hasUnseen = unseenNotificationCount > 0;
-            mCarNavigationBarController.toggleAllNotificationsUnseenIndicator(
-                    mCarDeviceProvisionedController.isCurrentUserFullySetup(), hasUnseen);
-        });
-
-        mPowerManagerHelper.setCarPowerStateListener(state -> {
-            if (state == CarPowerManager.CarPowerStateListener.ON) {
-                mNotificationPanelViewController.onCarPowerStateOn();
-            }
-        });
-        mPowerManagerHelper.connectToCarService();
-
-        mConfigurationController.addCallback(this);
-    }
-
-    @Override
-    public void onConfigChanged(Configuration newConfig) {
-        // No op.
-    }
-
-    @Override
-    public void onDensityOrFontScaleChanged() {
-        registerListeners();
-    }
-
-    @Override
-    public void onOverlayChanged() {
-        // No op.
-    }
-
-    @Override
-    public void onUiModeChanged() {
-        // No op.
-    }
-
-    @Override
-    public void onThemeChanged() {
-        // No op.
-    }
-
-    @Override
-    public void onLocaleListChanged() {
-        mNotificationPanelViewController.reinflate();
-        registerListeners();
-    }
-
-    protected final CarNavigationBarController getCarNavigationBarController() {
-        return mCarNavigationBarController;
-    }
-
-    protected final NotificationPanelViewController getNotificationPanelViewController() {
-        return mNotificationPanelViewController;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationShadeWindowControllerImpl.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationShadeWindowControllerImpl.java
deleted file mode 100644
index 1a1da89..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationShadeWindowControllerImpl.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.notification;
-
-import com.android.systemui.car.window.OverlayViewGlobalStateController;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.statusbar.NotificationShadeWindowController;
-
-import javax.inject.Inject;
-
-/** The automotive version of the notification shade window controller. */
-@SysUISingleton
-public class NotificationShadeWindowControllerImpl implements
-        NotificationShadeWindowController {
-
-    private final OverlayViewGlobalStateController mController;
-
-    @Inject
-    public NotificationShadeWindowControllerImpl(OverlayViewGlobalStateController controller) {
-        mController = controller;
-    }
-
-    @Override
-    public void setForceDozeBrightness(boolean forceDozeBrightness) {
-        // No-op since dozing is not supported in Automotive devices.
-    }
-
-    @Override
-    public void setNotificationShadeFocusable(boolean focusable) {
-        mController.setWindowFocusable(focusable);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationVisibilityLogger.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationVisibilityLogger.java
deleted file mode 100644
index b263f72..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationVisibilityLogger.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.notification;
-
-import android.os.RemoteException;
-import android.util.ArraySet;
-import android.util.Log;
-
-import com.android.car.notification.AlertEntry;
-import com.android.car.notification.NotificationDataManager;
-import com.android.internal.statusbar.IStatusBarService;
-import com.android.internal.statusbar.NotificationVisibility;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.UiBackground;
-
-import java.util.Set;
-import java.util.concurrent.Executor;
-
-import javax.inject.Inject;
-
-/**
- * Handles notification logging, in particular, logging which notifications are visible and which
- * are not.
- */
-@SysUISingleton
-public class NotificationVisibilityLogger {
-
-    private static final String TAG = "NotificationVisibilityLogger";
-
-    private final ArraySet<NotificationVisibility> mCurrentlyVisible = new ArraySet<>();
-    private final ArraySet<NotificationVisibility> mNewlyVisible = new ArraySet<>();
-    private final ArraySet<NotificationVisibility> mPreviouslyVisible = new ArraySet<>();
-    private final ArraySet<NotificationVisibility> mTmpCurrentlyVisible = new ArraySet<>();
-
-    private final IStatusBarService mBarService;
-    private final Executor mUiBgExecutor;
-    private final NotificationDataManager mNotificationDataManager;
-
-    private boolean mIsVisible;
-
-    private final Runnable mVisibilityReporter = new Runnable() {
-
-        @Override
-        public void run() {
-            if (mIsVisible) {
-                int count = mNotificationDataManager.getVisibleNotifications().size();
-                for (AlertEntry alertEntry : mNotificationDataManager.getVisibleNotifications()) {
-                    NotificationVisibility visObj = NotificationVisibility.obtain(
-                            alertEntry.getKey(),
-                            /* rank= */ -1,
-                            count,
-                            mIsVisible,
-                            NotificationVisibility.NotificationLocation.LOCATION_MAIN_AREA);
-                    mTmpCurrentlyVisible.add(visObj);
-                    if (!mCurrentlyVisible.contains(visObj)) {
-                        mNewlyVisible.add(visObj);
-                    }
-                }
-            }
-            mPreviouslyVisible.addAll(mCurrentlyVisible);
-            mPreviouslyVisible.removeAll(mTmpCurrentlyVisible);
-            onNotificationVisibilityChanged(mNewlyVisible, mPreviouslyVisible);
-
-            recycleAllVisibilityObjects(mCurrentlyVisible);
-            mCurrentlyVisible.addAll(mTmpCurrentlyVisible);
-
-            recycleAllVisibilityObjects(mPreviouslyVisible);
-            recycleAllVisibilityObjects(mNewlyVisible);
-            recycleAllVisibilityObjects(mTmpCurrentlyVisible);
-        }
-    };
-
-    @Inject
-    public NotificationVisibilityLogger(
-            @UiBackground Executor uiBgExecutor,
-            IStatusBarService barService,
-            NotificationDataManager notificationDataManager) {
-        mUiBgExecutor = uiBgExecutor;
-        mBarService = barService;
-        mNotificationDataManager = notificationDataManager;
-    }
-
-    /** Triggers a visibility report update to be sent to StatusBarService. */
-    public void log(boolean isVisible) {
-        mIsVisible = isVisible;
-        mUiBgExecutor.execute(mVisibilityReporter);
-    }
-
-    /** Stops logging, clearing all visibility objects. */
-    public void stop() {
-        recycleAllVisibilityObjects(mCurrentlyVisible);
-    }
-
-    /**
-     * Notify StatusBarService of change in notifications' visibility.
-     */
-    private void onNotificationVisibilityChanged(
-            Set<NotificationVisibility> newlyVisible, Set<NotificationVisibility> noLongerVisible) {
-        if (newlyVisible.isEmpty() && noLongerVisible.isEmpty()) {
-            return;
-        }
-
-        try {
-            mBarService.onNotificationVisibilityChanged(
-                    cloneVisibilitiesAsArr(newlyVisible), cloneVisibilitiesAsArr(noLongerVisible));
-        } catch (RemoteException e) {
-            // Won't fail unless the world has ended.
-            Log.e(TAG, "Failed to notify StatusBarService of notification visibility change");
-        }
-    }
-
-    /**
-     * Clears array and recycles NotificationVisibility objects for reuse.
-     */
-    private static void recycleAllVisibilityObjects(ArraySet<NotificationVisibility> array) {
-        for (int i = 0; i < array.size(); i++) {
-            array.valueAt(i).recycle();
-        }
-        array.clear();
-    }
-
-    /**
-     * Converts Set of NotificationVisibility objects to primitive array.
-     */
-    private static NotificationVisibility[] cloneVisibilitiesAsArr(Set<NotificationVisibility> c) {
-        NotificationVisibility[] array = new NotificationVisibility[c.size()];
-        int i = 0;
-        for (NotificationVisibility nv : c) {
-            if (nv != null) {
-                array[i] = nv.clone();
-            }
-            i++;
-        }
-        return array;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/PowerManagerHelper.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/PowerManagerHelper.java
deleted file mode 100644
index da43c54..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/PowerManagerHelper.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.notification;
-
-import android.annotation.NonNull;
-import android.car.Car;
-import android.car.hardware.power.CarPowerManager;
-import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
-import android.util.Log;
-
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.dagger.SysUISingleton;
-
-import javax.inject.Inject;
-
-/**
- * Helper class for connecting to the {@link CarPowerManager} and listening for power state changes.
- */
-@SysUISingleton
-public class PowerManagerHelper {
-    public static final String TAG = "PowerManagerHelper";
-
-    private final CarServiceProvider mCarServiceProvider;
-
-    private CarPowerManager mCarPowerManager;
-    private CarPowerStateListener mCarPowerStateListener;
-
-    private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceLifecycleListener;
-
-    @Inject
-    public PowerManagerHelper(CarServiceProvider carServiceProvider) {
-        mCarServiceProvider = carServiceProvider;
-        mCarServiceLifecycleListener = car -> {
-            Log.d(TAG, "Car Service connected");
-            mCarPowerManager = (CarPowerManager) car.getCarManager(Car.POWER_SERVICE);
-            if (mCarPowerManager != null) {
-                mCarPowerManager.setListener(mCarPowerStateListener);
-            } else {
-                Log.e(TAG, "CarPowerManager service not available");
-            }
-        };
-    }
-
-    /**
-     * Sets a {@link CarPowerStateListener}. Should be set before {@link #connectToCarService()}.
-     */
-    public void setCarPowerStateListener(@NonNull CarPowerStateListener listener) {
-        mCarPowerStateListener = listener;
-    }
-
-    /**
-     * Connect to Car service.
-     */
-    public void connectToCarService() {
-        mCarServiceProvider.addListener(mCarServiceLifecycleListener);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/TopNotificationPanelViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/TopNotificationPanelViewMediator.java
deleted file mode 100644
index 9bc5b74c..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/TopNotificationPanelViewMediator.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.notification;
-
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.navigationbar.CarNavigationBarController;
-import com.android.systemui.car.window.OverlayPanelViewController;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-
-import javax.inject.Inject;
-
-/**
- * Implementation of NotificationPanelViewMediator that sets the notification panel to be opened
- * from the top navigation bar.
- */
-@SysUISingleton
-public class TopNotificationPanelViewMediator extends NotificationPanelViewMediator {
-
-    @Inject
-    public TopNotificationPanelViewMediator(
-            CarNavigationBarController carNavigationBarController,
-            NotificationPanelViewController notificationPanelViewController,
-
-            PowerManagerHelper powerManagerHelper,
-            BroadcastDispatcher broadcastDispatcher,
-
-            CarDeviceProvisionedController carDeviceProvisionedController,
-            ConfigurationController configurationController
-    ) {
-        super(carNavigationBarController,
-                notificationPanelViewController,
-                powerManagerHelper,
-                broadcastDispatcher,
-                carDeviceProvisionedController,
-                configurationController);
-        notificationPanelViewController.setOverlayDirection(
-                OverlayPanelViewController.OVERLAY_FROM_TOP_BAR);
-    }
-
-    @Override
-    public void registerListeners() {
-        super.registerListeners();
-        getCarNavigationBarController().registerTopBarTouchListener(
-                getNotificationPanelViewController().getDragOpenTouchListener());
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/rvc/RearViewCameraViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/rvc/RearViewCameraViewController.java
deleted file mode 100644
index d634633..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/rvc/RearViewCameraViewController.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.rvc;
-
-import android.app.ActivityView;
-import android.app.ActivityView.StateCallback;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.util.Slog;
-import android.view.ViewGroup;
-import android.widget.LinearLayout.LayoutParams;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.R;
-import com.android.systemui.car.window.OverlayViewController;
-import com.android.systemui.car.window.OverlayViewGlobalStateController;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
-
-import javax.inject.Inject;
-
-/** View controller for the rear view camera. */
-@SysUISingleton
-public class RearViewCameraViewController extends OverlayViewController {
-    private static final String TAG = "RearViewCameraView";
-    private static final boolean DBG = false;
-
-    private final ComponentName mRearViewCameraActivity;
-    private ViewGroup mRvcView;
-    private final LayoutParams mRvcViewLayoutParams = new LayoutParams(
-            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, /* weight= */ 1.0f);
-    @VisibleForTesting
-    ActivityView mActivityView;
-    @VisibleForTesting
-    final StateCallback mActivityViewCallback = new StateCallback() {
-        @Override
-        public void onActivityViewReady(ActivityView view) {
-            Intent intent = new Intent(Intent.ACTION_MAIN)
-                    .setComponent(mRearViewCameraActivity)
-                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
-                    .addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT)
-                    .addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
-            // TODO(b/170899079): Migrate this to FixedActivityService.
-            view.startActivity(intent);
-        }
-
-        @Override
-        public void onActivityViewDestroyed(ActivityView view) {}
-    };
-
-    @Inject
-    public RearViewCameraViewController(
-            @Main Resources resources,
-            OverlayViewGlobalStateController overlayViewGlobalStateController) {
-        super(R.id.rear_view_camera_stub, overlayViewGlobalStateController);
-        String rearViewCameraActivityName = resources.getString(
-                R.string.config_rearViewCameraActivity);
-        if (!rearViewCameraActivityName.isEmpty()) {
-            mRearViewCameraActivity = ComponentName.unflattenFromString(rearViewCameraActivityName);
-            if (DBG) Slog.d(TAG, "mRearViewCameraActivity=" + mRearViewCameraActivity);
-        } else {
-            mRearViewCameraActivity = null;
-            Slog.e(TAG, "RearViewCameraViewController is disabled, since no Activity is defined");
-        }
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        mRvcView = (ViewGroup) getLayout().findViewById(R.id.rear_view_camera_container);
-        getLayout().findViewById(R.id.close_button).setOnClickListener(v -> {
-            stop();
-        });
-    }
-
-    @Override
-    protected void hideInternal() {
-        super.hideInternal();
-        if (DBG) Slog.d(TAG, "hideInternal: mActivityView=" + mActivityView);
-        if (mActivityView == null) return;
-        mRvcView.removeView(mActivityView);
-        // Release ActivityView since the Activity on ActivityView (with showWhenLocked flag) keeps
-        // running even if ActivityView is hidden.
-        mActivityView.release();
-        mActivityView = null;
-    }
-
-    @Override
-    protected void showInternal() {
-        super.showInternal();
-        if (DBG) Slog.d(TAG, "showInternal: mActivityView=" + mActivityView);
-        if (mActivityView != null) return;
-        mActivityView = new ActivityView(mRvcView.getContext());
-        mActivityView.setCallback(mActivityViewCallback);
-        mActivityView.setLayoutParams(mRvcViewLayoutParams);
-        mRvcView.addView(mActivityView, /* index= */ 0);
-    }
-
-    boolean isShown() {
-        return mActivityView != null;
-    }
-
-    boolean isEnabled() {
-        return mRearViewCameraActivity != null;
-    }
-
-    @Override
-    protected boolean shouldShowHUN() {
-        return false;
-    }
-
-    @Override
-    protected boolean shouldShowWhenOccluded() {
-        // Returns true to show it on top of Keylock.
-        return true;
-    }
-
-    @Override
-    protected boolean shouldShowNavigationBarInsets() {
-        return true;
-    }
-
-    @Override
-    protected boolean shouldShowStatusBarInsets() {
-        return true;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/rvc/RearViewCameraViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/rvc/RearViewCameraViewMediator.java
deleted file mode 100644
index c575c42..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/rvc/RearViewCameraViewMediator.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.rvc;
-
-import android.car.Car;
-import android.car.VehicleGear;
-import android.car.VehiclePropertyIds;
-import android.car.hardware.CarPropertyValue;
-import android.car.hardware.property.CarPropertyManager;
-import android.car.hardware.property.CarPropertyManager.CarPropertyEventCallback;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.UserHandle;
-import android.util.Slog;
-
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.car.window.OverlayViewMediator;
-import com.android.systemui.dagger.SysUISingleton;
-
-import javax.inject.Inject;
-
-/**
- * View mediator for the rear view camera (RVC), which monitors the gear changes and shows
- * the RVC when the gear position is R and otherwise it hides the RVC.
- */
-@SysUISingleton
-public class RearViewCameraViewMediator implements OverlayViewMediator {
-    private static final String TAG = "RearViewCameraView";
-    private static final boolean DBG = false;
-
-    private final RearViewCameraViewController mRearViewCameraViewController;
-    private final CarServiceProvider mCarServiceProvider;
-    private final BroadcastDispatcher mBroadcastDispatcher;
-
-    private CarPropertyManager mCarPropertyManager;
-    // TODO(b/170792252): Replace the following with the callback from CarEvsManager if it's ready.
-    private final CarPropertyEventCallback mPropertyEventCallback = new CarPropertyEventCallback() {
-        @Override
-        public void onChangeEvent(CarPropertyValue value) {
-            if (DBG) Slog.d(TAG, "onChangeEvent value=" + value);
-            if (value.getPropertyId() != VehiclePropertyIds.GEAR_SELECTION) {
-                Slog.w(TAG, "Got the event for non-registered property: " + value.getPropertyId());
-                return;
-            }
-            if ((Integer) value.getValue() == VehicleGear.GEAR_REVERSE) {
-                mRearViewCameraViewController.start();
-            } else {
-                mRearViewCameraViewController.stop();
-            }
-        }
-        @Override
-        public void onErrorEvent(int propId, int zone) {
-            Slog.e(TAG, "onErrorEvent propId=" + propId + ", zone=" + zone);
-        }
-    };
-
-    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (DBG) Slog.d(TAG, "onReceive: " + intent);
-            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())
-                    && mRearViewCameraViewController.isShown()) {
-                mRearViewCameraViewController.stop();
-            }
-        }
-    };
-
-    @Inject
-    public RearViewCameraViewMediator(
-            RearViewCameraViewController rearViewCameraViewController,
-            CarServiceProvider carServiceProvider,
-            BroadcastDispatcher broadcastDispatcher) {
-        if (DBG) Slog.d(TAG, "RearViewCameraViewMediator:init");
-        mRearViewCameraViewController = rearViewCameraViewController;
-        mCarServiceProvider = carServiceProvider;
-        mBroadcastDispatcher = broadcastDispatcher;
-    }
-
-    @Override
-    public void registerListeners() {
-        if (DBG) Slog.d(TAG, "RearViewCameraViewMediator:registerListeners");
-        if (!mRearViewCameraViewController.isEnabled()) {
-            Slog.i(TAG, "RearViewCameraViewController isn't enabled");
-            return;
-        }
-
-        mCarServiceProvider.addListener(car -> {
-            mCarPropertyManager = (CarPropertyManager) car.getCarManager(Car.PROPERTY_SERVICE);
-            if (mCarPropertyManager == null) {
-                Slog.e(TAG, "Unable to get CarPropertyManager");
-                return;
-            }
-            if (DBG) Slog.d(TAG, "Registering mPropertyEventCallback.");
-            mCarPropertyManager.registerCallback(mPropertyEventCallback,
-                    VehiclePropertyIds.GEAR_SELECTION, CarPropertyManager.SENSOR_RATE_UI);
-        });
-        mBroadcastDispatcher.registerReceiver(mBroadcastReceiver,
-                new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS), /* executor= */ null,
-                UserHandle.ALL);
-    }
-
-    @Override
-    public void setupOverlayContentViewControllers() {}
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java
deleted file mode 100644
index b8d6964..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.sideloaded;
-
-import android.app.IActivityTaskManager;
-import android.content.Context;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.systemui.SystemUI;
-import com.android.systemui.dagger.SysUISingleton;
-
-import javax.inject.Inject;
-
-/**
- * Controller responsible for detecting unsafe apps.
- */
-@SysUISingleton
-public class SideLoadedAppController extends SystemUI {
-    private static final String TAG = SideLoadedAppController.class.getSimpleName();
-
-    private IActivityTaskManager mActivityTaskManager;
-    private SideLoadedAppListener mSideLoadedAppListener;
-    private SideLoadedAppDetector mSideLoadedAppDetector;
-    private SideLoadedAppStateController mSideLoadedAppStateController;
-
-    @Inject
-    public SideLoadedAppController(Context context,
-            IActivityTaskManager activityTaskManager,
-            SideLoadedAppDetector sideLoadedAppDetector,
-            SideLoadedAppListener sideLoadedAppListener,
-            SideLoadedAppStateController sideLoadedAppStateController) {
-        super(context);
-
-        mSideLoadedAppDetector = sideLoadedAppDetector;
-        mActivityTaskManager = activityTaskManager;
-        mSideLoadedAppListener = sideLoadedAppListener;
-        mSideLoadedAppStateController = sideLoadedAppStateController;
-    }
-
-    @Override
-    public void start() {
-    }
-
-    @Override
-    protected void onBootCompleted() {
-        Log.i(TAG, "OnBootCompleted");
-
-        try {
-            mActivityTaskManager.registerTaskStackListener(mSideLoadedAppListener);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Could not register car side loaded app listener.", e);
-        }
-
-        if (mSideLoadedAppDetector.hasUnsafeInstalledApps()) {
-            mSideLoadedAppStateController.onUnsafeInstalledAppsDetected();
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppDetector.java b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppDetector.java
deleted file mode 100644
index f96ee0f..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppDetector.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.sideloaded;
-
-import android.annotation.NonNull;
-import android.app.ActivityTaskManager.RootTaskInfo;
-import android.content.ComponentName;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.InstallSourceInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.os.UserHandle;
-import android.util.Log;
-
-import com.android.systemui.R;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
-
-import java.util.Arrays;
-import java.util.List;
-
-import javax.inject.Inject;
-
-/**
- * A class that detects unsafe apps.
- * An app is considered safe if is a system app or installed through allowed sources.
- */
-@SysUISingleton
-public class SideLoadedAppDetector {
-    private static final String TAG = SideLoadedAppDetector.class.getSimpleName();
-
-    private final PackageManager mPackageManager;
-    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
-    private final List<String> mAllowedAppInstallSources;
-
-    @Inject
-    public SideLoadedAppDetector(@Main Resources resources, PackageManager packageManager,
-            CarDeviceProvisionedController deviceProvisionedController) {
-        mAllowedAppInstallSources = Arrays.asList(
-                resources.getStringArray(R.array.config_allowedAppInstallSources));
-        mPackageManager = packageManager;
-        mCarDeviceProvisionedController = deviceProvisionedController;
-    }
-
-    boolean hasUnsafeInstalledApps() {
-        int userId = mCarDeviceProvisionedController.getCurrentUser();
-
-        List<PackageInfo> packages = mPackageManager.getInstalledPackagesAsUser(
-                PackageManager.MATCH_DIRECT_BOOT_AWARE
-                        | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
-                userId);
-        for (PackageInfo info : packages) {
-            if (info.applicationInfo == null) {
-                Log.w(TAG, info.packageName + " does not have application info.");
-                return true;
-            }
-
-            if (!isSafe(info.applicationInfo)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    boolean isSafe(@NonNull RootTaskInfo taskInfo) {
-        ComponentName componentName = taskInfo.topActivity;
-        if (componentName == null) {
-            Log.w(TAG, "Task info does not have top activity: " + taskInfo.taskId);
-            return false;
-        }
-        return isSafe(componentName.getPackageName());
-    }
-
-    private boolean isSafe(@NonNull String packageName) {
-        if (packageName == null) {
-            return false;
-        }
-
-        ApplicationInfo applicationInfo;
-        try {
-            int userId = mCarDeviceProvisionedController.getCurrentUser();
-            applicationInfo = mPackageManager.getApplicationInfoAsUser(packageName,
-                    PackageManager.MATCH_DIRECT_BOOT_AWARE
-                            | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
-                    UserHandle.of(userId));
-
-            if (applicationInfo == null) {
-                Log.e(TAG, packageName + " did not have an application info!");
-                return false;
-            }
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Could not get application info for package:" + packageName, e);
-            return false;
-        }
-
-        return isSafe(applicationInfo);
-    }
-
-    private boolean isSafe(@NonNull ApplicationInfo applicationInfo) {
-        String packageName = applicationInfo.packageName;
-
-        if (applicationInfo.isSystemApp() || applicationInfo.isUpdatedSystemApp()) {
-            return true;
-        }
-
-        String initiatingPackageName;
-        try {
-            InstallSourceInfo sourceInfo = mPackageManager.getInstallSourceInfo(packageName);
-            initiatingPackageName = sourceInfo.getInitiatingPackageName();
-            if (initiatingPackageName == null) {
-                Log.w(TAG, packageName + " does not have an installer name.");
-                return false;
-            }
-
-            return mAllowedAppInstallSources.contains(initiatingPackageName);
-        } catch (IllegalArgumentException | PackageManager.NameNotFoundException e) {
-            return false;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppListener.java b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppListener.java
deleted file mode 100644
index db7718b..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppListener.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.sideloaded;
-
-import android.app.ActivityTaskManager.RootTaskInfo;
-import android.app.IActivityTaskManager;
-import android.app.TaskStackListener;
-import android.content.ComponentName;
-import android.hardware.display.DisplayManager;
-import android.os.RemoteException;
-import android.util.Log;
-import android.view.Display;
-
-import java.util.List;
-
-import javax.inject.Inject;
-
-/**
- * A TaskStackListener to detect when an unsafe app is launched/foregrounded.
- */
-public class SideLoadedAppListener extends TaskStackListener {
-    private static final String TAG = SideLoadedAppListener.class.getSimpleName();
-
-    private IActivityTaskManager mActivityTaskManager;
-    private DisplayManager mDisplayManager;
-    private SideLoadedAppDetector mSideLoadedAppDetector;
-    private SideLoadedAppStateController mSideLoadedAppStateController;
-
-    @Inject
-    SideLoadedAppListener(SideLoadedAppDetector sideLoadedAppDetector,
-            IActivityTaskManager activityTaskManager,
-            DisplayManager displayManager,
-            SideLoadedAppStateController sideLoadedAppStateController) {
-        mSideLoadedAppDetector = sideLoadedAppDetector;
-        mActivityTaskManager = activityTaskManager;
-        mDisplayManager = displayManager;
-        mSideLoadedAppStateController = sideLoadedAppStateController;
-    }
-
-    @Override
-    public void onTaskCreated(int taskId, ComponentName componentName) throws RemoteException {
-        super.onTaskCreated(taskId, componentName);
-
-        List<RootTaskInfo> taskInfoList = mActivityTaskManager.getAllRootTaskInfos();
-        RootTaskInfo taskInfo = getStackInfo(taskInfoList, taskId);
-        if (taskInfo == null) {
-            Log.e(TAG, "Stack info was not available for taskId: " + taskId);
-            return;
-        }
-
-        if (!mSideLoadedAppDetector.isSafe(taskInfo)) {
-            Display display = mDisplayManager.getDisplay(taskInfo.displayId);
-            mSideLoadedAppStateController.onUnsafeTaskCreatedOnDisplay(display);
-        }
-    }
-
-    @Override
-    public void onTaskStackChanged() throws RemoteException {
-        super.onTaskStackChanged();
-
-        Display[] displays = mDisplayManager.getDisplays();
-        for (Display display : displays) {
-            // Note that the taskInfoList is ordered by recency.
-            List<RootTaskInfo> taskInfoList =
-                    mActivityTaskManager.getAllRootTaskInfosOnDisplay(display.getDisplayId());
-
-            if (taskInfoList == null) {
-                continue;
-            }
-            RootTaskInfo taskInfo = getTopVisibleStackInfo(taskInfoList);
-            if (taskInfo == null) {
-                continue;
-            }
-            if (mSideLoadedAppDetector.isSafe(taskInfo)) {
-                mSideLoadedAppStateController.onSafeTaskDisplayedOnDisplay(display);
-            } else {
-                mSideLoadedAppStateController.onUnsafeTaskDisplayedOnDisplay(display);
-            }
-        }
-    }
-
-    /**
-     * Returns stack info for a given taskId.
-     */
-    private RootTaskInfo getStackInfo(List<RootTaskInfo> taskInfoList, int taskId) {
-        if (taskInfoList == null) {
-            return null;
-        }
-        for (RootTaskInfo taskInfo : taskInfoList) {
-            if (taskInfo.childTaskIds == null) {
-                continue;
-            }
-            for (int taskTaskId : taskInfo.childTaskIds) {
-                if (taskId == taskTaskId) {
-                    return taskInfo;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the first visible stackInfo.
-     */
-    private RootTaskInfo getTopVisibleStackInfo(List<RootTaskInfo> taskInfoList) {
-        for (RootTaskInfo taskInfo : taskInfoList) {
-            if (taskInfo.visible) {
-                return taskInfo;
-            }
-        }
-        return null;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppStateController.java
deleted file mode 100644
index 5b4faa1..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppStateController.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.sideloaded;
-
-import android.util.Log;
-import android.view.Display;
-
-import com.android.systemui.dagger.SysUISingleton;
-
-import javax.inject.Inject;
-
-/**
- * Manager responsible for displaying proper UI when an unsafe app is detected.
- */
-@SysUISingleton
-public class SideLoadedAppStateController {
-    private static final String TAG = SideLoadedAppStateController.class.getSimpleName();
-
-    @Inject
-    SideLoadedAppStateController() {
-    }
-
-    void onUnsafeInstalledAppsDetected() {
-        Log.d(TAG, "Unsafe installed apps detected.");
-    }
-
-    void onUnsafeTaskCreatedOnDisplay(Display display) {
-        Log.d(TAG, "Unsafe task created on display " + display.getDisplayId() + ".");
-    }
-
-    void onSafeTaskDisplayedOnDisplay(Display display) {
-        Log.d(TAG, "Safe task displayed on display " + display.getDisplayId() + ".");
-    }
-
-    void onUnsafeTaskDisplayedOnDisplay(Display display) {
-        Log.d(TAG, "Unsafe task displayed on display " + display.getDisplayId() + ".");
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/DozeServiceHost.java b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/DozeServiceHost.java
deleted file mode 100644
index 3fb3cd8..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/DozeServiceHost.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.statusbar;
-
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.doze.DozeHost;
-
-import javax.inject.Inject;
-
-/** No-op implementation of {@link DozeHost} for use by car sysui, which does not support dozing. */
-@SysUISingleton
-public class DozeServiceHost implements DozeHost {
-
-    @Inject
-    public DozeServiceHost() {}
-
-    @Override
-    public void addCallback(Callback callback) {
-        // No op.
-    }
-
-    @Override
-    public void removeCallback(Callback callback) {
-        // No op.
-    }
-
-    @Override
-    public void startDozing() {
-        // No op.
-    }
-
-    @Override
-    public void pulseWhileDozing(PulseCallback callback, int reason) {
-        // No op.
-    }
-
-    @Override
-    public void stopDozing() {
-        // No op.
-    }
-
-    @Override
-    public void dozeTimeTick() {
-        // No op.
-    }
-
-    @Override
-    public boolean isPowerSaveActive() {
-        return false;
-    }
-
-    @Override
-    public boolean isPulsingBlocked() {
-        return true;
-    }
-
-    @Override
-    public boolean isProvisioned() {
-        return false;
-    }
-
-    @Override
-    public boolean isBlockingDoze() {
-        return true;
-    }
-
-    @Override
-    public void extendPulse(int reason) {
-        // No op.
-    }
-
-    @Override
-    public void setAnimateWakeup(boolean animateWakeup) {
-        // No op.
-    }
-
-    @Override
-    public void setAnimateScreenOff(boolean animateScreenOff) {
-        // No op.
-    }
-
-    @Override
-    public void onSlpiTap(float x, float y) {
-        // No op.
-    }
-
-    @Override
-    public void setDozeScreenBrightness(int value) {
-        // No op.
-    }
-
-    @Override
-    public void prepareForGentleSleep(Runnable onDisplayOffCallback) {
-        // No op.
-    }
-
-    @Override
-    public void cancelGentleSleep() {
-        // No op.
-    }
-
-    @Override
-    public void onIgnoreTouchWhilePulsing(boolean ignore) {
-        // No op.
-    }
-
-    @Override
-    public void stopPulsing() {
-        // No op.
-    }
-
-    @Override
-    public boolean isDozeSuppressed() {
-        return true;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UserNameViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UserNameViewController.java
deleted file mode 100644
index 1b1a118..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UserNameViewController.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.statusbar;
-
-import android.car.Car;
-import android.car.user.CarUserManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.UserInfo;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.util.Log;
-import android.view.View;
-import android.widget.TextView;
-
-import com.android.systemui.R;
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.dagger.SysUISingleton;
-
-import javax.inject.Inject;
-
-/**
- * Controls a TextView with the current driver's username
- */
-@SysUISingleton
-public class UserNameViewController {
-    private static final String TAG = "UserNameViewController";
-
-    private Context mContext;
-    private UserManager mUserManager;
-    private CarUserManager mCarUserManager;
-    private CarServiceProvider mCarServiceProvider;
-    private CarDeviceProvisionedController mCarDeviceProvisionedController;
-    private BroadcastDispatcher mBroadcastDispatcher;
-    private TextView mUserNameView;
-
-    private final BroadcastReceiver mUserUpdateReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            updateUser(mCarDeviceProvisionedController.getCurrentUser());
-        }
-    };
-
-    private boolean mUserLifecycleListenerRegistered = false;
-
-    private final CarUserManager.UserLifecycleListener mUserLifecycleListener =
-            new CarUserManager.UserLifecycleListener() {
-                @Override
-                public void onEvent(CarUserManager.UserLifecycleEvent event) {
-                    if (event.getEventType()
-                            == CarUserManager.USER_LIFECYCLE_EVENT_TYPE_SWITCHING) {
-                        updateUser(event.getUserId());
-                    }
-                }
-            };
-
-    @Inject
-    public UserNameViewController(Context context, CarServiceProvider carServiceProvider,
-            UserManager userManager, BroadcastDispatcher broadcastDispatcher,
-            CarDeviceProvisionedController carDeviceProvisionedController) {
-        mContext = context;
-        mCarServiceProvider = carServiceProvider;
-        mUserManager = userManager;
-        mBroadcastDispatcher = broadcastDispatcher;
-        mCarDeviceProvisionedController = carDeviceProvisionedController;
-    }
-
-    /**
-     * Find the {@link TextView} for the driver's user name from a view and if found set it with the
-     * current driver's user name.
-     */
-    public void addUserNameView(View v) {
-        TextView userNameView = v.findViewById(R.id.user_name_text);
-        if (userNameView != null) {
-            if (mUserNameView == null) {
-                registerForUserChangeEvents();
-            }
-            mUserNameView = userNameView;
-            updateUser(mCarDeviceProvisionedController.getCurrentUser());
-        }
-    }
-
-    /**
-     * Clean up the controller and unregister receiver.
-     */
-    public void removeAll() {
-        mUserNameView = null;
-        if (mUserLifecycleListenerRegistered) {
-            mBroadcastDispatcher.unregisterReceiver(mUserUpdateReceiver);
-            if (mCarUserManager != null) {
-                mCarUserManager.removeListener(mUserLifecycleListener);
-            }
-            mUserLifecycleListenerRegistered = false;
-        }
-    }
-
-    private void registerForUserChangeEvents() {
-        // Register for user switching
-        mCarServiceProvider.addListener(car -> {
-            mCarUserManager = (CarUserManager) car.getCarManager(Car.CAR_USER_SERVICE);
-            if (mCarUserManager != null) {
-                mCarUserManager.addListener(Runnable::run, mUserLifecycleListener);
-                mUserLifecycleListenerRegistered = true;
-            } else {
-                Log.e(TAG, "CarUserManager could not be obtained.");
-            }
-        });
-        // Also register for user info changing
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
-        mBroadcastDispatcher.registerReceiver(mUserUpdateReceiver, filter, /* executor= */ null,
-                UserHandle.ALL);
-    }
-
-    private void updateUser(int userId) {
-        if (mUserNameView != null) {
-            UserInfo currentUserInfo = mUserManager.getUserInfo(userId);
-            mUserNameView.setText(currentUserInfo.name);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/CarStatusBarHeader.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/CarStatusBarHeader.java
deleted file mode 100644
index 0a677bf..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/CarStatusBarHeader.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.userswitcher;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.LinearLayout;
-
-import androidx.annotation.IdRes;
-
-import com.android.settingslib.Utils;
-import com.android.systemui.R;
-import com.android.systemui.plugins.DarkIconDispatcher;
-
-/**
- * A view that forms the header of the notification panel. This view will ensure that any
- * status icons that are displayed are tinted accordingly to the current theme.
- */
-public class CarStatusBarHeader extends LinearLayout {
-    public CarStatusBarHeader(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-
-        // Set the light/dark theming on the header status UI to match the current theme.
-        int colorForeground = Utils.getColorAttrDefaultColor(getContext(),
-                android.R.attr.colorForeground);
-        float intensity = colorForeground == Color.WHITE ? 0f : 1f;
-        Rect tintArea = new Rect(0, 0, 0, 0);
-
-        applyDarkness(R.id.clock, tintArea, intensity, colorForeground);
-    }
-
-    private void applyDarkness(@IdRes int id, Rect tintArea, float intensity, int color) {
-        View v = findViewById(id);
-        if (v instanceof DarkIconDispatcher.DarkReceiver) {
-            ((DarkIconDispatcher.DarkReceiver) v).onDarkChanged(tintArea, intensity, color);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java
deleted file mode 100644
index 3a7fac9..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.userswitcher;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.car.Car;
-import android.car.user.CarUserManager;
-import android.content.Context;
-import android.content.res.Resources;
-import android.view.View;
-
-import androidx.recyclerview.widget.GridLayoutManager;
-
-import com.android.systemui.R;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.car.window.OverlayViewController;
-import com.android.systemui.car.window.OverlayViewGlobalStateController;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
-
-import javax.inject.Inject;
-
-/**
- * Controller for {@link R.layout#car_fullscreen_user_switcher}.
- */
-@SysUISingleton
-public class FullScreenUserSwitcherViewController extends OverlayViewController {
-    private final Context mContext;
-    private final Resources mResources;
-    private final CarServiceProvider mCarServiceProvider;
-    private final int mShortAnimationDuration;
-    private CarUserManager mCarUserManager;
-    private UserGridRecyclerView mUserGridView;
-    private UserGridRecyclerView.UserSelectionListener mUserSelectionListener;
-
-    @Inject
-    public FullScreenUserSwitcherViewController(
-            Context context,
-            @Main Resources resources,
-            CarServiceProvider carServiceProvider,
-            OverlayViewGlobalStateController overlayViewGlobalStateController) {
-        super(R.id.fullscreen_user_switcher_stub, overlayViewGlobalStateController);
-        mContext = context;
-        mResources = resources;
-        mCarServiceProvider = carServiceProvider;
-        mCarServiceProvider.addListener(car -> {
-            mCarUserManager = (CarUserManager) car.getCarManager(Car.CAR_USER_SERVICE);
-            registerCarUserManagerIfPossible();
-        });
-        mShortAnimationDuration = mResources.getInteger(android.R.integer.config_shortAnimTime);
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        // Initialize user grid.
-        mUserGridView = getLayout().findViewById(R.id.user_grid);
-        GridLayoutManager layoutManager = new GridLayoutManager(mContext,
-                mResources.getInteger(R.integer.user_fullscreen_switcher_num_col));
-        mUserGridView.setLayoutManager(layoutManager);
-        mUserGridView.buildAdapter();
-        mUserGridView.setUserSelectionListener(mUserSelectionListener);
-        registerCarUserManagerIfPossible();
-    }
-
-    @Override
-    protected boolean shouldFocusWindow() {
-        return false;
-    }
-
-    @Override
-    protected void showInternal() {
-        getLayout().setVisibility(View.VISIBLE);
-    }
-
-    @Override
-    protected void hideInternal() {
-        // Switching is about to happen, since it takes time, fade out the switcher gradually.
-        fadeOut();
-    }
-
-    private void fadeOut() {
-        mUserGridView.animate()
-                .alpha(0.0f)
-                .setDuration(mShortAnimationDuration)
-                .setListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(Animator animation) {
-                        getLayout().setVisibility(View.GONE);
-                        mUserGridView.setAlpha(1.0f);
-                    }
-                });
-
-    }
-
-    /**
-     * Set {@link UserGridRecyclerView.UserSelectionListener}.
-     */
-    void setUserGridSelectionListener(
-            UserGridRecyclerView.UserSelectionListener userGridSelectionListener) {
-        mUserSelectionListener = userGridSelectionListener;
-    }
-
-    private void registerCarUserManagerIfPossible() {
-        if (mUserGridView != null && mCarUserManager != null) {
-            mUserGridView.setCarUserManager(mCarUserManager);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java
deleted file mode 100644
index 165fe63..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.userswitcher;
-
-import com.android.systemui.car.keyguard.CarKeyguardViewController;
-import com.android.systemui.car.window.OverlayViewMediator;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.StatusBarState;
-
-import javax.inject.Inject;
-
-/**
- * Manages the fullscreen user switcher and it's interactions with the keyguard.
- */
-@SysUISingleton
-public class FullscreenUserSwitcherViewMediator implements OverlayViewMediator {
-    private static final String TAG = FullscreenUserSwitcherViewMediator.class.getSimpleName();
-
-    private final StatusBarStateController mStatusBarStateController;
-    private final FullScreenUserSwitcherViewController mFullScreenUserSwitcherViewController;
-    private final CarKeyguardViewController mCarKeyguardViewController;
-    private final UserSwitchTransitionViewController mUserSwitchTransitionViewController;
-
-    @Inject
-    public FullscreenUserSwitcherViewMediator(
-            StatusBarStateController statusBarStateController,
-            CarKeyguardViewController carKeyguardViewController,
-            UserSwitchTransitionViewController userSwitchTransitionViewController,
-            FullScreenUserSwitcherViewController fullScreenUserSwitcherViewController) {
-
-        mStatusBarStateController = statusBarStateController;
-        mCarKeyguardViewController = carKeyguardViewController;
-        mUserSwitchTransitionViewController = userSwitchTransitionViewController;
-        mFullScreenUserSwitcherViewController = fullScreenUserSwitcherViewController;
-    }
-
-    @Override
-    public void registerListeners() {
-        registerUserSwitcherHideListeners();
-    }
-
-    private void registerUserSwitcherHideListeners() {
-        mStatusBarStateController.addCallback(new StatusBarStateController.StateListener() {
-            @Override
-            public void onStateChanged(int newState) {
-                if (newState == StatusBarState.FULLSCREEN_USER_SWITCHER) {
-                    return;
-                }
-                hide();
-            }
-        });
-    }
-
-    @Override
-    public void setupOverlayContentViewControllers() {
-        mFullScreenUserSwitcherViewController.setUserGridSelectionListener(this::onUserSelected);
-    }
-
-    /**
-     * Every time user clicks on an item in the switcher, we hide the switcher.
-     */
-    private void onUserSelected(UserGridRecyclerView.UserRecord record) {
-        if (record.mType != UserGridRecyclerView.UserRecord.FOREGROUND_USER) {
-            mCarKeyguardViewController.hideKeyguardToPrepareBouncer();
-            // If guest user, we cannot use record.mInfo.id and should listen to the User lifecycle
-            // event instead.
-            if (record.mType != UserGridRecyclerView.UserRecord.START_GUEST) {
-                mUserSwitchTransitionViewController.handleShow(record.mInfo.id);
-            }
-        }
-
-        hide();
-    }
-
-    private void hide() {
-        mFullScreenUserSwitcherViewController.stop();
-    }
-
-    private void show() {
-        mFullScreenUserSwitcherViewController.start();
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java
deleted file mode 100644
index 6d63e31..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java
+++ /dev/null
@@ -1,657 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.userswitcher;
-
-import static android.content.DialogInterface.BUTTON_NEGATIVE;
-import static android.content.DialogInterface.BUTTON_POSITIVE;
-import static android.os.UserManager.DISALLOW_ADD_USER;
-import static android.os.UserManager.SWITCHABILITY_STATUS_OK;
-import static android.view.WindowInsets.Type.statusBars;
-
-import android.annotation.IntDef;
-import android.annotation.Nullable;
-import android.annotation.UserIdInt;
-import android.app.ActivityManager;
-import android.app.AlertDialog;
-import android.app.AlertDialog.Builder;
-import android.app.Dialog;
-import android.car.user.CarUserManager;
-import android.car.user.UserCreationResult;
-import android.car.user.UserSwitchResult;
-import android.car.userlib.UserHelper;
-import android.car.util.concurrent.AsyncFuture;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.UserInfo;
-import android.content.res.Resources;
-import android.graphics.Rect;
-import android.os.AsyncTask;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.sysprop.CarProperties;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.WindowManager;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.core.graphics.drawable.RoundedBitmapDrawable;
-import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
-import androidx.recyclerview.widget.GridLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.internal.util.UserIcons;
-import com.android.systemui.R;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-/**
- * Displays a GridLayout with icons for the users in the system to allow switching between users.
- * One of the uses of this is for the lock screen in auto.
- */
-public class UserGridRecyclerView extends RecyclerView {
-    private static final String TAG = UserGridRecyclerView.class.getSimpleName();
-    private static final int TIMEOUT_MS = CarProperties.user_hal_timeout().orElse(5_000) + 500;
-
-    private UserSelectionListener mUserSelectionListener;
-    private UserAdapter mAdapter;
-    private CarUserManager mCarUserManager;
-    private UserManager mUserManager;
-    private Context mContext;
-    private UserIconProvider mUserIconProvider;
-
-    private final BroadcastReceiver mUserUpdateReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            onUsersUpdate();
-        }
-    };
-
-    public UserGridRecyclerView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mContext = context;
-        mUserManager = UserManager.get(mContext);
-        mUserIconProvider = new UserIconProvider();
-
-        addItemDecoration(new ItemSpacingDecoration(mContext.getResources().getDimensionPixelSize(
-                R.dimen.car_user_switcher_vertical_spacing_between_users)));
-    }
-
-    /**
-     * Register listener for any update to the users
-     */
-    @Override
-    public void onFinishInflate() {
-        super.onFinishInflate();
-        registerForUserEvents();
-    }
-
-    /**
-     * Unregisters listener checking for any change to the users
-     */
-    @Override
-    public void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        unregisterForUserEvents();
-    }
-
-    /**
-     * Initializes the adapter that populates the grid layout
-     */
-    public void buildAdapter() {
-        List<UserRecord> userRecords = createUserRecords(getUsersForUserGrid());
-        mAdapter = new UserAdapter(mContext, userRecords);
-        super.setAdapter(mAdapter);
-    }
-
-    private List<UserInfo> getUsersForUserGrid() {
-        return mUserManager.getAliveUsers()
-                .stream()
-                .filter(UserInfo::supportsSwitchToByUser)
-                .collect(Collectors.toList());
-    }
-
-    private List<UserRecord> createUserRecords(List<UserInfo> userInfoList) {
-        int fgUserId = ActivityManager.getCurrentUser();
-        UserHandle fgUserHandle = UserHandle.of(fgUserId);
-        List<UserRecord> userRecords = new ArrayList<>();
-
-        // If the foreground user CANNOT switch to other users, only display the foreground user.
-        if (mUserManager.getUserSwitchability(fgUserHandle) != SWITCHABILITY_STATUS_OK) {
-            userRecords.add(createForegroundUserRecord());
-            return userRecords;
-        }
-
-        for (UserInfo userInfo : userInfoList) {
-            if (userInfo.isGuest()) {
-                // Don't display guests in the switcher.
-                continue;
-            }
-
-            boolean isForeground = fgUserId == userInfo.id;
-            UserRecord record = new UserRecord(userInfo,
-                    isForeground ? UserRecord.FOREGROUND_USER : UserRecord.BACKGROUND_USER);
-            userRecords.add(record);
-        }
-
-        // Add button for starting guest session.
-        userRecords.add(createStartGuestUserRecord());
-
-        // Add add user record if the foreground user can add users
-        if (!mUserManager.hasUserRestriction(DISALLOW_ADD_USER, fgUserHandle)) {
-            userRecords.add(createAddUserRecord());
-        }
-
-        return userRecords;
-    }
-
-    private UserRecord createForegroundUserRecord() {
-        return new UserRecord(mUserManager.getUserInfo(ActivityManager.getCurrentUser()),
-                UserRecord.FOREGROUND_USER);
-    }
-
-    /**
-     * Create guest user record
-     */
-    private UserRecord createStartGuestUserRecord() {
-        return new UserRecord(null /* userInfo */, UserRecord.START_GUEST);
-    }
-
-    /**
-     * Create add user record
-     */
-    private UserRecord createAddUserRecord() {
-        return new UserRecord(null /* userInfo */, UserRecord.ADD_USER);
-    }
-
-    public void setUserSelectionListener(UserSelectionListener userSelectionListener) {
-        mUserSelectionListener = userSelectionListener;
-    }
-
-    /** Sets a {@link CarUserManager}. */
-    public void setCarUserManager(CarUserManager carUserManager) {
-        mCarUserManager = carUserManager;
-    }
-
-    private void onUsersUpdate() {
-        mAdapter.clearUsers();
-        mAdapter.updateUsers(createUserRecords(getUsersForUserGrid()));
-        mAdapter.notifyDataSetChanged();
-    }
-
-    private void registerForUserEvents() {
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Intent.ACTION_USER_REMOVED);
-        filter.addAction(Intent.ACTION_USER_ADDED);
-        filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
-        filter.addAction(Intent.ACTION_USER_SWITCHED);
-        mContext.registerReceiverAsUser(
-                mUserUpdateReceiver,
-                UserHandle.ALL, // Necessary because CarSystemUi lives in User 0
-                filter,
-                /* broadcastPermission= */ null,
-                /* scheduler= */ null);
-    }
-
-    private void unregisterForUserEvents() {
-        mContext.unregisterReceiver(mUserUpdateReceiver);
-    }
-
-    /**
-     * Adapter to populate the grid layout with the available user profiles
-     */
-    public final class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserAdapterViewHolder>
-            implements Dialog.OnClickListener, Dialog.OnCancelListener {
-
-        private final Context mContext;
-        private List<UserRecord> mUsers;
-        private final Resources mRes;
-        private final String mGuestName;
-        private final String mNewUserName;
-        // View that holds the add user button.  Used to enable/disable the view
-        private View mAddUserView;
-        // User record for the add user.  Need to call notifyUserSelected only if the user
-        // confirms adding a user
-        private UserRecord mAddUserRecord;
-
-        public UserAdapter(Context context, List<UserRecord> users) {
-            mRes = context.getResources();
-            mContext = context;
-            updateUsers(users);
-            mGuestName = mRes.getString(R.string.car_guest);
-            mNewUserName = mRes.getString(R.string.car_new_user);
-        }
-
-        /**
-         * Clears list of user records.
-         */
-        public void clearUsers() {
-            mUsers.clear();
-        }
-
-        /**
-         * Updates list of user records.
-         */
-        public void updateUsers(List<UserRecord> users) {
-            mUsers = users;
-        }
-
-        @Override
-        public UserAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-            View view = LayoutInflater.from(mContext)
-                    .inflate(R.layout.car_fullscreen_user_pod, parent, false);
-            view.setAlpha(1f);
-            view.bringToFront();
-            return new UserAdapterViewHolder(view);
-        }
-
-        @Override
-        public void onBindViewHolder(UserAdapterViewHolder holder, int position) {
-            UserRecord userRecord = mUsers.get(position);
-            RoundedBitmapDrawable circleIcon = getCircularUserRecordIcon(userRecord);
-            holder.mUserAvatarImageView.setImageDrawable(circleIcon);
-            holder.mUserNameTextView.setText(getUserRecordName(userRecord));
-
-            holder.mView.setOnClickListener(v -> {
-                if (userRecord == null) {
-                    return;
-                }
-
-                switch (userRecord.mType) {
-                    case UserRecord.START_GUEST:
-                        notifyUserSelected(userRecord);
-                        UserInfo guest = createNewOrFindExistingGuest(mContext);
-                        if (guest != null) {
-                            if (!switchUser(guest.id)) {
-                                Log.e(TAG, "Failed to switch to guest user: " + guest.id);
-                            }
-                        }
-                        break;
-                    case UserRecord.ADD_USER:
-                        // If the user wants to add a user, show dialog to confirm adding a user
-                        // Disable button so it cannot be clicked multiple times
-                        mAddUserView = holder.mView;
-                        mAddUserView.setEnabled(false);
-                        mAddUserRecord = userRecord;
-
-                        handleAddUserClicked();
-                        break;
-                    default:
-                        // If the user doesn't want to be a guest or add a user, switch to the user
-                        // selected
-                        notifyUserSelected(userRecord);
-                        if (!switchUser(userRecord.mInfo.id)) {
-                            Log.e(TAG, "Failed to switch users: " + userRecord.mInfo.id);
-                        }
-                }
-            });
-
-        }
-
-        private void handleAddUserClicked() {
-            if (!mUserManager.canAddMoreUsers()) {
-                mAddUserView.setEnabled(true);
-                showMaxUserLimitReachedDialog();
-            } else {
-                showConfirmAddUserDialog();
-            }
-        }
-
-        /**
-         * Get the maximum number of real (non-guest, non-managed profile) users that can be created
-         * on the device. This is a dynamic value and it decreases with the increase of the number
-         * of managed profiles on the device.
-         *
-         * <p> It excludes system user in headless system user model.
-         *
-         * @return Maximum number of real users that can be created.
-         */
-        private int getMaxSupportedRealUsers() {
-            int maxSupportedUsers = UserManager.getMaxSupportedUsers();
-            if (UserManager.isHeadlessSystemUserMode()) {
-                maxSupportedUsers -= 1;
-            }
-
-            List<UserInfo> users = mUserManager.getAliveUsers();
-
-            // Count all users that are managed profiles of another user.
-            int managedProfilesCount = 0;
-            for (UserInfo user : users) {
-                if (user.isManagedProfile()) {
-                    managedProfilesCount++;
-                }
-            }
-
-            return maxSupportedUsers - managedProfilesCount;
-        }
-
-        private void showMaxUserLimitReachedDialog() {
-            AlertDialog maxUsersDialog = new Builder(mContext,
-                    com.android.internal.R.style.Theme_DeviceDefault_Dialog_Alert)
-                    .setTitle(R.string.user_limit_reached_title)
-                    .setMessage(getResources().getQuantityString(
-                            R.plurals.user_limit_reached_message,
-                            getMaxSupportedRealUsers(),
-                            getMaxSupportedRealUsers()))
-                    .setPositiveButton(android.R.string.ok, null)
-                    .create();
-            // Sets window flags for the SysUI dialog
-            applyCarSysUIDialogFlags(maxUsersDialog);
-            maxUsersDialog.show();
-        }
-
-        private void showConfirmAddUserDialog() {
-            String message = mRes.getString(R.string.user_add_user_message_setup)
-                    .concat(System.getProperty("line.separator"))
-                    .concat(System.getProperty("line.separator"))
-                    .concat(mRes.getString(R.string.user_add_user_message_update));
-
-            AlertDialog addUserDialog = new Builder(mContext,
-                    com.android.internal.R.style.Theme_DeviceDefault_Dialog_Alert)
-                    .setTitle(R.string.user_add_user_title)
-                    .setMessage(message)
-                    .setNegativeButton(android.R.string.cancel, this)
-                    .setPositiveButton(android.R.string.ok, this)
-                    .setOnCancelListener(this)
-                    .create();
-            // Sets window flags for the SysUI dialog
-            applyCarSysUIDialogFlags(addUserDialog);
-            addUserDialog.show();
-        }
-
-        private void applyCarSysUIDialogFlags(AlertDialog dialog) {
-            final Window window = dialog.getWindow();
-            window.setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
-            window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
-                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
-            window.getAttributes().setFitInsetsTypes(
-                    window.getAttributes().getFitInsetsTypes() & ~statusBars());
-        }
-
-        private void notifyUserSelected(UserRecord userRecord) {
-            // Notify the listener which user was selected
-            if (mUserSelectionListener != null) {
-                mUserSelectionListener.onUserSelected(userRecord);
-            }
-        }
-
-        private RoundedBitmapDrawable getCircularUserRecordIcon(UserRecord userRecord) {
-            Resources resources = mContext.getResources();
-            RoundedBitmapDrawable circleIcon;
-            switch (userRecord.mType) {
-                case UserRecord.START_GUEST:
-                    circleIcon = mUserIconProvider.getRoundedGuestDefaultIcon(resources);
-                    break;
-                case UserRecord.ADD_USER:
-                    circleIcon = getCircularAddUserIcon();
-                    break;
-                default:
-                    circleIcon = mUserIconProvider.getRoundedUserIcon(userRecord.mInfo, mContext);
-                    break;
-            }
-            return circleIcon;
-        }
-
-        private RoundedBitmapDrawable getCircularAddUserIcon() {
-            RoundedBitmapDrawable circleIcon =
-                    RoundedBitmapDrawableFactory.create(mRes, UserIcons.convertToBitmap(
-                    mContext.getDrawable(R.drawable.car_add_circle_round)));
-            circleIcon.setCircular(true);
-            return circleIcon;
-        }
-
-        private String getUserRecordName(UserRecord userRecord) {
-            String recordName;
-            switch (userRecord.mType) {
-                case UserRecord.START_GUEST:
-                    recordName = mContext.getString(R.string.start_guest_session);
-                    break;
-                case UserRecord.ADD_USER:
-                    recordName = mContext.getString(R.string.car_add_user);
-                    break;
-                default:
-                    recordName = userRecord.mInfo.name;
-                    break;
-            }
-            return recordName;
-        }
-
-        /**
-         * Finds the existing Guest user, or creates one if it doesn't exist.
-         * @param context App context
-         * @return UserInfo representing the Guest user
-         */
-        @Nullable
-        public UserInfo createNewOrFindExistingGuest(Context context) {
-            AsyncFuture<UserCreationResult> future = mCarUserManager.createGuest(mGuestName);
-            // CreateGuest will return null if a guest already exists.
-            UserInfo newGuest = getUserInfo(future);
-            if (newGuest != null) {
-                new UserIconProvider().assignDefaultIcon(
-                        mUserManager, context.getResources(), newGuest);
-                return newGuest;
-            }
-
-            return mUserManager.findCurrentGuestUser();
-        }
-
-        @Override
-        public void onClick(DialogInterface dialog, int which) {
-            if (which == BUTTON_POSITIVE) {
-                new AddNewUserTask().execute(mNewUserName);
-            } else if (which == BUTTON_NEGATIVE) {
-                // Enable the add button only if cancel
-                if (mAddUserView != null) {
-                    mAddUserView.setEnabled(true);
-                }
-            }
-        }
-
-        @Override
-        public void onCancel(DialogInterface dialog) {
-            // Enable the add button again if user cancels dialog by clicking outside the dialog
-            if (mAddUserView != null) {
-                mAddUserView.setEnabled(true);
-            }
-        }
-
-        @Nullable
-        private UserInfo getUserInfo(AsyncFuture<UserCreationResult> future) {
-            UserCreationResult userCreationResult;
-            try {
-                userCreationResult = future.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-            } catch (Exception e) {
-                Log.w(TAG, "Could not create user.", e);
-                return null;
-            }
-
-            if (userCreationResult == null) {
-                Log.w(TAG, "Timed out while creating user: " + TIMEOUT_MS + "ms");
-                return null;
-            }
-            if (!userCreationResult.isSuccess() || userCreationResult.getUser() == null) {
-                Log.w(TAG, "Could not create user: " + userCreationResult);
-                return null;
-            }
-
-            return userCreationResult.getUser();
-        }
-
-        private boolean switchUser(@UserIdInt int userId) {
-            AsyncFuture<UserSwitchResult> userSwitchResultFuture =
-                    mCarUserManager.switchUser(userId);
-            UserSwitchResult userSwitchResult;
-            try {
-                userSwitchResult = userSwitchResultFuture.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-            } catch (Exception e) {
-                Log.w(TAG, "Could not switch user.", e);
-                return false;
-            }
-
-            if (userSwitchResult == null) {
-                Log.w(TAG, "Timed out while switching user: " + TIMEOUT_MS + "ms");
-                return false;
-            }
-            if (!userSwitchResult.isSuccess()) {
-                Log.w(TAG, "Could not switch user: " + userSwitchResult);
-                return false;
-            }
-
-            return true;
-        }
-
-        // TODO(b/161539497): Replace AsyncTask with standard {@link java.util.concurrent} code.
-        private class AddNewUserTask extends AsyncTask<String, Void, UserInfo> {
-
-            @Override
-            protected UserInfo doInBackground(String... userNames) {
-                AsyncFuture<UserCreationResult> future = mCarUserManager.createUser(userNames[0],
-                        /* flags= */ 0);
-                try {
-                    UserInfo user = getUserInfo(future);
-                    if (user != null) {
-                        UserHelper.setDefaultNonAdminRestrictions(mContext, user,
-                                /* enable= */ true);
-                        UserHelper.assignDefaultIcon(mContext, user);
-                        mAddUserRecord = new UserRecord(user, UserRecord.ADD_USER);
-                        return user;
-                    } else {
-                        Log.e(TAG, "Failed to create user in the background");
-                        return user;
-                    }
-                } catch (Exception e) {
-                    if (e instanceof InterruptedException) {
-                        Thread.currentThread().interrupt();
-                    }
-                    Log.e(TAG, "Error creating new user: ", e);
-                }
-                return null;
-            }
-
-            @Override
-            protected void onPreExecute() {
-            }
-
-            @Override
-            protected void onPostExecute(UserInfo user) {
-                if (user != null) {
-                    notifyUserSelected(mAddUserRecord);
-                    mAddUserView.setEnabled(true);
-                    if (!switchUser(user.id)) {
-                        Log.e(TAG, "Failed to switch to new user: " + user.id);
-                    }
-                }
-                if (mAddUserView != null) {
-                    mAddUserView.setEnabled(true);
-                }
-            }
-        }
-
-        @Override
-        public int getItemCount() {
-            return mUsers.size();
-        }
-
-        /**
-         * An extension of {@link RecyclerView.ViewHolder} that also houses the user name and the
-         * user avatar.
-         */
-        public class UserAdapterViewHolder extends RecyclerView.ViewHolder {
-
-            public ImageView mUserAvatarImageView;
-            public TextView mUserNameTextView;
-            public View mView;
-
-            public UserAdapterViewHolder(View view) {
-                super(view);
-                mView = view;
-                mUserAvatarImageView = (ImageView) view.findViewById(R.id.user_avatar);
-                mUserNameTextView = (TextView) view.findViewById(R.id.user_name);
-            }
-        }
-    }
-
-    /**
-     * Object wrapper class for the userInfo.  Use it to distinguish if a profile is a
-     * guest profile, add user profile, or the foreground user.
-     */
-    public static final class UserRecord {
-        public final UserInfo mInfo;
-        public final @UserRecordType int mType;
-
-        public static final int START_GUEST = 0;
-        public static final int ADD_USER = 1;
-        public static final int FOREGROUND_USER = 2;
-        public static final int BACKGROUND_USER = 3;
-
-        @IntDef({START_GUEST, ADD_USER, FOREGROUND_USER, BACKGROUND_USER})
-        @Retention(RetentionPolicy.SOURCE)
-        public @interface UserRecordType{}
-
-        public UserRecord(@Nullable UserInfo userInfo, @UserRecordType int recordType) {
-            mInfo = userInfo;
-            mType = recordType;
-        }
-    }
-
-    /**
-     * Listener used to notify when a user has been selected
-     */
-    interface UserSelectionListener {
-
-        void onUserSelected(UserRecord record);
-    }
-
-    /**
-     * A {@link RecyclerView.ItemDecoration} that will add spacing between each item in the
-     * RecyclerView that it is added to.
-     */
-    private static class ItemSpacingDecoration extends RecyclerView.ItemDecoration {
-        private int mItemSpacing;
-
-        private ItemSpacingDecoration(int itemSpacing) {
-            mItemSpacing = itemSpacing;
-        }
-
-        @Override
-        public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
-                RecyclerView.State state) {
-            super.getItemOffsets(outRect, view, parent, state);
-            int position = parent.getChildAdapterPosition(view);
-
-            // Skip offset for last item except for GridLayoutManager.
-            if (position == state.getItemCount() - 1
-                    && !(parent.getLayoutManager() instanceof GridLayoutManager)) {
-                return;
-            }
-
-            outRect.bottom = mItemSpacing;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserIconProvider.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserIconProvider.java
deleted file mode 100644
index dc5953e..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserIconProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.userswitcher;
-
-import android.annotation.UserIdInt;
-import android.content.Context;
-import android.content.pm.UserInfo;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.os.UserHandle;
-import android.os.UserManager;
-
-import androidx.core.graphics.drawable.RoundedBitmapDrawable;
-import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
-
-import com.android.internal.util.UserIcons;
-import com.android.systemui.R;
-
-/**
- * Simple class for providing icons for users.
- */
-public class UserIconProvider {
-    /**
-     * Gets a scaled rounded icon for the given user.  If a user does not have an icon saved, this
-     * method will default to a generic icon and update UserManager to use that icon.
-     *
-     * @param userInfo User for which the icon is requested.
-     * @param context Context to use for resources
-     * @return {@link RoundedBitmapDrawable} representing the icon for the user.
-     */
-    public RoundedBitmapDrawable getRoundedUserIcon(UserInfo userInfo, Context context) {
-        UserManager userManager = UserManager.get(context);
-        Resources res = context.getResources();
-        Bitmap icon = userManager.getUserIcon(userInfo.id);
-
-        if (icon == null) {
-            icon = assignDefaultIcon(userManager, res, userInfo);
-        }
-
-        return createScaledRoundIcon(res, icon);
-    }
-
-    /** Returns a scaled, rounded, default icon for the Guest user */
-    public RoundedBitmapDrawable getRoundedGuestDefaultIcon(Resources resources) {
-        return createScaledRoundIcon(resources, getGuestUserDefaultIcon(resources));
-    }
-
-    private RoundedBitmapDrawable createScaledRoundIcon(Resources resources, Bitmap icon) {
-        BitmapDrawable scaledIcon = scaleUserIcon(resources, icon);
-        RoundedBitmapDrawable circleIcon =
-                RoundedBitmapDrawableFactory.create(resources, scaledIcon.getBitmap());
-        circleIcon.setCircular(true);
-        return circleIcon;
-    }
-
-    /**
-     * Returns a {@link Drawable} for the given {@code icon} scaled to the appropriate size.
-     */
-    private static BitmapDrawable scaleUserIcon(Resources res, Bitmap icon) {
-        int desiredSize = res.getDimensionPixelSize(R.dimen.car_primary_icon_size);
-        Bitmap scaledIcon =
-                Bitmap.createScaledBitmap(icon, desiredSize, desiredSize, /*filter=*/ true);
-        return new BitmapDrawable(res, scaledIcon);
-    }
-
-    /**
-     * Assigns a default icon to a user according to the user's id. Handles Guest icon and non-guest
-     * user icons.
-     *
-     * @param userManager {@link UserManager} to set user icon
-     * @param resources {@link Resources} to grab icons from
-     * @param userInfo User whose avatar is set to default icon.
-     * @return Bitmap of the user icon.
-     */
-    public Bitmap assignDefaultIcon(
-            UserManager userManager, Resources resources, UserInfo userInfo) {
-        Bitmap bitmap = userInfo.isGuest()
-                ? getGuestUserDefaultIcon(resources)
-                : getUserDefaultIcon(resources, userInfo.id);
-        userManager.setUserIcon(userInfo.id, bitmap);
-        return bitmap;
-    }
-
-    /**
-     * Gets a bitmap representing the user's default avatar.
-     *
-     * @param resources The resources to pull from
-     * @param id The id of the user to get the icon for.  Pass {@link UserHandle#USER_NULL} for
-     *           Guest user.
-     * @return Default user icon
-     */
-    private Bitmap getUserDefaultIcon(Resources resources, @UserIdInt int id) {
-        return UserIcons.convertToBitmap(
-                UserIcons.getDefaultUserIcon(resources, id, /* light= */ false));
-    }
-
-    private Bitmap getGuestUserDefaultIcon(Resources resources) {
-        return getUserDefaultIcon(resources, UserHandle.USER_NULL);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java
deleted file mode 100644
index 6178cbd..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.userswitcher;
-
-import static android.car.settings.CarSettings.Global.ENABLE_USER_SWITCH_DEVELOPER_MESSAGE;
-
-import android.annotation.UserIdInt;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.os.Handler;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.Settings;
-import android.util.Log;
-import android.view.IWindowManager;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.settingslib.drawable.CircleFramedDrawable;
-import com.android.systemui.R;
-import com.android.systemui.car.window.OverlayViewController;
-import com.android.systemui.car.window.OverlayViewGlobalStateController;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
-
-import javax.inject.Inject;
-
-/**
- * Handles showing and hiding UserSwitchTransitionView that is mounted to SystemUiOverlayWindow.
- */
-@SysUISingleton
-public class UserSwitchTransitionViewController extends OverlayViewController {
-    private static final String TAG = "UserSwitchTransition";
-    private static final String ENABLE_DEVELOPER_MESSAGE_TRUE = "true";
-    private static final boolean DEBUG = false;
-
-    private final Context mContext;
-    private final Handler mHandler;
-    private final Resources mResources;
-    private final UserManager mUserManager;
-    private final IWindowManager mWindowManagerService;
-    private final int mWindowShownTimeoutMs;
-    private final Runnable mWindowShownTimeoutCallback = () -> {
-        if (DEBUG) {
-            Log.w(TAG, "Window was not hidden within " + getWindowShownTimeoutMs() + " ms, so it"
-                    + "was hidden by mWindowShownTimeoutCallback.");
-        }
-
-        handleHide();
-    };
-
-    @GuardedBy("this")
-    private boolean mShowing;
-    private int mPreviousUserId = UserHandle.USER_NULL;
-
-    @Inject
-    public UserSwitchTransitionViewController(
-            Context context,
-            @Main Handler handler,
-            @Main Resources resources,
-            UserManager userManager,
-            IWindowManager windowManagerService,
-            OverlayViewGlobalStateController overlayViewGlobalStateController) {
-
-        super(R.id.user_switching_dialog_stub, overlayViewGlobalStateController);
-
-        mContext = context;
-        mHandler = handler;
-        mResources = resources;
-        mUserManager = userManager;
-        mWindowManagerService = windowManagerService;
-        mWindowShownTimeoutMs = mResources.getInteger(
-                R.integer.config_userSwitchTransitionViewShownTimeoutMs);
-    }
-
-    @Override
-    protected int getInsetTypesToFit() {
-        return 0;
-    }
-
-    /**
-     * Makes the user switch transition view appear and draws the content inside of it if a user
-     * that is different from the previous user is provided and if the dialog is not already
-     * showing.
-     */
-    void handleShow(@UserIdInt int newUserId) {
-        if (mPreviousUserId == newUserId || mShowing) return;
-        mShowing = true;
-        mHandler.post(() -> {
-            try {
-                mWindowManagerService.setSwitchingUser(true);
-                mWindowManagerService.lockNow(null);
-            } catch (RemoteException e) {
-                Log.e(TAG, "unable to notify window manager service regarding user switch");
-            }
-
-            start();
-            populateDialog(mPreviousUserId, newUserId);
-            // next time a new user is selected, this current new user will be the previous user.
-            mPreviousUserId = newUserId;
-            // In case the window is still showing after WINDOW_SHOWN_TIMEOUT_MS, then hide the
-            // window and log a warning message.
-            mHandler.postDelayed(mWindowShownTimeoutCallback, mWindowShownTimeoutMs);
-        });
-    }
-
-    void handleHide() {
-        if (!mShowing) return;
-        mShowing = false;
-        mHandler.post(this::stop);
-        mHandler.removeCallbacks(mWindowShownTimeoutCallback);
-    }
-
-    @VisibleForTesting
-    int getWindowShownTimeoutMs() {
-        return mWindowShownTimeoutMs;
-    }
-
-    private void populateDialog(@UserIdInt int previousUserId, @UserIdInt int newUserId) {
-        drawUserIcon(newUserId);
-        populateLoadingText(previousUserId, newUserId);
-    }
-
-    private void drawUserIcon(int newUserId) {
-        Bitmap bitmap = mUserManager.getUserIcon(newUserId);
-        if (bitmap != null) {
-            CircleFramedDrawable drawable = CircleFramedDrawable.getInstance(mContext, bitmap);
-            ((ImageView) getLayout().findViewById(R.id.user_loading_avatar))
-                    .setImageDrawable(drawable);
-        }
-    }
-
-    private void populateLoadingText(@UserIdInt int previousUserId, @UserIdInt int newUserId) {
-        TextView msgView = getLayout().findViewById(R.id.user_loading);
-
-        boolean showInfo = ENABLE_DEVELOPER_MESSAGE_TRUE.equals(
-                Settings.Global.getString(mContext.getContentResolver(),
-                        ENABLE_USER_SWITCH_DEVELOPER_MESSAGE));
-
-        if (showInfo && mPreviousUserId != UserHandle.USER_NULL) {
-            msgView.setText(
-                    mResources.getString(R.string.car_loading_profile_developer_message,
-                            previousUserId, newUserId));
-        } else {
-            msgView.setText(mResources.getString(R.string.car_loading_profile));
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewMediator.java
deleted file mode 100644
index 7db2823..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewMediator.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.userswitcher;
-
-import android.car.Car;
-import android.car.user.CarUserManager;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.car.window.OverlayViewMediator;
-
-import javax.inject.Inject;
-
-/**
- * Registers listeners that subscribe to events that show or hide CarUserSwitchingDialog that is
- * mounted to SystemUiOverlayWindow.
- */
-public class UserSwitchTransitionViewMediator implements OverlayViewMediator,
-        CarUserManager.UserSwitchUiCallback {
-    private static final String TAG = "UserSwitchTransitionViewMediator";
-
-    private final CarServiceProvider mCarServiceProvider;
-    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
-    private final UserSwitchTransitionViewController mUserSwitchTransitionViewController;
-
-    @Inject
-    public UserSwitchTransitionViewMediator(
-            CarServiceProvider carServiceProvider,
-            CarDeviceProvisionedController carDeviceProvisionedController,
-            UserSwitchTransitionViewController userSwitchTransitionViewController) {
-        mCarServiceProvider = carServiceProvider;
-        mCarDeviceProvisionedController = carDeviceProvisionedController;
-        mUserSwitchTransitionViewController = userSwitchTransitionViewController;
-    }
-
-    @Override
-    public void registerListeners() {
-        mCarServiceProvider.addListener(car -> {
-            CarUserManager carUserManager =
-                    (CarUserManager) car.getCarManager(Car.CAR_USER_SERVICE);
-
-            if (carUserManager != null) {
-                carUserManager.setUserSwitchUiCallback(this);
-                carUserManager.addListener(Runnable::run, this::handleUserLifecycleEvent);
-            } else {
-                Log.e(TAG, "registerListeners: CarUserManager could not be obtained.");
-            }
-        });
-    }
-
-    @Override
-    public void setupOverlayContentViewControllers() {
-        // no-op.
-    }
-
-    @Override
-    public void showUserSwitchDialog(int userId) {
-        mUserSwitchTransitionViewController.handleShow(userId);
-    }
-
-    @VisibleForTesting
-    void handleUserLifecycleEvent(CarUserManager.UserLifecycleEvent event) {
-        if (event.getEventType() == CarUserManager.USER_LIFECYCLE_EVENT_TYPE_STARTING
-                && mCarDeviceProvisionedController.getCurrentUser() == event.getUserId()) {
-            mUserSwitchTransitionViewController.handleShow(event.getUserId());
-        }
-
-        if (event.getEventType() == CarUserManager.USER_LIFECYCLE_EVENT_TYPE_SWITCHING) {
-            mUserSwitchTransitionViewController.handleHide();
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifier.java b/packages/CarSystemUI/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifier.java
deleted file mode 100644
index c054d20..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifier.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.voicerecognition;
-
-import android.bluetooth.BluetoothHeadsetClient;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.util.Log;
-import android.widget.Toast;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.R;
-import com.android.systemui.SysUIToast;
-import com.android.systemui.SystemUI;
-import com.android.systemui.dagger.qualifiers.Main;
-
-import javax.inject.Inject;
-
-/**
- * Controller responsible for showing toast message when voice recognition over bluetooth device
- * getting activated.
- */
-public class ConnectedDeviceVoiceRecognitionNotifier extends SystemUI {
-
-    private static final String TAG = "CarVoiceRecognition";
-    @VisibleForTesting
-    static final int INVALID_VALUE = -1;
-    @VisibleForTesting
-    static final int VOICE_RECOGNITION_STARTED = 1;
-
-    private Handler mHandler;
-
-    private final BroadcastReceiver mVoiceRecognitionReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Voice recognition received an intent!");
-            }
-            if (intent == null
-                    || intent.getAction() == null
-                    || !BluetoothHeadsetClient.ACTION_AG_EVENT.equals(intent.getAction())
-                    || !intent.hasExtra(BluetoothHeadsetClient.EXTRA_VOICE_RECOGNITION)) {
-                return;
-            }
-
-            int voiceRecognitionState = intent.getIntExtra(
-                    BluetoothHeadsetClient.EXTRA_VOICE_RECOGNITION, INVALID_VALUE);
-
-            if (voiceRecognitionState == VOICE_RECOGNITION_STARTED) {
-                showToastMessage();
-            }
-        }
-    };
-
-    private void showToastMessage() {
-        mHandler.post(() -> SysUIToast.makeText(mContext, R.string.voice_recognition_toast,
-                Toast.LENGTH_LONG).show());
-    }
-
-    @Inject
-    public ConnectedDeviceVoiceRecognitionNotifier(Context context, @Main Handler handler) {
-        super(context);
-        mHandler = handler;
-    }
-
-    @Override
-    public void start() {
-    }
-
-    @Override
-    protected void onBootCompleted() {
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(BluetoothHeadsetClient.ACTION_AG_EVENT);
-        mContext.registerReceiverAsUser(mVoiceRecognitionReceiver, UserHandle.ALL, filter,
-                /* broadcastPermission= */ null, /* scheduler= */ null);
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogComponent.java b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogComponent.java
deleted file mode 100644
index 4cdbfa3..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogComponent.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.volume;
-
-import android.content.Context;
-
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.demomode.DemoModeController;
-import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.plugins.VolumeDialog;
-import com.android.systemui.volume.VolumeDialogComponent;
-import com.android.systemui.volume.VolumeDialogControllerImpl;
-
-import javax.inject.Inject;
-
-/**
- * Allows for adding car specific dialog when the volume dialog is created.
- */
-@SysUISingleton
-public class CarVolumeDialogComponent extends VolumeDialogComponent {
-
-    private CarVolumeDialogImpl mCarVolumeDialog;
-
-    @Inject
-    public CarVolumeDialogComponent(Context context, KeyguardViewMediator keyguardViewMediator,
-            VolumeDialogControllerImpl volumeDialogController,
-            DemoModeController demoModeController,
-            CarServiceProvider carServiceProvider) {
-        super(context, keyguardViewMediator, volumeDialogController, demoModeController);
-        mCarVolumeDialog.setCarServiceProvider(carServiceProvider);
-    }
-
-    /** This method is called while calling the super constructor. */
-    @Override
-    protected VolumeDialog createDefault() {
-        mCarVolumeDialog = new CarVolumeDialogImpl(mContext);
-        return mCarVolumeDialog;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogImpl.java b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogImpl.java
deleted file mode 100644
index 1281884..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogImpl.java
+++ /dev/null
@@ -1,658 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.volume;
-
-import android.animation.Animator;
-import android.animation.AnimatorInflater;
-import android.animation.AnimatorSet;
-import android.annotation.DrawableRes;
-import android.annotation.Nullable;
-import android.app.Dialog;
-import android.app.KeyguardManager;
-import android.car.Car;
-import android.car.media.CarAudioManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
-import android.graphics.Color;
-import android.graphics.PixelFormat;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.media.AudioManager;
-import android.os.Debug;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.UserHandle;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.SparseArray;
-import android.util.Xml;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.WindowManager;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-
-import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.systemui.R;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.plugins.VolumeDialog;
-import com.android.systemui.volume.Events;
-import com.android.systemui.volume.SystemUIInterpolators;
-import com.android.systemui.volume.VolumeDialogImpl;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Car version of the volume dialog.
- *
- * Methods ending in "H" must be called on the (ui) handler.
- */
-public class CarVolumeDialogImpl implements VolumeDialog {
-
-    private static final String TAG = "CarVolumeDialog";
-    private static final boolean DEBUG = false;
-
-    private static final String XML_TAG_VOLUME_ITEMS = "carVolumeItems";
-    private static final String XML_TAG_VOLUME_ITEM = "item";
-    private static final int LISTVIEW_ANIMATION_DURATION_IN_MILLIS = 250;
-    private static final int DISMISS_DELAY_IN_MILLIS = 50;
-    private static final int ARROW_FADE_IN_START_DELAY_IN_MILLIS = 100;
-
-    private final Context mContext;
-    private final H mHandler = new H();
-    // All the volume items.
-    private final SparseArray<VolumeItem> mVolumeItems = new SparseArray<>();
-    // Available volume items in car audio manager.
-    private final List<VolumeItem> mAvailableVolumeItems = new ArrayList<>();
-    // Volume items in the RecyclerView.
-    private final List<CarVolumeItem> mCarVolumeLineItems = new ArrayList<>();
-    private final KeyguardManager mKeyguard;
-    private final int mNormalTimeout;
-    private final int mHoveringTimeout;
-    private final int mExpNormalTimeout;
-    private final int mExpHoveringTimeout;
-
-    private Window mWindow;
-    private CustomDialog mDialog;
-    private RecyclerView mListView;
-    private CarVolumeItemAdapter mVolumeItemsAdapter;
-    private CarAudioManager mCarAudioManager;
-    private boolean mHovering;
-    private int mCurrentlyDisplayingGroupId;
-    private int mPreviouslyDisplayingGroupId;
-    private boolean mShowing;
-    private boolean mDismissing;
-    private boolean mExpanded;
-    private View mExpandIcon;
-
-    private final CarAudioManager.CarVolumeCallback mVolumeChangeCallback =
-            new CarAudioManager.CarVolumeCallback() {
-                @Override
-                public void onGroupVolumeChanged(int zoneId, int groupId, int flags) {
-                    // TODO: Include zoneId into consideration.
-                    // For instance
-                    // - single display + single-zone, ignore zoneId
-                    // - multi-display + single-zone, zoneId is fixed, may show volume bar on all
-                    // displays
-                    // - single-display + multi-zone, may show volume bar on primary display only
-                    // - multi-display + multi-zone, may show volume bar on display specified by
-                    // zoneId
-                    VolumeItem volumeItem = mAvailableVolumeItems.get(groupId);
-                    int value = getSeekbarValue(mCarAudioManager, groupId);
-                    // find if the group id for which the volume changed is currently being
-                    // displayed.
-                    boolean isShowing = mCarVolumeLineItems.stream().anyMatch(
-                            item -> item.getGroupId() == groupId);
-                    // Do not update the progress if it is the same as before. When car audio
-                    // manager sets
-                    // its group volume caused by the seekbar progress changed, it also triggers
-                    // this
-                    // callback. Updating the seekbar at the same time could block the continuous
-                    // seeking.
-                    if (value != volumeItem.mProgress && isShowing) {
-                        volumeItem.mCarVolumeItem.setProgress(value);
-                        volumeItem.mProgress = value;
-                    }
-                    if ((flags & AudioManager.FLAG_SHOW_UI) != 0) {
-                        mPreviouslyDisplayingGroupId = mCurrentlyDisplayingGroupId;
-                        mCurrentlyDisplayingGroupId = groupId;
-                        mHandler.obtainMessage(H.SHOW,
-                                Events.SHOW_REASON_VOLUME_CHANGED).sendToTarget();
-                    }
-                }
-
-                @Override
-                public void onMasterMuteChanged(int zoneId, int flags) {
-                    // ignored
-                }
-            };
-
-    private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceOnConnectedListener =
-            car -> {
-                mExpanded = false;
-                mCarAudioManager = (CarAudioManager) car.getCarManager(Car.AUDIO_SERVICE);
-                int volumeGroupCount = mCarAudioManager.getVolumeGroupCount();
-                // Populates volume slider items from volume groups to UI.
-                for (int groupId = 0; groupId < volumeGroupCount; groupId++) {
-                    VolumeItem volumeItem = getVolumeItemForUsages(
-                            mCarAudioManager.getUsagesForVolumeGroupId(groupId));
-                    mAvailableVolumeItems.add(volumeItem);
-                    // The first one is the default item.
-                    if (groupId == 0) {
-                        clearAllAndSetupDefaultCarVolumeLineItem(0);
-                    }
-                }
-
-                // If list is already initiated, update its content.
-                if (mVolumeItemsAdapter != null) {
-                    mVolumeItemsAdapter.notifyDataSetChanged();
-                }
-                mCarAudioManager.registerCarVolumeCallback(mVolumeChangeCallback);
-            };
-
-    private final BroadcastReceiver mHomeButtonPressedBroadcastReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (!intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
-                return;
-            }
-
-            dismissH(Events.DISMISS_REASON_VOLUME_CONTROLLER);
-        }
-    };
-
-    public CarVolumeDialogImpl(Context context) {
-        mContext = context;
-        mKeyguard = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
-        mNormalTimeout = mContext.getResources().getInteger(
-                R.integer.car_volume_dialog_display_normal_timeout);
-        mHoveringTimeout = mContext.getResources().getInteger(
-                R.integer.car_volume_dialog_display_hovering_timeout);
-        mExpNormalTimeout = mContext.getResources().getInteger(
-                R.integer.car_volume_dialog_display_expanded_normal_timeout);
-        mExpHoveringTimeout = mContext.getResources().getInteger(
-                R.integer.car_volume_dialog_display_expanded_hovering_timeout);
-    }
-
-    /** Sets a {@link CarServiceProvider} which connects to the audio service. */
-    public void setCarServiceProvider(CarServiceProvider carServiceProvider) {
-        carServiceProvider.addListener(mCarServiceOnConnectedListener);
-    }
-
-    private static int getSeekbarValue(CarAudioManager carAudioManager, int volumeGroupId) {
-        return carAudioManager.getGroupVolume(volumeGroupId);
-    }
-
-    private static int getMaxSeekbarValue(CarAudioManager carAudioManager, int volumeGroupId) {
-        return carAudioManager.getGroupMaxVolume(volumeGroupId);
-    }
-
-    /**
-     * Build the volume window and connect to the CarService which registers with car audio
-     * manager.
-     */
-    @Override
-    public void init(int windowType, Callback callback) {
-        initDialog();
-
-        mContext.registerReceiverAsUser(mHomeButtonPressedBroadcastReceiver, UserHandle.CURRENT,
-                new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS), /* broadcastPermission= */
-                null, /* scheduler= */ null);
-    }
-
-    @Override
-    public void destroy() {
-        mHandler.removeCallbacksAndMessages(/* token= */ null);
-
-        mContext.unregisterReceiver(mHomeButtonPressedBroadcastReceiver);
-
-        cleanupAudioManager();
-    }
-
-    /**
-     * Reveals volume dialog.
-     */
-    public void show(int reason) {
-        mHandler.obtainMessage(H.SHOW, reason).sendToTarget();
-    }
-
-    /**
-     * Hides volume dialog.
-     */
-    public void dismiss(int reason) {
-        mHandler.obtainMessage(H.DISMISS, reason).sendToTarget();
-    }
-
-    private void initDialog() {
-        loadAudioUsageItems();
-        mCarVolumeLineItems.clear();
-        mDialog = new CustomDialog(mContext);
-
-        mHovering = false;
-        mShowing = false;
-        mDismissing = false;
-        mExpanded = false;
-        mWindow = mDialog.getWindow();
-        mWindow.requestFeature(Window.FEATURE_NO_TITLE);
-        mWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
-        mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND
-                | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
-        mWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
-                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
-                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
-                | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
-                | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
-        mWindow.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);
-        mWindow.setWindowAnimations(com.android.internal.R.style.Animation_Toast);
-        final WindowManager.LayoutParams lp = mWindow.getAttributes();
-        lp.format = PixelFormat.TRANSLUCENT;
-        lp.setTitle(VolumeDialogImpl.class.getSimpleName());
-        lp.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
-        lp.windowAnimations = -1;
-        mWindow.setAttributes(lp);
-
-        mDialog.setContentView(R.layout.car_volume_dialog);
-        mWindow.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
-
-        mDialog.setCanceledOnTouchOutside(true);
-        mDialog.setOnShowListener(dialog -> {
-            mListView.setTranslationY(-mListView.getHeight());
-            mListView.setAlpha(0);
-            mListView.animate()
-                    .alpha(1)
-                    .translationY(0)
-                    .setDuration(LISTVIEW_ANIMATION_DURATION_IN_MILLIS)
-                    .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator())
-                    .start();
-        });
-        mListView = mWindow.findViewById(R.id.volume_list);
-        mListView.setOnHoverListener((v, event) -> {
-            int action = event.getActionMasked();
-            mHovering = (action == MotionEvent.ACTION_HOVER_ENTER)
-                    || (action == MotionEvent.ACTION_HOVER_MOVE);
-            rescheduleTimeoutH();
-            return true;
-        });
-
-        mVolumeItemsAdapter = new CarVolumeItemAdapter(mContext, mCarVolumeLineItems);
-        mListView.setAdapter(mVolumeItemsAdapter);
-        mListView.setLayoutManager(new LinearLayoutManager(mContext));
-    }
-
-
-    private void showH(int reason) {
-        if (DEBUG) {
-            Log.d(TAG, "showH r=" + Events.DISMISS_REASONS[reason]);
-        }
-
-        mHandler.removeMessages(H.SHOW);
-        mHandler.removeMessages(H.DISMISS);
-
-        rescheduleTimeoutH();
-
-        // Refresh the data set before showing.
-        mVolumeItemsAdapter.notifyDataSetChanged();
-
-        if (mShowing) {
-            if (mPreviouslyDisplayingGroupId == mCurrentlyDisplayingGroupId || mExpanded) {
-                return;
-            }
-
-            clearAllAndSetupDefaultCarVolumeLineItem(mCurrentlyDisplayingGroupId);
-            return;
-        }
-
-        mShowing = true;
-        clearAllAndSetupDefaultCarVolumeLineItem(mCurrentlyDisplayingGroupId);
-        mDialog.show();
-        Events.writeEvent(Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked());
-    }
-
-    private void clearAllAndSetupDefaultCarVolumeLineItem(int groupId) {
-        mCarVolumeLineItems.clear();
-        VolumeItem volumeItem = mAvailableVolumeItems.get(groupId);
-        volumeItem.mDefaultItem = true;
-        addCarVolumeListItem(volumeItem, /* volumeGroupId = */ groupId,
-                R.drawable.car_ic_keyboard_arrow_down, new ExpandIconListener());
-    }
-
-    protected void rescheduleTimeoutH() {
-        mHandler.removeMessages(H.DISMISS);
-        final int timeout = computeTimeoutH();
-        mHandler.sendMessageDelayed(mHandler
-                .obtainMessage(H.DISMISS, Events.DISMISS_REASON_TIMEOUT), timeout);
-
-        if (DEBUG) {
-            Log.d(TAG, "rescheduleTimeout " + timeout + " " + Debug.getCaller());
-        }
-    }
-
-    private int computeTimeoutH() {
-        if (mExpanded) {
-            return mHovering ? mExpHoveringTimeout : mExpNormalTimeout;
-        } else {
-            return mHovering ? mHoveringTimeout : mNormalTimeout;
-        }
-    }
-
-    private void dismissH(int reason) {
-        if (DEBUG) {
-            Log.d(TAG, "dismissH r=" + Events.DISMISS_REASONS[reason]);
-        }
-
-        mHandler.removeMessages(H.DISMISS);
-        mHandler.removeMessages(H.SHOW);
-        if (!mShowing || mDismissing) {
-            return;
-        }
-
-        mDismissing = true;
-        mListView.animate()
-                .alpha(0)
-                .translationY(-mListView.getHeight())
-                .setDuration(LISTVIEW_ANIMATION_DURATION_IN_MILLIS)
-                .setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator())
-                .withEndAction(() -> mHandler.postDelayed(() -> {
-                    if (DEBUG) {
-                        Log.d(TAG, "mDialog.dismiss()");
-                    }
-                    mDialog.dismiss();
-                    mShowing = false;
-                    mDismissing = false;
-                    // if mExpandIcon is null that means user never clicked on the expanded arrow
-                    // which implies that the dialog is still not expanded. In that case we do
-                    // not want to reset the state
-                    if (mExpandIcon != null && mExpanded) {
-                        toggleDialogExpansion(/* isClicked = */ false);
-                    }
-                }, DISMISS_DELAY_IN_MILLIS))
-                .start();
-
-        Events.writeEvent(Events.EVENT_DISMISS_DIALOG, reason);
-    }
-
-    private void loadAudioUsageItems() {
-        try (XmlResourceParser parser = mContext.getResources().getXml(R.xml.car_volume_items)) {
-            AttributeSet attrs = Xml.asAttributeSet(parser);
-            int type;
-            // Traverse to the first start tag
-            while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT
-                    && type != XmlResourceParser.START_TAG) {
-                // Do Nothing (moving parser to start element)
-            }
-
-            if (!XML_TAG_VOLUME_ITEMS.equals(parser.getName())) {
-                throw new RuntimeException("Meta-data does not start with carVolumeItems tag");
-            }
-            int outerDepth = parser.getDepth();
-            int rank = 0;
-            while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT
-                    && (type != XmlResourceParser.END_TAG || parser.getDepth() > outerDepth)) {
-                if (type == XmlResourceParser.END_TAG) {
-                    continue;
-                }
-                if (XML_TAG_VOLUME_ITEM.equals(parser.getName())) {
-                    TypedArray item = mContext.getResources().obtainAttributes(
-                            attrs, R.styleable.carVolumeItems_item);
-                    int usage = item.getInt(R.styleable.carVolumeItems_item_usage,
-                            /* defValue= */ -1);
-                    if (usage >= 0) {
-                        VolumeItem volumeItem = new VolumeItem();
-                        volumeItem.mRank = rank;
-                        volumeItem.mIcon = item.getResourceId(
-                                R.styleable.carVolumeItems_item_icon, /* defValue= */ 0);
-                        mVolumeItems.put(usage, volumeItem);
-                        rank++;
-                    }
-                    item.recycle();
-                }
-            }
-        } catch (XmlPullParserException | IOException e) {
-            Log.e(TAG, "Error parsing volume groups configuration", e);
-        }
-    }
-
-    private VolumeItem getVolumeItemForUsages(int[] usages) {
-        int rank = Integer.MAX_VALUE;
-        VolumeItem result = null;
-        for (int usage : usages) {
-            VolumeItem volumeItem = mVolumeItems.get(usage);
-            if (volumeItem.mRank < rank) {
-                rank = volumeItem.mRank;
-                result = volumeItem;
-            }
-        }
-        return result;
-    }
-
-    private CarVolumeItem createCarVolumeListItem(VolumeItem volumeItem, int volumeGroupId,
-            Drawable supplementalIcon, int seekbarProgressValue,
-            @Nullable View.OnClickListener supplementalIconOnClickListener) {
-        CarVolumeItem carVolumeItem = new CarVolumeItem();
-        carVolumeItem.setMax(getMaxSeekbarValue(mCarAudioManager, volumeGroupId));
-        carVolumeItem.setProgress(seekbarProgressValue);
-        carVolumeItem.setOnSeekBarChangeListener(
-                new CarVolumeDialogImpl.VolumeSeekBarChangeListener(volumeGroupId,
-                        mCarAudioManager));
-        carVolumeItem.setGroupId(volumeGroupId);
-
-        int color = mContext.getColor(R.color.car_volume_dialog_tint);
-        Drawable primaryIcon = mContext.getDrawable(volumeItem.mIcon);
-        primaryIcon.mutate().setTint(color);
-        carVolumeItem.setPrimaryIcon(primaryIcon);
-        if (supplementalIcon != null) {
-            supplementalIcon.mutate().setTint(color);
-            carVolumeItem.setSupplementalIcon(supplementalIcon,
-                    /* showSupplementalIconDivider= */ true);
-            carVolumeItem.setSupplementalIconListener(supplementalIconOnClickListener);
-        } else {
-            carVolumeItem.setSupplementalIcon(/* drawable= */ null,
-                    /* showSupplementalIconDivider= */ false);
-        }
-
-        volumeItem.mCarVolumeItem = carVolumeItem;
-        volumeItem.mProgress = seekbarProgressValue;
-
-        return carVolumeItem;
-    }
-
-    private CarVolumeItem addCarVolumeListItem(VolumeItem volumeItem, int volumeGroupId,
-            int supplementalIconId,
-            @Nullable View.OnClickListener supplementalIconOnClickListener) {
-        int seekbarProgressValue = getSeekbarValue(mCarAudioManager, volumeGroupId);
-        Drawable supplementalIcon = supplementalIconId == 0 ? null : mContext.getDrawable(
-                supplementalIconId);
-        CarVolumeItem carVolumeItem = createCarVolumeListItem(volumeItem, volumeGroupId,
-                supplementalIcon, seekbarProgressValue, supplementalIconOnClickListener);
-        mCarVolumeLineItems.add(carVolumeItem);
-        return carVolumeItem;
-    }
-
-    private void cleanupAudioManager() {
-        mCarAudioManager.unregisterCarVolumeCallback(mVolumeChangeCallback);
-        mCarVolumeLineItems.clear();
-        mCarAudioManager = null;
-    }
-
-    /**
-     * Wrapper class which contains information of each volume group.
-     */
-    private static class VolumeItem {
-        private int mRank;
-        private boolean mDefaultItem = false;
-        @DrawableRes
-        private int mIcon;
-        private CarVolumeItem mCarVolumeItem;
-        private int mProgress;
-    }
-
-    private final class H extends Handler {
-
-        private static final int SHOW = 1;
-        private static final int DISMISS = 2;
-
-        private H() {
-            super(Looper.getMainLooper());
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case SHOW:
-                    showH(msg.arg1);
-                    break;
-                case DISMISS:
-                    dismissH(msg.arg1);
-                    break;
-                default:
-            }
-        }
-    }
-
-    private final class CustomDialog extends Dialog implements DialogInterface {
-
-        private CustomDialog(Context context) {
-            super(context, com.android.systemui.R.style.qs_theme);
-        }
-
-        @Override
-        public boolean dispatchTouchEvent(MotionEvent ev) {
-            rescheduleTimeoutH();
-            return super.dispatchTouchEvent(ev);
-        }
-
-        @Override
-        protected void onStart() {
-            super.setCanceledOnTouchOutside(true);
-            super.onStart();
-        }
-
-        @Override
-        protected void onStop() {
-            super.onStop();
-        }
-
-        @Override
-        public boolean onTouchEvent(MotionEvent event) {
-            if (isShowing()) {
-                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
-                    mHandler.obtainMessage(
-                            H.DISMISS, Events.DISMISS_REASON_TOUCH_OUTSIDE).sendToTarget();
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-    private final class ExpandIconListener implements View.OnClickListener {
-        @Override
-        public void onClick(final View v) {
-            mExpandIcon = v;
-            toggleDialogExpansion(true);
-            rescheduleTimeoutH();
-        }
-    }
-
-    private void toggleDialogExpansion(boolean isClicked) {
-        mExpanded = !mExpanded;
-        Animator inAnimator;
-        if (mExpanded) {
-            for (int groupId = 0; groupId < mAvailableVolumeItems.size(); ++groupId) {
-                if (groupId != mCurrentlyDisplayingGroupId) {
-                    VolumeItem volumeItem = mAvailableVolumeItems.get(groupId);
-                    addCarVolumeListItem(volumeItem, groupId, /* supplementalIconId= */ 0,
-                            /* supplementalIconOnClickListener= */ null);
-                }
-            }
-            inAnimator = AnimatorInflater.loadAnimator(
-                    mContext, R.anim.car_arrow_fade_in_rotate_up);
-
-        } else {
-            clearAllAndSetupDefaultCarVolumeLineItem(mCurrentlyDisplayingGroupId);
-            inAnimator = AnimatorInflater.loadAnimator(
-                    mContext, R.anim.car_arrow_fade_in_rotate_down);
-        }
-
-        Animator outAnimator = AnimatorInflater.loadAnimator(
-                mContext, R.anim.car_arrow_fade_out);
-        inAnimator.setStartDelay(ARROW_FADE_IN_START_DELAY_IN_MILLIS);
-        AnimatorSet animators = new AnimatorSet();
-        animators.playTogether(outAnimator, inAnimator);
-        if (!isClicked) {
-            // Do not animate when the state is called to reset the dialogs view and not clicked
-            // by user.
-            animators.setDuration(0);
-        }
-        animators.setTarget(mExpandIcon);
-        animators.start();
-        mVolumeItemsAdapter.notifyDataSetChanged();
-    }
-
-    private final class VolumeSeekBarChangeListener implements OnSeekBarChangeListener {
-
-        private final int mVolumeGroupId;
-        private final CarAudioManager mCarAudioManager;
-
-        private VolumeSeekBarChangeListener(int volumeGroupId, CarAudioManager carAudioManager) {
-            mVolumeGroupId = volumeGroupId;
-            mCarAudioManager = carAudioManager;
-        }
-
-        @Override
-        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-            if (!fromUser) {
-                // For instance, if this event is originated from AudioService,
-                // we can ignore it as it has already been handled and doesn't need to be
-                // sent back down again.
-                return;
-            }
-            if (mCarAudioManager == null) {
-                Log.w(TAG, "Ignoring volume change event because the car isn't connected");
-                return;
-            }
-            mAvailableVolumeItems.get(mVolumeGroupId).mProgress = progress;
-            mAvailableVolumeItems.get(
-                    mVolumeGroupId).mCarVolumeItem.setProgress(progress);
-            mCarAudioManager.setGroupVolume(mVolumeGroupId, progress, 0);
-        }
-
-        @Override
-        public void onStartTrackingTouch(SeekBar seekBar) {
-        }
-
-        @Override
-        public void onStopTrackingTouch(SeekBar seekBar) {
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeItem.java b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeItem.java
deleted file mode 100644
index 1e7e534..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeItem.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.volume;
-
-import android.graphics.drawable.Drawable;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.SeekBar;
-
-import androidx.annotation.NonNull;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.systemui.R;
-
-/** Holds all related data to represent a volume group. */
-public class CarVolumeItem {
-
-    private Drawable mPrimaryIcon;
-    private Drawable mSupplementalIcon;
-    private View.OnClickListener mSupplementalIconOnClickListener;
-    private boolean mShowSupplementalIconDivider;
-    private int mGroupId;
-
-    private int mMax;
-    private int mProgress;
-    private SeekBar.OnSeekBarChangeListener mOnSeekBarChangeListener;
-
-    /**
-     * Called when {@link CarVolumeItem} is bound to its ViewHolder.
-     */
-    void bind(CarVolumeItemViewHolder viewHolder) {
-        viewHolder.bind(/* carVolumeItem= */ this);
-    }
-
-    /** Sets progress of seekbar. */
-    public void setProgress(int progress) {
-        mProgress = progress;
-    }
-
-    /** Sets max value of seekbar. */
-    public void setMax(int max) {
-        mMax = max;
-    }
-
-    /** Sets {@link SeekBar.OnSeekBarChangeListener}. */
-    public void setOnSeekBarChangeListener(SeekBar.OnSeekBarChangeListener listener) {
-        mOnSeekBarChangeListener = listener;
-    }
-
-    /** Sets the primary icon. */
-    public void setPrimaryIcon(Drawable drawable) {
-        mPrimaryIcon = drawable;
-    }
-
-    /** Sets the supplemental icon and the visibility of the supplemental icon divider. */
-    public void setSupplementalIcon(Drawable drawable, boolean showSupplementalIconDivider) {
-        mSupplementalIcon = drawable;
-        mShowSupplementalIconDivider = showSupplementalIconDivider;
-    }
-
-    /**
-     * Gets the group id associated.
-     */
-    public int getGroupId() {
-        return mGroupId;
-    }
-
-    /**
-     * Sets the group id associated.
-     */
-    public void setGroupId(int groupId) {
-        this.mGroupId = groupId;
-    }
-
-    /** Sets {@code OnClickListener} for the supplemental icon. */
-    public void setSupplementalIconListener(View.OnClickListener listener) {
-        mSupplementalIconOnClickListener = listener;
-    }
-
-    /** Defines the view holder which shows the information held by {@link CarVolumeItem}. */
-    public static class CarVolumeItemViewHolder extends RecyclerView.ViewHolder {
-
-        private SeekBar mSeekBar;
-        private ImageView mPrimaryIcon;
-        private View mSupplementalIconDivider;
-        private ImageView mSupplementalIcon;
-
-        public CarVolumeItemViewHolder(@NonNull View itemView) {
-            super(itemView);
-
-            mSeekBar = itemView.findViewById(R.id.seek_bar);
-            mPrimaryIcon = itemView.findViewById(R.id.primary_icon);
-            mSupplementalIcon = itemView.findViewById(R.id.supplemental_icon);
-            mSupplementalIconDivider = itemView.findViewById(R.id.supplemental_icon_divider);
-        }
-
-        /**
-         * Binds {@link CarVolumeItem} to the {@link CarVolumeItemViewHolder}.
-         */
-        void bind(CarVolumeItem carVolumeItem) {
-            // Progress bar
-            mSeekBar.setMax(carVolumeItem.mMax);
-            mSeekBar.setProgress(carVolumeItem.mProgress);
-            mSeekBar.setOnSeekBarChangeListener(carVolumeItem.mOnSeekBarChangeListener);
-
-            // Primary icon
-            mPrimaryIcon.setVisibility(View.VISIBLE);
-            mPrimaryIcon.setImageDrawable(carVolumeItem.mPrimaryIcon);
-
-            // Supplemental icon
-            mSupplementalIcon.setVisibility(View.VISIBLE);
-            mSupplementalIconDivider.setVisibility(
-                    carVolumeItem.mShowSupplementalIconDivider ? View.VISIBLE : View.INVISIBLE);
-            mSupplementalIcon.setImageDrawable(carVolumeItem.mSupplementalIcon);
-            mSupplementalIcon.setOnClickListener(
-                    carVolumeItem.mSupplementalIconOnClickListener);
-            mSupplementalIcon.setClickable(
-                    carVolumeItem.mSupplementalIconOnClickListener != null);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeItemAdapter.java b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeItemAdapter.java
deleted file mode 100644
index 7f336b5..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeItemAdapter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.volume;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.systemui.R;
-
-import java.util.List;
-
-/** The {@link RecyclerView.Adapter} to show the volume items in the sysUI volume dialog. */
-public class CarVolumeItemAdapter extends
-        RecyclerView.Adapter<CarVolumeItem.CarVolumeItemViewHolder> {
-
-    private final Context mContext;
-    private final List<CarVolumeItem> mItems;
-
-    public CarVolumeItemAdapter(Context context, List<CarVolumeItem> items) {
-        mContext = context;
-        mItems = items;
-    }
-
-    @Override
-    public CarVolumeItem.CarVolumeItemViewHolder onCreateViewHolder(ViewGroup parent,
-            int viewType) {
-        LayoutInflater inflater = LayoutInflater.from(mContext);
-        View view = inflater.inflate(R.layout.car_volume_item, parent, false);
-        return new CarVolumeItem.CarVolumeItemViewHolder(view);
-    }
-
-    @Override
-    public void onBindViewHolder(CarVolumeItem.CarVolumeItemViewHolder holder, int position) {
-        mItems.get(position).bind(holder);
-    }
-
-    @Override
-    public int getItemCount() {
-        return mItems.size();
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/volume/VolumeUI.java b/packages/CarSystemUI/src/com/android/systemui/car/volume/VolumeUI.java
deleted file mode 100644
index b0321ab..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/volume/VolumeUI.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.volume;
-
-import android.car.Car;
-import android.car.media.CarAudioManager;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.os.Handler;
-import android.util.Log;
-
-import com.android.systemui.R;
-import com.android.systemui.SystemUI;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.volume.VolumeDialogComponent;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-import javax.inject.Inject;
-
-import dagger.Lazy;
-
-/** The entry point for controlling the volume ui in cars. */
-@SysUISingleton
-public class VolumeUI extends SystemUI {
-
-    private static final String TAG = "VolumeUI";
-    private final Resources mResources;
-    private final Handler mMainHandler;
-    private final CarServiceProvider mCarServiceProvider;
-    private final Lazy<VolumeDialogComponent> mVolumeDialogComponentLazy;
-
-    private final CarAudioManager.CarVolumeCallback mVolumeChangeCallback =
-            new CarAudioManager.CarVolumeCallback() {
-                @Override
-                public void onGroupVolumeChanged(int zoneId, int groupId, int flags) {
-                    initVolumeDialogComponent();
-                }
-
-                @Override
-                public void onMasterMuteChanged(int zoneId, int flags) {
-                    initVolumeDialogComponent();
-                }
-
-                private void initVolumeDialogComponent() {
-                    if (mVolumeDialogComponent == null) {
-                        mMainHandler.post(() -> {
-                            mVolumeDialogComponent = mVolumeDialogComponentLazy.get();
-                            mVolumeDialogComponent.register();
-                        });
-                        mCarAudioManager.unregisterCarVolumeCallback(mVolumeChangeCallback);
-                    }
-                }
-            };
-
-    private boolean mEnabled;
-    private CarAudioManager mCarAudioManager;
-    private VolumeDialogComponent mVolumeDialogComponent;
-
-    @Inject
-    public VolumeUI(
-            Context context,
-            @Main Resources resources,
-            @Main Handler mainHandler,
-            CarServiceProvider carServiceProvider,
-            Lazy<VolumeDialogComponent> volumeDialogComponentLazy
-    ) {
-        super(context);
-        mResources = resources;
-        mMainHandler = mainHandler;
-        mCarServiceProvider = carServiceProvider;
-        mVolumeDialogComponentLazy = volumeDialogComponentLazy;
-    }
-
-    @Override
-    public void start() {
-        boolean enableVolumeUi = mResources.getBoolean(R.bool.enable_volume_ui);
-        mEnabled = enableVolumeUi;
-        if (!mEnabled) return;
-
-        mCarServiceProvider.addListener(car -> {
-            if (mCarAudioManager != null) {
-                return;
-            }
-
-            mCarAudioManager = (CarAudioManager) car.getCarManager(Car.AUDIO_SERVICE);
-            Log.d(TAG, "Registering mVolumeChangeCallback.");
-            // This volume call back is never unregistered because CarStatusBar is
-            // never destroyed.
-            mCarAudioManager.registerCarVolumeCallback(mVolumeChangeCallback);
-        });
-    }
-
-    @Override
-    protected void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-        if (!mEnabled) return;
-        if (mVolumeDialogComponent != null) {
-            mVolumeDialogComponent.onConfigurationChanged(newConfig);
-        }
-    }
-
-    @Override
-    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        pw.print("mEnabled="); pw.println(mEnabled);
-        if (!mEnabled) return;
-        if (mVolumeDialogComponent != null) {
-            mVolumeDialogComponent.dump(fd, pw, args);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java
deleted file mode 100644
index 44cb5cf..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java
+++ /dev/null
@@ -1,685 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.window;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
-import android.annotation.IntDef;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Rect;
-import android.util.Log;
-import android.view.GestureDetector;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewTreeObserver;
-
-import androidx.annotation.CallSuper;
-
-import com.android.systemui.R;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.wm.shell.animation.FlingAnimationUtils;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * The {@link OverlayPanelViewController} provides additional dragging animation capabilities to
- * {@link OverlayViewController}.
- */
-public abstract class OverlayPanelViewController extends OverlayViewController {
-
-    /** @hide */
-    @IntDef(flag = true, prefix = { "OVERLAY_" }, value = {
-            OVERLAY_FROM_TOP_BAR,
-            OVERLAY_FROM_BOTTOM_BAR
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface OverlayDirection {}
-
-    /**
-     * Indicates that the overlay panel should be opened from the top bar and expanded by dragging
-     * towards the bottom bar.
-     */
-    public static final int OVERLAY_FROM_TOP_BAR = 0;
-
-    /**
-     * Indicates that the overlay panel should be opened from the bottom bar and expanded by
-     * dragging towards the top bar.
-     */
-    public static final int OVERLAY_FROM_BOTTOM_BAR = 1;
-
-    private static final boolean DEBUG = false;
-    private static final String TAG = "OverlayPanelViewController";
-
-    // used to calculate how fast to open or close the window
-    protected static final float DEFAULT_FLING_VELOCITY = 0;
-    // max time a fling animation takes
-    protected static final float FLING_ANIMATION_MAX_TIME = 0.5f;
-    // acceleration rate for the fling animation
-    protected static final float FLING_SPEED_UP_FACTOR = 0.6f;
-
-    protected static final int SWIPE_DOWN_MIN_DISTANCE = 25;
-    protected static final int SWIPE_MAX_OFF_PATH = 75;
-    protected static final int SWIPE_THRESHOLD_VELOCITY = 200;
-    private static final int POSITIVE_DIRECTION = 1;
-    private static final int NEGATIVE_DIRECTION = -1;
-
-    private final FlingAnimationUtils mFlingAnimationUtils;
-    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
-    private final View.OnTouchListener mDragOpenTouchListener;
-    private final View.OnTouchListener mDragCloseTouchListener;
-
-    protected int mAnimateDirection = POSITIVE_DIRECTION;
-
-    private final int mSettleClosePercentage;
-    private int mPercentageFromEndingEdge;
-
-    private boolean mPanelVisible;
-    private boolean mPanelExpanded;
-
-    private float mOpeningVelocity = DEFAULT_FLING_VELOCITY;
-    private float mClosingVelocity = DEFAULT_FLING_VELOCITY;
-
-    private boolean mIsAnimating;
-    private boolean mIsTracking;
-
-    public OverlayPanelViewController(
-            Context context,
-            @Main Resources resources,
-            int stubId,
-            OverlayViewGlobalStateController overlayViewGlobalStateController,
-            FlingAnimationUtils.Builder flingAnimationUtilsBuilder,
-            CarDeviceProvisionedController carDeviceProvisionedController
-    ) {
-        super(stubId, overlayViewGlobalStateController);
-
-        mFlingAnimationUtils = flingAnimationUtilsBuilder
-                .setMaxLengthSeconds(FLING_ANIMATION_MAX_TIME)
-                .setSpeedUpFactor(FLING_SPEED_UP_FACTOR)
-                .build();
-        mCarDeviceProvisionedController = carDeviceProvisionedController;
-
-        mSettleClosePercentage = resources.getInteger(
-                R.integer.notification_settle_close_percentage);
-
-        // Attached to a navigation bar to open the overlay panel
-        GestureDetector openGestureDetector = new GestureDetector(context,
-                new OpenGestureListener() {
-                    @Override
-                    protected void open() {
-                        animateExpandPanel();
-                    }
-                });
-
-        // Attached to the other navigation bars to close the overlay panel
-        GestureDetector closeGestureDetector = new GestureDetector(context,
-                new SystemBarCloseGestureListener() {
-                    @Override
-                    protected void close() {
-                        if (isPanelExpanded()) {
-                            animateCollapsePanel();
-                        }
-                    }
-                });
-
-        mDragOpenTouchListener = (v, event) -> {
-            if (!mCarDeviceProvisionedController.isCurrentUserFullySetup()) {
-                return true;
-            }
-            if (!isInflated()) {
-                getOverlayViewGlobalStateController().inflateView(this);
-            }
-
-            boolean consumed = openGestureDetector.onTouchEvent(event);
-            if (consumed) {
-                return true;
-            }
-            maybeCompleteAnimation(event);
-            return true;
-        };
-
-        mDragCloseTouchListener = (v, event) -> {
-            if (!isInflated()) {
-                return true;
-            }
-            boolean consumed = closeGestureDetector.onTouchEvent(event);
-            if (consumed) {
-                return true;
-            }
-            maybeCompleteAnimation(event);
-            return true;
-        };
-    }
-
-    /** Sets the overlay panel animation direction along the x or y axis. */
-    public void setOverlayDirection(@OverlayDirection int direction) {
-        if (direction == OVERLAY_FROM_TOP_BAR) {
-            mAnimateDirection = POSITIVE_DIRECTION;
-        } else if (direction == OVERLAY_FROM_BOTTOM_BAR) {
-            mAnimateDirection = NEGATIVE_DIRECTION;
-        } else {
-            throw new IllegalArgumentException("Direction not supported");
-        }
-    }
-
-    /** Toggles the visibility of the panel. */
-    public void toggle() {
-        if (!isInflated()) {
-            getOverlayViewGlobalStateController().inflateView(this);
-        }
-        if (isPanelExpanded()) {
-            animateCollapsePanel();
-        } else {
-            animateExpandPanel();
-        }
-    }
-
-    /** Checks if a {@link MotionEvent} is an action to open the panel.
-     * @param e {@link MotionEvent} to check.
-     * @return true only if opening action.
-     */
-    protected boolean isOpeningAction(MotionEvent e) {
-        if (mAnimateDirection == POSITIVE_DIRECTION) {
-            return e.getActionMasked() == MotionEvent.ACTION_DOWN;
-        }
-
-        if (mAnimateDirection == NEGATIVE_DIRECTION) {
-            return e.getActionMasked() == MotionEvent.ACTION_UP;
-        }
-
-        return false;
-    }
-
-    /** Checks if a {@link MotionEvent} is an action to close the panel.
-     * @param e {@link MotionEvent} to check.
-     * @return true only if closing action.
-     */
-    protected boolean isClosingAction(MotionEvent e) {
-        if (mAnimateDirection == POSITIVE_DIRECTION) {
-            return e.getActionMasked() == MotionEvent.ACTION_UP;
-        }
-
-        if (mAnimateDirection == NEGATIVE_DIRECTION) {
-            return e.getActionMasked() == MotionEvent.ACTION_DOWN;
-        }
-
-        return false;
-    }
-
-    /* ***************************************************************************************** *
-     * Panel Animation
-     * ***************************************************************************************** */
-
-    /** Animates the closing of the panel. */
-    protected void animateCollapsePanel() {
-        if (!shouldAnimateCollapsePanel()) {
-            return;
-        }
-
-        if (!isPanelExpanded() || !isPanelVisible()) {
-            return;
-        }
-
-        onAnimateCollapsePanel();
-        animatePanel(mClosingVelocity, /* isClosing= */ true);
-    }
-
-    /** Determines whether {@link #animateCollapsePanel()} should collapse the panel. */
-    protected abstract boolean shouldAnimateCollapsePanel();
-
-    /** Called when the panel is beginning to collapse. */
-    protected abstract void onAnimateCollapsePanel();
-
-    /** Animates the expansion of the panel. */
-    protected void animateExpandPanel() {
-        if (!shouldAnimateExpandPanel()) {
-            return;
-        }
-
-        if (!mCarDeviceProvisionedController.isCurrentUserFullySetup()) {
-            return;
-        }
-
-        onAnimateExpandPanel();
-        setPanelVisible(true);
-        animatePanel(mOpeningVelocity, /* isClosing= */ false);
-
-        setPanelExpanded(true);
-    }
-
-    /** Determines whether {@link #animateExpandPanel()}} should expand the panel. */
-    protected abstract boolean shouldAnimateExpandPanel();
-
-    /** Called when the panel is beginning to expand. */
-    protected abstract void onAnimateExpandPanel();
-
-    /**
-     * Depending on certain conditions, determines whether to fully expand or collapse the panel.
-     */
-    protected void maybeCompleteAnimation(MotionEvent event) {
-        if (isClosingAction(event) && isPanelVisible()) {
-            if (mSettleClosePercentage < mPercentageFromEndingEdge) {
-                animatePanel(DEFAULT_FLING_VELOCITY, false);
-            } else {
-                animatePanel(DEFAULT_FLING_VELOCITY, true);
-            }
-        }
-    }
-
-    /**
-     * Animates the panel from one position to other. This is used to either open or
-     * close the panel completely with a velocity. If the animation is to close the
-     * panel this method also makes the view invisible after animation ends.
-     */
-    protected void animatePanel(float velocity, boolean isClosing) {
-        float to = getEndPosition(isClosing);
-
-        Rect rect = getLayout().getClipBounds();
-        if (rect != null) {
-            float from = getCurrentStartPosition(rect);
-            if (from != to) {
-                animate(from, to, velocity, isClosing);
-            }
-
-            // If we swipe down the notification panel all the way to the bottom of the screen
-            // (i.e. from == to), then we have finished animating the panel.
-            return;
-        }
-
-        // We will only be here if the shade is being opened programmatically or via button when
-        // height of the layout was not calculated.
-        ViewTreeObserver panelTreeObserver = getLayout().getViewTreeObserver();
-        panelTreeObserver.addOnGlobalLayoutListener(
-                new ViewTreeObserver.OnGlobalLayoutListener() {
-                    @Override
-                    public void onGlobalLayout() {
-                        ViewTreeObserver obs = getLayout().getViewTreeObserver();
-                        obs.removeOnGlobalLayoutListener(this);
-                        animate(
-                                getDefaultStartPosition(),
-                                getEndPosition(/* isClosing= */ false),
-                                velocity,
-                                isClosing
-                        );
-                    }
-                });
-    }
-
-    /* Returns the start position if the user has not started swiping. */
-    private int getDefaultStartPosition() {
-        return mAnimateDirection > 0 ? 0 : getLayout().getHeight();
-    }
-
-    /** Returns the start position if we are in the middle of swiping. */
-    private int getCurrentStartPosition(Rect clipBounds) {
-        return mAnimateDirection > 0 ? clipBounds.bottom : clipBounds.top;
-    }
-
-    private int getEndPosition(boolean isClosing) {
-        return (mAnimateDirection > 0 && !isClosing) || (mAnimateDirection == -1 && isClosing)
-                ? getLayout().getHeight()
-                : 0;
-    }
-
-    private void animate(float from, float to, float velocity, boolean isClosing) {
-        if (mIsAnimating) {
-            return;
-        }
-        mIsAnimating = true;
-        mIsTracking = true;
-        ValueAnimator animator = ValueAnimator.ofFloat(from, to);
-        animator.addUpdateListener(
-                animation -> {
-                    float animatedValue = (Float) animation.getAnimatedValue();
-                    setViewClipBounds((int) animatedValue);
-                });
-        animator.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                super.onAnimationEnd(animation);
-                mIsAnimating = false;
-                mIsTracking = false;
-                mOpeningVelocity = DEFAULT_FLING_VELOCITY;
-                mClosingVelocity = DEFAULT_FLING_VELOCITY;
-                if (isClosing) {
-                    setPanelVisible(false);
-                    getLayout().setClipBounds(null);
-                    onCollapseAnimationEnd();
-                    setPanelExpanded(false);
-                } else {
-                    onExpandAnimationEnd();
-                    setPanelExpanded(true);
-                }
-            }
-        });
-        getFlingAnimationUtils().apply(animator, from, to, Math.abs(velocity));
-        animator.start();
-    }
-
-    /**
-     * Called in {@link Animator.AnimatorListener#onAnimationEnd(Animator)} when the panel is
-     * closing.
-     */
-    protected abstract void onCollapseAnimationEnd();
-
-    /**
-     * Called in {@link Animator.AnimatorListener#onAnimationEnd(Animator)} when the panel is
-     * opening.
-     */
-    protected abstract void onExpandAnimationEnd();
-
-    /* ***************************************************************************************** *
-     * Panel Visibility
-     * ***************************************************************************************** */
-
-    /** Set the panel view to be visible. */
-    protected final void setPanelVisible(boolean visible) {
-        mPanelVisible = visible;
-        onPanelVisible(visible);
-    }
-
-    /** Returns {@code true} if panel is visible. */
-    public final boolean isPanelVisible() {
-        return mPanelVisible;
-    }
-
-    /** Business logic run when panel visibility is set. */
-    @CallSuper
-    protected void onPanelVisible(boolean visible) {
-        if (DEBUG) {
-            Log.e(TAG, "onPanelVisible: " + visible);
-        }
-
-        if (visible && !getOverlayViewGlobalStateController().isWindowVisible()) {
-            getOverlayViewGlobalStateController().showView(/* panelViewController= */ this);
-        }
-        if (!visible && getOverlayViewGlobalStateController().isWindowVisible()) {
-            getOverlayViewGlobalStateController().hideView(/* panelViewController= */ this);
-        }
-        getLayout().setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
-    }
-
-    /* ***************************************************************************************** *
-     * Panel Expansion
-     * ***************************************************************************************** */
-
-    /**
-     * Set the panel state to expanded. This will expand or collapse the overlay window if
-     * necessary.
-     */
-    protected final void setPanelExpanded(boolean expand) {
-        mPanelExpanded = expand;
-        onPanelExpanded(expand);
-    }
-
-    /** Returns {@code true} if panel is expanded. */
-    public final boolean isPanelExpanded() {
-        return mPanelExpanded;
-    }
-
-    @CallSuper
-    protected void onPanelExpanded(boolean expand) {
-        if (DEBUG) {
-            Log.e(TAG, "onPanelExpanded: " + expand);
-        }
-    }
-
-    /* ***************************************************************************************** *
-     * Misc
-     * ***************************************************************************************** */
-
-    /**
-     * Given the position of the pointer dragging the panel, return the percentage of its closeness
-     * to the ending edge.
-     */
-    protected void calculatePercentageFromEndingEdge(float y) {
-        if (getLayout().getHeight() > 0) {
-            float height = getVisiblePanelHeight(y);
-            mPercentageFromEndingEdge = (int) Math.abs(height / getLayout().getHeight() * 100);
-        }
-    }
-
-    private float getVisiblePanelHeight(float y) {
-        return mAnimateDirection > 0 ? y : getLayout().getHeight() - y;
-    }
-
-    /** Sets the boundaries of the overlay panel that can be seen based on pointer position. */
-    protected void setViewClipBounds(int y) {
-        // Bound the pointer position to be within the overlay panel.
-        y = Math.max(0, Math.min(y, getLayout().getHeight()));
-        Rect clipBounds = new Rect();
-        int top, bottom;
-        if (mAnimateDirection > 0) {
-            top = 0;
-            bottom = y;
-        } else {
-            top = y;
-            bottom = getLayout().getHeight();
-        }
-        clipBounds.set(0, top, getLayout().getWidth(), bottom);
-        getLayout().setClipBounds(clipBounds);
-        onScroll(y);
-    }
-
-    /**
-     * Called while scrolling, this passes the position of the clip boundary that is currently
-     * changing.
-     */
-    protected abstract void onScroll(int y);
-
-    /* ***************************************************************************************** *
-     * Getters
-     * ***************************************************************************************** */
-
-    /** Returns the open touch listener. */
-    public final View.OnTouchListener getDragOpenTouchListener() {
-        return mDragOpenTouchListener;
-    }
-
-    /** Returns the close touch listener. */
-    public final View.OnTouchListener getDragCloseTouchListener() {
-        return mDragCloseTouchListener;
-    }
-
-    /** Gets the fling animation utils used for animating this panel. */
-    protected final FlingAnimationUtils getFlingAnimationUtils() {
-        return mFlingAnimationUtils;
-    }
-
-    /** Returns {@code true} if the panel is currently tracking. */
-    protected final boolean isTracking() {
-        return mIsTracking;
-    }
-
-    /** Sets whether the panel is currently tracking or not. */
-    protected final void setIsTracking(boolean isTracking) {
-        mIsTracking = isTracking;
-    }
-
-    /** Returns {@code true} if the panel is currently animating. */
-    protected final boolean isAnimating() {
-        return mIsAnimating;
-    }
-
-    /** Returns the percentage of the panel that is open from the bottom. */
-    protected final int getPercentageFromEndingEdge() {
-        return mPercentageFromEndingEdge;
-    }
-
-    /** Returns the percentage at which we've determined whether to open or close the panel. */
-    protected final int getSettleClosePercentage() {
-        return mSettleClosePercentage;
-    }
-
-    /* ***************************************************************************************** *
-     * Gesture Listeners
-     * ***************************************************************************************** */
-
-    /** Called when the user is beginning to scroll down the panel. */
-    protected abstract void onOpenScrollStart();
-
-    /**
-     * Only responsible for open hooks. Since once the panel opens it covers all elements
-     * there is no need to merge with close.
-     */
-    protected abstract class OpenGestureListener extends
-            GestureDetector.SimpleOnGestureListener {
-
-        @Override
-        public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
-                float distanceY) {
-
-            if (!isPanelVisible()) {
-                onOpenScrollStart();
-            }
-            setPanelVisible(true);
-
-            // clips the view for the panel when the user scrolls to open.
-            setViewClipBounds((int) event2.getRawY());
-
-            // Initially the scroll starts with height being zero. This checks protects from divide
-            // by zero error.
-            calculatePercentageFromEndingEdge(event2.getRawY());
-
-            mIsTracking = true;
-            return true;
-        }
-
-
-        @Override
-        public boolean onFling(MotionEvent event1, MotionEvent event2,
-                float velocityX, float velocityY) {
-            if (mAnimateDirection * velocityY > SWIPE_THRESHOLD_VELOCITY) {
-                mOpeningVelocity = velocityY;
-                open();
-                return true;
-            }
-            animatePanel(DEFAULT_FLING_VELOCITY, true);
-
-            return false;
-        }
-
-        protected abstract void open();
-    }
-
-    /** Determines whether the scroll event should allow closing of the panel. */
-    protected abstract boolean shouldAllowClosingScroll();
-
-    protected abstract class CloseGestureListener extends
-            GestureDetector.SimpleOnGestureListener {
-
-        @Override
-        public boolean onSingleTapUp(MotionEvent motionEvent) {
-            if (isPanelExpanded()) {
-                animatePanel(DEFAULT_FLING_VELOCITY, true);
-            }
-            return true;
-        }
-
-        @Override
-        public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
-                float distanceY) {
-            if (!shouldAllowClosingScroll()) {
-                return false;
-            }
-            float y = getYPositionOfPanelEndingEdge(event1, event2);
-            if (getLayout().getHeight() > 0) {
-                mPercentageFromEndingEdge = (int) Math.abs(
-                        y / getLayout().getHeight() * 100);
-                boolean isInClosingDirection = mAnimateDirection * distanceY > 0;
-
-                // This check is to figure out if onScroll was called while swiping the card at
-                // bottom of the panel. At that time we should not allow panel to
-                // close. We are also checking for the upwards swipe gesture here because it is
-                // possible if a user is closing the panel and while swiping starts
-                // to open again but does not fling. At that time we should allow the
-                // panel to close fully or else it would stuck in between.
-                if (Math.abs(getLayout().getHeight() - y)
-                        > SWIPE_DOWN_MIN_DISTANCE && isInClosingDirection) {
-                    setViewClipBounds((int) y);
-                    mIsTracking = true;
-                } else if (!isInClosingDirection) {
-                    setViewClipBounds((int) y);
-                }
-            }
-            // if we return true the items in RV won't be scrollable.
-            return false;
-        }
-
-        /**
-         * To prevent the jump in the clip bounds while closing the panel we should calculate the y
-         * position using the diff of event1 and event2. This will help the panel clip smoothly as
-         * the event2 value changes while event1 value will be fixed.
-         * @param event1 MotionEvent that contains the position of where the event2 started.
-         * @param event2 MotionEvent that contains the position of where the user has scrolled to
-         *               on the screen.
-         */
-        private float getYPositionOfPanelEndingEdge(MotionEvent event1, MotionEvent event2) {
-            float diff = mAnimateDirection * (event1.getRawY() - event2.getRawY());
-            float y = mAnimateDirection > 0 ? getLayout().getHeight() - diff : diff;
-            y = Math.max(0, Math.min(y, getLayout().getHeight()));
-            return y;
-        }
-
-        @Override
-        public boolean onFling(MotionEvent event1, MotionEvent event2,
-                float velocityX, float velocityY) {
-            // should not fling if the touch does not start when view is at the end of the list.
-            if (!shouldAllowClosingScroll()) {
-                return false;
-            }
-            if (Math.abs(event1.getX() - event2.getX()) > SWIPE_MAX_OFF_PATH
-                    || Math.abs(velocityY) < SWIPE_THRESHOLD_VELOCITY) {
-                // swipe was not vertical or was not fast enough
-                return false;
-            }
-            boolean isInClosingDirection = mAnimateDirection * velocityY < 0;
-            if (isInClosingDirection) {
-                close();
-                return true;
-            } else {
-                // we should close the shade
-                animatePanel(velocityY, false);
-            }
-            return false;
-        }
-
-        protected abstract void close();
-    }
-
-    protected abstract class SystemBarCloseGestureListener extends CloseGestureListener {
-        @Override
-        public boolean onSingleTapUp(MotionEvent e) {
-            mClosingVelocity = DEFAULT_FLING_VELOCITY;
-            if (isPanelExpanded()) {
-                close();
-            }
-            return super.onSingleTapUp(e);
-        }
-
-        @Override
-        public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
-                float distanceY) {
-            calculatePercentageFromEndingEdge(event2.getRawY());
-            setViewClipBounds((int) event2.getRawY());
-            return true;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java
deleted file mode 100644
index b989c42..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.window;
-
-import static android.view.WindowInsets.Type.statusBars;
-
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewStub;
-import android.view.WindowInsets;
-
-/**
- * Owns a {@link View} that is present in SystemUIOverlayWindow.
- */
-public class OverlayViewController {
-    protected static final int INVALID_INSET_SIDE = -1;
-    protected static final int NO_INSET_SIDE = 0;
-
-    private final int mStubId;
-    private final OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-
-    private View mLayout;
-
-    public OverlayViewController(int stubId,
-            OverlayViewGlobalStateController overlayViewGlobalStateController) {
-        mLayout = null;
-        mStubId = stubId;
-        mOverlayViewGlobalStateController = overlayViewGlobalStateController;
-    }
-
-    /**
-     * Shows content of {@link OverlayViewController}.
-     *
-     * Should be used to show view externally and in particular by {@link OverlayViewMediator}.
-     */
-    public final void start() {
-        mOverlayViewGlobalStateController.showView(/* viewController= */ this, this::show);
-    }
-
-    /**
-     * Hides content of {@link OverlayViewController}.
-     *
-     * Should be used to hide view externally and in particular by {@link OverlayViewMediator}.
-     */
-    public final void stop() {
-        mOverlayViewGlobalStateController.hideView(/* viewController= */ this, this::hide);
-    }
-
-    /**
-     * Inflate layout owned by controller.
-     */
-    public final void inflate(ViewGroup baseLayout) {
-        ViewStub viewStub = baseLayout.findViewById(mStubId);
-        mLayout = viewStub.inflate();
-        onFinishInflate();
-    }
-
-    /**
-     * Called once inflate finishes.
-     */
-    protected void onFinishInflate() {
-        // no-op
-    }
-
-    /**
-     * Returns {@code true} if layout owned by controller has been inflated.
-     */
-    public final boolean isInflated() {
-        return mLayout != null;
-    }
-
-    private void show() {
-        if (mLayout == null) {
-            // layout must be inflated before show() is called.
-            return;
-        }
-        showInternal();
-    }
-
-    /**
-     * Subclasses should override this method to implement reveal animations and implement logic
-     * specific to when the layout owned by the controller is shown.
-     *
-     * Should only be overridden by Superclass but not called by any {@link OverlayViewMediator}.
-     */
-    protected void showInternal() {
-        mLayout.setVisibility(View.VISIBLE);
-    }
-
-    private void hide() {
-        if (mLayout == null) {
-            // layout must be inflated before hide() is called.
-            return;
-        }
-        hideInternal();
-    }
-
-    /**
-     * Subclasses should override this method to implement conceal animations and implement logic
-     * specific to when the layout owned by the controller is hidden.
-     *
-     * Should only be overridden by Superclass but not called by any {@link OverlayViewMediator}.
-     */
-    protected void hideInternal() {
-        mLayout.setVisibility(View.GONE);
-    }
-
-    /**
-     * Provides access to layout owned by controller.
-     */
-    protected final View getLayout() {
-        return mLayout;
-    }
-
-    /** Returns the {@link OverlayViewGlobalStateController}. */
-    protected final OverlayViewGlobalStateController getOverlayViewGlobalStateController() {
-        return mOverlayViewGlobalStateController;
-    }
-
-    /**
-     * Returns {@code true} if heads up notifications should be displayed over this view.
-     */
-    protected boolean shouldShowHUN() {
-        return true;
-    }
-
-    /**
-     * Returns {@code true} if navigation bar insets should be displayed over this view. Has no
-     * effect if {@link #shouldFocusWindow} returns {@code false}.
-     */
-    protected boolean shouldShowNavigationBarInsets() {
-        return false;
-    }
-
-    /**
-     * Returns {@code true} if status bar insets should be displayed over this view. Has no
-     * effect if {@link #shouldFocusWindow} returns {@code false}.
-     */
-    protected boolean shouldShowStatusBarInsets() {
-        return false;
-    }
-
-    /**
-     * Returns {@code true} if this view should be hidden during the occluded state.
-     */
-    protected boolean shouldShowWhenOccluded() {
-        return false;
-    }
-
-    /**
-     * Returns {@code true} if the window should be focued when this view is visible. Note that
-     * returning {@code false} here means that {@link #shouldShowStatusBarInsets} and
-     * {@link #shouldShowNavigationBarInsets} will have no effect.
-     */
-    protected boolean shouldFocusWindow() {
-        return true;
-    }
-
-    /**
-     * Returns {@code true} if the window should use stable insets. Using stable insets means that
-     * even when system bars are temporarily not visible, inset from the system bars will still be
-     * applied.
-     *
-     * NOTE: When system bars are hidden in transient mode, insets from them will not be applied
-     * even when the system bars become visible. Setting the return value to {@true} here can
-     * prevent the OverlayView from overlapping with the system bars when that happens.
-     */
-    protected boolean shouldUseStableInsets() {
-        return false;
-    }
-
-    /**
-     * Returns the insets types to fit to the sysui overlay window when this
-     * {@link OverlayViewController} is in the foreground.
-     */
-    @WindowInsets.Type.InsetsType
-    protected int getInsetTypesToFit() {
-        return statusBars();
-    }
-
-    /**
-     * Optionally returns the sides of enabled system bar insets to fit to the sysui overlay window
-     * when this {@link OverlayViewController} is in the foreground.
-     *
-     * For example, if the bottom and left system bars are enabled and this method returns
-     * WindowInsets.Side.LEFT, then the inset from the bottom system bar will be ignored.
-     *
-     * NOTE: By default, this method returns {@link #INVALID_INSET_SIDE}, so insets to fit are
-     * defined by {@link #getInsetTypesToFit()}, and not by this method, unless it is overridden
-     * by subclasses.
-     *
-     * NOTE: {@link #NO_INSET_SIDE} signifies no insets from any system bars will be honored. Each
-     * {@link OverlayViewController} can first take this value and add sides of the system bar
-     * insets to honor to it.
-     *
-     * NOTE: If getInsetSidesToFit is overridden to return {@link WindowInsets.Side}, it always
-     * takes precedence over {@link #getInsetTypesToFit()}. That is, the return value of {@link
-     * #getInsetTypesToFit()} will be ignored.
-     */
-    @WindowInsets.Side.InsetsSide
-    protected int getInsetSidesToFit() {
-        return INVALID_INSET_SIDE;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java
deleted file mode 100644
index 10f436b..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.window;
-
-import static android.view.WindowInsets.Type.navigationBars;
-import static android.view.WindowInsets.Type.statusBars;
-
-import android.annotation.Nullable;
-import android.util.Log;
-import android.view.WindowInsets;
-import android.view.WindowInsets.Side.InsetsSide;
-import android.view.WindowInsets.Type.InsetsType;
-import android.view.WindowInsetsController;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.systemui.dagger.SysUISingleton;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-import javax.inject.Inject;
-
-/**
- * This controller is responsible for the following:
- * <p><ul>
- * <li>Holds the global state for SystemUIOverlayWindow.
- * <li>Allows {@link SystemUIOverlayWindowManager} to register {@link OverlayViewMediator}(s).
- * <li>Enables {@link OverlayViewController)(s) to reveal/conceal themselves while respecting the
- * global state of SystemUIOverlayWindow.
- * </ul>
- */
-@SysUISingleton
-public class OverlayViewGlobalStateController {
-    private static final boolean DEBUG = false;
-    private static final String TAG = OverlayViewGlobalStateController.class.getSimpleName();
-    private static final int UNKNOWN_Z_ORDER = -1;
-    private final SystemUIOverlayWindowController mSystemUIOverlayWindowController;
-    private final WindowInsetsController mWindowInsetsController;
-    @VisibleForTesting
-    Map<OverlayViewController, Integer> mZOrderMap;
-    @VisibleForTesting
-    SortedMap<Integer, OverlayViewController> mZOrderVisibleSortedMap;
-    @VisibleForTesting
-    Set<OverlayViewController> mViewsHiddenForOcclusion;
-    @VisibleForTesting
-    OverlayViewController mHighestZOrder;
-    private boolean mIsOccluded;
-
-    @Inject
-    public OverlayViewGlobalStateController(
-            SystemUIOverlayWindowController systemUIOverlayWindowController) {
-        mSystemUIOverlayWindowController = systemUIOverlayWindowController;
-        mSystemUIOverlayWindowController.attach();
-        mWindowInsetsController =
-                mSystemUIOverlayWindowController.getBaseLayout().getWindowInsetsController();
-        mZOrderMap = new HashMap<>();
-        mZOrderVisibleSortedMap = new TreeMap<>();
-        mViewsHiddenForOcclusion = new HashSet<>();
-    }
-
-    /**
-     * Register {@link OverlayViewMediator} to use in SystemUIOverlayWindow.
-     */
-    public void registerMediator(OverlayViewMediator overlayViewMediator) {
-        Log.d(TAG, "Registering content mediator: " + overlayViewMediator.getClass().getName());
-
-        overlayViewMediator.registerListeners();
-        overlayViewMediator.setupOverlayContentViewControllers();
-    }
-
-    /**
-     * Show content in Overlay Window using {@link OverlayPanelViewController}.
-     *
-     * This calls {@link OverlayViewGlobalStateController#showView(OverlayViewController, Runnable)}
-     * where the runnable is nullified since the actual showing of the panel is handled by the
-     * controller itself.
-     */
-    public void showView(OverlayPanelViewController panelViewController) {
-        showView(panelViewController, /* show= */ null);
-    }
-
-    /**
-     * Show content in Overlay Window using {@link OverlayViewController}.
-     */
-    public void showView(OverlayViewController viewController, @Nullable Runnable show) {
-        debugLog();
-        if (mIsOccluded && !viewController.shouldShowWhenOccluded()) {
-            mViewsHiddenForOcclusion.add(viewController);
-            return;
-        }
-        if (mZOrderVisibleSortedMap.isEmpty()) {
-            setWindowVisible(true);
-        }
-
-        if (!(viewController instanceof OverlayPanelViewController)) {
-            inflateView(viewController);
-        }
-
-        if (show != null) {
-            show.run();
-        }
-
-        updateInternalsWhenShowingView(viewController);
-        refreshUseStableInsets();
-        refreshInsetsToFit();
-        refreshWindowFocus();
-        refreshNavigationBarVisibility();
-        refreshStatusBarVisibility();
-
-        Log.d(TAG, "Content shown: " + viewController.getClass().getName());
-        debugLog();
-    }
-
-    private void updateInternalsWhenShowingView(OverlayViewController viewController) {
-        int zOrder;
-        if (mZOrderMap.containsKey(viewController)) {
-            zOrder = mZOrderMap.get(viewController);
-        } else {
-            zOrder = mSystemUIOverlayWindowController.getBaseLayout().indexOfChild(
-                    viewController.getLayout());
-            mZOrderMap.put(viewController, zOrder);
-        }
-
-        mZOrderVisibleSortedMap.put(zOrder, viewController);
-
-        refreshHighestZOrderWhenShowingView(viewController);
-    }
-
-    private void refreshHighestZOrderWhenShowingView(OverlayViewController viewController) {
-        if (mZOrderMap.getOrDefault(mHighestZOrder, UNKNOWN_Z_ORDER) < mZOrderMap.get(
-                viewController)) {
-            mHighestZOrder = viewController;
-        }
-    }
-
-    /**
-     * Hide content in Overlay Window using {@link OverlayPanelViewController}.
-     *
-     * This calls {@link OverlayViewGlobalStateController#hideView(OverlayViewController, Runnable)}
-     * where the runnable is nullified since the actual hiding of the panel is handled by the
-     * controller itself.
-     */
-    public void hideView(OverlayPanelViewController panelViewController) {
-        hideView(panelViewController, /* hide= */ null);
-    }
-
-    /**
-     * Hide content in Overlay Window using {@link OverlayViewController}.
-     */
-    public void hideView(OverlayViewController viewController, @Nullable Runnable hide) {
-        debugLog();
-        if (mIsOccluded && mViewsHiddenForOcclusion.contains(viewController)) {
-            mViewsHiddenForOcclusion.remove(viewController);
-            return;
-        }
-        if (!viewController.isInflated()) {
-            Log.d(TAG, "Content cannot be hidden since it isn't inflated: "
-                    + viewController.getClass().getName());
-            return;
-        }
-        if (!mZOrderMap.containsKey(viewController)) {
-            Log.d(TAG, "Content cannot be hidden since it has never been shown: "
-                    + viewController.getClass().getName());
-            return;
-        }
-        if (!mZOrderVisibleSortedMap.containsKey(mZOrderMap.get(viewController))) {
-            Log.d(TAG, "Content cannot be hidden since it isn't currently shown: "
-                    + viewController.getClass().getName());
-            return;
-        }
-
-        if (hide != null) {
-            hide.run();
-        }
-
-        mZOrderVisibleSortedMap.remove(mZOrderMap.get(viewController));
-        refreshHighestZOrderWhenHidingView(viewController);
-        refreshUseStableInsets();
-        refreshInsetsToFit();
-        refreshWindowFocus();
-        refreshNavigationBarVisibility();
-        refreshStatusBarVisibility();
-
-        if (mZOrderVisibleSortedMap.isEmpty()) {
-            setWindowVisible(false);
-        }
-
-        Log.d(TAG, "Content hidden: " + viewController.getClass().getName());
-        debugLog();
-    }
-
-    private void refreshHighestZOrderWhenHidingView(OverlayViewController viewController) {
-        if (mZOrderVisibleSortedMap.isEmpty()) {
-            mHighestZOrder = null;
-            return;
-        }
-        if (!mHighestZOrder.equals(viewController)) {
-            return;
-        }
-
-        mHighestZOrder = mZOrderVisibleSortedMap.get(mZOrderVisibleSortedMap.lastKey());
-    }
-
-    private void refreshNavigationBarVisibility() {
-        if (mZOrderVisibleSortedMap.isEmpty()) {
-            mWindowInsetsController.show(navigationBars());
-            return;
-        }
-
-        // Do not hide navigation bar insets if the window is not focusable.
-        if (mHighestZOrder.shouldFocusWindow() && !mHighestZOrder.shouldShowNavigationBarInsets()) {
-            mWindowInsetsController.hide(navigationBars());
-        } else {
-            mWindowInsetsController.show(navigationBars());
-        }
-    }
-
-    private void refreshStatusBarVisibility() {
-        if (mZOrderVisibleSortedMap.isEmpty()) {
-            mWindowInsetsController.show(statusBars());
-            return;
-        }
-
-        // Do not hide status bar insets if the window is not focusable.
-        if (mHighestZOrder.shouldFocusWindow() && !mHighestZOrder.shouldShowStatusBarInsets()) {
-            mWindowInsetsController.hide(statusBars());
-        } else {
-            mWindowInsetsController.show(statusBars());
-        }
-    }
-
-    private void refreshWindowFocus() {
-        setWindowFocusable(mHighestZOrder == null ? false : mHighestZOrder.shouldFocusWindow());
-    }
-
-    private void refreshUseStableInsets() {
-        mSystemUIOverlayWindowController.setUsingStableInsets(
-                mHighestZOrder == null ? false : mHighestZOrder.shouldUseStableInsets());
-    }
-
-    /**
-     * Refreshes the insets to fit (or honor) either by {@link InsetsType} or {@link InsetsSide}.
-     *
-     * By default, the insets to fit are defined by the {@link InsetsType}. But if an
-     * {@link OverlayViewController} overrides {@link OverlayViewController#getInsetSidesToFit()} to
-     * return an {@link InsetsSide}, then that takes precedence over {@link InsetsType}.
-     */
-    private void refreshInsetsToFit() {
-        if (mZOrderVisibleSortedMap.isEmpty()) {
-            setFitInsetsTypes(statusBars());
-        } else {
-            if (mHighestZOrder.getInsetSidesToFit() != OverlayViewController.INVALID_INSET_SIDE) {
-                // First fit all system bar insets as setFitInsetsSide defines which sides of system
-                // bar insets to actually honor.
-                setFitInsetsTypes(WindowInsets.Type.systemBars());
-                setFitInsetsSides(mHighestZOrder.getInsetSidesToFit());
-            } else {
-                setFitInsetsTypes(mHighestZOrder.getInsetTypesToFit());
-            }
-        }
-    }
-
-    /** Returns {@code true} is the window is visible. */
-    public boolean isWindowVisible() {
-        return mSystemUIOverlayWindowController.isWindowVisible();
-    }
-
-    private void setWindowVisible(boolean visible) {
-        mSystemUIOverlayWindowController.setWindowVisible(visible);
-    }
-
-    /** Sets the insets to fit based on the {@link InsetsType} */
-    private void setFitInsetsTypes(@InsetsType int types) {
-        mSystemUIOverlayWindowController.setFitInsetsTypes(types);
-    }
-
-    /** Sets the insets to fit based on the {@link InsetsSide} */
-    private void setFitInsetsSides(@InsetsSide int sides) {
-        mSystemUIOverlayWindowController.setFitInsetsSides(sides);
-    }
-
-    /**
-     * Sets the {@link android.view.WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM} flag of the
-     * sysui overlay window.
-     */
-    public void setWindowNeedsInput(boolean needsInput) {
-        mSystemUIOverlayWindowController.setWindowNeedsInput(needsInput);
-    }
-
-    /** Returns {@code true} if the window is focusable. */
-    public boolean isWindowFocusable() {
-        return mSystemUIOverlayWindowController.isWindowFocusable();
-    }
-
-    /** Sets the focusable flag of the sysui overlawy window. */
-    public void setWindowFocusable(boolean focusable) {
-        mSystemUIOverlayWindowController.setWindowFocusable(focusable);
-    }
-
-    /** Inflates the view controlled by the given view controller. */
-    public void inflateView(OverlayViewController viewController) {
-        if (!viewController.isInflated()) {
-            viewController.inflate(mSystemUIOverlayWindowController.getBaseLayout());
-        }
-    }
-
-    /**
-     * Return {@code true} if OverlayWindow is in a state where HUNs should be displayed above it.
-     */
-    public boolean shouldShowHUN() {
-        return mZOrderVisibleSortedMap.isEmpty() || mHighestZOrder.shouldShowHUN();
-    }
-
-    /**
-     * Set the OverlayViewWindow to be in occluded or unoccluded state. When OverlayViewWindow is
-     * occluded, all views mounted to it that are not configured to be shown during occlusion will
-     * be hidden.
-     */
-    public void setOccluded(boolean occluded) {
-        if (occluded) {
-            // Hide views before setting mIsOccluded to true so the regular hideView logic is used,
-            // not the one used during occlusion.
-            hideViewsForOcclusion();
-            mIsOccluded = true;
-        } else {
-            mIsOccluded = false;
-            // show views after setting mIsOccluded to false so the regular showView logic is used,
-            // not the one used during occlusion.
-            showViewsHiddenForOcclusion();
-        }
-    }
-
-    private void hideViewsForOcclusion() {
-        HashSet<OverlayViewController> viewsCurrentlyShowing = new HashSet<>(
-                mZOrderVisibleSortedMap.values());
-        viewsCurrentlyShowing.forEach(overlayController -> {
-            if (!overlayController.shouldShowWhenOccluded()) {
-                hideView(overlayController, overlayController::hideInternal);
-                mViewsHiddenForOcclusion.add(overlayController);
-            }
-        });
-    }
-
-    private void showViewsHiddenForOcclusion() {
-        mViewsHiddenForOcclusion.forEach(overlayViewController -> {
-            showView(overlayViewController, overlayViewController::showInternal);
-        });
-        mViewsHiddenForOcclusion.clear();
-    }
-
-    private void debugLog() {
-        if (!DEBUG) {
-            return;
-        }
-
-        Log.d(TAG, "mHighestZOrder: " + mHighestZOrder);
-        Log.d(TAG, "mZOrderVisibleSortedMap.size(): " + mZOrderVisibleSortedMap.size());
-        Log.d(TAG, "mZOrderVisibleSortedMap: " + mZOrderVisibleSortedMap);
-        Log.d(TAG, "mZOrderMap.size(): " + mZOrderMap.size());
-        Log.d(TAG, "mZOrderMap: " + mZOrderMap);
-        Log.d(TAG, "mIsOccluded: " + mIsOccluded);
-        Log.d(TAG, "mViewsHiddenForOcclusion: " + mViewsHiddenForOcclusion);
-        Log.d(TAG, "mViewsHiddenForOcclusion.size(): " + mViewsHiddenForOcclusion.size());
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewMediator.java
deleted file mode 100644
index 3e7b4a2..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewMediator.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.window;
-
-/**
- * Controls when to show and hide {@link OverlayViewController}(s).
- */
-public interface OverlayViewMediator {
-
-    /**
-     * Register listeners that could use ContentVisibilityAdjuster to show/hide content.
-     *
-     * Note that we do not unregister listeners because SystemUI components are expected to live
-     * for the lifecycle of the device.
-     */
-    void registerListeners();
-
-    /**
-     * Allows for post-inflation callbacks and listeners to be set inside required {@link
-     * OverlayViewController}(s).
-     */
-    void setupOverlayContentViewControllers();
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java
deleted file mode 100644
index fcbb0b8..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.window;
-
-import com.android.systemui.car.keyguard.CarKeyguardViewMediator;
-import com.android.systemui.car.notification.BottomNotificationPanelViewMediator;
-import com.android.systemui.car.notification.NotificationPanelViewMediator;
-import com.android.systemui.car.notification.TopNotificationPanelViewMediator;
-import com.android.systemui.car.rvc.RearViewCameraViewMediator;
-import com.android.systemui.car.userswitcher.FullscreenUserSwitcherViewMediator;
-import com.android.systemui.car.userswitcher.UserSwitchTransitionViewMediator;
-
-import dagger.Binds;
-import dagger.Module;
-import dagger.multibindings.ClassKey;
-import dagger.multibindings.IntoMap;
-
-/**
- * Dagger injection module for {@link SystemUIOverlayWindowManager}
- */
-@Module
-public abstract class OverlayWindowModule {
-
-    /** Injects NotificationPanelViewMediator. */
-    @Binds
-    @IntoMap
-    @ClassKey(NotificationPanelViewMediator.class)
-    public abstract OverlayViewMediator bindNotificationPanelViewMediator(
-            NotificationPanelViewMediator notificationPanelViewMediator);
-
-    /** Injects TopNotificationPanelViewMediator. */
-    @Binds
-    @IntoMap
-    @ClassKey(TopNotificationPanelViewMediator.class)
-    public abstract OverlayViewMediator bindTopNotificationPanelViewMediator(
-            TopNotificationPanelViewMediator topNotificationPanelViewMediator);
-
-    /** Injects BottomNotificationPanelViewMediator. */
-    @Binds
-    @IntoMap
-    @ClassKey(BottomNotificationPanelViewMediator.class)
-    public abstract OverlayViewMediator bindBottomNotificationPanelViewMediator(
-            BottomNotificationPanelViewMediator bottomNotificationPanelViewMediator);
-
-    /** Inject into CarKeyguardViewMediator. */
-    @Binds
-    @IntoMap
-    @ClassKey(CarKeyguardViewMediator.class)
-    public abstract OverlayViewMediator bindCarKeyguardViewMediator(
-            CarKeyguardViewMediator carKeyguardViewMediator);
-
-    /** Injects FullscreenUserSwitcherViewsMediator. */
-    @Binds
-    @IntoMap
-    @ClassKey(FullscreenUserSwitcherViewMediator.class)
-    public abstract OverlayViewMediator bindFullscreenUserSwitcherViewsMediator(
-            FullscreenUserSwitcherViewMediator overlayViewsMediator);
-
-    /** Injects CarUserSwitchingDialogMediator. */
-    @Binds
-    @IntoMap
-    @ClassKey(UserSwitchTransitionViewMediator.class)
-    public abstract OverlayViewMediator bindUserSwitchTransitionViewMediator(
-            UserSwitchTransitionViewMediator userSwitchTransitionViewMediator);
-
-    /** Injects RearViewCameraViewMediator. */
-    @Binds
-    @IntoMap
-    @ClassKey(RearViewCameraViewMediator.class)
-    public abstract OverlayViewMediator bindRearViewCameraViewMediator(
-            RearViewCameraViewMediator overlayViewsMediator);
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowController.java
deleted file mode 100644
index 0e73f25..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowController.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.window;
-
-import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
-import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
-
-import android.content.Context;
-import android.graphics.PixelFormat;
-import android.os.Binder;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowInsets;
-import android.view.WindowManager;
-
-import com.android.systemui.R;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-
-import javax.inject.Inject;
-
-/**
- * Controls the expansion state of the primary window which will contain all of the fullscreen sysui
- * behavior. This window still has a collapsed state in order to watch for swipe events to expand
- * this window for the notification panel.
- */
-@SysUISingleton
-public class SystemUIOverlayWindowController implements
-        ConfigurationController.ConfigurationListener {
-
-    private final Context mContext;
-    private final WindowManager mWindowManager;
-
-    private ViewGroup mBaseLayout;
-    private WindowManager.LayoutParams mLp;
-    private WindowManager.LayoutParams mLpChanged;
-    private boolean mIsAttached = false;
-    private boolean mVisible = false;
-    private boolean mFocusable = false;
-    private boolean mUsingStableInsets = false;
-
-    @Inject
-    public SystemUIOverlayWindowController(
-            Context context,
-            WindowManager windowManager,
-            ConfigurationController configurationController
-    ) {
-        mContext = context;
-        mWindowManager = windowManager;
-
-        mLpChanged = new WindowManager.LayoutParams();
-        mBaseLayout = (ViewGroup) LayoutInflater.from(context)
-                .inflate(R.layout.sysui_overlay_window, /* root= */ null, false);
-
-        configurationController.addCallback(this);
-    }
-
-    /** Returns the base view of the primary window. */
-    public ViewGroup getBaseLayout() {
-        return mBaseLayout;
-    }
-
-    /** Returns {@code true} if the window is already attached. */
-    public boolean isAttached() {
-        return mIsAttached;
-    }
-
-    /** Attaches the window to the window manager. */
-    public void attach() {
-        if (mIsAttached) {
-            return;
-        }
-        mIsAttached = true;
-        // Now that the status bar window encompasses the sliding panel and its
-        // translucent backdrop, the entire thing is made TRANSLUCENT and is
-        // hardware-accelerated.
-        mLp = new WindowManager.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE,
-                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                        | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
-                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
-                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
-                        | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
-                PixelFormat.TRANSLUCENT);
-        mLp.token = new Binder();
-        mLp.gravity = Gravity.TOP;
-        mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
-        mLp.setTitle("SystemUIOverlayWindow");
-        mLp.packageName = mContext.getPackageName();
-        mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
-        mLp.insetsFlags.behavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
-
-        mWindowManager.addView(mBaseLayout, mLp);
-        mLpChanged.copyFrom(mLp);
-        setWindowVisible(false);
-    }
-
-    /** Sets the types of insets to fit. Note: This should be rarely used. */
-    public void setFitInsetsTypes(@WindowInsets.Type.InsetsType int types) {
-        mLpChanged.setFitInsetsTypes(types);
-        mLpChanged.setFitInsetsIgnoringVisibility(mUsingStableInsets);
-        updateWindow();
-    }
-
-    /** Sets the sides of system bar insets to fit. Note: This should be rarely used. */
-    public void setFitInsetsSides(@WindowInsets.Side.InsetsSide int sides) {
-        mLpChanged.setFitInsetsSides(sides);
-        mLpChanged.setFitInsetsIgnoringVisibility(mUsingStableInsets);
-        updateWindow();
-    }
-
-    /** Sets the window to the visible state. */
-    public void setWindowVisible(boolean visible) {
-        mVisible = visible;
-        if (visible) {
-            mBaseLayout.setVisibility(View.VISIBLE);
-        } else {
-            mBaseLayout.setVisibility(View.INVISIBLE);
-        }
-        updateWindow();
-    }
-
-    /** Sets the window to be focusable. */
-    public void setWindowFocusable(boolean focusable) {
-        mFocusable = focusable;
-        if (focusable) {
-            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
-        } else {
-            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
-        }
-        updateWindow();
-    }
-
-    /** Sets the window to enable IME. */
-    public void setWindowNeedsInput(boolean needsInput) {
-        if (needsInput) {
-            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
-        } else {
-            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
-        }
-        updateWindow();
-    }
-
-    /** Returns {@code true} if the window is visible */
-    public boolean isWindowVisible() {
-        return mVisible;
-    }
-
-    public boolean isWindowFocusable() {
-        return mFocusable;
-    }
-
-    protected void setUsingStableInsets(boolean useStableInsets) {
-        mUsingStableInsets = useStableInsets;
-    }
-
-    private void updateWindow() {
-        if (mLp != null && mLp.copyFrom(mLpChanged) != 0) {
-            if (isAttached()) {
-                mLp.insetsFlags.behavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
-                mWindowManager.updateViewLayout(mBaseLayout, mLp);
-            }
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java b/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java
deleted file mode 100644
index 6395ebf..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.window;
-
-import android.content.Context;
-import android.util.Log;
-
-import com.android.systemui.R;
-import com.android.systemui.SystemUI;
-import com.android.systemui.dagger.SysUISingleton;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Map;
-
-import javax.inject.Inject;
-import javax.inject.Provider;
-
-/**
- * Registers {@link OverlayViewMediator}(s) and synchronizes their calls to hide/show {@link
- * OverlayViewController}(s) to allow for the correct visibility of system bars.
- */
-@SysUISingleton
-public class SystemUIOverlayWindowManager extends SystemUI {
-    private static final String TAG = "SystemUIOverlayWM";
-    private final Map<Class<?>, Provider<OverlayViewMediator>>
-            mContentMediatorCreators;
-    private final OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-
-    @Inject
-    public SystemUIOverlayWindowManager(
-            Context context,
-            Map<Class<?>, Provider<OverlayViewMediator>> contentMediatorCreators,
-            OverlayViewGlobalStateController overlayViewGlobalStateController) {
-        super(context);
-        mContentMediatorCreators = contentMediatorCreators;
-        mOverlayViewGlobalStateController = overlayViewGlobalStateController;
-    }
-
-    @Override
-    public void start() {
-        String[] names = mContext.getResources().getStringArray(
-                R.array.config_carSystemUIOverlayViewsMediators);
-        startServices(names);
-    }
-
-    private void startServices(String[] services) {
-        for (String clsName : services) {
-            long ti = System.currentTimeMillis();
-            try {
-                OverlayViewMediator obj = resolveContentMediator(clsName);
-                if (obj == null) {
-                    Constructor constructor = Class.forName(clsName).getConstructor(Context.class);
-                    obj = (OverlayViewMediator) constructor.newInstance(this);
-                }
-                mOverlayViewGlobalStateController.registerMediator(obj);
-            } catch (ClassNotFoundException
-                    | NoSuchMethodException
-                    | IllegalAccessException
-                    | InstantiationException
-                    | InvocationTargetException ex) {
-                throw new RuntimeException(ex);
-            }
-
-            // Warn if initialization of component takes too long
-            ti = System.currentTimeMillis() - ti;
-            if (ti > 200) {
-                Log.w(TAG, "Initialization of " + clsName + " took " + ti + " ms");
-            }
-        }
-    }
-
-    private OverlayViewMediator resolveContentMediator(String className) {
-        return resolve(className, mContentMediatorCreators);
-    }
-
-    private <T> T resolve(String className, Map<Class<?>, Provider<T>> creators) {
-        try {
-            Class<?> clazz = Class.forName(className);
-            Provider<T> provider = creators.get(clazz);
-            return provider == null ? null : provider.get();
-        } catch (ClassNotFoundException e) {
-            return null;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/wm/BarControlPolicy.java b/packages/CarSystemUI/src/com/android/systemui/wm/BarControlPolicy.java
deleted file mode 100644
index 0452b83..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/wm/BarControlPolicy.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.wm;
-
-import android.car.settings.CarSettings;
-import android.content.Context;
-import android.database.ContentObserver;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.util.ArraySet;
-import android.util.Slog;
-import android.view.WindowInsets;
-
-import androidx.annotation.VisibleForTesting;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-/**
- * Util class to load PolicyControl and allow for querying if a package matches immersive filters.
- * Similar to {@link com.android.server.wm.PolicyControl}, but separate due to CarSystemUI needing
- * to set its own policies for system bar visibilities.
- *
- * This forces immersive mode behavior for one or both system bars (based on a package
- * list).
- *
- * Control by setting {@link Settings.Global#POLICY_CONTROL_AUTO} to one or more name-value pairs.
- * e.g.
- *   to force immersive mode everywhere:
- *     "immersive.full=*"
- *   to force hide status bars for com.package1 but not com.package2:
- *     "immersive.status=com.package1,-com.package2"
- *
- * Separate multiple name-value pairs with ':'
- *   e.g. "immersive.status=com.package:immersive.navigation=*"
- */
-public class BarControlPolicy {
-
-    private static final String TAG = "BarControlPolicy";
-    private static final boolean DEBUG = false;
-
-    private static final String NAME_IMMERSIVE_FULL = "immersive.full";
-    private static final String NAME_IMMERSIVE_STATUS = "immersive.status";
-    private static final String NAME_IMMERSIVE_NAVIGATION = "immersive.navigation";
-
-    @VisibleForTesting
-    static String sSettingValue;
-    @VisibleForTesting
-    static Filter sImmersiveStatusFilter;
-    private static Filter sImmersiveNavigationFilter;
-
-    /** Loads values from the POLICY_CONTROL setting to set filters. */
-    static boolean reloadFromSetting(Context context) {
-        if (DEBUG) Slog.d(TAG, "reloadFromSetting()");
-        String value = null;
-        try {
-            value = Settings.Global.getStringForUser(context.getContentResolver(),
-                    CarSettings.Global.SYSTEM_BAR_VISIBILITY_OVERRIDE,
-                    UserHandle.USER_CURRENT);
-            if (sSettingValue == value || sSettingValue != null && sSettingValue.equals(value)) {
-                return false;
-            }
-            setFilters(value);
-            sSettingValue = value;
-        } catch (Throwable t) {
-            Slog.w(TAG, "Error loading policy control, value=" + value, t);
-            return false;
-        }
-        return true;
-    }
-
-    /** Used in testing to reset BarControlPolicy. */
-    @VisibleForTesting
-    static void reset() {
-        sSettingValue = null;
-        sImmersiveStatusFilter = null;
-        sImmersiveNavigationFilter = null;
-    }
-
-    /**
-     * Registers a content observer to listen to updates to the SYSTEM_BAR_VISIBILITY_OVERRIDE flag.
-     */
-    static void registerContentObserver(Context context, Handler handler, FilterListener listener) {
-        context.getContentResolver().registerContentObserver(
-                Settings.Global.getUriFor(CarSettings.Global.SYSTEM_BAR_VISIBILITY_OVERRIDE), false,
-                new ContentObserver(handler) {
-                    @Override
-                    public void onChange(boolean selfChange) {
-                        if (reloadFromSetting(context)) {
-                            listener.onFilterUpdated();
-                        }
-                    }
-                }, UserHandle.USER_ALL);
-    }
-
-    /**
-     * Returns bar visibilities based on POLICY_CONTROL_AUTO filters and window policies.
-     * @return int[], where the first value is the inset types that should be shown, and the second
-     *         is the inset types that should be hidden.
-     */
-    @WindowInsets.Type.InsetsType
-    static int[] getBarVisibilities(String packageName) {
-        int hideTypes = 0;
-        int showTypes = 0;
-        if (matchesStatusFilter(packageName)) {
-            hideTypes |= WindowInsets.Type.statusBars();
-        } else {
-            showTypes |= WindowInsets.Type.statusBars();
-        }
-        if (matchesNavigationFilter(packageName)) {
-            hideTypes |= WindowInsets.Type.navigationBars();
-        } else {
-            showTypes |= WindowInsets.Type.navigationBars();
-        }
-
-        return new int[] {showTypes, hideTypes};
-    }
-
-    private static boolean matchesStatusFilter(String packageName) {
-        return sImmersiveStatusFilter != null && sImmersiveStatusFilter.matches(packageName);
-    }
-
-    private static boolean matchesNavigationFilter(String packageName) {
-        return sImmersiveNavigationFilter != null
-                && sImmersiveNavigationFilter.matches(packageName);
-    }
-
-    private static void setFilters(String value) {
-        if (DEBUG) Slog.d(TAG, "setFilters: " + value);
-        sImmersiveStatusFilter = null;
-        sImmersiveNavigationFilter = null;
-        if (value != null) {
-            String[] nvps = value.split(":");
-            for (String nvp : nvps) {
-                int i = nvp.indexOf('=');
-                if (i == -1) continue;
-                String n = nvp.substring(0, i);
-                String v = nvp.substring(i + 1);
-                if (n.equals(NAME_IMMERSIVE_FULL)) {
-                    Filter f = Filter.parse(v);
-                    sImmersiveStatusFilter = sImmersiveNavigationFilter = f;
-                } else if (n.equals(NAME_IMMERSIVE_STATUS)) {
-                    Filter f = Filter.parse(v);
-                    sImmersiveStatusFilter = f;
-                } else if (n.equals(NAME_IMMERSIVE_NAVIGATION)) {
-                    Filter f = Filter.parse(v);
-                    sImmersiveNavigationFilter = f;
-                }
-            }
-        }
-        if (DEBUG) {
-            Slog.d(TAG, "immersiveStatusFilter: " + sImmersiveStatusFilter);
-            Slog.d(TAG, "immersiveNavigationFilter: " + sImmersiveNavigationFilter);
-        }
-    }
-
-    private static class Filter {
-        private static final String ALL = "*";
-
-        private final ArraySet<String> mToInclude;
-        private final ArraySet<String> mToExclude;
-
-        private Filter(ArraySet<String> toInclude, ArraySet<String> toExclude) {
-            mToInclude = toInclude;
-            mToExclude = toExclude;
-        }
-
-        boolean matches(String packageName) {
-            if (packageName == null) return false;
-            if (toExclude(packageName)) return false;
-            return toInclude(packageName);
-        }
-
-        private boolean toExclude(String packageName) {
-            return mToExclude.contains(packageName) || mToExclude.contains(ALL);
-        }
-
-        private boolean toInclude(String packageName) {
-            return mToInclude.contains(ALL) || mToInclude.contains(packageName);
-        }
-
-        void dump(PrintWriter pw) {
-            pw.print("Filter[");
-            dump("toInclude", mToInclude, pw); pw.print(',');
-            dump("toExclude", mToExclude, pw); pw.print(']');
-        }
-
-        private void dump(String name, ArraySet<String> set, PrintWriter pw) {
-            pw.print(name); pw.print("=(");
-            int n = set.size();
-            for (int i = 0; i < n; i++) {
-                if (i > 0) pw.print(',');
-                pw.print(set.valueAt(i));
-            }
-            pw.print(')');
-        }
-
-        @Override
-        public String toString() {
-            StringWriter sw = new StringWriter();
-            dump(new PrintWriter(sw, true));
-            return sw.toString();
-        }
-
-        // value = comma-delimited list of tokens, where token = (package name|*)
-        // e.g. "com.package1", or "com.android.systemui, com.android.keyguard" or "*"
-        static Filter parse(String value) {
-            if (value == null) return null;
-            ArraySet<String> toInclude = new ArraySet<String>();
-            ArraySet<String> toExclude = new ArraySet<String>();
-            for (String token : value.split(",")) {
-                token = token.trim();
-                if (token.startsWith("-") && token.length() > 1) {
-                    token = token.substring(1);
-                    toExclude.add(token);
-                } else {
-                    toInclude.add(token);
-                }
-            }
-            return new Filter(toInclude, toExclude);
-        }
-    }
-
-    /**
-     * Interface to listen for updates to the filter triggered by the content observer listening to
-     * the SYSTEM_BAR_VISIBILITY_OVERRIDE flag.
-     */
-    interface FilterListener {
-
-        /** Callback triggered when the content observer updates the filter. */
-        void onFilterUpdated();
-    }
-
-    private BarControlPolicy() {}
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java
deleted file mode 100644
index f2ca495..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.wm;
-
-import android.content.Context;
-import android.os.Handler;
-import android.os.RemoteException;
-import android.util.ArraySet;
-import android.util.Slog;
-import android.util.SparseArray;
-import android.view.IDisplayWindowInsetsController;
-import android.view.IWindowManager;
-import android.view.InsetsController;
-import android.view.InsetsSourceControl;
-import android.view.InsetsState;
-import android.view.WindowInsets;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.wm.shell.common.DisplayController;
-import com.android.wm.shell.common.DisplayImeController;
-import com.android.wm.shell.common.TransactionPool;
-
-import java.util.Objects;
-
-/**
- * Controller that maps between displays and {@link IDisplayWindowInsetsController} in order to
- * give system bar control to SystemUI.
- * {@link R.bool#config_remoteInsetsControllerControlsSystemBars} determines whether this controller
- * takes control or not.
- */
-public class DisplaySystemBarsController extends DisplayImeController {
-
-    private static final String TAG = "DisplaySystemBarsController";
-
-    private final Context mContext;
-    private final DisplayController mDisplayController;
-    private final Handler mHandler;
-    private SparseArray<PerDisplay> mPerDisplaySparseArray;
-
-    public DisplaySystemBarsController(
-            Context context,
-            IWindowManager wmService,
-            DisplayController displayController,
-            @Main Handler mainHandler,
-            TransactionPool transactionPool) {
-        super(wmService, displayController, (r) -> mainHandler.post(r), transactionPool);
-        mContext = context;
-        mDisplayController = displayController;
-        mHandler = mainHandler;
-    }
-
-    @Override
-    public void onDisplayAdded(int displayId) {
-        PerDisplay pd = new PerDisplay(displayId);
-        try {
-            mWmService.setDisplayWindowInsetsController(displayId, pd);
-        } catch (RemoteException e) {
-            Slog.w(TAG, "Unable to set insets controller on display " + displayId);
-        }
-        // Lazy loading policy control filters instead of during boot.
-        if (mPerDisplaySparseArray == null) {
-            mPerDisplaySparseArray = new SparseArray<>();
-            BarControlPolicy.reloadFromSetting(mContext);
-            BarControlPolicy.registerContentObserver(mContext, mHandler, () -> {
-                int size = mPerDisplaySparseArray.size();
-                for (int i = 0; i < size; i++) {
-                    mPerDisplaySparseArray.valueAt(i).modifyDisplayWindowInsets();
-                }
-            });
-        }
-        mPerDisplaySparseArray.put(displayId, pd);
-    }
-
-    @Override
-    public void onDisplayRemoved(int displayId) {
-        try {
-            mWmService.setDisplayWindowInsetsController(displayId, null);
-        } catch (RemoteException e) {
-            Slog.w(TAG, "Unable to remove insets controller on display " + displayId);
-        }
-        mPerDisplaySparseArray.remove(displayId);
-    }
-
-    @VisibleForTesting
-    class PerDisplay extends DisplayImeController.PerDisplay {
-
-        int mDisplayId;
-        InsetsController mInsetsController;
-        InsetsState mInsetsState = new InsetsState();
-        String mPackageName;
-
-        PerDisplay(int displayId) {
-            super(displayId, mDisplayController.getDisplayLayout(displayId).rotation());
-            mDisplayId = displayId;
-            mInsetsController = new InsetsController(
-                    new DisplaySystemBarsInsetsControllerHost(mHandler, this));
-        }
-
-        @Override
-        public void insetsChanged(InsetsState insetsState) {
-            super.insetsChanged(insetsState);
-            if (mInsetsState.equals(insetsState)) {
-                return;
-            }
-            mInsetsState.set(insetsState, true /* copySources */);
-            mInsetsController.onStateChanged(insetsState);
-            if (mPackageName != null) {
-                modifyDisplayWindowInsets();
-            }
-        }
-
-        @Override
-        public void insetsControlChanged(InsetsState insetsState,
-                InsetsSourceControl[] activeControls) {
-            super.insetsControlChanged(insetsState, activeControls);
-            mInsetsController.onControlsChanged(activeControls);
-        }
-
-        @Override
-        public void hideInsets(@WindowInsets.Type.InsetsType int types, boolean fromIme) {
-            if ((types & WindowInsets.Type.ime()) == 0) {
-                mInsetsController.hide(types);
-            } else {
-                super.hideInsets(types, fromIme);
-            }
-
-        }
-
-        @Override
-        public void showInsets(@WindowInsets.Type.InsetsType int types, boolean fromIme) {
-            if ((types & WindowInsets.Type.ime()) == 0) {
-                mInsetsController.show(types);
-            } else {
-                super.showInsets(types, fromIme);
-            }
-
-        }
-
-        @Override
-        public void topFocusedWindowChanged(String packageName) {
-            if (Objects.equals(mPackageName, packageName)) {
-                return;
-            }
-            mPackageName = packageName;
-            modifyDisplayWindowInsets();
-        }
-
-        private void modifyDisplayWindowInsets() {
-            if (mPackageName == null) {
-                return;
-            }
-            int[] barVisibilities = BarControlPolicy.getBarVisibilities(mPackageName);
-            updateInsetsState(barVisibilities[0], /* visible= */ true);
-            updateInsetsState(barVisibilities[1], /* visible= */ false);
-            showInsets(barVisibilities[0], /* fromIme= */ false);
-            hideInsets(barVisibilities[1], /* fromIme= */ false);
-            try {
-                mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState);
-            } catch (RemoteException e) {
-                Slog.w(TAG, "Unable to update window manager service.");
-            }
-        }
-
-        private void updateInsetsState(@WindowInsets.Type.InsetsType int types, boolean visible) {
-            ArraySet<Integer> internalTypes = InsetsState.toInternalType(types);
-            for (int i = internalTypes.size() - 1; i >= 0; i--) {
-                mInsetsState.getSource(internalTypes.valueAt(i)).setVisible(visible);
-            }
-        }
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsInsetsControllerHost.java b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsInsetsControllerHost.java
deleted file mode 100644
index 2f8da44..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsInsetsControllerHost.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.wm;
-
-import android.annotation.NonNull;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-import android.view.IDisplayWindowInsetsController;
-import android.view.InsetsController;
-import android.view.InsetsState;
-import android.view.SurfaceControl;
-import android.view.SyncRtSurfaceTransactionApplier;
-import android.view.WindowInsets;
-import android.view.WindowInsetsAnimation;
-import android.view.WindowInsetsController;
-import android.view.inputmethod.InputMethodManager;
-
-import java.util.List;
-
-/**
- * Implements {@link InsetsController.Host} for usage by
- * {@link DisplaySystemBarsController.PerDisplay} instances in {@link DisplaySystemBarsController}.
- * @hide
- */
-public class DisplaySystemBarsInsetsControllerHost implements InsetsController.Host {
-
-    private static final String TAG = DisplaySystemBarsInsetsControllerHost.class.getSimpleName();
-
-    private final Handler mHandler;
-    private final IDisplayWindowInsetsController mController;
-    private final float[] mTmpFloat9 = new float[9];
-
-    public DisplaySystemBarsInsetsControllerHost(
-            Handler handler, IDisplayWindowInsetsController controller) {
-        mHandler = handler;
-        mController = controller;
-    }
-
-    @Override
-    public Handler getHandler() {
-        return mHandler;
-    }
-
-    @Override
-    public void notifyInsetsChanged() {
-        // no-op
-    }
-
-    @Override
-    public void dispatchWindowInsetsAnimationPrepare(@NonNull WindowInsetsAnimation animation) {
-        // no-op
-    }
-
-    @Override
-    public WindowInsetsAnimation.Bounds dispatchWindowInsetsAnimationStart(
-            @NonNull WindowInsetsAnimation animation,
-            @NonNull WindowInsetsAnimation.Bounds bounds) {
-        return null;
-    }
-
-    @Override
-    public WindowInsets dispatchWindowInsetsAnimationProgress(@NonNull WindowInsets insets,
-            @NonNull List<WindowInsetsAnimation> runningAnimations) {
-        return null;
-    }
-
-    @Override
-    public void dispatchWindowInsetsAnimationEnd(@NonNull WindowInsetsAnimation animation) {
-        // no-op
-    }
-
-    @Override
-    public void applySurfaceParams(final SyncRtSurfaceTransactionApplier.SurfaceParams... params) {
-        for (int i = params.length - 1; i >= 0; i--) {
-            SyncRtSurfaceTransactionApplier.applyParams(
-                    new SurfaceControl.Transaction(), params[i], mTmpFloat9);
-        }
-
-    }
-
-    @Override
-    public void updateCompatSysUiVisibility(
-            @InsetsState.InternalInsetsType int type, boolean visible, boolean hasControl) {
-        // no-op
-    }
-
-    @Override
-    public void onInsetsModified(InsetsState insetsState) {
-        try {
-            mController.insetsChanged(insetsState);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Failed to send insets to controller");
-        }
-    }
-
-    @Override
-    public boolean hasAnimationCallbacks() {
-        return false;
-    }
-
-    @Override
-    public void setSystemBarsAppearance(
-            @WindowInsetsController.Appearance int appearance,
-            @WindowInsetsController.Appearance int mask) {
-        // no-op
-    }
-
-    @Override
-    public @WindowInsetsController.Appearance int getSystemBarsAppearance() {
-        return 0;
-    }
-
-    @Override
-    public void setSystemBarsBehavior(@WindowInsetsController.Behavior int behavior) {
-        // no-op
-    }
-
-    @Override
-    public @WindowInsetsController.Behavior int getSystemBarsBehavior() {
-        return 0;
-    }
-
-    @Override
-    public void releaseSurfaceControlFromRt(SurfaceControl surfaceControl) {
-        surfaceControl.release();
-    }
-
-    @Override
-    public void addOnPreDrawRunnable(Runnable r) {
-        mHandler.post(r);
-    }
-
-    @Override
-    public void postInsetsAnimationCallback(Runnable r) {
-        mHandler.post(r);
-    }
-
-    @Override
-    public InputMethodManager getInputMethodManager() {
-        return null;
-    }
-
-    @Override
-    public String getRootViewTitle() {
-        return null;
-    }
-
-    @Override
-    public int dipToPx(int dips) {
-        return 0;
-    }
-
-    @Override
-    public IBinder getWindowToken() {
-        return null;
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMComponent.java b/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMComponent.java
deleted file mode 100644
index c6a7fd2..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMComponent.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.wmshell;
-
-import com.android.systemui.dagger.WMComponent;
-import com.android.systemui.dagger.WMSingleton;
-
-import dagger.Subcomponent;
-
-
-/**
- * Dagger Subcomponent for WindowManager.
- */
-@WMSingleton
-@Subcomponent(modules = {CarWMShellModule.class})
-public interface CarWMComponent extends WMComponent {
-
-    /**
-     * Builder for a SysUIComponent.
-     */
-    @Subcomponent.Builder
-    interface Builder extends WMComponent.Builder {
-        CarWMComponent build();
-    }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java b/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java
deleted file mode 100644
index 27aabff..0000000
--- a/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.wmshell;
-
-import android.content.Context;
-import android.os.Handler;
-import android.view.IWindowManager;
-
-import com.android.systemui.dagger.WMSingleton;
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.wm.DisplaySystemBarsController;
-import com.android.wm.shell.common.DisplayController;
-import com.android.wm.shell.common.DisplayImeController;
-import com.android.wm.shell.common.TransactionPool;
-import com.android.wm.shell.pip.Pip;
-
-import dagger.BindsOptionalOf;
-import dagger.Module;
-import dagger.Provides;
-
-/** Provides dependencies from {@link com.android.wm.shell} for CarSystemUI. */
-@Module(includes = WMShellBaseModule.class)
-public abstract class CarWMShellModule {
-    @WMSingleton
-    @Provides
-    static DisplayImeController provideDisplayImeController(Context context,
-            IWindowManager wmService, DisplayController displayController,
-            @Main Handler mainHandler, TransactionPool transactionPool) {
-        return new DisplaySystemBarsController(context, wmService, displayController,
-                mainHandler, transactionPool);
-    }
-
-    @BindsOptionalOf
-    abstract Pip optionalPip();
-}
diff --git a/packages/CarSystemUI/tests/Android.mk b/packages/CarSystemUI/tests/Android.mk
deleted file mode 100644
index 1366568..0000000
--- a/packages/CarSystemUI/tests/Android.mk
+++ /dev/null
@@ -1,88 +0,0 @@
-# Copyright (C) 2019 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_JACK_FLAGS := --multi-dex native
-LOCAL_DX_FLAGS := --multi-dex
-
-LOCAL_PACKAGE_NAME := CarSystemUITests
-LOCAL_PRIVATE_PLATFORM_APIS := true
-LOCAL_COMPATIBILITY_SUITE := device-tests
-
-LOCAL_STATIC_ANDROID_LIBRARIES := \
-    CarSystemUI-tests
-
-LOCAL_MULTILIB := both
-
-LOCAL_JNI_SHARED_LIBRARIES := \
-    libdexmakerjvmtiagent \
-    libmultiplejvmtiagentsinterferenceagent
-
-LOCAL_JAVA_LIBRARIES := \
-    android.test.runner \
-    telephony-common \
-    android.test.base \
-
-LOCAL_AAPT_FLAGS := --extra-packages com.android.systemui
-
-# sign this with platform cert, so this test is allowed to inject key events into
-# UI it doesn't own. This is necessary to allow screenshots to be taken
-LOCAL_CERTIFICATE := platform
-
-# Provide jack a list of classes to exclude from code coverage.
-# This is needed because the CarSystemUITests compile CarSystemUI source directly, rather than using
-# LOCAL_INSTRUMENTATION_FOR := CarSystemUI.
-#
-# We want to exclude the test classes from code coverage measurements, but they share the same
-# package as the rest of SystemUI so they can't be easily filtered by package name.
-#
-# Generate a comma separated list of patterns based on the test source files under src/
-# SystemUI classes are in ../src/ so they won't be excluded.
-# Example:
-#   Input files: src/com/android/systemui/Test.java src/com/android/systemui/AnotherTest.java
-#   Generated exclude list: com.android.systemui.Test*,com.android.systemui.AnotherTest*
-
-# Filter all src files under src/ to just java files
-local_java_files := $(filter %.java,$(call all-java-files-under, src))
-
-# Transform java file names into full class names.
-# This only works if the class name matches the file name and the directory structure
-# matches the package.
-local_classes := $(subst /,.,$(patsubst src/%.java,%,$(local_java_files)))
-local_comma := ,
-local_empty :=
-local_space := $(local_empty) $(local_empty)
-
-# Convert class name list to jacoco exclude list
-# This appends a * to all classes and replace the space separators with commas.
-jacoco_exclude := $(subst $(space),$(comma),$(patsubst %,%*,$(local_classes)))
-
-LOCAL_JACK_COVERAGE_INCLUDE_FILTER := com.android.systemui.*,com.android.keyguard.*
-LOCAL_JACK_COVERAGE_EXCLUDE_FILTER := $(jacoco_exclude)
-
-ifeq ($(EXCLUDE_SYSTEMUI_TESTS),)
-    include $(BUILD_PACKAGE)
-endif
-
-# Reset variables
-local_java_files :=
-local_classes :=
-local_comma :=
-local_space :=
-jacoco_exclude :=
diff --git a/packages/CarSystemUI/tests/AndroidManifest.xml b/packages/CarSystemUI/tests/AndroidManifest.xml
deleted file mode 100644
index a74bb56..0000000
--- a/packages/CarSystemUI/tests/AndroidManifest.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
-          android:sharedUserId="android.uid.system"
-          package="com.android.systemui.tests">
-
-    <application android:debuggable="true" android:largeHeap="true">
-        <uses-library android:name="android.test.runner" />
-
-        <provider
-            android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
-            tools:replace="android:authorities"
-            android:authorities="${applicationId}.lifecycle-tests"
-            android:exported="false"
-            android:enabled="false"
-            android:multiprocess="true" />
-    </application>
-
-    <instrumentation android:name="android.testing.TestableInstrumentation"
-        android:targetPackage="com.android.systemui.tests"
-        android:label="Tests for CarSystemUI">
-    </instrumentation>
-</manifest>
diff --git a/packages/CarSystemUI/tests/AndroidTest.xml b/packages/CarSystemUI/tests/AndroidTest.xml
deleted file mode 100644
index 8685632..0000000
--- a/packages/CarSystemUI/tests/AndroidTest.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<configuration description="Runs Tests for CarSystemUI.">
-    <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
-        <option name="test-file-name" value="CarSystemUITests.apk" />
-    </target_preparer>
-
-    <option name="test-suite-tag" value="apct" />
-    <option name="test-suite-tag" value="framework-base-presubmit" />
-    <option name="test-tag" value="CarSystemUITests" />
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="com.android.systemui.tests" />
-        <option name="runner" value="android.testing.TestableInstrumentation" />
-        <option name="hidden-api-checks" value="false"/>
-    </test>
-</configuration>
diff --git a/packages/CarSystemUI/tests/res/layout/button_role_holder_controller_test.xml b/packages/CarSystemUI/tests/res/layout/button_role_holder_controller_test.xml
deleted file mode 100644
index 25ec2c1..0000000
--- a/packages/CarSystemUI/tests/res/layout/button_role_holder_controller_test.xml
+++ /dev/null
@@ -1,41 +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.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:id="@id/nav_buttons"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_weight="1"
-    android:paddingStart="20dp"
-    android:paddingEnd="20dp"
-    android:gravity="center">
-
-    <com.android.systemui.car.navigationbar.AssitantButton
-        android:id="@+id/assistant_role_button"
-        style="@style/NavigationBarButton"
-        systemui:icon="@drawable/car_ic_overview"
-        systemui:useDefaultAppIconForRole="true"
-    />
-
-    <com.android.systemui.car.navigationbar.AssitantButton
-        android:id="@+id/assistant_role_disabled_button"
-        style="@style/NavigationBarButton"
-        systemui:icon="@drawable/car_ic_overview"
-    />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/CarSystemUI/tests/res/layout/car_button_selection_state_controller_test.xml b/packages/CarSystemUI/tests/res/layout/car_button_selection_state_controller_test.xml
deleted file mode 100644
index a8e83d6..0000000
--- a/packages/CarSystemUI/tests/res/layout/car_button_selection_state_controller_test.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:id="@id/nav_buttons"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_weight="1"
-    android:paddingStart="20dp"
-    android:paddingEnd="20dp"
-    android:gravity="center">
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/detectable_by_component_name"
-        style="@style/NavigationBarButton"
-        systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
-        systemui:icon="@drawable/car_ic_overview"
-        systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-        systemui:highlightWhenSelected="true"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/detectable_by_category"
-        style="@style/NavigationBarButton"
-        systemui:categories="android.intent.category.APP_MAPS"
-        systemui:icon="@drawable/car_ic_navigation"
-        systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_MAPS;launchFlags=0x14000000;end"
-        systemui:highlightWhenSelected="true"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/detectable_by_package"
-        style="@style/NavigationBarButton"
-        systemui:icon="@drawable/car_ic_phone"
-        systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;package=com.android.car.dialer;launchFlags=0x10000000;end"
-        systemui:packages="com.android.car.dialer"
-        systemui:highlightWhenSelected="true"
-    />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/CarSystemUI/tests/res/layout/car_navigation_bar_view_test.xml b/packages/CarSystemUI/tests/res/layout/car_navigation_bar_view_test.xml
deleted file mode 100644
index 94edc4b..0000000
--- a/packages/CarSystemUI/tests/res/layout/car_navigation_bar_view_test.xml
+++ /dev/null
@@ -1,58 +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.
-  -->
-
-<com.android.systemui.car.navigationbar.CarNavigationBarView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@drawable/system_bar_background"
-    android:orientation="vertical">
-    <!--The 20dp padding is the difference between the background selected icon size and the ripple
-        that was chosen, thus it's a hack to make it look pretty and not an official margin value-->
-    <LinearLayout
-        android:id="@id/nav_buttons"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:paddingStart="20dp"
-        android:paddingEnd="20dp"
-        android:gravity="center">
-
-        <com.android.systemui.car.navigationbar.CarNavigationButton
-            android:id="@+id/home"
-            style="@style/NavigationBarButton"
-            systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
-            systemui:icon="@drawable/car_ic_overview"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-            systemui:selectedIcon="@drawable/car_ic_overview_selected"
-            systemui:highlightWhenSelected="true"
-        />
-
-    </LinearLayout>
-
-    <LinearLayout
-        android:id="@+id/lock_screen_nav_buttons"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:paddingStart="@dimen/car_keyline_1"
-        android:paddingEnd="@dimen/car_keyline_1"
-        android:gravity="center"
-        android:visibility="gone"
-    />
-
-</com.android.systemui.car.navigationbar.CarNavigationBarView>
diff --git a/packages/CarSystemUI/tests/res/layout/car_navigation_button_test.xml b/packages/CarSystemUI/tests/res/layout/car_navigation_button_test.xml
deleted file mode 100644
index 44f8340..0000000
--- a/packages/CarSystemUI/tests/res/layout/car_navigation_button_test.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:id="@id/nav_buttons"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_weight="1"
-    android:paddingStart="20dp"
-    android:paddingEnd="20dp"
-    android:gravity="center">
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/default_no_selection_state"
-        style="@style/NavigationBarButton"
-        systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
-        systemui:icon="@drawable/car_ic_overview"
-        systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-        systemui:selectedIcon="@drawable/car_ic_overview_selected"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/app_grid_activity"
-        style="@style/NavigationBarButton"
-        systemui:componentNames="com.android.car.carlauncher/.AppGridActivity"
-        systemui:icon="@drawable/car_ic_apps"
-        systemui:intent="intent:#Intent;component=com.android.car.carlauncher/.AppGridActivity;launchFlags=0x24000000;end"
-        systemui:selectedIcon="@drawable/car_ic_apps_selected"
-        systemui:highlightWhenSelected="true"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/long_click_app_grid_activity"
-        style="@style/NavigationBarButton"
-        systemui:componentNames="com.android.car.carlauncher/.AppGridActivity"
-        systemui:icon="@drawable/car_ic_apps"
-        systemui:longIntent="intent:#Intent;component=com.android.car.carlauncher/.AppGridActivity;launchFlags=0x24000000;end"
-        systemui:selectedIcon="@drawable/car_ic_apps_selected"
-        systemui:highlightWhenSelected="true"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/broadcast"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="@null"
-        systemui:broadcast="true"
-        systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/selected_icon_undefined"
-        style="@style/NavigationBarButton"
-        systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
-        systemui:icon="@drawable/car_ic_overview"
-        systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/highlightable_no_more_button"
-        style="@style/NavigationBarButton"
-        systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
-        systemui:icon="@drawable/car_ic_overview"
-        systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-        systemui:selectedIcon="@drawable/car_ic_overview_selected"
-        systemui:highlightWhenSelected="true"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/not_highlightable_more_button"
-        style="@style/NavigationBarButton"
-        systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
-        systemui:icon="@drawable/car_ic_overview"
-        systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-        systemui:selectedIcon="@drawable/car_ic_overview_selected"
-        systemui:showMoreWhenSelected="true"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/highlightable_more_button"
-        style="@style/NavigationBarButton"
-        systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
-        systemui:icon="@drawable/car_ic_overview"
-        systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-        systemui:selectedIcon="@drawable/car_ic_overview_selected"
-        systemui:highlightWhenSelected="true"
-        systemui:showMoreWhenSelected="true"
-    />
-
-    <com.android.systemui.car.navigationbar.CarNavigationButton
-        android:id="@+id/broadcast"
-        style="@style/NavigationBarButton"
-        systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
-        systemui:icon="@drawable/car_ic_overview"
-        systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
-        systemui:selectedIcon="@drawable/car_ic_overview_selected"
-        systemui:broadcast="true"
-    />
-
-    <com.android.systemui.car.navigationbar.AssitantButton
-        android:id="@+id/role_based_button"
-        style="@style/NavigationBarButton"
-        systemui:icon="@drawable/car_ic_overview"
-        systemui:selectedIcon="@drawable/car_ic_overview_selected"
-        systemui:useDefaultAppIconForRole="true"
-        systemui:highlightWhenSelected="true"
-    />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/CarSystemUI/tests/res/layout/overlay_view_controller_stub.xml b/packages/CarSystemUI/tests/res/layout/overlay_view_controller_stub.xml
deleted file mode 100644
index 5e5efe7..0000000
--- a/packages/CarSystemUI/tests/res/layout/overlay_view_controller_stub.xml
+++ /dev/null
@@ -1,22 +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.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:id="@+id/overlay_view_controller_test">
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/CarSystemUI/tests/res/layout/overlay_view_controller_test.xml b/packages/CarSystemUI/tests/res/layout/overlay_view_controller_test.xml
deleted file mode 100644
index 165193e..0000000
--- a/packages/CarSystemUI/tests/res/layout/overlay_view_controller_test.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<!-- Fullscreen views in sysui should be listed here in increasing Z order. -->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:background="@android:color/transparent"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <ViewStub android:id="@+id/overlay_view_controller_stub"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:layout="@layout/overlay_view_controller_stub"/>
-
-</FrameLayout>
\ No newline at end of file
diff --git a/packages/CarSystemUI/tests/res/layout/overlay_view_global_state_controller_test.xml b/packages/CarSystemUI/tests/res/layout/overlay_view_global_state_controller_test.xml
deleted file mode 100644
index 03fe0e4..0000000
--- a/packages/CarSystemUI/tests/res/layout/overlay_view_global_state_controller_test.xml
+++ /dev/null
@@ -1,43 +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.
-  -->
-
-<!-- Fullscreen views in sysui should be listed here in increasing Z order. -->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:background="@android:color/transparent"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <ViewStub android:id="@+id/overlay_view_controller_stub_1"
-              android:inflatedId="@+id/overlay_view_controller_1"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:layout="@layout/overlay_view_controller_stub"/>
-
-    <ViewStub android:id="@+id/overlay_view_controller_stub_2"
-              android:inflatedId="@+id/overlay_view_controller_2"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:layout="@layout/overlay_view_controller_stub"/>
-
-    <ViewStub android:id="@+id/overlay_view_controller_stub_3"
-              android:inflatedId="@+id/overlay_view_controller_3"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:layout="@layout/overlay_view_controller_stub"/>
-
-</FrameLayout>
\ No newline at end of file
diff --git a/packages/CarSystemUI/tests/res/values/config.xml b/packages/CarSystemUI/tests/res/values/config.xml
deleted file mode 100644
index 0d08ac2..0000000
--- a/packages/CarSystemUI/tests/res/values/config.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<resources>
-    <!-- Configure which system ui bars should be displayed.
-         These can be overwritten within the tests. -->
-    <bool name="config_enableLeftNavigationBar">false</bool>
-    <bool name="config_enableRightNavigationBar">false</bool>
-    <bool name="config_enableBottomNavigationBar">false</bool>
-</resources>
diff --git a/packages/CarSystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java b/packages/CarSystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
deleted file mode 100644
index 86b86d4..0000000
--- a/packages/CarSystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android;
-
-import static org.hamcrest.Matchers.empty;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
-import android.testing.AndroidTestingRunner;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.test.filters.LargeTest;
-import androidx.test.filters.MediumTest;
-import androidx.test.filters.SmallTest;
-import androidx.test.internal.runner.ClassPathScanner;
-import androidx.test.internal.runner.ClassPathScanner.ChainedClassNameFilter;
-import androidx.test.internal.runner.ClassPathScanner.ExternalClassNameFilter;
-
-import com.android.systemui.SysuiBaseFragmentTest;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarSystemUiTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.IOException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * This is named AAAPlusPlusVerifySysuiRequiredTestPropertiesTest for two reasons.
- * a) Its so awesome it deserves an AAA++
- * b) It should run first to draw attention to itself.
- *
- * For trues though: this test verifies that all the sysui tests extend the right classes.
- * This matters because including tests with different context implementations in the same
- * test suite causes errors, such as the incorrect settings provider being cached.
- * For an example, see {@link com.android.systemui.DependencyTest}.
- */
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@SmallTest
-public class AAAPlusPlusVerifySysuiRequiredTestPropertiesTest extends SysuiTestCase {
-
-    private static final String TAG = "AAA++VerifyTest";
-
-    private static final Class[] BASE_CLS_TO_INCLUDE = {
-            SysuiTestCase.class,
-            SysuiBaseFragmentTest.class,
-    };
-
-    private static final Class[] SUPPORTED_SIZES = {
-            SmallTest.class,
-            MediumTest.class,
-            LargeTest.class,
-            android.test.suitebuilder.annotation.SmallTest.class,
-            android.test.suitebuilder.annotation.MediumTest.class,
-            android.test.suitebuilder.annotation.LargeTest.class,
-    };
-
-    @Test
-    public void testAllClassInheritance() throws Throwable {
-        ArrayList<String> fails = new ArrayList<>();
-        for (String className : getClassNamesFromClassPath()) {
-            Class<?> cls = Class.forName(className, false, this.getClass().getClassLoader());
-            if (!isTestClass(cls)) continue;
-
-            boolean hasParent = false;
-            for (Class<?> parent : BASE_CLS_TO_INCLUDE) {
-                if (parent.isAssignableFrom(cls)) {
-                    hasParent = true;
-                    break;
-                }
-            }
-            boolean hasSize = hasSize(cls);
-            if (!hasSize) {
-                fails.add(cls.getName() + " does not have size annotation, such as @SmallTest");
-            }
-            if (!hasParent) {
-                fails.add(cls.getName() + " does not extend any of " + getClsStr());
-            }
-        }
-
-        assertThat("All sysui test classes must have size and extend one of " + getClsStr(),
-                fails, is(empty()));
-    }
-
-    private boolean hasSize(Class<?> cls) {
-        for (int i = 0; i < SUPPORTED_SIZES.length; i++) {
-            if (cls.getDeclaredAnnotation(SUPPORTED_SIZES[i]) != null) return true;
-        }
-        return false;
-    }
-
-    private Collection<String> getClassNamesFromClassPath() {
-        ClassPathScanner scanner = new ClassPathScanner(mContext.getPackageCodePath());
-
-        ChainedClassNameFilter filter = new ChainedClassNameFilter();
-
-        filter.add(new ExternalClassNameFilter());
-        filter.add(s -> s.startsWith("com.android.systemui")
-                || s.startsWith("com.android.keyguard"));
-
-        try {
-            return scanner.getClassPathEntries(filter);
-        } catch (IOException e) {
-            Log.e(TAG, "Failed to scan classes", e);
-        }
-        return Collections.emptyList();
-    }
-
-    private String getClsStr() {
-        return TextUtils.join(",", Arrays.asList(BASE_CLS_TO_INCLUDE)
-                .stream().map(cls -> cls.getSimpleName()).toArray());
-    }
-
-    /**
-     * Determines if given class is a valid test class.
-     *
-     * @return <code>true</code> if loadedClass is a test
-     */
-    private boolean isTestClass(Class<?> loadedClass) {
-        try {
-            if (Modifier.isAbstract(loadedClass.getModifiers())) {
-                logDebug(String.format("Skipping abstract class %s: not a test",
-                        loadedClass.getName()));
-                return false;
-            }
-            // TODO: try to find upstream junit calls to replace these checks
-            if (junit.framework.Test.class.isAssignableFrom(loadedClass)) {
-                // ensure that if a TestCase, it has at least one test method otherwise
-                // TestSuite will throw error
-                if (junit.framework.TestCase.class.isAssignableFrom(loadedClass)) {
-                    return hasJUnit3TestMethod(loadedClass);
-                }
-                return true;
-            }
-            // TODO: look for a 'suite' method?
-            if (loadedClass.isAnnotationPresent(RunWith.class)) {
-                return true;
-            }
-            for (Method testMethod : loadedClass.getMethods()) {
-                if (testMethod.isAnnotationPresent(Test.class)) {
-                    return true;
-                }
-            }
-            logDebug(String.format("Skipping class %s: not a test", loadedClass.getName()));
-            return false;
-        } catch (Exception e) {
-            // Defensively catch exceptions - Will throw runtime exception if it cannot load
-            // methods.
-            // For earlier versions of Android (Pre-ICS), Dalvik might try to initialize a class
-            // during getMethods(), fail to do so, hide the error and throw a NoSuchMethodException.
-            // Since the java.lang.Class.getMethods does not declare such an exception, resort to a
-            // generic catch all.
-            // For ICS+, Dalvik will throw a NoClassDefFoundException.
-            Log.w(TAG, String.format("%s in isTestClass for %s", e.toString(),
-                    loadedClass.getName()));
-            return false;
-        } catch (Error e) {
-            // defensively catch Errors too
-            Log.w(TAG, String.format("%s in isTestClass for %s", e.toString(),
-                    loadedClass.getName()));
-            return false;
-        }
-    }
-
-    private boolean hasJUnit3TestMethod(Class<?> loadedClass) {
-        for (Method testMethod : loadedClass.getMethods()) {
-            if (isPublicTestMethod(testMethod)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // copied from junit.framework.TestSuite
-    private boolean isPublicTestMethod(Method m) {
-        return isTestMethod(m) && Modifier.isPublic(m.getModifiers());
-    }
-
-    // copied from junit.framework.TestSuite
-    private boolean isTestMethod(Method m) {
-        return m.getParameterTypes().length == 0 && m.getName().startsWith("test")
-                && m.getReturnType().equals(Void.TYPE);
-    }
-
-    /**
-     * Utility method for logging debug messages. Only actually logs a message if TAG is marked
-     * as loggable to limit log spam during normal use.
-     */
-    private void logDebug(String msg) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, msg);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/hvac/AdjustableTemperatureViewTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/hvac/AdjustableTemperatureViewTest.java
deleted file mode 100644
index fe071d5..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/hvac/AdjustableTemperatureViewTest.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.hvac;
-
-import static android.car.VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL;
-import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS;
-import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_SET;
-
-import static com.android.systemui.car.hvac.HvacController.convertToCelsius;
-import static com.android.systemui.car.hvac.HvacController.convertToFahrenheit;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.car.Car;
-import android.car.VehicleUnit;
-import android.car.hardware.property.CarPropertyManager;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.widget.TextView;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.car.CarSystemUiTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.concurrent.Executor;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class AdjustableTemperatureViewTest extends SysuiTestCase {
-
-    private static final float TEMP_CELSIUS = 22.0f;
-    private final String mFormat = getContext().getString(R.string.hvac_temperature_format);
-    private AdjustableTemperatureView mAdjustableTemperatureView;
-    private HvacController mHvacController;
-
-    @Mock
-    private Car mCar;
-    @Mock
-    private CarPropertyManager mCarPropertyManager;
-    @Mock
-    private Executor mExecutor;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        when(mCar.isConnected()).thenReturn(true);
-        when(mCar.getCarManager(Car.PROPERTY_SERVICE)).thenReturn(mCarPropertyManager);
-
-        CarServiceProvider carServiceProvider = new CarServiceProvider(mContext, mCar);
-        mHvacController = new HvacController(carServiceProvider, mExecutor);
-        mHvacController.connectToCarService();
-        mAdjustableTemperatureView = new AdjustableTemperatureView(getContext(), /* attrs= */ null);
-        mAdjustableTemperatureView.onFinishInflate();
-        mAdjustableTemperatureView.setHvacController(mHvacController);
-    }
-
-    @Test
-    public void addTemperatureViewToController_setsTemperatureView() {
-        when(mCarPropertyManager.isPropertyAvailable(eq(HVAC_TEMPERATURE_SET),
-                anyInt())).thenReturn(true);
-        when(mCarPropertyManager.getFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt())).thenReturn(
-                TEMP_CELSIUS);
-
-        mHvacController.addTemperatureViewToController(mAdjustableTemperatureView);
-
-        TextView tempText = mAdjustableTemperatureView.findViewById(R.id.hvac_temperature_text);
-        assertEquals(tempText.getText(), String.format(mFormat, TEMP_CELSIUS));
-    }
-
-    @Test
-    public void setTemp_tempNaN_setsTextToNaNText() {
-        when(mCarPropertyManager.isPropertyAvailable(eq(HVAC_TEMPERATURE_SET),
-                anyInt())).thenReturn(true);
-        when(mCarPropertyManager.getFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt())).thenReturn(
-                Float.NaN);
-
-        mHvacController.addTemperatureViewToController(mAdjustableTemperatureView);
-
-        TextView tempText = mAdjustableTemperatureView.findViewById(R.id.hvac_temperature_text);
-        assertEquals(tempText.getText(),
-                getContext().getResources().getString(R.string.hvac_null_temp_text));
-    }
-
-    @Test
-    public void setTemp_tempBelowMin_setsTextToMinTempText() {
-        when(mCarPropertyManager.isPropertyAvailable(eq(HVAC_TEMPERATURE_SET),
-                anyInt())).thenReturn(true);
-        when(mCarPropertyManager.getFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt())).thenReturn(
-                getContext().getResources().getFloat(R.dimen.hvac_min_value_celsius));
-
-        mHvacController.addTemperatureViewToController(mAdjustableTemperatureView);
-
-        TextView tempText = mAdjustableTemperatureView.findViewById(R.id.hvac_temperature_text);
-        assertEquals(tempText.getText(),
-                getContext().getResources().getString(R.string.hvac_min_text));
-    }
-
-    @Test
-    public void setTemp_tempAboveMax_setsTextToMaxTempText() {
-        when(mCarPropertyManager.isPropertyAvailable(eq(HVAC_TEMPERATURE_SET),
-                anyInt())).thenReturn(true);
-        when(mCarPropertyManager.getFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt())).thenReturn(
-                getContext().getResources().getFloat(R.dimen.hvac_max_value_celsius));
-
-        mHvacController.addTemperatureViewToController(mAdjustableTemperatureView);
-
-        TextView tempText = mAdjustableTemperatureView.findViewById(R.id.hvac_temperature_text);
-        assertEquals(tempText.getText(),
-                getContext().getResources().getString(R.string.hvac_max_text));
-    }
-
-    @Test
-    public void setTemperatureToFahrenheit_callsViewSetDisplayInFahrenheit() {
-        when(mCarPropertyManager.isPropertyAvailable(eq(HVAC_TEMPERATURE_SET),
-                anyInt())).thenReturn(true);
-        when(mCarPropertyManager.getFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt())).thenReturn(
-                TEMP_CELSIUS);
-        when(mCarPropertyManager.isPropertyAvailable(HVAC_TEMPERATURE_DISPLAY_UNITS,
-                VEHICLE_AREA_TYPE_GLOBAL)).thenReturn(true);
-        when(mCarPropertyManager.getIntProperty(HVAC_TEMPERATURE_DISPLAY_UNITS,
-                VEHICLE_AREA_TYPE_GLOBAL)).thenReturn(VehicleUnit.FAHRENHEIT);
-
-        mHvacController.addTemperatureViewToController(mAdjustableTemperatureView);
-
-        TextView tempText = mAdjustableTemperatureView.findViewById(R.id.hvac_temperature_text);
-        assertEquals(tempText.getText(), String.format(mFormat, convertToFahrenheit(TEMP_CELSIUS)));
-    }
-
-    @Test
-    public void adjustableViewIncreaseButton_setsTempWithCarPropertyManager() {
-        when(mCarPropertyManager.isPropertyAvailable(eq(HVAC_TEMPERATURE_SET),
-                anyInt())).thenReturn(true);
-        when(mCarPropertyManager.getFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt())).thenReturn(
-                TEMP_CELSIUS);
-        mHvacController.addTemperatureViewToController(mAdjustableTemperatureView);
-
-        mAdjustableTemperatureView.findViewById(R.id.hvac_increase_button).callOnClick();
-
-        ArgumentCaptor<Runnable> setTempRunnableCaptor = ArgumentCaptor.forClass(Runnable.class);
-        verify(mExecutor).execute(setTempRunnableCaptor.capture());
-        setTempRunnableCaptor.getValue().run();
-        verify(mCarPropertyManager).setFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt(),
-                eq(TEMP_CELSIUS + 1));
-    }
-
-    @Test
-    public void adjustableViewDecreaseButton_setsTempWithCarPropertyManager() {
-        when(mCarPropertyManager.isPropertyAvailable(eq(HVAC_TEMPERATURE_SET),
-                anyInt())).thenReturn(true);
-        when(mCarPropertyManager.getFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt())).thenReturn(
-                TEMP_CELSIUS);
-        mHvacController.addTemperatureViewToController(mAdjustableTemperatureView);
-
-        mAdjustableTemperatureView.findViewById(R.id.hvac_decrease_button).callOnClick();
-
-        ArgumentCaptor<Runnable> setTempRunnableCaptor = ArgumentCaptor.forClass(Runnable.class);
-        verify(mExecutor).execute(setTempRunnableCaptor.capture());
-        setTempRunnableCaptor.getValue().run();
-        verify(mCarPropertyManager).setFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt(),
-                eq(TEMP_CELSIUS - 1));
-    }
-
-    @Test
-    public void adjustableViewIncreaseButton_inFahrenheit_setsTempWithCarPropertyManager() {
-        when(mCarPropertyManager.isPropertyAvailable(eq(HVAC_TEMPERATURE_SET),
-                anyInt())).thenReturn(true);
-        when(mCarPropertyManager.getFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt())).thenReturn(
-                TEMP_CELSIUS);
-        when(mCarPropertyManager.isPropertyAvailable(HVAC_TEMPERATURE_DISPLAY_UNITS,
-                VEHICLE_AREA_TYPE_GLOBAL)).thenReturn(true);
-        when(mCarPropertyManager.getIntProperty(HVAC_TEMPERATURE_DISPLAY_UNITS,
-                VEHICLE_AREA_TYPE_GLOBAL)).thenReturn(VehicleUnit.FAHRENHEIT);
-        mHvacController.addTemperatureViewToController(mAdjustableTemperatureView);
-
-        mAdjustableTemperatureView.findViewById(R.id.hvac_increase_button).callOnClick();
-
-        ArgumentCaptor<Runnable> setTempRunnableCaptor = ArgumentCaptor.forClass(Runnable.class);
-        verify(mExecutor).execute(setTempRunnableCaptor.capture());
-        setTempRunnableCaptor.getValue().run();
-        verify(mCarPropertyManager).setFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt(),
-                eq(convertToCelsius(convertToFahrenheit(TEMP_CELSIUS) + 1)));
-    }
-
-    @Test
-    public void adjustableViewDecreaseButton_inFahrenheit_setsTempWithCarPropertyManager() {
-        when(mCarPropertyManager.isPropertyAvailable(eq(HVAC_TEMPERATURE_SET),
-                anyInt())).thenReturn(true);
-        when(mCarPropertyManager.getFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt())).thenReturn(
-                TEMP_CELSIUS);
-        when(mCarPropertyManager.isPropertyAvailable(HVAC_TEMPERATURE_DISPLAY_UNITS,
-                VEHICLE_AREA_TYPE_GLOBAL)).thenReturn(true);
-        when(mCarPropertyManager.getIntProperty(HVAC_TEMPERATURE_DISPLAY_UNITS,
-                VEHICLE_AREA_TYPE_GLOBAL)).thenReturn(VehicleUnit.FAHRENHEIT);
-        mHvacController.addTemperatureViewToController(mAdjustableTemperatureView);
-
-        mAdjustableTemperatureView.findViewById(R.id.hvac_decrease_button).callOnClick();
-
-        ArgumentCaptor<Runnable> setTempRunnableCaptor = ArgumentCaptor.forClass(Runnable.class);
-        verify(mExecutor).execute(setTempRunnableCaptor.capture());
-        setTempRunnableCaptor.getValue().run();
-        verify(mCarPropertyManager).setFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt(),
-                eq(convertToCelsius(convertToFahrenheit(TEMP_CELSIUS) - 1)));
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/hvac/HvacControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/hvac/HvacControllerTest.java
deleted file mode 100644
index 52f07df..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/hvac/HvacControllerTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.hvac;
-
-import static android.car.VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL;
-import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS;
-import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_SET;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyFloat;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.car.Car;
-import android.car.VehicleUnit;
-import android.car.hardware.property.CarPropertyManager;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.util.concurrency.FakeExecutor;
-import com.android.systemui.util.time.FakeSystemClock;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class HvacControllerTest extends SysuiTestCase {
-
-    private static final int AREA_ID = 1;
-    private static final float TEMP = 72.0f;
-
-    private HvacController mHvacController;
-
-    @Mock
-    private Car mCar;
-    @Mock
-    private CarPropertyManager mCarPropertyManager;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        when(mCar.isConnected()).thenReturn(true);
-        when(mCar.getCarManager(Car.PROPERTY_SERVICE)).thenReturn(mCarPropertyManager);
-
-        CarServiceProvider carServiceProvider = new CarServiceProvider(mContext, mCar);
-        mHvacController = new HvacController(carServiceProvider,
-                new FakeExecutor(new FakeSystemClock()));
-        mHvacController.connectToCarService();
-    }
-
-    @Test
-    public void connectToCarService_registersCallback() {
-        verify(mCarPropertyManager).registerCallback(any(), eq(HVAC_TEMPERATURE_SET), anyFloat());
-        verify(mCarPropertyManager).registerCallback(any(), eq(HVAC_TEMPERATURE_DISPLAY_UNITS),
-                anyFloat());
-    }
-
-    @Test
-    public void addTemperatureViewToController_usingTemperatureView_registersView() {
-        TemperatureTextView v = setupMockTemperatureTextView(AREA_ID, TEMP);
-        mHvacController.addTemperatureViewToController(v);
-
-        verify(v).setTemp(TEMP);
-    }
-
-    @Test
-    public void addTemperatureViewToController_usingSameTemperatureView_registersFirstView() {
-        TemperatureTextView v = setupMockTemperatureTextView(AREA_ID, TEMP);
-        mHvacController.addTemperatureViewToController(v);
-        verify(v).setTemp(TEMP);
-        resetTemperatureView(v, AREA_ID);
-
-        mHvacController.addTemperatureViewToController(v);
-        verify(v, never()).setTemp(TEMP);
-    }
-
-    @Test
-    public void addTemperatureViewToController_usingDifferentTemperatureView_registersBothViews() {
-        TemperatureTextView v1 = setupMockTemperatureTextView(AREA_ID, TEMP);
-        mHvacController.addTemperatureViewToController(v1);
-        verify(v1).setTemp(TEMP);
-
-        TemperatureTextView v2 = setupMockTemperatureTextView(
-                AREA_ID + 1,
-                TEMP + 1);
-        mHvacController.addTemperatureViewToController(v2);
-        verify(v2).setTemp(TEMP + 1);
-    }
-
-    @Test
-    public void setTemperatureToFahrenheit_callsViewSetDisplayInFahrenheit() {
-        when(mCarPropertyManager.isPropertyAvailable(HVAC_TEMPERATURE_DISPLAY_UNITS,
-                VEHICLE_AREA_TYPE_GLOBAL)).thenReturn(true);
-        when(mCarPropertyManager.getIntProperty(HVAC_TEMPERATURE_DISPLAY_UNITS,
-                VEHICLE_AREA_TYPE_GLOBAL)).thenReturn(VehicleUnit.FAHRENHEIT);
-        TemperatureTextView v = setupMockTemperatureTextView(AREA_ID, TEMP);
-
-        mHvacController.addTemperatureViewToController(v);
-
-        verify(v).setDisplayInFahrenheit(true);
-        verify(v).setTemp(TEMP);
-    }
-
-    private TemperatureTextView setupMockTemperatureTextView(int areaId, float value) {
-        TemperatureTextView v = mock(TemperatureTextView.class);
-        resetTemperatureView(v, areaId);
-        when(mCarPropertyManager.isPropertyAvailable(HVAC_TEMPERATURE_SET, areaId)).thenReturn(
-                true);
-        when(mCarPropertyManager.getFloatProperty(HVAC_TEMPERATURE_SET, areaId)).thenReturn(value);
-        return v;
-    }
-
-    private void resetTemperatureView(TemperatureTextView view, int areaId) {
-        reset(view);
-        when(view.getAreaId()).thenReturn(areaId);
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/hvac/TemperatureTextViewTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/hvac/TemperatureTextViewTest.java
deleted file mode 100644
index 3ed8111..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/hvac/TemperatureTextViewTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.hvac;
-
-import static android.car.VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL;
-import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS;
-import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_SET;
-
-import static com.android.systemui.car.hvac.HvacController.convertToFahrenheit;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.when;
-
-import android.car.Car;
-import android.car.VehicleUnit;
-import android.car.hardware.property.CarPropertyManager;
-import android.content.Context;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.util.concurrency.FakeExecutor;
-import com.android.systemui.util.time.FakeSystemClock;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class TemperatureTextViewTest extends SysuiTestCase {
-    private static final float TEMP = 72.0f;
-    private final String mFormat = getContext().getString(R.string.hvac_temperature_format);
-    private HvacController mHvacController;
-    private TemperatureTextView mTextView;
-
-    @Mock
-    private Context mContext;
-
-    @Mock
-    private Car mCar;
-    @Mock
-    private CarPropertyManager mCarPropertyManager;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        when(mCar.isConnected()).thenReturn(true);
-        when(mCar.getCarManager(Car.PROPERTY_SERVICE)).thenReturn(mCarPropertyManager);
-
-        CarServiceProvider carServiceProvider = new CarServiceProvider(mContext, mCar);
-        mHvacController = new HvacController(carServiceProvider,
-                new FakeExecutor(new FakeSystemClock()));
-        mHvacController.connectToCarService();
-        mTextView = new TemperatureTextView(getContext(), /* attrs= */ null);
-    }
-
-    @Test
-    public void addTemperatureViewToController_usingTemperatureView_registersView() {
-        when(mCarPropertyManager.isPropertyAvailable(eq(HVAC_TEMPERATURE_SET),
-                anyInt())).thenReturn(true);
-        when(mCarPropertyManager.getFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt())).thenReturn(
-                TEMP);
-
-        mHvacController.addTemperatureViewToController(mTextView);
-
-        assertEquals(mTextView.getText(), String.format(mFormat, TEMP));
-    }
-
-    @Test
-    public void setTemperatureToFahrenheit_callsViewSetDisplayInFahrenheit() {
-        when(mCarPropertyManager.isPropertyAvailable(eq(HVAC_TEMPERATURE_SET),
-                anyInt())).thenReturn(true);
-        when(mCarPropertyManager.getFloatProperty(eq(HVAC_TEMPERATURE_SET), anyInt())).thenReturn(
-                TEMP);
-        when(mCarPropertyManager.isPropertyAvailable(HVAC_TEMPERATURE_DISPLAY_UNITS,
-                VEHICLE_AREA_TYPE_GLOBAL)).thenReturn(true);
-        when(mCarPropertyManager.getIntProperty(HVAC_TEMPERATURE_DISPLAY_UNITS,
-                VEHICLE_AREA_TYPE_GLOBAL)).thenReturn(VehicleUnit.FAHRENHEIT);
-
-        mHvacController.addTemperatureViewToController(mTextView);
-
-        assertEquals(mTextView.getText(), String.format(mFormat, convertToFahrenheit(TEMP)));
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java
deleted file mode 100644
index 062ab41..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.keyguard;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.inOrder;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.os.Handler;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.keyguard.ViewMediatorCallback;
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.car.navigationbar.CarNavigationBarController;
-import com.android.systemui.car.window.OverlayViewGlobalStateController;
-import com.android.systemui.statusbar.phone.BiometricUnlockController;
-import com.android.systemui.statusbar.phone.KeyguardBouncer;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InOrder;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class CarKeyguardViewControllerTest extends SysuiTestCase {
-
-    private CarKeyguardViewController mCarKeyguardViewController;
-
-    @Mock
-    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-    @Mock
-    private CarKeyguardViewController.OnKeyguardCancelClickedListener mCancelClickedListener;
-    @Mock
-    private KeyguardBouncer.Factory mKeyguardBouncerFactory;
-    @Mock
-    private KeyguardBouncer mBouncer;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        when(mKeyguardBouncerFactory.create(
-                any(ViewGroup.class),
-                any(KeyguardBouncer.BouncerExpansionCallback.class)))
-                .thenReturn(mBouncer);
-
-        mCarKeyguardViewController = new CarKeyguardViewController(
-                Handler.getMain(),
-                mock(CarServiceProvider.class),
-                mOverlayViewGlobalStateController,
-                mock(KeyguardStateController.class),
-                mock(KeyguardUpdateMonitor.class),
-                () -> mock(BiometricUnlockController.class),
-                mock(ViewMediatorCallback.class),
-                mock(CarNavigationBarController.class),
-                mKeyguardBouncerFactory
-        );
-        mCarKeyguardViewController.inflate((ViewGroup) LayoutInflater.from(mContext).inflate(
-                R.layout.sysui_overlay_window, /* root= */ null));
-    }
-
-    @Test
-    public void onShow_bouncerIsSecure_showsBouncerWithSecuritySelectionReset() {
-        when(mBouncer.isSecure()).thenReturn(true);
-        mCarKeyguardViewController.show(/* options= */ null);
-
-        verify(mBouncer).show(/* resetSecuritySelection= */ true);
-    }
-
-    @Test
-    public void onShow_bouncerIsSecure_keyguardIsVisible() {
-        when(mBouncer.isSecure()).thenReturn(true);
-        mCarKeyguardViewController.show(/* options= */ null);
-
-        verify(mOverlayViewGlobalStateController).showView(eq(mCarKeyguardViewController), any());
-    }
-
-    @Test
-    public void onShow_bouncerNotSecure_hidesBouncerAndDestroysTheView() {
-        when(mBouncer.isSecure()).thenReturn(false);
-        mCarKeyguardViewController.show(/* options= */ null);
-
-        verify(mBouncer).hide(/* destroyView= */ true);
-    }
-
-    @Test
-    public void onShow_bouncerNotSecure_keyguardIsNotVisible() {
-        when(mBouncer.isSecure()).thenReturn(false);
-        mCarKeyguardViewController.show(/* options= */ null);
-
-        // Here we check for both showView and hideView since the current implementation of show
-        // with bouncer being not secure has the following method execution orders:
-        // 1) show -> start -> showView
-        // 2) show -> reset -> dismissAndCollapse -> hide -> stop -> hideView
-        // Hence, we want to make sure that showView is called before hideView and not in any
-        // other combination.
-        InOrder inOrder = inOrder(mOverlayViewGlobalStateController);
-        inOrder.verify(mOverlayViewGlobalStateController).showView(eq(mCarKeyguardViewController),
-                any());
-        inOrder.verify(mOverlayViewGlobalStateController).hideView(eq(mCarKeyguardViewController),
-                any());
-    }
-
-    @Test
-    public void onHide_keyguardShowing_hidesBouncerAndDestroysTheView() {
-        when(mBouncer.isSecure()).thenReturn(true);
-        mCarKeyguardViewController.show(/* options= */ null);
-        mCarKeyguardViewController.hide(/* startTime= */ 0, /* fadeoutDelay= */ 0);
-
-        verify(mBouncer).hide(/* destroyView= */ true);
-    }
-
-    @Test
-    public void onHide_keyguardNotShown_doesNotHideOrDestroyBouncer() {
-        mCarKeyguardViewController.hide(/* startTime= */ 0, /* fadeoutDelay= */ 0);
-
-        verify(mBouncer, never()).hide(anyBoolean());
-    }
-
-    @Test
-    public void onHide_KeyguardNotVisible() {
-        when(mBouncer.isSecure()).thenReturn(true);
-        mCarKeyguardViewController.show(/* options= */ null);
-        mCarKeyguardViewController.hide(/* startTime= */ 0, /* fadeoutDelay= */ 0);
-
-        InOrder inOrder = inOrder(mOverlayViewGlobalStateController);
-        inOrder.verify(mOverlayViewGlobalStateController).showView(eq(mCarKeyguardViewController),
-                any());
-        inOrder.verify(mOverlayViewGlobalStateController).hideView(eq(mCarKeyguardViewController),
-                any());
-    }
-
-    @Test
-    public void setOccludedFalse_currentlyOccluded_bouncerReset() {
-        when(mBouncer.isSecure()).thenReturn(true);
-        mCarKeyguardViewController.show(/* options= */ null);
-        mCarKeyguardViewController.setOccluded(/* occluded= */ true, /* animate= */ false);
-        reset(mBouncer);
-
-        mCarKeyguardViewController.setOccluded(/* occluded= */ false, /* animate= */ false);
-
-        verify(mBouncer).show(/* resetSecuritySelection= */ true);
-    }
-
-    @Test
-    public void onCancelClicked_callsCancelClickedListener() {
-        when(mBouncer.isSecure()).thenReturn(true);
-        mCarKeyguardViewController.show(/* options= */ null);
-        mCarKeyguardViewController.registerOnKeyguardCancelClickedListener(mCancelClickedListener);
-        mCarKeyguardViewController.onCancelClicked();
-
-        verify(mCancelClickedListener).onCancelClicked();
-    }
-
-    @Test
-    public void onCancelClicked_hidesBouncerAndDestroysTheView() {
-        when(mBouncer.isSecure()).thenReturn(true);
-        mCarKeyguardViewController.show(/* options= */ null);
-        mCarKeyguardViewController.registerOnKeyguardCancelClickedListener(mCancelClickedListener);
-        mCarKeyguardViewController.onCancelClicked();
-
-        verify(mBouncer).hide(/* destroyView= */ true);
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/ButtonRoleHolderControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/ButtonRoleHolderControllerTest.java
deleted file mode 100644
index 4b82680..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/ButtonRoleHolderControllerTest.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.when;
-
-import android.app.role.RoleManager;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
-import android.os.UserHandle;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.widget.LinearLayout;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.tests.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.List;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class ButtonRoleHolderControllerTest extends SysuiTestCase {
-    private static final String TEST_VALID_PACKAGE_NAME = "foo";
-    private static final String TEST_INVALID_PACKAGE_NAME = "bar";
-    private static final UserHandle TEST_CURRENT_USER = UserHandle.of(100);
-    private static final UserHandle TEST_NON_CURRENT_USER = UserHandle.of(101);
-
-    private LinearLayout mTestView;
-    private CarNavigationButton mNavButtonDefaultAppIconForRoleWithEnabled;
-    private CarNavigationButton mNavButtonDefaultAppIconForRoleWithDisabled;
-    private ButtonRoleHolderController mControllerUnderTest;
-    private Drawable mAppIcon;
-
-    @Mock
-    private RoleManager mRoleManager;
-    @Mock
-    private CarDeviceProvisionedController mDeviceProvisionedController;
-    @Mock
-    private PackageManager mPackageManager;
-    @Mock
-    private ApplicationInfo mApplicationInfo;
-
-    @Before
-    public void setUp() throws PackageManager.NameNotFoundException {
-        MockitoAnnotations.initMocks(this);
-
-        mTestView = (LinearLayout) LayoutInflater.from(mContext).inflate(
-                R.layout.button_role_holder_controller_test, /* root= */ null);
-        mNavButtonDefaultAppIconForRoleWithEnabled = mTestView
-                .findViewById(R.id.assistant_role_button);
-        mNavButtonDefaultAppIconForRoleWithDisabled = mTestView
-                .findViewById(R.id.assistant_role_disabled_button);
-        mAppIcon = mContext.getDrawable(R.drawable.car_ic_apps);
-        when(mApplicationInfo.loadIcon(any())).thenReturn(mAppIcon);
-        doThrow(new PackageManager.NameNotFoundException()).when(mPackageManager)
-                .getApplicationInfo(any(), anyInt());
-        doReturn(mApplicationInfo).when(mPackageManager)
-                .getApplicationInfo(eq(TEST_VALID_PACKAGE_NAME), anyInt());
-        when(mDeviceProvisionedController
-                .getCurrentUser())
-                .thenReturn(TEST_CURRENT_USER.getIdentifier());
-        mControllerUnderTest = new ButtonRoleHolderController(mContext,
-                mPackageManager, mRoleManager, mDeviceProvisionedController);
-    }
-
-    @Test
-    public void addAllButtonsWithRoleName_roleAssigned_appIconEnabled_useAssignedAppIcon() {
-        when(mRoleManager.getRoleHoldersAsUser(eq(RoleManager.ROLE_ASSISTANT), any()))
-                .thenReturn(List.of(TEST_VALID_PACKAGE_NAME));
-
-        mControllerUnderTest.addAllButtonsWithRoleName(mTestView);
-
-        assertThat(mNavButtonDefaultAppIconForRoleWithEnabled.getAppIcon()).isEqualTo(mAppIcon);
-    }
-
-    @Test
-    public void addAllButtonsWithRoleName_roleUnassigned_appIconEnabled_useDefaultIcon() {
-        when(mRoleManager.getRoleHoldersAsUser(eq(RoleManager.ROLE_ASSISTANT), any()))
-                .thenReturn(null);
-
-        mControllerUnderTest.addAllButtonsWithRoleName(mTestView);
-
-        assertThat(mNavButtonDefaultAppIconForRoleWithEnabled.getAppIcon()).isNull();
-    }
-
-    @Test
-    public void onRoleChanged_currentUser_appIconEnabled_useAssignedAppIcon() {
-        when(mRoleManager.getRoleHoldersAsUser(eq(RoleManager.ROLE_ASSISTANT), any()))
-                .thenReturn(null);
-        mControllerUnderTest.addAllButtonsWithRoleName(mTestView);
-        when(mRoleManager
-                .getRoleHoldersAsUser(eq(RoleManager.ROLE_ASSISTANT), any()))
-                .thenReturn(List.of(TEST_VALID_PACKAGE_NAME));
-
-        mControllerUnderTest.onRoleChanged(RoleManager.ROLE_ASSISTANT, TEST_CURRENT_USER);
-
-        assertThat(mNavButtonDefaultAppIconForRoleWithEnabled.getAppIcon()).isEqualTo(mAppIcon);
-    }
-
-    @Test
-    public void onRoleChanged_nonCurrentUser_appIconEnabled_iconIsNotUpdated() {
-        when(mRoleManager
-                .getRoleHoldersAsUser(eq(RoleManager.ROLE_ASSISTANT), any()))
-                .thenReturn(null);
-        mControllerUnderTest.addAllButtonsWithRoleName(mTestView);
-        Drawable beforeIcon = mNavButtonDefaultAppIconForRoleWithEnabled.getAppIcon();
-        when(mRoleManager
-                .getRoleHoldersAsUser(eq(RoleManager.ROLE_ASSISTANT), any()))
-                .thenReturn(List.of(TEST_VALID_PACKAGE_NAME));
-
-        mControllerUnderTest.onRoleChanged(RoleManager.ROLE_ASSISTANT, TEST_NON_CURRENT_USER);
-
-        Drawable afterIcon = mNavButtonDefaultAppIconForRoleWithEnabled.getAppIcon();
-        assertThat(afterIcon).isEqualTo(beforeIcon);
-    }
-
-    @Test
-    public void onRoleChanged_invalidPackage_useDefaultIcon() {
-        when(mRoleManager
-                .getRoleHoldersAsUser(eq(RoleManager.ROLE_ASSISTANT), any()))
-                .thenReturn(List.of(TEST_INVALID_PACKAGE_NAME));
-
-        mControllerUnderTest.addAllButtonsWithRoleName(mTestView);
-
-        assertThat(mNavButtonDefaultAppIconForRoleWithEnabled.getAppIcon()).isNull();
-    }
-
-    @Test
-    public void addAllButtonsWithRoleName_appIconDisabled_useDefaultIcon() {
-        when(mRoleManager
-                .getRoleHoldersAsUser(eq(RoleManager.ROLE_ASSISTANT), any()))
-                .thenReturn(List.of(TEST_VALID_PACKAGE_NAME));
-
-        mControllerUnderTest.addAllButtonsWithRoleName(mTestView);
-
-        assertThat(mNavButtonDefaultAppIconForRoleWithDisabled.getAppIcon()).isNull();
-    }
-
-    @Test
-    public void onRoleChanged_roleAssigned_appIconDisabled_useDefaultIcon() {
-        when(mRoleManager
-                .getRoleHoldersAsUser(eq(RoleManager.ROLE_ASSISTANT), any()))
-                .thenReturn(null);
-        mControllerUnderTest.addAllButtonsWithRoleName(mTestView);
-        assertThat(mNavButtonDefaultAppIconForRoleWithDisabled.getAppIcon()).isNull();
-        when(mRoleManager
-                .getRoleHoldersAsUser(eq(RoleManager.ROLE_ASSISTANT), any()))
-                .thenReturn(List.of(TEST_VALID_PACKAGE_NAME));
-
-        mControllerUnderTest.onRoleChanged(RoleManager.ROLE_ASSISTANT, TEST_CURRENT_USER);
-
-        assertThat(mNavButtonDefaultAppIconForRoleWithDisabled.getAppIcon()).isNull();
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/ButtonSelectionStateControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/ButtonSelectionStateControllerTest.java
deleted file mode 100644
index bd017cd..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/ButtonSelectionStateControllerTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.ActivityTaskManager.RootTaskInfo;
-import android.content.ComponentName;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.widget.LinearLayout;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.tests.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class ButtonSelectionStateControllerTest extends SysuiTestCase {
-
-    private static final String TEST_COMPONENT_NAME_PACKAGE = "com.android.car.carlauncher";
-    private static final String TEST_COMPONENT_NAME_CLASS = ".CarLauncher";
-    private static final String TEST_CATEGORY = "com.google.android.apps.maps";
-    private static final String TEST_CATEGORY_CLASS = ".APP_MAPS";
-    private static final String TEST_PACKAGE = "com.android.car.dialer";
-    private static final String TEST_PACKAGE_CLASS = ".Dialer";
-
-    // LinearLayout with CarNavigationButtons with different configurations.
-    private LinearLayout mTestView;
-    private ButtonSelectionStateController mButtonSelectionStateController;
-    private ComponentName mComponentName;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mTestView = (LinearLayout) LayoutInflater.from(mContext).inflate(
-                R.layout.car_button_selection_state_controller_test, /* root= */ null);
-        mButtonSelectionStateController = new ButtonSelectionStateController(mContext);
-        mButtonSelectionStateController.addAllButtonsWithSelectionState(mTestView);
-    }
-
-    @Test
-    public void onTaskChanged_buttonDetectableByComponentName_selectsAssociatedButton() {
-        CarNavigationButton testButton = mTestView.findViewById(R.id.detectable_by_component_name);
-        mComponentName = new ComponentName(TEST_COMPONENT_NAME_PACKAGE, TEST_COMPONENT_NAME_CLASS);
-        List<RootTaskInfo> testStack = createTestStack(mComponentName);
-        testButton.setSelected(false);
-        mButtonSelectionStateController.taskChanged(testStack, /* validDisplay= */ -1);
-
-        assertbuttonSelected(testButton);
-    }
-
-    @Test
-    public void onTaskChanged_buttonDetectableByCategory_selectsAssociatedButton() {
-        CarNavigationButton testButton = mTestView.findViewById(R.id.detectable_by_category);
-        mComponentName = new ComponentName(TEST_CATEGORY, TEST_CATEGORY_CLASS);
-        List<RootTaskInfo> testStack = createTestStack(mComponentName);
-        testButton.setSelected(false);
-        mButtonSelectionStateController.taskChanged(testStack, /* validDisplay= */ -1);
-
-        assertbuttonSelected(testButton);
-    }
-
-    @Test
-    public void onTaskChanged_buttonDetectableByPackage_selectsAssociatedButton() {
-        CarNavigationButton testButton = mTestView.findViewById(R.id.detectable_by_package);
-        mComponentName = new ComponentName(TEST_PACKAGE, TEST_PACKAGE_CLASS);
-        List<RootTaskInfo> testStack = createTestStack(mComponentName);
-        testButton.setSelected(false);
-        mButtonSelectionStateController.taskChanged(testStack, /* validDisplay= */ -1);
-
-        assertbuttonSelected(testButton);
-    }
-
-    @Test
-    public void onTaskChanged_deselectsPreviouslySelectedButton() {
-        CarNavigationButton oldButton = mTestView.findViewById(R.id.detectable_by_component_name);
-        mComponentName = new ComponentName(TEST_COMPONENT_NAME_PACKAGE, TEST_COMPONENT_NAME_CLASS);
-        List<RootTaskInfo> oldStack = createTestStack(mComponentName);
-        oldButton.setSelected(false);
-        mButtonSelectionStateController.taskChanged(oldStack, /* validDisplay= */ -1);
-
-        mComponentName = new ComponentName(TEST_PACKAGE, TEST_PACKAGE_CLASS);
-        List<RootTaskInfo> newStack = createTestStack(mComponentName);
-        mButtonSelectionStateController.taskChanged(newStack, /* validDisplay= */ -1);
-
-        assertButtonUnselected(oldButton);
-    }
-
-    // Comparing alpha is a valid way to verify button selection state because all test buttons use
-    // highlightWhenSelected = true.
-    private void assertbuttonSelected(CarNavigationButton button) {
-        assertThat(button.getAlpha()).isEqualTo(CarNavigationButton.DEFAULT_SELECTED_ALPHA);
-    }
-
-    private void assertButtonUnselected(CarNavigationButton button) {
-        assertThat(button.getAlpha()).isEqualTo(CarNavigationButton.DEFAULT_UNSELECTED_ALPHA);
-    }
-
-    private List<RootTaskInfo> createTestStack(ComponentName componentName) {
-        RootTaskInfo validStackInfo = new RootTaskInfo();
-        validStackInfo.displayId = -1; // No display is assigned to this test view
-        validStackInfo.topActivity = componentName;
-
-        List<RootTaskInfo> testStack = new ArrayList<>();
-        testStack.add(validStackInfo);
-
-        return testStack;
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarControllerTest.java
deleted file mode 100644
index 5b0bb35..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarControllerTest.java
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.testing.TestableResources;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.car.hvac.HvacController;
-import com.android.systemui.car.statusbar.UserNameViewController;
-import com.android.systemui.plugins.DarkIconDispatcher;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class CarNavigationBarControllerTest extends SysuiTestCase {
-
-    private static final String TOP_NOTIFICATION_PANEL =
-            "com.android.systemui.car.notification.TopNotificationPanelViewMediator";
-    private static final String BOTTOM_NOTIFICATION_PANEL =
-            "com.android.systemui.car.notification.BottomNotificationPanelViewMediator";
-    private CarNavigationBarController mCarNavigationBar;
-    private NavigationBarViewFactory mNavigationBarViewFactory;
-    private TestableResources mTestableResources;
-
-    @Mock
-    private ButtonSelectionStateController mButtonSelectionStateController;
-    @Mock
-    private ButtonRoleHolderController mButtonRoleHolderController;
-    @Mock
-    private HvacController mHvacController;
-    @Mock
-    private UserNameViewController mUserNameViewController;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        mNavigationBarViewFactory = new NavigationBarViewFactory(mContext);
-        mTestableResources = mContext.getOrCreateTestableResources();
-
-        // Needed to inflate top navigation bar.
-        mDependency.injectMockDependency(DarkIconDispatcher.class);
-        mDependency.injectMockDependency(StatusBarIconController.class);
-    }
-
-    private CarNavigationBarController createNavigationBarController() {
-        return new CarNavigationBarController(mContext, mNavigationBarViewFactory,
-                mButtonSelectionStateController, () -> mHvacController,
-                () -> mUserNameViewController, mButtonRoleHolderController,
-                new SystemBarConfigs(mTestableResources.getResources()));
-    }
-
-    @Test
-    public void testConnectToHvac_callsConnect() {
-        mCarNavigationBar = createNavigationBarController();
-
-        mCarNavigationBar.connectToHvac();
-
-        verify(mHvacController).connectToCarService();
-    }
-
-    @Test
-    public void testRemoveAll_callsHvacControllerRemoveAllComponents() {
-        mCarNavigationBar = createNavigationBarController();
-
-        mCarNavigationBar.removeAll();
-
-        verify(mHvacController).removeAllComponents();
-    }
-
-
-    @Test
-    public void testRemoveAll_callsButtonRoleHolderControllerRemoveAll() {
-        mCarNavigationBar = createNavigationBarController();
-
-        mCarNavigationBar.removeAll();
-
-        verify(mButtonRoleHolderController).removeAll();
-    }
-
-    @Test
-    public void testRemoveAll_callsButtonSelectionStateControllerRemoveAll() {
-        mCarNavigationBar = createNavigationBarController();
-
-        mCarNavigationBar.removeAll();
-
-        verify(mButtonSelectionStateController).removeAll();
-    }
-
-    @Test
-    public void testGetTopWindow_topDisabled_returnsNull() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, false);
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        // If Top Notification Panel is used but top navigation bar is not enabled, SystemUI is
-        // expected to crash.
-        mTestableResources.addOverride(R.string.config_notificationPanelViewMediator,
-                BOTTOM_NOTIFICATION_PANEL);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getTopWindow();
-
-        assertThat(window).isNull();
-    }
-
-    @Test
-    public void testGetTopWindow_topEnabled_returnsWindow() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getTopWindow();
-
-        assertThat(window).isNotNull();
-    }
-
-    @Test
-    public void testGetTopWindow_topEnabled_calledTwice_returnsSameWindow() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window1 = mCarNavigationBar.getTopWindow();
-        ViewGroup window2 = mCarNavigationBar.getTopWindow();
-
-        assertThat(window1).isEqualTo(window2);
-    }
-
-    @Test
-    public void testGetBottomWindow_bottomDisabled_returnsNull() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, false);
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        // If Bottom Notification Panel is used but bottom navigation bar is not enabled,
-        // SystemUI is expected to crash.
-        mTestableResources.addOverride(R.string.config_notificationPanelViewMediator,
-                TOP_NOTIFICATION_PANEL);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getBottomWindow();
-
-        assertThat(window).isNull();
-    }
-
-    @Test
-    public void testGetBottomWindow_bottomEnabled_returnsWindow() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getBottomWindow();
-
-        assertThat(window).isNotNull();
-    }
-
-    @Test
-    public void testGetBottomWindow_bottomEnabled_calledTwice_returnsSameWindow() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window1 = mCarNavigationBar.getBottomWindow();
-        ViewGroup window2 = mCarNavigationBar.getBottomWindow();
-
-        assertThat(window1).isEqualTo(window2);
-    }
-
-    @Test
-    public void testGetLeftWindow_leftDisabled_returnsNull() {
-        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, false);
-        mCarNavigationBar = createNavigationBarController();
-        ViewGroup window = mCarNavigationBar.getLeftWindow();
-        assertThat(window).isNull();
-    }
-
-    @Test
-    public void testGetLeftWindow_leftEnabled_returnsWindow() {
-        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getLeftWindow();
-
-        assertThat(window).isNotNull();
-    }
-
-    @Test
-    public void testGetLeftWindow_leftEnabled_calledTwice_returnsSameWindow() {
-        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window1 = mCarNavigationBar.getLeftWindow();
-        ViewGroup window2 = mCarNavigationBar.getLeftWindow();
-
-        assertThat(window1).isEqualTo(window2);
-    }
-
-    @Test
-    public void testGetRightWindow_rightDisabled_returnsNull() {
-        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, false);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getRightWindow();
-
-        assertThat(window).isNull();
-    }
-
-    @Test
-    public void testGetRightWindow_rightEnabled_returnsWindow() {
-        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getRightWindow();
-
-        assertThat(window).isNotNull();
-    }
-
-    @Test
-    public void testGetRightWindow_rightEnabled_calledTwice_returnsSameWindow() {
-        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window1 = mCarNavigationBar.getRightWindow();
-        ViewGroup window2 = mCarNavigationBar.getRightWindow();
-
-        assertThat(window1).isEqualTo(window2);
-    }
-
-    @Test
-    public void testSetTopWindowVisibility_setTrue_isVisible() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getTopWindow();
-        mCarNavigationBar.setTopWindowVisibility(View.VISIBLE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void testSetTopWindowVisibility_setFalse_isGone() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getTopWindow();
-        mCarNavigationBar.setTopWindowVisibility(View.GONE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void testSetBottomWindowVisibility_setTrue_isVisible() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getBottomWindow();
-        mCarNavigationBar.setBottomWindowVisibility(View.VISIBLE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void testSetBottomWindowVisibility_setFalse_isGone() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getBottomWindow();
-        mCarNavigationBar.setBottomWindowVisibility(View.GONE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void testSetLeftWindowVisibility_setTrue_isVisible() {
-        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getLeftWindow();
-        mCarNavigationBar.setLeftWindowVisibility(View.VISIBLE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void testSetLeftWindowVisibility_setFalse_isGone() {
-        mTestableResources.addOverride(R.bool.config_enableLeftNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getLeftWindow();
-        mCarNavigationBar.setLeftWindowVisibility(View.GONE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void testSetRightWindowVisibility_setTrue_isVisible() {
-        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getRightWindow();
-        mCarNavigationBar.setRightWindowVisibility(View.VISIBLE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void testSetRightWindowVisibility_setFalse_isGone() {
-        mTestableResources.addOverride(R.bool.config_enableRightNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        ViewGroup window = mCarNavigationBar.getRightWindow();
-        mCarNavigationBar.setRightWindowVisibility(View.GONE);
-
-        assertThat(window.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void testRegisterBottomBarTouchListener_createViewFirst_registrationSuccessful() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        View.OnTouchListener controller = bottomBar.getStatusBarWindowTouchListener();
-        assertThat(controller).isNull();
-        mCarNavigationBar.registerBottomBarTouchListener(mock(View.OnTouchListener.class));
-        controller = bottomBar.getStatusBarWindowTouchListener();
-
-        assertThat(controller).isNotNull();
-    }
-
-    @Test
-    public void testRegisterBottomBarTouchListener_registerFirst_registrationSuccessful() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        mCarNavigationBar.registerBottomBarTouchListener(mock(View.OnTouchListener.class));
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        View.OnTouchListener controller = bottomBar.getStatusBarWindowTouchListener();
-
-        assertThat(controller).isNotNull();
-    }
-
-    @Test
-    public void testRegisterNotificationController_createViewFirst_registrationSuccessful() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        CarNavigationBarController.NotificationsShadeController controller =
-                bottomBar.getNotificationsPanelController();
-        assertThat(controller).isNull();
-        mCarNavigationBar.registerNotificationController(
-                mock(CarNavigationBarController.NotificationsShadeController.class));
-        controller = bottomBar.getNotificationsPanelController();
-
-        assertThat(controller).isNotNull();
-    }
-
-    @Test
-    public void testRegisterNotificationController_registerFirst_registrationSuccessful() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-
-        mCarNavigationBar.registerNotificationController(
-                mock(CarNavigationBarController.NotificationsShadeController.class));
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        CarNavigationBarController.NotificationsShadeController controller =
-                bottomBar.getNotificationsPanelController();
-
-        assertThat(controller).isNotNull();
-    }
-
-    @Test
-    public void testShowAllKeyguardButtons_bottomEnabled_bottomKeyguardButtonsVisible() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        View bottomKeyguardButtons = bottomBar.findViewById(R.id.lock_screen_nav_buttons);
-
-        mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true);
-
-        assertThat(bottomKeyguardButtons.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void testShowAllKeyguardButtons_bottomEnabled_bottomNavButtonsGone() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        View bottomButtons = bottomBar.findViewById(R.id.nav_buttons);
-
-        mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true);
-
-        assertThat(bottomButtons.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void testHideAllKeyguardButtons_bottomEnabled_bottomKeyguardButtonsGone() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        View bottomKeyguardButtons = bottomBar.findViewById(R.id.lock_screen_nav_buttons);
-
-        mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true);
-        assertThat(bottomKeyguardButtons.getVisibility()).isEqualTo(View.VISIBLE);
-        mCarNavigationBar.hideAllKeyguardButtons(/* isSetUp= */ true);
-
-        assertThat(bottomKeyguardButtons.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void testHideAllKeyguardButtons_bottomEnabled_bottomNavButtonsVisible() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        View bottomButtons = bottomBar.findViewById(R.id.nav_buttons);
-
-        mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true);
-        assertThat(bottomButtons.getVisibility()).isEqualTo(View.GONE);
-        mCarNavigationBar.hideAllKeyguardButtons(/* isSetUp= */ true);
-
-        assertThat(bottomButtons.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void testToggleAllNotificationsUnseenIndicator_bottomEnabled_hasUnseen_setCorrectly() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        CarNavigationButton notifications = bottomBar.findViewById(R.id.notifications);
-
-        boolean hasUnseen = true;
-        mCarNavigationBar.toggleAllNotificationsUnseenIndicator(/* isSetUp= */ true,
-                hasUnseen);
-
-        assertThat(notifications.getUnseen()).isTrue();
-    }
-
-    @Test
-    public void testToggleAllNotificationsUnseenIndicator_bottomEnabled_noUnseen_setCorrectly() {
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        mCarNavigationBar = createNavigationBarController();
-        CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true);
-        CarNavigationButton notifications = bottomBar.findViewById(R.id.notifications);
-
-        boolean hasUnseen = false;
-        mCarNavigationBar.toggleAllNotificationsUnseenIndicator(/* isSetUp= */ true,
-                hasUnseen);
-
-        assertThat(notifications.getUnseen()).isFalse();
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarTest.java
deleted file mode 100644
index 2b5af71..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarTest.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
-import static android.view.InsetsState.ITYPE_STATUS_BAR;
-import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
-import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_STATUS_BARS;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.graphics.Rect;
-import android.os.Handler;
-import android.os.RemoteException;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.testing.TestableResources;
-import android.util.ArrayMap;
-import android.view.Display;
-import android.view.WindowManager;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.internal.statusbar.IStatusBarService;
-import com.android.internal.statusbar.RegisterStatusBarResult;
-import com.android.internal.view.AppearanceRegion;
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.phone.AutoHideController;
-import com.android.systemui.statusbar.phone.LightBarController;
-import com.android.systemui.statusbar.phone.LightBarTransitionsController;
-import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-import com.android.systemui.util.concurrency.FakeExecutor;
-import com.android.systemui.util.time.FakeSystemClock;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class CarNavigationBarTest extends SysuiTestCase {
-
-    private CarNavigationBar mCarNavigationBar;
-    private TestableResources mTestableResources;
-    private Handler mHandler;
-
-    @Mock
-    private CarNavigationBarController mCarNavigationBarController;
-    @Mock
-    private LightBarController mLightBarController;
-    @Mock
-    private SysuiDarkIconDispatcher mStatusBarIconController;
-    @Mock
-    private LightBarTransitionsController mLightBarTransitionsController;
-    @Mock
-    private WindowManager mWindowManager;
-    @Mock
-    private CarDeviceProvisionedController mDeviceProvisionedController;
-    @Mock
-    private AutoHideController mAutoHideController;
-    @Mock
-    private ButtonSelectionStateListener mButtonSelectionStateListener;
-    @Mock
-    private ButtonRoleHolderController mButtonRoleHolderController;
-    @Mock
-    private IStatusBarService mBarService;
-    @Mock
-    private KeyguardStateController mKeyguardStateController;
-    @Mock
-    private ButtonSelectionStateController mButtonSelectionStateController;
-    @Mock
-    private PhoneStatusBarPolicy mIconPolicy;
-    @Mock
-    private StatusBarIconController mIconController;
-
-    private RegisterStatusBarResult mBarResult;
-    private AppearanceRegion[] mAppearanceRegions;
-    private FakeExecutor mUiBgExecutor;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mTestableResources = mContext.getOrCreateTestableResources();
-        mHandler = Handler.getMain();
-        mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
-        when(mStatusBarIconController.getTransitionsController()).thenReturn(
-                mLightBarTransitionsController);
-        mAppearanceRegions = new AppearanceRegion[] {
-                new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, new Rect())
-        };
-        mBarResult = new RegisterStatusBarResult(
-                /* icons= */ new ArrayMap<>(),
-                /* disabledFlags1= */ 0,
-                /* appearance= */ 0,
-                mAppearanceRegions,
-                /* imeWindowVis= */ 0,
-                /* imeBackDisposition= */ 0,
-                /* showImeSwitcher= */ false,
-                /* disabledFlags2= */ 0,
-                /* imeToken= */ null,
-                /* navbarColorMangedByIme= */ false,
-                /* appFullscreen= */ false,
-                /* appImmersive= */ false,
-                /* transientBarTypes= */ new int[]{});
-        try {
-            when(mBarService.registerStatusBar(any())).thenReturn(mBarResult);
-        } catch (RemoteException e) {
-            e.printStackTrace();
-        }
-        mCarNavigationBar = new CarNavigationBar(mContext, mTestableResources.getResources(),
-                mCarNavigationBarController, mLightBarController, mStatusBarIconController,
-                mWindowManager, mDeviceProvisionedController, new CommandQueue(mContext),
-                mAutoHideController, mButtonSelectionStateListener, mHandler, mUiBgExecutor,
-                mBarService, () -> mKeyguardStateController, () -> mIconPolicy,
-                () -> mIconController, new SystemBarConfigs(mTestableResources.getResources()));
-    }
-
-    @Test
-    public void restartNavbars_refreshesTaskChanged() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
-                deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
-                CarDeviceProvisionedController.DeviceProvisionedListener.class);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-        // switching the currentUserSetup value to force restart the navbars.
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
-        verify(mDeviceProvisionedController).addCallback(deviceProvisionedCallbackCaptor.capture());
-
-        deviceProvisionedCallbackCaptor.getValue().onUserSwitched();
-        waitForIdleSync(mHandler);
-
-        verify(mButtonSelectionStateListener).onTaskStackChanged();
-    }
-
-    @Test
-    public void restartNavBars_newUserNotSetupWithKeyguardShowing_showsKeyguardButtons() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
-                deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
-                CarDeviceProvisionedController.DeviceProvisionedListener.class);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-        when(mKeyguardStateController.isShowing()).thenReturn(true);
-        // switching the currentUserSetup value to force restart the navbars.
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
-        verify(mDeviceProvisionedController).addCallback(deviceProvisionedCallbackCaptor.capture());
-
-        deviceProvisionedCallbackCaptor.getValue().onUserSwitched();
-        waitForIdleSync(mHandler);
-
-        verify(mCarNavigationBarController).showAllKeyguardButtons(false);
-    }
-
-    @Test
-    public void restartNavbars_newUserIsSetupWithKeyguardHidden_hidesKeyguardButtons() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
-                deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
-                CarDeviceProvisionedController.DeviceProvisionedListener.class);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-        when(mKeyguardStateController.isShowing()).thenReturn(true);
-        // switching the currentUserSetup value to force restart the navbars.
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
-        verify(mDeviceProvisionedController).addCallback(deviceProvisionedCallbackCaptor.capture());
-        deviceProvisionedCallbackCaptor.getValue().onUserSwitched();
-        waitForIdleSync(mHandler);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        when(mKeyguardStateController.isShowing()).thenReturn(false);
-
-        deviceProvisionedCallbackCaptor.getValue().onUserSetupChanged();
-        waitForIdleSync(mHandler);
-
-        verify(mCarNavigationBarController).hideAllKeyguardButtons(true);
-    }
-
-    @Test
-    public void restartNavBars_lightAppearance_darkensAllIcons() {
-        mAppearanceRegions[0] = new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, new Rect());
-
-        mCarNavigationBar.start();
-
-        verify(mLightBarTransitionsController).setIconsDark(
-                /* dark= */ true, /* animate= */ false);
-    }
-
-    @Test
-    public void restartNavBars_opaqueAppearance_lightensAllIcons() {
-        mAppearanceRegions[0] = new AppearanceRegion(APPEARANCE_OPAQUE_STATUS_BARS, new Rect());
-
-        mCarNavigationBar.start();
-
-        verify(mLightBarTransitionsController).setIconsDark(
-                /* dark= */ false, /* animate= */ false);
-    }
-
-    @Test
-    public void showTransient_wrongDisplayId_transientModeNotUpdated() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-
-        int randomDisplay = Display.DEFAULT_DISPLAY + 10;
-        int[] insetTypes = new int[]{};
-        mCarNavigationBar.showTransient(randomDisplay, insetTypes);
-
-        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
-    }
-
-    @Test
-    public void showTransient_correctDisplayId_noStatusBarInset_transientModeNotUpdated() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-
-        int[] insetTypes = new int[]{};
-        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
-
-        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
-    }
-
-    @Test
-    public void showTransient_correctDisplayId_statusBarInset_transientModeUpdated() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-
-        int[] insetTypes = new int[]{ITYPE_STATUS_BAR};
-        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
-
-        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
-    }
-
-    @Test
-    public void showTransient_correctDisplayId_noNavBarInset_transientModeNotUpdated() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-
-        int[] insetTypes = new int[]{};
-        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
-
-        assertThat(mCarNavigationBar.isNavBarTransientShown()).isFalse();
-    }
-
-    @Test
-    public void showTransient_correctDisplayId_navBarInset_transientModeUpdated() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-
-        int[] insetTypes = new int[]{ITYPE_NAVIGATION_BAR};
-        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
-
-        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
-    }
-
-    @Test
-    public void abortTransient_wrongDisplayId_transientModeNotCleared() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
-                new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
-        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
-        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
-
-        int[] insetTypes = new int[]{};
-        int randomDisplay = Display.DEFAULT_DISPLAY + 10;
-        mCarNavigationBar.abortTransient(randomDisplay, insetTypes);
-
-        // The transient booleans were not cleared.
-        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
-        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
-    }
-
-    @Test
-    public void abortTransient_correctDisplayId_noInsets_transientModeNotCleared() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
-                new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
-        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
-        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
-
-        int[] insetTypes = new int[]{};
-        mCarNavigationBar.abortTransient(Display.DEFAULT_DISPLAY, insetTypes);
-
-        // The transient booleans were not cleared.
-        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
-        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
-    }
-
-    @Test
-    public void abortTransient_correctDisplayId_statusBarInset_transientModeCleared() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
-                new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
-        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
-        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
-
-        int[] insetTypes = new int[]{ITYPE_STATUS_BAR};
-        mCarNavigationBar.abortTransient(Display.DEFAULT_DISPLAY, insetTypes);
-
-        // The transient booleans were cleared.
-        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
-        assertThat(mCarNavigationBar.isNavBarTransientShown()).isFalse();
-    }
-
-    @Test
-    public void abortTransient_correctDisplayId_navBarInset_transientModeCleared() {
-        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
-        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
-        when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
-        mCarNavigationBar.start();
-        mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
-                new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
-        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
-        assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
-
-        int[] insetTypes = new int[]{ITYPE_NAVIGATION_BAR};
-        mCarNavigationBar.abortTransient(Display.DEFAULT_DISPLAY, insetTypes);
-
-        // The transient booleans were cleared.
-        assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
-        assertThat(mCarNavigationBar.isNavBarTransientShown()).isFalse();
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarViewTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarViewTest.java
deleted file mode 100644
index 47fd820..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarViewTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.when;
-
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarSystemUiTest;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class CarNavigationBarViewTest extends SysuiTestCase {
-
-    private CarNavigationBarView mNavBarView;
-
-    @Mock
-    private CarNavigationBarController.NotificationsShadeController mNotificationsShadeController;
-
-    @Mock
-    private View.OnTouchListener mNavBarTouchListener;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-    }
-
-    @After
-    public void tearDown() {
-        getContext().getOrCreateTestableResources().addOverride(
-                R.bool.config_consumeNavigationBarTouchWhenNotificationPanelOpen, false);
-    }
-
-    @Test
-    public void dispatchTouch_shadeOpen_flagOff_doesNotConsumeTouch() {
-        getContext().getOrCreateTestableResources().addOverride(
-                R.bool.config_consumeNavigationBarTouchWhenNotificationPanelOpen, false);
-        when(mNotificationsShadeController.isNotificationPanelOpen()).thenReturn(true);
-        mNavBarView = (CarNavigationBarView) LayoutInflater.from(getContext()).inflate(
-                R.layout.car_navigation_bar_view_test, /* root= */ null);
-        mNavBarView.setNotificationsPanelController(mNotificationsShadeController);
-        mNavBarView.setStatusBarWindowTouchListener(mNavBarTouchListener);
-
-        boolean consume = mNavBarView.onInterceptTouchEvent(
-                MotionEvent.obtain(/* downTime= */ 200, /* eventTime= */ 300,
-                        MotionEvent.ACTION_MOVE, mNavBarView.getX(),
-                        mNavBarView.getY(), /* metaState= */ 0));
-
-        assertThat(consume).isFalse();
-    }
-
-    @Test
-    public void dispatchTouch_shadeOpen_flagOn_consumesTouch() {
-        getContext().getOrCreateTestableResources().addOverride(
-                R.bool.config_consumeNavigationBarTouchWhenNotificationPanelOpen, true);
-        when(mNotificationsShadeController.isNotificationPanelOpen()).thenReturn(true);
-        mNavBarView = (CarNavigationBarView) LayoutInflater.from(getContext()).inflate(
-                R.layout.car_navigation_bar_view_test, /* root= */ null);
-        mNavBarView.setNotificationsPanelController(mNotificationsShadeController);
-        mNavBarView.setStatusBarWindowTouchListener(mNavBarTouchListener);
-
-        boolean consume = mNavBarView.onInterceptTouchEvent(
-                MotionEvent.obtain(/* downTime= */ 200, /* eventTime= */ 300,
-                        MotionEvent.ACTION_MOVE, mNavBarView.getX(),
-                        mNavBarView.getY(), /* metaState= */ 0));
-
-        assertThat(consume).isTrue();
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationButtonTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationButtonTest.java
deleted file mode 100644
index 173f548..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationButtonTest.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.app.ActivityManager;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.statusbar.AlphaOptimizedImageView;
-import com.android.systemui.tests.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatcher;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class CarNavigationButtonTest extends SysuiTestCase {
-
-    private static final String DEFAULT_BUTTON_ACTIVITY_NAME =
-            "com.android.car.carlauncher/.CarLauncher";
-    private static final String APP_GRID_BUTTON_ACTIVITY_NAME =
-            "com.android.car.carlauncher/.AppGridActivity";
-    private static final String BROADCAST_ACTION_NAME =
-            "android.car.intent.action.TOGGLE_HVAC_CONTROLS";
-
-    private ActivityManager mActivityManager;
-    // LinearLayout with CarNavigationButtons with different configurations.
-    private LinearLayout mTestView;
-    // Does not have any selection state which is the default configuration.
-    private CarNavigationButton mDefaultButton;
-
-    @Before
-    public void setUp() {
-        mContext = spy(mContext);
-        mTestView = (LinearLayout) LayoutInflater.from(mContext).inflate(
-                R.layout.car_navigation_button_test, /* root= */ null);
-        mDefaultButton = mTestView.findViewById(R.id.default_no_selection_state);
-        mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
-    }
-
-    @Test
-    public void onCreate_iconIsVisible() {
-        AlphaOptimizedImageView icon = mDefaultButton.findViewById(
-                R.id.car_nav_button_icon_image);
-
-        assertThat(icon.getDrawable()).isNotNull();
-    }
-
-    @Test
-    public void onSelected_selectedIconDefined_togglesIcon() {
-        mDefaultButton.setSelected(true);
-        Drawable selectedIconDrawable = ((AlphaOptimizedImageView) mDefaultButton.findViewById(
-                R.id.car_nav_button_icon_image)).getDrawable();
-
-
-        mDefaultButton.setSelected(false);
-        Drawable unselectedIconDrawable = ((AlphaOptimizedImageView) mDefaultButton.findViewById(
-                R.id.car_nav_button_icon_image)).getDrawable();
-
-        assertThat(selectedIconDrawable).isNotEqualTo(unselectedIconDrawable);
-    }
-
-    @Test
-    public void onSelected_selectedIconUndefined_displaysSameIcon() {
-        CarNavigationButton selectedIconUndefinedButton = mTestView.findViewById(
-                R.id.selected_icon_undefined);
-
-        selectedIconUndefinedButton.setSelected(true);
-        Drawable selectedIconDrawable = ((AlphaOptimizedImageView) mDefaultButton.findViewById(
-                R.id.car_nav_button_icon_image)).getDrawable();
-
-
-        selectedIconUndefinedButton.setSelected(false);
-        Drawable unselectedIconDrawable = ((AlphaOptimizedImageView) mDefaultButton.findViewById(
-                R.id.car_nav_button_icon_image)).getDrawable();
-
-        assertThat(selectedIconDrawable).isEqualTo(unselectedIconDrawable);
-    }
-
-    @Test
-    public void onUnselected_doesNotHighlightWhenSelected_applySelectedAlpha() {
-        mDefaultButton.setSelected(false);
-
-        assertThat(mDefaultButton.getAlpha()).isEqualTo(
-                CarNavigationButton.DEFAULT_SELECTED_ALPHA);
-    }
-
-    @Test
-    public void onSelected_doesNotHighlightWhenSelected_applySelectedAlpha() {
-        mDefaultButton.setSelected(true);
-
-        assertThat(mDefaultButton.getAlpha()).isEqualTo(
-                CarNavigationButton.DEFAULT_SELECTED_ALPHA);
-    }
-
-    @Test
-    public void onUnselected_highlightWhenSelected_applyDefaultUnselectedAlpha() {
-        CarNavigationButton highlightWhenSelectedButton = mTestView.findViewById(
-                R.id.highlightable_no_more_button);
-        highlightWhenSelectedButton.setSelected(false);
-
-        assertThat(highlightWhenSelectedButton.getAlpha()).isEqualTo(
-                CarNavigationButton.DEFAULT_UNSELECTED_ALPHA);
-    }
-
-    @Test
-    public void onSelected_highlightWhenSelected_applyDefaultSelectedAlpha() {
-        CarNavigationButton highlightWhenSelectedButton = mTestView.findViewById(
-                R.id.highlightable_no_more_button);
-        highlightWhenSelectedButton.setSelected(true);
-
-        assertThat(highlightWhenSelectedButton.getAlpha()).isEqualTo(
-                CarNavigationButton.DEFAULT_SELECTED_ALPHA);
-    }
-
-    @Test
-    public void onSelected_doesNotShowMoreWhenSelected_doesNotShowMoreIcon() {
-        mDefaultButton.setSelected(true);
-        AlphaOptimizedImageView moreIcon = mDefaultButton.findViewById(
-                R.id.car_nav_button_more_icon);
-
-        assertThat(moreIcon.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void onSelected_showMoreWhenSelected_showsMoreIcon() {
-        CarNavigationButton showMoreWhenSelected = mTestView.findViewById(
-                R.id.not_highlightable_more_button);
-        showMoreWhenSelected.setSelected(true);
-        AlphaOptimizedImageView moreIcon = showMoreWhenSelected.findViewById(
-                R.id.car_nav_button_more_icon);
-
-        assertThat(moreIcon.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void onUnselected_showMoreWhenSelected_doesNotShowMoreIcon() {
-        CarNavigationButton showMoreWhenSelected = mTestView.findViewById(
-                R.id.highlightable_no_more_button);
-        showMoreWhenSelected.setSelected(true);
-        showMoreWhenSelected.setSelected(false);
-        AlphaOptimizedImageView moreIcon = showMoreWhenSelected.findViewById(
-                R.id.car_nav_button_more_icon);
-
-        assertThat(moreIcon.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void onUnselected_withAppIcon_showsAppIcon() {
-        CarNavigationButton roleBasedButton = mTestView.findViewById(R.id.role_based_button);
-        Drawable appIcon = getContext().getDrawable(R.drawable.ic_android);
-
-        roleBasedButton.setSelected(false);
-        roleBasedButton.setAppIcon(appIcon);
-
-        Drawable currentDrawable = ((AlphaOptimizedImageView) roleBasedButton.findViewById(
-                R.id.car_nav_button_icon_image)).getDrawable();
-
-        assertThat(currentDrawable).isEqualTo(appIcon);
-    }
-
-    @Test
-    public void onUnselected_withAppIcon_applyUnselectedAlpha() {
-        CarNavigationButton roleBasedButton = mTestView.findViewById(R.id.role_based_button);
-
-        roleBasedButton.setSelected(false);
-        roleBasedButton.setAppIcon(getContext().getDrawable(R.drawable.ic_android));
-
-        assertThat(roleBasedButton.getAlpha()).isEqualTo(
-                CarNavigationButton.DEFAULT_UNSELECTED_ALPHA);
-    }
-
-    @Test
-    public void onSelected_withAppIcon_showsAppIconWithSelectedAlpha() {
-        CarNavigationButton roleBasedButton = mTestView.findViewById(R.id.role_based_button);
-        Drawable appIcon = getContext().getDrawable(R.drawable.ic_android);
-
-        roleBasedButton.setSelected(true);
-        roleBasedButton.setAppIcon(appIcon);
-
-        Drawable currentDrawable = ((AlphaOptimizedImageView) roleBasedButton.findViewById(
-                R.id.car_nav_button_icon_image)).getDrawable();
-
-        assertThat(currentDrawable).isEqualTo(appIcon);
-    }
-
-    @Test
-    public void onSelected_withAppIcon_applySelectedAlpha() {
-        CarNavigationButton roleBasedButton = mTestView.findViewById(R.id.role_based_button);
-
-        roleBasedButton.setSelected(true);
-        roleBasedButton.setAppIcon(getContext().getDrawable(R.drawable.ic_android));
-
-        assertThat(roleBasedButton.getAlpha()).isEqualTo(
-                CarNavigationButton.DEFAULT_SELECTED_ALPHA);
-    }
-
-    @Test
-    public void onClick_launchesIntentActivity() {
-        mDefaultButton.performClick();
-
-        assertThat(getCurrentActivityName()).isEqualTo(DEFAULT_BUTTON_ACTIVITY_NAME);
-
-        CarNavigationButton appGridButton = mTestView.findViewById(R.id.app_grid_activity);
-        appGridButton.performClick();
-
-        assertThat(getCurrentActivityName()).isEqualTo(APP_GRID_BUTTON_ACTIVITY_NAME);
-    }
-
-    @Test
-    public void onLongClick_longIntentDefined_launchesLongIntentActivity() {
-        mDefaultButton.performClick();
-
-        assertThat(getCurrentActivityName()).isEqualTo(DEFAULT_BUTTON_ACTIVITY_NAME);
-
-        CarNavigationButton appGridButton = mTestView.findViewById(
-                R.id.long_click_app_grid_activity);
-        appGridButton.performLongClick();
-
-        assertThat(getCurrentActivityName()).isEqualTo(APP_GRID_BUTTON_ACTIVITY_NAME);
-    }
-
-    @Test
-    public void onClick_useBroadcast_broadcastsIntent() {
-        CarNavigationButton appGridButton = mTestView.findViewById(R.id.broadcast);
-        appGridButton.performClick();
-
-        verify(mContext).sendBroadcastAsUser(argThat(new ArgumentMatcher<Intent>() {
-            @Override
-            public boolean matches(Intent argument) {
-                return argument.getAction().equals(BROADCAST_ACTION_NAME);
-            }
-        }), any());
-    }
-
-    @Test
-    public void onSetUnseen_hasUnseen_showsUnseenIndicator() {
-        mDefaultButton.setUnseen(true);
-        ImageView hasUnseenIndicator = mDefaultButton.findViewById(R.id.car_nav_button_unseen_icon);
-
-        assertThat(hasUnseenIndicator.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void onSetUnseen_doesNotHaveUnseen_hidesUnseenIndicator() {
-        mDefaultButton.setUnseen(false);
-        ImageView hasUnseenIndicator = mDefaultButton.findViewById(R.id.car_nav_button_unseen_icon);
-
-        assertThat(hasUnseenIndicator.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    private String getCurrentActivityName() {
-        return mActivityManager.getRunningTasks(1).get(0).topActivity.flattenToShortString();
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/SystemBarConfigsTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/SystemBarConfigsTest.java
deleted file mode 100644
index 0c62f8b..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/SystemBarConfigsTest.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.navigationbar;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.when;
-
-import android.content.res.Resources;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.util.ArrayMap;
-import android.view.WindowManager;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.car.notification.NotificationPanelViewController;
-import com.android.systemui.car.notification.NotificationPanelViewMediator;
-import com.android.systemui.car.notification.PowerManagerHelper;
-import com.android.systemui.car.notification.TopNotificationPanelViewMediator;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class SystemBarConfigsTest extends SysuiTestCase {
-    private static final int SYSTEM_BAR_GIRTH = 100;
-
-    private SystemBarConfigs mSystemBarConfigs;
-    @Mock
-    private Resources mResources;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        setDefaultValidConfig();
-    }
-
-    @Test
-    public void onInit_allSystemBarsEnabled_eachHasUniqueBarTypes_doesNotThrowException() {
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-    }
-
-    @Test(expected = RuntimeException.class)
-    public void onInit_allSystemBarsEnabled_twoBarsHaveDuplicateType_throwsRuntimeException() {
-        when(mResources.getInteger(R.integer.config_topSystemBarType)).thenReturn(0);
-        when(mResources.getInteger(R.integer.config_bottomSystemBarType)).thenReturn(0);
-
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-    }
-
-    @Test
-    public void onInit_allSystemBarsEnabled_systemBarSidesSortedByZOrder() {
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-        List<Integer> actualOrder = mSystemBarConfigs.getSystemBarSidesByZOrder();
-        List<Integer> expectedOrder = new ArrayList<>();
-        expectedOrder.add(SystemBarConfigs.LEFT);
-        expectedOrder.add(SystemBarConfigs.RIGHT);
-        expectedOrder.add(SystemBarConfigs.TOP);
-        expectedOrder.add(SystemBarConfigs.BOTTOM);
-
-        assertTrue(actualOrder.equals(expectedOrder));
-    }
-
-    @Test(expected = RuntimeException.class)
-    public void onInit_intersectingBarsHaveSameZOrder_throwsRuntimeException() {
-        when(mResources.getInteger(R.integer.config_topSystemBarZOrder)).thenReturn(33);
-        when(mResources.getInteger(R.integer.config_leftSystemBarZOrder)).thenReturn(33);
-
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-    }
-
-    @Test(expected = RuntimeException.class)
-    public void onInit_hideBottomSystemBarForKeyboardValueDoNotSync_throwsRuntimeException() {
-        when(mResources.getBoolean(R.bool.config_hideBottomSystemBarForKeyboard)).thenReturn(false);
-        when(mResources.getBoolean(
-                com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard)).thenReturn(
-                true);
-
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-    }
-
-    @Test
-    public void onInit_topNotifPanelViewMediatorUsed_topBarEnabled_doesNotThrowException() {
-        when(mResources.getBoolean(R.bool.config_enableTopNavigationBar)).thenReturn(true);
-        when(mResources.getString(R.string.config_notificationPanelViewMediator)).thenReturn(
-                TestTopNotificationPanelViewMediator.class.getName());
-
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-    }
-
-    @Test(expected = RuntimeException.class)
-    public void onInit_topNotifPanelViewMediatorUsed_topBarNotEnabled_throwsRuntimeException() {
-        when(mResources.getBoolean(R.bool.config_enableTopNavigationBar)).thenReturn(false);
-        when(mResources.getString(R.string.config_notificationPanelViewMediator)).thenReturn(
-                TestTopNotificationPanelViewMediator.class.getName());
-
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-    }
-
-    @Test
-    public void onInit_notificationPanelViewMediatorUsed_topBarNotEnabled_doesNotThrowException() {
-        when(mResources.getBoolean(R.bool.config_enableTopNavigationBar)).thenReturn(false);
-        when(mResources.getString(R.string.config_notificationPanelViewMediator)).thenReturn(
-                NotificationPanelViewMediator.class.getName());
-
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-    }
-
-    @Test
-    public void getTopSystemBarLayoutParams_topBarEnabled_returnsTopSystemBarLayoutParams() {
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-        WindowManager.LayoutParams lp = mSystemBarConfigs.getLayoutParamsBySide(
-                SystemBarConfigs.TOP);
-
-        assertNotNull(lp);
-    }
-
-    @Test
-    public void getTopSystemBarLayoutParams_topBarNotEnabled_returnsNull() {
-        when(mResources.getBoolean(R.bool.config_enableTopNavigationBar)).thenReturn(false);
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-        WindowManager.LayoutParams lp = mSystemBarConfigs.getLayoutParamsBySide(
-                SystemBarConfigs.TOP);
-
-        assertNull(lp);
-    }
-
-    @Test
-    public void getTopSystemBarHideForKeyboard_hideBarForKeyboard_returnsTrue() {
-        when(mResources.getBoolean(R.bool.config_hideTopSystemBarForKeyboard)).thenReturn(true);
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-
-        boolean hideKeyboard = mSystemBarConfigs.getHideForKeyboardBySide(SystemBarConfigs.TOP);
-
-        assertTrue(hideKeyboard);
-    }
-
-    @Test
-    public void getTopSystemBarHideForKeyboard_topBarNotEnabled_returnsFalse() {
-        when(mResources.getBoolean(R.bool.config_enableTopNavigationBar)).thenReturn(false);
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-
-        boolean hideKeyboard = mSystemBarConfigs.getHideForKeyboardBySide(SystemBarConfigs.TOP);
-
-        assertFalse(hideKeyboard);
-    }
-
-    @Test
-    public void topSystemBarHasHigherZOrderThanHuns_topSystemBarIsNavigationBarPanelType() {
-        when(mResources.getInteger(R.integer.config_topSystemBarZOrder)).thenReturn(
-                SystemBarConfigs.getHunZOrder() + 1);
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-        WindowManager.LayoutParams lp = mSystemBarConfigs.getLayoutParamsBySide(
-                SystemBarConfigs.TOP);
-
-        assertEquals(lp.type, WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL);
-    }
-
-    @Test
-    public void topSystemBarHasLowerZOrderThanHuns_topSystemBarIsStatusBarAdditionalType() {
-        when(mResources.getInteger(R.integer.config_topSystemBarZOrder)).thenReturn(
-                SystemBarConfigs.getHunZOrder() - 1);
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-        WindowManager.LayoutParams lp = mSystemBarConfigs.getLayoutParamsBySide(
-                SystemBarConfigs.TOP);
-
-        assertEquals(lp.type, WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL);
-    }
-
-    @Test
-    public void updateInsetPaddings_overlappingBarWithHigherZOrderDisappeared_removesInset() {
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-        CarNavigationBarView leftBar = new CarNavigationBarView(mContext, /* attrs= */ null);
-        Map<Integer, Boolean> visibilities = new ArrayMap<>();
-        visibilities.put(SystemBarConfigs.TOP, false);
-        visibilities.put(SystemBarConfigs.BOTTOM, true);
-        visibilities.put(SystemBarConfigs.LEFT, true);
-        visibilities.put(SystemBarConfigs.RIGHT, true);
-
-        mSystemBarConfigs.updateInsetPaddings(SystemBarConfigs.LEFT, visibilities);
-        mSystemBarConfigs.insetSystemBar(SystemBarConfigs.LEFT, leftBar);
-
-        assertEquals(0, leftBar.getPaddingTop());
-    }
-
-    @Test
-    public void updateInsetPaddings_overlappingBarWithHigherZOrderReappeared_addsInset() {
-        mSystemBarConfigs = new SystemBarConfigs(mResources);
-        CarNavigationBarView leftBar = new CarNavigationBarView(mContext, /* attrs= */ null);
-        Map<Integer, Boolean> visibilities = new ArrayMap<>();
-        visibilities.put(SystemBarConfigs.TOP, false);
-        visibilities.put(SystemBarConfigs.BOTTOM, true);
-        visibilities.put(SystemBarConfigs.LEFT, true);
-        visibilities.put(SystemBarConfigs.RIGHT, true);
-
-        mSystemBarConfigs.updateInsetPaddings(SystemBarConfigs.LEFT, visibilities);
-        mSystemBarConfigs.insetSystemBar(SystemBarConfigs.LEFT, leftBar);
-        visibilities.put(SystemBarConfigs.TOP, true);
-        mSystemBarConfigs.updateInsetPaddings(SystemBarConfigs.LEFT, visibilities);
-        mSystemBarConfigs.insetSystemBar(SystemBarConfigs.LEFT, leftBar);
-
-        assertEquals(SYSTEM_BAR_GIRTH, leftBar.getPaddingTop());
-    }
-
-    // Set valid config where all system bars are enabled.
-    private void setDefaultValidConfig() {
-        when(mResources.getBoolean(R.bool.config_enableTopNavigationBar)).thenReturn(true);
-        when(mResources.getBoolean(R.bool.config_enableBottomNavigationBar)).thenReturn(true);
-        when(mResources.getBoolean(R.bool.config_enableLeftNavigationBar)).thenReturn(true);
-        when(mResources.getBoolean(R.bool.config_enableRightNavigationBar)).thenReturn(true);
-
-        when(mResources.getDimensionPixelSize(
-                com.android.internal.R.dimen.status_bar_height)).thenReturn(SYSTEM_BAR_GIRTH);
-        when(mResources.getDimensionPixelSize(
-                com.android.internal.R.dimen.navigation_bar_height)).thenReturn(SYSTEM_BAR_GIRTH);
-        when(mResources.getDimensionPixelSize(R.dimen.car_left_navigation_bar_width)).thenReturn(
-                SYSTEM_BAR_GIRTH);
-        when(mResources.getDimensionPixelSize(R.dimen.car_right_navigation_bar_width)).thenReturn(
-                SYSTEM_BAR_GIRTH);
-
-        when(mResources.getInteger(R.integer.config_topSystemBarType)).thenReturn(0);
-        when(mResources.getInteger(R.integer.config_bottomSystemBarType)).thenReturn(1);
-        when(mResources.getInteger(R.integer.config_leftSystemBarType)).thenReturn(2);
-        when(mResources.getInteger(R.integer.config_rightSystemBarType)).thenReturn(3);
-
-        when(mResources.getInteger(R.integer.config_topSystemBarZOrder)).thenReturn(5);
-        when(mResources.getInteger(R.integer.config_bottomSystemBarZOrder)).thenReturn(10);
-        when(mResources.getInteger(R.integer.config_leftSystemBarZOrder)).thenReturn(2);
-        when(mResources.getInteger(R.integer.config_rightSystemBarZOrder)).thenReturn(3);
-
-        when(mResources.getBoolean(R.bool.config_hideTopSystemBarForKeyboard)).thenReturn(false);
-        when(mResources.getBoolean(
-                com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard)).thenReturn(
-                false);
-        when(mResources.getBoolean(R.bool.config_hideLeftSystemBarForKeyboard)).thenReturn(
-                false);
-        when(mResources.getBoolean(R.bool.config_hideRightSystemBarForKeyboard)).thenReturn(
-                false);
-    }
-
-    // Intentionally using a subclass of TopNotificationPanelViewMediator for testing purposes to
-    // ensure that OEM's will be able to implement and use their own NotificationPanelViewMediator.
-    private class TestTopNotificationPanelViewMediator extends
-            TopNotificationPanelViewMediator {
-        TestTopNotificationPanelViewMediator(
-                CarNavigationBarController carNavigationBarController,
-                NotificationPanelViewController notificationPanelViewController,
-                PowerManagerHelper powerManagerHelper,
-                BroadcastDispatcher broadcastDispatcher,
-                CarDeviceProvisionedController carDeviceProvisionedController,
-                ConfigurationController configurationController) {
-            super(carNavigationBarController, notificationPanelViewController, powerManagerHelper,
-                    broadcastDispatcher, carDeviceProvisionedController, configurationController);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainerTest.java
deleted file mode 100644
index 19b7f7b..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainerTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.notification;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.when;
-
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.View;
-import android.view.WindowManager;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.car.notification.CarNotificationTypeItem;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.car.window.OverlayViewGlobalStateController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class CarHeadsUpNotificationSystemContainerTest extends SysuiTestCase {
-    private CarHeadsUpNotificationSystemContainer mCarHeadsUpNotificationSystemContainer;
-    @Mock
-    private CarDeviceProvisionedController mCarDeviceProvisionedController;
-    @Mock
-    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-    @Mock
-    private WindowManager mWindowManager;
-
-    @Mock
-    private View mNotificationView;
-    @Mock
-    private View mNotificationView2;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(/* testClass= */this);
-
-        when(mOverlayViewGlobalStateController.shouldShowHUN()).thenReturn(true);
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
-
-        mContext.ensureTestableResources();
-
-        mCarHeadsUpNotificationSystemContainer = new CarHeadsUpNotificationSystemContainer(mContext,
-                mCarDeviceProvisionedController, mWindowManager, mOverlayViewGlobalStateController);
-    }
-
-    @Test
-    public void testDisplayNotification_firstNotification_isVisible() {
-        mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView,
-                CarNotificationTypeItem.INBOX);
-        assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isTrue();
-    }
-
-    @Test
-    public void testRemoveNotification_lastNotification_isInvisible() {
-        mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView,
-                CarNotificationTypeItem.INBOX);
-        mCarHeadsUpNotificationSystemContainer.removeNotification(mNotificationView);
-        assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isFalse();
-    }
-
-    @Test
-    public void testRemoveNotification_nonLastNotification_isVisible() {
-        mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView,
-                CarNotificationTypeItem.INBOX);
-        mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView2,
-                CarNotificationTypeItem.INBOX);
-        mCarHeadsUpNotificationSystemContainer.removeNotification(mNotificationView);
-        assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isTrue();
-    }
-
-    @Test
-    public void testDisplayNotification_userFullySetupTrue_isInvisible() {
-        mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView,
-                CarNotificationTypeItem.INBOX);
-        assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isTrue();
-
-    }
-
-    @Test
-    public void testDisplayNotification_userFullySetupFalse_isInvisible() {
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(false);
-        mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView,
-                CarNotificationTypeItem.INBOX);
-        assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isFalse();
-    }
-
-    @Test
-    public void testDisplayNotification_overlayWindowStateShouldShowHUNFalse_isInvisible() {
-        when(mOverlayViewGlobalStateController.shouldShowHUN()).thenReturn(false);
-        mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView,
-                CarNotificationTypeItem.INBOX);
-        assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isFalse();
-    }
-
-    @Test
-    public void testDisplayNotification_overlayWindowStateShouldShowHUNTrue_isVisible() {
-        mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView,
-                CarNotificationTypeItem.INBOX);
-        assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isTrue();
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/NotificationVisibilityLoggerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/NotificationVisibilityLoggerTest.java
deleted file mode 100644
index d51aeb1..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/NotificationVisibilityLoggerTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.notification;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.Notification;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.service.notification.StatusBarNotification;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.car.notification.AlertEntry;
-import com.android.car.notification.NotificationDataManager;
-import com.android.internal.statusbar.IStatusBarService;
-import com.android.internal.statusbar.NotificationVisibility;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.util.concurrency.FakeExecutor;
-import com.android.systemui.util.time.FakeSystemClock;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.Collections;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class NotificationVisibilityLoggerTest extends SysuiTestCase {
-
-    private static final String PKG = "package_1";
-    private static final String OP_PKG = "OpPackage";
-    private static final int ID = 1;
-    private static final String TAG = "Tag";
-    private static final int UID = 2;
-    private static final int INITIAL_PID = 3;
-    private static final String CHANNEL_ID = "CHANNEL_ID";
-    private static final String CONTENT_TITLE = "CONTENT_TITLE";
-    private static final String OVERRIDE_GROUP_KEY = "OVERRIDE_GROUP_KEY";
-    private static final long POST_TIME = 12345L;
-    private static final UserHandle USER_HANDLE = new UserHandle(12);
-
-    @Mock
-    private IStatusBarService mBarService;
-    @Mock
-    private NotificationDataManager mNotificationDataManager;
-
-    private NotificationVisibilityLogger mNotificationVisibilityLogger;
-    private FakeExecutor mUiBgExecutor;
-    private AlertEntry mMessageNotification;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(/* testClass= */this);
-
-        mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
-        Notification.Builder mNotificationBuilder1 = new Notification.Builder(mContext, CHANNEL_ID)
-                .setContentTitle(CONTENT_TITLE);
-        mMessageNotification = new AlertEntry(new StatusBarNotification(PKG, OP_PKG,
-                ID, TAG, UID, INITIAL_PID, mNotificationBuilder1.build(), USER_HANDLE,
-                OVERRIDE_GROUP_KEY, POST_TIME));
-
-        when(mNotificationDataManager.getVisibleNotifications()).thenReturn(
-                Collections.singletonList(mMessageNotification));
-
-        mNotificationVisibilityLogger = new NotificationVisibilityLogger(
-                mUiBgExecutor, mBarService, mNotificationDataManager);
-    }
-
-    @Test
-    public void log_notifiesStatusBarService() throws RemoteException {
-        mNotificationVisibilityLogger.log(/* isVisible= */ true);
-        mUiBgExecutor.runNextReady();
-
-        verify(mBarService).onNotificationVisibilityChanged(
-                any(NotificationVisibility[].class), any(NotificationVisibility[].class));
-    }
-
-    @Test
-    public void log_isVisibleIsTrue_notifiesOfNewlyVisibleItems() throws RemoteException {
-        ArgumentCaptor<NotificationVisibility[]> newlyVisibleCaptor =
-                ArgumentCaptor.forClass(NotificationVisibility[].class);
-        ArgumentCaptor<NotificationVisibility[]> previouslyVisibleCaptor =
-                ArgumentCaptor.forClass(NotificationVisibility[].class);
-
-        mNotificationVisibilityLogger.log(/* isVisible= */ true);
-        mUiBgExecutor.runNextReady();
-
-        verify(mBarService).onNotificationVisibilityChanged(
-                newlyVisibleCaptor.capture(), previouslyVisibleCaptor.capture());
-        assertThat(newlyVisibleCaptor.getValue().length).isEqualTo(1);
-        assertThat(previouslyVisibleCaptor.getValue().length).isEqualTo(0);
-    }
-
-    @Test
-    public void log_isVisibleIsFalse_notifiesOfPreviouslyVisibleItems() throws RemoteException {
-        ArgumentCaptor<NotificationVisibility[]> newlyVisibleCaptor =
-                ArgumentCaptor.forClass(NotificationVisibility[].class);
-        ArgumentCaptor<NotificationVisibility[]> previouslyVisibleCaptor =
-                ArgumentCaptor.forClass(NotificationVisibility[].class);
-        mNotificationVisibilityLogger.log(/* isVisible= */ true);
-        mUiBgExecutor.runNextReady();
-        reset(mBarService);
-
-        mNotificationVisibilityLogger.log(/* isVisible= */ false);
-        mUiBgExecutor.runNextReady();
-
-        verify(mBarService).onNotificationVisibilityChanged(
-                newlyVisibleCaptor.capture(), previouslyVisibleCaptor.capture());
-        assertThat(previouslyVisibleCaptor.getValue().length).isEqualTo(1);
-        assertThat(newlyVisibleCaptor.getValue().length).isEqualTo(0);
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/rvc/RearViewCameraViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/rvc/RearViewCameraViewControllerTest.java
deleted file mode 100644
index a6160ec..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/rvc/RearViewCameraViewControllerTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.rvc;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-
-import android.app.ActivityView;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.car.window.OverlayViewGlobalStateController;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-
-@CarSystemUiTest
-@RunWith(MockitoJUnitRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class RearViewCameraViewControllerTest extends SysuiTestCase {
-    private static final String TEST_ACTIVITY_NAME = "testPackage/testActivity";
-    private RearViewCameraViewController mRearViewCameraViewController;
-
-    @Mock
-    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-    @Mock
-    private ActivityView mMockActivityView;
-    @Captor
-    private ArgumentCaptor<Intent> mIntentCaptor;
-
-    private void setUpRearViewCameraViewController(String testActivityName) {
-        mContext.getOrCreateTestableResources().addOverride(
-                R.string.config_rearViewCameraActivity, testActivityName);
-        mRearViewCameraViewController = new RearViewCameraViewController(
-                mContext.getOrCreateTestableResources().getResources(),
-                mOverlayViewGlobalStateController);
-        mRearViewCameraViewController.inflate((ViewGroup) LayoutInflater.from(mContext).inflate(
-                R.layout.sysui_overlay_window, /* root= */ null));
-    }
-
-    @Test
-    public void testEmptyResourceDisablesController() {
-        setUpRearViewCameraViewController("");
-
-        assertThat(mRearViewCameraViewController.isEnabled()).isFalse();
-    }
-
-    @Test
-    public void testNonEmptyResourceEnablesController() {
-        setUpRearViewCameraViewController(TEST_ACTIVITY_NAME);
-
-        assertThat(mRearViewCameraViewController.isEnabled()).isTrue();
-    }
-
-    @Test
-    public void testShowInternal() {
-        setUpRearViewCameraViewController(TEST_ACTIVITY_NAME);
-        assertThat(mRearViewCameraViewController.isShown()).isFalse();
-        assertThat(mRearViewCameraViewController.mActivityView).isNull();
-
-        mRearViewCameraViewController.showInternal();
-
-        assertThat(mRearViewCameraViewController.isShown()).isTrue();
-        assertThat(mRearViewCameraViewController.mActivityView).isNotNull();
-    }
-
-    @Test
-    public void testHideInternal() {
-        setUpRearViewCameraViewController(TEST_ACTIVITY_NAME);
-        assertThat(mRearViewCameraViewController.isShown()).isFalse();
-        mRearViewCameraViewController.showInternal();
-        assertThat(mRearViewCameraViewController.isShown()).isTrue();
-
-        mRearViewCameraViewController.hideInternal();
-
-        assertThat(mRearViewCameraViewController.isShown()).isFalse();
-        assertThat(mRearViewCameraViewController.mActivityView).isNull();
-    }
-
-    @Test
-    public void testOnActivityViewReady_fireIntent() {
-        setUpRearViewCameraViewController(TEST_ACTIVITY_NAME);
-        mRearViewCameraViewController.mActivityViewCallback.onActivityViewReady(mMockActivityView);
-
-        verify(mMockActivityView).startActivity(mIntentCaptor.capture());
-        ComponentName expectedComponent = ComponentName.unflattenFromString(TEST_ACTIVITY_NAME);
-        assertThat(mIntentCaptor.getValue().getComponent()).isEqualTo(expectedComponent);
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/rvc/RearViewCameraViewMediatorTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/rvc/RearViewCameraViewMediatorTest.java
deleted file mode 100644
index 5be8f91..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/rvc/RearViewCameraViewMediatorTest.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.rvc;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyFloat;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.car.Car;
-import android.car.VehicleAreaType;
-import android.car.VehicleGear;
-import android.car.VehiclePropertyIds;
-import android.car.hardware.CarPropertyValue;
-import android.car.hardware.property.CarPropertyManager;
-import android.car.hardware.property.CarPropertyManager.CarPropertyEventCallback;
-import android.content.BroadcastReceiver;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.testing.TestableLooper;
-import android.util.Log;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.car.CarServiceProvider.CarServiceOnConnectedListener;
-import com.android.systemui.car.CarSystemUiTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-
-@CarSystemUiTest
-@RunWith(MockitoJUnitRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class RearViewCameraViewMediatorTest extends SysuiTestCase {
-    private static final String TAG = RearViewCameraViewMediatorTest.class.getSimpleName();
-
-    private RearViewCameraViewMediator mRearViewCameraViewMediator;
-
-    @Mock
-    private CarServiceProvider mCarServiceProvider;
-    @Mock
-    private Car mCar;
-    @Mock
-    private CarPropertyManager mCarPropertyManager;
-    @Captor
-    private ArgumentCaptor<CarPropertyEventCallback> mCarPropertyEventCallbackCaptor;
-
-    @Mock
-    private BroadcastDispatcher mBroadcastDispatcher;
-    @Captor
-    private ArgumentCaptor<BroadcastReceiver> mBroadcastReceiverCaptor;
-    @Captor
-    private ArgumentCaptor<IntentFilter> mIntentFilterCaptor;
-
-    @Mock
-    private RearViewCameraViewController mRearViewCameraViewController;
-
-    @Before
-    public void setUp() throws Exception {
-        mRearViewCameraViewMediator = new RearViewCameraViewMediator(
-                mRearViewCameraViewController, mCarServiceProvider, mBroadcastDispatcher);
-    }
-
-    public void setUpListener() {
-        doAnswer(invocation -> {
-            CarServiceOnConnectedListener listener = invocation.getArgument(0);
-            listener.onConnected(mCar);
-            return null;
-        }).when(mCarServiceProvider).addListener(any(CarServiceOnConnectedListener.class));
-        when(mCar.getCarManager(Car.PROPERTY_SERVICE)).thenReturn(mCarPropertyManager);
-        when(mRearViewCameraViewController.isEnabled()).thenReturn(true);
-
-        mRearViewCameraViewMediator.registerListeners();
-
-        verify(mCarPropertyManager).registerCallback(mCarPropertyEventCallbackCaptor.capture(),
-                eq(VehiclePropertyIds.GEAR_SELECTION), anyFloat());
-        verify(mBroadcastDispatcher).registerReceiver(mBroadcastReceiverCaptor.capture(),
-                mIntentFilterCaptor.capture(), any(), any());
-        assertThat(mIntentFilterCaptor.getValue().getAction(0)).isEqualTo(
-                Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
-    }
-
-    @Test
-    public void testDoesnNotRegisterListenersWhenRearViewCameraViewControllerIsDisabled() {
-        when(mRearViewCameraViewController.isEnabled()).thenReturn(false);
-
-        mRearViewCameraViewMediator.registerListeners();
-
-        verify(mCarPropertyManager, never()).registerCallback(any(), anyInt(), anyFloat());
-        verify(mBroadcastDispatcher, never()).registerReceiver(any(), any(), any());
-    }
-
-    @Test
-    public void testGearReverseStartsRearViewCamera() {
-        setUpListener();
-
-        CarPropertyValue<Integer> gearReverse = new CarPropertyValue(
-                VehiclePropertyIds.GEAR_SELECTION, VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
-                VehicleGear.GEAR_REVERSE);
-        mCarPropertyEventCallbackCaptor.getValue().onChangeEvent(gearReverse);
-
-        verify(mRearViewCameraViewController, times(1)).start();
-    }
-
-    @Test
-    public void testGearNonReverseStopsRearViewCamera() {
-        setUpListener();
-
-        int[] nonReverseVehicleGears = new int[]{
-                VehicleGear.GEAR_NEUTRAL, VehicleGear.GEAR_PARK, VehicleGear.GEAR_DRIVE,
-                VehicleGear.GEAR_FIRST
-        };
-        for (int i = 0; i < nonReverseVehicleGears.length; ++i) {
-            Log.i(TAG, "testGearNonReverseStopsRearViewCamera: gear=" + nonReverseVehicleGears[i]);
-            CarPropertyValue<Integer> propertyGear = new CarPropertyValue(
-                    VehiclePropertyIds.GEAR_SELECTION, VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL,
-                    nonReverseVehicleGears[i]);
-            mCarPropertyEventCallbackCaptor.getValue().onChangeEvent(propertyGear);
-
-            verify(mRearViewCameraViewController, times(i + 1)).stop();
-        }
-    }
-
-    @Test
-    public void testBroadcastIntentStopsRearViewCamera() {
-        setUpListener();
-        when(mRearViewCameraViewController.isShown()).thenReturn(true);
-
-        Intent randomIntent = new Intent(Intent.ACTION_MAIN);
-        mBroadcastReceiverCaptor.getValue().onReceive(mContext, randomIntent);
-
-        verify(mRearViewCameraViewController, never()).stop();
-
-        Intent actionCloseSystemDialogs = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
-        mBroadcastReceiverCaptor.getValue().onReceive(mContext, actionCloseSystemDialogs);
-
-        verify(mRearViewCameraViewController, times(1)).stop();
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/SideLoadedAppDetectorTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/SideLoadedAppDetectorTest.java
deleted file mode 100644
index bf9ac30..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/SideLoadedAppDetectorTest.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.sideloaded;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.when;
-
-import android.app.ActivityTaskManager.RootTaskInfo;
-import android.content.ComponentName;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.InstallSourceInfo;
-import android.content.pm.PackageManager;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.testing.TestableResources;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarSystemUiTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class SideLoadedAppDetectorTest extends SysuiTestCase {
-
-    private static final String SAFE_VENDOR = "com.safe.vendor";
-    private static final String UNSAFE_VENDOR = "com.unsafe.vendor";
-    private static final String APP_PACKAGE_NAME = "com.test";
-    private static final String APP_CLASS_NAME = ".TestClass";
-
-    private SideLoadedAppDetector mSideLoadedAppDetector;
-
-    @Mock
-    private PackageManager mPackageManager;
-    @Mock
-    private CarDeviceProvisionedController mCarDeviceProvisionedController;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-
-        TestableResources testableResources = mContext.getOrCreateTestableResources();
-        String[] allowedAppInstallSources = new String[] {SAFE_VENDOR};
-        testableResources.addOverride(R.array.config_allowedAppInstallSources,
-                allowedAppInstallSources);
-
-        mSideLoadedAppDetector = new SideLoadedAppDetector(testableResources.getResources(),
-                mPackageManager,
-                mCarDeviceProvisionedController);
-    }
-
-    @Test
-    public void isSafe_systemApp_returnsTrue() throws Exception {
-        RootTaskInfo taskInfo = new RootTaskInfo();
-        taskInfo.topActivity = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME);
-
-        ApplicationInfo applicationInfo = new ApplicationInfo();
-        applicationInfo.packageName = APP_PACKAGE_NAME;
-        applicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
-
-        when(mPackageManager.getApplicationInfoAsUser(eq(APP_PACKAGE_NAME), anyInt(), any()))
-                .thenReturn(applicationInfo);
-
-        assertThat(mSideLoadedAppDetector.isSafe(taskInfo)).isTrue();
-    }
-
-    @Test
-    public void isSafe_updatedSystemApp_returnsTrue() throws Exception {
-        RootTaskInfo taskInfo = new RootTaskInfo();
-        taskInfo.topActivity = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME);
-
-        ApplicationInfo applicationInfo = new ApplicationInfo();
-        applicationInfo.packageName = APP_PACKAGE_NAME;
-        applicationInfo.flags = ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
-
-        when(mPackageManager.getApplicationInfoAsUser(eq(APP_PACKAGE_NAME), anyInt(), any()))
-                .thenReturn(applicationInfo);
-
-        assertThat(mSideLoadedAppDetector.isSafe(taskInfo)).isTrue();
-    }
-
-    @Test
-    public void isSafe_nonSystemApp_withSafeSource_returnsTrue() throws Exception {
-        InstallSourceInfo sourceInfo = new InstallSourceInfo(SAFE_VENDOR,
-                /* initiatingPackageSigningInfo= */null,
-                /* originatingPackageName= */ null,
-                /* installingPackageName= */ null);
-        RootTaskInfo taskInfo = new RootTaskInfo();
-        taskInfo.topActivity = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME);
-
-        ApplicationInfo applicationInfo = new ApplicationInfo();
-        applicationInfo.packageName = APP_PACKAGE_NAME;
-
-        when(mPackageManager.getApplicationInfoAsUser(eq(APP_PACKAGE_NAME), anyInt(), any()))
-                .thenReturn(applicationInfo);
-        when(mPackageManager.getInstallSourceInfo(APP_PACKAGE_NAME)).thenReturn(sourceInfo);
-
-        assertThat(mSideLoadedAppDetector.isSafe(taskInfo)).isTrue();
-    }
-
-    @Test
-    public void isSafe_nonSystemApp_withUnsafeSource_returnsFalse() throws Exception {
-        InstallSourceInfo sourceInfo = new InstallSourceInfo(UNSAFE_VENDOR,
-                /* initiatingPackageSigningInfo= */null,
-                /* originatingPackageName= */ null,
-                /* installingPackageName= */ null);
-        RootTaskInfo taskInfo = new RootTaskInfo();
-        taskInfo.topActivity = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME);
-
-        ApplicationInfo applicationInfo = new ApplicationInfo();
-        applicationInfo.packageName = APP_PACKAGE_NAME;
-
-        when(mPackageManager.getApplicationInfoAsUser(eq(APP_PACKAGE_NAME), anyInt(), any()))
-                .thenReturn(applicationInfo);
-        when(mPackageManager.getInstallSourceInfo(APP_PACKAGE_NAME)).thenReturn(sourceInfo);
-
-        assertThat(mSideLoadedAppDetector.isSafe(taskInfo)).isFalse();
-    }
-
-    @Test
-    public void isSafe_nonSystemApp_withoutSource_returnsFalse() throws Exception {
-        InstallSourceInfo sourceInfo = new InstallSourceInfo(null,
-                /* initiatingPackageSigningInfo= */null,
-                /* originatingPackageName= */ null,
-                /* installingPackageName= */ null);
-        RootTaskInfo taskInfo = new RootTaskInfo();
-        taskInfo.topActivity = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME);
-
-        ApplicationInfo applicationInfo = new ApplicationInfo();
-        applicationInfo.packageName = APP_PACKAGE_NAME;
-
-        when(mPackageManager.getApplicationInfoAsUser(eq(APP_PACKAGE_NAME), anyInt(), any()))
-                .thenReturn(applicationInfo);
-        when(mPackageManager.getInstallSourceInfo(APP_PACKAGE_NAME)).thenReturn(sourceInfo);
-
-        assertThat(mSideLoadedAppDetector.isSafe(taskInfo)).isFalse();
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/SideLoadedAppListenerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/SideLoadedAppListenerTest.java
deleted file mode 100644
index 0b5f68f..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/SideLoadedAppListenerTest.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.sideloaded;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.ActivityTaskManager.RootTaskInfo;
-import android.app.IActivityTaskManager;
-import android.content.ComponentName;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.DisplayManagerGlobal;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.Display;
-import android.view.DisplayAdjustments;
-import android.view.DisplayInfo;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarSystemUiTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class SideLoadedAppListenerTest extends SysuiTestCase {
-
-    private static final String APP_PACKAGE_NAME = "com.test";
-    private static final String APP_CLASS_NAME = ".TestClass";
-
-    private SideLoadedAppListener mSideLoadedAppListener;
-
-    @Mock
-    private SideLoadedAppDetector mSideLoadedAppDetector;
-    @Mock
-    private DisplayManager mDisplayManager;
-    @Mock
-    private IActivityTaskManager mActivityTaskManager;
-    @Mock
-    private SideLoadedAppStateController mSideLoadedAppStateController;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-
-        mSideLoadedAppListener = new SideLoadedAppListener(mSideLoadedAppDetector,
-                mActivityTaskManager, mDisplayManager, mSideLoadedAppStateController);
-    }
-
-    @Test
-    public void onTaskCreated_safeTask_callsNoMethods() throws Exception {
-        int taskId = 999;
-        int displayId = 123;
-        ComponentName componentName = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME);
-
-        RootTaskInfo taskInfo1 = createTask(1, /* isVisible= */ true);
-        taskInfo1.childTaskIds = new int[] { 11, 22, 33 };
-
-        RootTaskInfo taskInfo2 = createTask(2, /* isVisible= */ true);
-        taskInfo2.childTaskIds = new int[] { 111, 222, 333, taskId };
-        taskInfo2.displayId = displayId;
-
-        List<RootTaskInfo> taskInfoList = Arrays.asList(taskInfo1, taskInfo2);
-
-        when(mActivityTaskManager.getAllRootTaskInfos()).thenReturn(taskInfoList);
-        when(mSideLoadedAppDetector.isSafe(taskInfo2)).thenReturn(true);
-
-        mSideLoadedAppListener.onTaskCreated(taskId, componentName);
-
-        verify(mSideLoadedAppDetector, never()).isSafe(taskInfo1);
-        verify(mSideLoadedAppDetector).isSafe(taskInfo2);
-
-        verify(mSideLoadedAppStateController, never()).onUnsafeTaskCreatedOnDisplay(any());
-        verify(mSideLoadedAppStateController, never()).onSafeTaskDisplayedOnDisplay(any());
-        verify(mSideLoadedAppStateController, never()).onUnsafeTaskDisplayedOnDisplay(any());
-    }
-
-    @Test
-    public void onTaskCreated_unsafeTask_callsUnsafeTaskCreated() throws Exception {
-        int taskId = 999;
-        int displayId = 123;
-        ComponentName componentName = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME);
-
-        RootTaskInfo taskInfo1 = createTask(1, /* isVisible= */ true);
-        taskInfo1.childTaskIds = new int[] { 11, 22, 33 };
-        RootTaskInfo taskInfo2 = createTask(2, /* isVisible= */ true);
-        taskInfo2.childTaskIds = new int[] { 111, 222, 333, taskId };
-        taskInfo2.displayId = displayId;
-        List<RootTaskInfo> taskInfoList = Arrays.asList(taskInfo1, taskInfo2);
-
-        Display display = createDisplay(displayId);
-
-        when(mActivityTaskManager.getAllRootTaskInfos()).thenReturn(taskInfoList);
-        when(mSideLoadedAppDetector.isSafe(taskInfo2)).thenReturn(false);
-        when(mDisplayManager.getDisplay(displayId)).thenReturn(display);
-
-        mSideLoadedAppListener.onTaskCreated(taskId, componentName);
-
-        verify(mSideLoadedAppDetector, never()).isSafe(taskInfo1);
-        verify(mSideLoadedAppDetector).isSafe(taskInfo2);
-
-        verify(mSideLoadedAppStateController).onUnsafeTaskCreatedOnDisplay(display);
-        verify(mSideLoadedAppStateController, never()).onSafeTaskDisplayedOnDisplay(any());
-        verify(mSideLoadedAppStateController, never()).onUnsafeTaskDisplayedOnDisplay(any());
-    }
-
-    @Test
-    public void onTaskStackChanged_safeTask_callsSafeTaskDisplayed() throws Exception {
-        Display display = createDisplay(123);
-        RootTaskInfo taskInfo1 = createTask(1, /* isVisible= */ false);
-        RootTaskInfo taskInfo2 = createTask(2, /* isVisible= */ true);
-        RootTaskInfo taskInfo3 = createTask(3, /* isVisible= */ true);
-        List<RootTaskInfo> taskInfoList = Arrays.asList(taskInfo1, taskInfo2, taskInfo3);
-
-        when(mActivityTaskManager.getAllRootTaskInfosOnDisplay(display.getDisplayId()))
-                .thenReturn(taskInfoList);
-        when(mSideLoadedAppDetector.isSafe(taskInfo2)).thenReturn(true);
-        when(mDisplayManager.getDisplays()).thenReturn(new Display[] { display });
-
-        mSideLoadedAppListener.onTaskStackChanged();
-
-        verify(mSideLoadedAppDetector, never()).isSafe(taskInfo1);
-        verify(mSideLoadedAppDetector).isSafe(taskInfo2);
-        verify(mSideLoadedAppDetector, never()).isSafe(taskInfo3);
-
-        verify(mSideLoadedAppStateController, never()).onUnsafeTaskCreatedOnDisplay(any());
-        verify(mSideLoadedAppStateController).onSafeTaskDisplayedOnDisplay(display);
-        verify(mSideLoadedAppStateController, never()).onUnsafeTaskDisplayedOnDisplay(any());
-    }
-
-    @Test
-    public void onTaskStackChanged_unsafeTask_callsUnsafeTaskDisplayed() throws Exception {
-        Display display = createDisplay(123);
-        RootTaskInfo taskInfo1 = createTask(1, /* isVisible= */ false);
-        RootTaskInfo taskInfo2 = createTask(2, /* isVisible= */ true);
-        RootTaskInfo taskInfo3 = createTask(3, /* isVisible= */ true);
-        List<RootTaskInfo> taskInfoList = Arrays.asList(taskInfo1, taskInfo2, taskInfo3);
-
-        when(mActivityTaskManager.getAllRootTaskInfosOnDisplay(display.getDisplayId()))
-                .thenReturn(taskInfoList);
-        when(mSideLoadedAppDetector.isSafe(taskInfo2)).thenReturn(false);
-        when(mDisplayManager.getDisplays()).thenReturn(new Display[] { display });
-
-        mSideLoadedAppListener.onTaskStackChanged();
-
-        verify(mSideLoadedAppDetector, never()).isSafe(taskInfo1);
-        verify(mSideLoadedAppDetector).isSafe(taskInfo2);
-        verify(mSideLoadedAppDetector, never()).isSafe(taskInfo3);
-
-        verify(mSideLoadedAppStateController, never()).onUnsafeTaskCreatedOnDisplay(any());
-        verify(mSideLoadedAppStateController, never()).onSafeTaskDisplayedOnDisplay(any());
-        verify(mSideLoadedAppStateController).onUnsafeTaskDisplayedOnDisplay(display);
-    }
-
-    @Test
-    public void onTaskStackChanged_multiDisplay_callsTasksDisplayed() throws Exception {
-        Display display1 = createDisplay(1);
-        RootTaskInfo taskInfo1 = createTask(1, /* isVisible= */ false);
-        RootTaskInfo taskInfo2 = createTask(2, /* isVisible= */ true);
-        RootTaskInfo taskInfo3 = createTask(3, /* isVisible= */ true);
-        List<RootTaskInfo> display1Tasks = Arrays.asList(taskInfo1, taskInfo2, taskInfo3);
-
-        Display display2 = createDisplay(2);
-        RootTaskInfo taskInfo4 = createTask(4, /* isVisible= */ true);
-        List<RootTaskInfo> display2Tasks = Collections.singletonList(taskInfo4);
-
-        Display display3 = createDisplay(3);
-        RootTaskInfo taskInfo5 = createTask(5, /* isVisible= */ true);
-        List<RootTaskInfo> display3Tasks = Collections.singletonList(taskInfo5);
-
-        when(mActivityTaskManager.getAllRootTaskInfosOnDisplay(display1.getDisplayId()))
-                .thenReturn(display1Tasks);
-        when(mActivityTaskManager.getAllRootTaskInfosOnDisplay(display2.getDisplayId()))
-                .thenReturn(display2Tasks);
-        when(mActivityTaskManager.getAllRootTaskInfosOnDisplay(display3.getDisplayId()))
-                .thenReturn(display3Tasks);
-
-        when(mSideLoadedAppDetector.isSafe(taskInfo2)).thenReturn(true);
-        when(mSideLoadedAppDetector.isSafe(taskInfo4)).thenReturn(false);
-        when(mSideLoadedAppDetector.isSafe(taskInfo5)).thenReturn(true);
-
-        when(mDisplayManager.getDisplays())
-                .thenReturn(new Display[] { display1, display2, display3});
-
-        mSideLoadedAppListener.onTaskStackChanged();
-
-        verify(mSideLoadedAppDetector, never()).isSafe(taskInfo1);
-        verify(mSideLoadedAppDetector).isSafe(taskInfo2);
-        verify(mSideLoadedAppDetector, never()).isSafe(taskInfo3);
-        verify(mSideLoadedAppDetector).isSafe(taskInfo4);
-        verify(mSideLoadedAppDetector).isSafe(taskInfo5);
-
-        verify(mSideLoadedAppStateController, never()).onUnsafeTaskCreatedOnDisplay(any());
-        verify(mSideLoadedAppStateController).onSafeTaskDisplayedOnDisplay(display1);
-        verify(mSideLoadedAppStateController).onUnsafeTaskDisplayedOnDisplay(display2);
-        verify(mSideLoadedAppStateController).onSafeTaskDisplayedOnDisplay(display3);
-        verify(mSideLoadedAppStateController, never()).onUnsafeTaskDisplayedOnDisplay(display1);
-        verify(mSideLoadedAppStateController).onUnsafeTaskDisplayedOnDisplay(display2);
-        verify(mSideLoadedAppStateController, never()).onUnsafeTaskDisplayedOnDisplay(display3);
-    }
-
-    private Display createDisplay(int id) {
-        return new Display(DisplayManagerGlobal.getInstance(),
-                id,
-                new DisplayInfo(),
-                DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS);
-    }
-
-    private RootTaskInfo createTask(int id, boolean isVisible) {
-        RootTaskInfo taskInfo = new RootTaskInfo();
-        taskInfo.taskId = id;
-        taskInfo.visible = isVisible;
-        return taskInfo;
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/statusbar/UserNameViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/statusbar/UserNameViewControllerTest.java
deleted file mode 100644
index ac7edd3..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/statusbar/UserNameViewControllerTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.statusbar;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-import android.car.Car;
-import android.car.user.CarUserManager;
-import android.content.BroadcastReceiver;
-import android.content.Intent;
-import android.content.pm.UserInfo;
-import android.os.UserManager;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.View;
-import android.widget.TextView;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.car.CarSystemUiTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class UserNameViewControllerTest extends SysuiTestCase {
-
-    private final UserInfo mUserInfo1 = new UserInfo(/* id= */ 0, "Test User Name", /* flags= */ 0);
-    private final UserInfo mUserInfo2 = new UserInfo(/* id= */ 1, "Another User", /* flags= */ 0);
-    private TextView mTextView;
-    private UserNameViewController mUserNameViewController;
-
-    @Mock
-    private Car mCar;
-    @Mock
-    private CarUserManager mCarUserManager;
-    @Mock
-    private UserManager mUserManager;
-    @Mock
-    private CarDeviceProvisionedController mCarDeviceProvisionedController;
-    @Mock
-    private BroadcastDispatcher mBroadcastDispatcher;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        when(mUserManager.getUserInfo(mUserInfo1.id)).thenReturn(mUserInfo1);
-        when(mUserManager.getUserInfo(mUserInfo2.id)).thenReturn(mUserInfo2);
-        when(mCar.isConnected()).thenReturn(true);
-        when(mCar.getCarManager(Car.CAR_USER_SERVICE)).thenReturn(mCarUserManager);
-
-        CarServiceProvider carServiceProvider = new CarServiceProvider(mContext, mCar);
-        mUserNameViewController = new UserNameViewController(getContext(), carServiceProvider,
-                mUserManager, mBroadcastDispatcher, mCarDeviceProvisionedController);
-
-        mTextView = new TextView(getContext());
-        mTextView.setId(R.id.user_name_text);
-    }
-
-    @Test
-    public void addUserNameViewToController_updatesUserNameView() {
-        when(mCarDeviceProvisionedController.getCurrentUser()).thenReturn(mUserInfo1.id);
-
-        mUserNameViewController.addUserNameView(mTextView);
-
-        assertEquals(mTextView.getText(), mUserInfo1.name);
-    }
-
-    @Test
-    public void addUserNameViewToController_withNoTextView_doesNotUpdate() {
-        View nullView = new View(getContext());
-        mUserNameViewController.addUserNameView(nullView);
-
-        assertEquals(mTextView.getText(), "");
-        verifyZeroInteractions(mCarDeviceProvisionedController);
-        verifyZeroInteractions(mCarUserManager);
-        verifyZeroInteractions(mUserManager);
-    }
-
-    @Test
-    public void removeAll_withNoRegisteredListener_doesNotUnregister() {
-        mUserNameViewController.removeAll();
-
-        verifyZeroInteractions(mCarUserManager);
-    }
-
-    @Test
-    public void userLifecycleListener_onUserSwitchLifecycleEvent_updatesUserNameView() {
-        ArgumentCaptor<CarUserManager.UserLifecycleListener> userLifecycleListenerArgumentCaptor =
-                ArgumentCaptor.forClass(CarUserManager.UserLifecycleListener.class);
-        when(mCarDeviceProvisionedController.getCurrentUser()).thenReturn(mUserInfo1.id);
-        // Add the initial TextView, which registers the UserLifecycleListener
-        mUserNameViewController.addUserNameView(mTextView);
-        assertEquals(mTextView.getText(), mUserInfo1.name);
-        verify(mCarUserManager).addListener(any(), userLifecycleListenerArgumentCaptor.capture());
-
-        CarUserManager.UserLifecycleEvent event = new CarUserManager.UserLifecycleEvent(
-                CarUserManager.USER_LIFECYCLE_EVENT_TYPE_SWITCHING, /* from= */ mUserInfo1.id,
-                /* to= */ mUserInfo2.id);
-        userLifecycleListenerArgumentCaptor.getValue().onEvent(event);
-
-        assertEquals(mTextView.getText(), mUserInfo2.name);
-    }
-
-    @Test
-    public void userInfoChangedBroadcast_withoutInitializingUserNameView_doesNothing() {
-        getContext().sendBroadcast(new Intent(Intent.ACTION_USER_INFO_CHANGED));
-
-        assertEquals(mTextView.getText(), "");
-        verifyZeroInteractions(mCarDeviceProvisionedController);
-    }
-
-    @Test
-    public void userInfoChangedBroadcast_withUserNameViewInitialized_updatesUserNameView() {
-        ArgumentCaptor<BroadcastReceiver> broadcastReceiverArgumentCaptor = ArgumentCaptor.forClass(
-                BroadcastReceiver.class);
-        when(mCarDeviceProvisionedController.getCurrentUser()).thenReturn(mUserInfo1.id);
-        mUserNameViewController.addUserNameView(mTextView);
-        assertEquals(mTextView.getText(), mUserInfo1.name);
-        verify(mBroadcastDispatcher).registerReceiver(broadcastReceiverArgumentCaptor.capture(),
-                any(), any(), any());
-
-        reset(mCarDeviceProvisionedController);
-        when(mCarDeviceProvisionedController.getCurrentUser()).thenReturn(mUserInfo2.id);
-        broadcastReceiverArgumentCaptor.getValue().onReceive(getContext(),
-                new Intent(Intent.ACTION_USER_INFO_CHANGED));
-
-        assertEquals(mTextView.getText(), mUserInfo2.name);
-        verify(mCarDeviceProvisionedController).getCurrentUser();
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewControllerTest.java
deleted file mode 100644
index 2e9d43b..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewControllerTest.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.userswitcher;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.os.Handler;
-import android.os.UserManager;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.testing.TestableResources;
-import android.view.IWindowManager;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.car.window.OverlayViewGlobalStateController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class UserSwitchTransitionViewControllerTest extends SysuiTestCase {
-    private static final int TEST_USER_1 = 100;
-    private static final int TEST_USER_2 = 110;
-
-    private TestableUserSwitchTransitionViewController mCarUserSwitchingDialogController;
-    private TestableResources mTestableResources;
-    @Mock
-    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-    @Mock
-    private IWindowManager mWindowManagerService;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mTestableResources = mContext.getOrCreateTestableResources();
-        mCarUserSwitchingDialogController = new TestableUserSwitchTransitionViewController(
-                mContext,
-                Handler.getMain(),
-                mTestableResources.getResources(),
-                (UserManager) mContext.getSystemService(Context.USER_SERVICE),
-                mWindowManagerService,
-                mOverlayViewGlobalStateController
-        );
-
-        mCarUserSwitchingDialogController.inflate((ViewGroup) LayoutInflater.from(mContext).inflate(
-                R.layout.sysui_overlay_window, /* root= */ null));
-    }
-
-    @Test
-    public void onHandleShow_newUserSelected_showsDialog() {
-        mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1);
-
-        verify(mOverlayViewGlobalStateController).showView(eq(mCarUserSwitchingDialogController),
-                any());
-    }
-
-    @Test
-    public void onHandleShow_alreadyShowing_ignoresRequest() {
-        mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1);
-        mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_2);
-
-        // Verify that the request was processed only once.
-        verify(mOverlayViewGlobalStateController).showView(eq(mCarUserSwitchingDialogController),
-                any());
-    }
-
-    @Test
-    public void onHandleShow_sameUserSelected_ignoresRequest() {
-        mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1);
-        mCarUserSwitchingDialogController.handleHide();
-        mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1);
-
-        // Verify that the request was processed only once.
-        verify(mOverlayViewGlobalStateController).showView(eq(mCarUserSwitchingDialogController),
-                any());
-    }
-
-    @Test
-    public void onHide_currentlyShowing_hidesDialog() {
-        mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1);
-        mCarUserSwitchingDialogController.handleHide();
-
-        verify(mOverlayViewGlobalStateController).hideView(eq(mCarUserSwitchingDialogController),
-                any());
-    }
-
-    @Test
-    public void onHide_notShowing_ignoresRequest() {
-        mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1);
-        mCarUserSwitchingDialogController.handleHide();
-        mCarUserSwitchingDialogController.handleHide();
-
-        // Verify that the request was processed only once.
-        verify(mOverlayViewGlobalStateController).hideView(eq(mCarUserSwitchingDialogController),
-                any());
-    }
-
-    @Test
-    public void onWindowShownTimeoutPassed_viewNotHidden_hidesUserSwitchTransitionView() {
-        mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1);
-        reset(mOverlayViewGlobalStateController);
-
-        getContext().getMainThreadHandler().postDelayed(() -> {
-            verify(mOverlayViewGlobalStateController).hideView(
-                    eq(mCarUserSwitchingDialogController), any());
-        }, mCarUserSwitchingDialogController.getWindowShownTimeoutMs() + 10);
-    }
-
-    @Test
-    public void onWindowShownTimeoutPassed_viewHidden_doesNotHideUserSwitchTransitionViewAgain() {
-        mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1);
-        mCarUserSwitchingDialogController.handleHide();
-        reset(mOverlayViewGlobalStateController);
-
-        getContext().getMainThreadHandler().postDelayed(() -> {
-            verify(mOverlayViewGlobalStateController, never()).hideView(
-                    eq(mCarUserSwitchingDialogController), any());
-        }, mCarUserSwitchingDialogController.getWindowShownTimeoutMs() + 10);
-    }
-
-    private final class TestableUserSwitchTransitionViewController extends
-            UserSwitchTransitionViewController {
-
-        private final Handler mHandler;
-
-        TestableUserSwitchTransitionViewController(Context context, Handler handler,
-                Resources resources, UserManager userManager,
-                IWindowManager windowManagerService,
-                OverlayViewGlobalStateController overlayViewGlobalStateController) {
-            super(context, handler, resources, userManager, windowManagerService,
-                    overlayViewGlobalStateController);
-            mHandler = handler;
-        }
-
-        @Override
-        public void handleShow(int currentUserId) {
-            super.handleShow(currentUserId);
-            waitForIdleSync(mHandler);
-        }
-
-        @Override
-        public void handleHide() {
-            super.handleHide();
-            waitForIdleSync(mHandler);
-        }
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewMediatorTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewMediatorTest.java
deleted file mode 100644
index 7aeffce..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewMediatorTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.userswitcher;
-
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.car.user.CarUserManager;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarServiceProvider;
-import com.android.systemui.car.CarSystemUiTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class UserSwitchTransitionViewMediatorTest extends SysuiTestCase {
-    private static final int TEST_USER = 100;
-
-    private UserSwitchTransitionViewMediator mUserSwitchTransitionViewMediator;
-    @Mock
-    private CarServiceProvider mCarServiceProvider;
-    @Mock
-    private CarDeviceProvisionedController mCarDeviceProvisionedController;
-    @Mock
-    private UserSwitchTransitionViewController mUserSwitchTransitionViewController;
-    @Mock
-    private CarUserManager.UserLifecycleEvent mUserLifecycleEvent;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mUserSwitchTransitionViewMediator = new UserSwitchTransitionViewMediator(
-                mCarServiceProvider, mCarDeviceProvisionedController,
-                mUserSwitchTransitionViewController);
-        when(mCarDeviceProvisionedController.getCurrentUser()).thenReturn(TEST_USER);
-    }
-
-    @Test
-    public void onUserLifecycleEvent_userStarting_isCurrentUser_callsHandleShow() {
-        when(mUserLifecycleEvent.getEventType()).thenReturn(
-                CarUserManager.USER_LIFECYCLE_EVENT_TYPE_STARTING);
-        when(mUserLifecycleEvent.getUserId()).thenReturn(TEST_USER);
-
-        mUserSwitchTransitionViewMediator.handleUserLifecycleEvent(mUserLifecycleEvent);
-
-        verify(mUserSwitchTransitionViewController).handleShow(TEST_USER);
-    }
-
-    @Test
-    public void onUserLifecycleEvent_userStarting_isNotCurrentUser_doesNotCallHandleShow() {
-        when(mUserLifecycleEvent.getEventType()).thenReturn(
-                CarUserManager.USER_LIFECYCLE_EVENT_TYPE_STARTING);
-        when(mUserLifecycleEvent.getUserId()).thenReturn(TEST_USER);
-        when(mCarDeviceProvisionedController.getCurrentUser()).thenReturn(TEST_USER + 1);
-
-        mUserSwitchTransitionViewMediator.handleUserLifecycleEvent(mUserLifecycleEvent);
-
-        verify(mUserSwitchTransitionViewController, never()).handleShow(TEST_USER);
-    }
-
-    @Test
-    public void onUserLifecycleEvent_userSwitching_callsHandleHide() {
-        when(mUserLifecycleEvent.getEventType()).thenReturn(
-                CarUserManager.USER_LIFECYCLE_EVENT_TYPE_SWITCHING);
-        mUserSwitchTransitionViewMediator.handleUserLifecycleEvent(mUserLifecycleEvent);
-
-        verify(mUserSwitchTransitionViewController).handleHide();
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifierTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifierTest.java
deleted file mode 100644
index f77294e..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifierTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.voicerecognition;
-
-import static com.android.systemui.car.voicerecognition.ConnectedDeviceVoiceRecognitionNotifier.INVALID_VALUE;
-import static com.android.systemui.car.voicerecognition.ConnectedDeviceVoiceRecognitionNotifier.VOICE_RECOGNITION_STARTED;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadsetClient;
-import android.content.Intent;
-import android.os.Handler;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarSystemUiTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-// TODO(b/162866441): Refactor to use the Executor pattern instead.
-public class ConnectedDeviceVoiceRecognitionNotifierTest extends SysuiTestCase {
-
-    private static final String BLUETOOTH_PERM = android.Manifest.permission.BLUETOOTH;
-    private static final String BLUETOOTH_REMOTE_ADDRESS = "00:11:22:33:44:55";
-
-    private ConnectedDeviceVoiceRecognitionNotifier mVoiceRecognitionNotifier;
-    private TestableLooper mTestableLooper;
-    private Handler mHandler;
-    private Handler mTestHandler;
-    private BluetoothDevice mBluetoothDevice;
-
-    @Before
-    public void setUp() throws Exception {
-        mTestableLooper = TestableLooper.get(this);
-        mHandler = new Handler(mTestableLooper.getLooper());
-        mTestHandler = spy(mHandler);
-        mBluetoothDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(
-                BLUETOOTH_REMOTE_ADDRESS);
-        mVoiceRecognitionNotifier = new ConnectedDeviceVoiceRecognitionNotifier(
-                mContext, mTestHandler);
-        mVoiceRecognitionNotifier.onBootCompleted();
-    }
-
-    @Test
-    public void testReceiveIntent_started_showToast() {
-        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
-        intent.putExtra(BluetoothHeadsetClient.EXTRA_VOICE_RECOGNITION, VOICE_RECOGNITION_STARTED);
-        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mBluetoothDevice);
-
-        mContext.sendBroadcast(intent, BLUETOOTH_PERM);
-        mTestableLooper.processAllMessages();
-        waitForIdleSync();
-
-        mHandler.post(() -> {
-            ArgumentCaptor<Runnable> argumentCaptor = ArgumentCaptor.forClass(Runnable.class);
-            verify(mTestHandler).post(argumentCaptor.capture());
-            assertThat(argumentCaptor.getValue()).isNotNull();
-            assertThat(argumentCaptor.getValue()).isNotEqualTo(this);
-        });
-    }
-
-    @Test
-    public void testReceiveIntent_invalidExtra_noToast() {
-        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
-        intent.putExtra(BluetoothHeadsetClient.EXTRA_VOICE_RECOGNITION, INVALID_VALUE);
-        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mBluetoothDevice);
-
-        mContext.sendBroadcast(intent, BLUETOOTH_PERM);
-        mTestableLooper.processAllMessages();
-        waitForIdleSync();
-
-        mHandler.post(() -> {
-            verify(mTestHandler, never()).post(any());
-        });
-    }
-
-    @Test
-    public void testReceiveIntent_noExtra_noToast() {
-        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
-        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mBluetoothDevice);
-
-        mContext.sendBroadcast(intent, BLUETOOTH_PERM);
-        mTestableLooper.processAllMessages();
-        waitForIdleSync();
-
-        mHandler.post(() -> {
-            verify(mTestHandler, never()).post(any());
-        });
-    }
-
-    @Test
-    public void testReceiveIntent_invalidIntent_noToast() {
-        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AUDIO_STATE_CHANGED);
-        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mBluetoothDevice);
-
-        mContext.sendBroadcast(intent, BLUETOOTH_PERM);
-        mTestableLooper.processAllMessages();
-        waitForIdleSync();
-
-        mHandler.post(() -> {
-            verify(mTestHandler, never()).post(any());
-        });
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java
deleted file mode 100644
index f5f3ea3..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.window;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyFloat;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.animation.Animator;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Rect;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarDeviceProvisionedController;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.tests.R;
-import com.android.wm.shell.animation.FlingAnimationUtils;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class OverlayPanelViewControllerTest extends SysuiTestCase {
-    private TestOverlayPanelViewController mOverlayPanelViewController;
-    private ViewGroup mBaseLayout;
-
-    @Mock
-    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-    @Mock
-    private FlingAnimationUtils.Builder mFlingAnimationUtilsBuilder;
-    @Mock
-    private FlingAnimationUtils mFlingAnimationUtils;
-    @Mock
-    private CarDeviceProvisionedController mCarDeviceProvisionedController;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mBaseLayout = (ViewGroup) LayoutInflater.from(mContext).inflate(
-                R.layout.overlay_view_controller_test, /* root= */ null);
-
-        when(mFlingAnimationUtilsBuilder.setMaxLengthSeconds(anyFloat())).thenReturn(
-                mFlingAnimationUtilsBuilder);
-        when(mFlingAnimationUtilsBuilder.setSpeedUpFactor(anyFloat())).thenReturn(
-                mFlingAnimationUtilsBuilder);
-        when(mFlingAnimationUtilsBuilder.build()).thenReturn(mFlingAnimationUtils);
-        mOverlayPanelViewController = new TestOverlayPanelViewController(
-                getContext(),
-                getContext().getOrCreateTestableResources().getResources(),
-                R.id.overlay_view_controller_stub,
-                mOverlayViewGlobalStateController,
-                mFlingAnimationUtilsBuilder,
-                mCarDeviceProvisionedController);
-    }
-
-    @Test
-    public void toggle_notInflated_inflates() {
-        assertThat(mOverlayPanelViewController.isInflated()).isFalse();
-
-        mOverlayPanelViewController.toggle();
-
-        verify(mOverlayViewGlobalStateController).inflateView(mOverlayPanelViewController);
-    }
-
-    @Test
-    public void toggle_inflated_doesNotInflate() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        assertThat(mOverlayPanelViewController.isInflated()).isTrue();
-
-        mOverlayPanelViewController.toggle();
-
-        verify(mOverlayViewGlobalStateController, never()).inflateView(mOverlayPanelViewController);
-    }
-
-    @Test
-    public void toggle_notExpanded_panelExpands() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setPanelExpanded(false);
-
-        mOverlayPanelViewController.toggle();
-
-        assertThat(mOverlayPanelViewController.mAnimateExpandPanelCalled).isTrue();
-    }
-
-    @Test
-    public void toggle_expanded_panelCollapses() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setPanelExpanded(true);
-
-        mOverlayPanelViewController.toggle();
-
-        assertThat(mOverlayPanelViewController.mAnimateCollapsePanelCalled).isTrue();
-    }
-
-    @Test
-    public void animateCollapsePanel_shouldNotAnimateCollapsePanel_doesNotCollapse() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateCollapsePanel(false);
-
-        mOverlayPanelViewController.animateCollapsePanel();
-
-        assertThat(mOverlayPanelViewController.mAnimateCollapsePanelCalled).isTrue();
-        assertThat(mOverlayPanelViewController.mOnAnimateCollapsePanelCalled).isFalse();
-    }
-
-    @Test
-    public void animateCollapsePanel_isNotExpanded_doesNotCollapse() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateCollapsePanel(true);
-        mOverlayPanelViewController.setPanelExpanded(false);
-
-        mOverlayPanelViewController.animateCollapsePanel();
-
-        assertThat(mOverlayPanelViewController.mAnimateCollapsePanelCalled).isTrue();
-        assertThat(mOverlayPanelViewController.mOnAnimateCollapsePanelCalled).isFalse();
-    }
-
-    @Test
-    public void animateCollapsePanel_isNotVisible_doesNotCollapse() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateCollapsePanel(true);
-        mOverlayPanelViewController.setPanelExpanded(true);
-        mOverlayPanelViewController.setPanelVisible(false);
-
-        mOverlayPanelViewController.animateCollapsePanel();
-
-        assertThat(mOverlayPanelViewController.mAnimateCollapsePanelCalled).isTrue();
-        assertThat(mOverlayPanelViewController.mOnAnimateCollapsePanelCalled).isFalse();
-    }
-
-    @Test
-    public void animateCollapsePanel_collapses() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateCollapsePanel(true);
-        mOverlayPanelViewController.setPanelExpanded(true);
-        mOverlayPanelViewController.setPanelVisible(true);
-
-        mOverlayPanelViewController.animateCollapsePanel();
-
-        assertThat(mOverlayPanelViewController.mOnAnimateCollapsePanelCalled).isTrue();
-    }
-
-    @Test
-    public void animateCollapsePanel_withOverlayFromTopBar_collapsesTowardsTopBar() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        // Mock a panel that has layout size 50 and where the panel is opened.
-        int size = 50;
-        mockPanelWithSize(size);
-        mOverlayPanelViewController.getLayout().setClipBounds(
-                new Rect(0, 0, size, size));
-        mOverlayPanelViewController.setShouldAnimateCollapsePanel(true);
-        mOverlayPanelViewController.setPanelExpanded(true);
-        mOverlayPanelViewController.setPanelVisible(true);
-        mOverlayPanelViewController.setOverlayDirection(
-                OverlayPanelViewController.OVERLAY_FROM_TOP_BAR);
-
-        mOverlayPanelViewController.animateCollapsePanel();
-
-        ArgumentCaptor<Float> endValueCaptor = ArgumentCaptor.forClass(Float.class);
-        verify(mFlingAnimationUtils).apply(
-                any(Animator.class), anyFloat(), endValueCaptor.capture(), anyFloat());
-        assertThat(endValueCaptor.getValue().intValue()).isEqualTo(0);
-    }
-
-    @Test
-    public void animateCollapsePanel_withOverlayFromBottomBar_collapsesTowardsBottomBar() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        // Mock a panel that has layout size 50 and where the panel is opened.
-        int size = 50;
-        mockPanelWithSize(size);
-        mOverlayPanelViewController.getLayout().setClipBounds(
-                new Rect(0, 0, size, size));
-        mOverlayPanelViewController.setShouldAnimateCollapsePanel(true);
-        mOverlayPanelViewController.setPanelExpanded(true);
-        mOverlayPanelViewController.setPanelVisible(true);
-        mOverlayPanelViewController.setOverlayDirection(
-                OverlayPanelViewController.OVERLAY_FROM_BOTTOM_BAR);
-
-        mOverlayPanelViewController.animateCollapsePanel();
-
-        ArgumentCaptor<Float> endValueCaptor = ArgumentCaptor.forClass(Float.class);
-        verify(mFlingAnimationUtils).apply(
-                any(Animator.class), anyFloat(), endValueCaptor.capture(), anyFloat());
-        assertThat(endValueCaptor.getValue().intValue()).isEqualTo(
-                mOverlayPanelViewController.getLayout().getHeight());
-    }
-
-    @Test
-    public void animateExpandPanel_shouldNotAnimateExpandPanel_doesNotExpand() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateExpandPanel(false);
-
-        mOverlayPanelViewController.animateExpandPanel();
-
-        assertThat(mOverlayPanelViewController.mAnimateExpandPanelCalled).isTrue();
-        assertThat(mOverlayPanelViewController.mOnAnimateExpandPanelCalled).isFalse();
-    }
-
-    @Test
-    public void animateExpandPanel_userNotSetup_doesNotExpand() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(false);
-
-        mOverlayPanelViewController.animateExpandPanel();
-
-        assertThat(mOverlayPanelViewController.mAnimateExpandPanelCalled).isTrue();
-        assertThat(mOverlayPanelViewController.mOnAnimateExpandPanelCalled).isFalse();
-    }
-
-    @Test
-    public void animateExpandPanel_expands() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
-
-        mOverlayPanelViewController.animateExpandPanel();
-
-        assertThat(mOverlayPanelViewController.mOnAnimateExpandPanelCalled).isTrue();
-    }
-
-    @Test
-    public void animateExpandPanel_withOverlayFromTopBar_expandsToBottom() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        // Mock a panel that has layout size 50 and where the panel is not opened.
-        int size = 50;
-        mockPanelWithSize(size);
-        mOverlayPanelViewController.getLayout().setClipBounds(
-                new Rect(0, 0, size, 0));
-        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
-        mOverlayPanelViewController.setOverlayDirection(
-                OverlayPanelViewController.OVERLAY_FROM_TOP_BAR);
-
-        mOverlayPanelViewController.animateExpandPanel();
-
-        ArgumentCaptor<Float> endValueCaptor = ArgumentCaptor.forClass(Float.class);
-        verify(mFlingAnimationUtils).apply(
-                any(Animator.class), anyFloat(), endValueCaptor.capture(), anyFloat());
-        assertThat(endValueCaptor.getValue().intValue()).isEqualTo(
-                mOverlayPanelViewController.getLayout().getHeight());
-    }
-
-    @Test
-    public void animateExpandPanel_withOverlayFromBottomBar_expandsToTop() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        // Mock a panel that has layout size 50 and where the panel is not opened.
-        int size = 50;
-        mockPanelWithSize(size);
-        mOverlayPanelViewController.getLayout().setClipBounds(
-                new Rect(0, size, size, size));
-        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
-        mOverlayPanelViewController.setOverlayDirection(
-                OverlayPanelViewController.OVERLAY_FROM_BOTTOM_BAR);
-
-        mOverlayPanelViewController.animateExpandPanel();
-
-        ArgumentCaptor<Float> endValueCaptor = ArgumentCaptor.forClass(Float.class);
-        verify(mFlingAnimationUtils).apply(
-                any(Animator.class), anyFloat(), endValueCaptor.capture(), anyFloat());
-        assertThat(endValueCaptor.getValue().intValue()).isEqualTo(0);
-    }
-
-    @Test
-    public void animateExpandPanel_setsPanelVisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
-
-        mOverlayPanelViewController.animateExpandPanel();
-
-        assertThat(mOverlayPanelViewController.isPanelVisible()).isTrue();
-    }
-
-    @Test
-    public void animateExpandPanel_setsPanelExpanded() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.setShouldAnimateExpandPanel(true);
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
-
-        mOverlayPanelViewController.animateExpandPanel();
-
-        assertThat(mOverlayPanelViewController.isPanelExpanded()).isTrue();
-    }
-
-    @Test
-    public void setPanelVisible_setTrue_windowNotVisible_setsWindowVisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        when(mOverlayViewGlobalStateController.isWindowVisible()).thenReturn(false);
-
-        mOverlayPanelViewController.setPanelVisible(true);
-
-        verify(mOverlayViewGlobalStateController).showView(mOverlayPanelViewController);
-    }
-
-    @Test
-    public void setPanelVisible_setTrue_windowVisible_doesNotSetWindowVisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        when(mOverlayViewGlobalStateController.isWindowVisible()).thenReturn(true);
-
-        mOverlayPanelViewController.setPanelVisible(true);
-
-        verify(mOverlayViewGlobalStateController, never()).showView(mOverlayPanelViewController);
-    }
-
-    @Test
-    public void setPanelVisible_setTrue_setLayoutVisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.getLayout().setVisibility(View.INVISIBLE);
-
-        mOverlayPanelViewController.setPanelVisible(true);
-
-        assertThat(mOverlayPanelViewController.getLayout().getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void setPanelVisible_setFalse_windowVisible_setsWindowNotVisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        when(mOverlayViewGlobalStateController.isWindowVisible()).thenReturn(true);
-
-        mOverlayPanelViewController.setPanelVisible(false);
-
-        verify(mOverlayViewGlobalStateController).hideView(mOverlayPanelViewController);
-    }
-
-    @Test
-    public void setPanelVisible_setFalse_windowNotVisible_doesNotSetWindowNotVisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        when(mOverlayViewGlobalStateController.isWindowVisible()).thenReturn(false);
-
-        mOverlayPanelViewController.setPanelVisible(false);
-
-        verify(mOverlayViewGlobalStateController, never()).hideView(mOverlayPanelViewController);
-    }
-
-    @Test
-    public void setPanelVisible_setFalse_setLayoutInvisible() {
-        mOverlayPanelViewController.inflate(mBaseLayout);
-        mOverlayPanelViewController.getLayout().setVisibility(View.VISIBLE);
-
-        mOverlayPanelViewController.setPanelVisible(false);
-
-        assertThat(mOverlayPanelViewController.getLayout().getVisibility()).isEqualTo(
-                View.INVISIBLE);
-    }
-
-    @Test
-    public void dragOpenTouchListener_isNotInflated_inflatesView() {
-        when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true);
-        assertThat(mOverlayPanelViewController.isInflated()).isFalse();
-
-        mOverlayPanelViewController.getDragOpenTouchListener().onTouch(/* v= */ null,
-                MotionEvent.obtain(/* downTime= */ 200, /* eventTime= */ 300,
-                        MotionEvent.ACTION_MOVE, /* x= */ 0, /* y= */ 0, /* metaState= */ 0));
-
-        verify(mOverlayViewGlobalStateController).inflateView(mOverlayPanelViewController);
-    }
-
-    private void mockPanelWithSize(int size) {
-        mOverlayPanelViewController.getLayout().setLeftTopRightBottom(0, 0, size, size);
-    }
-
-    private static class TestOverlayPanelViewController extends OverlayPanelViewController {
-
-        boolean mOnAnimateCollapsePanelCalled;
-        boolean mAnimateCollapsePanelCalled;
-        boolean mOnAnimateExpandPanelCalled;
-        boolean mAnimateExpandPanelCalled;
-        boolean mOnCollapseAnimationEndCalled;
-        boolean mOnExpandAnimationEndCalled;
-        boolean mOnOpenScrollStartEnd;
-        List<Integer> mOnScrollHeights;
-        private boolean mShouldAnimateCollapsePanel;
-        private boolean mShouldAnimateExpandPanel;
-        private boolean mShouldAllowClosingScroll;
-
-        TestOverlayPanelViewController(
-                Context context,
-                Resources resources,
-                int stubId,
-                OverlayViewGlobalStateController overlayViewGlobalStateController,
-                FlingAnimationUtils.Builder flingAnimationUtilsBuilder,
-                CarDeviceProvisionedController carDeviceProvisionedController) {
-            super(context, resources, stubId, overlayViewGlobalStateController,
-                    flingAnimationUtilsBuilder,
-                    carDeviceProvisionedController);
-
-            mOnScrollHeights = new ArrayList<>();
-        }
-
-        public void setShouldAnimateCollapsePanel(boolean shouldAnimate) {
-            mShouldAnimateCollapsePanel = shouldAnimate;
-        }
-
-        @Override
-        protected boolean shouldAnimateCollapsePanel() {
-            return mShouldAnimateCollapsePanel;
-        }
-
-        @Override
-        protected void animateCollapsePanel() {
-            super.animateCollapsePanel();
-            mAnimateCollapsePanelCalled = true;
-        }
-
-        @Override
-        protected void onAnimateCollapsePanel() {
-            mOnAnimateCollapsePanelCalled = true;
-        }
-
-        public void setShouldAnimateExpandPanel(boolean shouldAnimate) {
-            mShouldAnimateExpandPanel = shouldAnimate;
-        }
-
-        @Override
-        protected boolean shouldAnimateExpandPanel() {
-            return mShouldAnimateExpandPanel;
-        }
-
-        @Override
-        protected void animateExpandPanel() {
-            super.animateExpandPanel();
-            mAnimateExpandPanelCalled = true;
-        }
-
-        @Override
-        protected void onAnimateExpandPanel() {
-            mOnAnimateExpandPanelCalled = true;
-        }
-
-        @Override
-        protected void onCollapseAnimationEnd() {
-            mOnCollapseAnimationEndCalled = true;
-        }
-
-        @Override
-        protected void onExpandAnimationEnd() {
-            mOnExpandAnimationEndCalled = true;
-        }
-
-        @Override
-        protected void onScroll(int height) {
-            mOnScrollHeights.add(height);
-        }
-
-        @Override
-        protected void onOpenScrollStart() {
-            mOnOpenScrollStartEnd = true;
-        }
-
-        public void setShouldAllowClosingScroll(boolean shouldAllow) {
-            mShouldAllowClosingScroll = shouldAllow;
-        }
-
-        @Override
-        protected boolean shouldAllowClosingScroll() {
-            return mShouldAllowClosingScroll;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewControllerTest.java
deleted file mode 100644
index e784761..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewControllerTest.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.window;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.verify;
-
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.tests.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class OverlayViewControllerTest extends SysuiTestCase {
-    private TestOverlayViewController mOverlayViewController;
-    private ViewGroup mBaseLayout;
-
-    @Mock
-    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-
-    @Captor
-    private ArgumentCaptor<Runnable> mRunnableArgumentCaptor;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(/* testClass= */ this);
-
-        mOverlayViewController = new TestOverlayViewController(R.id.overlay_view_controller_stub,
-                mOverlayViewGlobalStateController);
-
-        mBaseLayout = (ViewGroup) LayoutInflater.from(mContext).inflate(
-                R.layout.overlay_view_controller_test, /* root= */ null);
-    }
-
-    @Test
-    public void inflate_layoutInitialized() {
-        mOverlayViewController.inflate(mBaseLayout);
-
-        assertThat(mOverlayViewController.getLayout().getId()).isEqualTo(
-                R.id.overlay_view_controller_test);
-    }
-
-    @Test
-    public void inflate_onFinishInflateCalled() {
-        mOverlayViewController.inflate(mBaseLayout);
-
-        assertThat(mOverlayViewController.mOnFinishInflateCalled).isTrue();
-    }
-
-    @Test
-    public void start_viewInflated_viewShown() {
-        mOverlayViewController.inflate(mBaseLayout);
-
-        mOverlayViewController.start();
-
-        verify(mOverlayViewGlobalStateController).showView(eq(mOverlayViewController),
-                mRunnableArgumentCaptor.capture());
-
-        mRunnableArgumentCaptor.getValue().run();
-
-        assertThat(mOverlayViewController.mShowInternalCalled).isTrue();
-    }
-
-    @Test
-    public void stop_viewInflated_viewHidden() {
-        mOverlayViewController.inflate(mBaseLayout);
-
-        mOverlayViewController.stop();
-
-        verify(mOverlayViewGlobalStateController).hideView(eq(mOverlayViewController),
-                mRunnableArgumentCaptor.capture());
-
-        mRunnableArgumentCaptor.getValue().run();
-
-        assertThat(mOverlayViewController.mHideInternalCalled).isTrue();
-    }
-
-    @Test
-    public void start_viewNotInflated_viewNotShown() {
-        mOverlayViewController.start();
-
-        verify(mOverlayViewGlobalStateController).showView(eq(mOverlayViewController),
-                mRunnableArgumentCaptor.capture());
-
-        mRunnableArgumentCaptor.getValue().run();
-
-        assertThat(mOverlayViewController.mShowInternalCalled).isFalse();
-    }
-
-    @Test
-    public void stop_viewNotInflated_viewNotHidden() {
-        mOverlayViewController.stop();
-
-        verify(mOverlayViewGlobalStateController).hideView(eq(mOverlayViewController),
-                mRunnableArgumentCaptor.capture());
-
-        mRunnableArgumentCaptor.getValue().run();
-
-        assertThat(mOverlayViewController.mHideInternalCalled).isFalse();
-    }
-
-    private static class TestOverlayViewController extends OverlayViewController {
-        boolean mOnFinishInflateCalled = false;
-        boolean mShowInternalCalled = false;
-        boolean mHideInternalCalled = false;
-
-        TestOverlayViewController(int stubId,
-                OverlayViewGlobalStateController overlayViewGlobalStateController) {
-            super(stubId, overlayViewGlobalStateController);
-        }
-
-        @Override
-        protected void onFinishInflate() {
-            mOnFinishInflateCalled = true;
-        }
-
-        @Override
-        protected void showInternal() {
-            mShowInternalCalled = true;
-        }
-
-        @Override
-        protected void hideInternal() {
-            mHideInternalCalled = true;
-        }
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java
deleted file mode 100644
index 9c2931a..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java
+++ /dev/null
@@ -1,985 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.window;
-
-import static android.view.WindowInsets.Type.navigationBars;
-import static android.view.WindowInsets.Type.statusBars;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewStub;
-import android.view.WindowInsets;
-import android.view.WindowInsetsController;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.tests.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.Arrays;
-
-@CarSystemUiTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
-    private static final int OVERLAY_VIEW_CONTROLLER_1_Z_ORDER = 0;
-    private static final int OVERLAY_VIEW_CONTROLLER_2_Z_ORDER = 1;
-    private static final int OVERLAY_PANEL_VIEW_CONTROLLER_Z_ORDER = 2;
-
-    private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
-    private ViewGroup mBaseLayout;
-
-    @Mock
-    private SystemUIOverlayWindowController mSystemUIOverlayWindowController;
-    @Mock
-    private OverlayViewMediator mOverlayViewMediator;
-    @Mock
-    private OverlayViewController mOverlayViewController1;
-    @Mock
-    private OverlayViewController mOverlayViewController2;
-    @Mock
-    private OverlayPanelViewController mOverlayPanelViewController;
-    @Mock
-    private Runnable mRunnable;
-    @Mock
-    private WindowInsetsController mWindowInsetsController;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(/* testClass= */ this);
-
-        mBaseLayout = spy((ViewGroup) LayoutInflater.from(mContext).inflate(
-                R.layout.overlay_view_global_state_controller_test, /* root= */ null));
-
-        when(mBaseLayout.getWindowInsetsController()).thenReturn(mWindowInsetsController);
-
-        when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout);
-
-        mOverlayViewGlobalStateController = new OverlayViewGlobalStateController(
-                mSystemUIOverlayWindowController);
-
-        verify(mSystemUIOverlayWindowController).attach();
-    }
-
-    @Test
-    public void registerMediator_overlayViewMediatorListenersRegistered() {
-        mOverlayViewGlobalStateController.registerMediator(mOverlayViewMediator);
-
-        verify(mOverlayViewMediator).registerListeners();
-    }
-
-    @Test
-    public void registerMediator_overlayViewMediatorViewControllerSetup() {
-        mOverlayViewGlobalStateController.registerMediator(mOverlayViewMediator);
-
-        verify(mOverlayViewMediator).setupOverlayContentViewControllers();
-    }
-
-    @Test
-    public void showView_nothingVisible_windowNotFocusable_shouldShowNavBar_navBarsVisible() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(false);
-        when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).show(navigationBars());
-    }
-
-    @Test
-    public void showView_nothingVisible_windowNotFocusable_shouldHideNavBar_notHidden() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(false);
-        when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(false);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController, never()).hide(navigationBars());
-    }
-
-    @Test
-    public void showView_nothingVisible_windowNotFocusable_shouldShowStatusBar_statusBarsVisible() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(false);
-        when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).show(statusBars());
-    }
-
-    @Test
-    public void showView_nothingVisible_windowNotFocusable_shouldHideStatusBar_notHidden() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(false);
-        when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(false);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController, never()).hide(statusBars());
-    }
-
-    @Test
-    public void showView_nothingAlreadyShown_shouldShowNavBarFalse_navigationBarsHidden() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(false);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).hide(navigationBars());
-    }
-
-    @Test
-    public void showView_nothingAlreadyShown_shouldShowNavBarTrue_navigationBarsShown() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).show(navigationBars());
-    }
-
-    @Test
-    public void showView_nothingAlreadyShown_shouldShowStatusBarFalse_statusBarsHidden() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(false);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).hide(statusBars());
-    }
-
-    @Test
-    public void showView_nothingAlreadyShown_shouldShowStatusBarTrue_statusBarsShown() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).show(statusBars());
-    }
-
-    @Test
-    public void showView_nothingAlreadyShown_fitsNavBarInsets_insetsAdjusted() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.getInsetTypesToFit()).thenReturn(navigationBars());
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setFitInsetsTypes(navigationBars());
-    }
-
-    @Test
-    public void showView_nothingAlreadyShown_windowIsSetVisible() {
-        setupOverlayViewController1();
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setWindowVisible(true);
-    }
-
-    @Test
-    public void showView_nothingAlreadyShown_newHighestZOrder() {
-        setupOverlayViewController1();
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isEqualTo(
-                mOverlayViewController1);
-    }
-
-    @Test
-    public void showView_nothingAlreadyShown_newHighestZOrder_isVisible() {
-        setupOverlayViewController1();
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsKey(
-                OVERLAY_VIEW_CONTROLLER_1_Z_ORDER)).isTrue();
-    }
-
-    @Test
-    public void showView_newHighestZOrder() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setupOverlayViewController2();
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isEqualTo(
-                mOverlayViewController2);
-    }
-
-    @Test
-    public void showView_newHighestZOrder_shouldShowNavBarFalse_navigationBarsHidden() {
-        setupOverlayViewController1();
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(false);
-        reset(mWindowInsetsController);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
-
-        verify(mWindowInsetsController).hide(navigationBars());
-    }
-
-    @Test
-    public void showView_newHighestZOrder_shouldShowNavBarTrue_navigationBarsShown() {
-        setupOverlayViewController1();
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
-
-        verify(mWindowInsetsController).show(navigationBars());
-    }
-
-    @Test
-    public void showView_newHighestZOrder_shouldShowStatusBarFalse_statusBarsHidden() {
-        setupOverlayViewController1();
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(false);
-        reset(mWindowInsetsController);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
-
-        verify(mWindowInsetsController).hide(statusBars());
-    }
-
-    @Test
-    public void showView_newHighestZOrder_shouldShowStatusBarTrue_statusBarsShown() {
-        setupOverlayViewController1();
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
-
-        verify(mWindowInsetsController).show(statusBars());
-    }
-
-    @Test
-    public void showView_newHighestZOrder_fitsNavBarInsets_insetsAdjusted() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.getInsetTypesToFit()).thenReturn(statusBars());
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setupOverlayViewController2();
-        when(mOverlayViewController2.getInsetTypesToFit()).thenReturn(navigationBars());
-        reset(mWindowInsetsController);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setFitInsetsTypes(navigationBars());
-    }
-
-    @Test
-    public void showView_newHighestZOrder_correctViewsShown() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setupOverlayViewController2();
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.keySet().toArray())
-                .isEqualTo(Arrays.asList(OVERLAY_VIEW_CONTROLLER_1_Z_ORDER,
-                        OVERLAY_VIEW_CONTROLLER_2_Z_ORDER).toArray());
-    }
-
-    @Test
-    public void showView_oldHighestZOrder() {
-        setupOverlayViewController2();
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isEqualTo(
-                mOverlayViewController2);
-    }
-
-    @Test
-    public void showView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarsHidden() {
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(true);
-        when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(false);
-        reset(mWindowInsetsController);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).hide(navigationBars());
-    }
-
-    @Test
-    public void showView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarsShown() {
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(false);
-        when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).show(navigationBars());
-    }
-
-    @Test
-    public void showView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarsHidden() {
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(true);
-        when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(false);
-        reset(mWindowInsetsController);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).hide(statusBars());
-    }
-
-    @Test
-    public void showView_oldHighestZOrder_shouldShowStatusBarTrue_statusBarsShown() {
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(false);
-        when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).show(statusBars());
-    }
-
-    @Test
-    public void showView_oldHighestZOrder_fitsNavBarInsets_insetsAdjusted() {
-        setupOverlayViewController2();
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController1.getInsetTypesToFit()).thenReturn(statusBars());
-        when(mOverlayViewController2.getInsetTypesToFit()).thenReturn(navigationBars());
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setFitInsetsTypes(navigationBars());
-    }
-
-    @Test
-    public void showView_oldHighestZOrder_correctViewsShown() {
-        setupOverlayViewController1();
-        setupOverlayViewController2();
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.keySet().toArray())
-                .isEqualTo(Arrays.asList(OVERLAY_VIEW_CONTROLLER_1_Z_ORDER,
-                        OVERLAY_VIEW_CONTROLLER_2_Z_ORDER).toArray());
-    }
-
-    @Test
-    public void showView_somethingAlreadyShown_windowVisibleNotCalled() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setupOverlayViewController2();
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
-
-        verify(mSystemUIOverlayWindowController, never()).setWindowVisible(true);
-    }
-
-    @Test
-    public void showView_viewControllerNotInflated_inflateViewController() {
-        setupOverlayViewController2();
-        when(mOverlayViewController2.isInflated()).thenReturn(false);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
-
-        verify(mOverlayViewController2).inflate(mBaseLayout);
-    }
-
-    @Test
-    public void showView_viewControllerInflated_inflateViewControllerNotCalled() {
-        setupOverlayViewController2();
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
-
-        verify(mOverlayViewController2, never()).inflate(mBaseLayout);
-    }
-
-    @Test
-    public void showView_panelViewController_inflateViewControllerNotCalled() {
-        setupOverlayPanelViewController();
-
-        mOverlayViewGlobalStateController.showView(mOverlayPanelViewController, mRunnable);
-
-        verify(mOverlayPanelViewController, never()).inflate(mBaseLayout);
-        verify(mOverlayPanelViewController, never()).isInflated();
-    }
-
-    @Test
-    public void showView_showRunnableCalled() {
-        setupOverlayViewController1();
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mRunnable).run();
-    }
-
-    @Test
-    public void hideView_viewControllerNotInflated_hideRunnableNotCalled() {
-        when(mOverlayViewController2.isInflated()).thenReturn(false);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
-
-        verify(mRunnable, never()).run();
-    }
-
-    @Test
-    public void hideView_nothingShown_hideRunnableNotCalled() {
-        when(mOverlayViewController2.isInflated()).thenReturn(true);
-        mOverlayViewGlobalStateController.mZOrderMap.clear();
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
-
-        verify(mRunnable, never()).run();
-    }
-
-    @Test
-    public void hideView_viewControllerNotShown_hideRunnableNotCalled() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        when(mOverlayViewController2.isInflated()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
-
-        verify(mRunnable, never()).run();
-    }
-
-    @Test
-    public void hideView_viewControllerShown_hideRunnableCalled() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        verify(mRunnable).run();
-    }
-
-    @Test
-    public void hideView_viewControllerOnlyShown_noHighestZOrder() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isNull();
-    }
-
-    @Test
-    public void hideView_viewControllerOnlyShown_nothingShown() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.isEmpty()).isTrue();
-    }
-
-    @Test
-    public void hideView_viewControllerOnlyShown_viewControllerNotShown() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsKey(
-                OVERLAY_VIEW_CONTROLLER_1_Z_ORDER)).isFalse();
-    }
-
-    @Test
-    public void hideView_newHighestZOrder_twoViewsShown() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setupOverlayViewController2();
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isEqualTo(
-                mOverlayViewController1);
-    }
-
-    @Test
-    public void hideView_newHighestZOrder_threeViewsShown() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setupOverlayViewController2();
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        setupOverlayPanelViewController();
-        setOverlayViewControllerAsShowing(mOverlayPanelViewController);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayPanelViewController, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isEqualTo(
-                mOverlayViewController2);
-    }
-
-    @Test
-    public void hideView_newHighestZOrder_shouldShowNavBarFalse_navigationBarHidden() {
-        setupOverlayViewController1();
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(false);
-        reset(mWindowInsetsController);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
-
-        verify(mWindowInsetsController).hide(navigationBars());
-    }
-
-    @Test
-    public void hideView_newHighestZOrder_shouldShowNavBarTrue_navigationBarShown() {
-        setupOverlayViewController1();
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(true);
-        reset(mWindowInsetsController);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
-
-        verify(mWindowInsetsController).show(navigationBars());
-    }
-
-    @Test
-    public void hideView_newHighestZOrder_shouldShowStatusBarFalse_statusBarHidden() {
-        setupOverlayViewController1();
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(false);
-        reset(mWindowInsetsController);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
-
-        verify(mWindowInsetsController).hide(statusBars());
-    }
-
-    @Test
-    public void hideView_newHighestZOrder_shouldShowStatusBarTrue_statusBarShown() {
-        setupOverlayViewController1();
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(true);
-        reset(mWindowInsetsController);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
-
-        verify(mWindowInsetsController).show(statusBars());
-    }
-
-    @Test
-    public void hideView_newHighestZOrder_fitsNavBarInsets_insetsAdjusted() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setupOverlayViewController2();
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController1.getInsetTypesToFit()).thenReturn(navigationBars());
-        when(mOverlayViewController2.getInsetTypesToFit()).thenReturn(statusBars());
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setFitInsetsTypes(navigationBars());
-    }
-
-    @Test
-    public void hideView_oldHighestZOrder() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setupOverlayViewController2();
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isEqualTo(
-                mOverlayViewController2);
-    }
-
-    @Test
-    public void hideView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarHidden() {
-        setupOverlayViewController1();
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(false);
-        reset(mWindowInsetsController);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).hide(navigationBars());
-    }
-
-    @Test
-    public void hideView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarShown() {
-        setupOverlayViewController1();
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).show(navigationBars());
-    }
-
-    @Test
-    public void hideView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarHidden() {
-        setupOverlayViewController1();
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(false);
-        reset(mWindowInsetsController);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).hide(statusBars());
-    }
-
-    @Test
-    public void hideView_oldHighestZOrder_shouldShowStatusBarTrue_statusBarShown() {
-        setupOverlayViewController1();
-        setupOverlayViewController2();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).show(statusBars());
-    }
-
-    @Test
-    public void hideView_oldHighestZOrder_fitsNavBarInsets_insetsAdjusted() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setupOverlayViewController2();
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-        when(mOverlayViewController1.getInsetTypesToFit()).thenReturn(statusBars());
-        when(mOverlayViewController2.getInsetTypesToFit()).thenReturn(navigationBars());
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setFitInsetsTypes(navigationBars());
-    }
-
-    @Test
-    public void hideView_viewControllerNotOnlyShown_windowNotCollapsed() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        setupOverlayViewController2();
-        setOverlayViewControllerAsShowing(mOverlayViewController2);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
-
-        verify(mSystemUIOverlayWindowController, never()).setWindowVisible(false);
-    }
-
-    @Test
-    public void hideView_viewControllerOnlyShown_navigationBarShown() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).show(navigationBars());
-    }
-
-    @Test
-    public void hideView_viewControllerOnlyShown_statusBarShown() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        verify(mWindowInsetsController).show(statusBars());
-    }
-
-    @Test
-    public void hideView_viewControllerOnlyShown_insetsAdjustedToDefault() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setFitInsetsTypes(statusBars());
-    }
-
-    @Test
-    public void hideView_viewControllerOnlyShown_windowCollapsed() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setWindowVisible(false);
-    }
-
-    @Test
-    public void setOccludedTrue_viewToHideWhenOccludedVisible_viewHidden() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        when(mOverlayViewController1.shouldShowWhenOccluded()).thenReturn(false);
-
-        mOverlayViewGlobalStateController.setOccluded(true);
-
-        assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsValue(
-                mOverlayViewController1)).isFalse();
-    }
-
-    @Test
-    public void setOccludedTrue_viewToNotHideWhenOccludedVisible_viewShown() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        when(mOverlayViewController1.shouldShowWhenOccluded()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.setOccluded(true);
-
-        assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsValue(
-                mOverlayViewController1)).isTrue();
-    }
-
-    @Test
-    public void hideViewAndThenSetOccludedTrue_viewHiddenForOcclusion_viewHiddenAfterOcclusion() {
-        setupOverlayViewController1();
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-        when(mOverlayViewController1.shouldShowWhenOccluded()).thenReturn(false);
-        mOverlayViewGlobalStateController.setOccluded(true);
-
-        mOverlayViewGlobalStateController.hideView(mOverlayViewController1, /* runnable= */ null);
-        mOverlayViewGlobalStateController.setOccluded(false);
-
-        assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsValue(
-                mOverlayViewController1)).isFalse();
-    }
-
-    @Test
-    public void setOccludedTrueAndThenShowView_viewToNotHideForOcclusion_viewShown() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.shouldShowWhenOccluded()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.setOccluded(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-
-        assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsValue(
-                mOverlayViewController1)).isTrue();
-    }
-
-    @Test
-    public void setOccludedTrueAndThenShowView_viewToHideForOcclusion_viewHidden() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.shouldShowWhenOccluded()).thenReturn(false);
-
-        mOverlayViewGlobalStateController.setOccluded(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-
-        assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsValue(
-                mOverlayViewController1)).isFalse();
-    }
-
-    @Test
-    public void setOccludedFalse_viewShownAfterSetOccludedTrue_viewToHideForOcclusion_viewShown() {
-        setupOverlayViewController1();
-        when(mOverlayViewController1.shouldShowWhenOccluded()).thenReturn(false);
-        mOverlayViewGlobalStateController.setOccluded(true);
-        setOverlayViewControllerAsShowing(mOverlayViewController1);
-
-        mOverlayViewGlobalStateController.setOccluded(false);
-
-        assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsValue(
-                mOverlayViewController1)).isTrue();
-    }
-
-    @Test
-    public void inflateView_notInflated_inflates() {
-        when(mOverlayViewController2.isInflated()).thenReturn(false);
-
-        mOverlayViewGlobalStateController.inflateView(mOverlayViewController2);
-
-        verify(mOverlayViewController2).inflate(mBaseLayout);
-    }
-
-    @Test
-    public void inflateView_alreadyInflated_doesNotInflate() {
-        when(mOverlayViewController2.isInflated()).thenReturn(true);
-
-        mOverlayViewGlobalStateController.inflateView(mOverlayViewController2);
-
-        verify(mOverlayViewController2, never()).inflate(mBaseLayout);
-    }
-
-    @Test
-    public void showView_setInsetsToFitByType_setsFitInsetsType() {
-        int insetTypeToFit = WindowInsets.Type.navigationBars();
-        setupOverlayViewController1();
-        when(mOverlayViewController1.getInsetTypesToFit()).thenReturn(insetTypeToFit);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setFitInsetsTypes(insetTypeToFit);
-    }
-
-    @Test
-    public void refreshInsetsToFit_setInsetsToFitBySide_setsFitInsetsSides() {
-        int insetSidesToFit = WindowInsets.Side.LEFT;
-        setupOverlayViewController1();
-        when(mOverlayViewController1.getInsetSidesToFit()).thenReturn(insetSidesToFit);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setFitInsetsSides(insetSidesToFit);
-    }
-
-    @Test
-    public void refreshInsetsToFit_setInsetsToFitBySideUsed_firstFitsAllSystemBars() {
-        int insetSidesToFit = WindowInsets.Side.LEFT;
-        setupOverlayViewController1();
-        when(mOverlayViewController1.getInsetSidesToFit()).thenReturn(insetSidesToFit);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setFitInsetsTypes(WindowInsets.Type.systemBars());
-    }
-
-    @Test
-    public void refreshInsetsToFit_bothInsetTypeAndSideDefined_insetSideTakesPrecedence() {
-        int insetTypesToFit = WindowInsets.Type.navigationBars();
-        int insetSidesToFit = WindowInsets.Side.LEFT;
-        setupOverlayViewController1();
-        when(mOverlayViewController1.getInsetTypesToFit()).thenReturn(insetTypesToFit);
-        when(mOverlayViewController1.getInsetSidesToFit()).thenReturn(insetSidesToFit);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mSystemUIOverlayWindowController).setFitInsetsSides(insetSidesToFit);
-    }
-
-    @Test
-    public void refreshInsetsToFit_bothInsetTypeAndSideDefined_insetTypeIgnored() {
-        int insetTypesToFit = WindowInsets.Type.navigationBars();
-        int insetSidesToFit = WindowInsets.Side.LEFT;
-        setupOverlayViewController1();
-        when(mOverlayViewController1.getInsetTypesToFit()).thenReturn(insetTypesToFit);
-        when(mOverlayViewController1.getInsetSidesToFit()).thenReturn(insetSidesToFit);
-
-        mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
-
-        verify(mSystemUIOverlayWindowController, never()).setFitInsetsTypes(insetTypesToFit);
-    }
-
-    private void setupOverlayViewController1() {
-        setupOverlayViewController(mOverlayViewController1, R.id.overlay_view_controller_stub_1,
-                R.id.overlay_view_controller_1);
-    }
-
-    private void setupOverlayViewController2() {
-        setupOverlayViewController(mOverlayViewController2, R.id.overlay_view_controller_stub_2,
-                R.id.overlay_view_controller_2);
-    }
-
-    private void setupOverlayPanelViewController() {
-        setupOverlayViewController(mOverlayPanelViewController, R.id.overlay_view_controller_stub_3,
-                R.id.overlay_view_controller_3);
-    }
-
-    private void setupOverlayViewController(OverlayViewController overlayViewController,
-            int stubId, int inflatedId) {
-        ViewStub viewStub = mBaseLayout.findViewById(stubId);
-        View layout;
-        if (viewStub == null) {
-            layout = mBaseLayout.findViewById(inflatedId);
-        } else {
-            layout = viewStub.inflate();
-        }
-        when(overlayViewController.getLayout()).thenReturn(layout);
-        when(overlayViewController.isInflated()).thenReturn(true);
-        when(overlayViewController.getInsetSidesToFit()).thenReturn(
-                OverlayViewController.INVALID_INSET_SIDE);
-    }
-
-    private void setOverlayViewControllerAsShowing(OverlayViewController overlayViewController) {
-        mOverlayViewGlobalStateController.showView(overlayViewController, /* show= */ null);
-        reset(mSystemUIOverlayWindowController);
-        when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout);
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/wm/BarControlPolicyTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/wm/BarControlPolicyTest.java
deleted file mode 100644
index da7cb8e..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/wm/BarControlPolicyTest.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.wm;
-
-import static android.view.WindowInsets.Type.navigationBars;
-import static android.view.WindowInsets.Type.statusBars;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.car.settings.CarSettings;
-import android.provider.Settings;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class BarControlPolicyTest extends SysuiTestCase {
-
-    private static final String PACKAGE_NAME = "sample.app";
-
-    @Before
-    public void setUp() {
-        BarControlPolicy.reset();
-    }
-
-    @After
-    public void tearDown() {
-        Settings.Global.clearProviderForTest();
-    }
-
-    @Test
-    public void reloadFromSetting_notSet_doesNotSetFilters() {
-        BarControlPolicy.reloadFromSetting(mContext);
-
-        assertThat(BarControlPolicy.sImmersiveStatusFilter).isNull();
-    }
-
-    @Test
-    public void reloadFromSetting_invalidPolicyControlString_doesNotSetFilters() {
-        String text = "sample text";
-        Settings.Global.putString(
-                mContext.getContentResolver(),
-                CarSettings.Global.SYSTEM_BAR_VISIBILITY_OVERRIDE,
-                text
-        );
-
-        BarControlPolicy.reloadFromSetting(mContext);
-
-        assertThat(BarControlPolicy.sImmersiveStatusFilter).isNull();
-    }
-
-    @Test
-    public void reloadFromSetting_validPolicyControlString_setsFilters() {
-        String text = "immersive.status=" + PACKAGE_NAME;
-        Settings.Global.putString(
-                mContext.getContentResolver(),
-                CarSettings.Global.SYSTEM_BAR_VISIBILITY_OVERRIDE,
-                text
-        );
-
-        BarControlPolicy.reloadFromSetting(mContext);
-
-        assertThat(BarControlPolicy.sImmersiveStatusFilter).isNotNull();
-    }
-
-    @Test
-    public void reloadFromSetting_filtersSet_doesNotSetFiltersAgain() {
-        String text = "immersive.status=" + PACKAGE_NAME;
-        Settings.Global.putString(
-                mContext.getContentResolver(),
-                CarSettings.Global.SYSTEM_BAR_VISIBILITY_OVERRIDE,
-                text
-        );
-
-        BarControlPolicy.reloadFromSetting(mContext);
-
-        assertThat(BarControlPolicy.reloadFromSetting(mContext)).isFalse();
-    }
-
-    @Test
-    public void getBarVisibilities_policyControlNotSet_showsSystemBars() {
-        int[] visibilities = BarControlPolicy.getBarVisibilities(PACKAGE_NAME);
-
-        assertThat(visibilities[0]).isEqualTo(statusBars() | navigationBars());
-        assertThat(visibilities[1]).isEqualTo(0);
-    }
-
-    @Test
-    public void getBarVisibilities_immersiveStatusForAppAndMatchingApp_hidesStatusBar() {
-        Settings.Global.putString(
-                mContext.getContentResolver(),
-                CarSettings.Global.SYSTEM_BAR_VISIBILITY_OVERRIDE,
-                "immersive.status=" + PACKAGE_NAME);
-        BarControlPolicy.reloadFromSetting(mContext);
-
-        int[] visibilities = BarControlPolicy.getBarVisibilities(PACKAGE_NAME);
-
-        assertThat(visibilities[0]).isEqualTo(navigationBars());
-        assertThat(visibilities[1]).isEqualTo(statusBars());
-    }
-
-    @Test
-    public void getBarVisibilities_immersiveStatusForAppAndNonMatchingApp_showsSystemBars() {
-        Settings.Global.putString(
-                mContext.getContentResolver(),
-                CarSettings.Global.SYSTEM_BAR_VISIBILITY_OVERRIDE,
-                "immersive.status=" + PACKAGE_NAME);
-        BarControlPolicy.reloadFromSetting(mContext);
-
-        int[] visibilities = BarControlPolicy.getBarVisibilities("sample2.app");
-
-        assertThat(visibilities[0]).isEqualTo(statusBars() | navigationBars());
-        assertThat(visibilities[1]).isEqualTo(0);
-    }
-
-    @Test
-    public void getBarVisibilities_immersiveStatusForAppsAndNonApp_showsSystemBars() {
-        Settings.Global.putString(
-                mContext.getContentResolver(),
-                CarSettings.Global.SYSTEM_BAR_VISIBILITY_OVERRIDE,
-                "immersive.status=apps");
-        BarControlPolicy.reloadFromSetting(mContext);
-
-        int[] visibilities = BarControlPolicy.getBarVisibilities(PACKAGE_NAME);
-
-        assertThat(visibilities[0]).isEqualTo(statusBars() | navigationBars());
-        assertThat(visibilities[1]).isEqualTo(0);
-    }
-
-    @Test
-    public void getBarVisibilities_immersiveFullForAppAndMatchingApp_hidesSystemBars() {
-        Settings.Global.putString(
-                mContext.getContentResolver(),
-                CarSettings.Global.SYSTEM_BAR_VISIBILITY_OVERRIDE,
-                "immersive.full=" + PACKAGE_NAME);
-        BarControlPolicy.reloadFromSetting(mContext);
-
-        int[] visibilities = BarControlPolicy.getBarVisibilities(PACKAGE_NAME);
-
-        assertThat(visibilities[0]).isEqualTo(0);
-        assertThat(visibilities[1]).isEqualTo(statusBars() | navigationBars());
-    }
-
-    @Test
-    public void getBarVisibilities_immersiveFullForAppAndNonMatchingApp_showsSystemBars() {
-        Settings.Global.putString(
-                mContext.getContentResolver(),
-                CarSettings.Global.SYSTEM_BAR_VISIBILITY_OVERRIDE,
-                "immersive.full=" + PACKAGE_NAME);
-        BarControlPolicy.reloadFromSetting(mContext);
-
-        int[] visibilities = BarControlPolicy.getBarVisibilities("sample2.app");
-
-        assertThat(visibilities[0]).isEqualTo(statusBars() | navigationBars());
-        assertThat(visibilities[1]).isEqualTo(0);
-    }
-
-    @Test
-    public void getBarVisibilities_immersiveFullForAppsAndNonApp_showsSystemBars() {
-        Settings.Global.putString(
-                mContext.getContentResolver(),
-                CarSettings.Global.SYSTEM_BAR_VISIBILITY_OVERRIDE,
-                "immersive.full=apps");
-        BarControlPolicy.reloadFromSetting(mContext);
-
-        int[] visibilities = BarControlPolicy.getBarVisibilities(PACKAGE_NAME);
-
-        assertThat(visibilities[0]).isEqualTo(statusBars() | navigationBars());
-        assertThat(visibilities[1]).isEqualTo(0);
-    }
-}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java
deleted file mode 100644
index 391f75e..0000000
--- a/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.wm;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.verify;
-
-import android.car.settings.CarSettings;
-import android.os.Handler;
-import android.os.RemoteException;
-import android.provider.Settings;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.IWindowManager;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.wm.shell.common.DisplayController;
-import com.android.wm.shell.common.TransactionPool;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-@SmallTest
-public class DisplaySystemBarsControllerTest extends SysuiTestCase {
-
-    private DisplaySystemBarsController mController;
-
-    private static final int DISPLAY_ID = 1;
-
-    @Mock
-    private IWindowManager mIWindowManager;
-    @Mock
-    private DisplayController mDisplayController;
-    @Mock
-    private Handler mHandler;
-    @Mock
-    private TransactionPool mTransactionPool;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mController = new DisplaySystemBarsController(
-                mContext,
-                mIWindowManager,
-                mDisplayController,
-                mHandler,
-                mTransactionPool
-        );
-    }
-
-    @Test
-    public void onDisplayAdded_setsDisplayWindowInsetsControllerOnWMService()
-            throws RemoteException {
-        mController.onDisplayAdded(DISPLAY_ID);
-
-        verify(mIWindowManager).setDisplayWindowInsetsController(
-                eq(DISPLAY_ID), any(DisplaySystemBarsController.PerDisplay.class));
-    }
-
-    @Test
-    public void onDisplayAdded_loadsBarControlPolicyFilters() {
-        String text = "sample text";
-        Settings.Global.putString(
-                mContext.getContentResolver(),
-                CarSettings.Global.SYSTEM_BAR_VISIBILITY_OVERRIDE,
-                text
-        );
-
-        mController.onDisplayAdded(DISPLAY_ID);
-
-        assertThat(BarControlPolicy.sSettingValue).isEqualTo(text);
-    }
-
-    @Test
-    public void onDisplayRemoved_unsetsDisplayWindowInsetsControllerInWMService()
-            throws RemoteException {
-        mController.onDisplayAdded(DISPLAY_ID);
-
-        mController.onDisplayRemoved(DISPLAY_ID);
-
-        verify(mIWindowManager).setDisplayWindowInsetsController(
-                DISPLAY_ID, /* displayWindowInsetsController= */ null);
-    }
-}
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java
index c5876af..a7e397e 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java
@@ -32,6 +32,7 @@
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothManager;
+import android.bluetooth.BluetoothProfile;
 import android.bluetooth.le.BluetoothLeScanner;
 import android.bluetooth.le.ScanCallback;
 import android.bluetooth.le.ScanFilter;
@@ -84,10 +85,13 @@
 
     static DeviceDiscoveryService sInstance;
 
+    private BluetoothManager mBluetoothManager;
     private BluetoothAdapter mBluetoothAdapter;
     private WifiManager mWifiManager;
     @Nullable private BluetoothLeScanner mBLEScanner;
-    private ScanSettings mDefaultScanSettings = new ScanSettings.Builder().build();
+    private ScanSettings mDefaultScanSettings = new ScanSettings.Builder()
+            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
+            .build();
 
     private List<DeviceFilter<?>> mFilters;
     private List<BluetoothLeDeviceFilter> mBLEFilters;
@@ -141,7 +145,8 @@
 
         if (DEBUG) Log.i(LOG_TAG, "onCreate()");
 
-        mBluetoothAdapter = getSystemService(BluetoothManager.class).getAdapter();
+        mBluetoothManager = getSystemService(BluetoothManager.class);
+        mBluetoothAdapter = mBluetoothManager.getAdapter();
         mBLEScanner = mBluetoothAdapter.getBluetoothLeScanner();
         mWifiManager = getSystemService(WifiManager.class);
 
@@ -186,6 +191,14 @@
             for (BluetoothDevice dev : emptyIfNull(mBluetoothAdapter.getBondedDevices())) {
                 onDeviceFound(DeviceFilterPair.findMatch(dev, mBluetoothFilters));
             }
+            for (BluetoothDevice dev : emptyIfNull(
+                    mBluetoothManager.getConnectedDevices(BluetoothProfile.GATT))) {
+                onDeviceFound(DeviceFilterPair.findMatch(dev, mBluetoothFilters));
+            }
+            for (BluetoothDevice dev : emptyIfNull(
+                    mBluetoothManager.getConnectedDevices(BluetoothProfile.GATT_SERVER))) {
+                onDeviceFound(DeviceFilterPair.findMatch(dev, mBluetoothFilters));
+            }
         }
 
         if (shouldScan(mBluetoothFilters)) {
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
index bbcc6a2..af05078 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
@@ -22,24 +22,21 @@
 import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.ActivityManager;
-import android.app.AppGlobals;
 import android.content.ContentResolver;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
-import android.content.pm.IPackageManager;
+import android.content.pm.PackageInfo;
 import android.content.pm.PackageInstaller;
 import android.content.pm.PackageManager;
 import android.content.pm.ProviderInfo;
-import android.content.pm.UserInfo;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.RemoteException;
 import android.os.UserManager;
-import android.permission.IPermissionManager;
 import android.util.Log;
 
-import java.util.List;
+import java.util.Arrays;
 
 /**
  * Select which activity is the first visible activity of the installation and forward the intent to
@@ -49,16 +46,14 @@
     private static final String LOG_TAG = InstallStart.class.getSimpleName();
 
     private static final String DOWNLOADS_AUTHORITY = "downloads";
-    private IPackageManager mIPackageManager;
-    private IPermissionManager mIPermissionManager;
+    private PackageManager mPackageManager;
     private UserManager mUserManager;
     private boolean mAbortInstall = false;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mIPackageManager = AppGlobals.getPackageManager();
-        mIPermissionManager = AppGlobals.getPermissionManager();
+        mPackageManager = getPackageManager();
         mUserManager = getSystemService(UserManager.class);
         Intent intent = getIntent();
         String callingPackage = getCallingPackage();
@@ -94,7 +89,7 @@
                 Log.w(LOG_TAG, "Cannot get target sdk version for uid " + originatingUid);
                 // Invalid originating uid supplied. Abort install.
                 mAbortInstall = true;
-            } else if (targetSdkVersion >= Build.VERSION_CODES.O && !declaresAppOpPermission(
+            } else if (targetSdkVersion >= Build.VERSION_CODES.O && !isUidRequestingPermission(
                     originatingUid, Manifest.permission.REQUEST_INSTALL_PACKAGES)) {
                 Log.e(LOG_TAG, "Requesting uid " + originatingUid + " needs to declare permission "
                         + Manifest.permission.REQUEST_INSTALL_PACKAGES);
@@ -150,26 +145,24 @@
         finish();
     }
 
-    private boolean declaresAppOpPermission(int uid, String permission) {
-        try {
-            final String[] packages = mIPermissionManager.getAppOpPermissionPackages(permission);
-            if (packages == null) {
-                return false;
+    private boolean isUidRequestingPermission(int uid, String permission) {
+        final String[] packageNames = mPackageManager.getPackagesForUid(uid);
+        if (packageNames == null) {
+            return false;
+        }
+        for (final String packageName : packageNames) {
+            final PackageInfo packageInfo;
+            try {
+                packageInfo = mPackageManager.getPackageInfo(packageName,
+                        PackageManager.GET_PERMISSIONS);
+            } catch (PackageManager.NameNotFoundException e) {
+                // Ignore and try the next package
+                continue;
             }
-            final List<UserInfo> users = mUserManager.getUsers();
-            for (String packageName : packages) {
-                for (UserInfo user : users) {
-                    try {
-                        if (uid == getPackageManager().getPackageUidAsUser(packageName, user.id)) {
-                            return true;
-                        }
-                    } catch (PackageManager.NameNotFoundException e) {
-                        // Ignore and try the next package
-                    }
-                }
+            if (packageInfo.requestedPermissions != null
+                    && Arrays.asList(packageInfo.requestedPermissions).contains(permission)) {
+                return true;
             }
-        } catch (RemoteException rexc) {
-            // If remote package manager cannot be reached, install will likely fail anyway.
         }
         return false;
     }
@@ -215,13 +208,9 @@
                 return PackageInstaller.SessionParams.UID_UNKNOWN;
             }
         }
-        try {
-            if (mIPackageManager.checkUidPermission(Manifest.permission.MANAGE_DOCUMENTS,
-                    callingUid) == PackageManager.PERMISSION_GRANTED) {
-                return uidFromIntent;
-            }
-        } catch (RemoteException rexc) {
-            // Ignore. Should not happen.
+        if (checkPermission(Manifest.permission.MANAGE_DOCUMENTS, -1, callingUid)
+                == PackageManager.PERMISSION_GRANTED) {
+            return uidFromIntent;
         }
         if (isSystemDownloadsProvider(callingUid)) {
             return uidFromIntent;
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 5119c56..fa0fa5c 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Onaktief. Tik om te wissel."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktief. Tik om te wissel."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Programbystandstatus:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Mediakodewisselinginstellings"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Aktiveer kodewisseling vir alle programme"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Deaktiveer kodewisseling vir programme"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Lopende dienste"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Sien en beheer dienste wat tans aktief is"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index de82340..f98b801 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ቦዝኗል። ለመቀያየር ነካ ያድርጉ።"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"ገቢር። ለመቀያየር ነካ ያድርጉ።"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"የመተግበሪያ ዝግጁ የመሆን ሁኔታ፦<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"የሚዲያ ትራንስኮድ ቅንብሮች"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"ለሁሉም መተግበሪያዎች ትራንስኮዲንግን ያንቁ"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"ለመተግበሪያዎች ትራንስኮዲንግን ያሰናክሉ"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"አሂድ አገልግሎቶች"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"በአሁኑጊዜ እየሄዱ ያሉ አገልግሎቶችን ተቆጣጠር እና እይ"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"የWebView ትግበራ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index e61f527..fd7a0a3 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"غير نشط، انقر للتبديل."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"نشط، انقر للتبديل."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"حالة تطبيق وضع الاستعداد:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"الخدمات قيد التشغيل"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"عرض الخدمات قيد التشغيل في الوقت الحالي والتحكم فيها"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"‏تطبيق WebView"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index 8d9d71a..eecdbc0 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"নিষ্ক্ৰিয়। ট\'গল কৰিবলৈ টিপক।"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"সক্ৰিয়। ট\'গল কৰিবলৈ টিপক।"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"এপ্ ষ্টেণ্ডবাই অৱস্থাত আছে:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"চলিত সেৱা"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"বৰ্তমান চলি থকা সেৱাসমূহ চাওক আৰু নিয়ন্ত্ৰণ কৰক"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"ৱেবভিউ প্ৰয়োগ"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 0e74042..197cc88 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Deaktivdir. Keçid etmək üçün basın."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktivdir. Keçid etmək üçün basın."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Tətbiqin gözləmə rejimi:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"İşləyən xidmətlər"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Hazırda prosesdə olan xidmətləri görüntüləyin və onlara nəzarət edin"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView icrası"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 4cd3b16..5230a80 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Neaktivna. Dodirnite da biste je aktivirali."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktivna. Dodirnite da biste je deaktivirali."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Stanje pripravnosti aplikacije: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Podešavanja transkodiranja medija"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Omogući transkodiranje za sve aplikacije"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Onemogućite transkodiranje za aplikacije"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Pokrenute usluge"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Prikaz i kontrola trenutno pokrenutih usluga"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Primena WebView-a"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 3902317..1dfae0b 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Неактыўная. Краніце, каб пераключыць."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Актыўная. Краніце, каб пераключыць."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Стан праграмы ў рэжыме чакання: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Запушчаныя службы"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Прагляд запушчаных службаў i кіраванне iмi"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Рэалізацыя WebView"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index a9c80f5..2f34acc60 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Неактивно. Докоснете, за да превключите."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Активно. Докоснете, за да превключите."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Състояние на готовност на приложението: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Изпълнявани услуги"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Преглед и контрол върху изпълняващите се понастоящем услуги"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Внедряване на WebView"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index a86e93c..ff7ebb4e6 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"নিষ্ক্রিয় রয়েছে৷ টগল করতে আলতো চাপুন৷"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"সক্রিয় রয়েছে৷ টগল করতে আলতো চাপুন৷"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"অ্যাপ স্ট্যান্ডবাই-এর অবস্থা:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"এখন চলছে যে পরিষেবাগুলি"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"বর্তমান চলমান পরিষেবাগুলি দেখুন এবং নিয়ন্ত্রণ করুন"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"ওয়েবভিউ প্রয়োগ"</string>
@@ -558,8 +564,6 @@
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"চালু করা আছে"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"এই পরিবর্তনটি প্রয়োগ করার জন্য আপনার ডিভাইসটি অবশ্যই রিবুট করতে হবে। এখনই রিবুট করুন বা বাতিল করুন।"</string>
     <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"তার যুক্ত হেডফোন"</string>
-    <!-- no translation found for wifi_hotspot_switch_on_text (9212273118217786155) -->
-    <skip />
-    <!-- no translation found for wifi_hotspot_switch_off_text (7245567251496959764) -->
-    <skip />
+    <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"চালু আছে"</string>
+    <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"বন্ধ আছে"</string>
 </resources>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 77090ca..fee91af 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Neaktivno. Dodirnite za promjenu opcije."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktivno. Dodirnite za promjenu opcije."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Stanje mirovanja aplikacije:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Postavke konvertiranja medija"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Omogućavanje konvertiranja za sve aplikacije"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Onemogućivanje konvertiranja za aplikacije"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Pokrenute usluge"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Prikaz i kontrola trenutno pokrenutih usluga"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Postavljanje WebViewa"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 9409e65..f4fc7d6 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Aplicació inactiva. Toca per activar-la."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aplicació activa. Toca per desactivar-la."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Estat de les aplicacions inactives: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Configuració de la transcodificació de contingut multimèdia"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Activa la transcodificació per a totes les aplicacions"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Desactiva la transcodificació per a les aplicacions"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Serveis en execució"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualitza i controla els serveis en execució"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementació de WebView"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 65687be..01f9488 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Neaktivní. Klepnutím možnost přepnete."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktivní. Klepnutím možnost přepnete."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Stav pohotovostního režimu aplikace: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Spuštěné služby"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Umožňuje zobrazit a ovládat aktuálně spuštěné služby"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementace WebView"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 73ed769..0d9ef0d 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inaktiv. Tryk for at skifte."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktiv. Tryk for at skifte."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Standbystatus for appen:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Kørende tjenester"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Vis og administrer kørende tjenester"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 8eb4b85..fcd1222 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inaktiv. Zum Wechseln tippen."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktiv. Zum Wechseln tippen."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Standby-Status der App:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Aktive Dienste"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Momentan ausgeführte Dienste anzeigen und steuern"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-Implementierung"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index d934aeb..9e8845a 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Ανενεργό. Πατήστε για εναλλαγή."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Ενεργό. Πατήστε για εναλλαγή."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Κατάσταση αναμονής εφαρμογής:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Ρυθμίσεις διακωδικοποίησης μέσων"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Ενεργοποίηση διακωδικοποίησης για όλες τις εφαρμογές"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Απενεργοποίηση της διακωδικοποίησης για εφαρμογές"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Υπηρεσίες που εκτελούνται"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Προβολή και έλεγχος των εφαρμογών που εκτελούνται αυτή τη στιγμή"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Υλοποίηση WebView"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 49e3a7c..7729f8e 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inactive. Tap to toggle."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Active. Tap to toggle."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"App standby state:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Media transcode settings"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Enable transcoding for all apps"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Disable transcoding for apps"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 2589421..00be355 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inactive. Tap to toggle."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Active. Tap to toggle."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"App standby state:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Media transcode settings"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Enable transcoding for all apps"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Disable transcoding for apps"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 49e3a7c..7729f8e 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inactive. Tap to toggle."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Active. Tap to toggle."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"App standby state:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Media transcode settings"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Enable transcoding for all apps"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Disable transcoding for apps"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 49e3a7c..7729f8e 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inactive. Tap to toggle."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Active. Tap to toggle."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"App standby state:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Media transcode settings"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Enable transcoding for all apps"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Disable transcoding for apps"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 94049a7..dacc782 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎‎‎‏‏‎‏‎‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‎‏‎‎‎Inactive. Tap to toggle.‎‏‎‎‏‎"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‏‎‎‎‎‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‎‎Active. Tap to toggle.‎‏‎‎‏‎"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‏‎‎‎‏‎‏‎‎‏‎‏‏‎‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‎‏‏‎‏‎‎‎‎‎‎App standby state:‎‏‎‎‏‏‎<xliff:g id="BUCKET"> %s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‎‏‏‏‏‎‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎Media transcode settings‎‏‎‎‏‎"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‏‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎Enable transcoding for all apps‎‏‎‎‏‎"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‎‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‎‎‏‎‎‏‎‏‎‎‏‏‏‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‎‎Disable transcoding for apps‎‏‎‎‏‎"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‎‎‏‎‎‏‏‏‏‎‏‏‏‏‏‏‎‎‏‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‏‏‎Running services‎‏‎‎‏‎"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‎‎‏‏‎‎‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‎‏‎‏‎‎‎‎‎‎‏‏‏‏‎View and control currently running services‎‏‎‎‏‎"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‎‎‏‎‏‎‏‎‏‏‏‏‏‏‏‏‎WebView implementation‎‏‎‎‏‎"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 5d4c153..40eb0c7 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inactiva. Presiona para activar o desactivar."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Activa. Presiona para activar o desactivar."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Estado de la app en espera: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Configuración de la transcodificación multimedia"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Habilitar la transcodificación para todas las apps"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Inhabilitar la transcodificación para las apps"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"En ejecución"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver y controlar servicios actuales en ejecución"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementación de WebView"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 9bd3256..8366917 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inactiva. Toca para alternar."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Activa. Toca para alternar."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Estado de la aplicación en espera: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Configuración de la transcodificación multimedia"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Habilitar transcodificación en todas las aplicaciones"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Inhabilitar transcodificación en las aplicaciones"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Servicios en ejecución"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver y controlar los servicios en ejecución"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementación de WebView"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 732b1f5..5cd4fc9 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -81,7 +81,7 @@
     <string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> akut"</string>
     <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> akut, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> akut"</string>
     <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiivne"</string>
-    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Meedia heli"</string>
+    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Meediaheli"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonikõned"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Failiedastus"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Sisendseade"</string>
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Passiivne. Puudutage vahetamiseks."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktiivne. Puudutage vahetamiseks."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Rakenduse ootelolek:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Käitatud teenused"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Praegu käitatud teenuste vaatamine ja juhtimine"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView\' rakendamine"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 9f4bd1a..ae675ec 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inaktibo. Aldatzeko, sakatu hau."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktibo. Aldatzeko, sakatu hau."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Egonean moduko aplikazioaren egoera: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Abian diren zerbitzuak"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ikusi eta kontrolatu une honetan abian diren zerbitzuak"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView inplementazioa"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 1a5acc4..1d7597c 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"غیرفعال. برای تغییر حالت ضربه بزنید."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"فعال. برای تغییر حالت ضربه بزنید."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"وضعیت حالت آماده به‌کار برنامه:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"سرویس‌های در حال اجرا"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"مشاهده و کنترل سرویس‌های در حال اجرای فعلی"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"اجرای وب‌نما"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 9542646..082c488 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Ei päällä. Ota käyttöön koskettamalla."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktiivinen. Vaihda koskettamalla."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Sovelluksen valmiusluokka: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Käynnissä olevat palvelut"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Tarkastele ja hallitse käynnissä olevia palveluita."</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-käyttöönotto"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 7367dc3..bdeca0e 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Application inactive. Touchez ici pour l\'activer."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Application active. Touchez ici pour la désactiver."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"État de l\'application en veille :<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Services en cours d\'exécution"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Afficher et contrôler les services en cours d\'exécution"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Mise en œuvre WebView"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index f1474ad..42ff0b1 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Application inactive. Appuyez ici pour l\'activer."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Application active. Appuyez ici pour la désactiver."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"État de mise en veille de l\'application : <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Paramètres de transcodage des contenus multimédias"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Activer le transcodage pour toutes les applications"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Désactiver le transcodage pour les applications"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Services en cours d\'exécution"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Afficher et contrôler les services en cours d\'exécution"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Mise en œuvre WebView"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 1e651a4..036eccf 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Aplicación inactiva. Toca para alternar a configuración."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aplicación activa. Toca para alternar a configuración."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Estado en espera da aplicación: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Servizos en uso"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Comproba e controla os servizos actualmente en uso"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementación de WebView"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index d52d487..e133115 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"નિષ્ક્રિય. ટોગલ કરવા માટે ટૅપ કરો."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"સક્રિય. ટોગલ કરવા માટે ટૅપ કરો."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"ઍપ સ્ટૅન્ડબાયની સ્થિતિ:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"ચાલુ સેવાઓ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"હાલમાં ચાલતી સેવાઓ જુઓ અને નિયંત્રિત કરો"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView અમલીકરણ"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 9f63344..7732569 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"बंद है. टॉगल करने के लिए टैप करें."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"सक्रिय. टॉगल करने के लिए टैप करें."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"ऐप्लिकेशन स्टैंडबाय की स्थिति:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"मीडिया फ़ाइलों को ट्रांसकोड करने से जुड़ी सेटिंग"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"सभी ऐप्लिकेशन के लिए ट्रांसकोडिंग चालू करें"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"ऐप्लिकेशन के लिए ट्रांसकोडिंग बंद करें"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"चल रही सेवाएं"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"इस समय चल रही सेवाओं को देखें और नियंत्रित करें"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"वेबव्यू लागू करें"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index f95f8c1..bc0c2bc 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Nije aktivno. Dodirnite da biste to promijenili."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktivno. Dodirnite da biste to promijenili."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Stanje aplikacije u mirovanju: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Postavke konvertiranja medija"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Omogućavanje konvertiranja za sve aplikacije"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Onemogućivanje konvertiranja za aplikacije"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Pokrenute usluge"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Pregledajte i kontrolirajte pokrenute usluge"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementacija WebViewa"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 3167c83..37b5b50 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Kikapcsolva. Koppintson ide a váltáshoz."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Bekapcsolva. Koppintson ide a váltáshoz."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Alkalmazás készenléti állapota:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Média átkódolásához tartozó beállítások"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Átkódolás engedélyezése minden alkalmazásnál"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Átkódolás letiltása az alkalmazásoknál"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Futó szolgáltatások"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"A jelenleg futó szolgáltatások megtekintése és vezérlése"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-megvalósítás"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index e6ef17d..0ae403e 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Ակտիվ չէ: Հպեք՝ փոխելու համար:"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Ակտիվ է: Հպեք՝ փոխելու համար:"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Հավելվածի սպասման կարգավիճակ՝ <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Աշխատող ծառայություններ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Դիտել և վերահսկել ընթացիկ աշխատող ծառայությունները"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ծառայություն"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 7498472..6328c27 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Tidak aktif. Ketuk untuk beralih."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktif. Ketuk untuk beralih."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Status standby aplikasi:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Layanan yang sedang berjalan"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Melihat dan mengontrol layanan yang sedang berjalan"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Penerapan WebView"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 5e91394..724cf63 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Óvirkt. Ýttu til að breyta."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Virkt. Ýttu til að breyta."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Biðstaða forrits: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Umkóðunarstillingar efnis"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Kveikja á umkóðun í öllum forritum"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Slökkva á umkóðun í forritum"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Þjónustur í gangi"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Skoða og stjórna þjónustum í gangi"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Innleiðing WebView"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index e42f109..4edb887 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Non attiva. Tocca per attivare/disattivare."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Attiva. Tocca per attivare/disattivare."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Stato di standby dell\'app: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Impostazioni transcodifica contenuti multimediali"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Attiva transcodifica per tutte le app"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Disattiva transcodifica per le app"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Servizi in esecuzione"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualizza e controlla i servizi attualmente in esecuzione"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementazione di WebView"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index e313552..ede5f6a 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"אפליקציה לא פעילה. הקש כדי להחליף מצב."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"אפליקציה פעילה. הקש כדי להחליף מצב."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"אפליקציה במצב המתנה:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"שירותים פועלים"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"הצגת השירותים הפועלים כעת ושליטה בהם"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"‏יישום WebView"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 7c15986..d713481 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"無効です。タップすると切り替わります。"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"有効です。タップすると切り替わります。"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"アプリ スタンバイ状態: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"実行中のサービス"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"現在実行中のサービスを表示して制御する"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView の実装"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index dd10e39..e815621 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"უმოქმედო. შეეხეთ გადასართავად."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"აქტიური. შეეხეთ გადასართავად."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"აპის მოლოდინის რეჟიმის მდგომარეობა:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"მედიის ტრანსკოდირების პარამეტრები"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"ტრანსკოდირების ჩართვა ყველა აპისთვის"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"ტრანსკოდირების გამორთვა ყველა აპისთვის"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"მიმდინარე სერვისები"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ამჟამად მოქმედი სერვისების ნახვა და მართვა"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView რეალიზაცია"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 4857fe9..fc5a84a 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Белсенді емес. Ауыстырып қосу үшін түртіңіз."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Белсенді. Ауыстырып қосу үшін түртіңіз."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Қолданбаның күту режимі: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Қосылып тұрған қызметтер"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Қазір істеп тұрған қызметтерді көру және басқару"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView қызметі"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 6909af8c..c0dbeb3 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"សកម្ម។ ប៉ះដើម្បីបិទ/បើក។"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"សកម្ម។ ប៉ះដើម្បីបិទ/បើក។"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"ស្ថាន​ភាព​មុខងារ​ផ្អាក​ដំណើរការ​កម្មវិធី៖<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"សេវាកម្ម​កំពុង​ដំណើរការ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"មើល និង​គ្រប់គ្រង​សេវាកម្ម​កំពុង​ដំណើរការ​បច្ចុប្បន្ន"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"ការអនុវត្ត WebView"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 40e3f1f2c..09e82e5 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ನಿಷ್ಕ್ರಿಯ. ಟಾಗಲ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"ಸಕ್ರಿಯ. ಟಾಗಲ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"ಅಪ್ಲಿಕೇಶನ್ ಸ್ಟ್ಯಾಂಡ್‌ಬೈ ಸ್ಥಿತಿ:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"ರನ್‌ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳು"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ಈಗ ರನ್‌ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿಯಂತ್ರಿಸಿ"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ಹೊಂದಿಸಿ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 3b7a9e5..aad302c 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"비활성화 상태입니다. 전환하려면 탭하세요."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"활성화되었습니다. 전환하려면 탭하세요."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"앱 대기 상태:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"실행 중인 서비스"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"현재 실행 중인 서비스 보기 및 제어"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 구현"</string>
@@ -559,5 +565,5 @@
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"변경사항을 적용하려면 기기를 재부팅해야 합니다. 지금 재부팅하거나 취소하세요."</string>
     <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"유선 헤드폰"</string>
     <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"사용"</string>
-    <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"사용 안함"</string>
+    <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"사용 안 함"</string>
 </resources>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 44654fc..39e76bd 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Иштеген жок. Күйгүзүү үчүн басып коюңуз."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Иштеп турат. Өчүрүү үчүн басып коюңуз."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Көшүү режиминдеги колдонмонун абалы:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Иштеп жаткан кызматтар"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Учурда иштеп жаткан кызматтарды көрүп, көзөмөлдөп турасыз"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView кызматы"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index bcb5ad1..f54c94c 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ບໍ່ໄດ້ນຳໃຊ້. ແຕະບໍ່ສັບປ່ຽນ."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"ນຳໃຊ້ຢູ່. ແຕະເພື່ອສັບປ່ຽນ."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"ສະຖານະສະແຕນບາຍແອັບ:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"ບໍລິການທີ່ເຮັດວຽກຢູ່"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ເບິ່ງ ແລະຈັດການບໍລິການທີ່ກຳລັງເຮັດວຽກຢູ່ໃນປັດຈຸບັນ"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"ການຈັດຕັ້ງປະຕິບັດ WebView"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 3fc631a..ff4d336 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Neaktyvi. Palieskite, kad perjungtumėte."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktyvi. Palieskite, kad perjungtumėte."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Programų budėjimo režimo būsena: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Medijos perkodavimo nustatymai"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Įjungti visų programų perkodavimą"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Išjungti programų perkodavimą"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Vykdomos paslaugos"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Žiūrėti ir valdyti dabar vykdomas paslaugas"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"„WebView“ diegimas"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 617a4f1..e876cef 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Neaktīva. Pieskarieties, lai pārslēgtu."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktīva. Pieskarieties, lai pārslēgtu."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Lietotnes gaidstāves stāvoklis: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Multivides failu pārkodēšanas iestatījumi"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Iespējot pārkodēšanu visām lietotnēm"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Atspējot pārkodēšanu noteiktām lietotnēm"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Aktīvie pakalpojumi"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Pašreiz darbojošos pakalpojumu skatīšana un vadība"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ieviešana"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 18a62d2..0ff5d9a 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Неактивно. Допрете за да смените."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Активно. Допрете за да смените."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Состојба на мирување на апликацијата: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Поставки за транскодирање на аудиовизуелни содржини"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Овозможи транскодирање за сите апликации"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Оневозможи транскодирање за сите апликации"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Активни услуги"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Погледнете и контролирајте услуги што се моментално активни"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Воведување WebView"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 0ff31a61..4aae6ee 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"നിഷ്‌ക്രിയം. മാറ്റുന്നതിനു ടാപ്പുചെയ്യുക."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"സജീവം. മാറ്റുന്നതിന് ടാപ്പുചെയ്യുക."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"ആപ്പ് സ്‌റ്റാൻഡ്‌ബൈ നില:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"പ്രവർത്തിക്കുന്ന സേവനങ്ങൾ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"നിലവിൽ പ്രവർത്തിക്കുന്ന സേവനങ്ങൾ കാണുക, നിയന്ത്രിക്കുക"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView നടപ്പാക്കൽ"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 2fb4e44..fcf8183 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Идэвхгүй байна. Унтраах/асаахын тулд дарна уу."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Идэвхтэй байна. Унтраах/асаахын тулд дарна уу."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Апп зогсолтын горимын төлөв:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Ажиллаж байгаа үйлчилгээнүүд"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Одоо ажиллаж байгаа үйлчилгээнүүдийг харах болон хянах"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView хэрэгжилт"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 5ea183e..d6563ae 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"निष्क्रिय. टॉगल करण्यासाठी टॅप करा."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"सक्रिय. टॉगल करण्यासाठी टॅप करा."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"अ‍ॅप स्टँडबाय स्थिती: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"सुरू सेवा"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"सध्या सुरू असलेल्या सेवा पहा आणि नियंत्रित करा"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"वेबदृश्य अंमलबजावणी"</string>
@@ -558,8 +564,6 @@
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"सुरू केले आहे"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"हा बदल लागू करण्यासाठी तुमचे डिव्हाइस रीबूट करणे आवश्यक आहे. आता रीबूट करा किंवा रद्द करा."</string>
     <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"वायर असलेला हेडफोन"</string>
-    <!-- no translation found for wifi_hotspot_switch_on_text (9212273118217786155) -->
-    <skip />
-    <!-- no translation found for wifi_hotspot_switch_off_text (7245567251496959764) -->
-    <skip />
+    <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"सुरू करा"</string>
+    <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"बंद करा"</string>
 </resources>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 56d3f0f..6bcc5d2 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Tidak aktif. Ketik untuk menogol."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktif. Ketik untuk menogol."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Keadaan tunggu sedia apl:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Tetapan transpengekodan media"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Dayakan transpengekodan untuk semua apl"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Lumpuhkan transpengekodan untuk apl"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Perkhidmatan dijalankan"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Lihat dan kawal perkhidmatan yang sedang dijalankan"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Pelaksanaan WebView"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 0ba2102..8760bf2 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ပွင့်မနေပါ။ ပြောင်းရန်တို့ပါ။"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"ပွင့်နေသည်။ ပြောင်းရန်တို့ပါ။"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"အက်ပ်ကို အရန်သင့်ထားရှိခြင်း အခြေအနေ-<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"အလုပ်လုပ်နေသောဝန်ဆောင်မှုများ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"လက်ရှိ ဝန်ဆောင်မှုများကို ကြည့်ရှု ထိန်းသိမ်းသည်"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView အကောင်အထည်ဖော်မှု"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 47150e5..88eac30 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Ikke aktiv. Trykk for å slå av/på."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktiv. Trykk for å slå av/på."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Hvilemodus:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Aktive tjenester"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Se og kontrollér tjenester som kjører"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 8a86692..417072e 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"निष्क्रिय। टगल गर्न ट्याप गर्नुहोस्।"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"सक्रिय। टगल गर्न ट्याप गर्नुहोस्।"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"एपको स्ट्यान्डबाई अवस्था:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"चलिरहेका सेवाहरू"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"हाल चालु भइरहेका सेवाहरू हेर्नुहोस् र नियन्त्रण गर्नुहोस्"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView कार्यान्वयन"</string>
@@ -558,8 +564,6 @@
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"सक्षम पारिएको छ"</string>
     <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"यो परिवर्तन लागू गर्न तपाईंको यन्त्र अनिवार्य रूपमा रिबुट गर्नु पर्छ। अहिले रिबुट गर्नुहोस् वा रद्द गर्नुहोस्।"</string>
     <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"तारसहितको हेडफोन"</string>
-    <!-- no translation found for wifi_hotspot_switch_on_text (9212273118217786155) -->
-    <skip />
-    <!-- no translation found for wifi_hotspot_switch_off_text (7245567251496959764) -->
-    <skip />
+    <string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"अन छ"</string>
+    <string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"अफ छ"</string>
 </resources>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 87bb8d5..bf40f40 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inactief. Tik om te schakelen."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Actief. Tik om te schakelen."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Stand-bystatus app: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Instellingen voor mediatranscodering"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Transcodering inschakelen voor alle apps"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Transcodering uitschakelen voor alle apps"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Actieve services"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Services die momenteel actief zijn, weergeven en beheren"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementatie"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 1fe6d7f..8c5edab 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ନିଷ୍କ୍ରିୟ। ଟୋଗଲ୍‌ କରିବାକୁ ଟାପ୍‌ କରନ୍ତୁ।"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"ସକ୍ରିୟ। ବଦଳାଇବା ପାଇଁ ଟାପ୍‌ କରନ୍ତୁ"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"ଆପ୍ ଷ୍ଟାଣ୍ଡବାଏ ଅବସ୍ଥା:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ଏବେ ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ ଓ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"ୱେବ୍‌ଭ୍ୟୁ ପ୍ରୟୋଗ"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 934f111..8d7fa69 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ਅਕਿਰਿਆਸ਼ੀਲ। ਟੌਗਲ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"ਕਿਰਿਆਸ਼ੀਲ। ਟੌਗਲ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"ਐਪ ਸਟੈਂਡਬਾਈ ਸਥਿਤੀ:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ਇਸ ਵੇਲੇ ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ ਦੇਖੋ ਅਤੇ ਇਹਨਾਂ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ਅਮਲ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 8629b05..7982923 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Nieaktywna. Dotknij, by zmienić."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktywna. Dotknij, by zmienić."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Stan aplikacji w trybie czuwania: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Uruchomione usługi"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Wyświetl obecnie uruchomione usługi i nimi zarządzaj"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementacja WebView"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index bac1ae4..d9d1973 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inativo. Tocar para alternar."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Ativo. Tocar para alternar."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Estado em espera do app:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Configurações de transcodificação de mídia"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Ativar a transcodificação para todos os apps"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Desativar a transcodificação para apps"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualizar e controlar os serviços em execução no momento"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação do WebView"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index edc2cea..ee6e5fe 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inativo. Toque para ativar/desativar."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Ativo. Toque para ativar/desativar."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Estado do Modo de espera das apps:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Definições da transcodificação multimédia"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Ativar transcodificação para todas as apps"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Desative a transcodificação para apps"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver e controlar os serviços actualmente em execução"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação WebView"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index bac1ae4..d9d1973 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inativo. Tocar para alternar."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Ativo. Tocar para alternar."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Estado em espera do app:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Configurações de transcodificação de mídia"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Ativar a transcodificação para todos os apps"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Desativar a transcodificação para apps"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualizar e controlar os serviços em execução no momento"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação do WebView"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 6445b9e..b0e99acc 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inactivă. Atingeți pentru a comuta."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Activă. Atingeți pentru a comuta."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Stare Standby aplicații: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Servicii în curs de funcționare"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Vedeți și controlați serviciile care funcționează în prezent"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementare WebView"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 0b18af8..e61eb29 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Выключено. Нажмите, чтобы включить."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Включено. Нажмите, чтобы отключить."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Статус приложения в режиме ожидания:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Настройки перекодирования медиаконтента"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Разрешить перекодирование для всех приложений"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Приложения, для которых нужно запретить перекодирование"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Работающие службы"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Просмотр и управление работающими службами"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Сервис WebView"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 40327132..fd1bec1a 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"අක්‍රියයි. ටොගල කිරීමට තට්ටු කරන්න."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"සක්‍රියයි. ටොගල කිරීමට තට්ටු කරන්න."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"යෙදුම් පොරොත්තු තත්ත්වය:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"ධාවනය වන සේවා"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"දැනට ධාවනය වන සේවා බලන්න සහ පාලනය කරන්න"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ක්‍රියාත්මක කිරීම"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 4e3529f..020815d 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Neaktívne. Prepnite klepnutím."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktívne. Prepnite klepnutím."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Stav pohotovostného režimu aplikácie: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Nastavenie prekódovania médií"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Povoliť prekódovanie všetkých aplikácií"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Zakázať prekódovanie všetkých aplikácií"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Spustené služby"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Zobrazovať a riadiť aktuálne spustené služby"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementácia WebView"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 22dd5dd..f56009a 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Neaktivno. Dotaknite se za preklop."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktivno. Dotaknite se za preklop."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Stanje pripravljenosti aplikacije: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Zagnane storitve"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Preglejte in nadzorujte storitve, ki so trenutno zagnane"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Izvedba spletnega pogleda"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index db29b41..2ef438c 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Joaktiv. Trokit për ta ndryshuar."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktiv. Trokit për ta ndryshuar."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Gjendja e gatishmërisë e aplikacionit:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Shërbimet në ekzekutim"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Shiko dhe kontrollo shërbimet që po ekzekutohen aktualisht"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Zbatimi i WebView"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 97398d0..34fd555 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Неактивна. Додирните да бисте је активирали."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Активна. Додирните да бисте је деактивирали."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Стање приправности апликације: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Подешавања транскодирања медија"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Омогући транскодирање за све апликације"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Онемогућите транскодирање за апликације"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Покренуте услуге"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Приказ и контрола тренутно покренутих услуга"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Примена WebView-а"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 8bdfa0d..2c6bb29 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inaktiv. Tryck om du vill aktivera."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktiv. Tryck om du vill inaktivera."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Status för strömsparfunktion för appar:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Inställningar för medieomkodning"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Aktivera omkodning för alla appar"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Inaktivera omkodning för appar"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Aktiva tjänster"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visa och styr aktiva tjänster"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index bbd1b8a..d4efd4a 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Haitumika. Gusa ili ugeuze."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Inatumika. Gusa ili ugeuze."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Hali ya kisitisha programu:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Huduma zinazoendeshwa"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Onyesha na udhibiti huduma zinazoendeshwa kwa sasa"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Utekelezaji wa WebView"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index a386739..e546ad7 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"செயலில் இல்லை. மாற்ற, தட்டவும்."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"செயலில் உள்ளது. மாற்ற, தட்டவும்."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"காத்திருப்பில் உள்ள ஆப்ஸின் நிலை:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"மீடியா குறிமாற்ற அமைப்புகள்"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"அனைத்து ஆப்ஸுக்கும் குறிமாற்றத்தை இயக்கு"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"அனைத்து ஆப்ஸுக்கும் குறிமாற்றத்தை முடக்கு"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"இயங்கும் சேவைகள்"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"தற்போது இயக்கத்தில் இருக்கும் சேவைகளைப் பார்த்து கட்டுப்படுத்து"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView செயல்படுத்தல்"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 4023897..929aed6 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"నిష్క్రియంగా ఉంది. టోగుల్ చేయడానికి నొక్కండి."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"సక్రియంగా ఉంది. టోగుల్ చేయడానికి నొక్కండి."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"యాప్ స్టాండ్‌బై స్థితి:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"అమలులో ఉన్న సేవలు"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ప్రస్తుతం అమలులో ఉన్న సేవలను వీక్షించండి మరియు నియంత్రించండి"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"వెబ్ వీక్షణ అమలు"</string>
@@ -472,7 +478,7 @@
     <string name="screen_zoom_summary_very_large" msgid="7317423942896999029">"చాలా పెద్దగా"</string>
     <string name="screen_zoom_summary_extremely_large" msgid="1438045624562358554">"అతి పెద్దగా"</string>
     <string name="screen_zoom_summary_custom" msgid="3468154096832912210">"అనుకూలం (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
-    <string name="content_description_menu_button" msgid="6254844309171779931">"మెను"</string>
+    <string name="content_description_menu_button" msgid="6254844309171779931">"మెనూ"</string>
     <string name="retail_demo_reset_message" msgid="5392824901108195463">"డెమో మోడ్‌లో ఫ్యాక్టరీ రీసెట్‌ను నిర్వహించడానికి పాస్‌వర్డ్‌ను నమోదు చేయండి"</string>
     <string name="retail_demo_reset_next" msgid="3688129033843885362">"తర్వాత"</string>
     <string name="retail_demo_reset_title" msgid="1866911701095959800">"పాస్‌వర్డ్ అవసరం"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 4d22fb0..8fdbf45 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ไม่ได้ใช้งาน แตะเพื่อสลับ"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"ใช้งานอยู่ แตะเพื่อสลับ"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"สถานะการสแตนด์บายของแอป:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"บริการที่ทำงานอยู่"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ดูและควบคุมบริการที่ทำงานอยู่"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"การใช้งาน WebView"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 875bbff..97e835e 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Hindi aktibo. I-tap upang i-toggle."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktibo. I-tap upang i-toggle."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Status ng app standby:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Mga tumatakbong serbisyo"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Tingnan at kontrolin ang mga kasalukuyang tumatakbong serbisyo"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Pagpapatupad sa WebView"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 9604c94..a6d89ea 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Etkin değil. Geçiş yapmak için dokunun."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Etkin. Geçiş yapmak için dokunun."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Uygulamayı beklemeye alma durumu: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Çalışan hizmetler"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Şu anda çalışan hizmetleri görüntüle ve denetle"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Web Görünümü kullanımı"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 03eb42c..3664118 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Неактивний додаток. Торкніться, щоб активувати."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Активний додаток. Торкніться, щоб дезактивувати."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Режим очікування: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Запущені сервіси"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Переглянути й налаштувати запущені сервіси"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Застосування WebView"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 12f36fb..507f8cc 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"غیر فعال۔ ٹوگل کرنے کیلئے تھپتھپائیں۔"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"فعال۔ ٹوگل کرنے کیلئے تھپتھپائیں۔"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"ایپ اسٹینڈ بائی کی حالت:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"چل رہی سروسز"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"فی الحال چل رہی سروسز دیکھیں اور انہیں کنٹرول کریں"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"‏WebView کا نفاذ"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index aaaa029..47c7154 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Nofaol. O‘zgartirish uchun bu yerga bosing."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Faol. O‘zgartirish uchun bu yerga bosing."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Kutish rejimi holati: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Ishlab turgan ilovalar"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ishlab turgan ilovalarni ko‘rish va boshqarish"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ta’minotchisi"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 94494c78..a434184 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Không hoạt động. Nhấn để chuyển đổi."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Hiện hoạt. Nhấn để chuyển đổi."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Trạng thái chờ ứng dụng:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Các dịch vụ đang chạy"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Xem và kiểm soát các dịch vụ đang chạy"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Triển khai WebView"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 00233c5..c024203 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"未启用。点按即可切换。"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"已启用。点按即可切换。"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"应用待机状态:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"正在运行的服务"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"查看和控制当前正在运行的服务"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 实现"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index b83ad35..b2d11b8 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"未啟用。輕按即可切換。"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"已啟用。輕按即可切換。"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"備用應用程式狀態:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"執行中的服務"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"查看並控制目前正在執行中的服務"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 設置"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index e5ef613..f02d067 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -399,6 +399,12 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"未啟用。輕觸即可切換。"</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"已啟用。輕觸即可切換。"</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"應用程式待命狀態:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <!-- no translation found for transcode_settings_title (6700974145733932357) -->
+    <skip />
+    <!-- no translation found for transcode_enable_all (4719796495995795404) -->
+    <skip />
+    <!-- no translation found for transcode_skip_apps (5680997722349545778) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="6460099290493086515">"正在運作的服務"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"查看並管理目前正在執行的服務"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 實作"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index ba30700..ead2800 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -399,6 +399,9 @@
     <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Akusebenzi. Thepha ukuze ushintshe."</string>
     <string name="inactive_app_active_summary" msgid="8047630990208722344">"Kuyasebenza. Thepha ukuze ushintshe."</string>
     <string name="standby_bucket_summary" msgid="5128193447550429600">"Isimo sokulinda kohlelo lokusebenza:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
+    <string name="transcode_settings_title" msgid="6700974145733932357">"Amasethingi emidiya yokudlulisela ikhodi"</string>
+    <string name="transcode_enable_all" msgid="4719796495995795404">"Nikela amandla ukudlulisela ikhodi kuzonke izinhlelo zokusebenza"</string>
+    <string name="transcode_skip_apps" msgid="5680997722349545778">"Khubaza ukudlulisela ikhodi kwezinhlelo zokusebenza"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Amasevisi asebenzayo"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Buka futhi ulawule amasevisi  asebenzayo okwamanje"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Ukufakwa ke-WebView"</string>
diff --git a/packages/SettingsProvider/src/android/provider/settings/OWNERS b/packages/SettingsProvider/src/android/provider/settings/OWNERS
index 7e7710b..0f88811 100644
--- a/packages/SettingsProvider/src/android/provider/settings/OWNERS
+++ b/packages/SettingsProvider/src/android/provider/settings/OWNERS
@@ -1,4 +1,4 @@
 # Bug component: 656484
 
-include platform/frameworks/base/services/backup:/OWNERS
+include platform/frameworks/base:/services/backup/OWNERS
 
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index ffbc7f4c..09f7866 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -60,7 +60,7 @@
         Settings.Secure.ACCESSIBILITY_CAPTIONING_TYPEFACE,
         Settings.Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE,
         Settings.Secure.ACCESSIBILITY_CAPTIONING_WINDOW_COLOR,
-        Settings.Secure.FORCE_BOLD_TEXT,
+        Settings.Secure.FONT_WEIGHT_ADJUSTMENT,
         Settings.Secure.REDUCE_BRIGHT_COLORS_LEVEL,
         Settings.Secure.REDUCE_BRIGHT_COLORS_PERSIST_ACROSS_REBOOTS,
         Settings.Secure.TTS_DEFAULT_RATE,
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index 46c42fc..d16aebb 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -102,7 +102,7 @@
                 Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE,
                 new InclusiveFloatRangeValidator(0.5f, 2.0f));
         VALIDATORS.put(Secure.ACCESSIBILITY_CAPTIONING_WINDOW_COLOR, ANY_INTEGER_VALIDATOR);
-        VALIDATORS.put(Secure.FORCE_BOLD_TEXT, new DiscreteValueValidator(new String[] {"1", "2"}));
+        VALIDATORS.put(Secure.FONT_WEIGHT_ADJUSTMENT, ANY_INTEGER_VALIDATOR);
         VALIDATORS.put(Secure.REDUCE_BRIGHT_COLORS_LEVEL, PERCENTAGE_INTEGER_VALIDATOR);
         VALIDATORS.put(Secure.REDUCE_BRIGHT_COLORS_PERSIST_ACROSS_REBOOTS, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.TTS_DEFAULT_RATE, NON_NEGATIVE_INTEGER_VALIDATOR);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 2e551fa..e9f09e5 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -1769,8 +1769,8 @@
                 Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED,
                 SecureSettingsProto.Accessibility.HIGH_TEXT_CONTRAST_ENABLED);
         dumpSetting(s, p,
-                Settings.Secure.FORCE_BOLD_TEXT,
-                SecureSettingsProto.FORCE_BOLD_TEXT);
+                Settings.Secure.FONT_WEIGHT_ADJUSTMENT,
+                SecureSettingsProto.FONT_WEIGHT_ADJUSTMENT);
         dumpSetting(s, p,
                 Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON,
                 SecureSettingsProto.Accessibility.LARGE_POINTER_ICON);
diff --git a/packages/SettingsProvider/test/src/android/provider/OWNERS b/packages/SettingsProvider/test/src/android/provider/OWNERS
index 7e7710b..0f88811 100644
--- a/packages/SettingsProvider/test/src/android/provider/OWNERS
+++ b/packages/SettingsProvider/test/src/android/provider/OWNERS
@@ -1,4 +1,4 @@
 # Bug component: 656484
 
-include platform/frameworks/base/services/backup:/OWNERS
+include platform/frameworks/base:/services/backup/OWNERS
 
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 20b4451..a97af4b 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -249,6 +249,7 @@
 
     <!-- Permission required for CTS test - UiModeManagerTest -->
     <uses-permission android:name="android.permission.ENTER_CAR_MODE_PRIORITIZED"/>
+    <uses-permission android:name="android.permission.READ_PROJECTION_STATE"/>
 
     <!-- Permission required for CTS tests - UiModeManagerTest, CarModeInCallServiceTest -->
     <uses-permission android:name="android.permission.TOGGLE_AUTOMOTIVE_PROJECTION"/>
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 5200d95..d50f08d 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -386,6 +386,9 @@
             }
         }
 
+        @Override
+        public void onEarlyReportFinished() {}
+
         /**
          * Reads bugreport id and links it to the bugreport info to track a bugreport that is in
          * process. id is incremented in the dumpstate code.
diff --git a/packages/Shell/src/com/android/shell/HeapDumpReceiver.java b/packages/Shell/src/com/android/shell/HeapDumpReceiver.java
index 858c521..7433c3e 100644
--- a/packages/Shell/src/com/android/shell/HeapDumpReceiver.java
+++ b/packages/Shell/src/com/android/shell/HeapDumpReceiver.java
@@ -180,7 +180,7 @@
                 .setContentText(context.getText(
                         com.android.internal.R.string.dump_heap_notification_detail))
                 .setContentIntent(PendingIntent.getActivity(context, 2, shareIntent,
-                        PendingIntent.FLAG_UPDATE_CURRENT));
+                        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));
 
         Log.v(TAG, "Creating share heap dump notification");
         NotificationManager.from(context).notify(NOTIFICATION_ID, builder.build());
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/NotificationListenerController.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/NotificationListenerController.java
index fac9e98..6799450 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/NotificationListenerController.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/NotificationListenerController.java
@@ -14,6 +14,8 @@
 
 package com.android.systemui.plugins;
 
+import android.app.NotificationChannel;
+import android.os.UserHandle;
 import android.service.notification.NotificationListenerService.RankingMap;
 import android.service.notification.StatusBarNotification;
 
@@ -30,13 +32,32 @@
 
     void onListenerConnected(NotificationProvider provider);
 
+    /**
+     * @return whether plugin wants to skip the default callbacks.
+     */
     default boolean onNotificationPosted(StatusBarNotification sbn, RankingMap rankingMap) {
         return false;
     }
+
+    /**
+     * @return whether plugin wants to skip the default callbacks.
+     */
     default boolean onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap) {
         return false;
     }
 
+    /**
+     * Called when a notification channel is modified.
+     * @param modificationType One of {@link #NOTIFICATION_CHANNEL_OR_GROUP_ADDED},
+     *                                {@link #NOTIFICATION_CHANNEL_OR_GROUP_UPDATED},
+     *                                {@link #NOTIFICATION_CHANNEL_OR_GROUP_DELETED}.
+     * @return whether a plugin wants to skip the default callbacks.
+     */
+    default boolean onNotificationChannelModified(
+            String pkgName, UserHandle user, NotificationChannel channel, int modificationType) {
+        return false;
+    }
+
     default StatusBarNotification[] getActiveNotifications(
             StatusBarNotification[] activeNotifications) {
         return activeNotifications;
diff --git a/packages/SystemUI/res/layout/auth_biometric_contents.xml b/packages/SystemUI/res/layout/auth_biometric_contents.xml
index 2439fed..aed067c 100644
--- a/packages/SystemUI/res/layout/auth_biometric_contents.xml
+++ b/packages/SystemUI/res/layout/auth_biometric_contents.xml
@@ -88,7 +88,8 @@
             android:layout_width="8dp"
             android:layout_height="match_parent"
             android:visibility="visible" />
-        <!-- Negative Button -->
+
+        <!-- Negative Button, reserved for app -->
         <Button android:id="@+id/button_negative"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
@@ -97,13 +98,32 @@
             android:ellipsize="end"
             android:maxLines="2"
             android:maxWidth="@dimen/biometric_dialog_button_negative_max_width"/>
+        <!-- Cancel Button, replaces negative button when biometric is accepted -->
+        <Button android:id="@+id/button_cancel"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
+            android:layout_gravity="center_vertical"
+            android:maxWidth="@dimen/biometric_dialog_button_negative_max_width"
+            android:text="@string/cancel"
+            android:visibility="gone"/>
+        <!-- "Use Credential" Button, replaces if device credential is allowed -->
+        <Button android:id="@+id/button_use_credential"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
+            android:layout_gravity="center_vertical"
+            android:maxWidth="@dimen/biometric_dialog_button_negative_max_width"
+            android:visibility="gone"/>
+
         <Space android:id="@+id/middleSpacer"
             android:layout_width="0dp"
             android:layout_height="match_parent"
             android:layout_weight="1"
             android:visibility="visible"/>
+
         <!-- Positive Button -->
-        <Button android:id="@+id/button_positive"
+        <Button android:id="@+id/button_confirm"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             style="@*android:style/Widget.DeviceDefault.Button.Colored"
@@ -124,6 +144,7 @@
             android:maxWidth="@dimen/biometric_dialog_button_positive_max_width"
             android:text="@string/biometric_dialog_try_again"
             android:visibility="gone"/>
+
         <Space android:id="@+id/rightSpacer"
             android:layout_width="8dp"
             android:layout_height="match_parent"
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index 4527c6c..89bf12d 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -29,25 +29,6 @@
         android:elevation="4dp"
         android:background="@drawable/qs_background_primary" />
 
-    <!-- Black part behind the status bar -->
-    <View
-        android:id="@+id/quick_settings_status_bar_background"
-        android:layout_width="match_parent"
-        android:layout_height="@*android:dimen/quick_qs_offset_height"
-        android:clipToPadding="false"
-        android:clipChildren="false"
-        android:background="#ff000000" />
-
-    <!-- Gradient view behind QS -->
-    <View
-        android:id="@+id/quick_settings_gradient_view"
-        android:layout_width="match_parent"
-        android:layout_height="126dp"
-        android:layout_marginTop="@*android:dimen/quick_qs_offset_height"
-        android:clipToPadding="false"
-        android:clipChildren="false"
-        android:background="@drawable/qs_bg_gradient" />
-
     <com.android.systemui.qs.NonInterceptingScrollView
         android:id="@+id/expanded_qs_scroll_view"
         android:layout_width="match_parent"
diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
index 11814a1..9cc09aa 100644
--- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
+++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
@@ -23,7 +23,7 @@
     <com.android.systemui.settings.brightness.BrightnessSliderView
         android:id="@+id/brightness_slider"
         android:layout_width="0dp"
-        android:layout_height="48dp"
+        android:layout_height="@dimen/brightness_mirror_height"
         android:layout_gravity="center_vertical"
         android:layout_weight="1"
         android:contentDescription="@string/accessibility_brightness"
diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
index 3c74801..f663ab4e 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
@@ -43,8 +43,7 @@
         android:paddingStart="@dimen/status_bar_left_clock_starting_padding"
         android:paddingEnd="@dimen/status_bar_left_clock_end_padding"
         android:singleLine="true"
-        android:textAppearance="@style/TextAppearance.StatusBar.Clock"
-        systemui:showDark="false" />
+        android:textAppearance="@style/TextAppearance.StatusBar.Clock" />
     </LinearLayout>
 
     <android.widget.Space
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 31a6e1e..92e0c1d 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -86,16 +86,11 @@
     <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"আবার স্ক্রিনশট নেওয়ার চেষ্টা করুন"</string>
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"বেশি জায়গা নেই তাই স্ক্রিনশটটি সেভ করা যাবে না৷"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"এই অ্যাপ বা আপনার প্রতিষ্ঠান স্ক্রিনশট নেওয়ার অনুমতি দেয়নি"</string>
-    <!-- no translation found for screenshot_edit_label (8754981973544133050) -->
-    <skip />
-    <!-- no translation found for screenshot_edit_description (3333092254706788906) -->
-    <skip />
-    <!-- no translation found for screenshot_scroll_label (7682877978685434621) -->
-    <skip />
-    <!-- no translation found for screenshot_scroll_description (7855773867093272175) -->
-    <skip />
-    <!-- no translation found for screenshot_dismiss_description (4702341245899508786) -->
-    <skip />
+    <string name="screenshot_edit_label" msgid="8754981973544133050">"এডিট করুন"</string>
+    <string name="screenshot_edit_description" msgid="3333092254706788906">"স্ক্রিনশট এডিট করুন"</string>
+    <string name="screenshot_scroll_label" msgid="7682877978685434621">"স্ক্রল করুন"</string>
+    <string name="screenshot_scroll_description" msgid="7855773867093272175">"স্ক্রিনশট স্ক্রল করুন"</string>
+    <string name="screenshot_dismiss_description" msgid="4702341245899508786">"স্ক্রিনশট বাতিল করুন"</string>
     <string name="screenshot_preview_description" msgid="7606510140714080474">"স্ক্রিনশটের প্রিভিউ"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"স্ক্রিন রেকর্ডার"</string>
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"স্ক্রিন রেকর্ডিং প্রসেস হচ্ছে"</string>
diff --git a/packages/SystemUI/res/values-bn/strings_tv.xml b/packages/SystemUI/res/values-bn/strings_tv.xml
index f9da81a..1c26840 100644
--- a/packages/SystemUI/res/values-bn/strings_tv.xml
+++ b/packages/SystemUI/res/values-bn/strings_tv.xml
@@ -21,10 +21,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mic_active" msgid="5766614241012047024">"মাইক্রোফোন চালু আছে"</string>
     <string name="app_accessed_mic" msgid="2754428675130470196">"%1$s আপনার ডিভাইসের মাইক্রোফোন অ্যাক্সেস করেছে"</string>
-    <!-- no translation found for notification_vpn_connected (3891023882833274730) -->
-    <skip />
-    <!-- no translation found for notification_vpn_disconnected (7150747626448044843) -->
-    <skip />
-    <!-- no translation found for notification_disclosure_vpn_text (3873532735584866236) -->
-    <skip />
+    <string name="notification_vpn_connected" msgid="3891023882833274730">"VPN কানেক্ট করা হয়েছে"</string>
+    <string name="notification_vpn_disconnected" msgid="7150747626448044843">"VPN ডিসকানেক্ট করা হয়েছে"</string>
+    <string name="notification_disclosure_vpn_text" msgid="3873532735584866236">"<xliff:g id="VPN_APP">%1$s</xliff:g>-এর মাধ্যমে"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-de/strings_tv.xml b/packages/SystemUI/res/values-de/strings_tv.xml
index 8756749..34fc6aa 100644
--- a/packages/SystemUI/res/values-de/strings_tv.xml
+++ b/packages/SystemUI/res/values-de/strings_tv.xml
@@ -21,10 +21,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mic_active" msgid="5766614241012047024">"Mikrofon aktiv"</string>
     <string name="app_accessed_mic" msgid="2754428675130470196">"%1$s hat auf dein Mikrofon zugegriffen"</string>
-    <!-- no translation found for notification_vpn_connected (3891023882833274730) -->
-    <skip />
-    <!-- no translation found for notification_vpn_disconnected (7150747626448044843) -->
-    <skip />
-    <!-- no translation found for notification_disclosure_vpn_text (3873532735584866236) -->
-    <skip />
+    <string name="notification_vpn_connected" msgid="3891023882833274730">"VPN ist verbunden"</string>
+    <string name="notification_vpn_disconnected" msgid="7150747626448044843">"VPN ist nicht verbunden"</string>
+    <string name="notification_disclosure_vpn_text" msgid="3873532735584866236">"Über <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index d9b805b..2ce2718 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -88,8 +88,8 @@
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"La aplicación o tu organización no permiten realizar capturas de pantalla"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de pantalla"</string>
-    <string name="screenshot_scroll_label" msgid="7682877978685434621">"Desplazarse"</string>
-    <string name="screenshot_scroll_description" msgid="7855773867093272175">"Desplazarse por la captura de pantalla"</string>
+    <string name="screenshot_scroll_label" msgid="7682877978685434621">"Pantalla continua"</string>
+    <string name="screenshot_scroll_description" msgid="7855773867093272175">"Hacer captura de pantalla continua"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Cerrar captura de pantalla"</string>
     <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa de captura de pantalla"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Grabación de pantalla"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 453d32e..835449f 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -89,7 +89,7 @@
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Editatu"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Editatu pantaila-argazkia"</string>
     <string name="screenshot_scroll_label" msgid="7682877978685434621">"Egin gora eta behera"</string>
-    <string name="screenshot_scroll_description" msgid="7855773867093272175">"Pantaila-kaptura etengabea"</string>
+    <string name="screenshot_scroll_description" msgid="7855773867093272175">"Pantaila-argazki etengabea"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Baztertu pantaila-argazkia"</string>
     <string name="screenshot_preview_description" msgid="7606510140714080474">"Pantaila-argazkiaren aurrebista"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Pantaila-grabagailua"</string>
diff --git a/packages/SystemUI/res/values-gu/strings_tv.xml b/packages/SystemUI/res/values-gu/strings_tv.xml
index 09346fa..297b6e1a 100644
--- a/packages/SystemUI/res/values-gu/strings_tv.xml
+++ b/packages/SystemUI/res/values-gu/strings_tv.xml
@@ -21,10 +21,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mic_active" msgid="5766614241012047024">"માઇક્રોફોન સક્રિય છે"</string>
     <string name="app_accessed_mic" msgid="2754428675130470196">"%1$sએ તમારો માઇક્રોફોન ઍક્સેસ કર્યો હતો"</string>
-    <!-- no translation found for notification_vpn_connected (3891023882833274730) -->
-    <skip />
-    <!-- no translation found for notification_vpn_disconnected (7150747626448044843) -->
-    <skip />
-    <!-- no translation found for notification_disclosure_vpn_text (3873532735584866236) -->
-    <skip />
+    <string name="notification_vpn_connected" msgid="3891023882833274730">"VPN કનેક્ટ કરેલું છે"</string>
+    <string name="notification_vpn_disconnected" msgid="7150747626448044843">"VPN ડિસ્કનેક્ટ કરેલું છે"</string>
+    <string name="notification_disclosure_vpn_text" msgid="3873532735584866236">"<xliff:g id="VPN_APP">%1$s</xliff:g> મારફતે"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-land/config.xml b/packages/SystemUI/res/values-land/config.xml
index 2f7fbaf..46ec23c 100644
--- a/packages/SystemUI/res/values-land/config.xml
+++ b/packages/SystemUI/res/values-land/config.xml
@@ -20,6 +20,9 @@
 <!-- These resources are around just to allow their values to be customized
      for different hardware and product builds. -->
 <resources>
+    <!-- The maximum number of tiles in the QuickQSPanel -->
+    <integer name="quick_qs_panel_max_columns">6</integer>
+
     <!-- The maximum number of rows in the QuickSettings -->
     <integer name="quick_settings_max_rows">2</integer>
 
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index ff67a40..a487a63 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -86,16 +86,11 @@
     <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"स्क्रीनशॉट पुन्हा घेण्याचा प्रयत्न करा"</string>
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"मर्यादित स्टोरेज जागेमुळे स्क्रीनशॉट सेव्ह करू शकत नाही"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"अ‍ॅप किंवा आपल्या संस्थेद्वारे स्क्रीनशॉट घेण्याची अनुमती नाही"</string>
-    <!-- no translation found for screenshot_edit_label (8754981973544133050) -->
-    <skip />
-    <!-- no translation found for screenshot_edit_description (3333092254706788906) -->
-    <skip />
-    <!-- no translation found for screenshot_scroll_label (7682877978685434621) -->
-    <skip />
-    <!-- no translation found for screenshot_scroll_description (7855773867093272175) -->
-    <skip />
-    <!-- no translation found for screenshot_dismiss_description (4702341245899508786) -->
-    <skip />
+    <string name="screenshot_edit_label" msgid="8754981973544133050">"संपादित करा"</string>
+    <string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रीनशॉट संपादित करा"</string>
+    <string name="screenshot_scroll_label" msgid="7682877978685434621">"स्क्रोल करा"</string>
+    <string name="screenshot_scroll_description" msgid="7855773867093272175">"स्क्रीनशॉटवर स्क्रोल करा"</string>
+    <string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रीनशॉट डिसमिस करा"</string>
     <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉटचे पूर्वावलोकन"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रीन रेकॉर्डर"</string>
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रीन रेकॉर्डिंग प्रोसेस सुरू"</string>
diff --git a/packages/SystemUI/res/values-mr/strings_tv.xml b/packages/SystemUI/res/values-mr/strings_tv.xml
index 0d0d8e1..791a4fd 100644
--- a/packages/SystemUI/res/values-mr/strings_tv.xml
+++ b/packages/SystemUI/res/values-mr/strings_tv.xml
@@ -21,10 +21,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mic_active" msgid="5766614241012047024">"मायक्रोफोन ॲक्टिव्ह आहे"</string>
     <string name="app_accessed_mic" msgid="2754428675130470196">"%1$s यांनी तुमचा मायक्रोफोन अ‍ॅक्सेस केला आहे"</string>
-    <!-- no translation found for notification_vpn_connected (3891023882833274730) -->
-    <skip />
-    <!-- no translation found for notification_vpn_disconnected (7150747626448044843) -->
-    <skip />
-    <!-- no translation found for notification_disclosure_vpn_text (3873532735584866236) -->
-    <skip />
+    <string name="notification_vpn_connected" msgid="3891023882833274730">"VPN कनेक्‍ट केले"</string>
+    <string name="notification_vpn_disconnected" msgid="7150747626448044843">"VPN डिस्कनेक्ट केले"</string>
+    <string name="notification_disclosure_vpn_text" msgid="3873532735584866236">"<xliff:g id="VPN_APP">%1$s</xliff:g> द्वारे"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 560fd0b..eca79cb 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -86,16 +86,11 @@
     <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"स्क्रिनसट फेरि लिएर हेर्नुहोस्"</string>
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"भण्डारण ठाउँ सीमित भएका कारण स्क्रिनसट सुरक्षित गर्न सकिएन"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"उक्त एप वा तपाईंको संगठनले स्क्रिनसटहरू लिन दिँदैन"</string>
-    <!-- no translation found for screenshot_edit_label (8754981973544133050) -->
-    <skip />
-    <!-- no translation found for screenshot_edit_description (3333092254706788906) -->
-    <skip />
-    <!-- no translation found for screenshot_scroll_label (7682877978685434621) -->
-    <skip />
-    <!-- no translation found for screenshot_scroll_description (7855773867093272175) -->
-    <skip />
-    <!-- no translation found for screenshot_dismiss_description (4702341245899508786) -->
-    <skip />
+    <string name="screenshot_edit_label" msgid="8754981973544133050">"सम्पादन गर्नुहोस्"</string>
+    <string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रिनसट सम्पादन गर्नुहोस्"</string>
+    <string name="screenshot_scroll_label" msgid="7682877978685434621">"स्क्रोल गर्नुहोस्"</string>
+    <string name="screenshot_scroll_description" msgid="7855773867093272175">"स्क्रिनसट स्क्रोल गर्नुहोस्"</string>
+    <string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रिनसट हटाउनुहोस्"</string>
     <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रिनसटको पूर्वावलोकन"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रिन रेकर्डर"</string>
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रिन रेकर्डिङको प्रक्रिया अघि बढाइँदै"</string>
diff --git a/packages/SystemUI/res/values-ne/strings_tv.xml b/packages/SystemUI/res/values-ne/strings_tv.xml
index 6f3eb66..00cc10a 100644
--- a/packages/SystemUI/res/values-ne/strings_tv.xml
+++ b/packages/SystemUI/res/values-ne/strings_tv.xml
@@ -21,10 +21,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mic_active" msgid="5766614241012047024">"माइक्रोफोन सक्रिय छ"</string>
     <string name="app_accessed_mic" msgid="2754428675130470196">"%1$s ले तपाईंको माइक्रोफोनमाथि पहुँच राख्यो"</string>
-    <!-- no translation found for notification_vpn_connected (3891023882833274730) -->
-    <skip />
-    <!-- no translation found for notification_vpn_disconnected (7150747626448044843) -->
-    <skip />
-    <!-- no translation found for notification_disclosure_vpn_text (3873532735584866236) -->
-    <skip />
+    <string name="notification_vpn_connected" msgid="3891023882833274730">"VPN कनेक्ट गरिएको छ"</string>
+    <string name="notification_vpn_disconnected" msgid="7150747626448044843">"VPN डिस्कनेक्ट गरिएको छ"</string>
+    <string name="notification_disclosure_vpn_text" msgid="3873532735584866236">"<xliff:g id="VPN_APP">%1$s</xliff:g> मार्फत"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index d3ebe52..297ebc6 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -86,16 +86,11 @@
     <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"Provo ta nxjerrësh përsëri pamjen e ekranit"</string>
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Pamja e ekranit nuk mund të ruhet për shkak të hapësirës ruajtëse të kufizuar"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Nxjerrja e pamjeve të ekranit nuk lejohet nga aplikacioni ose organizata jote."</string>
-    <!-- no translation found for screenshot_edit_label (8754981973544133050) -->
-    <skip />
-    <!-- no translation found for screenshot_edit_description (3333092254706788906) -->
-    <skip />
-    <!-- no translation found for screenshot_scroll_label (7682877978685434621) -->
-    <skip />
-    <!-- no translation found for screenshot_scroll_description (7855773867093272175) -->
-    <skip />
-    <!-- no translation found for screenshot_dismiss_description (4702341245899508786) -->
-    <skip />
+    <string name="screenshot_edit_label" msgid="8754981973544133050">"Modifiko"</string>
+    <string name="screenshot_edit_description" msgid="3333092254706788906">"Modifiko pamjen e ekranit"</string>
+    <string name="screenshot_scroll_label" msgid="7682877978685434621">"Lëviz"</string>
+    <string name="screenshot_scroll_description" msgid="7855773867093272175">"Lëviz në pamjen e ekranit"</string>
+    <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Hiq pamjen e ekranit"</string>
     <string name="screenshot_preview_description" msgid="7606510140714080474">"Pamja paraprake e imazhit"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"Regjistruesi i ekranit"</string>
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Regjistrimi i ekranit po përpunohet"</string>
diff --git a/packages/SystemUI/res/values-sq/strings_tv.xml b/packages/SystemUI/res/values-sq/strings_tv.xml
index 124f664..713130f 100644
--- a/packages/SystemUI/res/values-sq/strings_tv.xml
+++ b/packages/SystemUI/res/values-sq/strings_tv.xml
@@ -21,10 +21,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mic_active" msgid="5766614241012047024">"Mikrofoni aktiv"</string>
     <string name="app_accessed_mic" msgid="2754428675130470196">"%1$s pati qasje te mikrofoni yt"</string>
-    <!-- no translation found for notification_vpn_connected (3891023882833274730) -->
-    <skip />
-    <!-- no translation found for notification_vpn_disconnected (7150747626448044843) -->
-    <skip />
-    <!-- no translation found for notification_disclosure_vpn_text (3873532735584866236) -->
-    <skip />
+    <string name="notification_vpn_connected" msgid="3891023882833274730">"VPN-ja është e lidhur"</string>
+    <string name="notification_vpn_disconnected" msgid="7150747626448044843">"VPN-ja është shkëputur"</string>
+    <string name="notification_disclosure_vpn_text" msgid="3873532735584866236">"Nëpërmjet <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 578f62b..5fed052 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -86,16 +86,11 @@
     <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"స్క్రీన్‌షాట్ తీయడానికి మళ్లీ ప్రయత్నించండి"</string>
     <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"నిల్వ స్థలం పరిమితంగా ఉన్న కారణంగా స్క్రీన్‌షాట్‌ను సేవ్ చేయడం సాధ్యపడదు"</string>
     <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"స్క్రీన్‌షాట్‌లు తీయడానికి యాప్ లేదా మీ సంస్థ అనుమతించలేదు"</string>
-    <!-- no translation found for screenshot_edit_label (8754981973544133050) -->
-    <skip />
-    <!-- no translation found for screenshot_edit_description (3333092254706788906) -->
-    <skip />
-    <!-- no translation found for screenshot_scroll_label (7682877978685434621) -->
-    <skip />
-    <!-- no translation found for screenshot_scroll_description (7855773867093272175) -->
-    <skip />
-    <!-- no translation found for screenshot_dismiss_description (4702341245899508786) -->
-    <skip />
+    <string name="screenshot_edit_label" msgid="8754981973544133050">"ఎడిట్ చేయండి"</string>
+    <string name="screenshot_edit_description" msgid="3333092254706788906">"స్క్రీన్‌షాట్‌ను ఎడిట్ చేయండి"</string>
+    <string name="screenshot_scroll_label" msgid="7682877978685434621">"స్క్రోల్ చేయి"</string>
+    <string name="screenshot_scroll_description" msgid="7855773867093272175">"స్క్రీన్‌షాట్‌కు స్క్రోల్ చేయండి"</string>
+    <string name="screenshot_dismiss_description" msgid="4702341245899508786">"స్క్రీన్‌షాట్‌ను విస్మరించు"</string>
     <string name="screenshot_preview_description" msgid="7606510140714080474">"స్క్రీన్‌షాట్ ప్రివ్యూ"</string>
     <string name="screenrecord_name" msgid="2596401223859996572">"స్క్రీన్ రికార్డర్"</string>
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"స్క్రీన్ రికార్డింగ్ అవుతోంది"</string>
@@ -128,7 +123,7 @@
     <string name="installer_cd_button_title" msgid="5499998592841984743">"Macకు Android ఫైల్ బదిలీ యాప్ ఇన్‌స్టాల్ చేయండి"</string>
     <string name="accessibility_back" msgid="6530104400086152611">"వెనుకకు"</string>
     <string name="accessibility_home" msgid="5430449841237966217">"హోమ్"</string>
-    <string name="accessibility_menu" msgid="2701163794470513040">"మెను"</string>
+    <string name="accessibility_menu" msgid="2701163794470513040">"మెనూ"</string>
     <string name="accessibility_accessibility_button" msgid="4089042473497107709">"యాక్సెస్ సామర్థ్యం"</string>
     <string name="accessibility_rotate_button" msgid="1238584767612362586">"స్క్రీన్‌ను తిప్పండి"</string>
     <string name="accessibility_recent" msgid="901641734769533575">"ఓవర్‌వ్యూ"</string>
@@ -932,7 +927,7 @@
     <string name="tuner_minus" msgid="5258518368944598545">"తీసివేత చిహ్నం"</string>
     <string name="tuner_left" msgid="5758862558405684490">"ఎడమ"</string>
     <string name="tuner_right" msgid="8247571132790812149">"కుడి"</string>
-    <string name="tuner_menu" msgid="363690665924769420">"మెను"</string>
+    <string name="tuner_menu" msgid="363690665924769420">"మెనూ"</string>
     <string name="tuner_app" msgid="6949280415826686972">"<xliff:g id="APP">%1$s</xliff:g> అనురవర్తనం"</string>
     <string name="notification_channel_alerts" msgid="3385787053375150046">"హెచ్చరికలు"</string>
     <string name="notification_channel_battery" msgid="9219995638046695106">"బ్యాటరీ"</string>
diff --git a/packages/SystemUI/res/values-te/strings_tv.xml b/packages/SystemUI/res/values-te/strings_tv.xml
index 112f9bc..67fb678 100644
--- a/packages/SystemUI/res/values-te/strings_tv.xml
+++ b/packages/SystemUI/res/values-te/strings_tv.xml
@@ -21,10 +21,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mic_active" msgid="5766614241012047024">"మైక్రోఫోన్ యాక్టివ్‌గా ఉంది"</string>
     <string name="app_accessed_mic" msgid="2754428675130470196">"మీ మైక్రోఫోన్‌ను %1$s యాక్సెస్ చేసింది"</string>
-    <!-- no translation found for notification_vpn_connected (3891023882833274730) -->
-    <skip />
-    <!-- no translation found for notification_vpn_disconnected (7150747626448044843) -->
-    <skip />
-    <!-- no translation found for notification_disclosure_vpn_text (3873532735584866236) -->
-    <skip />
+    <string name="notification_vpn_connected" msgid="3891023882833274730">"VPN కనెక్ట్ చేయబడింది"</string>
+    <string name="notification_vpn_disconnected" msgid="7150747626448044843">"VPN డిస్‌కనెక్ట్ చేయబడింది"</string>
+    <string name="notification_disclosure_vpn_text" msgid="3873532735584866236">"<xliff:g id="VPN_APP">%1$s</xliff:g> ద్వారా"</string>
 </resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 1a72fc2..4407d8f 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -93,10 +93,10 @@
     <bool name="config_navigation_bar_enable_auto_dim_no_visible_wallpaper">true</bool>
 
     <!-- The maximum number of tiles in the QuickQSPanel -->
-    <integer name="quick_qs_panel_max_columns">6</integer>
+    <integer name="quick_qs_panel_max_columns">4</integer>
 
     <!-- The number of columns in the QuickSettings -->
-    <integer name="quick_settings_num_columns">3</integer>
+    <integer name="quick_settings_num_columns">4</integer>
 
     <!-- The number of rows in the QuickSettings -->
     <integer name="quick_settings_max_rows">3</integer>
@@ -114,7 +114,7 @@
 
     <!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" -->
     <string name="quick_settings_tiles_stock" translatable="false">
-        wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,dark,work,cast,night,screenrecord,reverse
+        wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,dark,work,cast,night,screenrecord,reverse,reduce_brightness
     </string>
 
     <!-- The tiles to display in QuickSettings -->
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 773ef7d..ea1258f 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1014,6 +1014,11 @@
     <string name="quick_settings_dark_mode_secondary_label_on_at">On at <xliff:g id="time" example="10 pm">%s</xliff:g></string>
     <!-- QuickSettings: Secondary text for when the Dark theme or some other tile will be on until some user-selected time. [CHAR LIMIT=20] -->
     <string name="quick_settings_dark_mode_secondary_label_until">Until <xliff:g id="time" example="7 am">%s</xliff:g></string>
+    <!-- TODO(b/170970602): remove translatable=false when RBC has official name and strings -->
+    <!-- QuickSettings: Label for the toggle that controls whether Reduce Bright Colors is enabled. [CHAR LIMIT=NONE] -->
+    <string name="quick_settings_reduce_bright_colors_label" translatable="false">Reduce Bright Colors</string>
+        <!-- QuickSettings: Secondary text for intensity level of Reduce Bright Colors. [CHAR LIMIT=NONE] -->
+    <string name="quick_settings_reduce_bright_colors_secondary_label" translatable="false"> <xliff:g id="intensity" example="50">%d</xliff:g>%% reduction</string>
 
     <!-- QuickSettings: NFC tile [CHAR LIMIT=NONE] -->
     <string name="quick_settings_nfc_label">NFC</string>
@@ -2816,8 +2821,12 @@
     <!-- Text to display when copying the build number off QS [CHAR LIMIT=NONE]-->
     <string name="build_number_copy_toast">Build number copied to clipboard.</string>
 
-    <!-- Status for last interaction [CHAR LIMIT=120] -->
+    <!-- Status for last interaction with exact time [CHAR LIMIT=120] -->
     <string name="last_interaction_status" translatable="false">You last chatted <xliff:g id="duration" example="5 hours">%1$s</xliff:g> ago</string>
+    <!-- Status for last interaction when less than a certain time window [CHAR LIMIT=120] -->
+    <string name="last_interaction_status_less_than" translatable="false">You last chatted less than <xliff:g id="duration" example="5 hours">%1$s</xliff:g> ago</string>
+    <!-- Status for last interaction when over a certain time window [CHAR LIMIT=120] -->
+    <string name="last_interaction_status_over" translatable="false">You last chatted over <xliff:g id="duration" example="1 week">%1$s</xliff:g> ago</string>
     <!-- Status for conversation without interaction data [CHAR LIMIT=120] -->
     <string name="basic_status" translatable="false">Open conversation</string>
 
diff --git a/packages/SystemUI/src/com/android/keyguard/FontInterpolator.kt b/packages/SystemUI/src/com/android/keyguard/FontInterpolator.kt
new file mode 100644
index 0000000..962c002
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/FontInterpolator.kt
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.keyguard
+
+import android.graphics.fonts.Font
+import android.graphics.fonts.FontVariationAxis
+import android.util.MathUtils
+
+private const val TAG_WGHT = "wght"
+private const val TAG_ITAL = "ital"
+
+private const val FONT_WEIGHT_MAX = 1000f
+private const val FONT_WEIGHT_MIN = 0f
+private const val FONT_WEIGHT_ANIMATION_STEP = 10f
+private const val FONT_WEIGHT_DEFAULT_VALUE = 400f
+
+private const val FONT_ITALIC_MAX = 1f
+private const val FONT_ITALIC_MIN = 0f
+private const val FONT_ITALIC_ANIMATION_STEP = 0.1f
+private const val FONT_ITALIC_DEFAULT_VALUE = 0f
+
+/**
+ * Provide interpolation of two fonts by adjusting font variation settings.
+ */
+class FontInterpolator {
+
+    /**
+     * Cache key for the interpolated font.
+     *
+     * This class is mutable for recycling.
+     */
+    private data class InterpKey(var l: Font?, var r: Font?, var progress: Float) {
+        fun set(l: Font, r: Font, progress: Float) {
+            this.l = l
+            this.r = r
+            this.progress = progress
+        }
+    }
+
+    /**
+     * Cache key for the font that has variable font.
+     *
+     * This class is mutable for recycling.
+     */
+    private data class VarFontKey(
+        var sourceId: Int,
+        var index: Int,
+        val sortedAxes: MutableList<FontVariationAxis>
+    ) {
+        constructor(font: Font, axes: List<FontVariationAxis>):
+                this(font.sourceIdentifier,
+                        font.ttcIndex,
+                        axes.toMutableList().apply { sortBy { it.tag } }
+                )
+
+        fun set(font: Font, axes: List<FontVariationAxis>) {
+            sourceId = font.sourceIdentifier
+            index = font.ttcIndex
+            sortedAxes.clear()
+            sortedAxes.addAll(axes)
+            sortedAxes.sortBy { it.tag }
+        }
+    }
+
+    // Font interpolator has two level caches: one for input and one for font with different
+    // variation settings. No synchronization is needed since FontInterpolator is not designed to be
+    // thread-safe and can be used only on UI thread.
+    private val interpCache = hashMapOf<InterpKey, Font>()
+    private val verFontCache = hashMapOf<VarFontKey, Font>()
+
+    // Mutable keys for recycling.
+    private val tmpInterpKey = InterpKey(null, null, 0f)
+    private val tmpVarFontKey = VarFontKey(0, 0, mutableListOf())
+
+    /**
+     * Linear interpolate the font variation settings.
+     */
+    fun lerp(start: Font, end: Font, progress: Float): Font {
+        if (progress == 0f) {
+            return start
+        } else if (progress == 1f) {
+            return end
+        }
+
+        val startAxes = start.axes ?: EMPTY_AXES
+        val endAxes = end.axes ?: EMPTY_AXES
+
+        if (startAxes.isEmpty() && endAxes.isEmpty()) {
+            return start
+        }
+
+        // Check we already know the result. This is commonly happens since we draws the different
+        // text chunks with the same font.
+        tmpInterpKey.set(start, end, progress)
+        val cachedFont = interpCache[tmpInterpKey]
+        if (cachedFont != null) {
+            return cachedFont
+        }
+
+        // General axes interpolation takes O(N log N), this is came from sorting the axes. Usually
+        // this doesn't take much time since the variation axes is usually up to 5. If we need to
+        // support more number of axes, we may want to preprocess the font and store the sorted axes
+        // and also pre-fill the missing axes value with default value from 'fvar' table.
+        val newAxes = lerp(startAxes, endAxes) { tag, startValue, endValue ->
+            when (tag) {
+                // TODO: Good to parse 'fvar' table for retrieving default value.
+                TAG_WGHT -> adjustWeight(
+                        MathUtils.lerp(
+                                startValue ?: FONT_WEIGHT_DEFAULT_VALUE,
+                                endValue ?: FONT_WEIGHT_DEFAULT_VALUE,
+                                progress))
+                TAG_ITAL -> adjustItalic(
+                        MathUtils.lerp(
+                                startValue ?: FONT_ITALIC_DEFAULT_VALUE,
+                                endValue ?: FONT_ITALIC_DEFAULT_VALUE,
+                                progress))
+                else -> {
+                    require(startValue != null && endValue != null) {
+                        "Unable to interpolate due to unknown default axes value : $tag"
+                    }
+                    MathUtils.lerp(startValue, endValue, progress)
+                }
+            }
+        }
+
+        // Check if we already make font for this axes. This is typically happens if the animation
+        // happens backward.
+        tmpVarFontKey.set(start, newAxes)
+        val axesCachedFont = verFontCache[tmpVarFontKey]
+        if (axesCachedFont != null) {
+            interpCache[InterpKey(start, end, progress)] = axesCachedFont
+            return axesCachedFont
+        }
+
+        // This is the first time to make the font for the axes. Build and store it to the cache.
+        // Font.Builder#build won't throw IOException since creating fonts from existing fonts will
+        // not do any IO work.
+        val newFont = Font.Builder(start)
+                .setFontVariationSettings(newAxes.toTypedArray())
+                .build()
+        interpCache[InterpKey(start, end, progress)] = newFont
+        verFontCache[VarFontKey(start, newAxes)] = newFont
+        return newFont
+    }
+
+    private fun lerp(
+        start: Array<FontVariationAxis>,
+        end: Array<FontVariationAxis>,
+        filter: (tag: String, left: Float?, right: Float?) -> Float
+    ): List<FontVariationAxis> {
+        // Safe to modify result of Font#getAxes since it returns cloned object.
+        start.sortBy { axis -> axis.tag }
+        end.sortBy { axis -> axis.tag }
+
+        val result = mutableListOf<FontVariationAxis>()
+        var i = 0
+        var j = 0
+        while (i < start.size || j < end.size) {
+            val tagA = if (i < start.size) start[i].tag else null
+            val tagB = if (j < end.size) end[j].tag else null
+
+            val comp = when {
+                tagA == null -> 1
+                tagB == null -> -1
+                else -> tagA.compareTo(tagB)
+            }
+
+            val axis = when {
+                comp == 0 -> {
+                    val v = filter(tagA!!, start[i++].styleValue, end[j++].styleValue)
+                    FontVariationAxis(tagA, v)
+                }
+                comp < 0 -> {
+                    val v = filter(tagA!!, start[i++].styleValue, null)
+                    FontVariationAxis(tagA, v)
+                }
+                else -> { // comp > 0
+                    val v = filter(tagB!!, null, end[j++].styleValue)
+                    FontVariationAxis(tagB, v)
+                }
+            }
+
+            result.add(axis)
+        }
+        return result
+    }
+
+    // For the performance reasons, we animate weight with FONT_WEIGHT_ANIMATION_STEP. This helps
+    // Cache hit ratio in the Skia glyph cache.
+    private fun adjustWeight(value: Float) =
+            coerceInWithStep(value, FONT_WEIGHT_MIN, FONT_WEIGHT_MAX, FONT_WEIGHT_ANIMATION_STEP)
+
+    // For the performance reasons, we animate italic with FONT_ITALIC_ANIMATION_STEP. This helps
+    // Cache hit ratio in the Skia glyph cache.
+    private fun adjustItalic(value: Float) =
+            coerceInWithStep(value, FONT_ITALIC_MIN, FONT_ITALIC_MAX, FONT_ITALIC_ANIMATION_STEP)
+
+    private fun coerceInWithStep(v: Float, min: Float, max: Float, step: Float) =
+            (v.coerceIn(min, max) / step).toInt() * step
+
+    companion object {
+        private val EMPTY_AXES = arrayOf<FontVariationAxis>()
+
+        // Returns true if given two font instance can be interpolated.
+        fun canInterpolate(start: Font, end: Font) =
+                start.ttcIndex == end.ttcIndex && start.sourceIdentifier == end.sourceIdentifier
+    }
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/GradientTextClock.java b/packages/SystemUI/src/com/android/keyguard/GradientTextClock.java
index 7cf1bd0..3942c60 100644
--- a/packages/SystemUI/src/com/android/keyguard/GradientTextClock.java
+++ b/packages/SystemUI/src/com/android/keyguard/GradientTextClock.java
@@ -16,12 +16,17 @@
 
 package com.android.keyguard;
 
+import android.annotation.FloatRange;
+import android.annotation.IntRange;
 import android.content.Context;
+import android.graphics.Canvas;
 import android.graphics.LinearGradient;
 import android.graphics.Shader;
 import android.util.AttributeSet;
 import android.widget.TextClock;
 
+import kotlin.Unit;
+
 /**
  * Displays the time with the hour positioned above the minutes. (ie: 09 above 30 is 9:30)
  * The time's text color is a gradient that changes its colors based on its controller.
@@ -30,6 +35,8 @@
     private int[] mGradientColors;
     private float[] mPositions;
 
+    private TextAnimator mTextAnimator = null;
+
     public GradientTextClock(Context context) {
         this(context, null, 0, 0);
     }
@@ -74,6 +81,24 @@
         super.setFormat24Hour(FORMAT_24);
     }
 
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        if (mTextAnimator == null) {
+            mTextAnimator = new TextAnimator(getLayout(), () -> {
+                invalidate();
+                return Unit.INSTANCE;
+            });
+        } else {
+            mTextAnimator.updateLayout(getLayout());
+        }
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        mTextAnimator.draw(canvas);
+    }
+
     public void setGradientColors(int[] colors) {
         mGradientColors = colors;
         updatePaint();
@@ -83,11 +108,33 @@
         mPositions = positions;
     }
 
+    /**
+     * Set text style with animation.
+     *
+     * By passing -1 to weight, the view preserve the current weight.
+     * By passing -1 to textSize, the view preserve the current text size.
+     *
+     * @param weight text weight.
+     * @param textSize font size.
+     * @param animate true for changing text style with animation, otherwise false.
+     */
+    public void setTextStyle(
+            @IntRange(from = 0, to = 1000) int weight,
+            @FloatRange(from = 0) float textSize,
+            boolean animate) {
+        if (mTextAnimator != null) {
+            mTextAnimator.setTextStyle(weight, textSize, animate, -1, null);
+        }
+    }
+
     private void updatePaint() {
-        getPaint().setShader(
-                new LinearGradient(
-                        getX(), getY(), getX(), getMeasuredHeight() + getY(),
-                        mGradientColors, mPositions, Shader.TileMode.REPEAT));
+        Shader shader = new LinearGradient(
+                getX(), getY(), getX(), getMeasuredHeight() + getY(), mGradientColors, mPositions,
+                Shader.TileMode.REPEAT);
+        getPaint().setShader(shader);
+        if (mTextAnimator != null) {
+            mTextAnimator.setShader(shader);
+        }
     }
 
     private final OnLayoutChangeListener mOnLayoutChangeListener =
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java
index cc8bf4f..2cdd7f1 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java
@@ -154,8 +154,8 @@
                         }
                         mView.resetPasswordText(true /* animate */,
                                 /* announce */
-                                result.getType() != PinResult.PIN_RESULT_TYPE_SUCCESS);
-                        if (result.getType() == PinResult.PIN_RESULT_TYPE_SUCCESS) {
+                                result.getResult() != PinResult.PIN_RESULT_TYPE_SUCCESS);
+                        if (result.getResult() == PinResult.PIN_RESULT_TYPE_SUCCESS) {
                             mKeyguardUpdateMonitor.reportSimUnlocked(mSubId);
                             mRemainingAttempts = -1;
                             mShowDefaultMessage = true;
@@ -163,7 +163,7 @@
                                     true, KeyguardUpdateMonitor.getCurrentUser());
                         } else {
                             mShowDefaultMessage = false;
-                            if (result.getType() == PinResult.PIN_RESULT_TYPE_INCORRECT) {
+                            if (result.getResult() == PinResult.PIN_RESULT_TYPE_INCORRECT) {
                                 if (result.getAttemptsRemaining() <= 2) {
                                     // this is getting critical - show dialog
                                     getSimRemainingAttemptsDialog(
@@ -289,20 +289,14 @@
         @Override
         public void run() {
             if (DEBUG) {
-                Log.v(TAG, "call supplyPinReportResultForSubscriber(subid=" + mSubId + ")");
+                Log.v(TAG, "call supplyIccLockPin(subid=" + mSubId + ")");
             }
-            TelephonyManager telephonyManager =
-                    mTelephonyManager.createForSubscriptionId(mSubId);
-            final PinResult result = telephonyManager.supplyPinReportPinResult(mPin);
-            if (result == null) {
-                Log.e(TAG, "Error result for supplyPinReportResult.");
-                mView.post(() -> onSimCheckResponse(PinResult.getDefaultFailedResult()));
-            } else {
-                if (DEBUG) {
-                    Log.v(TAG, "supplyPinReportResult returned: " + result.toString());
-                }
-                mView.post(() -> onSimCheckResponse(result));
+            TelephonyManager telephonyManager = mTelephonyManager.createForSubscriptionId(mSubId);
+            final PinResult result = telephonyManager.supplyIccLockPin(mPin);
+            if (DEBUG) {
+                Log.v(TAG, "supplyIccLockPin returned: " + result.toString());
             }
+            mView.post(() -> onSimCheckResponse(result));
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java
index a873749..adb4c13 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java
@@ -267,8 +267,8 @@
                         }
                         mView.resetPasswordText(true /* animate */,
                                 /* announce */
-                                result.getType() != PinResult.PIN_RESULT_TYPE_SUCCESS);
-                        if (result.getType() == PinResult.PIN_RESULT_TYPE_SUCCESS) {
+                                result.getResult() != PinResult.PIN_RESULT_TYPE_SUCCESS);
+                        if (result.getResult() == PinResult.PIN_RESULT_TYPE_SUCCESS) {
                             mKeyguardUpdateMonitor.reportSimUnlocked(mSubId);
                             mRemainingAttempts = -1;
                             mShowDefaultMessage = true;
@@ -277,7 +277,7 @@
                                     true, KeyguardUpdateMonitor.getCurrentUser());
                         } else {
                             mShowDefaultMessage = false;
-                            if (result.getType() == PinResult.PIN_RESULT_TYPE_INCORRECT) {
+                            if (result.getResult() == PinResult.PIN_RESULT_TYPE_INCORRECT) {
                                 // show message
                                 mMessageAreaController.setMessage(mView.getPukPasswordErrorMessage(
                                         result.getAttemptsRemaining(), false,
@@ -390,23 +390,15 @@
 
         @Override
         public void run() {
-            if (DEBUG) Log.v(TAG, "call supplyPukReportResult()");
-            TelephonyManager telephonyManager = mTelephonyManager.createForSubscriptionId(mSubId);
-            final PinResult result = telephonyManager.supplyPukReportPinResult(mPuk, mPin);
-            if (result == null) {
-                Log.e(TAG, "Error result for supplyPukReportResult.");
-                mView.post(() -> onSimLockChangedResponse(PinResult.getDefaultFailedResult()));
-            } else {
-                if (DEBUG) {
-                    Log.v(TAG, "supplyPukReportResult returned: " + result.toString());
-                }
-                mView.post(new Runnable() {
-                    @Override
-                    public void run() {
-                        onSimLockChangedResponse(result);
-                    }
-                });
+            if (DEBUG) {
+                Log.v(TAG, "call supplyIccLockPuk(subid=" + mSubId + ")");
             }
+            TelephonyManager telephonyManager = mTelephonyManager.createForSubscriptionId(mSubId);
+            final PinResult result = telephonyManager.supplyIccLockPuk(mPuk, mPin);
+            if (DEBUG) {
+                Log.v(TAG, "supplyIccLockPuk returned: " + result.toString());
+            }
+            mView.post(() -> onSimLockChangedResponse(result));
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 31b0701..42680e6 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -238,6 +238,16 @@
     private final boolean mIsAutomotive;
     private final AuthController mAuthController;
     private final StatusBarStateController mStatusBarStateController;
+    private int mStatusBarState;
+    private final StatusBarStateController.StateListener mStatusBarStateControllerListener =
+            new StatusBarStateController.StateListener() {
+        @Override
+        public void onStateChanged(int newState) {
+            mStatusBarState = newState;
+            updateBiometricListeningState();
+        }
+    };
+
     HashMap<Integer, SimData> mSimDatas = new HashMap<>();
     HashMap<Integer, ServiceState> mServiceStates = new HashMap<Integer, ServiceState>();
 
@@ -247,7 +257,7 @@
     private boolean mCredentialAttempted;
     private boolean mKeyguardGoingAway;
     private boolean mGoingToSleep;
-    private boolean mBouncer;
+    private boolean mBouncer; // true if bouncerIsOrWillBeShowing
     private boolean mAuthInterruptActive;
     private boolean mNeedsSlowUnlockTransition;
     private boolean mHasLockscreenWallpaper;
@@ -1595,6 +1605,8 @@
         mBroadcastDispatcher = broadcastDispatcher;
         mRingerModeTracker = ringerModeTracker;
         mStatusBarStateController = statusBarStateController;
+        mStatusBarStateController.addCallback(mStatusBarStateControllerListener);
+        mStatusBarState = mStatusBarStateController.getState();
         mLockPatternUtils = lockPatternUtils;
         mAuthController = authController;
         dumpManager.registerDumpable(getClass().getName(), this);
@@ -1905,7 +1917,8 @@
             return;
         }
 
-        boolean shouldListenForFingerprint = shouldListenForFingerprint();
+        boolean shouldListenForFingerprint =
+                isUdfpsEnrolled() ? shouldListenForUdfps() : shouldListenForFingerprint();
         boolean runningOrRestarting = mFingerprintRunningState == BIOMETRIC_STATE_RUNNING
                 || mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING;
         if (runningOrRestarting && !shouldListenForFingerprint) {
@@ -2002,12 +2015,20 @@
         return shouldListen;
     }
 
+    @VisibleForTesting
+    boolean shouldListenForUdfps() {
+        return shouldListenForFingerprint()
+                && !mBouncer
+                && mStatusBarState != StatusBarState.SHADE_LOCKED
+                && mStatusBarState != StatusBarState.FULLSCREEN_USER_SWITCHER
+                && mStrongAuthTracker.hasUserAuthenticatedSinceBoot();
+    }
+
     /**
      * If face auth is allows to scan on this exact moment.
      */
     public boolean shouldListenForFace() {
-        final boolean statusBarShadeLocked =
-                mStatusBarStateController.getState() == StatusBarState.SHADE_LOCKED;
+        final boolean statusBarShadeLocked = mStatusBarState == StatusBarState.SHADE_LOCKED;
         final boolean awakeKeyguard = mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep
                 && !statusBarShadeLocked;
         final int user = getCurrentUser();
@@ -2593,13 +2614,12 @@
      *
      * @see #sendKeyguardBouncerChanged(boolean)
      */
-    private void handleKeyguardBouncerChanged(int bouncer) {
+    private void handleKeyguardBouncerChanged(int bouncerVisible) {
         Assert.isMainThread();
-        if (DEBUG) Log.d(TAG, "handleKeyguardBouncerChanged(" + bouncer + ")");
-        boolean isBouncer = (bouncer == 1);
-        mBouncer = isBouncer;
+        if (DEBUG) Log.d(TAG, "handleKeyguardBouncerChanged(" + bouncerVisible + ")");
+        mBouncer = bouncerVisible == 1;
 
-        if (isBouncer) {
+        if (mBouncer) {
             // If the bouncer is shown, always clear this flag. This can happen in the following
             // situations: 1) Default camera with SHOW_WHEN_LOCKED is not chosen yet. 2) Secure
             // camera requests dismiss keyguard (tapping on photos for example). When these happen,
@@ -2612,7 +2632,7 @@
         for (int i = 0; i < mCallbacks.size(); i++) {
             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
             if (cb != null) {
-                cb.onKeyguardBouncerChanged(isBouncer);
+                cb.onKeyguardBouncerChanged(mBouncer);
             }
         }
         updateBiometricListeningState();
@@ -2745,10 +2765,10 @@
     /**
      * @see #handleKeyguardBouncerChanged(int)
      */
-    public void sendKeyguardBouncerChanged(boolean showingBouncer) {
-        if (DEBUG) Log.d(TAG, "sendKeyguardBouncerChanged(" + showingBouncer + ")");
+    public void sendKeyguardBouncerChanged(boolean bouncerIsOrWillBeShowing) {
+        if (DEBUG) Log.d(TAG, "sendKeyguardBouncerChanged(" + bouncerIsOrWillBeShowing + ")");
         Message message = mHandler.obtainMessage(MSG_KEYGUARD_BOUNCER_CHANGED);
-        message.arg1 = showingBouncer ? 1 : 0;
+        message.arg1 = bouncerIsOrWillBeShowing ? 1 : 0;
         message.sendToTarget();
     }
 
@@ -3081,6 +3101,12 @@
             pw.println("    strongAuthFlags=" + Integer.toHexString(strongAuthFlags));
             pw.println("    trustManaged=" + getUserTrustIsManaged(userId));
             pw.println("    udfpsEnrolled=" + isUdfpsEnrolled());
+            if (isUdfpsEnrolled()) {
+                pw.println("        shouldListenForUdfps=" + shouldListenForUdfps());
+                pw.println("        bouncerVisible=" + mBouncer);
+                pw.println("        mStatusBarState="
+                        + StatusBarState.toShortString(mStatusBarState));
+            }
         }
         if (mFaceManager != null && mFaceManager.isHardwareDetected()) {
             final int userId = ActivityManager.getCurrentUser();
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
index 3c5eceb..b722dea 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
@@ -94,7 +94,8 @@
 
     /**
      * Called when the keyguard enters or leaves bouncer mode.
-     * @param bouncer if true, keyguard is now in bouncer mode.
+     * @param bouncer if true, keyguard is showing the bouncer or transitioning from/to bouncer
+     *                mode.
      */
     public void onKeyguardBouncerChanged(boolean bouncer) { }
 
diff --git a/packages/SystemUI/src/com/android/keyguard/TextAnimator.kt b/packages/SystemUI/src/com/android/keyguard/TextAnimator.kt
new file mode 100644
index 0000000..e4c3dcd
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/TextAnimator.kt
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.keyguard
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.animation.TimeInterpolator
+import android.animation.ValueAnimator
+import android.graphics.Canvas
+import android.graphics.Shader
+import android.text.Layout
+
+private const val TAG_WGHT = "wght"
+private const val DEFAULT_ANIMATION_DURATION: Long = 1000
+
+/**
+ * This class provides text animation between two styles.
+ *
+ * Currently this class can provide text style animation for text weight and text size. For example
+ * the simple view that draws text with animating text size is like as follows:
+ *
+ * <pre>
+ * <code>
+ *     class SimpleTextAnimation : View {
+ *         @JvmOverloads constructor(...)
+ *
+ *         private val layout: Layout = ... // Text layout, e.g. StaticLayout.
+ *
+ *         // TextAnimator tells us when needs to be invalidate.
+ *         private val animator = TextAnimator(layout) { invalidate() }
+ *
+ *         override fun onDraw(canvas: Canvas) = animator.draw(canvas)
+ *
+ *         // Change the text size with animation.
+ *         fun setTextSize(sizePx: Float, animate: Boolean) {
+ *             animator.setTextStyle(-1 /* unchanged weight */, sizePx, animate)
+ *         }
+ *     }
+ * </code>
+ * </pre>
+ */
+class TextAnimator(layout: Layout, private val invalidateCallback: () -> Unit) {
+    // Following two members are for mutable for testing purposes.
+    internal var textInterpolator: TextInterpolator = TextInterpolator(layout)
+    internal var animator: ValueAnimator = ValueAnimator.ofFloat(1f).apply {
+        duration = DEFAULT_ANIMATION_DURATION
+        addUpdateListener {
+            textInterpolator.progress = it.animatedValue as Float
+            invalidateCallback()
+        }
+        addListener(object : AnimatorListenerAdapter() {
+            override fun onAnimationEnd(animation: Animator?) = textInterpolator.rebase()
+            override fun onAnimationCancel(animation: Animator?) = textInterpolator.rebase()
+        })
+    }
+
+    fun updateLayout(layout: Layout) {
+        textInterpolator.layout = layout
+    }
+
+    var shader: Shader
+        get() = textInterpolator.basePaint.shader.also {
+            require(it === textInterpolator.targetPaint.shader) {
+                "base and target paint has different shader. Usually shader is not interpolatable."
+            }
+        }
+        set(value) {
+            textInterpolator.basePaint.shader = value
+            textInterpolator.targetPaint.shader = value
+            // Shader doesn't change the text layout, so no need to call onTargetPaintModified or
+            // onBasePaintModified
+        }
+
+    fun draw(c: Canvas) = textInterpolator.draw(c)
+
+    /**
+     * Set text style with animation.
+     *
+     * By passing -1 to weight, the view preserve the current weight.
+     * By passing -1 to textSize, the view preserve the current text size.
+     * Bu passing -1 to duration, the default text animation, 1000ms, is used.
+     * By passing false to animate, the text will be updated without animation.
+     *
+     * @param weight an optional text weight.
+     * @param textSize an optional font size.
+     * @param animate an optional boolean indicating true for showing style transition as animation,
+     *                false for immediate style transition. True by default.
+     * @param duration an optional animation duration in milliseconds. This is ignored if animate is
+     *                 false.
+     * @param interpolator an optional time interpolator. If null is passed, last set interpolator
+     *                     will be used. This is ignored if animate is false.
+     */
+    fun setTextStyle(
+        weight: Int = -1,
+        textSize: Float = -1f,
+        animate: Boolean = true,
+        duration: Long = -1L,
+        interpolator: TimeInterpolator? = null
+    ) {
+        if (animate) {
+            animator.cancel()
+            textInterpolator.rebase()
+        }
+
+        if (textSize >= 0) {
+            textInterpolator.targetPaint.textSize = textSize
+        }
+        if (weight >= 0) {
+            textInterpolator.targetPaint.fontVariationSettings = "'$TAG_WGHT' $weight"
+        }
+        textInterpolator.onTargetPaintModified()
+
+        if (animate) {
+            animator.duration = if (duration == -1L) {
+                DEFAULT_ANIMATION_DURATION
+            } else {
+                duration
+            }
+            interpolator?.let { animator.interpolator = it }
+            animator.start()
+        } else {
+            // No animation is requested, thus set base and target state to the same state.
+            textInterpolator.progress = 1f
+            textInterpolator.rebase()
+        }
+    }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/keyguard/TextInterpolator.kt b/packages/SystemUI/src/com/android/keyguard/TextInterpolator.kt
new file mode 100644
index 0000000..51148f3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/TextInterpolator.kt
@@ -0,0 +1,417 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.keyguard
+
+import android.graphics.Canvas
+import android.graphics.Paint
+import android.graphics.fonts.Font
+import android.graphics.text.PositionedGlyphs
+import android.graphics.text.TextRunShaper
+import android.text.Layout
+import android.util.MathUtils
+import java.lang.Math.max
+
+/**
+ * Provide text style linear interpolation for plain text.
+ */
+class TextInterpolator(layout: Layout) {
+    /**
+     * Returns base paint used for interpolation.
+     *
+     * Once you modified the style parameters, you have to call reshapeText to recalculate base text
+     * layout.
+     *
+     * @return a paint object.
+     */
+    val basePaint = Paint(layout.paint)
+
+    /**
+     * Returns target paint used for interpolation.
+     *
+     * Once you modified the style parameters, you have to call reshapeText to recalculate target
+     * text layout.
+     *
+     * @return a paint object
+     */
+    val targetPaint = Paint(layout.paint)
+
+    /**
+     * A class represents a single font run.
+     *
+     * A font run is a range that will be drawn with the same font.
+     */
+    private data class FontRun(
+        val start: Int, // inclusive
+        val end: Int, // exclusive
+        var baseFont: Font,
+        var targetFont: Font
+    ) {
+        val length: Int get() = end - start
+    }
+
+    /**
+     * A class represents text layout of a single line.
+     */
+    private class Line(
+        val glyphIds: IntArray,
+        val baseX: FloatArray, // same length as glyphIds
+        val baseY: FloatArray, // same length as glyphIds
+        val targetX: FloatArray, // same length as glyphIds
+        val targetY: FloatArray, // same length as glyphIds
+        val fontRuns: List<FontRun>
+    )
+
+    private var lines = listOf<Line>()
+    private val fontInterpolator = FontInterpolator()
+
+    // Recycling object for glyph drawing. Will be extended for the longest font run if needed.
+    private val tmpDrawPaint = Paint()
+    private var tmpPositionArray = FloatArray(20)
+
+    /**
+     * The progress position of the interpolation.
+     *
+     * The 0f means the start state, 1f means the end state.
+     */
+    var progress: Float = 0f
+
+    /**
+     * The layout used for drawing text.
+     *
+     * Only non-styled text is supported. Even if the given layout is created from Spanned, the
+     * span information is not used.
+     *
+     * The paint objects used for interpolation are not changed by this method call.
+     *
+     * Note: disabling ligature is strongly recommended if you give extra letter spacing since they
+     * may be disjointed based on letter spacing value and cannot be interpolated. Animator will
+     * throw runtime exception if they cannot be interpolated.
+     */
+    var layout: Layout = layout
+        get() = field
+        set(value) {
+            field = value
+            shapeText(value)
+        }
+
+    init {
+        // shapeText needs to be called after all members are initialized.
+        shapeText(layout)
+    }
+
+    /**
+     * Recalculate internal text layout for interpolation.
+     *
+     * Whenever you modifies target paint, you have to call this method to recalculate internal text
+     * layout used for interpolation.
+     */
+    fun onTargetPaintModified() {
+        updatePositionsAndFonts(shapeText(layout, targetPaint), updateBase = false)
+    }
+
+    /**
+     * Recalculate internal text layout for interpolation.
+     *
+     * Whenever you modifies base paint, you have to call this method to recalculate internal text
+     * layout used for interpolation.
+     */
+    fun onBasePaintModified() {
+        updatePositionsAndFonts(shapeText(layout, basePaint), updateBase = true)
+    }
+
+    /**
+     * Rebase the base state to the middle of the interpolation.
+     *
+     * The text interpolator does not calculate all the text position by text shaper due to
+     * performance reasons. Instead, the text interpolator shape the start and end state and
+     * calculate text position of the middle state by linear interpolation. Due to this trick,
+     * the text positions of the middle state is likely different from the text shaper result.
+     * So, if you want to start animation from the middle state, you will see the glyph jumps due to
+     * this trick, i.e. the progress 0.5 of interpolation between weight 400 and 700 is different
+     * from text shape result of weight 550.
+     *
+     * After calling this method, do not call onBasePaintModified() since it reshape the text and
+     * update the base state. As in above notice, the text shaping result at current progress is
+     * different shaped result. By calling onBasePaintModified(), you may see the glyph jump.
+     *
+     * By calling this method, the progress will be reset to 0.
+     *
+     * This API is useful to continue animation from the middle of the state. For example, if you
+     * animate weight from 200 to 400, then if you want to move back to 200 at the half of the
+     * animation, it will look like
+     *
+     * <pre>
+     * <code>
+     *     val interp = TextInterpolator(layout)
+     *
+     *     // Interpolate between weight 200 to 400.
+     *     interp.basePaint.fontVariationSettings = "'wght' 200"
+     *     interp.onBasePaintModified()
+     *     interp.targetPaint.fontVariationSettings = "'wght' 400"
+     *     interp.onTargetPaintModified()
+     *
+     *     // animate
+     *     val animator = ValueAnimator.ofFloat(1f).apply {
+     *         addUpdaterListener {
+     *             interp.progress = it.animateValue as Float
+     *         }
+     *     }.start()
+     *
+     *     // Here, assuming you receive some event and want to start new animation from current
+     *     // state.
+     *     OnSomeEvent {
+     *         animator.cancel()
+     *
+     *         // start another animation from the current state.
+     *         interp.rebase() // Use current state as base state.
+     *         interp.targetPaint.fontVariationSettings = "'wght' 200" // set new target
+     *         interp.onTargetPaintModified() // reshape target
+     *
+     *         // Here the textInterpolator interpolate from 'wght' from 300 to 200 if the current
+     *         // progress is 0.5
+     *         animator.start()
+     *     }
+     * </code>
+     * </pre>
+     *
+     */
+    fun rebase() {
+        if (progress == 0f) {
+            return
+        } else if (progress == 1f) {
+            basePaint.set(targetPaint)
+        } else {
+            lerp(basePaint, targetPaint, progress, tmpDrawPaint)
+            basePaint.set(tmpDrawPaint)
+        }
+
+        lines.forEach { line ->
+            for (i in line.baseX.indices) {
+                line.baseX[i] = MathUtils.lerp(line.baseX[i], line.targetX[i], progress)
+                line.baseY[i] = MathUtils.lerp(line.baseY[i], line.targetY[i], progress)
+            }
+            line.fontRuns.forEach {
+                it.baseFont = fontInterpolator.lerp(it.baseFont, it.targetFont, progress)
+            }
+        }
+
+        progress = 0f
+    }
+
+    /**
+     * Draws interpolated text at the given progress.
+     *
+     * @param canvas a canvas.
+     */
+    fun draw(canvas: Canvas) {
+        lerp(basePaint, targetPaint, progress, tmpDrawPaint)
+        lines.forEachIndexed { lineNo, line ->
+            canvas.save()
+            try {
+                // Move to drawing origin.
+                val origin = layout.getDrawOrigin(lineNo)
+                canvas.translate(origin, layout.getLineBaseline(lineNo).toFloat())
+
+                line.fontRuns.forEach { run ->
+                    drawFontRun(canvas, line, run, tmpDrawPaint)
+                }
+            } finally {
+                canvas.restore()
+            }
+        }
+    }
+
+    // Shape text with current paint parameters.
+    private fun shapeText(layout: Layout) {
+        val baseLayout = shapeText(layout, basePaint)
+        val targetLayout = shapeText(layout, targetPaint)
+
+        require(baseLayout.size == targetLayout.size) {
+            "The new layout result has different line count."
+        }
+
+        var maxRunLength = 0
+        lines = baseLayout.zip(targetLayout) { base, target ->
+            require(base.glyphCount() == target.glyphCount()) {
+                "Inconsistent glyph count at line ${lines.size}"
+            }
+
+            val glyphCount = base.glyphCount()
+
+            // Good to recycle the array if the existing array can hold the new layout result.
+            val glyphIds = IntArray(glyphCount) {
+                base.getGlyphId(it).also { baseGlyphId ->
+                    require(baseGlyphId == target.getGlyphId(it)) {
+                        "Inconsistent glyph ID at $it in line ${lines.size}"
+                    }
+                }
+            }
+
+            val baseX = FloatArray(glyphCount) { base.getGlyphX(it) }
+            val baseY = FloatArray(glyphCount) { base.getGlyphY(it) }
+            val targetX = FloatArray(glyphCount) { target.getGlyphX(it) }
+            val targetY = FloatArray(glyphCount) { target.getGlyphY(it) }
+
+            // Calculate font runs
+            val fontRun = mutableListOf<FontRun>()
+            if (glyphCount != 0) {
+                var start = 0
+                var baseFont = base.getFont(start)
+                var targetFont = target.getFont(start)
+                require(FontInterpolator.canInterpolate(baseFont, targetFont)) {
+                    "Cannot interpolate font at $start ($baseFont vs $targetFont)"
+                }
+
+                for (i in 1 until glyphCount) {
+                    val nextBaseFont = base.getFont(i)
+                    val nextTargetFont = target.getFont(i)
+
+                    if (baseFont !== nextBaseFont) {
+                        require(targetFont !== nextTargetFont) {
+                            "Base font has changed at $i but target font has not changed."
+                        }
+                        // Font transition point. push run and reset context.
+                        fontRun.add(FontRun(start, i, baseFont, targetFont))
+                        maxRunLength = max(maxRunLength, i - start)
+                        baseFont = nextBaseFont
+                        targetFont = nextTargetFont
+                        start = i
+                        require(FontInterpolator.canInterpolate(baseFont, targetFont)) {
+                            "Cannot interpolate font at $start ($baseFont vs $targetFont)"
+                        }
+                    } else { // baseFont === nextBaseFont
+                        require(targetFont === nextTargetFont) {
+                            "Base font has not changed at $i but target font has changed."
+                        }
+                    }
+                }
+                fontRun.add(FontRun(start, glyphCount, baseFont, targetFont))
+                maxRunLength = max(maxRunLength, glyphCount - start)
+            }
+            Line(glyphIds, baseX, baseY, targetX, targetY, fontRun)
+        }
+
+        // Update float array used for drawing.
+        if (tmpPositionArray.size < maxRunLength * 2) {
+            tmpPositionArray = FloatArray(maxRunLength * 2)
+        }
+    }
+
+    // Draws single font run.
+    private fun drawFontRun(c: Canvas, line: Line, run: FontRun, paint: Paint) {
+        var arrayIndex = 0
+        for (i in run.start until run.end) {
+            tmpPositionArray[arrayIndex++] =
+                    MathUtils.lerp(line.baseX[i], line.targetX[i], progress)
+            tmpPositionArray[arrayIndex++] =
+                    MathUtils.lerp(line.baseY[i], line.targetY[i], progress)
+        }
+
+        c.drawGlyphs(
+                line.glyphIds,
+                run.start,
+                tmpPositionArray,
+                0,
+                run.length,
+                fontInterpolator.lerp(run.baseFont, run.targetFont, progress),
+                paint)
+    }
+
+    private fun updatePositionsAndFonts(
+        layoutResult: List<PositionedGlyphs>,
+        updateBase: Boolean
+    ) {
+        // Update target positions with newly calculated text layout.
+        check(layoutResult.size == lines.size) {
+            "The new layout result has different line count."
+        }
+
+        lines.zip(layoutResult) { line, newGlyphs ->
+            require(newGlyphs.glyphCount() == line.glyphIds.size) {
+                "The new layout has different glyph count."
+            }
+
+            line.fontRuns.forEach { run ->
+                val newFont = newGlyphs.getFont(run.start)
+                for (i in run.start until run.end) {
+                    require(newGlyphs.getGlyphId(run.start) == line.glyphIds[run.start]) {
+                        "The new layout has different glyph ID at ${run.start}"
+                    }
+                    require(newFont === newGlyphs.getFont(i)) {
+                        "The new layout has different font run." +
+                                " $newFont vs ${newGlyphs.getFont(i)} at $i"
+                    }
+                }
+
+                // The passing base font and target font is already interpolatable, so just check
+                // new font can be interpolatable with base font.
+                require(FontInterpolator.canInterpolate(newFont, run.baseFont)) {
+                    "New font cannot be interpolated with existing font. $newFont, ${run.baseFont}"
+                }
+
+                if (updateBase) {
+                    run.baseFont = newFont
+                } else {
+                    run.targetFont = newFont
+                }
+            }
+
+            if (updateBase) {
+                for (i in line.baseX.indices) {
+                    line.baseX[i] = newGlyphs.getGlyphX(i)
+                    line.baseY[i] = newGlyphs.getGlyphY(i)
+                }
+            } else {
+                for (i in line.baseX.indices) {
+                    line.targetX[i] = newGlyphs.getGlyphX(i)
+                    line.targetY[i] = newGlyphs.getGlyphY(i)
+                }
+            }
+        }
+    }
+
+    // Linear interpolate the paint.
+    private fun lerp(from: Paint, to: Paint, t: Float, out: Paint) {
+        // Currently only font size is interpolated.
+        // TODO(172943390): Add other interpolation or support custom interpolator.
+        out.set(from)
+        out.textSize = MathUtils.lerp(from.textSize, to.textSize, t)
+    }
+
+    // Shape the text and stores the result to out argument.
+    private fun shapeText(layout: Layout, paint: Paint): List<PositionedGlyphs> {
+        val out = mutableListOf<PositionedGlyphs>()
+        for (lineNo in 0 until layout.lineCount) { // Shape all lines.
+            val lineStart = layout.getLineStart(lineNo)
+            val count = layout.getLineEnd(lineNo) - lineStart
+            out.add(TextRunShaper.shapeTextRun(
+                    layout.text, // Styles are ignored.
+                    lineStart, count, // shape range
+                    lineStart, count, // shape context = shape range.
+                    0f, 0f, // the layout offset. Not changed.
+                    layout.getParagraphDirection(lineNo) == Layout.DIR_RIGHT_TO_LEFT,
+                    paint)) // Use given paint instead of layout's paint for style interpolation.
+        }
+        return out
+    }
+}
+
+private fun Layout.getDrawOrigin(lineNo: Int) =
+        if (getParagraphDirection(lineNo) == Layout.DIR_LEFT_TO_RIGHT) {
+            getLineLeft(lineNo)
+        } else {
+            getLineRight(lineNo)
+        }
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/keyguard/TimeBasedColorsClockController.java b/packages/SystemUI/src/com/android/keyguard/TimeBasedColorsClockController.java
index 3cbae0a..933d338 100644
--- a/packages/SystemUI/src/com/android/keyguard/TimeBasedColorsClockController.java
+++ b/packages/SystemUI/src/com/android/keyguard/TimeBasedColorsClockController.java
@@ -71,12 +71,10 @@
     public void setDarkAmount(float darkAmount) {
         mDarkAmount = darkAmount;
 
-        // TODO: (b/170228350) currently this relayouts throughout the animation;
-        //  eventually this should use new Text APIs to animate the variable font weight
         refreshTime(System.currentTimeMillis());
 
         int weight = (int) MathUtils.lerp(200, 400, 1f - darkAmount);
-        mView.setFontVariationSettings("'wght' " + weight);
+        mView.setTextStyle(weight, -1 /* unchange text size */, true);
     }
 
     private int getTimeIndex(long timeInMillis) {
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index f073ced..11180d1 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -109,14 +109,18 @@
                     .setSplitScreen(mWMComponent.getSplitScreen())
                     .setOneHanded(mWMComponent.getOneHanded())
                     .setBubbles(mWMComponent.getBubbles())
-                    .setShellDump(mWMComponent.getShellDump());
+                    .setHideDisplayCutout(mWMComponent.getHideDisplayCutout())
+                    .setShellDump(mWMComponent.getShellDump())
+                    .setAppPairs(mWMComponent.getAppPairs());
         } else {
             // TODO: Call on prepareSysUIComponentBuilder but not with real components.
             builder = builder.setPip(Optional.ofNullable(null))
                     .setSplitScreen(Optional.ofNullable(null))
                     .setOneHanded(Optional.ofNullable(null))
                     .setBubbles(Optional.ofNullable(null))
-                    .setShellDump(Optional.ofNullable(null));
+                    .setHideDisplayCutout(Optional.ofNullable(null))
+                    .setShellDump(Optional.ofNullable(null))
+                    .setAppPairs(Optional.ofNullable(null));
         }
         mSysUIComponent = builder.build();
         if (initializeComponents) {
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java
index 724d197ba..c71bb5b 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java
@@ -17,20 +17,16 @@
 package com.android.systemui.accessibility;
 
 import android.annotation.MainThread;
-import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
 import android.content.res.Configuration;
 import android.graphics.Rect;
 import android.os.Handler;
-import android.os.RemoteException;
-import android.util.Log;
 import android.view.SurfaceControl;
 import android.view.accessibility.AccessibilityManager;
 import android.view.accessibility.IRemoteMagnificationAnimationCallback;
 import android.view.accessibility.IWindowMagnificationConnection;
-import android.view.accessibility.IWindowMagnificationConnectionCallback;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.graphics.SfVsyncFrameCallbackProvider;
@@ -174,95 +170,4 @@
         mAccessibilityManager.setWindowMagnificationConnection(null);
         //TODO: destroy controllers.
     }
-
-    private static class WindowMagnificationConnectionImpl extends
-            IWindowMagnificationConnection.Stub {
-
-        private static final String TAG = "WindowMagnificationConnectionImpl";
-
-        private IWindowMagnificationConnectionCallback mConnectionCallback;
-        private final WindowMagnification mWindowMagnification;
-        private final Handler mHandler;
-        private final ModeSwitchesController mModeSwitchesController;
-
-        WindowMagnificationConnectionImpl(@NonNull WindowMagnification windowMagnification,
-                @Main Handler mainHandler, ModeSwitchesController modeSwitchesController) {
-            mWindowMagnification = windowMagnification;
-            mHandler = mainHandler;
-            mModeSwitchesController = modeSwitchesController;
-        }
-
-        @Override
-        public void enableWindowMagnification(int displayId, float scale, float centerX,
-                float centerY, IRemoteMagnificationAnimationCallback callback) {
-            mHandler.post(
-                    () -> mWindowMagnification.enableWindowMagnification(displayId, scale, centerX,
-                            centerY, callback));
-        }
-
-        @Override
-        public void setScale(int displayId, float scale) {
-            mHandler.post(() -> mWindowMagnification.setScale(displayId, scale));
-        }
-
-        @Override
-        public void disableWindowMagnification(int displayId,
-                IRemoteMagnificationAnimationCallback callback) {
-            mHandler.post(() -> mWindowMagnification.disableWindowMagnification(displayId,
-                    callback));
-        }
-
-        @Override
-        public void moveWindowMagnifier(int displayId, float offsetX, float offsetY) {
-            mHandler.post(
-                    () -> mWindowMagnification.moveWindowMagnifier(displayId, offsetX, offsetY));
-        }
-
-        @Override
-        public void showMagnificationButton(int displayId, int magnificationMode) {
-            mHandler.post(
-                    () -> mModeSwitchesController.showButton(displayId, magnificationMode));
-        }
-
-        @Override
-        public void removeMagnificationButton(int displayId) {
-            mHandler.post(
-                    () -> mModeSwitchesController.removeButton(displayId));
-        }
-
-        @Override
-        public void setConnectionCallback(IWindowMagnificationConnectionCallback callback) {
-            mConnectionCallback = callback;
-        }
-
-        void onWindowMagnifierBoundsChanged(int displayId, Rect frame) {
-            if (mConnectionCallback != null) {
-                try {
-                    mConnectionCallback.onWindowMagnifierBoundsChanged(displayId, frame);
-                } catch (RemoteException e) {
-                    Log.e(TAG, "Failed to inform bounds changed", e);
-                }
-            }
-        }
-
-        void onSourceBoundsChanged(int displayId, Rect sourceBounds) {
-            if (mConnectionCallback != null) {
-                try {
-                    mConnectionCallback.onSourceBoundsChanged(displayId, sourceBounds);
-                } catch (RemoteException e) {
-                    Log.e(TAG, "Failed to inform source bounds changed", e);
-                }
-            }
-        }
-
-        void onPerformScaleAction(int displayId, float scale) {
-            if (mConnectionCallback != null) {
-                try {
-                    mConnectionCallback.onPerformScaleAction(displayId, scale);
-                } catch (RemoteException e) {
-                    Log.e(TAG, "Failed to inform performing scale action", e);
-                }
-            }
-        }
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java
new file mode 100644
index 0000000..be7d757
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.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 com.android.systemui.accessibility;
+
+import android.annotation.NonNull;
+import android.graphics.Rect;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.util.Log;
+import android.view.accessibility.IRemoteMagnificationAnimationCallback;
+import android.view.accessibility.IWindowMagnificationConnection;
+import android.view.accessibility.IWindowMagnificationConnectionCallback;
+
+import com.android.systemui.dagger.qualifiers.Main;
+
+/**
+ * Implementation of window magnification connection.
+ *
+ * @see IWindowMagnificationConnection
+ */
+class WindowMagnificationConnectionImpl extends IWindowMagnificationConnection.Stub {
+
+    private static final String TAG = "WindowMagnificationConnectionImpl";
+
+    private IWindowMagnificationConnectionCallback mConnectionCallback;
+    private final WindowMagnification mWindowMagnification;
+    private final Handler mHandler;
+    private final ModeSwitchesController mModeSwitchesController;
+
+    WindowMagnificationConnectionImpl(@NonNull WindowMagnification windowMagnification,
+            @Main Handler mainHandler, ModeSwitchesController modeSwitchesController) {
+        mWindowMagnification = windowMagnification;
+        mHandler = mainHandler;
+        mModeSwitchesController = modeSwitchesController;
+    }
+
+    @Override
+    public void enableWindowMagnification(int displayId, float scale, float centerX,
+            float centerY, IRemoteMagnificationAnimationCallback callback) {
+        mHandler.post(
+                () -> mWindowMagnification.enableWindowMagnification(displayId, scale, centerX,
+                        centerY, callback));
+    }
+
+    @Override
+    public void setScale(int displayId, float scale) {
+        mHandler.post(() -> mWindowMagnification.setScale(displayId, scale));
+    }
+
+    @Override
+    public void disableWindowMagnification(int displayId,
+            IRemoteMagnificationAnimationCallback callback) {
+        mHandler.post(() -> mWindowMagnification.disableWindowMagnification(displayId,
+                callback));
+    }
+
+    @Override
+    public void moveWindowMagnifier(int displayId, float offsetX, float offsetY) {
+        mHandler.post(
+                () -> mWindowMagnification.moveWindowMagnifier(displayId, offsetX, offsetY));
+    }
+
+    @Override
+    public void showMagnificationButton(int displayId, int magnificationMode) {
+        mHandler.post(
+                () -> mModeSwitchesController.showButton(displayId, magnificationMode));
+    }
+
+    @Override
+    public void removeMagnificationButton(int displayId) {
+        mHandler.post(
+                () -> mModeSwitchesController.removeButton(displayId));
+    }
+
+    @Override
+    public void setConnectionCallback(IWindowMagnificationConnectionCallback callback) {
+        mConnectionCallback = callback;
+    }
+
+    void onWindowMagnifierBoundsChanged(int displayId, Rect frame) {
+        if (mConnectionCallback != null) {
+            try {
+                mConnectionCallback.onWindowMagnifierBoundsChanged(displayId, frame);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Failed to inform bounds changed", e);
+            }
+        }
+    }
+
+    void onSourceBoundsChanged(int displayId, Rect sourceBounds) {
+        if (mConnectionCallback != null) {
+            try {
+                mConnectionCallback.onSourceBoundsChanged(displayId, sourceBounds);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Failed to inform source bounds changed", e);
+            }
+        }
+    }
+
+    void onPerformScaleAction(int displayId, float scale) {
+        if (mConnectionCallback != null) {
+            try {
+                mConnectionCallback.onPerformScaleAction(displayId, scale);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Failed to inform performing scale action", e);
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java
index 9a40541..e4f6d6c 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java
@@ -196,7 +196,7 @@
     public void onAuthenticationFailed(String failureReason) {
         if (getSize() == AuthDialog.SIZE_MEDIUM) {
             mTryAgainButton.setVisibility(View.VISIBLE);
-            mPositiveButton.setVisibility(View.GONE);
+            mConfirmButton.setVisibility(View.GONE);
         }
 
         // Do this last since wa want to know if the button is being animated (in the case of
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java
index 0608ca2..c748ab2 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java
@@ -116,8 +116,16 @@
             return mBiometricView.findViewById(R.id.button_negative);
         }
 
-        public Button getPositiveButton() {
-            return mBiometricView.findViewById(R.id.button_positive);
+        public Button getCancelButton() {
+            return mBiometricView.findViewById(R.id.button_cancel);
+        }
+
+        public Button getUseCredentialButton() {
+            return mBiometricView.findViewById(R.id.button_use_credential);
+        }
+
+        public Button getConfirmButton() {
+            return mBiometricView.findViewById(R.id.button_confirm);
         }
 
         public Button getTryAgainButton() {
@@ -176,8 +184,16 @@
     private View mIconHolderView;
     protected ImageView mIconView;
     @VisibleForTesting protected TextView mIndicatorView;
+
+    // Negative button position, exclusively for the app-specified behavior
     @VisibleForTesting Button mNegativeButton;
-    @VisibleForTesting Button mPositiveButton;
+    // Negative button position, exclusively for cancelling auth after passive auth success
+    @VisibleForTesting Button mCancelButton;
+    // Negative button position, shown if device credentials are allowed
+    @VisibleForTesting Button mUseCredentialButton;
+
+    // Positive button position,
+    @VisibleForTesting Button mConfirmButton;
     @VisibleForTesting Button mTryAgainButton;
 
     // Measurements when biometric view is showing text, buttons, etc.
@@ -303,6 +319,7 @@
             mDescriptionView.setVisibility(View.GONE);
             mIndicatorView.setVisibility(View.GONE);
             mNegativeButton.setVisibility(View.GONE);
+            mUseCredentialButton.setVisibility(View.GONE);
 
             final float iconPadding = getResources()
                     .getDimension(R.dimen.biometric_dialog_icon_padding);
@@ -336,6 +353,7 @@
                 mTitleView.setAlpha(opacity);
                 mIndicatorView.setAlpha(opacity);
                 mNegativeButton.setAlpha(opacity);
+                mCancelButton.setAlpha(opacity);
                 mTryAgainButton.setAlpha(opacity);
 
                 if (!TextUtils.isEmpty(mSubtitleView.getText())) {
@@ -355,7 +373,12 @@
                     super.onAnimationStart(animation);
                     mTitleView.setVisibility(View.VISIBLE);
                     mIndicatorView.setVisibility(View.VISIBLE);
-                    mNegativeButton.setVisibility(View.VISIBLE);
+
+                    if (isDeviceCredentialAllowed()) {
+                        mUseCredentialButton.setVisibility(View.VISIBLE);
+                    } else {
+                        mNegativeButton.setVisibility(View.VISIBLE);
+                    }
                     mTryAgainButton.setVisibility(View.VISIBLE);
 
                     if (!TextUtils.isEmpty(mSubtitleView.getText())) {
@@ -447,15 +470,17 @@
             case STATE_AUTHENTICATING:
                 removePendingAnimations();
                 if (mRequireConfirmation) {
-                    mPositiveButton.setEnabled(false);
-                    mPositiveButton.setVisibility(View.VISIBLE);
+                    mConfirmButton.setEnabled(false);
+                    mConfirmButton.setVisibility(View.VISIBLE);
                 }
                 break;
 
             case STATE_AUTHENTICATED:
                 if (mSize != AuthDialog.SIZE_SMALL) {
-                    mPositiveButton.setVisibility(View.GONE);
+                    mConfirmButton.setVisibility(View.GONE);
                     mNegativeButton.setVisibility(View.GONE);
+                    mUseCredentialButton.setVisibility(View.GONE);
+                    mCancelButton.setVisibility(View.GONE);
                     mIndicatorView.setVisibility(View.INVISIBLE);
                 }
                 announceForAccessibility(getResources()
@@ -466,10 +491,11 @@
 
             case STATE_PENDING_CONFIRMATION:
                 removePendingAnimations();
-                mNegativeButton.setText(R.string.cancel);
-                mNegativeButton.setContentDescription(getResources().getString(R.string.cancel));
-                mPositiveButton.setEnabled(true);
-                mPositiveButton.setVisibility(View.VISIBLE);
+                mNegativeButton.setVisibility(View.GONE);
+                mCancelButton.setVisibility(View.VISIBLE);
+                mUseCredentialButton.setVisibility(View.GONE);
+                mConfirmButton.setEnabled(true);
+                mConfirmButton.setVisibility(View.VISIBLE);
                 mIndicatorView.setTextColor(mTextColorHint);
                 mIndicatorView.setText(R.string.biometric_dialog_tap_confirm);
                 mIndicatorView.setVisibility(View.VISIBLE);
@@ -595,23 +621,29 @@
         mIconView = mInjector.getIconView();
         mIconHolderView = mInjector.getIconHolderView();
         mIndicatorView = mInjector.getIndicatorView();
+
+        // Negative-side (left) buttons
         mNegativeButton = mInjector.getNegativeButton();
-        mPositiveButton = mInjector.getPositiveButton();
+        mCancelButton = mInjector.getCancelButton();
+        mUseCredentialButton = mInjector.getUseCredentialButton();
+
+        // Positive-side (right) buttons
+        mConfirmButton = mInjector.getConfirmButton();
         mTryAgainButton = mInjector.getTryAgainButton();
 
         mNegativeButton.setOnClickListener((view) -> {
-            if (mState == STATE_PENDING_CONFIRMATION) {
-                mCallback.onAction(Callback.ACTION_USER_CANCELED);
-            } else {
-                if (isDeviceCredentialAllowed()) {
-                    startTransitionToCredentialUI();
-                } else {
-                    mCallback.onAction(Callback.ACTION_BUTTON_NEGATIVE);
-                }
-            }
+            mCallback.onAction(Callback.ACTION_BUTTON_NEGATIVE);
         });
 
-        mPositiveButton.setOnClickListener((view) -> {
+        mCancelButton.setOnClickListener((view) -> {
+            mCallback.onAction(Callback.ACTION_USER_CANCELED);
+        });
+
+        mUseCredentialButton.setOnClickListener((view) -> {
+            startTransitionToCredentialUI();
+        });
+
+        mConfirmButton.setOnClickListener((view) -> {
             updateState(STATE_AUTHENTICATED);
         });
 
@@ -645,31 +677,36 @@
     void onAttachedToWindowInternal() {
         setText(mTitleView, mPromptInfo.getTitle());
 
-        final CharSequence negativeText;
         if (isDeviceCredentialAllowed()) {
-
+            final CharSequence credentialButtonText;
             final @Utils.CredentialType int credentialType =
                     Utils.getCredentialType(mContext, mEffectiveUserId);
-
             switch (credentialType) {
                 case Utils.CREDENTIAL_PIN:
-                    negativeText = getResources().getString(R.string.biometric_dialog_use_pin);
+                    credentialButtonText =
+                            getResources().getString(R.string.biometric_dialog_use_pin);
                     break;
                 case Utils.CREDENTIAL_PATTERN:
-                    negativeText = getResources().getString(R.string.biometric_dialog_use_pattern);
+                    credentialButtonText =
+                            getResources().getString(R.string.biometric_dialog_use_pattern);
                     break;
                 case Utils.CREDENTIAL_PASSWORD:
-                    negativeText = getResources().getString(R.string.biometric_dialog_use_password);
+                    credentialButtonText =
+                            getResources().getString(R.string.biometric_dialog_use_password);
                     break;
                 default:
-                    negativeText = getResources().getString(R.string.biometric_dialog_use_password);
+                    credentialButtonText =
+                            getResources().getString(R.string.biometric_dialog_use_password);
                     break;
             }
 
+            mNegativeButton.setVisibility(View.GONE);
+
+            mUseCredentialButton.setText(credentialButtonText);
+            mUseCredentialButton.setVisibility(View.VISIBLE);
         } else {
-            negativeText = mPromptInfo.getNegativeButtonText();
+            setText(mNegativeButton, mPromptInfo.getNegativeButtonText());
         }
-        setText(mNegativeButton, negativeText);
 
         setTextOrHide(mSubtitleView, mPromptInfo.getSubtitle());
 
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
index 07e1f1b..2b33f8c 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
@@ -640,6 +640,7 @@
         }
         mContainerState = STATE_SHOWING;
         if (mBiometricView != null) {
+            mConfig.mCallback.onDialogAnimatedIn();
             mBiometricView.onDialogAnimatedIn();
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
index a6b1b90..ecbe5f4 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
@@ -54,7 +54,6 @@
 import com.android.systemui.doze.DozeReceiver;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.phone.KeyguardBouncer;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -68,7 +67,7 @@
  */
 @SysUISingleton
 public class AuthController extends SystemUI implements CommandQueue.Callbacks,
-        AuthDialogCallback, DozeReceiver, KeyguardBouncer.BouncerExpansionCallback {
+        AuthDialogCallback, DozeReceiver {
 
     private static final String TAG = "AuthController";
     private static final boolean DEBUG = true;
@@ -202,6 +201,20 @@
     }
 
     @Override
+    public void onDialogAnimatedIn() {
+        if (mReceiver == null) {
+            Log.e(TAG, "onDialogAnimatedIn: Receiver is null");
+            return;
+        }
+
+        try {
+            mReceiver.onDialogAnimatedIn();
+        } catch (RemoteException e) {
+            Log.e(TAG, "RemoteException when sending onDialogAnimatedIn", e);
+        }
+    }
+
+    @Override
     public void onDismissed(@DismissedReason int reason, @Nullable byte[] credentialAttestation) {
         switch (reason) {
             case AuthDialogCallback.DISMISSED_USER_CANCELED:
@@ -460,35 +473,6 @@
         mCurrentDialog = null;
     }
 
-    /** See {@link KeyguardBouncer.BouncerExpansionCallback#onFullyShown}. */
-    @Override
-    public void onFullyShown() {
-        if (mUdfpsController != null) {
-            mUdfpsController.setBouncerVisibility(true);
-        }
-    }
-
-    /** See {@link KeyguardBouncer.BouncerExpansionCallback#onStartingToHide}. */
-    @Override
-    public void onStartingToHide() {
-    }
-
-    /** See {@link KeyguardBouncer.BouncerExpansionCallback#onStartingToShow}. */
-    @Override
-    public void onStartingToShow() {
-        if (mUdfpsController != null) {
-            mUdfpsController.setBouncerVisibility(true);
-        }
-    }
-
-    /** See {@link KeyguardBouncer.BouncerExpansionCallback#onFullyHidden}. */
-    @Override
-    public void onFullyHidden() {
-        if (mUdfpsController != null) {
-            mUdfpsController.setBouncerVisibility(false);
-        }
-    }
-
    /**
      * Whether the passed userId has enrolled UDFPS.
      */
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogCallback.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogCallback.java
index d3bd4fb..d8d07e7 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogCallback.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogCallback.java
@@ -65,4 +65,9 @@
      * @param event
      */
     void onSystemEvent(int event);
+
+    /**
+     * Notifies when the dialog has finished animating in.
+     */
+    void onDialogAnimatedIn();
 }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index a4b407d..e437740 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -107,8 +107,6 @@
     private boolean mIsOverlayShowing;
     // Indicates whether the overlay has been requested.
     private boolean mIsOverlayRequested;
-    // Indicates whether the bouncer is showing. When it is showing, the overlay needs to be hidden.
-    private boolean mIsBouncerShowing;
 
     // The fingerprint AOD trigger doesn't provide an ACTION_UP/ACTION_CANCEL event to tell us when
     // to turn off high brightness mode. To get around this limitation, the state of the AOD
@@ -260,21 +258,8 @@
         updateOverlay();
     }
 
-    /**
-     * Call when the visibility of the bouncer changes.
-     *
-     * @param isShowing Whether or not the bouncer is showing
-     */
-    void setBouncerVisibility(boolean isShowing) {
-        if (isShowing == mIsBouncerShowing) {
-            return;
-        }
-        mIsBouncerShowing = isShowing;
-        updateOverlay();
-    }
-
     private void updateOverlay() {
-        if (mIsOverlayRequested && !mIsBouncerShowing) {
+        if (mIsOverlayRequested) {
             showUdfpsOverlay();
         } else {
             hideUdfpsOverlay();
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java
index b3e6033..7127f26 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java
@@ -23,6 +23,7 @@
 import android.app.INotificationManager;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.om.OverlayManager;
 import android.hardware.display.AmbientDisplayConfiguration;
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -43,6 +44,7 @@
 import com.android.keyguard.ViewMediatorCallback;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 import com.android.systemui.Prefs;
+import com.android.systemui.R;
 import com.android.systemui.accessibility.ModeSwitchesController;
 import com.android.systemui.accessibility.SystemActions;
 import com.android.systemui.assist.AssistManager;
@@ -78,6 +80,7 @@
 import com.android.systemui.statusbar.policy.DataSaverController;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.statusbar.policy.NetworkController;
+import com.android.systemui.theme.ThemeOverlayApplier;
 import com.android.systemui.util.leak.LeakDetector;
 import com.android.wm.shell.pip.Pip;
 import com.android.wm.shell.splitscreen.SplitScreen;
@@ -194,6 +197,17 @@
     }
 
     /** */
+    @SysUISingleton
+    @Provides
+    static ThemeOverlayApplier provideThemeOverlayManager(Context context,
+            @Background Executor bgExecutor, OverlayManager overlayManager,
+            DumpManager dumpManager) {
+        return new ThemeOverlayApplier(overlayManager, bgExecutor,
+                context.getString(R.string.launcher_overlayable_package),
+                context.getString(R.string.themepicker_overlayable_package), dumpManager);
+    }
+
+    /** */
     @Provides
     @SysUISingleton
     public NavigationBarController provideNavigationBarController(Context context,
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
index 9705551..c3f2e18 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
@@ -31,6 +31,7 @@
 import android.app.trust.TrustManager;
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.om.OverlayManager;
 import android.content.pm.IPackageManager;
 import android.content.pm.LauncherApps;
 import android.content.pm.PackageManager;
@@ -351,7 +352,7 @@
 
     @Provides
     static WallpaperManager provideWallpaperManager(Context context) {
-        return (WallpaperManager) context.getSystemService(Context.WALLPAPER_SERVICE);
+        return context.getSystemService(WallpaperManager.class);
     }
 
     @Provides
@@ -363,6 +364,12 @@
 
     @Provides
     @Singleton
+    static OverlayManager provideOverlayManager(Context context) {
+        return context.getSystemService(OverlayManager.class);
+    }
+
+    @Provides
+    @Singleton
     static WindowManager provideWindowManager(Context context) {
         return context.getSystemService(WindowManager.class);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
index 54aeab5..68a28ba 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
@@ -25,7 +25,9 @@
 import com.android.systemui.statusbar.policy.ConfigurationController;
 import com.android.systemui.util.InjectionInflationController;
 import com.android.wm.shell.ShellDump;
+import com.android.wm.shell.apppairs.AppPairs;
 import com.android.wm.shell.bubbles.Bubbles;
+import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout;
 import com.android.wm.shell.onehanded.OneHanded;
 import com.android.wm.shell.pip.Pip;
 import com.android.wm.shell.splitscreen.SplitScreen;
@@ -60,12 +62,18 @@
         Builder setSplitScreen(Optional<SplitScreen> s);
 
         @BindsInstance
+        Builder setAppPairs(Optional<AppPairs> s);
+
+        @BindsInstance
         Builder setOneHanded(Optional<OneHanded> o);
 
         @BindsInstance
         Builder setBubbles(Optional<Bubbles> b);
 
         @BindsInstance
+        Builder setHideDisplayCutout(Optional<HideDisplayCutout> h);
+
+        @BindsInstance
         Builder setShellDump(Optional<ShellDump> shellDump);
 
         SysUIComponent build();
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
index 9154ddb..e634529 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
@@ -19,7 +19,9 @@
 import com.android.systemui.wmshell.WMShellModule;
 import com.android.wm.shell.ShellDump;
 import com.android.wm.shell.ShellInit;
+import com.android.wm.shell.apppairs.AppPairs;
 import com.android.wm.shell.bubbles.Bubbles;
+import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout;
 import com.android.wm.shell.onehanded.OneHanded;
 import com.android.wm.shell.pip.Pip;
 import com.android.wm.shell.splitscreen.SplitScreen;
@@ -70,5 +72,11 @@
     Optional<SplitScreen> getSplitScreen();
 
     @WMSingleton
+    Optional<AppPairs> getAppPairs();
+
+    @WMSingleton
     Optional<Bubbles> getBubbles();
+
+    @WMSingleton
+    Optional<HideDisplayCutout> getHideDisplayCutout();
 }
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
index 6a78c64..c2ba6d5 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
@@ -69,12 +69,10 @@
      */
     private void setTileViewsWithPriorityConversations() {
         try {
-            List<ShortcutInfo> shortcutInfos =
-                    PeopleSpaceUtils.getShortcutInfos(
-                            mContext, mNotificationManager, mPeopleManager);
+            List<ShortcutInfo> shortcutInfos = PeopleSpaceUtils.getShortcutInfos(mContext,
+                    mNotificationManager, mPeopleManager);
             for (ShortcutInfo conversation : shortcutInfos) {
-                PeopleSpaceTileView tileView = new PeopleSpaceTileView(mContext,
-                        mPeopleSpaceLayout,
+                PeopleSpaceTileView tileView = new PeopleSpaceTileView(mContext, mPeopleSpaceLayout,
                         conversation.getId());
                 setTileView(tileView, conversation);
             }
@@ -84,20 +82,14 @@
     }
 
     /** Sets {@code tileView} with the data in {@code conversation}. */
-    private void setTileView(PeopleSpaceTileView tileView,
-            ShortcutInfo shortcutInfo) {
+    private void setTileView(PeopleSpaceTileView tileView, ShortcutInfo shortcutInfo) {
         try {
-            int userId = UserHandle.getUserHandleForUid(
-                    shortcutInfo.getUserId()).getIdentifier();
+            int userId = UserHandle.getUserHandleForUid(shortcutInfo.getUserId()).getIdentifier();
 
             String pkg = shortcutInfo.getPackage();
-            long lastInteraction = mPeopleManager.getLastInteraction(
-                    pkg, userId,
+            long lastInteraction = mPeopleManager.getLastInteraction(pkg, userId,
                     shortcutInfo.getId());
-            String status = lastInteraction != 0l ? mContext.getString(
-                    R.string.last_interaction_status,
-                    PeopleSpaceUtils.getLastInteractionString(
-                            lastInteraction)) : mContext.getString(R.string.basic_status);
+            String status = PeopleSpaceUtils.getLastInteractionString(mContext, lastInteraction);
             tileView.setStatus(status);
 
             tileView.setName(shortcutInfo.getLabel().toString());
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
index 1a9dd71..c983147 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
@@ -31,6 +31,8 @@
 import android.provider.Settings;
 import android.service.notification.ConversationChannelWrapper;
 
+import com.android.systemui.R;
+
 import java.time.Duration;
 import java.util.List;
 import java.util.Locale;
@@ -38,25 +40,24 @@
 
 /** Utils class for People Space. */
 public class PeopleSpaceUtils {
-    private static final String TAG = "PeopleSpaceUtils";
-
     /** Turns on debugging information about People Space. */
     public static final boolean DEBUG = true;
+    private static final String TAG = "PeopleSpaceUtils";
+    private static final int DAYS_IN_A_WEEK = 7;
+    private static final int MIN_HOUR = 1;
+    private static final int ONE_DAY = 1;
 
     /** Returns a list of {@link ShortcutInfo} corresponding to user's conversations. */
-    public static List<ShortcutInfo> getShortcutInfos(
-            Context context,
-            INotificationManager notificationManager,
-            IPeopleManager peopleManager
-    ) throws Exception {
+    public static List<ShortcutInfo> getShortcutInfos(Context context,
+            INotificationManager notificationManager, IPeopleManager peopleManager)
+            throws Exception {
         boolean showAllConversations = Settings.Global.getInt(context.getContentResolver(),
                 Settings.Global.PEOPLE_SPACE_CONVERSATION_TYPE, 0) == 0;
-        List<ConversationChannelWrapper> conversations =
-                notificationManager.getConversations(
-                        !showAllConversations /* priority only */).getList();
+        List<ConversationChannelWrapper> conversations = notificationManager.getConversations(
+                !showAllConversations /* priority only */).getList();
         List<ShortcutInfo> shortcutInfos = conversations.stream().filter(
-                c -> shouldKeepConversation(c)).map(
-                    c -> c.getShortcutInfo()).collect(Collectors.toList());
+                c -> shouldKeepConversation(c)).map(c -> c.getShortcutInfo()).collect(
+                Collectors.toList());
         if (showAllConversations) {
             List<ConversationChannel> recentConversations =
                     peopleManager.getRecentConversations().getList();
@@ -85,11 +86,8 @@
             bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
             // Single color bitmap will be created of 1x1 pixel
         } else {
-            bitmap = Bitmap.createBitmap(
-                    drawable.getIntrinsicWidth(),
-                    drawable.getIntrinsicHeight(),
-                    Bitmap.Config.ARGB_8888
-            );
+            bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
+                    drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
         }
 
         Canvas canvas = new Canvas(bitmap);
@@ -98,28 +96,31 @@
         return bitmap;
     }
 
-    /** Returns a readable representation of {@code lastInteraction}. */
-    public static String getLastInteractionString(long lastInteraction) {
+    /** Returns a readable status describing the {@code lastInteraction}. */
+    public static String getLastInteractionString(Context context, long lastInteraction) {
+        if (lastInteraction == 0L) {
+            return context.getString(R.string.basic_status);
+        }
         long now = System.currentTimeMillis();
-        Duration durationSinceLastInteraction = Duration.ofMillis(
-                now - lastInteraction);
+        Duration durationSinceLastInteraction = Duration.ofMillis(now - lastInteraction);
         MeasureFormat formatter = MeasureFormat.getInstance(Locale.getDefault(),
                 MeasureFormat.FormatWidth.WIDE);
-        if (durationSinceLastInteraction.toDays() >= 1) {
-            return
-                    formatter
-                            .formatMeasures(new Measure(durationSinceLastInteraction.toDays(),
-                                    MeasureUnit.DAY));
-        } else if (durationSinceLastInteraction.toHours() >= 1) {
-            return formatter.formatMeasures(new Measure(durationSinceLastInteraction.toHours(),
-                    MeasureUnit.HOUR));
-        } else if (durationSinceLastInteraction.toMinutes() >= 1) {
-            return formatter.formatMeasures(new Measure(durationSinceLastInteraction.toMinutes(),
-                    MeasureUnit.MINUTE));
+        if (durationSinceLastInteraction.toHours() < MIN_HOUR) {
+            return context.getString(R.string.last_interaction_status_less_than,
+                    formatter.formatMeasures(new Measure(MIN_HOUR, MeasureUnit.HOUR)));
+        } else if (durationSinceLastInteraction.toDays() < ONE_DAY) {
+            return context.getString(R.string.last_interaction_status, formatter.formatMeasures(
+                    new Measure(durationSinceLastInteraction.toHours(), MeasureUnit.HOUR)));
+        } else if (durationSinceLastInteraction.toDays() < DAYS_IN_A_WEEK) {
+            return context.getString(R.string.last_interaction_status, formatter.formatMeasures(
+                    new Measure(durationSinceLastInteraction.toDays(), MeasureUnit.DAY)));
         } else {
-            return formatter.formatMeasures(
-                    new Measure(durationSinceLastInteraction.toMillis() / 1000,
-                            MeasureUnit.SECOND));
+            return context.getString(durationSinceLastInteraction.toDays() == DAYS_IN_A_WEEK
+                            ? R.string.last_interaction_status :
+                            R.string.last_interaction_status_over,
+                    formatter.formatMeasures(
+                            new Measure(durationSinceLastInteraction.toDays() / DAYS_IN_A_WEEK,
+                                    MeasureUnit.WEEK)));
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
index 8415368..9b7cf6e 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
@@ -16,9 +16,11 @@
 
 package com.android.systemui.people.widget;
 
+import android.app.NotificationChannel;
 import android.content.ComponentName;
 import android.content.Context;
 import android.os.ServiceManager;
+import android.os.UserHandle;
 import android.service.notification.NotificationListenerService;
 import android.service.notification.StatusBarNotification;
 import android.util.Log;
@@ -130,6 +132,18 @@
             if (DEBUG) Log.d(TAG, "onNotificationsInitialized");
             updateWidgets();
         }
+
+        @Override
+        public void onNotificationChannelModified(
+                String pkgName,
+                UserHandle user,
+                NotificationChannel channel,
+                int modificationType) {
+            if (DEBUG) Log.d(TAG, "onNotificationChannelModified");
+            if (channel.isConversation()) {
+                updateWidgets();
+            }
+        }
     };
 
 }
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java
index c68c306..d869986 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java
@@ -46,7 +46,7 @@
     private PackageManager mPackageManager;
     private LauncherApps mLauncherApps;
     private List<ShortcutInfo> mShortcutInfos = new ArrayList<>();
-    private Context mContext;
+    private final Context mContext;
 
     public PeopleSpaceWidgetRemoteViewsFactory(Context context, Intent intent) {
         this.mContext = context;
@@ -55,9 +55,8 @@
     @Override
     public void onCreate() {
         if (DEBUG) Log.d(TAG, "onCreate called");
-        mNotificationManager =
-                INotificationManager.Stub.asInterface(
-                        ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+        mNotificationManager = INotificationManager.Stub.asInterface(
+                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
         mPackageManager = mContext.getPackageManager();
         mPeopleManager = IPeopleManager.Stub.asInterface(
                 ServiceManager.getService(Context.PEOPLE_SERVICE));
@@ -71,9 +70,8 @@
      */
     private void setTileViewsWithPriorityConversations() {
         try {
-            mShortcutInfos =
-                    PeopleSpaceUtils.getShortcutInfos(
-                            mContext, mNotificationManager, mPeopleManager);
+            mShortcutInfos = PeopleSpaceUtils.getShortcutInfos(mContext, mNotificationManager,
+                    mPeopleManager);
         } catch (Exception e) {
             Log.e(TAG, "Couldn't retrieve conversations", e);
         }
@@ -99,21 +97,16 @@
     public RemoteViews getViewAt(int i) {
         if (DEBUG) Log.d(TAG, "getViewAt called, index: " + i);
 
-        RemoteViews personView =
-                new RemoteViews(mContext.getPackageName(), R.layout.people_space_widget_item);
+        RemoteViews personView = new RemoteViews(mContext.getPackageName(),
+                R.layout.people_space_widget_item);
         try {
             ShortcutInfo shortcutInfo = mShortcutInfos.get(i);
-            int userId = UserHandle.getUserHandleForUid(
-                    shortcutInfo.getUserId()).getIdentifier();
+            int userId = UserHandle.getUserHandleForUid(shortcutInfo.getUserId()).getIdentifier();
             String pkg = shortcutInfo.getPackage();
-            long lastInteraction = mPeopleManager.getLastInteraction(
-                    pkg, userId,
+            long lastInteraction = mPeopleManager.getLastInteraction(pkg, userId,
                     shortcutInfo.getId());
 
-            String status = lastInteraction != 0L ? mContext.getString(
-                    R.string.last_interaction_status,
-                    PeopleSpaceUtils.getLastInteractionString(
-                            lastInteraction)) : mContext.getString(R.string.basic_status);
+            String status = PeopleSpaceUtils.getLastInteractionString(mContext, lastInteraction);
 
             personView.setTextViewText(R.id.status, status);
             personView.setTextViewText(R.id.name, shortcutInfo.getLabel().toString());
diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
index 3062a77..8c7d459 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
@@ -63,7 +63,6 @@
     private int mPageToRestore = -1;
     private int mLayoutOrientation;
     private int mLayoutDirection;
-    private int mHorizontalClipBound;
     private final Rect mClippingRect;
     private final UiEventLogger mUiEventLogger = QSEvents.INSTANCE.getQsUiEventsLogger();
     private int mExcessHeight;
@@ -333,7 +332,6 @@
         // Update bottom padding, useful for removing extra space once the panel page indicator is
         // hidden.
         Resources res = getContext().getResources();
-        mHorizontalClipBound = res.getDimensionPixelSize(R.dimen.notification_side_paddings);
         setPadding(0, 0, 0,
                 getContext().getResources().getDimensionPixelSize(
                         R.dimen.qs_paged_tile_layout_padding_bottom));
@@ -351,7 +349,8 @@
     @Override
     protected void onLayout(boolean changed, int l, int t, int r, int b) {
         super.onLayout(changed, l, t, r, b);
-        mClippingRect.set(mHorizontalClipBound, 0, (r - l) - mHorizontalClipBound, b - t);
+        // Clip to margins
+        mClippingRect.set(0, 0, (r - l), b - t);
         setClipBounds(mClippingRect);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index c52b8ca..e9207f1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -200,8 +200,6 @@
         int count = 0;
         int[] loc1 = new int[2];
         int[] loc2 = new int[2];
-        int lastXDiff = 0;
-        int lastX = 0;
 
         clearAnimationState();
         mAllViews.clear();
@@ -231,12 +229,11 @@
                 QSTileView quickTileView = mQuickQSPanelController.getTileView(tile);
                 if (quickTileView == null) continue;
 
-                lastX = loc1[0];
                 getRelativePosition(loc1, quickTileView.getIcon().getIconView(), view);
                 getRelativePosition(loc2, tileIcon, view);
                 final int xDiff = loc2[0] - loc1[0];
                 final int yDiff = loc2[1] - loc1[1];
-                lastXDiff = loc1[0] - lastX;
+
 
                 if (count < tileLayout.getNumVisibleTiles()) {
                     // Move the quick tile right from its location to the new one.
@@ -267,19 +264,8 @@
                 mAllViews.add(tileView.getIcon());
                 mAllViews.add(quickTileView);
             } else if (mFullRows && isIconInAnimatedRow(count)) {
-                // TODO: Refactor some of this, it shares a lot with the above block.
-                // Move the last tile position over by the last difference between quick tiles.
-                // This makes the extra icons seems as if they are coming from positions in the
-                // quick panel.
-                loc1[0] += lastXDiff;
-                getRelativePosition(loc2, tileIcon, view);
-                final int xDiff = loc2[0] - loc1[0];
-                final int yDiff = loc2[1] - loc1[1];
 
-                firstPageBuilder.addFloat(tileView, "translationY", heightDiff, 0);
-                translationXBuilder.addFloat(tileView, "translationX", -xDiff, 0);
-                translationYBuilder.addFloat(tileView, "translationY", -yDiff, 0);
-                translationYBuilder.addFloat(tileIcon, "translationY", -yDiff, 0);
+                firstPageBuilder.addFloat(tileView, "translationY", -heightDiff, 0);
 
                 mAllViews.add(tileIcon);
             } else {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 80bfa79..f4571d7 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -65,8 +65,6 @@
     private View mQSPanelContainer;
 
     private View mBackground;
-    private View mBackgroundGradient;
-    private View mStatusBarBackground;
 
     private int mSideMargins;
     private boolean mQsDisabled;
@@ -86,8 +84,6 @@
         mQSCustomizer = findViewById(R.id.qs_customize);
         mDragHandle = findViewById(R.id.qs_drag_handle_view);
         mBackground = findViewById(R.id.quick_settings_background);
-        mStatusBarBackground = findViewById(R.id.quick_settings_status_bar_background);
-        mBackgroundGradient = findViewById(R.id.quick_settings_gradient_view);
         mHeader.getHeaderQsPanel().setMediaVisibilityChangedListener((visible) -> {
             if (mHeader.getHeaderQsPanel().isShown()) {
                 mAnimateBottomOnNextLayout = true;
@@ -117,7 +113,6 @@
     @Override
     protected void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
-        setBackgroundGradientVisibility(newConfig);
         mSizePoint.set(0, 0); // Will be retrieved on next measure pass.
     }
 
@@ -186,7 +181,6 @@
         final boolean disabled = (state2 & DISABLE2_QUICK_SETTINGS) != 0;
         if (disabled == mQsDisabled) return;
         mQsDisabled = disabled;
-        setBackgroundGradientVisibility(getResources().getConfiguration());
         mBackground.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE);
     }
 
@@ -252,16 +246,6 @@
                 + mHeader.getHeight();
     }
 
-    private void setBackgroundGradientVisibility(Configuration newConfig) {
-        if (newConfig.orientation == ORIENTATION_LANDSCAPE) {
-            mBackgroundGradient.setVisibility(View.INVISIBLE);
-            mStatusBarBackground.setVisibility(View.INVISIBLE);
-        } else {
-            mBackgroundGradient.setVisibility(mQsDisabled ? View.INVISIBLE : View.VISIBLE);
-            mStatusBarBackground.setVisibility(View.VISIBLE);
-        }
-    }
-
     public void setExpansion(float expansion) {
         mQsExpansion = expansion;
         mDragHandle.setAlpha(1.0f - expansion);
@@ -271,8 +255,7 @@
     private void updatePaddingsAndMargins(QSPanelController qsPanelController) {
         for (int i = 0; i < getChildCount(); i++) {
             View view = getChildAt(i);
-            if (view == mStatusBarBackground || view == mBackgroundGradient
-                    || view == mQSCustomizer) {
+            if (view == mQSCustomizer) {
                 // Some views are always full width or have dependent padding
                 continue;
             }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index 0fe018e..043f5f1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -16,6 +16,9 @@
 
 import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
 
+import static com.android.systemui.media.dagger.MediaModule.QS_PANEL;
+import static com.android.systemui.media.dagger.MediaModule.QUICK_QS_PANEL;
+
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.content.res.Configuration;
@@ -50,6 +53,7 @@
 import com.android.systemui.util.Utils;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 
 public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Callbacks,
         StatusBarStateController.StateListener {
@@ -82,6 +86,8 @@
     private final InjectionInflationController mInjectionInflater;
     private final CommandQueue mCommandQueue;
     private final QSDetailDisplayer mQsDetailDisplayer;
+    private final MediaHost mQsMediaHost;
+    private final MediaHost mQqsMediaHost;
     private final QSFragmentComponent.Factory mQsComponentFactory;
     private final QSTileHost mHost;
     private boolean mShowCollapsedOnKeyguard;
@@ -104,12 +110,15 @@
     public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler,
             InjectionInflationController injectionInflater, QSTileHost qsTileHost,
             StatusBarStateController statusBarStateController, CommandQueue commandQueue,
-            QSDetailDisplayer qsDetailDisplayer,
+            QSDetailDisplayer qsDetailDisplayer, @Named(QS_PANEL) MediaHost qsMediaHost,
+            @Named(QUICK_QS_PANEL) MediaHost qqsMediaHost,
             QSFragmentComponent.Factory qsComponentFactory) {
         mRemoteInputQuickSettingsDisabler = remoteInputQsDisabler;
         mInjectionInflater = injectionInflater;
         mCommandQueue = commandQueue;
         mQsDetailDisplayer = qsDetailDisplayer;
+        mQsMediaHost = qsMediaHost;
+        mQqsMediaHost = qqsMediaHost;
         mQsComponentFactory = qsComponentFactory;
         commandQueue.observe(getLifecycle(), this);
         mHost = qsTileHost;
@@ -261,7 +270,6 @@
     }
 
     public void setHost(QSTileHost qsh) {
-        mHeader.setQSPanel(mQSPanelController.getView());
         mQSDetail.setHost(qsh);
     }
 
@@ -455,11 +463,9 @@
             float expandedMediaPosition = absoluteBottomPosition - mQSPanelScrollView.getScrollY()
                     + mQSPanelScrollView.getScrollRange();
             // The expanded media host should never move below the laid out position
-            pinToBottom(
-                    expandedMediaPosition, mQSPanelController.getMediaHost(), true /* expanded */);
+            pinToBottom(expandedMediaPosition, mQsMediaHost, true /* expanded */);
             // The expanded media host should never move above the laid out position
-            pinToBottom(absoluteBottomPosition, mHeader.getHeaderQsPanel().getMediaHost(),
-                    false /* expanded */);
+            pinToBottom(absoluteBottomPosition, mQqsMediaHost, false /* expanded */);
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 08f38a8..8955a7e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -550,6 +550,7 @@
         }
         boolean horizontal = shouldUseHorizontalLayout();
         ViewGroup host = mMediaHost.getHostView();
+
         ViewGroup newParent = horizontal ? mHorizontalLinearLayout : this;
         ViewGroup currentParent = (ViewGroup) host.getParent();
         if (currentParent != newParent) {
@@ -865,10 +866,6 @@
         }
     }
 
-    public MediaHost getMediaHost() {
-        return mMediaHost;
-    }
-
     /**
      * Set the header container of quick settings.
      */
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
index addaf7e..32c81af 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.qs;
 
+import static com.android.systemui.media.dagger.MediaModule.QS_PANEL;
 import static com.android.systemui.qs.QSPanel.QS_SHOW_BRIGHTNESS;
 
 import android.annotation.NonNull;
@@ -40,6 +41,7 @@
 import java.util.function.Consumer;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 
 /**
  * Controller for {@link QSPanel}.
@@ -49,6 +51,7 @@
     private final QSSecurityFooter mQsSecurityFooter;
     private final TunerService mTunerService;
     private final QSCustomizerController mQsCustomizerController;
+    private final QSTileRevealController.Factory mQsTileRevealControllerFactory;
     private final BrightnessController mBrightnessController;
     private final BrightnessSlider.Factory mBrightnessSliderFactory;
     private final BrightnessSlider mBrightnessSlider;
@@ -73,15 +76,17 @@
     @Inject
     QSPanelController(QSPanel view, QSSecurityFooter qsSecurityFooter, TunerService tunerService,
             QSTileHost qstileHost, QSCustomizerController qsCustomizerController,
+            @Named(QS_PANEL) MediaHost mediaHost,
             QSTileRevealController.Factory qsTileRevealControllerFactory,
             DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger,
             BrightnessController.Factory brightnessControllerFactory,
             BrightnessSlider.Factory brightnessSliderFactory) {
-        super(view, qstileHost, qsCustomizerController, qsTileRevealControllerFactory,
-                metricsLogger, uiEventLogger, dumpManager);
+        super(view, qstileHost, qsCustomizerController, mediaHost, metricsLogger, uiEventLogger,
+                dumpManager);
         mQsSecurityFooter = qsSecurityFooter;
         mTunerService = tunerService;
         mQsCustomizerController = qsCustomizerController;
+        mQsTileRevealControllerFactory = qsTileRevealControllerFactory;
         mQsSecurityFooter.setHostEnvironment(qstileHost);
         mBrightnessSliderFactory = brightnessSliderFactory;
 
@@ -93,6 +98,7 @@
 
     @Override
     public void onInit() {
+        super.onInit();
         mQsCustomizerController.init();
         mBrightnessSlider.init();
     }
@@ -114,6 +120,12 @@
     }
 
     @Override
+    protected QSTileRevealController createTileRevealController() {
+        return mQsTileRevealControllerFactory.create(
+                this, (PagedTileLayout) mView.createRegularTileLayout());
+    }
+
+    @Override
     protected void onViewDetached() {
         mTunerService.removeTunable(mView);
         mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener);
@@ -159,11 +171,6 @@
     }
 
     /** */
-    public MediaHost getMediaHost() {
-        return mView.getMediaHost();
-    }
-
-    /** */
     public void setBrightnessMirror(BrightnessMirrorController brightnessMirrorController) {
         mBrightnessMirrorController = brightnessMirrorController;
         if (mBrightnessMirrorController != null) {
@@ -280,5 +287,10 @@
     public void setFooterPageIndicator(PageIndicator pageIndicator) {
         mView.setFooterPageIndicator(pageIndicator);
     }
+
+    /** */
+    public boolean isExpanded() {
+        return mView.isExpanded();
+    }
 }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
index a3daf0e..06bf9ac 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
@@ -48,7 +48,6 @@
         implements Dumpable{
     protected final QSTileHost mHost;
     private final QSCustomizerController mQsCustomizerController;
-    private final QSTileRevealController.Factory mQsTileRevealControllerFactory;
     private final MediaHost mMediaHost;
     private final MetricsLogger mMetricsLogger;
     private final UiEventLogger mUiEventLogger;
@@ -74,14 +73,12 @@
             };
 
     protected QSPanelControllerBase(T view, QSTileHost host,
-            QSCustomizerController qsCustomizerController,
-            QSTileRevealController.Factory qsTileRevealControllerFactory,
+            QSCustomizerController qsCustomizerController, MediaHost mediaHost,
             MetricsLogger metricsLogger, UiEventLogger uiEventLogger, DumpManager dumpManager) {
         super(view);
         mHost = host;
         mQsCustomizerController = qsCustomizerController;
-        mQsTileRevealControllerFactory = qsTileRevealControllerFactory;
-        mMediaHost = mView.getMediaHost();
+        mMediaHost = mediaHost;
         mMetricsLogger = metricsLogger;
         mUiEventLogger = uiEventLogger;
         mDumpManager = dumpManager;
@@ -89,10 +86,8 @@
 
     @Override
     protected void onViewAttached() {
-        QSPanel.QSTileLayout regularTileLayout = mView.createRegularTileLayout();
-        if (regularTileLayout instanceof PagedTileLayout) {
-            mQsTileRevealController = mQsTileRevealControllerFactory.create(
-                    (PagedTileLayout) regularTileLayout);
+        mQsTileRevealController = createTileRevealController();
+        if (mQsTileRevealController != null) {
             mQsTileRevealController.setExpansion(mRevealExpansion);
         }
 
@@ -119,6 +114,10 @@
         mDumpManager.unregisterDumpable(mView.getDumpableTag());
     }
 
+    protected QSTileRevealController createTileRevealController() {
+        return null;
+    }
+
     /** */
     public void setTiles() {
         setTiles(mHost.getTiles(), false);
@@ -126,9 +125,11 @@
 
     /** */
     public void setTiles(Collection<QSTile> tiles, boolean collapsedView) {
-        if (!collapsedView) {
+        // TODO(b/168904199): move this logic into QSPanelController.
+        if (!collapsedView && mQsTileRevealController != null) {
             mQsTileRevealController.updateRevealedTiles(tiles);
         }
+
         for (QSPanelControllerBase.TileRecord record : mRecords) {
             mView.removeTile(record);
             record.tile.removeCallback(record.callback);
@@ -192,7 +193,6 @@
                 .collect(Collectors.joining(","));
     }
 
-
     /** */
     public void setExpanded(boolean expanded) {
         mView.setExpanded(expanded);
@@ -234,7 +234,6 @@
     boolean switchTileLayout(boolean force) {
         if (mView.switchTileLayout(force, mRecords)) {
             setTiles();
-            mView.reSetLayoutListening();
             return true;
         }
         return false;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
index 270fcbf..4789239 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
@@ -15,6 +15,8 @@
  */
 package com.android.systemui.qs;
 
+import static com.android.systemui.qs.dagger.QSFragmentModule.QS_SECURITY_FOOTER_VIEW;
+
 import android.app.AlertDialog;
 import android.app.admin.DeviceAdminInfo;
 import android.app.admin.DevicePolicyEventLogger;
@@ -44,9 +46,10 @@
 import androidx.annotation.VisibleForTesting;
 
 import com.android.internal.util.FrameworkStatsLog;
-import com.android.systemui.Dependency;
 import com.android.systemui.FontSizeUtils;
 import com.android.systemui.R;
+import com.android.systemui.dagger.qualifiers.Background;
+import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.qs.dagger.QSScope;
 import com.android.systemui.settings.UserTracker;
@@ -54,6 +57,7 @@
 import com.android.systemui.statusbar.policy.SecurityController;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 
 @QSScope
 class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListener {
@@ -81,18 +85,19 @@
     private int mFooterIconId;
 
     @Inject
-    public QSSecurityFooter(QSPanel qsPanel, Context context, UserTracker userTracker) {
-        mRootView = LayoutInflater.from(context)
-                .inflate(R.layout.quick_settings_footer, qsPanel, false);
+    QSSecurityFooter(@Named(QS_SECURITY_FOOTER_VIEW) View rootView, Context context,
+            UserTracker userTracker, @Main Handler mainHandler, ActivityStarter activityStarter,
+            SecurityController securityController, @Background Looper bgLooper) {
+        mRootView = rootView;
         mRootView.setOnClickListener(this);
         mFooterText = mRootView.findViewById(R.id.footer_text);
         mFooterIcon = mRootView.findViewById(R.id.footer_icon);
         mFooterIconId = R.drawable.ic_info_outline;
         mContext = context;
-        mMainHandler = new Handler(Looper.myLooper());
-        mActivityStarter = Dependency.get(ActivityStarter.class);
-        mSecurityController = Dependency.get(SecurityController.class);
-        mHandler = new H(Dependency.get(Dependency.BG_LOOPER));
+        mMainHandler = mainHandler;
+        mActivityStarter = activityStarter;
+        mSecurityController = securityController;
+        mHandler = new H(bgLooper);
         mUserTracker = userTracker;
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java
index 9414d0e..3f93108 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java
@@ -22,7 +22,7 @@
     private static final long QS_REVEAL_TILES_DELAY = 500L;
 
     private final Context mContext;
-    private final QSPanel mQSPanel;
+    private final QSPanelController mQSPanelController;
     private final PagedTileLayout mPagedTileLayout;
     private final QSCustomizerController mQsCustomizerController;
     private final ArraySet<String> mTilesToReveal = new ArraySet<>();
@@ -32,17 +32,17 @@
         @Override
         public void run() {
             mPagedTileLayout.startTileReveal(mTilesToReveal, () -> {
-                if (mQSPanel.isExpanded()) {
+                if (mQSPanelController.isExpanded()) {
                     addTileSpecsToRevealed(mTilesToReveal);
                     mTilesToReveal.clear();
                 }
             });
         }
     };
-    QSTileRevealController(Context context, QSPanel qsPanel, PagedTileLayout pagedTileLayout,
-            QSCustomizerController qsCustomizerController) {
+    QSTileRevealController(Context context, QSPanelController qsPanelController,
+            PagedTileLayout pagedTileLayout, QSCustomizerController qsCustomizerController) {
         mContext = context;
-        mQSPanel = qsPanel;
+        mQSPanelController = qsPanelController;
         mPagedTileLayout = pagedTileLayout;
         mQsCustomizerController = qsCustomizerController;
     }
@@ -85,18 +85,17 @@
     @QSScope
     static class Factory {
         private final Context mContext;
-        private final QSPanel mQsPanel;
         private final QSCustomizerController mQsCustomizerController;
 
         @Inject
-        Factory(Context context, QSPanel qsPanel, QSCustomizerController qsCustomizerController) {
+        Factory(Context context, QSCustomizerController qsCustomizerController) {
             mContext = context;
-            mQsPanel = qsPanel;
             mQsCustomizerController = qsCustomizerController;
         }
 
-        QSTileRevealController create(PagedTileLayout pagedTileLayout) {
-            return new QSTileRevealController(mContext, mQsPanel, pagedTileLayout,
+        QSTileRevealController create(QSPanelController qsPanelController,
+                PagedTileLayout pagedTileLayout) {
+            return new QSTileRevealController(mContext, qsPanelController, pagedTileLayout,
                     mQsCustomizerController);
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index dde9a1f..06e8634 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -47,11 +47,10 @@
     public static final String NUM_QUICK_TILES = "sysui_qqs_count";
     private static final String TAG = "QuickQSPanel";
     // A default value so that we never return 0.
-    private static int sDefaultMaxTiles = 6;
+    public static final int DEFAULT_MAX_TILES = 6;
 
     private boolean mDisabledByPolicy;
     private int mMaxTiles;
-    protected QSPanel mFullPanel;
 
 
     @Inject
@@ -62,8 +61,8 @@
             @Named(QUICK_QS_PANEL) MediaHost mediaHost,
             UiEventLogger uiEventLogger) {
         super(context, attrs, qsLogger, mediaHost, uiEventLogger);
-        sDefaultMaxTiles = getResources().getInteger(R.integer.quick_qs_panel_max_columns);
-        mMaxTiles = sDefaultMaxTiles;
+        mMaxTiles = Math.min(DEFAULT_MAX_TILES,
+                getResources().getInteger(R.integer.quick_qs_panel_max_columns));
         applyBottomMargin((View) mRegularTileLayout);
     }
 
@@ -118,10 +117,6 @@
         return TAG;
     }
 
-    public void setQSPanelAndHeader(QSPanel fullPanel, View header) {
-        mFullPanel = fullPanel;
-    }
-
     @Override
     protected boolean shouldShowDetail() {
         return !mExpanded;
@@ -141,7 +136,7 @@
     }
 
     public void setMaxTiles(int maxTiles) {
-        mMaxTiles = maxTiles;
+        mMaxTiles = Math.min(maxTiles, DEFAULT_MAX_TILES);
     }
 
     @Override
@@ -167,7 +162,7 @@
             return Integer.parseInt(numTilesValue);
         } catch (NumberFormatException e) {
             // Couldn't read an int from the new setting value. Use default.
-            return sDefaultMaxTiles;
+            return DEFAULT_MAX_TILES;
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java
index fa6289f..7f50eef 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java
@@ -16,52 +16,57 @@
 
 package com.android.systemui.qs;
 
-import static com.android.systemui.qs.QuickQSPanel.NUM_QUICK_TILES;
-import static com.android.systemui.qs.QuickQSPanel.parseNumTiles;
+import static com.android.systemui.media.dagger.MediaModule.QUICK_QS_PANEL;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.UiEventLogger;
+import com.android.systemui.R;
 import com.android.systemui.dump.DumpManager;
+import com.android.systemui.media.MediaHost;
 import com.android.systemui.plugins.qs.QSTile;
 import com.android.systemui.qs.customize.QSCustomizerController;
 import com.android.systemui.qs.dagger.QSScope;
-import com.android.systemui.tuner.TunerService;
-import com.android.systemui.tuner.TunerService.Tunable;
 
 import java.util.ArrayList;
+import java.util.List;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 
 /** Controller for {@link QuickQSPanel}. */
 @QSScope
 public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> {
-    private final Tunable mNumTiles =
-            (key, newValue) -> setMaxTiles(parseNumTiles(newValue));
 
-    private final TunerService mTunerService;
+    private List<QSTile> mAllTiles = new ArrayList<>();
+
+    private final QSPanel.OnConfigurationChangedListener mOnConfigurationChangedListener =
+            newConfig -> {
+                int newMaxTiles = getResources().getInteger(R.integer.quick_qs_panel_max_columns);
+                if (newMaxTiles != mView.getNumQuickTiles()) {
+                    setMaxTiles(newMaxTiles);
+                }
+            };
 
     @Inject
-    QuickQSPanelController(QuickQSPanel view, TunerService tunerService, QSTileHost qsTileHost,
+    QuickQSPanelController(QuickQSPanel view, QSTileHost qsTileHost,
             QSCustomizerController qsCustomizerController,
-            QSTileRevealController.Factory qsTileRevealControllerFactory,
+            @Named(QUICK_QS_PANEL) MediaHost mediaHost,
             MetricsLogger metricsLogger, UiEventLogger uiEventLogger,
             DumpManager dumpManager) {
-        super(view, qsTileHost, qsCustomizerController, qsTileRevealControllerFactory,
-                metricsLogger, uiEventLogger, dumpManager);
-        mTunerService = tunerService;
+        super(view, qsTileHost, qsCustomizerController, mediaHost, metricsLogger, uiEventLogger,
+                dumpManager);
     }
 
     @Override
     protected void onViewAttached() {
         super.onViewAttached();
-        mTunerService.addTunable(mNumTiles, NUM_QUICK_TILES);
-
+        mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener);
     }
 
     @Override
     protected void onViewDetached() {
         super.onViewDetached();
-        mTunerService.removeTunable(mNumTiles);
+        mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener);
     }
 
     public boolean isListening() {
@@ -75,14 +80,14 @@
 
     @Override
     public void setTiles() {
-        ArrayList<QSTile> quickTiles = new ArrayList<>();
+        mAllTiles.clear();
         for (QSTile tile : mHost.getTiles()) {
-            quickTiles.add(tile);
-            if (quickTiles.size() == mView.getNumQuickTiles()) {
+            mAllTiles.add(tile);
+            if (mAllTiles.size() == QuickQSPanel.DEFAULT_MAX_TILES) {
                 break;
             }
         }
-        super.setTiles(quickTiles, true);
+        super.setTiles(mAllTiles.subList(0, mView.getNumQuickTiles()), true);
     }
 
     public int getNumQuickTiles() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index 5757602..09894e5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -137,10 +137,6 @@
 
         updateResources();
 
-        Rect tintArea = new Rect(0, 0, 0, 0);
-        // Set light text on the header icons because they will always be on a black background
-        applyDarkness(R.id.clock, tintArea, 0, DarkIconDispatcher.DEFAULT_ICON_TINT);
-
         mClockView = findViewById(R.id.clock);
         mSpace = findViewById(R.id.space);
 
@@ -153,6 +149,19 @@
         mBatteryRemainingIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE);
         mRingerModeTextView.setSelected(true);
         mNextAlarmTextView.setSelected(true);
+
+        int colorForeground = Utils.getColorAttrDefaultColor(getContext(),
+                android.R.attr.colorForeground);
+        float intensity = getColorIntensity(colorForeground);
+        int fillColor = mDualToneHandler.getSingleColor(intensity);
+
+        Rect tintArea = new Rect(0, 0, 0, 0);
+        mBatteryRemainingIcon.onDarkChanged(tintArea, intensity, fillColor);
+
+        // The quick settings status bar clock depends on the color of the background scrim and
+        // can be different from the status bar clock color.
+        mClockView.setTextColor(
+                Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor));
     }
 
     void onAttach(TintedIconManager iconManager) {
@@ -225,13 +234,6 @@
                 !Objects.equals(originalAlarmText, mNextAlarmTextView.getText());
     }
 
-    private void applyDarkness(int id, Rect tintArea, float intensity, int color) {
-        View v = findViewById(id);
-        if (v instanceof DarkReceiver) {
-            ((DarkReceiver) v).onDarkChanged(tintArea, intensity, color);
-        }
-    }
-
     @Override
     protected void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
@@ -439,18 +441,6 @@
         post(() -> setClickable(!mExpanded));
     }
 
-    public void setQSPanel(final QSPanel qsPanel) {
-        //host.setHeaderView(mExpandIndicator);
-        mHeaderQsPanel.setQSPanelAndHeader(qsPanel, this);
-
-        Rect tintArea = new Rect(0, 0, 0, 0);
-        int colorForeground = Utils.getColorAttrDefaultColor(getContext(),
-                android.R.attr.colorForeground);
-        float intensity = getColorIntensity(colorForeground);
-        int fillColor = mDualToneHandler.getSingleColor(intensity);
-        mBatteryRemainingIcon.onDarkChanged(tintArea, intensity, fillColor);
-    }
-
     public void setCallback(Callback qsPanelCallback) {
         mHeaderQsPanel.setCallback(qsPanelCallback);
     }
@@ -475,6 +465,7 @@
         return mLifecycle;
     }
 
+    /** */
     public void setContentMargins(int marginStart, int marginEnd) {
         mContentMarginStart = marginStart;
         mContentMarginEnd = marginEnd;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java
index 32904a2..5ee9df4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java
@@ -34,8 +34,10 @@
 import androidx.lifecycle.LifecycleOwner;
 import androidx.lifecycle.LifecycleRegistry;
 
+import com.android.internal.colorextraction.ColorExtractor;
 import com.android.internal.logging.UiEventLogger;
 import com.android.systemui.R;
+import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.demomode.DemoMode;
 import com.android.systemui.demomode.DemoModeController;
 import com.android.systemui.plugins.ActivityStarter;
@@ -99,6 +101,9 @@
     private boolean mMicCameraIndicatorsEnabled;
     private boolean mLocationIndicatorsEnabled;
     private boolean mPrivacyChipLogged;
+
+    private SysuiColorExtractor mColorExtractor;
+    private ColorExtractor.OnColorsChangedListener mOnColorsChangedListener;
     private int mRingerMode = AudioManager.RINGER_MODE_NORMAL;
 
     private final ZenModeController.Callback mZenModeControllerCallback = new Callback() {
@@ -216,7 +221,8 @@
             CommandQueue commandQueue, DemoModeController demoModeController,
             UserTracker userTracker, QuickQSPanelController quickQSPanelController,
             QSCarrierGroupController.Builder qsCarrierGroupControllerBuilder,
-            PrivacyLogger privacyLogger) {
+            PrivacyLogger privacyLogger,
+            SysuiColorExtractor colorExtractor) {
         super(view);
         mZenModeController = zenModeController;
         mNextAlarmController = nextAlarmController;
@@ -246,6 +252,12 @@
 
         mIconManager = new StatusBarIconController.TintedIconManager(mIconContainer, mCommandQueue);
         mDemoModeReceiver = new ClockDemoModeReceiver(mClockView);
+        mColorExtractor = colorExtractor;
+        mOnColorsChangedListener = (extractor, which) -> {
+            final boolean lightTheme = mColorExtractor.getNeutralColors().supportsDarkText();
+            mClockView.onColorsChanged(lightTheme);
+        };
+        mColorExtractor.addOnColorsChangedListener(mOnColorsChangedListener);
     }
 
     @Override
@@ -281,6 +293,7 @@
     protected void onViewDetached() {
         mRingerModeTracker.getRingerModeInternal().removeObservers(mLifecycleOwner);
         mClockView.setOnClickListener(null);
+        mColorExtractor.removeOnColorsChangedListener(mOnColorsChangedListener);
         mNextAlarmContainer.setOnClickListener(null);
         mRingerContainer.setOnClickListener(null);
         mPrivacyChip.setOnClickListener(null);
@@ -366,7 +379,6 @@
                 mZenModeController.getConsolidatedPolicy());
     }
 
-
     private static class ClockDemoModeReceiver implements DemoMode {
         private Clock mClockView;
 
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 9f4c58b..7ba51e5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java
@@ -125,7 +125,7 @@
         RecyclerView recyclerView = mView.getRecyclerView();
         recyclerView.setAdapter(mTileAdapter);
         mTileAdapter.getItemTouchHelper().attachToRecyclerView(recyclerView);
-        GridLayoutManager layout = new GridLayoutManager(getContext(), 3) {
+        GridLayoutManager layout = new GridLayoutManager(getContext(), TileAdapter.NUM_COLUMNS) {
             @Override
             public void onInitializeAccessibilityNodeInfoForItem(RecyclerView.Recycler recycler,
                     RecyclerView.State state, View host, AccessibilityNodeInfoCompat info) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
index dfc771b..036fa86 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
@@ -61,6 +61,7 @@
     private static final long DRAG_LENGTH = 100;
     private static final float DRAG_SCALE = 1.2f;
     public static final long MOVE_DURATION = 150;
+    public static final int NUM_COLUMNS = 4;
 
     private static final int TYPE_TILE = 0;
     private static final int TYPE_EDIT = 1;
@@ -600,7 +601,11 @@
         @Override
         public int getSpanSize(int position) {
             final int type = getItemViewType(position);
-            return type == TYPE_EDIT || type == TYPE_DIVIDER || type == TYPE_HEADER ? 3 : 1;
+            if (type == TYPE_EDIT || type == TYPE_DIVIDER || type == TYPE_HEADER) {
+                return NUM_COLUMNS;
+            } else {
+                return 1;
+            }
         }
     };
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
index 354b2c9..f3bf306 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.qs.dagger;
 
+import android.view.LayoutInflater;
 import android.view.View;
 
 import com.android.systemui.R;
@@ -31,6 +32,8 @@
 import com.android.systemui.qs.QuickStatusBarHeader;
 import com.android.systemui.qs.customize.QSCustomizer;
 
+import javax.inject.Named;
+
 import dagger.Binds;
 import dagger.Module;
 import dagger.Provides;
@@ -40,6 +43,8 @@
  */
 @Module
 public interface QSFragmentModule {
+    String QS_SECURITY_FOOTER_VIEW = "qs_security_footer";
+
     /** */
     @Provides
     @RootView
@@ -95,4 +100,12 @@
     static QSCustomizer providesQSCutomizer(@RootView View view) {
         return view.findViewById(R.id.qs_customize);
     }
-}
+
+    /** */
+    @Provides
+    @QSScope
+    @Named(QS_SECURITY_FOOTER_VIEW)
+    static View providesQSSecurityFooterView(LayoutInflater layoutInflater, QSPanel qsPanel) {
+        return layoutInflater.inflate(R.layout.quick_settings_footer, qsPanel, false);
+    }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
index 8e33496..24c0fd7 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
@@ -40,6 +40,7 @@
 import com.android.systemui.qs.tiles.LocationTile;
 import com.android.systemui.qs.tiles.NfcTile;
 import com.android.systemui.qs.tiles.NightDisplayTile;
+import com.android.systemui.qs.tiles.ReduceBrightColorsTile;
 import com.android.systemui.qs.tiles.RotationLockTile;
 import com.android.systemui.qs.tiles.ScreenRecordTile;
 import com.android.systemui.qs.tiles.UiModeNightTile;
@@ -78,6 +79,7 @@
     private final Provider<GarbageMonitor.MemoryTile> mMemoryTileProvider;
     private final Provider<UiModeNightTile> mUiModeNightTileProvider;
     private final Provider<ScreenRecordTile> mScreenRecordTileProvider;
+    private final Provider<ReduceBrightColorsTile> mReduceBrightColorsTileProvider;
 
     private final Lazy<QSHost> mQsHostLazy;
     private final Provider<CustomTile.Builder> mCustomTileBuilderProvider;
@@ -105,7 +107,8 @@
             Provider<NfcTile> nfcTileProvider,
             Provider<GarbageMonitor.MemoryTile> memoryTileProvider,
             Provider<UiModeNightTile> uiModeNightTileProvider,
-            Provider<ScreenRecordTile> screenRecordTileProvider) {
+            Provider<ScreenRecordTile> screenRecordTileProvider,
+            Provider<ReduceBrightColorsTile> reduceBrightColorsTileProvider) {
         mQsHostLazy = qsHostLazy;
         mCustomTileBuilderProvider = customTileBuilderProvider;
 
@@ -129,6 +132,7 @@
         mMemoryTileProvider = memoryTileProvider;
         mUiModeNightTileProvider = uiModeNightTileProvider;
         mScreenRecordTileProvider = screenRecordTileProvider;
+        mReduceBrightColorsTileProvider = reduceBrightColorsTileProvider;
     }
 
     public QSTile createTile(String tileSpec) {
@@ -180,6 +184,8 @@
                 return mUiModeNightTileProvider.get();
             case "screenrecord":
                 return mScreenRecordTileProvider.get();
+            case "reduce_brightness":
+                return mReduceBrightColorsTileProvider.get();
         }
 
         // Custom tiles
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
index 3995248..a6d9604 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
@@ -70,7 +70,7 @@
         super(host, backgroundLooper, mainHandler, metricsLogger, statusBarStateController,
                 activityStarter, qsLogger);
 
-        mSetting = new SecureSetting(secureSettings, mainHandler,
+        mSetting = new SecureSetting(secureSettings, mHandler,
                 Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, userTracker.getUserId()) {
             @Override
             protected void handleValueChanged(int value, boolean observedChange) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java
new file mode 100644
index 0000000..84c7611
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.tiles;
+
+import android.content.Intent;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
+import android.service.quicksettings.Tile;
+import android.text.TextUtils;
+import android.widget.Switch;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.systemui.R;
+import com.android.systemui.dagger.qualifiers.Background;
+import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.plugins.qs.QSTile;
+import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.qs.QSHost;
+import com.android.systemui.qs.SecureSetting;
+import com.android.systemui.qs.logging.QSLogger;
+import com.android.systemui.qs.tileimpl.QSTileImpl;
+import com.android.systemui.settings.UserTracker;
+import com.android.systemui.util.settings.SecureSettings;
+
+import javax.inject.Inject;
+
+/** Quick settings tile: Reduce Bright Colors **/
+public class ReduceBrightColorsTile extends QSTileImpl<QSTile.BooleanState> {
+
+    //TODO(b/170973645): get icon drawable
+    private final Icon mIcon = null;
+    private final SecureSetting mActivatedSetting;
+
+    @Inject
+    public ReduceBrightColorsTile(
+            QSHost host,
+            @Background Looper backgroundLooper,
+            @Main Handler mainHandler,
+            MetricsLogger metricsLogger,
+            StatusBarStateController statusBarStateController,
+            ActivityStarter activityStarter,
+            QSLogger qsLogger,
+            UserTracker userTracker,
+            SecureSettings secureSettings
+    ) {
+        super(host, backgroundLooper, mainHandler, metricsLogger, statusBarStateController,
+                activityStarter, qsLogger);
+
+        mActivatedSetting = new SecureSetting(secureSettings, mainHandler,
+                Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, userTracker.getUserId()) {
+            @Override
+            protected void handleValueChanged(int value, boolean observedChange) {
+                refreshState();
+            }
+        };
+    }
+    @Override
+    public boolean isAvailable() {
+        // TODO(b/170970675): Call into ColorDisplayService to get availability/config status
+        return true;
+    }
+
+    @Override
+    protected void handleDestroy() {
+        super.handleDestroy();
+        mActivatedSetting.setListening(false);
+    }
+
+    @Override
+    public BooleanState newTileState() {
+        return new BooleanState();
+    }
+
+    @Override
+    public void handleSetListening(boolean listening) {
+        super.handleSetListening(listening);
+        mActivatedSetting.setListening(listening);
+    }
+
+    @Override
+    protected void handleUserSwitch(int newUserId) {
+        mActivatedSetting.setUserId(newUserId);
+        refreshState();
+    }
+
+    @Override
+    public Intent getLongClickIntent() {
+        return new Intent(Settings.ACTION_REDUCE_BRIGHT_COLORS_SETTINGS);
+    }
+
+    @Override
+    protected void handleClick() {
+        mActivatedSetting.setValue(mState.value ? 0 : 1);
+    }
+
+    @Override
+    public CharSequence getTileLabel() {
+        return mContext.getString(R.string.quick_settings_reduce_bright_colors_label);
+    }
+
+    @Override
+    protected void handleUpdateState(BooleanState state, Object arg) {
+        state.value = mActivatedSetting.getValue() == 1;
+        state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
+        state.label = mContext.getString(R.string.quick_settings_reduce_bright_colors_label);
+        state.expandedAccessibilityClassName = Switch.class.getName();
+        state.contentDescription = state.label;
+
+        final int intensity = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+                Settings.Secure.REDUCE_BRIGHT_COLORS_LEVEL, 0, mActivatedSetting.getCurrentUser());
+        state.secondaryLabel = state.value ? mContext.getString(
+                R.string.quick_settings_reduce_bright_colors_secondary_label, intensity) : "";
+
+        state.contentDescription = TextUtils.isEmpty(state.secondaryLabel)
+                ? state.label
+                : TextUtils.concat(state.label, ", ", state.secondaryLabel);
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return 0;
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
index 07a5839..35874cd 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
@@ -154,7 +154,6 @@
     private SaveImageInBackgroundTask mSaveInBgTask;
 
     private Animator mScreenshotAnimation;
-    private Animator mDismissAnimation;
 
     private Runnable mOnCompleteRunnable;
     private boolean mInDarkMode;
@@ -168,7 +167,6 @@
                 case MESSAGE_CORNER_TIMEOUT:
                     mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_INTERACTION_TIMEOUT);
                     ScreenshotController.this.dismissScreenshot(false);
-                    mOnCompleteRunnable.run();
                     break;
                 default:
                     break;
@@ -279,30 +277,22 @@
                 rect -> takeScreenshotInternal(finisher, rect));
     }
 
-    boolean isDismissing() {
-        return (mDismissAnimation != null && mDismissAnimation.isRunning());
-    }
-
     /**
      * Clears current screenshot
      */
     void dismissScreenshot(boolean immediate) {
-        Log.v(TAG, "clearing screenshot");
+        // If we're already animating out, don't restart the animation
+        // (but do obey an immediate dismissal)
+        if (!immediate && mScreenshotView.isDismissing()) {
+            Log.v(TAG, "Already dismissing, ignoring duplicate command");
+            return;
+        }
+        Log.v(TAG, "Clearing screenshot");
         mScreenshotHandler.removeMessages(MESSAGE_CORNER_TIMEOUT);
-        mScreenshotView.getViewTreeObserver().removeOnComputeInternalInsetsListener(
-                mScreenshotView);
-        if (!immediate) {
-            mDismissAnimation = mScreenshotView.createScreenshotDismissAnimation();
-            mDismissAnimation.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    super.onAnimationEnd(animation);
-                    clearScreenshot();
-                }
-            });
-            mDismissAnimation.start();
+        if (immediate) {
+            resetScreenshotView();
         } else {
-            clearScreenshot();
+            mScreenshotView.animateDismissal();
         }
     }
 
@@ -373,6 +363,7 @@
         // Inflate the screenshot layout
         mScreenshotView = (ScreenshotView)
                 LayoutInflater.from(mContext).inflate(R.layout.global_screenshot, null);
+        mScreenshotView.init(mUiEventLogger, this::resetScreenshotView);
 
         // TODO(159460485): Remove this when focus is handled properly in the system
         mScreenshotView.setOnTouchListener((v, event) -> {
@@ -438,10 +429,10 @@
 
         if (mScreenshotView.isAttachedToWindow()) {
             // if we didn't already dismiss for another reason
-            if (mDismissAnimation == null || !mDismissAnimation.isRunning()) {
+            if (!mScreenshotView.isDismissing()) {
                 mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_REENTERED);
             }
-            dismissScreenshot(true);
+            mScreenshotView.reset();
         }
 
         mScreenBitmap = screenshot;
@@ -459,10 +450,6 @@
 
         onConfigChanged(mContext.getResources().getConfiguration());
 
-        if (mDismissAnimation != null && mDismissAnimation.isRunning()) {
-            mDismissAnimation.cancel();
-        }
-
         // The window is focusable by default
         setWindowFocusable(true);
 
@@ -474,7 +461,8 @@
             mScrollCaptureClient.request(DEFAULT_DISPLAY, (connection) ->
                     mScreenshotView.showScrollChip(() ->
                             runScrollCapture(connection,
-                                    () -> dismissScreenshot(true))));
+                                    () -> mScreenshotHandler.post(
+                                            () -> dismissScreenshot(false)))));
         }
     }
 
@@ -519,6 +507,7 @@
      */
     private void startAnimation(final Consumer<Uri> finisher, Rect screenRect, Insets screenInsets,
             boolean showFlash) {
+        mScreenshotHandler.removeMessages(MESSAGE_CORNER_TIMEOUT);
         mScreenshotHandler.post(() -> {
             if (!mScreenshotView.isAttachedToWindow()) {
                 mWindowManager.addView(mScreenshotView, mWindowLayoutParams);
@@ -531,8 +520,7 @@
                         mScreenshotView);
 
                 mScreenshotAnimation =
-                        mScreenshotView.createScreenshotDropInAnimation(screenRect, showFlash,
-                                this::onElementTapped);
+                        mScreenshotView.createScreenshotDropInAnimation(screenRect, showFlash);
 
                 saveScreenshotInWorkerThread(finisher,
                         new ScreenshotController.ActionsReadyListener() {
@@ -551,6 +539,14 @@
         });
     }
 
+    private void resetScreenshotView() {
+        if (mScreenshotView.isAttachedToWindow()) {
+            mWindowManager.removeView(mScreenshotView);
+        }
+        mScreenshotView.reset();
+        mOnCompleteRunnable.run();
+    }
+
     /**
      * Creates a new worker thread and saves the screenshot to the media store.
      */
@@ -590,7 +586,6 @@
                 SCREENSHOT_CORNER_DEFAULT_TIMEOUT_MILLIS,
                 AccessibilityManager.FLAG_CONTENT_CONTROLS);
 
-        mScreenshotHandler.removeMessages(MESSAGE_CORNER_TIMEOUT);
         mScreenshotHandler.sendMessageDelayed(
                 mScreenshotHandler.obtainMessage(MESSAGE_CORNER_TIMEOUT),
                 timeoutMs);
@@ -602,24 +597,16 @@
                         @Override
                         public void onAnimationEnd(Animator animation) {
                             super.onAnimationEnd(animation);
-                            mScreenshotView.setChipIntents(
-                                    imageData, event -> onElementTapped(event));
+                            mScreenshotView.setChipIntents(imageData);
                         }
                     });
                 } else {
-                    mScreenshotView.setChipIntents(
-                            imageData, this::onElementTapped);
+                    mScreenshotView.setChipIntents(imageData);
                 }
             });
         }
     }
 
-    private void onElementTapped(ScreenshotEvent event) {
-        mUiEventLogger.log(event);
-        dismissScreenshot(false);
-        mOnCompleteRunnable.run();
-    }
-
     /**
      * Logs success/failure of the screenshot saving task, and shows an error if it failed.
      */
@@ -633,20 +620,11 @@
         }
     }
 
-    private void clearScreenshot() {
-        if (mScreenshotView.isAttachedToWindow()) {
-            mWindowManager.removeView(mScreenshotView);
-        }
-
-        mScreenshotView.reset();
-    }
-
     private boolean isUserSetupComplete() {
         return Settings.Secure.getInt(mContext.getContentResolver(),
                 SETTINGS_SECURE_USER_SETUP_COMPLETE, 0) == 1;
     }
 
-
     /**
      * Updates the window focusability.  If the window is already showing, then it updates the
      * window immediately, otherwise the layout params will be applied when the window is next
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotEvent.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotEvent.java
index 74e0229..f1fb688 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotEvent.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotEvent.java
@@ -60,6 +60,8 @@
     SCREENSHOT_INTERACTION_TIMEOUT(310),
     @UiEvent(doc = "screenshot explicitly dismissed")
     SCREENSHOT_EXPLICIT_DISMISSAL(311),
+    @UiEvent(doc = "screenshot swiped to dismiss")
+    SCREENSHOT_SWIPE_DISMISSED(656),
     @UiEvent(doc = "screenshot reentered for new screenshot")
     SCREENSHOT_REENTERED(640);
 
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
index 3383f80..b020275 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
@@ -47,7 +47,9 @@
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.util.MathUtils;
+import android.view.GestureDetector;
 import android.view.LayoutInflater;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewOutlineProvider;
 import android.view.ViewTreeObserver;
@@ -60,6 +62,7 @@
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
+import com.android.internal.logging.UiEventLogger;
 import com.android.systemui.R;
 import com.android.systemui.shared.system.QuickStepContract;
 
@@ -115,6 +118,10 @@
     private ScreenshotActionChip mEditChip;
     private ScreenshotActionChip mScrollChip;
 
+    private UiEventLogger mUiEventLogger;
+    private Runnable mOnDismissRunnable;
+    private Animator mDismissAnimation;
+
     private final ArrayList<ScreenshotActionChip> mSmartChips = new ArrayList<>();
     private PendingInteraction mPendingInteraction;
 
@@ -161,7 +168,7 @@
     public void showScrollChip(Runnable onClick) {
         mScrollChip.setVisibility(VISIBLE);
         mScrollChip.setOnClickListener((v) ->
-                onClick.run()
+                        onClick.run()
                 // TODO Logging, store event consumer to a field
                 //onElementTapped.accept(ScreenshotEvent.SCREENSHOT_SCROLL_TAPPED);
         );
@@ -248,6 +255,17 @@
         requestFocus();
     }
 
+    /**
+     * Set up the logger and callback on dismissal.
+     *
+     * Note: must be called before any other (non-constructor) method or null pointer exceptions
+     * may occur.
+     */
+    void init(UiEventLogger uiEventLogger, Runnable onDismissRunnable) {
+        mUiEventLogger = uiEventLogger;
+        mOnDismissRunnable = onDismissRunnable;
+    }
+
     void takePartialScreenshot(Consumer<Rect> onPartialScreenshotSelected) {
         mScreenshotSelectorView.setOnScreenshotSelected(onPartialScreenshotSelected);
         mScreenshotSelectorView.setVisibility(View.VISIBLE);
@@ -260,8 +278,7 @@
         mScreenshotPreview.setVisibility(View.INVISIBLE);
     }
 
-    AnimatorSet createScreenshotDropInAnimation(Rect bounds, boolean showFlash,
-            Consumer<ScreenshotEvent> onElementTapped) {
+    AnimatorSet createScreenshotDropInAnimation(Rect bounds, boolean showFlash) {
         mScreenshotPreview.setLayerType(View.LAYER_TYPE_HARDWARE, null);
         mScreenshotPreview.buildLayer();
 
@@ -362,8 +379,10 @@
             @Override
             public void onAnimationEnd(Animator animation) {
                 super.onAnimationEnd(animation);
-                mDismissButton.setOnClickListener(view ->
-                        onElementTapped.accept(ScreenshotEvent.SCREENSHOT_EXPLICIT_DISMISSAL));
+                mDismissButton.setOnClickListener(view -> {
+                    mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_EXPLICIT_DISMISSAL);
+                    animateDismissal();
+                });
                 mDismissButton.setAlpha(1);
                 float dismissOffset = mDismissButton.getWidth() / 2f;
                 float finalDismissX = mDirectionLTR
@@ -377,6 +396,7 @@
                 mScreenshotPreview.setX(finalPos.x - bounds.width() * cornerScale / 2f);
                 mScreenshotPreview.setY(finalPos.y - bounds.height() * cornerScale / 2f);
                 requestLayout();
+                mScreenshotPreview.setOnTouchListener(new SwipeDismissHandler());
                 createScreenshotActionsShadeAnimation().start();
             }
         });
@@ -460,19 +480,25 @@
         return animator;
     }
 
-    void setChipIntents(ScreenshotController.SavedImageData imageData,
-            Consumer<ScreenshotEvent> onElementTapped) {
+    void setChipIntents(ScreenshotController.SavedImageData imageData) {
         mShareChip.setPendingIntent(imageData.shareAction.actionIntent,
-                () -> onElementTapped.accept(ScreenshotEvent.SCREENSHOT_SHARE_TAPPED));
+                () -> {
+                    mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SHARE_TAPPED);
+                    animateDismissal();
+                });
         mEditChip.setPendingIntent(imageData.editAction.actionIntent,
-                () -> onElementTapped.accept(ScreenshotEvent.SCREENSHOT_EDIT_TAPPED));
+                () -> {
+                    mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_EDIT_TAPPED);
+                    animateDismissal();
+                });
         mScreenshotPreview.setOnClickListener(v -> {
             try {
                 imageData.editAction.actionIntent.send();
             } catch (PendingIntent.CanceledException e) {
                 Log.e(TAG, "Intent cancelled", e);
             }
-            onElementTapped.accept(ScreenshotEvent.SCREENSHOT_PREVIEW_TAPPED);
+            mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_PREVIEW_TAPPED);
+            animateDismissal();
         });
 
         if (mPendingInteraction != null) {
@@ -496,16 +522,83 @@
                 actionChip.setText(smartAction.title);
                 actionChip.setIcon(smartAction.getIcon(), false);
                 actionChip.setPendingIntent(smartAction.actionIntent,
-                        () -> onElementTapped.accept(
-                                ScreenshotEvent.SCREENSHOT_SMART_ACTION_TAPPED));
+                        () -> {
+                            mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SMART_ACTION_TAPPED);
+                            animateDismissal();
+                        });
                 mActionsView.addView(actionChip);
                 mSmartChips.add(actionChip);
             }
         }
     }
 
+    boolean isDismissing() {
+        return (mDismissAnimation != null && mDismissAnimation.isRunning());
+    }
 
-    AnimatorSet createScreenshotDismissAnimation() {
+    void animateDismissal() {
+        animateDismissal(createScreenshotDismissAnimation());
+    }
+
+    private void animateDismissal(Animator dismissAnimation) {
+        getViewTreeObserver().removeOnComputeInternalInsetsListener(this);
+        mDismissAnimation = dismissAnimation;
+        mDismissAnimation.addListener(new AnimatorListenerAdapter() {
+            private boolean mCancelled = false;
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+                super.onAnimationCancel(animation);
+                mCancelled = true;
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                super.onAnimationEnd(animation);
+                if (!mCancelled) {
+                    mOnDismissRunnable.run();
+                }
+            }
+        });
+        mDismissAnimation.start();
+    }
+
+    void reset() {
+        if (mDismissAnimation != null && mDismissAnimation.isRunning()) {
+            mDismissAnimation.cancel();
+        }
+        // Make sure we clean up the view tree observer
+        getViewTreeObserver().removeOnComputeInternalInsetsListener(this);
+        // Clear any references to the bitmap
+        mScreenshotPreview.setImageDrawable(null);
+        mActionsContainerBackground.setVisibility(View.GONE);
+        mActionsContainer.setVisibility(View.GONE);
+        mBackgroundProtection.setAlpha(0f);
+        mDismissButton.setVisibility(View.GONE);
+        mScreenshotPreview.setVisibility(View.GONE);
+        mScreenshotPreview.setLayerType(View.LAYER_TYPE_NONE, null);
+        mScreenshotPreview.setTranslationX(0);
+        mScreenshotPreview.setTranslationY(0);
+        mScreenshotPreview.setContentDescription(
+                mContext.getResources().getString(R.string.screenshot_preview_description));
+        mScreenshotPreview.setOnClickListener(null);
+        mShareChip.setOnClickListener(null);
+        mEditChip.setOnClickListener(null);
+        mShareChip.setIsPending(false);
+        mEditChip.setIsPending(false);
+        mPendingInteraction = null;
+        for (ScreenshotActionChip chip : mSmartChips) {
+            mActionsView.removeView(chip);
+        }
+        mSmartChips.clear();
+        setAlpha(1);
+        mDismissButton.setTranslationY(0);
+        mActionsContainer.setTranslationY(0);
+        mActionsContainerBackground.setTranslationY(0);
+        mScreenshotSelectorView.stop();
+    }
+
+    private AnimatorSet createScreenshotDismissAnimation() {
         ValueAnimator alphaAnim = ValueAnimator.ofFloat(0, 1);
         alphaAnim.setStartDelay(SCREENSHOT_DISMISS_ALPHA_OFFSET_MS);
         alphaAnim.setDuration(SCREENSHOT_DISMISS_ALPHA_DURATION_MS);
@@ -532,35 +625,6 @@
         return animSet;
     }
 
-    void reset() {
-        // Clear any references to the bitmap
-        mScreenshotPreview.setImageDrawable(null);
-        mActionsContainerBackground.setVisibility(View.GONE);
-        mActionsContainer.setVisibility(View.GONE);
-        mBackgroundProtection.setAlpha(0f);
-        mDismissButton.setVisibility(View.GONE);
-        mScreenshotPreview.setVisibility(View.GONE);
-        mScreenshotPreview.setLayerType(View.LAYER_TYPE_NONE, null);
-        mScreenshotPreview.setContentDescription(
-                mContext.getResources().getString(R.string.screenshot_preview_description));
-        mScreenshotPreview.setOnClickListener(null);
-        mShareChip.setOnClickListener(null);
-        mEditChip.setOnClickListener(null);
-        mShareChip.setIsPending(false);
-        mEditChip.setIsPending(false);
-        mPendingInteraction = null;
-        for (ScreenshotActionChip chip : mSmartChips) {
-            mActionsView.removeView(chip);
-        }
-        mSmartChips.clear();
-        setAlpha(1);
-        mDismissButton.setTranslationY(0);
-        mActionsContainer.setTranslationY(0);
-        mActionsContainerBackground.setTranslationY(0);
-        mScreenshotPreview.setTranslationY(0);
-        mScreenshotSelectorView.stop();
-    }
-
     /**
      * Create a drawable using the size of the bitmap and insets as the fractional inset parameters.
      */
@@ -594,4 +658,113 @@
         }
     }
 
+    class SwipeDismissHandler implements OnTouchListener {
+
+        // if distance moved on ACTION_UP is less than this, register a click
+        // otherwise, run return animator
+        private static final float CLICK_MOVEMENT_THRESHOLD_DP = 1;
+        // distance needed to register a dismissal
+        private static final float DISMISS_DISTANCE_THRESHOLD_DP = 30;
+
+        private final GestureDetector mGestureDetector;
+        private final float mDismissStartX;
+
+        private float mStartX;
+        private float mStartY;
+        private float mTranslationX = 0;
+
+        SwipeDismissHandler() {
+            GestureDetector.OnGestureListener gestureListener = new SwipeDismissGestureListener();
+            mGestureDetector = new GestureDetector(mContext, gestureListener);
+            mDismissStartX = mDismissButton.getX();
+        }
+
+        @Override
+        public boolean onTouch(View v, MotionEvent event) {
+            if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+                mStartX = event.getRawX();
+                mStartY = event.getRawY();
+            } else if (event.getActionMasked() == MotionEvent.ACTION_UP) {
+                if (isPastDismissThreshold()
+                        && (mDismissAnimation == null || !mDismissAnimation.isRunning())) {
+                    mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SWIPE_DISMISSED);
+                    animateDismissal(createSwipeDismissAnimation());
+                    return true;
+                } else if (MathUtils.dist(mStartX, mStartY, event.getRawX(), event.getRawY())
+                        > dpToPx(CLICK_MOVEMENT_THRESHOLD_DP)) {
+                    // if we've moved a non-negligible distance (but not past the threshold),
+                    // start the return animation
+                    if ((mDismissAnimation == null || !mDismissAnimation.isRunning())) {
+                        createSwipeReturnAnimation().start();
+                    }
+                    return true;
+                }
+            }
+            return mGestureDetector.onTouchEvent(event);
+        }
+
+        class SwipeDismissGestureListener extends GestureDetector.SimpleOnGestureListener {
+
+            @Override
+            public boolean onScroll(
+                    MotionEvent ev1, MotionEvent ev2, float distanceX, float distanceY) {
+                mTranslationX = ev2.getRawX() - ev1.getRawX();
+                mScreenshotPreview.setTranslationX(mTranslationX);
+                mDismissButton.setX(mDismissStartX + mTranslationX);
+                return true;
+            }
+        }
+
+        private boolean isPastDismissThreshold() {
+            if (mDirectionLTR) {
+                return mTranslationX <= -1 * dpToPx(DISMISS_DISTANCE_THRESHOLD_DP);
+            } else {
+                return mTranslationX >= dpToPx(DISMISS_DISTANCE_THRESHOLD_DP);
+            }
+        }
+
+        private ValueAnimator createSwipeDismissAnimation() {
+            ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
+            float startX = mTranslationX;
+            float finalX = mDirectionLTR
+                    ? -1 * (mDismissStartX + mDismissButton.getWidth())
+                    : mDisplayMetrics.widthPixels;
+
+            anim.addUpdateListener(animation -> {
+                float translation = MathUtils.lerp(startX, finalX, animation.getAnimatedFraction());
+                mScreenshotPreview.setTranslationX(translation);
+                mDismissButton.setX(mDismissStartX + translation);
+
+                float yDelta = MathUtils.lerp(0, mDismissDeltaY, animation.getAnimatedFraction());
+
+                mActionsContainer.setTranslationY(yDelta);
+                mActionsContainerBackground.setTranslationY(yDelta);
+
+                setAlpha(1 - animation.getAnimatedFraction());
+            });
+            anim.setDuration(400);
+
+            return anim;
+        }
+
+        private ValueAnimator createSwipeReturnAnimation() {
+            ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
+            float startX = mTranslationX;
+            float finalX = 0;
+            mTranslationX = 0;
+
+            anim.addUpdateListener(animation -> {
+                float translation = MathUtils.lerp(
+                        startX, finalX, animation.getAnimatedFraction());
+                mScreenshotPreview.setTranslationX(translation);
+                mDismissButton.setX(mDismissStartX + translation);
+            });
+
+            return anim;
+        }
+
+        private float dpToPx(float dp) {
+            return dp * mDisplayMetrics.densityDpi / (float) DisplayMetrics.DENSITY_DEFAULT;
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java
index 800d679..47b4a50 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java
@@ -99,7 +99,7 @@
                             mPicture = stackBelow(mPicture, result.image, result.captured.width(),
                                     result.captured.height());
                         }
-                        if (emptyFrame || mFrameCount > MAX_PAGES
+                        if (emptyFrame || mFrameCount >= MAX_PAGES
                                 || requestRect.bottom > MAX_HEIGHT) {
                             Uri uri = null;
                             if (mPicture != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
index 4e22833..5f35e60 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
@@ -144,7 +144,7 @@
 
     @Override
     public boolean onUnbind(Intent intent) {
-        if (mScreenshot != null && !mScreenshot.isDismissing()) {
+        if (mScreenshot != null) {
             mScreenshot.dismissScreenshot(true);
         }
         unregisterReceiver(mBroadcastReceiver);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
index f9d2d31..7f31fdd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
@@ -22,6 +22,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.SuppressLint;
+import android.app.NotificationChannel;
 import android.app.NotificationManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -159,6 +160,19 @@
     }
 
     @Override
+    public void onNotificationChannelModified(
+            String pkgName, UserHandle user, NotificationChannel channel, int modificationType) {
+        if (DEBUG) Log.d(TAG, "onNotificationChannelModified");
+        if (!onPluginNotificationChannelModified(pkgName, user, channel, modificationType)) {
+            mMainHandler.post(() -> {
+                for (NotificationHandler handler : mNotificationHandlers) {
+                    handler.onNotificationChannelModified(pkgName, user, channel, modificationType);
+                }
+            });
+        }
+    }
+
+    @Override
     public void onSilentStatusBarIconsVisibilityChanged(boolean hideSilentStatusIcons) {
         for (NotificationSettingsListener listener : mSettingsListeners) {
             listener.onStatusBarIconsBehaviorChanged(hideSilentStatusIcons);
@@ -229,6 +243,14 @@
         void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap, int reason);
         void onNotificationRankingUpdate(RankingMap rankingMap);
 
+        /** Called after a notification channel is modified. */
+        default void onNotificationChannelModified(
+                String pkgName,
+                UserHandle user,
+                NotificationChannel channel,
+                int modificationType) {
+        }
+
         /**
          * Called after the listener has connected to NoMan and posted any current notifications.
          */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coalescer/GroupCoalescer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coalescer/GroupCoalescer.java
index 1710daa..09ae7eb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coalescer/GroupCoalescer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coalescer/GroupCoalescer.java
@@ -19,6 +19,8 @@
 import static java.util.Objects.requireNonNull;
 
 import android.annotation.MainThread;
+import android.app.NotificationChannel;
+import android.os.UserHandle;
 import android.service.notification.NotificationListenerService.Ranking;
 import android.service.notification.NotificationListenerService.RankingMap;
 import android.service.notification.StatusBarNotification;
@@ -158,6 +160,15 @@
         public void onNotificationsInitialized() {
             mHandler.onNotificationsInitialized();
         }
+
+        @Override
+        public void onNotificationChannelModified(
+                String pkgName,
+                UserHandle user,
+                NotificationChannel channel,
+                int modificationType) {
+            mHandler.onNotificationChannelModified(pkgName, user, channel, modificationType);
+        }
     };
 
     private void maybeEmitBatch(StatusBarNotification sbn) {
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 2253b2b..3e23a93 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
@@ -1163,9 +1163,7 @@
      */
     @Nullable
     public NotificationMenuRowPlugin createMenu() {
-        final boolean removeShelf = Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.SHOW_NEW_NOTIF_DISMISS, 0 /* show shelf by default */) == 1;
-        if (mMenuRow == null || removeShelf) {
+        if (mMenuRow == null) {
             return null;
         }
         if (mMenuRow.getMenuView() == null) {
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 65a72cc..447fa43 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
@@ -294,6 +294,11 @@
         } else {
             mMenuContainer = new FrameLayout(mContext);
         }
+        final boolean newFlowHideShelf = Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.SHOW_NEW_NOTIF_DISMISS, 0) == 1;
+        if (newFlowHideShelf) {
+            return;
+        }
         List<MenuItem> menuItems = mOnLeft ? mLeftMenuItems : mRightMenuItems;
         for (int i = 0; i < menuItems.size(); i++) {
             addMenuView(menuItems.get(i), mMenuContainer);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index 7698133..7cee365 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -48,6 +48,7 @@
 import android.widget.FrameLayout;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.colorextraction.ColorExtractor;
 import com.android.internal.jank.InteractionJankMonitor;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.UiEvent;
@@ -177,6 +178,8 @@
     private final NotificationListContainerImpl mNotificationListContainer =
             new NotificationListContainerImpl();
 
+    private ColorExtractor.OnColorsChangedListener mOnColorsChangedListener;
+
     @VisibleForTesting
     final View.OnAttachStateChangeListener mOnAttachStateChangeListener =
             new View.OnAttachStateChangeListener() {
@@ -703,10 +706,11 @@
                 Settings.Secure.NOTIFICATION_DISMISS_RTL,
                 Settings.Secure.NOTIFICATION_HISTORY_ENABLED);
 
-        mColorExtractor.addOnColorsChangedListener((colorExtractor, which) -> {
+        mOnColorsChangedListener = (colorExtractor, which) -> {
             final boolean useDarkText = mColorExtractor.getNeutralColors().supportsDarkText();
             mView.updateDecorViews(useDarkText);
-        });
+        };
+        mColorExtractor.addOnColorsChangedListener(mOnColorsChangedListener);
 
         mKeyguardMediaController.setVisibilityChangedListener(visible -> {
             mView.setKeyguardMediaControllorVisible(visible);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
index 3622f1c..e40c262 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
@@ -53,6 +53,7 @@
     public static final String WORK = "work";
     public static final String NIGHT = "night";
     public static final String CAST = "cast";
+    public static final String BRIGHTNESS = "reduce_brightness";
     static final String SETTING_SEPARATOR = ":";
 
     private UserHandle mCurrentUser;
@@ -124,6 +125,9 @@
             mCastController.addCallback(mCastCallback);
         }
 
+        // TODO(b/170970675): Set a listener/controller and callback for Reduce Bright Colors
+        // state changes. Call into ColorDisplayService to get availability/config status
+
         int settingsN = mAutoAddSettingList.size();
         for (int i = 0; i < settingsN; i++) {
             if (!mAutoTracker.isAdded(mAutoAddSettingList.get(i).mSpec)) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index 2767b7e..80cb289 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -39,7 +39,6 @@
 import com.android.keyguard.ViewMediatorCallback;
 import com.android.keyguard.dagger.KeyguardBouncerComponent;
 import com.android.systemui.DejankUtils;
-import com.android.systemui.biometrics.AuthController;
 import com.android.systemui.dagger.qualifiers.RootView;
 import com.android.systemui.keyguard.DismissCallbackRegistry;
 import com.android.systemui.plugins.FalsingManager;
@@ -70,7 +69,6 @@
     private final DismissCallbackRegistry mDismissCallbackRegistry;
     private final Handler mHandler;
     private final List<BouncerExpansionCallback> mExpansionCallbacks = new ArrayList<>();
-    private final AuthController mAuthController;
     private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
     private final KeyguardStateController mKeyguardStateController;
     private final KeyguardSecurityModel mKeyguardSecurityModel;
@@ -104,7 +102,6 @@
             ViewGroup container,
             DismissCallbackRegistry dismissCallbackRegistry, FalsingManager falsingManager,
             BouncerExpansionCallback expansionCallback,
-            AuthController authController,
             KeyguardStateController keyguardStateController,
             KeyguardUpdateMonitor keyguardUpdateMonitor,
             KeyguardBypassController keyguardBypassController, Handler handler,
@@ -123,8 +120,6 @@
         mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback);
         mKeyguardBypassController = keyguardBypassController;
         mExpansionCallbacks.add(expansionCallback);
-        mExpansionCallbacks.add(authController);
-        mAuthController = authController;
     }
 
     public void show(boolean resetSecuritySelection) {
@@ -297,11 +292,6 @@
         mIsScrimmed = false;
         mFalsingManager.onBouncerHidden();
         mCallback.onBouncerVisiblityChanged(false /* shown */);
-        // TODO(b/165257355): `mAuthController.onFullyHidden` should be `dispatchFullyHidden()`
-        // But, it is causing the UDFPS icon to disappear after SystemUI restarts. I guess the
-        // ExpansionCallback from StatusBarKeyguardViewManager can't handle the call to
-        // onFullyHidden after a restart.
-        mAuthController.onFullyHidden();
         cancelShowRunnable();
         if (mKeyguardViewController != null) {
             mKeyguardViewController.cancelDismissAction();
@@ -552,7 +542,6 @@
         private final ViewMediatorCallback mCallback;
         private final DismissCallbackRegistry mDismissCallbackRegistry;
         private final FalsingManager mFalsingManager;
-        private final AuthController mAuthController;
         private final KeyguardStateController mKeyguardStateController;
         private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
         private final KeyguardBypassController mKeyguardBypassController;
@@ -563,7 +552,6 @@
         @Inject
         public Factory(Context context, ViewMediatorCallback callback,
                 DismissCallbackRegistry dismissCallbackRegistry, FalsingManager falsingManager,
-                AuthController authController,
                 KeyguardStateController keyguardStateController,
                 KeyguardUpdateMonitor keyguardUpdateMonitor,
                 KeyguardBypassController keyguardBypassController, Handler handler,
@@ -573,7 +561,6 @@
             mCallback = callback;
             mDismissCallbackRegistry = dismissCallbackRegistry;
             mFalsingManager = falsingManager;
-            mAuthController = authController;
             mKeyguardStateController = keyguardStateController;
             mKeyguardUpdateMonitor = keyguardUpdateMonitor;
             mKeyguardBypassController = keyguardBypassController;
@@ -586,7 +573,7 @@
                 BouncerExpansionCallback expansionCallback) {
             return new KeyguardBouncer(mContext, mCallback, container,
                     mDismissCallbackRegistry, mFalsingManager, expansionCallback,
-                    mAuthController, mKeyguardStateController, mKeyguardUpdateMonitor,
+                    mKeyguardStateController, mKeyguardUpdateMonitor,
                     mKeyguardBypassController, mHandler, mKeyguardSecurityModel,
                     mKeyguardBouncerComponentFactory);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationListenerWithPlugins.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationListenerWithPlugins.java
index 9e561d1..4651e8446 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationListenerWithPlugins.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationListenerWithPlugins.java
@@ -14,9 +14,11 @@
 
 package com.android.systemui.statusbar.phone;
 
+import android.app.NotificationChannel;
 import android.content.ComponentName;
 import android.content.Context;
 import android.os.RemoteException;
+import android.os.UserHandle;
 import android.service.notification.NotificationListenerService;
 import android.service.notification.StatusBarNotification;
 
@@ -78,7 +80,7 @@
 
     /**
      * Called when listener receives a onNotificationPosted.
-     * Returns true to indicate this callback should be skipped.
+     * Returns true if there's a plugin determining to skip the default callbacks.
      */
     public boolean onPluginNotificationPosted(StatusBarNotification sbn,
             final RankingMap rankingMap) {
@@ -92,7 +94,7 @@
 
     /**
      * Called when listener receives a onNotificationRemoved.
-     * Returns true to indicate this callback should be skipped.
+     * Returns true if there's a plugin determining to skip the default callbacks.
      */
     public boolean onPluginNotificationRemoved(StatusBarNotification sbn,
             final RankingMap rankingMap) {
@@ -104,6 +106,20 @@
         return false;
     }
 
+    /**
+     * Called when listener receives a onNotificationChannelModified.
+     * Returns true if there's a plugin determining to skip the default callbacks.
+     */
+    public boolean onPluginNotificationChannelModified(
+            String pkgName, UserHandle user, NotificationChannel channel, int modificationType) {
+        for (NotificationListenerController plugin : mPlugins) {
+            if (plugin.onNotificationChannelModified(pkgName, user, channel, modificationType)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     public RankingMap onPluginRankingUpdate(RankingMap rankingMap) {
         return getCurrentRanking();
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index 7c41bcd..c0a5ffa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -66,6 +66,7 @@
         }
     };
     private DarkReceiver mBattery;
+    private DarkReceiver mClock;
     private int mRotationOrientation = -1;
     @Nullable
     private View mCenterIconSpace;
@@ -99,6 +100,7 @@
     @Override
     public void onFinishInflate() {
         mBattery = findViewById(R.id.battery);
+        mClock = findViewById(R.id.clock);
         mCutoutSpace = findViewById(R.id.cutout_space_view);
         mCenterIconSpace = findViewById(R.id.centered_icon_area);
 
@@ -110,6 +112,7 @@
         super.onAttachedToWindow();
         // Always have Battery meters in the status bar observe the dark/light modes.
         Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mBattery);
+        Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mClock);
         if (updateOrientationAndCutout()) {
             updateLayoutForCutout();
         }
@@ -119,6 +122,7 @@
     protected void onDetachedFromWindow() {
         super.onDetachedFromWindow();
         Dependency.get(DarkIconDispatcher.class).removeDarkReceiver(mBattery);
+        Dependency.get(DarkIconDispatcher.class).removeDarkReceiver(mClock);
         mDisplayCutout = null;
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 9e2e57e..f9dfd7a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -117,6 +117,7 @@
 
         @Override
         public void onStartingToShow() {
+            updateStates();
             updateLockIcon();
         }
 
@@ -164,6 +165,7 @@
     protected boolean mLastShowing;
     protected boolean mLastOccluded;
     private boolean mLastBouncerShowing;
+    private boolean mLastBouncerIsOrWillBeShowing;
     private boolean mLastBouncerDismissible;
     protected boolean mLastRemoteInputActive;
     private boolean mLastDozing;
@@ -811,6 +813,7 @@
         boolean showing = mShowing;
         boolean occluded = mOccluded;
         boolean bouncerShowing = mBouncer.isShowing();
+        boolean bouncerIsOrWillBeShowing = bouncerIsOrWillBeShowing();
         boolean bouncerDismissible = !mBouncer.isFullscreenBouncer();
         boolean remoteInputActive = mRemoteInputActive;
 
@@ -839,8 +842,8 @@
         if ((showing && !occluded) != (mLastShowing && !mLastOccluded) || mFirstUpdate) {
             mKeyguardUpdateManager.onKeyguardVisibilityChanged(showing && !occluded);
         }
-        if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
-            mKeyguardUpdateManager.sendKeyguardBouncerChanged(bouncerShowing);
+        if (bouncerIsOrWillBeShowing != mLastBouncerIsOrWillBeShowing || mFirstUpdate) {
+            mKeyguardUpdateManager.sendKeyguardBouncerChanged(bouncerIsOrWillBeShowing);
         }
 
         mFirstUpdate = false;
@@ -848,6 +851,7 @@
         mLastGlobalActionsVisible = mGlobalActionsVisible;
         mLastOccluded = occluded;
         mLastBouncerShowing = bouncerShowing;
+        mLastBouncerIsOrWillBeShowing = bouncerIsOrWillBeShowing;
         mLastBouncerDismissible = bouncerDismissible;
         mLastRemoteInputActive = remoteInputActive;
         mLastDozing = mDozing;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
index ef35a3c..fbbf362 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.statusbar.policy;
 
+import android.annotation.ColorInt;
 import android.app.StatusBarManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -35,6 +36,7 @@
 import android.text.style.CharacterStyle;
 import android.text.style.RelativeSizeSpan;
 import android.util.AttributeSet;
+import android.view.ContextThemeWrapper;
 import android.view.Display;
 import android.view.View;
 import android.widget.TextView;
@@ -96,7 +98,6 @@
     private static final int AM_PM_STYLE_GONE    = 2;
 
     private final int mAmPmStyle;
-    private final boolean mShowDark;
     private boolean mShowSeconds;
     private Handler mSecondsHandler;
 
@@ -126,7 +127,6 @@
                 0, 0);
         try {
             mAmPmStyle = a.getInt(R.styleable.Clock_amPmStyle, AM_PM_STYLE_GONE);
-            mShowDark = a.getBoolean(R.styleable.Clock_showDark, true);
             mNonAdaptedColor = getCurrentTextColor();
         } finally {
             a.recycle();
@@ -196,9 +196,6 @@
             Dependency.get(TunerService.class).addTunable(this, CLOCK_SECONDS,
                     StatusBarIconController.ICON_HIDE_LIST);
             mCommandQueue.addCallback(this);
-            if (mShowDark) {
-                Dependency.get(DarkIconDispatcher.class).addDarkReceiver(this);
-            }
             mCurrentUserTracker.startTracking();
             mCurrentUserId = mCurrentUserTracker.getCurrentUserId();
         }
@@ -229,9 +226,6 @@
             mAttached = false;
             Dependency.get(TunerService.class).removeTunable(this);
             mCommandQueue.removeCallback(this);
-            if (mShowDark) {
-                Dependency.get(DarkIconDispatcher.class).removeDarkReceiver(this);
-            }
             mCurrentUserTracker.stopTracking();
         }
     }
@@ -334,6 +328,13 @@
         }
     }
 
+    // Update text color based when shade scrim changes color.
+    public void onColorsChanged(boolean lightTheme) {
+        final Context context = new ContextThemeWrapper(mContext,
+                lightTheme ? R.style.Theme_SystemUI_Light : R.style.Theme_SystemUI);
+        setTextColor(Utils.getColorAttrDefaultColor(context, R.attr.wallpaperTextColor));
+    }
+
     @Override
     public void onDensityOrFontScaleChanged() {
         FontSizeUtils.updateFontSize(this, R.dimen.status_bar_clock_size);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
index 4552026..79f0915 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
@@ -45,7 +45,7 @@
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
-import android.view.OnReceiveContentCallback;
+import android.view.OnReceiveContentListener;
 import android.view.View;
 import android.view.ViewAnimationUtils;
 import android.view.ViewGroup;
@@ -74,6 +74,7 @@
 import com.android.systemui.statusbar.phone.LightBarController;
 
 import java.util.HashMap;
+import java.util.Map;
 import java.util.function.Consumer;
 
 /**
@@ -585,27 +586,32 @@
         protected void onFinishInflate() {
             super.onFinishInflate();
             if (mSupportedMimeTypes != null && mSupportedMimeTypes.length > 0) {
-                setOnReceiveContentCallback(mSupportedMimeTypes,
-                        new OnReceiveContentCallback<View>() {
+                setOnReceiveContentListener(mSupportedMimeTypes,
+                        new OnReceiveContentListener() {
                             @Override
-                            public boolean onReceiveContent(@NonNull View view,
+                            @Nullable
+                            public Payload onReceiveContent(@NonNull View view,
                                     @NonNull Payload payload) {
-                                ClipData clip = payload.getClip();
-                                if (clip.getItemCount() == 0) {
-                                    return false;
-                                }
-                                Uri contentUri = clip.getItemAt(0).getUri();
-                                ClipDescription description = clip.getDescription();
-                                String mimeType = null;
-                                if (description.getMimeTypeCount() > 0) {
-                                    mimeType = description.getMimeType(0);
-                                }
-                                if (mimeType != null) {
+                                Map<Boolean, Payload> split = payload.partition(
+                                        item -> item.getUri() != null);
+                                Payload uriItems = split.get(true);
+                                Payload remainingItems = split.get(false);
+                                if (uriItems != null) {
+                                    ClipData clip = uriItems.getClip();
+                                    ClipDescription description = clip.getDescription();
+                                    if (clip.getItemCount() > 1
+                                            || description.getMimeTypeCount() < 1
+                                            || remainingItems != null) {
+                                        // TODO(b/172363500): Update to loop over all the items
+                                        return payload;
+                                    }
+                                    Uri contentUri = clip.getItemAt(0).getUri();
+                                    String mimeType = description.getMimeType(0);
                                     Intent dataIntent = mRemoteInputView
                                             .prepareRemoteInputFromData(mimeType, contentUri);
                                     mRemoteInputView.sendRemoteInput(dataIntent);
                                 }
-                                return true;
+                                return remainingItems;
                             }
                         });
             }
diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java
similarity index 64%
rename from packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java
rename to packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java
index 665cb63..0aa2a73 100644
--- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java
+++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java
@@ -21,11 +21,18 @@
 import android.util.ArrayMap;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 
+import com.android.systemui.Dumpable;
+import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dump.DumpManager;
+
 import com.google.android.collect.Lists;
 import com.google.android.collect.Sets;
 
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -34,9 +41,19 @@
 import java.util.concurrent.Executor;
 import java.util.stream.Collectors;
 
-class ThemeOverlayManager {
+/**
+ * Responsible for orchestrating overlays, based on user preferences and other inputs from
+ * {@link ThemeOverlayController}.
+ */
+@SysUISingleton
+public class ThemeOverlayApplier implements Dumpable {
     private static final String TAG = "ThemeOverlayManager";
-    private static final boolean DEBUG = false;
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+    @VisibleForTesting
+    static final String MONET_ACCENT_COLOR_PACKAGE = "com.android.theme.accentcolor.color";
+    @VisibleForTesting
+    static final String MONET_SYSTEM_PALETTE_PACKAGE = "com.android.theme.systemcolors.color";
 
     @VisibleForTesting
     static final String ANDROID_PACKAGE = "android";
@@ -46,7 +63,11 @@
     static final String SYSUI_PACKAGE = "com.android.systemui";
 
     @VisibleForTesting
-    static final String OVERLAY_CATEGORY_COLOR = "android.theme.customization.accent_color";
+    static final String OVERLAY_CATEGORY_ACCENT_COLOR =
+            "android.theme.customization.accent_color";
+    @VisibleForTesting
+    static final String OVERLAY_CATEGORY_SYSTEM_PALETTE =
+            "android.theme.customization.system_palette";
     @VisibleForTesting
     static final String OVERLAY_CATEGORY_FONT = "android.theme.customization.font";
     @VisibleForTesting
@@ -73,24 +94,36 @@
      * starts with launcher and grouped by target package.
      */
     static final List<String> THEME_CATEGORIES = Lists.newArrayList(
+            OVERLAY_CATEGORY_SYSTEM_PALETTE,
             OVERLAY_CATEGORY_ICON_LAUNCHER,
             OVERLAY_CATEGORY_SHAPE,
             OVERLAY_CATEGORY_FONT,
-            OVERLAY_CATEGORY_COLOR,
+            OVERLAY_CATEGORY_ACCENT_COLOR,
             OVERLAY_CATEGORY_ICON_ANDROID,
             OVERLAY_CATEGORY_ICON_SYSUI,
             OVERLAY_CATEGORY_ICON_SETTINGS,
             OVERLAY_CATEGORY_ICON_THEME_PICKER);
 
-    /* Categories that need to applied to the current user as well as the system user. */
+    /* Categories that need to be applied to the current user as well as the system user. */
     @VisibleForTesting
     static final Set<String> SYSTEM_USER_CATEGORIES = Sets.newHashSet(
-            OVERLAY_CATEGORY_COLOR,
+            OVERLAY_CATEGORY_SYSTEM_PALETTE,
+            OVERLAY_CATEGORY_ACCENT_COLOR,
             OVERLAY_CATEGORY_FONT,
             OVERLAY_CATEGORY_SHAPE,
             OVERLAY_CATEGORY_ICON_ANDROID,
             OVERLAY_CATEGORY_ICON_SYSUI);
 
+    /**
+     * List of main colors of Monet themes. These are extracted from overlays installed
+     * on the system.
+     */
+    private final ArrayList<Integer> mMainSystemColors = new ArrayList<>();
+    /**
+     * Same as above, but providing accent colors instead of a system palette.
+     */
+    private final ArrayList<Integer> mAccentColors = new ArrayList<>();
+
     /* Allowed overlay categories for each target package. */
     private final Map<String, Set<String>> mTargetPackageToCategories = new ArrayMap<>();
     /* Target package for each overlay category. */
@@ -100,15 +133,15 @@
     private final String mLauncherPackage;
     private final String mThemePickerPackage;
 
-    ThemeOverlayManager(OverlayManager overlayManager, Executor executor,
-            String launcherPackage, String themePickerPackage) {
+    public ThemeOverlayApplier(OverlayManager overlayManager, Executor executor,
+            String launcherPackage, String themePickerPackage, DumpManager dumpManager) {
         mOverlayManager = overlayManager;
         mExecutor = executor;
         mLauncherPackage = launcherPackage;
         mThemePickerPackage = themePickerPackage;
         mTargetPackageToCategories.put(ANDROID_PACKAGE, Sets.newHashSet(
-                OVERLAY_CATEGORY_COLOR, OVERLAY_CATEGORY_FONT,
-                OVERLAY_CATEGORY_SHAPE, OVERLAY_CATEGORY_ICON_ANDROID));
+                OVERLAY_CATEGORY_SYSTEM_PALETTE, OVERLAY_CATEGORY_ACCENT_COLOR,
+                OVERLAY_CATEGORY_FONT, OVERLAY_CATEGORY_SHAPE, OVERLAY_CATEGORY_ICON_ANDROID));
         mTargetPackageToCategories.put(SYSUI_PACKAGE,
                 Sets.newHashSet(OVERLAY_CATEGORY_ICON_SYSUI));
         mTargetPackageToCategories.put(SETTINGS_PACKAGE,
@@ -117,7 +150,7 @@
                 Sets.newHashSet(OVERLAY_CATEGORY_ICON_LAUNCHER));
         mTargetPackageToCategories.put(mThemePickerPackage,
                 Sets.newHashSet(OVERLAY_CATEGORY_ICON_THEME_PICKER));
-        mCategoryToTargetPackage.put(OVERLAY_CATEGORY_COLOR, ANDROID_PACKAGE);
+        mCategoryToTargetPackage.put(OVERLAY_CATEGORY_ACCENT_COLOR, ANDROID_PACKAGE);
         mCategoryToTargetPackage.put(OVERLAY_CATEGORY_FONT, ANDROID_PACKAGE);
         mCategoryToTargetPackage.put(OVERLAY_CATEGORY_SHAPE, ANDROID_PACKAGE);
         mCategoryToTargetPackage.put(OVERLAY_CATEGORY_ICON_ANDROID, ANDROID_PACKAGE);
@@ -125,6 +158,54 @@
         mCategoryToTargetPackage.put(OVERLAY_CATEGORY_ICON_SETTINGS, SETTINGS_PACKAGE);
         mCategoryToTargetPackage.put(OVERLAY_CATEGORY_ICON_LAUNCHER, mLauncherPackage);
         mCategoryToTargetPackage.put(OVERLAY_CATEGORY_ICON_THEME_PICKER, mThemePickerPackage);
+
+        collectMonetSystemOverlays();
+        dumpManager.registerDumpable(TAG, this);
+    }
+
+    /**
+     * List of accent colors available as Monet overlays.
+     */
+    List<Integer> getAvailableAccentColors() {
+        return mAccentColors;
+    }
+
+    /**
+     * List of main system colors available as Monet overlays.
+     */
+    List<Integer> getAvailableSystemColors() {
+        return mMainSystemColors;
+    }
+
+    private void collectMonetSystemOverlays() {
+        List<OverlayInfo> androidOverlays = mOverlayManager
+                .getOverlayInfosForTarget(ANDROID_PACKAGE, UserHandle.SYSTEM);
+        for (OverlayInfo overlayInfo : androidOverlays) {
+            String packageName = overlayInfo.packageName;
+            if (DEBUG) {
+                Log.d(TAG, "Processing overlay " + packageName);
+            }
+            if (OVERLAY_CATEGORY_SYSTEM_PALETTE.equals(overlayInfo.category)
+                    && packageName.startsWith(MONET_SYSTEM_PALETTE_PACKAGE)) {
+                try {
+                    String color = packageName.replace(MONET_SYSTEM_PALETTE_PACKAGE, "");
+                    mMainSystemColors.add(Integer.parseInt(color, 16));
+                } catch (NumberFormatException e) {
+                    Log.w(TAG, "Invalid package name for overlay " + packageName, e);
+                }
+            } else if (OVERLAY_CATEGORY_ACCENT_COLOR.equals(overlayInfo.category)
+                    && packageName.startsWith(MONET_ACCENT_COLOR_PACKAGE)) {
+                try {
+                    String color = packageName.replace(MONET_ACCENT_COLOR_PACKAGE, "");
+                    mAccentColors.add(Integer.parseInt(color, 16));
+                } catch (NumberFormatException e) {
+                    Log.w(TAG, "Invalid package name for overlay " + packageName, e);
+                }
+            } else if (DEBUG) {
+                Log.d(TAG, "Unknown overlay: " + packageName + " category: "
+                        + overlayInfo.category);
+            }
+        }
     }
 
     /**
@@ -184,4 +265,13 @@
             }
         });
     }
+
+    /**
+     * @inherit
+     */
+    @Override
+    public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
+        pw.println("mMainSystemColors=" + mMainSystemColors.size());
+        pw.println("mAccentColors=" + mAccentColors.size());
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
index 132e092..c4e2b5d 100644
--- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
@@ -15,16 +15,20 @@
  */
 package com.android.systemui.theme;
 
+import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_ACCENT_COLOR;
+import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_SYSTEM_PALETTE;
+
 import android.app.ActivityManager;
+import android.app.WallpaperColors;
+import android.app.WallpaperManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.om.OverlayManager;
 import android.content.pm.UserInfo;
 import android.database.ContentObserver;
+import android.graphics.Color;
 import android.net.Uri;
-import android.os.AsyncTask;
 import android.os.Handler;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -33,20 +37,32 @@
 import android.util.ArrayMap;
 import android.util.Log;
 
-import com.android.systemui.R;
+import androidx.annotation.NonNull;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.graphics.ColorUtils;
+import com.android.systemui.Dumpable;
 import com.android.systemui.SystemUI;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Background;
+import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.dump.DumpManager;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.util.settings.SecureSettings;
 
 import com.google.android.collect.Sets;
 
 import org.json.JSONException;
 import org.json.JSONObject;
 
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
 import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.Executor;
 
 import javax.inject.Inject;
 
@@ -60,49 +76,76 @@
  * associated work profiles
  */
 @SysUISingleton
-public class ThemeOverlayController extends SystemUI {
+public class ThemeOverlayController extends SystemUI implements Dumpable {
     private static final String TAG = "ThemeOverlayController";
-    private static final boolean DEBUG = false;
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
-    private ThemeOverlayManager mThemeManager;
-    private UserManager mUserManager;
-    private BroadcastDispatcher mBroadcastDispatcher;
+    // If lock screen wallpaper colors should also be considered when selecting the theme.
+    // Doing this has performance impact, given that overlays would need to be swapped when
+    // the device unlocks.
+    @VisibleForTesting
+    static final boolean USE_LOCK_SCREEN_WALLPAPER = false;
+
+    private final ThemeOverlayApplier mThemeManager;
+    private final UserManager mUserManager;
+    private final BroadcastDispatcher mBroadcastDispatcher;
+    private final Executor mBgExecutor;
+    private final SecureSettings mSecureSettings;
+    private final Executor mMainExecutor;
     private final Handler mBgHandler;
+    private final WallpaperManager mWallpaperManager;
+    private final KeyguardStateController mKeyguardStateController;
+    private WallpaperColors mLockColors;
+    private WallpaperColors mSystemColors;
+    // Color extracted from wallpaper, NOT the color used on the overlay
+    private int mMainWallpaperColor = Color.TRANSPARENT;
+    // Color extracted from wallpaper, NOT the color used on the overlay
+    private int mWallpaperAccentColor = Color.TRANSPARENT;
+    // Main system color that maps to an overlay color
+    private int mSystemOverlayColor = Color.TRANSPARENT;
+    // Accent color that maps to an overlay color
+    private int mAccentOverlayColor = Color.TRANSPARENT;
 
     @Inject
     public ThemeOverlayController(Context context, BroadcastDispatcher broadcastDispatcher,
-            @Background Handler bgHandler) {
+            @Background Handler bgHandler, @Main Executor mainExecutor,
+            @Background Executor bgExecutor, ThemeOverlayApplier themeOverlayApplier,
+            SecureSettings secureSettings, WallpaperManager wallpaperManager,
+            UserManager userManager, KeyguardStateController keyguardStateController,
+            DumpManager dumpManager) {
         super(context);
+
         mBroadcastDispatcher = broadcastDispatcher;
+        mUserManager = userManager;
+        mBgExecutor = bgExecutor;
+        mMainExecutor = mainExecutor;
         mBgHandler = bgHandler;
+        mThemeManager = themeOverlayApplier;
+        mSecureSettings = secureSettings;
+        mWallpaperManager = wallpaperManager;
+        mKeyguardStateController = keyguardStateController;
+        dumpManager.registerDumpable(TAG, this);
     }
 
     @Override
     public void start() {
         if (DEBUG) Log.d(TAG, "Start");
-        mUserManager = mContext.getSystemService(UserManager.class);
-        mThemeManager = new ThemeOverlayManager(
-                mContext.getSystemService(OverlayManager.class),
-                AsyncTask.THREAD_POOL_EXECUTOR,
-                mContext.getString(R.string.launcher_overlayable_package),
-                mContext.getString(R.string.themepicker_overlayable_package));
         final IntentFilter filter = new IntentFilter();
         filter.addAction(Intent.ACTION_USER_SWITCHED);
         filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
-        mBroadcastDispatcher.registerReceiverWithHandler(new BroadcastReceiver() {
+        mBroadcastDispatcher.registerReceiver(new BroadcastReceiver() {
             @Override
             public void onReceive(Context context, Intent intent) {
                 if (DEBUG) Log.d(TAG, "Updating overlays for user switch / profile added.");
                 updateThemeOverlays();
             }
-        }, filter, mBgHandler, UserHandle.ALL);
-        mContext.getContentResolver().registerContentObserver(
+        }, filter, mBgExecutor, UserHandle.ALL);
+        mSecureSettings.registerContentObserverForUser(
                 Settings.Secure.getUriFor(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES),
                 false,
                 new ContentObserver(mBgHandler) {
-
                     @Override
-                    public void onChange(boolean selfChange, Collection<Uri> uris, int flags,
+                    public void onChange(boolean selfChange, Collection<Uri> collection, int flags,
                             int userId) {
                         if (DEBUG) Log.d(TAG, "Overlay changed for user: " + userId);
                         if (ActivityManager.getCurrentUser() == userId) {
@@ -111,20 +154,147 @@
                     }
                 },
                 UserHandle.USER_ALL);
+
+        // Upon boot, make sure we have the most up to date colors
+        mBgExecutor.execute(() -> {
+            WallpaperColors lockColors = mWallpaperManager.getWallpaperColors(
+                    WallpaperManager.FLAG_LOCK);
+            WallpaperColors systemColor = mWallpaperManager.getWallpaperColors(
+                    WallpaperManager.FLAG_SYSTEM);
+            mMainExecutor.execute(() -> {
+                if (USE_LOCK_SCREEN_WALLPAPER) {
+                    mLockColors = lockColors;
+                }
+                mSystemColors = systemColor;
+                reevaluateSystemTheme();
+            });
+        });
+        if (USE_LOCK_SCREEN_WALLPAPER) {
+            mKeyguardStateController.addCallback(new KeyguardStateController.Callback() {
+                @Override
+                public void onKeyguardShowingChanged() {
+                    if (mLockColors == null) {
+                        return;
+                    }
+                    // It's possible that the user has a lock screen wallpaper. On this case we'll
+                    // end up with different colors after unlocking.
+                    reevaluateSystemTheme();
+                }
+            });
+        }
+        mWallpaperManager.addOnColorsChangedListener((wallpaperColors, which) -> {
+            if (USE_LOCK_SCREEN_WALLPAPER && (which & WallpaperManager.FLAG_LOCK) != 0) {
+                mLockColors = wallpaperColors;
+                if (DEBUG) {
+                    Log.d(TAG, "got new lock colors: " + wallpaperColors + " where: " + which);
+                }
+            }
+            if ((which & WallpaperManager.FLAG_SYSTEM) != 0) {
+                mSystemColors = wallpaperColors;
+                if (DEBUG) {
+                    Log.d(TAG, "got new lock colors: " + wallpaperColors + " where: " + which);
+                }
+            }
+            reevaluateSystemTheme();
+        }, null, UserHandle.USER_ALL);
+    }
+
+    private void reevaluateSystemTheme() {
+        if (mLockColors == null && mSystemColors == null) {
+            Log.w(TAG, "Cannot update theme, colors are null");
+            return;
+        }
+        WallpaperColors currentColor =
+                mKeyguardStateController.isShowing() && mLockColors != null
+                        ? mLockColors : mSystemColors;
+        int mainColor = currentColor.getPrimaryColor().toArgb();
+
+        //TODO(b/172860591) implement more complex logic for picking accent color.
+        //For now, picking the secondary should be enough.
+        Color accentCandidate = currentColor.getSecondaryColor();
+        if (accentCandidate == null) {
+            accentCandidate = currentColor.getTertiaryColor();
+        }
+        if (accentCandidate == null) {
+            accentCandidate = currentColor.getPrimaryColor();
+        }
+
+        if (mMainWallpaperColor == mainColor && mWallpaperAccentColor == accentCandidate.toArgb()) {
+            return;
+        }
+
+        mMainWallpaperColor = mainColor;
+        mWallpaperAccentColor = accentCandidate.toArgb();
+
+        // Let's compare these colors to our finite set of overlays, and then pick an overlay.
+        List<Integer> systemColors = mThemeManager.getAvailableSystemColors();
+        List<Integer> accentColors = mThemeManager.getAvailableAccentColors();
+
+        if (systemColors.size() == 0 || accentColors.size() == 0) {
+            if (DEBUG) {
+                Log.d(TAG, "Cannot apply system theme, palettes are unavailable");
+            }
+            return;
+        }
+
+        mSystemOverlayColor = getClosest(systemColors, mMainWallpaperColor);
+        mAccentOverlayColor = getClosest(accentColors, mWallpaperAccentColor);
+
+        updateThemeOverlays();
+    }
+
+    /**
+     * Given a color and a list of candidates, return the candidate that's the most similar to the
+     * given color.
+     */
+    private static int getClosest(List<Integer> candidates, int color) {
+        float[] hslMain = new float[3];
+        float[] hslCandidate = new float[3];
+
+        ColorUtils.RGBToHSL(Color.red(color), Color.green(color), Color.blue(color), hslMain);
+        hslMain[0] /= 360f;
+
+        float minDistance = Float.MAX_VALUE;
+        int closestColor = Color.TRANSPARENT;
+        for (int candidate: candidates) {
+            ColorUtils.RGBToHSL(Color.red(candidate), Color.green(candidate), Color.blue(candidate),
+                    hslCandidate);
+            hslCandidate[0] /= 360f;
+
+            float sqDistance = squared(hslCandidate[0] - hslMain[0])
+                    + squared(hslCandidate[1] - hslMain[1])
+                    + squared(hslCandidate[2] - hslMain[2]);
+            if (sqDistance < minDistance) {
+                minDistance = sqDistance;
+                closestColor = candidate;
+            }
+        }
+        return closestColor;
+    }
+
+    private static float squared(float f) {
+        return f * f;
     }
 
     private void updateThemeOverlays() {
         final int currentUser = ActivityManager.getCurrentUser();
-        final String overlayPackageJson = Settings.Secure.getStringForUser(
-                mContext.getContentResolver(), Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES,
+        final String overlayPackageJson = mSecureSettings.getStringForUser(
+                Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES,
                 currentUser);
         if (DEBUG) Log.d(TAG, "updateThemeOverlays: " + overlayPackageJson);
+        boolean hasSystemPalette = false;
+        boolean hasAccentColor = false;
         final Map<String, String> categoryToPackage = new ArrayMap<>();
         if (!TextUtils.isEmpty(overlayPackageJson)) {
             try {
                 JSONObject object = new JSONObject(overlayPackageJson);
-                for (String category : ThemeOverlayManager.THEME_CATEGORIES) {
+                for (String category : ThemeOverlayApplier.THEME_CATEGORIES) {
                     if (object.has(category)) {
+                        if (category.equals(OVERLAY_CATEGORY_ACCENT_COLOR)) {
+                            hasAccentColor = true;
+                        } else if (category.equals(OVERLAY_CATEGORY_SYSTEM_PALETTE)) {
+                            hasSystemPalette = true;
+                        }
                         categoryToPackage.put(category, object.getString(category));
                     }
                 }
@@ -132,6 +302,20 @@
                 Log.i(TAG, "Failed to parse THEME_CUSTOMIZATION_OVERLAY_PACKAGES.", e);
             }
         }
+
+        // Let's apply the system palette, but only if it was not overridden by the style picker.
+        if (!hasSystemPalette && mSystemOverlayColor != Color.TRANSPARENT) {
+            categoryToPackage.put(OVERLAY_CATEGORY_SYSTEM_PALETTE,
+                    ThemeOverlayApplier.MONET_SYSTEM_PALETTE_PACKAGE
+                            + Integer.toHexString(mSystemOverlayColor).toUpperCase());
+        }
+        // Same for the accent color
+        if (!hasAccentColor && mAccentOverlayColor != Color.TRANSPARENT) {
+            categoryToPackage.put(OVERLAY_CATEGORY_ACCENT_COLOR,
+                    ThemeOverlayApplier.MONET_ACCENT_COLOR_PACKAGE
+                            + Integer.toHexString(mAccentOverlayColor).toUpperCase());
+        }
+
         Set<UserHandle> userHandles = Sets.newHashSet(UserHandle.of(currentUser));
         for (UserInfo userInfo : mUserManager.getEnabledProfiles(currentUser)) {
             if (userInfo.isManagedProfile()) {
@@ -140,4 +324,14 @@
         }
         mThemeManager.applyCurrentUserOverlays(categoryToPackage, userHandles);
     }
+
+    @Override
+    public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
+        pw.println("mLockColors=" + mLockColors);
+        pw.println("mSystemColors=" + mSystemColors);
+        pw.println("mMainWallpaperColor=" + Integer.toHexString(mMainWallpaperColor));
+        pw.println("mWallpaperAccentColor=" + Integer.toHexString(mWallpaperAccentColor));
+        pw.println("mSystemOverlayColor=" + Integer.toHexString(mSystemOverlayColor));
+        pw.println("mAccentOverlayColor=" + Integer.toHexString(mAccentOverlayColor));
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
index b36b531..5702028 100644
--- a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
+++ b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
@@ -631,7 +631,8 @@
 
         final int requestKey = disk.getId().hashCode();
         return PendingIntent.getActivityAsUser(mContext, requestKey, intent,
-                PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                null, UserHandle.CURRENT);
     }
 
     private PendingIntent buildInitPendingIntent(VolumeInfo vol) {
@@ -650,7 +651,8 @@
 
         final int requestKey = vol.getId().hashCode();
         return PendingIntent.getActivityAsUser(mContext, requestKey, intent,
-                PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                null, UserHandle.CURRENT);
     }
 
     private PendingIntent buildUnmountPendingIntent(VolumeInfo vol) {
@@ -662,7 +664,8 @@
 
             final int requestKey = vol.getId().hashCode();
             return PendingIntent.getActivityAsUser(mContext, requestKey, intent,
-                    PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
+                    PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                    null, UserHandle.CURRENT);
         } else if (isAutomotive()) {
             intent.setClassName("com.android.car.settings",
                     "com.android.car.settings.storage.StorageUnmountReceiver");
@@ -670,7 +673,8 @@
 
             final int requestKey = vol.getId().hashCode();
             return PendingIntent.getBroadcastAsUser(mContext, requestKey, intent,
-                    PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.CURRENT);
+                    PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                    UserHandle.CURRENT);
         } else {
             intent.setClassName("com.android.settings",
                     "com.android.settings.deviceinfo.StorageUnmountReceiver");
@@ -678,7 +682,8 @@
 
             final int requestKey = vol.getId().hashCode();
             return PendingIntent.getBroadcastAsUser(mContext, requestKey, intent,
-                    PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.CURRENT);
+                    PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                    UserHandle.CURRENT);
         }
     }
 
@@ -689,7 +694,8 @@
 
             final int requestKey = vol.getId().hashCode();
             return PendingIntent.getActivityAsUser(mContext, requestKey, intent,
-                    PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
+                    PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                    null, UserHandle.CURRENT);
         } finally {
             StrictMode.setVmPolicy(oldPolicy);
         }
@@ -721,7 +727,8 @@
 
         final int requestKey = vol.getId().hashCode();
         return PendingIntent.getActivityAsUser(mContext, requestKey, intent,
-                PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                null, UserHandle.CURRENT);
     }
 
     private PendingIntent buildSnoozeIntent(String fsUuid) {
@@ -730,7 +737,8 @@
 
         final int requestKey = fsUuid.hashCode();
         return PendingIntent.getBroadcastAsUser(mContext, requestKey, intent,
-                PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.CURRENT);
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                UserHandle.CURRENT);
     }
 
     private PendingIntent buildForgetPendingIntent(VolumeRecord rec) {
@@ -742,7 +750,8 @@
 
         final int requestKey = rec.getFsUuid().hashCode();
         return PendingIntent.getActivityAsUser(mContext, requestKey, intent,
-                PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                null, UserHandle.CURRENT);
     }
 
     private PendingIntent buildWizardMigratePendingIntent(MoveInfo move) {
@@ -764,7 +773,8 @@
             intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, vol.getId());
         }
         return PendingIntent.getActivityAsUser(mContext, move.moveId, intent,
-                PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                null, UserHandle.CURRENT);
     }
 
     private PendingIntent buildWizardMovePendingIntent(MoveInfo move) {
@@ -782,7 +792,8 @@
         intent.putExtra(PackageManager.EXTRA_MOVE_ID, move.moveId);
 
         return PendingIntent.getActivityAsUser(mContext, move.moveId, intent,
-                PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                null, UserHandle.CURRENT);
     }
 
     private PendingIntent buildWizardReadyPendingIntent(DiskInfo disk) {
@@ -801,7 +812,8 @@
 
         final int requestKey = disk.getId().hashCode();
         return PendingIntent.getActivityAsUser(mContext, requestKey, intent,
-                PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                null, UserHandle.CURRENT);
     }
 
     private boolean isAutomotive() {
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
index 7a24438..c36acf5 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
@@ -16,8 +16,6 @@
 
 package com.android.systemui.wmshell;
 
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
-import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
 import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
 
@@ -29,21 +27,14 @@
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED;
-import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
 
-import android.app.ActivityManager;
-import android.app.ActivityTaskManager;
-import android.app.ActivityTaskManager.RootTaskInfo;
-import android.content.ComponentName;
 import android.content.Context;
+import android.content.res.Configuration;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.inputmethodservice.InputMethodService;
 import android.os.IBinder;
 import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
-import android.util.Log;
-import android.util.Pair;
 import android.view.KeyEvent;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -55,8 +46,6 @@
 import com.android.systemui.keyguard.ScreenLifecycle;
 import com.android.systemui.model.SysUiState;
 import com.android.systemui.navigationbar.NavigationModeController;
-import com.android.systemui.shared.system.TaskStackChangeListener;
-import com.android.systemui.shared.system.TaskStackChangeListeners;
 import com.android.systemui.shared.tracing.ProtoTraceable;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -64,6 +53,8 @@
 import com.android.systemui.tracing.ProtoTracer;
 import com.android.systemui.tracing.nano.SystemUiTraceProto;
 import com.android.wm.shell.ShellDump;
+import com.android.wm.shell.apppairs.AppPairs;
+import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout;
 import com.android.wm.shell.nano.WmShellTraceProto;
 import com.android.wm.shell.onehanded.OneHanded;
 import com.android.wm.shell.onehanded.OneHandedEvents;
@@ -105,8 +96,10 @@
     private final Optional<Pip> mPipOptional;
     private final Optional<SplitScreen> mSplitScreenOptional;
     private final Optional<OneHanded> mOneHandedOptional;
+    private final Optional<HideDisplayCutout> mHideDisplayCutoutOptional;
     private final ProtoTracer mProtoTracer;
     private final Optional<ShellDump> mShellDump;
+    private final Optional<AppPairs> mAppPairsOptional;
 
     private boolean mIsSysUiStateValid;
     private KeyguardUpdateMonitorCallback mSplitScreenKeyguardCallback;
@@ -123,8 +116,10 @@
             Optional<Pip> pipOptional,
             Optional<SplitScreen> splitScreenOptional,
             Optional<OneHanded> oneHandedOptional,
+            Optional<HideDisplayCutout> hideDisplayCutoutOptional,
             ProtoTracer protoTracer,
-            Optional<ShellDump> shellDump) {
+            Optional<ShellDump> shellDump,
+            Optional<AppPairs> appPairsOptional) {
         super(context);
         mCommandQueue = commandQueue;
         mConfigurationController = configurationController;
@@ -135,9 +130,11 @@
         mPipOptional = pipOptional;
         mSplitScreenOptional = splitScreenOptional;
         mOneHandedOptional = oneHandedOptional;
+        mHideDisplayCutoutOptional = hideDisplayCutoutOptional;
         mProtoTracer = protoTracer;
         mProtoTracer.add(this);
         mShellDump = shellDump;
+        mAppPairsOptional = appPairsOptional;
     }
 
     @Override
@@ -146,6 +143,7 @@
         mPipOptional.ifPresent(this::initPip);
         mSplitScreenOptional.ifPresent(this::initSplitScreen);
         mOneHandedOptional.ifPresent(this::initOneHanded);
+        mHideDisplayCutoutOptional.ifPresent(this::initHideDisplayCutout);
     }
 
     @VisibleForTesting
@@ -284,6 +282,16 @@
         });
     }
 
+    @VisibleForTesting
+    void initHideDisplayCutout(HideDisplayCutout hideDisplayCutout) {
+        mConfigurationController.addCallback(new ConfigurationController.ConfigurationListener() {
+            @Override
+            public void onConfigChanged(Configuration newConfig) {
+                hideDisplayCutout.onConfigurationChanged(newConfig);
+            }
+        });
+    }
+
     @Override
     public void writeToProto(SystemUiTraceProto proto) {
         if (proto.wmShell == null) {
@@ -331,6 +339,21 @@
                     }
                     return true;
                 }
+
+                case "pair": {
+                    String[] groups = Arrays.copyOfRange(args, i + 1, args.length);
+                    final int taskId1 = new Integer(groups[0]);
+                    final int taskId2 = new Integer(groups[1]);
+                    mAppPairsOptional.ifPresent(appPairs -> appPairs.pair(taskId1, taskId2));
+                    return true;
+                }
+
+                case "unpair": {
+                    String[] groups = Arrays.copyOfRange(args, i + 1, args.length);
+                    final int taskId = new Integer(groups[0]);
+                    mAppPairsOptional.ifPresent(appPairs -> appPairs.unpair(taskId));
+                    return true;
+                }
             }
         }
         return false;
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java
index a197789..74aa1a7 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java
@@ -28,11 +28,11 @@
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.systemui.dagger.WMSingleton;
 import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.shared.system.InputConsumerController;
 import com.android.wm.shell.ShellDump;
 import com.android.wm.shell.ShellInit;
 import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.WindowManagerShellWrapper;
+import com.android.wm.shell.apppairs.AppPairs;
 import com.android.wm.shell.bubbles.BubbleController;
 import com.android.wm.shell.bubbles.Bubbles;
 import com.android.wm.shell.common.AnimationThread;
@@ -46,6 +46,8 @@
 import com.android.wm.shell.common.TaskStackListenerImpl;
 import com.android.wm.shell.common.TransactionPool;
 import com.android.wm.shell.draganddrop.DragAndDropController;
+import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout;
+import com.android.wm.shell.hidedisplaycutout.HideDisplayCutoutController;
 import com.android.wm.shell.onehanded.OneHanded;
 import com.android.wm.shell.onehanded.OneHandedController;
 import com.android.wm.shell.pip.Pip;
@@ -74,11 +76,13 @@
     static ShellInit provideShellInit(DisplayImeController displayImeController,
             DragAndDropController dragAndDropController,
             ShellTaskOrganizer shellTaskOrganizer,
-            Optional<SplitScreen> splitScreenOptional) {
+            Optional<SplitScreen> splitScreenOptional,
+            Optional<AppPairs> appPairsOptional) {
         return new ShellInit(displayImeController,
                 dragAndDropController,
                 shellTaskOrganizer,
-                splitScreenOptional);
+                splitScreenOptional,
+                appPairsOptional);
     }
 
     /**
@@ -90,9 +94,11 @@
     static Optional<ShellDump> provideShellDump(ShellTaskOrganizer shellTaskOrganizer,
             Optional<SplitScreen> splitScreenOptional,
             Optional<Pip> pipOptional,
-            Optional<OneHanded> oneHandedOptional) {
+            Optional<OneHanded> oneHandedOptional,
+            Optional<HideDisplayCutout> hideDisplayCutout,
+            Optional<AppPairs> appPairsOptional) {
         return Optional.of(new ShellDump(shellTaskOrganizer, splitScreenOptional, pipOptional,
-                oneHandedOptional));
+                oneHandedOptional, hideDisplayCutout, appPairsOptional));
     }
 
     @WMSingleton
@@ -185,6 +191,9 @@
     @BindsOptionalOf
     abstract SplitScreen optionalSplitScreen();
 
+    @BindsOptionalOf
+    abstract AppPairs optionalAppPairs();
+
     @WMSingleton
     @Provides
     static Optional<Bubbles> provideBubbles(Context context,
@@ -215,4 +224,10 @@
         return new HandlerExecutor(handler);
     }
 
+    @WMSingleton
+    @Provides
+    static Optional<HideDisplayCutout> provideHideDisplayCutoutController(Context context,
+            DisplayController displayController) {
+        return Optional.ofNullable(HideDisplayCutoutController.create(context, displayController));
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
index e9c4b0b..ef8a08c 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
@@ -24,6 +24,8 @@
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.WindowManagerShellWrapper;
+import com.android.wm.shell.apppairs.AppPairs;
+import com.android.wm.shell.apppairs.AppPairsController;
 import com.android.wm.shell.common.DisplayController;
 import com.android.wm.shell.common.DisplayImeController;
 import com.android.wm.shell.common.FloatingContentCoordinator;
@@ -81,6 +83,13 @@
 
     @WMSingleton
     @Provides
+    static AppPairs provideAppPairs(ShellTaskOrganizer shellTaskOrganizer,
+            SyncTransactionQueue syncQueue) {
+        return new AppPairsController(shellTaskOrganizer, syncQueue);
+    }
+
+    @WMSingleton
+    @Provides
     static Optional<Pip> providePip(Context context, DisplayController displayController,
             PipAppOpsListener pipAppOpsListener, PipBoundsAlgorithm pipBoundsAlgorithm,
             PipBoundsState pipBoundsState, PipMediaController pipMediaController,
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/FontInterpolatorTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/FontInterpolatorTest.kt
new file mode 100644
index 0000000..95fa3b9
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/FontInterpolatorTest.kt
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.keyguard
+
+import android.graphics.Paint
+import android.graphics.fonts.Font
+import android.graphics.fonts.FontVariationAxis
+import android.graphics.text.TextRunShaper
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidTestingRunner::class)
+@SmallTest
+class FontInterpolatorTest : SysuiTestCase() {
+
+    private val sFont = TextRunShaper.shapeTextRun("A", 0, 1, 0, 1, 0f, 0f, false, Paint())
+            .getFont(0)
+
+    private fun assertSameAxes(expect: Font, actual: Font) {
+        val expectAxes = expect.axes?.also { it.sortBy { axis -> axis.tag } }
+        val actualAxes = actual.axes?.also { it.sortBy { axis -> axis.tag } }
+        assertThat(expectAxes).isEqualTo(actualAxes)
+    }
+
+    private fun assertSameAxes(expectVarSettings: String, actual: Font) {
+
+        val expectAxes = FontVariationAxis.fromFontVariationSettings(expectVarSettings)?.also {
+            it.sortBy { axis -> axis.tag }
+        }
+        val actualAxes = actual.axes?.also { it.sortBy { axis -> axis.tag } }
+        assertThat(expectAxes).isEqualTo(actualAxes)
+    }
+
+    @Test
+    fun textInterpolation() {
+        val startFont = Font.Builder(sFont)
+                .setFontVariationSettings("'wght' 100, 'ital' 0, 'GRAD' 200")
+                .build()
+        val endFont = Font.Builder(sFont)
+                .setFontVariationSettings("'wght' 900, 'ital' 1, 'GRAD' 700")
+                .build()
+
+        val interp = FontInterpolator()
+        assertSameAxes(startFont, interp.lerp(startFont, endFont, 0f))
+        assertSameAxes(endFont, interp.lerp(startFont, endFont, 1f))
+        assertSameAxes("'wght' 500, 'ital' 0.5, 'GRAD' 450", interp.lerp(startFont, endFont, 0.5f))
+    }
+
+    @Test
+    fun textInterpolation_DefaultValue() {
+        val startFont = Font.Builder(sFont)
+                .setFontVariationSettings("'wght' 100")
+                .build()
+        val endFont = Font.Builder(sFont)
+                .setFontVariationSettings("'ital' 1")
+                .build()
+
+        val interp = FontInterpolator()
+        assertSameAxes("'wght' 250, 'ital' 0.5", interp.lerp(startFont, endFont, 0.5f))
+    }
+
+    @Test
+    fun testInterpCache() {
+        val startFont = Font.Builder(sFont)
+                .setFontVariationSettings("'wght' 100")
+                .build()
+        val endFont = Font.Builder(sFont)
+                .setFontVariationSettings("'ital' 1")
+                .build()
+
+        val interp = FontInterpolator()
+        val resultFont = interp.lerp(startFont, endFont, 0.5f)
+        val cachedFont = interp.lerp(startFont, endFont, 0.5f)
+        assertThat(resultFont).isSameInstanceAs(cachedFont)
+    }
+
+    @Test
+    fun testAxesCache() {
+        val startFont = Font.Builder(sFont)
+                .setFontVariationSettings("'wght' 100")
+                .build()
+        val endFont = Font.Builder(sFont)
+                .setFontVariationSettings("'ital' 1")
+                .build()
+
+        val interp = FontInterpolator()
+        val resultFont = interp.lerp(startFont, endFont, 0.5f)
+        val reversedFont = interp.lerp(endFont, startFont, 0.5f)
+        assertThat(resultFont).isSameInstanceAs(reversedFont)
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index d78090a..51cbff8 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -93,6 +93,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.InOrder;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -102,7 +103,6 @@
 import java.util.List;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicBoolean;
-
 @SmallTest
 @RunWith(AndroidTestingRunner.class)
 @TestableLooper.RunWithLooper
@@ -159,12 +159,15 @@
     private StatusBarStateController mStatusBarStateController;
     @Mock
     private AuthController mAuthController;
+    @Captor
+    private ArgumentCaptor<StatusBarStateController.StateListener> mStatusBarStateListenerCaptor;
     // Direct executor
     private Executor mBackgroundExecutor = Runnable::run;
     private TestableLooper mTestableLooper;
     private TestableKeyguardUpdateMonitor mKeyguardUpdateMonitor;
     private TestableContext mSpiedContext;
     private MockitoSession mMockitoSession;
+    private StatusBarStateController.StateListener mStatusBarStateListener;
 
     @Before
     public void setup() {
@@ -221,6 +224,9 @@
         mTestableLooper = TestableLooper.get(this);
         allowTestableLooperAsMainThread();
         mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext);
+
+        verify(mStatusBarStateController).addCallback(mStatusBarStateListenerCaptor.capture());
+        mStatusBarStateListener = mStatusBarStateListenerCaptor.getValue();
     }
 
     @After
@@ -475,8 +481,7 @@
 
     @Test
     public void testTriesToAuthenticate_whenBouncer() {
-        mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(true);
-        mTestableLooper.processAllMessages();
+        setKeyguardBouncerVisibility(true);
 
         verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt());
         verify(mFaceManager).isHardwareDetected();
@@ -493,10 +498,10 @@
 
     @Test
     public void skipsAuthentication_whenStatusBarShadeLocked() {
-        when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE_LOCKED);
-
+        mStatusBarStateListener.onStateChanged(StatusBarState.SHADE_LOCKED);
         mKeyguardUpdateMonitor.dispatchStartedWakingUp();
         mTestableLooper.processAllMessages();
+
         mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true);
         verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt());
     }
@@ -536,8 +541,7 @@
         verify(mFaceManager).authenticate(any(), any(), any(), any(), anyInt());
 
         // Stop scanning when bouncer becomes visible
-        mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(true /* showingBouncer */);
-        mTestableLooper.processAllMessages();
+        setKeyguardBouncerVisibility(true);
         clearInvocations(mFaceManager);
         mKeyguardUpdateMonitor.requestFaceAuth();
         verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt());
@@ -768,6 +772,85 @@
         orderVerify.verify(callback).onRingerModeChanged(AudioManager.RINGER_MODE_VIBRATE);
     }
 
+    @Test
+    public void testStartUdfpsServiceBeginsOnKeyguard() {
+        // GIVEN
+        // - bouncer isn't showing
+        // - status bar state is on the keyguard
+        // - user has authenticated since boot
+        setKeyguardBouncerVisibility(false /* isVisible */);
+        mStatusBarStateListener.onStateChanged(StatusBarState.KEYGUARD);
+        when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(true);
+
+        // THEN we should listen for udfps
+        assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(true);
+    }
+
+    @Test
+    public void testStartUdfpsServiceOnShadeLocked() {
+        // GIVEN
+        // - bouncer isn't showing
+        // - user has authenticated since boot
+        setKeyguardBouncerVisibility(false /* isVisible */);
+        when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(true);
+
+        // WHEN the status bar state changes to SHADE_LOCKED
+        mStatusBarStateListener.onStateChanged(StatusBarState.SHADE_LOCKED);
+
+        // THEN we shouldn't listen for udfps
+        assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false);
+    }
+
+    @Test
+    public void testStartUdfpsServiceOnFullscreenUserSwitcher() {
+        // GIVEN
+        // - bouncer isn't showing
+        // - user has authenticated since boot
+        setKeyguardBouncerVisibility(false /* isVisible */);
+        when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(true);
+
+        // WHEN the status bar state changes to FULLSCREEN_USER_SWITCHER
+        mStatusBarStateListener.onStateChanged(StatusBarState.FULLSCREEN_USER_SWITCHER);
+
+        // THEN we shouldn't listen for udfps
+        assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false);
+    }
+
+    @Test
+    public void testStartUdfpsServiceNoAuthenticationSinceLastBoot() {
+        // GIVEN
+        // - bouncer isn't showing
+        // - status bar state is on the keyguard
+        setKeyguardBouncerVisibility(false /* isVisible */);
+        mStatusBarStateListener.onStateChanged(StatusBarState.KEYGUARD);
+
+        // WHEN user hasn't authenticated since last boot
+        when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(false);
+
+        // THEN we shouldn't listen for udfps
+        assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false);
+    }
+
+    @Test
+    public void testStartUdfpsServiceOnBouncerNotVisible() {
+        // GIVEN
+        // - status bar state is on the keyguard
+        // - user has authenticated since boot
+        mStatusBarStateListener.onStateChanged(StatusBarState.KEYGUARD);
+        when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(true);
+
+        // WHEN the bouncer is showing
+        setKeyguardBouncerVisibility(true /* isVisible */);
+
+        // THEN we shouldn't listen for udfps
+        assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false);
+    }
+
+    private void setKeyguardBouncerVisibility(boolean isVisible) {
+        mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(isVisible);
+        mTestableLooper.processAllMessages();
+    }
+
     private void setBroadcastReceiverPendingResult(BroadcastReceiver receiver) {
         BroadcastReceiver.PendingResult pendingResult =
                 new BroadcastReceiver.PendingResult(Activity.RESULT_OK,
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/TextAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/TextAnimatorTest.kt
new file mode 100644
index 0000000..516d015
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/TextAnimatorTest.kt
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.keyguard
+
+import android.animation.ValueAnimator
+import android.graphics.Paint
+import android.testing.AndroidTestingRunner
+import android.text.Layout
+import android.text.StaticLayout
+import android.text.TextPaint
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.`when`
+import org.mockito.Mockito.inOrder
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.never
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+
+import kotlin.math.ceil
+
+private val PAINT = TextPaint().apply {
+    textSize = 32f
+}
+
+@RunWith(AndroidTestingRunner::class)
+@SmallTest
+class TextAnimatorTest : SysuiTestCase() {
+
+    private fun makeLayout(text: String, paint: TextPaint): Layout {
+        val width = ceil(Layout.getDesiredWidth(text, 0, text.length, paint)).toInt()
+        return StaticLayout.Builder.obtain(text, 0, text.length, paint, width).build()
+    }
+
+    @Test
+    fun testAnimationStarted() {
+        val layout = makeLayout("Hello, World", PAINT)
+        val valueAnimator = mock(ValueAnimator::class.java)
+        val textInterpolator = mock(TextInterpolator::class.java)
+        val paint = mock(Paint::class.java)
+        `when`(textInterpolator.targetPaint).thenReturn(paint)
+
+        val textAnimator = TextAnimator(layout, {}).apply {
+            this.textInterpolator = textInterpolator
+            this.animator = valueAnimator
+        }
+
+        textAnimator.setTextStyle(
+                weight = 400,
+                animate = true
+        )
+
+        // If animation is requested, the base state should be rebased and the target state should
+        // be updated.
+        val order = inOrder(textInterpolator)
+        order.verify(textInterpolator).rebase()
+        order.verify(textInterpolator).onTargetPaintModified()
+
+        // In case of animation, should not shape the base state since the animation should start
+        // from current state.
+        verify(textInterpolator, never()).onBasePaintModified()
+
+        // Then, animation should be started.
+        verify(valueAnimator, times(1)).start()
+    }
+
+    @Test
+    fun testAnimationNotStarted() {
+        val layout = makeLayout("Hello, World", PAINT)
+        val valueAnimator = mock(ValueAnimator::class.java)
+        val textInterpolator = mock(TextInterpolator::class.java)
+        val paint = mock(Paint::class.java)
+        `when`(textInterpolator.targetPaint).thenReturn(paint)
+
+        val textAnimator = TextAnimator(layout, {}).apply {
+            this.textInterpolator = textInterpolator
+            this.animator = valueAnimator
+        }
+
+        textAnimator.setTextStyle(
+                weight = 400,
+                animate = false
+        )
+
+        // If animation is not requested, the progress should be 1 which is end of animation and the
+        // base state is rebased to target state by calling rebase.
+        val order = inOrder(textInterpolator)
+        order.verify(textInterpolator).onTargetPaintModified()
+        order.verify(textInterpolator).progress = 1f
+        order.verify(textInterpolator).rebase()
+
+        // Then, animation start should not be called.
+        verify(valueAnimator, never()).start()
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/TextInterpolatorTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/TextInterpolatorTest.kt
new file mode 100644
index 0000000..65ffcfc
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/TextInterpolatorTest.kt
@@ -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.keyguard
+
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.testing.AndroidTestingRunner
+import android.text.Layout
+import android.text.StaticLayout
+import android.text.TextPaint
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.math.ceil
+
+private const val TEXT = "Hello, World."
+private const val BMP_WIDTH = 400
+private const val BMP_HEIGHT = 300
+
+private val PAINT = TextPaint().apply {
+    textSize = 32f
+}
+
+private val START_PAINT = TextPaint(PAINT).apply {
+    fontVariationSettings = "'wght' 400"
+}
+
+private val END_PAINT = TextPaint(PAINT).apply {
+    fontVariationSettings = "'wght' 700"
+}
+
+@RunWith(AndroidTestingRunner::class)
+@SmallTest
+class TextInterpolatorTest : SysuiTestCase() {
+
+    private fun makeLayout(text: String, paint: TextPaint): Layout {
+        val width = ceil(Layout.getDesiredWidth(text, 0, text.length, paint)).toInt()
+        return StaticLayout.Builder.obtain(text, 0, text.length, paint, width).build()
+    }
+
+    @Test
+    fun testStartState() {
+        val layout = makeLayout(TEXT, PAINT)
+
+        val interp = TextInterpolator(layout)
+        interp.basePaint.set(START_PAINT)
+        interp.onBasePaintModified()
+
+        interp.targetPaint.set(END_PAINT)
+        interp.onTargetPaintModified()
+
+        // Just after created TextInterpolator, it should have 0 progress.
+        assertThat(interp.progress).isEqualTo(0f)
+        val actual = interp.toBitmap(BMP_WIDTH, BMP_HEIGHT)
+        val expected = makeLayout(TEXT, START_PAINT).toBitmap(BMP_WIDTH, BMP_HEIGHT)
+
+        assertThat(expected.sameAs(actual)).isTrue()
+    }
+
+    @Test
+    fun testEndState() {
+        val layout = makeLayout(TEXT, PAINT)
+
+        val interp = TextInterpolator(layout)
+        interp.basePaint.set(START_PAINT)
+        interp.onBasePaintModified()
+
+        interp.targetPaint.set(END_PAINT)
+        interp.onTargetPaintModified()
+
+        interp.progress = 1f
+        val actual = interp.toBitmap(BMP_WIDTH, BMP_HEIGHT)
+        val expected = makeLayout(TEXT, END_PAINT).toBitmap(BMP_WIDTH, BMP_HEIGHT)
+
+        assertThat(expected.sameAs(actual)).isTrue()
+    }
+
+    @Test
+    fun testMiddleState() {
+        val layout = makeLayout(TEXT, PAINT)
+
+        val interp = TextInterpolator(layout)
+        interp.basePaint.set(START_PAINT)
+        interp.onBasePaintModified()
+
+        interp.targetPaint.set(END_PAINT)
+        interp.onTargetPaintModified()
+
+        // We cannot expect exact text layout of the middle position since we don't use text shaping
+        // result for the middle state for performance reason. Just check it is not equals to start
+        // end state.
+        interp.progress = 0.5f
+        val actual = interp.toBitmap(BMP_WIDTH, BMP_HEIGHT)
+        assertThat(actual.sameAs(makeLayout(TEXT, START_PAINT).toBitmap(BMP_WIDTH, BMP_HEIGHT)))
+                .isFalse()
+        assertThat(actual.sameAs(makeLayout(TEXT, END_PAINT).toBitmap(BMP_WIDTH, BMP_HEIGHT)))
+                .isFalse()
+    }
+
+    @Test
+    fun testRebase() {
+        val layout = makeLayout(TEXT, PAINT)
+
+        val interp = TextInterpolator(layout)
+        interp.basePaint.set(START_PAINT)
+        interp.onBasePaintModified()
+
+        interp.targetPaint.set(END_PAINT)
+        interp.onTargetPaintModified()
+
+        interp.progress = 0.5f
+        val expected = interp.toBitmap(BMP_WIDTH, BMP_HEIGHT)
+
+        // Rebase base state to the current state of progress 0.5.
+        interp.rebase()
+        assertThat(interp.progress).isEqualTo(0f)
+        val actual = interp.toBitmap(BMP_WIDTH, BMP_HEIGHT)
+
+        assertThat(expected.sameAs(actual)).isTrue()
+    }
+}
+
+private fun Layout.toBitmap(width: Int, height: Int) =
+        Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8).also { draw(Canvas(it)) }!!
+
+private fun TextInterpolator.toBitmap(width: Int, height: Int) =
+        Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8).also { draw(Canvas(it)) }
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceViewTest.java
index b907cdb..043bd5c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceViewTest.java
@@ -50,8 +50,12 @@
     private TestableFaceView mFaceView;
 
     @Mock private Button mNegativeButton;
-    @Mock private Button mPositiveButton;
+    @Mock private Button mCancelButton;
+    @Mock private Button mUseCredentialButton;
+
+    @Mock private Button mConfirmButton;
     @Mock private Button mTryAgainButton;
+
     @Mock private TextView mErrorView;
 
     @Before
@@ -60,9 +64,14 @@
         mFaceView = new TestableFaceView(mContext);
         mFaceView.mIconController = mock(TestableFaceView.TestableIconController.class);
         mFaceView.setCallback(mCallback);
+
         mFaceView.mNegativeButton = mNegativeButton;
-        mFaceView.mPositiveButton = mPositiveButton;
+        mFaceView.mCancelButton = mCancelButton;
+        mFaceView.mUseCredentialButton = mUseCredentialButton;
+
+        mFaceView.mConfirmButton = mConfirmButton;
         mFaceView.mTryAgainButton = mTryAgainButton;
+
         mFaceView.mIndicatorView = mErrorView;
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java
index e2517f2..49282ee 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java
@@ -60,8 +60,12 @@
     @Mock private AuthPanelController mPanelController;
 
     @Mock private Button mNegativeButton;
+    @Mock private Button mCancelButton;
+    @Mock private Button mUseCredentialButton;
+
     @Mock private Button mPositiveButton;
     @Mock private Button mTryAgainButton;
+
     @Mock private TextView mTitleView;
     @Mock private TextView mSubtitleView;
     @Mock private TextView mDescriptionView;
@@ -89,15 +93,31 @@
 
     @Test
     public void testOnAuthenticationSucceeded_confirmationRequired_updatesDialogContents() {
-        initDialog(mContext, false /* allowDeviceCredential */, mCallback, new MockInjector());
+        final Button negativeButton = new Button(mContext);
+        final Button cancelButton = new Button(mContext);
+        initDialog(mContext, false /* allowDeviceCredential */, mCallback, new MockInjector() {
+            @Override
+            public Button getNegativeButton() {
+                return negativeButton;
+            }
+
+            @Override
+            public Button getCancelButton() {
+                return cancelButton;
+            }
+        });
 
         mBiometricView.setRequireConfirmation(true);
         mBiometricView.onAuthenticationSucceeded();
         waitForIdleSync();
         assertEquals(AuthBiometricView.STATE_PENDING_CONFIRMATION, mBiometricView.mState);
         verify(mCallback, never()).onAction(anyInt());
-        verify(mBiometricView.mNegativeButton).setText(eq(R.string.cancel));
-        verify(mBiometricView.mPositiveButton).setEnabled(eq(true));
+
+        assertEquals(View.GONE, negativeButton.getVisibility());
+        assertEquals(View.VISIBLE, cancelButton.getVisibility());
+        assertTrue(cancelButton.isEnabled());
+
+        verify(mBiometricView.mConfirmButton).setEnabled(eq(true));
         verify(mIndicatorView).setText(eq(R.string.biometric_dialog_tap_confirm));
         verify(mIndicatorView).setVisibility(eq(View.VISIBLE));
     }
@@ -107,7 +127,7 @@
         Button button = new Button(mContext);
         initDialog(mContext, false /* allowDeviceCredential */, mCallback, new MockInjector() {
            @Override
-            public Button getPositiveButton() {
+            public Button getConfirmButton() {
                return button;
            }
         });
@@ -137,18 +157,26 @@
     }
 
     @Test
-    public void testNegativeButton_whenPendingConfirmation_sendsActionUserCanceled() {
-        Button button = new Button(mContext);
+    public void testCancelButton_whenPendingConfirmation_sendsActionUserCanceled() {
+        Button cancelButton = new Button(mContext);
+        Button negativeButton = new Button(mContext);
         initDialog(mContext, false /* allowDeviceCredential */, mCallback, new MockInjector() {
             @Override
             public Button getNegativeButton() {
-                return button;
+                return negativeButton;
+            }
+            @Override
+            public Button getCancelButton() {
+                return cancelButton;
             }
         });
 
         mBiometricView.setRequireConfirmation(true);
         mBiometricView.onAuthenticationSucceeded();
-        button.performClick();
+
+        assertEquals(View.GONE, negativeButton.getVisibility());
+
+        cancelButton.performClick();
         waitForIdleSync();
 
         verify(mCallback).onAction(AuthBiometricView.Callback.ACTION_USER_CANCELED);
@@ -282,16 +310,23 @@
     }
 
     @Test
-    public void testNegativeButton_whenDeviceCredentialAllowed() {
-        Button negativeButton = new Button(mContext);
+    public void testCredentialButton_whenDeviceCredentialAllowed() {
+        final Button negativeButton = new Button(mContext);
+        final Button useCredentialButton = new Button(mContext);
         initDialog(mContext, true /* allowDeviceCredential */, mCallback, new MockInjector() {
             @Override
             public Button getNegativeButton() {
                 return negativeButton;
             }
+
+            @Override
+            public Button getUseCredentialButton() {
+                return useCredentialButton;
+            }
         });
 
-        negativeButton.performClick();
+        assertEquals(View.GONE, negativeButton.getVisibility());
+        useCredentialButton.performClick();
         waitForIdleSync();
 
         verify(mCallback).onAction(AuthBiometricView.Callback.ACTION_USE_DEVICE_CREDENTIAL);
@@ -361,7 +396,17 @@
         }
 
         @Override
-        public Button getPositiveButton() {
+        public Button getCancelButton() {
+            return mCancelButton;
+        }
+
+        @Override
+        public Button getUseCredentialButton() {
+            return mUseCredentialButton;
+        }
+
+        @Override
+        public Button getConfirmButton() {
             return mPositiveButton;
         }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
index 42bb005..ec0aa4c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
@@ -22,7 +22,6 @@
 import static junit.framework.Assert.assertNull;
 
 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;
@@ -513,30 +512,6 @@
         verify(mUdfpsController).onCancelAodInterrupt();
     }
 
-    @Test
-    public void testOnFullyShown_DelegatesToUdfpsController() {
-        mAuthController.onFullyShown();
-        verify(mUdfpsController).setBouncerVisibility(eq(true));
-    }
-
-    @Test
-    public void testOnFullyHidden_DelegatesToUdfpsController() {
-        mAuthController.onFullyHidden();
-        verify(mUdfpsController).setBouncerVisibility(eq(false));
-    }
-
-    @Test
-    public void testOnStartingToShow_NeverDelegatesToUdfpsController() {
-        mAuthController.onStartingToShow();
-        verify(mUdfpsController).setBouncerVisibility(eq(true));
-    }
-
-    @Test
-    public void testOnStartingToHide_NeverDelegatesToUdfpsController() {
-        mAuthController.onStartingToHide();
-        verify(mUdfpsController, never()).setBouncerVisibility(anyBoolean());
-    }
-
     // Helpers
 
     private void showDialog(int[] sensorIds, boolean credentialAllowed) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index 82ffd46..648c319 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -21,7 +21,6 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyFloat;
 import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -90,6 +89,7 @@
     private WindowManager mWindowManager;
     @Mock
     private StatusBarStateController mStatusBarStateController;
+
     private FakeSettings mSystemSettings;
     private FakeExecutor mFgExecutor;
 
@@ -173,41 +173,6 @@
     }
 
     @Test
-    public void showUdfpsOverlay_bouncerShowing() throws RemoteException {
-        // GIVEN that the bouncer is showing
-        mUdfpsController.setBouncerVisibility(/* isShowing */ true);
-        // WHEN a request to show the overlay is received
-        mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID);
-        mFgExecutor.runAllReady();
-        // THEN the overlay is not attached
-        verify(mWindowManager, never()).addView(eq(mUdfpsView), any());
-    }
-
-    @Test
-    public void setBouncerVisibility_overlayDetached() throws RemoteException {
-        // GIVEN that the overlay has been requested
-        mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID);
-        // WHEN the bouncer becomes visible
-        mUdfpsController.setBouncerVisibility(/* isShowing */ true);
-        mFgExecutor.runAllReady();
-        // THEN the overlay is detached
-        verify(mWindowManager).removeView(eq(mUdfpsView));
-    }
-
-    @Test
-    public void setBouncerVisibility_overlayAttached() throws RemoteException {
-        // GIVEN that the bouncer is visible
-        mUdfpsController.setBouncerVisibility(/* isShowing */ true);
-        // AND the overlay has been requested
-        mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID);
-        // WHEN the bouncer is closed
-        mUdfpsController.setBouncerVisibility(/* isShowing */ false);
-        mFgExecutor.runAllReady();
-        // THEN the overlay is attached
-        verify(mWindowManager).addView(eq(mUdfpsView), any());
-    }
-
-    @Test
     public void fingerDown() throws RemoteException {
         // Configure UdfpsView to accept the ACTION_DOWN event
         when(mUdfpsView.isScrimShowing()).thenReturn(false);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
index 8ceebeb..3e44fa4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.systemui.people.widget;
 
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
+
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
@@ -26,8 +28,10 @@
 
 import static java.util.Objects.requireNonNull;
 
+import android.app.NotificationChannel;
 import android.content.Context;
 import android.os.RemoteException;
+import android.os.UserHandle;
 import android.testing.AndroidTestingRunner;
 
 import androidx.test.filters.SmallTest;
@@ -56,6 +60,10 @@
 
     private static final String TEST_PACKAGE_A = "com.test.package_a";
     private static final String TEST_PACKAGE_B = "com.test.package_b";
+    private static final String TEST_CHANNEL_ID = "channel_id";
+    private static final String TEST_CHANNEL_NAME = "channel_name";
+    private static final String TEST_PARENT_CHANNEL_ID = "parent_channel_id";
+    private static final String TEST_CONVERSATION_ID = "conversation_id";
 
     private PeopleSpaceWidgetManager mManager;
 
@@ -100,7 +108,7 @@
     }
 
     @Test
-    public void testNotifyAppWidgetIfWidgets() throws RemoteException {
+    public void testNotifyAppWidgetIfNotificationPosted() throws RemoteException {
         int[] widgetIdsArray = {1};
         when(mIAppWidgetService.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
 
@@ -117,7 +125,7 @@
     }
 
     @Test
-    public void testNotifyAppWidgetTwiceIfTwoNotifications() throws RemoteException {
+    public void testNotifyAppWidgetTwiceIfTwoNotificationsPosted() throws RemoteException {
         int[] widgetIdsArray = {1, 2};
         when(mIAppWidgetService.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
 
@@ -149,4 +157,40 @@
         verify(mIAppWidgetService, times(2))
                 .notifyAppWidgetViewDataChanged(any(), eq(widgetIdsArray), anyInt());
     }
+
+    @Test
+    public void testDoNotNotifyAppWidgetIfNonConversationChannelModified() throws RemoteException {
+        int[] widgetIdsArray = {1};
+        when(mIAppWidgetService.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
+
+        NotificationChannel channel =
+                mNoMan.createNotificationChannel(TEST_CHANNEL_ID, TEST_CHANNEL_NAME);
+
+        mNoMan.issueChannelModification(TEST_PACKAGE_A,
+                UserHandle.getUserHandleForUid(0), channel, IMPORTANCE_HIGH);
+        mClock.advanceTime(MIN_LINGER_DURATION);
+
+        verify(mIAppWidgetService, never()).getAppWidgetIds(any());
+        verify(mIAppWidgetService, never()).notifyAppWidgetViewDataChanged(any(), any(), anyInt());
+
+    }
+
+    @Test
+    public void testNotifyAppWidgetIfConversationChannelModified() throws RemoteException {
+        int[] widgetIdsArray = {1};
+        when(mIAppWidgetService.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
+
+        NotificationChannel channel =
+                mNoMan.createNotificationChannel(TEST_CHANNEL_ID, TEST_CHANNEL_NAME);
+        channel.setConversationId(TEST_PARENT_CHANNEL_ID, TEST_CONVERSATION_ID);
+
+        mNoMan.issueChannelModification(TEST_PACKAGE_A,
+                UserHandle.getUserHandleForUid(0), channel, IMPORTANCE_HIGH);
+        mClock.advanceTime(MIN_LINGER_DURATION);
+
+        verify(mIAppWidgetService, times(1)).getAppWidgetIds(any());
+        verify(mIAppWidgetService, times(1))
+                .notifyAppWidgetViewDataChanged(any(), eq(widgetIdsArray), anyInt());
+
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
index 858ecdc..a6b0330 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
@@ -43,6 +43,7 @@
 import com.android.systemui.SysuiBaseFragmentTest;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.dump.DumpManager;
+import com.android.systemui.media.MediaHost;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.qs.dagger.QSFragmentComponent;
 import com.android.systemui.qs.logging.QSLogger;
@@ -82,6 +83,10 @@
     private QSFragmentComponent mQsFragmentComponent;
     @Mock
     private QSPanelController mQSPanelController;
+    @Mock
+    private MediaHost mQSMediaHost;
+    @Mock
+    private MediaHost mQQSMediaHost;
 
     public QSFragmentTest() {
         super(QSFragment.class);
@@ -168,6 +173,8 @@
                 mock(StatusBarStateController.class),
                 commandQueue,
                 new QSDetailDisplayer(),
+                mQSMediaHost,
+                mQQSMediaHost,
                 mQsComponentFactory);
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
index 9421cd0..0fe44ad 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
@@ -86,13 +86,17 @@
     private QSPanelControllerBase<QSPanel> mController;
 
     /** Implementation needed to ensure we have a reflectively-available class name. */
-    private static class TestableQSPanelControllerBase extends QSPanelControllerBase<QSPanel> {
+    private class TestableQSPanelControllerBase extends QSPanelControllerBase<QSPanel> {
         protected TestableQSPanelControllerBase(QSPanel view, QSTileHost host,
-                QSCustomizerController qsCustomizerController,
-                QSTileRevealController.Factory qsTileRevealControllerFactory,
+                QSCustomizerController qsCustomizerController, MediaHost mediaHost,
                 MetricsLogger metricsLogger, UiEventLogger uiEventLogger, DumpManager dumpManager) {
-            super(view, host, qsCustomizerController, qsTileRevealControllerFactory, metricsLogger,
-                    uiEventLogger, dumpManager);
+            super(view, host, qsCustomizerController, mediaHost,
+                    metricsLogger, uiEventLogger, dumpManager);
+        }
+
+        @Override
+        protected QSTileRevealController createTileRevealController() {
+            return mQSTileRevealController;
         }
     }
 
@@ -100,7 +104,6 @@
     public void setup() throws Exception {
         MockitoAnnotations.initMocks(this);
 
-        when(mQSPanel.getMediaHost()).thenReturn(mMediaHost);
         when(mQSPanel.isAttachedToWindow()).thenReturn(true);
         when(mQSPanel.getDumpableTag()).thenReturn("QSPanel");
         when(mQSPanel.openPanelEvent()).thenReturn(QSEvent.QS_PANEL_EXPANDED);
@@ -108,11 +111,11 @@
         when(mQSPanel.createRegularTileLayout()).thenReturn(mPagedTileLayout);
         when(mQSTileHost.getTiles()).thenReturn(Collections.singleton(mQSTile));
         when(mQSTileHost.createTileView(eq(mQSTile), anyBoolean())).thenReturn(mQSTileView);
-        when(mQSTileRevealControllerFactory.create(any())).thenReturn(mQSTileRevealController);
+        when(mQSTileRevealControllerFactory.create(any(), any()))
+                .thenReturn(mQSTileRevealController);
 
         mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost,
-                mQSCustomizerController, mQSTileRevealControllerFactory, mMetricsLogger,
-                mUiEventLogger, mDumpManager);
+                mQSCustomizerController, mMediaHost, mMetricsLogger, mUiEventLogger, mDumpManager);
 
         mController.init();
         reset(mQSTileRevealController);
@@ -122,9 +125,14 @@
     public void testSetRevealExpansion_preAttach() {
         mController.onViewDetached();
 
-        QSPanelControllerBase<QSPanel> controller = new TestableQSPanelControllerBase(mQSPanel,
-                mQSTileHost, mQSCustomizerController, mQSTileRevealControllerFactory,
-                mMetricsLogger, mUiEventLogger, mDumpManager);
+        QSPanelControllerBase<QSPanel> controller = new QSPanelControllerBase<QSPanel>(
+                mQSPanel, mQSTileHost, mQSCustomizerController, mMediaHost, mMetricsLogger,
+                mUiEventLogger, mDumpManager) {
+            @Override
+            protected QSTileRevealController createTileRevealController() {
+                return mQSTileRevealController;
+            }
+        };
 
         // Nothing happens until attached
         controller.setRevealExpansion(0);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
index f57e3c2..9090b9b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
@@ -41,6 +41,7 @@
 import com.android.systemui.settings.brightness.BrightnessSlider;
 import com.android.systemui.settings.brightness.ToggleSlider;
 import com.android.systemui.tuner.TunerService;
+import com.android.systemui.util.animation.DisappearParameters;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -97,7 +98,6 @@
     public void setup() throws Exception {
         MockitoAnnotations.initMocks(this);
 
-        when(mQSPanel.getMediaHost()).thenReturn(mMediaHost);
         when(mQSPanel.isAttachedToWindow()).thenReturn(true);
         when(mQSPanel.getDumpableTag()).thenReturn("QSPanel");
         when(mQSPanel.createRegularTileLayout()).thenReturn(mPagedTileLayout);
@@ -107,11 +107,13 @@
                 .thenReturn(mBrightnessSlider);
         when(mBrightnessControllerFactory.create(any(ToggleSlider.class)))
                 .thenReturn(mBrightnessController);
-        when(mQSTileRevealControllerFactory.create(any())).thenReturn(mQSTileRevealController);
+        when(mQSTileRevealControllerFactory.create(any(), any()))
+                .thenReturn(mQSTileRevealController);
+        when(mMediaHost.getDisappearParameters()).thenReturn(new DisappearParameters());
 
         mController = new QSPanelController(mQSPanel, mQSSecurityFooter, mTunerService,
-                mQSTileHost, mQSCustomizerController, mQSTileRevealControllerFactory, mDumpManager,
-                mMetricsLogger, mUiEventLogger, mBrightnessControllerFactory,
+                mQSTileHost, mQSCustomizerController, mMediaHost, mQSTileRevealControllerFactory,
+                mDumpManager, mMetricsLogger, mUiEventLogger, mBrightnessControllerFactory,
                 mToggleSliderViewControllerFactory);
 
         mController.init();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
index c82aee4..6fa6f31 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
@@ -23,8 +23,9 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.content.Context;
 import android.content.pm.UserInfo;
+import android.os.Handler;
+import android.os.Looper;
 import android.provider.Settings;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
@@ -38,16 +39,18 @@
 import android.view.ViewGroup;
 import android.widget.TextView;
 
-import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.settings.UserTracker;
 import com.android.systemui.statusbar.policy.SecurityController;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
 import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
 
 /*
  * Compile and run the whole SystemUI test suite:
@@ -73,22 +76,23 @@
     private TextView mFooterText;
     private TestableImageView mFooterIcon;
     private QSSecurityFooter mFooter;
-    private SecurityController mSecurityController = mock(SecurityController.class);
+    @Mock
+    private SecurityController mSecurityController;
+    @Mock
     private UserTracker mUserTracker;
+    @Mock
+    private ActivityStarter mActivityStarter;
 
     @Before
     public void setUp() {
-        mDependency.injectTestDependency(SecurityController.class, mSecurityController);
-        mDependency.injectTestDependency(Dependency.BG_LOOPER,
-                TestableLooper.get(this).getLooper());
-        mUserTracker = mock(UserTracker.class);
+        MockitoAnnotations.initMocks(this);
+        Looper looper = TestableLooper.get(this).getLooper();
         when(mUserTracker.getUserInfo()).thenReturn(mock(UserInfo.class));
-        mContext.addMockSystemService(Context.LAYOUT_INFLATER_SERVICE,
-                new LayoutInflaterBuilder(mContext)
-                        .replace("ImageView", TestableImageView.class)
-                        .build());
-        mFooter = new QSSecurityFooter(null, mContext, mUserTracker);
-        mRootView = (ViewGroup) mFooter.getView();
+        mRootView = (ViewGroup) new LayoutInflaterBuilder(mContext)
+                .replace("ImageView", TestableImageView.class)
+                .build().inflate(R.layout.quick_settings_footer, null, false);
+        mFooter = new QSSecurityFooter(mRootView, mContext, mUserTracker, new Handler(looper),
+                mActivityStarter, mSecurityController, looper);
         mFooterText = mRootView.findViewById(R.id.footer_text);
         mFooterIcon = mRootView.findViewById(R.id.footer_icon);
         mFooter.setHostEnvironment(null);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt
index 26b5d26..d1cc757 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt
@@ -21,6 +21,7 @@
 import android.view.View
 import androidx.test.filters.SmallTest
 import com.android.internal.logging.UiEventLogger
+import com.android.systemui.colorextraction.SysuiColorExtractor
 import com.android.systemui.R
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.demomode.DemoModeController
@@ -89,6 +90,8 @@
     @Mock
     private lateinit var privacyLogger: PrivacyLogger
     @Mock
+    private lateinit var colorExtractor: SysuiColorExtractor
+    @Mock
     private lateinit var iconContainer: StatusIconContainer
     @Mock
     private lateinit var qsCarrierGroup: QSCarrierGroup
@@ -127,7 +130,8 @@
                 userTracker,
                 quickQSPanelController,
                 qsCarrierGroupControllerBuilder,
-                privacyLogger
+                privacyLogger,
+                colorExtractor
         )
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java
new file mode 100644
index 0000000..78af20f
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.tiles;
+
+import static junit.framework.Assert.assertEquals;
+
+import static org.mockito.Mockito.when;
+
+import android.os.Handler;
+import android.provider.Settings;
+import android.service.quicksettings.Tile;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.qs.QSTileHost;
+import com.android.systemui.qs.logging.QSLogger;
+import com.android.systemui.settings.UserTracker;
+import com.android.systemui.util.settings.FakeSettings;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+@SmallTest
+public class ReduceBrightColorsTileTest extends SysuiTestCase {
+    @Mock
+    private QSTileHost mHost;
+    @Mock
+    private MetricsLogger mMetricsLogger;
+    @Mock
+    private StatusBarStateController mStatusBarStateController;
+    @Mock
+    private ActivityStarter mActivityStarter;
+    @Mock
+    private QSLogger mQSLogger;
+    @Mock
+    private UserTracker mUserTracker;
+
+    private FakeSettings mFakeSettings;
+    private TestableLooper mTestableLooper;
+    private ReduceBrightColorsTile mTile;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+
+        mTestableLooper = TestableLooper.get(this);
+
+        when(mHost.getContext()).thenReturn(mContext);
+        mFakeSettings = new FakeSettings();
+
+        mTile = new ReduceBrightColorsTile(
+                mHost,
+                mTestableLooper.getLooper(),
+                new Handler(mTestableLooper.getLooper()),
+                mMetricsLogger,
+                mStatusBarStateController,
+                mActivityStarter,
+                mQSLogger,
+                mUserTracker,
+                mFakeSettings
+        );
+    }
+
+    @Test
+    public void testNotActive() {
+        mTile.refreshState();
+        mTestableLooper.processAllMessages();
+
+        assertEquals(Tile.STATE_INACTIVE, mTile.getState().state);
+        assertEquals(mTile.getState().label.toString(),
+                mContext.getString(R.string.quick_settings_reduce_bright_colors_label));
+        assertEquals(mTile.getState().secondaryLabel.toString(), "");
+    }
+
+    @Test
+    public void testActive() {
+        mFakeSettings.putIntForUser(
+                Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED,
+                1,
+                mUserTracker.getUserId());
+        mTile.refreshState();
+        mTestableLooper.processAllMessages();
+
+        assertActiveState();
+    }
+
+    @Test
+    public void testActive_clicked_isActive() {
+        mTile.refreshState();
+        mTestableLooper.processAllMessages();
+        // Validity check
+        assertEquals(Tile.STATE_INACTIVE, mTile.getState().state);
+
+        mTile.handleClick();
+        mTile.refreshState();
+        mTestableLooper.processAllMessages();
+
+        assertActiveState();
+    }
+
+    private void assertActiveState() {
+        assertEquals(Tile.STATE_ACTIVE, mTile.getState().state);
+        assertEquals(mTile.getState().label.toString(),
+                mContext.getString(R.string.quick_settings_reduce_bright_colors_label));
+
+        final int intensity = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+                Settings.Secure.REDUCE_BRIGHT_COLORS_LEVEL, 0, mUserTracker.getUserId());
+
+        assertEquals(
+                mContext.getString(
+                        R.string.quick_settings_reduce_bright_colors_secondary_label, intensity),
+                mTile.getState().secondaryLabel.toString());
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NoManSimulator.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NoManSimulator.java
index c113df0b..1bfe10c5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NoManSimulator.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NoManSimulator.java
@@ -16,8 +16,12 @@
 
 package com.android.systemui.statusbar.notification.collection;
 
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+
 import static org.junit.Assert.assertNotNull;
 
+import android.app.NotificationChannel;
+import android.os.UserHandle;
 import android.service.notification.NotificationListenerService.Ranking;
 import android.service.notification.NotificationListenerService.RankingMap;
 import android.service.notification.StatusBarNotification;
@@ -72,6 +76,17 @@
         }
     }
 
+    public NotificationChannel createNotificationChannel(String id, String name) {
+        return new NotificationChannel(id, name, IMPORTANCE_DEFAULT);
+    }
+
+    public void issueChannelModification(
+            String pkg, UserHandle user, NotificationChannel channel, int modificationType) {
+        for (NotificationHandler listener : mListeners) {
+            listener.onNotificationChannelModified(pkg, user, channel, modificationType);
+        }
+    }
+
     public void setRanking(String key, Ranking ranking) {
         mRankings.put(key, ranking);
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
index 4fb45ec..1b05ad7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
@@ -50,7 +50,6 @@
 import com.android.keyguard.dagger.KeyguardBouncerComponent;
 import com.android.systemui.DejankUtils;
 import com.android.systemui.SysuiTestCase;
-import com.android.systemui.biometrics.AuthController;
 import com.android.systemui.keyguard.DismissCallbackRegistry;
 import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
 import com.android.systemui.plugins.FalsingManager;
@@ -79,8 +78,6 @@
     @Mock
     private DismissCallbackRegistry mDismissCallbackRegistry;
     @Mock
-    private AuthController mAuthController;
-    @Mock
     private KeyguardHostViewController mKeyguardHostViewController;
     @Mock
     private KeyguardBouncer.BouncerExpansionCallback mExpansionCallback;
@@ -131,7 +128,7 @@
 
         final ViewGroup container = new FrameLayout(getContext());
         mBouncer = new KeyguardBouncer.Factory(getContext(), mViewMediatorCallback,
-                mDismissCallbackRegistry, mFalsingManager, mAuthController,
+                mDismissCallbackRegistry, mFalsingManager,
                 mKeyguardStateController, mKeyguardUpdateMonitor,
                 mKeyguardBypassController, mHandler, mKeyguardSecurityModel,
                 mKeyguardBouncerComponentFactory)
@@ -210,12 +207,6 @@
     }
 
     @Test
-    public void testShow_notifiesAuthControllerStartingToShow() {
-        mBouncer.show(/* resetSecuritySelection */ false);
-        verify(mAuthController).onStartingToShow();
-    }
-
-    @Test
     public void testSetExpansion_notifiesFalsingManager() {
         mBouncer.ensureView();
         mBouncer.setExpansion(0.5f);
@@ -246,38 +237,6 @@
     }
 
     @Test
-    public void testSetExpansion_notifiesAuthControllerFullyShown() {
-        mBouncer.ensureView();
-        mBouncer.setExpansion(0.1f);
-        mBouncer.setExpansion(0f);
-        verify(mAuthController).onFullyShown();
-    }
-
-    @Test
-    public void testSetExpansion_notifiesAuthControllerStartingToHide() {
-        mBouncer.ensureView();
-        mBouncer.setExpansion(0f);
-        mBouncer.setExpansion(0.1f);
-        verify(mAuthController).onStartingToHide();
-    }
-
-    @Test
-    public void testSetExpansion_notifiesAuthControllerFullyHidden() {
-        mBouncer.ensureView();
-        mBouncer.setExpansion(0.9f);
-        mBouncer.setExpansion(1f);
-        verify(mAuthController).onFullyHidden();
-    }
-
-    @Test
-    public void testSetExpansion_negativeAuthControllerStartingToShow() {
-        mBouncer.ensureView();
-        mBouncer.setExpansion(1f);
-        mBouncer.setExpansion(0.9f);
-        verify(mAuthController, never()).onStartingToShow();
-    }
-
-    @Test
     public void testHide_notifiesFalsingManager() {
         mBouncer.hide(false);
         verify(mFalsingManager).onBouncerHidden();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayApplierTest.java
similarity index 85%
rename from packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayManagerTest.java
rename to packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayApplierTest.java
index c99deb6..edaff5f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayApplierTest.java
@@ -15,22 +15,24 @@
  */
 package com.android.systemui.theme;
 
-import static com.android.systemui.theme.ThemeOverlayManager.ANDROID_PACKAGE;
-import static com.android.systemui.theme.ThemeOverlayManager.OVERLAY_CATEGORY_COLOR;
-import static com.android.systemui.theme.ThemeOverlayManager.OVERLAY_CATEGORY_FONT;
-import static com.android.systemui.theme.ThemeOverlayManager.OVERLAY_CATEGORY_ICON_ANDROID;
-import static com.android.systemui.theme.ThemeOverlayManager.OVERLAY_CATEGORY_ICON_LAUNCHER;
-import static com.android.systemui.theme.ThemeOverlayManager.OVERLAY_CATEGORY_ICON_SETTINGS;
-import static com.android.systemui.theme.ThemeOverlayManager.OVERLAY_CATEGORY_ICON_SYSUI;
-import static com.android.systemui.theme.ThemeOverlayManager.OVERLAY_CATEGORY_ICON_THEME_PICKER;
-import static com.android.systemui.theme.ThemeOverlayManager.OVERLAY_CATEGORY_SHAPE;
-import static com.android.systemui.theme.ThemeOverlayManager.SETTINGS_PACKAGE;
-import static com.android.systemui.theme.ThemeOverlayManager.SYSTEM_USER_CATEGORIES;
-import static com.android.systemui.theme.ThemeOverlayManager.SYSUI_PACKAGE;
-import static com.android.systemui.theme.ThemeOverlayManager.THEME_CATEGORIES;
+import static com.android.systemui.theme.ThemeOverlayApplier.ANDROID_PACKAGE;
+import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_ACCENT_COLOR;
+import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_FONT;
+import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_ICON_ANDROID;
+import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_ICON_LAUNCHER;
+import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_ICON_SETTINGS;
+import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_ICON_SYSUI;
+import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_ICON_THEME_PICKER;
+import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_SHAPE;
+import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_SYSTEM_PALETTE;
+import static com.android.systemui.theme.ThemeOverlayApplier.SETTINGS_PACKAGE;
+import static com.android.systemui.theme.ThemeOverlayApplier.SYSTEM_USER_CATEGORIES;
+import static com.android.systemui.theme.ThemeOverlayApplier.SYSUI_PACKAGE;
+import static com.android.systemui.theme.ThemeOverlayApplier.THEME_CATEGORIES;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -44,6 +46,7 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.dump.DumpManager;
 
 import com.google.android.collect.Maps;
 import com.google.common.collect.Lists;
@@ -63,7 +66,7 @@
 @SmallTest
 @RunWith(AndroidTestingRunner.class)
 @TestableLooper.RunWithLooper
-public class ThemeOverlayManagerTest extends SysuiTestCase {
+public class ThemeOverlayApplierTest extends SysuiTestCase {
     private static final String TEST_DISABLED_PREFIX = "com.example.";
     private static final String TEST_ENABLED_PREFIX = "com.example.enabled.";
 
@@ -82,26 +85,32 @@
 
     @Mock
     OverlayManager mOverlayManager;
+    @Mock
+    DumpManager mDumpManager;
 
-    private ThemeOverlayManager mManager;
+    private ThemeOverlayApplier mManager;
 
     @Before
     public void setup() throws Exception {
         MockitoAnnotations.initMocks(this);
-        mManager = new ThemeOverlayManager(mOverlayManager, MoreExecutors.directExecutor(),
-                LAUNCHER_PACKAGE, THEMEPICKER_PACKAGE);
+        mManager = new ThemeOverlayApplier(mOverlayManager, MoreExecutors.directExecutor(),
+                LAUNCHER_PACKAGE, THEMEPICKER_PACKAGE, mDumpManager);
         when(mOverlayManager.getOverlayInfosForTarget(ANDROID_PACKAGE, UserHandle.SYSTEM))
                 .thenReturn(Lists.newArrayList(
-                        createOverlayInfo(TEST_DISABLED_PREFIX + OVERLAY_CATEGORY_COLOR,
-                                ANDROID_PACKAGE, OVERLAY_CATEGORY_COLOR, false),
+                        createOverlayInfo(TEST_DISABLED_PREFIX + OVERLAY_CATEGORY_ACCENT_COLOR,
+                                ANDROID_PACKAGE, OVERLAY_CATEGORY_ACCENT_COLOR, false),
+                        createOverlayInfo(TEST_DISABLED_PREFIX + OVERLAY_CATEGORY_SYSTEM_PALETTE,
+                                ANDROID_PACKAGE, OVERLAY_CATEGORY_SYSTEM_PALETTE, false),
                         createOverlayInfo(TEST_DISABLED_PREFIX + OVERLAY_CATEGORY_FONT,
                                 ANDROID_PACKAGE, OVERLAY_CATEGORY_FONT, false),
                         createOverlayInfo(TEST_DISABLED_PREFIX + OVERLAY_CATEGORY_SHAPE,
                                 ANDROID_PACKAGE, OVERLAY_CATEGORY_SHAPE, false),
                         createOverlayInfo(TEST_DISABLED_PREFIX + OVERLAY_CATEGORY_ICON_ANDROID,
                                 ANDROID_PACKAGE, OVERLAY_CATEGORY_ICON_ANDROID, false),
-                        createOverlayInfo(TEST_ENABLED_PREFIX + OVERLAY_CATEGORY_COLOR,
-                                ANDROID_PACKAGE, OVERLAY_CATEGORY_COLOR, true),
+                        createOverlayInfo(TEST_ENABLED_PREFIX + OVERLAY_CATEGORY_ACCENT_COLOR,
+                                ANDROID_PACKAGE, OVERLAY_CATEGORY_ACCENT_COLOR, true),
+                        createOverlayInfo(TEST_ENABLED_PREFIX + OVERLAY_CATEGORY_SYSTEM_PALETTE,
+                                ANDROID_PACKAGE, OVERLAY_CATEGORY_SYSTEM_PALETTE, true),
                         createOverlayInfo(TEST_ENABLED_PREFIX + OVERLAY_CATEGORY_FONT,
                                 ANDROID_PACKAGE, OVERLAY_CATEGORY_FONT, true),
                         createOverlayInfo(TEST_ENABLED_PREFIX + OVERLAY_CATEGORY_SHAPE,
@@ -132,6 +141,8 @@
                                 THEMEPICKER_PACKAGE, OVERLAY_CATEGORY_ICON_THEME_PICKER, false),
                         createOverlayInfo(TEST_ENABLED_PREFIX + OVERLAY_CATEGORY_ICON_THEME_PICKER,
                                 THEMEPICKER_PACKAGE, OVERLAY_CATEGORY_ICON_THEME_PICKER, true)));
+        clearInvocations(mOverlayManager);
+        verify(mDumpManager).registerDumpable(any(), any());
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java
new file mode 100644
index 0000000..aee8840
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.theme;
+
+import static com.android.systemui.theme.ThemeOverlayApplier.MONET_ACCENT_COLOR_PACKAGE;
+import static com.android.systemui.theme.ThemeOverlayApplier.MONET_SYSTEM_PALETTE_PACKAGE;
+import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_ACCENT_COLOR;
+import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_CATEGORY_SYSTEM_PALETTE;
+import static com.android.systemui.theme.ThemeOverlayController.USE_LOCK_SCREEN_WALLPAPER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.app.WallpaperColors;
+import android.app.WallpaperManager;
+import android.graphics.Color;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.testing.AndroidTestingRunner;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.dump.DumpManager;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.util.settings.SecureSettings;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executor;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+public class ThemeOverlayControllerTest extends SysuiTestCase {
+
+    private ThemeOverlayController mThemeOverlayController;
+    @Mock
+    private Executor mBgExecutor;
+    @Mock
+    private Executor mMainExecutor;
+    @Mock
+    private BroadcastDispatcher mBroadcastDispatcher;
+    @Mock
+    private Handler mBgHandler;
+    @Mock
+    private ThemeOverlayApplier mThemeOverlayApplier;
+    @Mock
+    private SecureSettings mSecureSettings;
+    @Mock
+    private WallpaperManager mWallpaperManager;
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private KeyguardStateController mKeyguardStateController;
+    @Mock
+    private DumpManager mDumpManager;
+    @Captor
+    private ArgumentCaptor<KeyguardStateController.Callback> mKeyguardStateControllerCallback;
+    @Captor
+    private ArgumentCaptor<WallpaperManager.OnColorsChangedListener> mColorsListener;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        mThemeOverlayController = new ThemeOverlayController(null /* context */,
+                mBroadcastDispatcher, mBgHandler, mMainExecutor, mBgExecutor, mThemeOverlayApplier,
+                mSecureSettings, mWallpaperManager, mUserManager, mKeyguardStateController,
+                mDumpManager);
+
+        mThemeOverlayController.start();
+        if (USE_LOCK_SCREEN_WALLPAPER) {
+            verify(mKeyguardStateController).addCallback(
+                    mKeyguardStateControllerCallback.capture());
+        }
+        verify(mWallpaperManager).addOnColorsChangedListener(mColorsListener.capture(), eq(null),
+                eq(UserHandle.USER_ALL));
+        verify(mDumpManager).registerDumpable(any(), any());
+
+        List<Integer> colorList = List.of(Color.RED, Color.BLUE);
+        when(mThemeOverlayApplier.getAvailableAccentColors()).thenReturn(colorList);
+        when(mThemeOverlayApplier.getAvailableSystemColors()).thenReturn(colorList);
+    }
+
+    @Test
+    public void start_checksWallpaper() {
+        ArgumentCaptor<Runnable> registrationRunnable = ArgumentCaptor.forClass(Runnable.class);
+        verify(mBgExecutor).execute(registrationRunnable.capture());
+
+        registrationRunnable.getValue().run();
+        verify(mWallpaperManager).getWallpaperColors(eq(WallpaperManager.FLAG_LOCK));
+        verify(mWallpaperManager).getWallpaperColors(eq(WallpaperManager.FLAG_SYSTEM));
+    }
+
+    @Test
+    public void onWallpaperColorsChanged_setsTheme() {
+        // Should ask for a new theme when wallpaper colors change
+        WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED),
+                Color.valueOf(Color.BLUE), null);
+        mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM);
+        ArgumentCaptor<Map<String, String>> themeOverlays = ArgumentCaptor.forClass(Map.class);
+
+        verify(mThemeOverlayApplier).getAvailableSystemColors();
+        verify(mThemeOverlayApplier).getAvailableAccentColors();
+        verify(mThemeOverlayApplier).applyCurrentUserOverlays(themeOverlays.capture(), any());
+
+        // 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());
+        assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_ACCENT_COLOR))
+                .isEqualTo(MONET_ACCENT_COLOR_PACKAGE
+                        + Integer.toHexString(Color.BLUE).toUpperCase());
+
+        // Should not ask again if changed to same value
+        mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM);
+        verifyNoMoreInteractions(mThemeOverlayApplier);
+    }
+
+    @Test
+    public void onWallpaperColorsChanged_preservesWallpaperPickerTheme() {
+        // Should ask for a new theme when wallpaper colors change
+        WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED),
+                Color.valueOf(Color.BLUE), null);
+
+        String jsonString =
+                "{\"android.theme.customization.system_palette\":\"override.package.name\"}";
+        when(mSecureSettings.getStringForUser(
+                eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), anyInt()))
+                .thenReturn(jsonString);
+
+        mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM);
+        ArgumentCaptor<Map<String, String>> themeOverlays = ArgumentCaptor.forClass(Map.class);
+
+        verify(mThemeOverlayApplier).getAvailableSystemColors();
+        verify(mThemeOverlayApplier).getAvailableAccentColors();
+        verify(mThemeOverlayApplier).applyCurrentUserOverlays(themeOverlays.capture(), any());
+
+        // Assert that we received the colors that we were expecting
+        assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_SYSTEM_PALETTE))
+                .isEqualTo("override.package.name");
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
index a46e563..230aeab 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -45,9 +45,6 @@
 import android.app.Notification;
 import android.app.PendingIntent;
 import android.content.pm.LauncherApps;
-import android.content.res.Configuration;
-import android.graphics.Insets;
-import android.graphics.Rect;
 import android.hardware.display.AmbientDisplayConfiguration;
 import android.hardware.face.FaceManager;
 import android.os.Handler;
@@ -99,7 +96,7 @@
 import com.android.wm.shell.bubbles.BubbleDataRepository;
 import com.android.wm.shell.bubbles.BubbleEntry;
 import com.android.wm.shell.bubbles.BubbleLogger;
-import com.android.wm.shell.bubbles.BubblePositioner;
+import com.android.wm.shell.bubbles.BubbleOverflow;
 import com.android.wm.shell.bubbles.BubbleStackView;
 import com.android.wm.shell.bubbles.Bubbles;
 import com.android.wm.shell.common.FloatingContentCoordinator;
@@ -206,8 +203,8 @@
     private WindowManagerShellWrapper mWindowManagerShellWrapper;
     @Mock
     private BubbleLogger mBubbleLogger;
-    @Mock
-    private BubblePositioner mPositioner;
+
+    private TestableBubblePositioner mPositioner;
 
     private BubbleData mBubbleData;
 
@@ -255,12 +252,8 @@
                 mSysUiStateBubblesExpanded =
                         (sysUiFlags & QuickStepContract.SYSUI_STATE_BUBBLES_EXPANDED) != 0);
 
-        mBubbleData = new BubbleData(mContext, mBubbleLogger);
-
-        Rect availableRect = new Rect(0, 0, 1000, 5000);
-        when(mPositioner.getAvailableRect()).thenReturn(availableRect);
-        when(mPositioner.getOrientation()).thenReturn(Configuration.ORIENTATION_PORTRAIT);
-        when(mPositioner.getInsets()).thenReturn(Insets.of(0, 0, 0, 0));
+        mPositioner = new TestableBubblePositioner(mContext, mWindowManager);
+        mBubbleData = new BubbleData(mContext, mBubbleLogger, mPositioner);
 
         TestableNotificationInterruptStateProviderImpl interruptionStateProvider =
                 new TestableNotificationInterruptStateProviderImpl(mContext.getContentResolver(),
@@ -585,7 +578,7 @@
     }
 
     @Test
-    public void testRemoveLastExpandedCollapses() {
+    public void testRemoveLastExpanded_selectsOverflow() {
         // Mark it as a bubble and add it explicitly
         mEntryListener.onPendingEntryAdded(mRow.getEntry());
         mEntryListener.onPendingEntryAdded(mRow2.getEntry());
@@ -625,10 +618,38 @@
                         stackView.getExpandedBubble().getKey()).getKey(),
                 Bubbles.DISMISS_USER_GESTURE);
 
-        // Make sure state changes and collapse happens
+        // Overflow should be selected
+        assertEquals(mBubbleData.getSelectedBubble().getKey(), BubbleOverflow.KEY);
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, BubbleOverflow.KEY);
+        assertTrue(mBubbleController.hasBubbles());
+        assertTrue(mSysUiStateBubblesExpanded);
+    }
+
+    @Test
+    public void testRemoveLastExpandedEmptyOverflow_collapses() {
+        // Mark it as a bubble and add it explicitly
+        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mBubbleController.updateBubble(mBubbleEntry);
+
+        // Expand
+        BubbleStackView stackView = mBubbleController.getStackView();
+        mBubbleData.setExpanded(true);
+
+        assertTrue(mSysUiStateBubblesExpanded);
+        assertTrue(mBubbleController.isStackExpanded());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
+
+        // Block the bubble so it won't be in the overflow
+        mBubbleController.removeBubble(
+                mBubbleData.getBubbleInStackWithKey(
+                        stackView.getExpandedBubble().getKey()).getKey(),
+                Bubbles.DISMISS_BLOCKED);
+
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey());
+
+        // We should be collapsed
         verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey());
         assertFalse(mBubbleController.hasBubbles());
-
         assertFalse(mSysUiStateBubblesExpanded);
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
index d8033db..bbcc30a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
@@ -42,9 +42,6 @@
 import android.app.Notification;
 import android.app.PendingIntent;
 import android.content.pm.LauncherApps;
-import android.content.res.Configuration;
-import android.graphics.Insets;
-import android.graphics.Rect;
 import android.hardware.display.AmbientDisplayConfiguration;
 import android.os.Handler;
 import android.os.PowerManager;
@@ -92,7 +89,7 @@
 import com.android.wm.shell.bubbles.BubbleDataRepository;
 import com.android.wm.shell.bubbles.BubbleEntry;
 import com.android.wm.shell.bubbles.BubbleLogger;
-import com.android.wm.shell.bubbles.BubblePositioner;
+import com.android.wm.shell.bubbles.BubbleOverflow;
 import com.android.wm.shell.bubbles.BubbleStackView;
 import com.android.wm.shell.bubbles.Bubbles;
 import com.android.wm.shell.common.FloatingContentCoordinator;
@@ -188,8 +185,8 @@
     private WindowManagerShellWrapper mWindowManagerShellWrapper;
     @Mock
     private BubbleLogger mBubbleLogger;
-    @Mock
-    private BubblePositioner mPositioner;
+
+    private TestableBubblePositioner mPositioner;
 
     private BubbleData mBubbleData;
 
@@ -224,12 +221,8 @@
         mZenModeConfig.suppressedVisualEffects = 0;
         when(mZenModeController.getConfig()).thenReturn(mZenModeConfig);
 
-        mBubbleData = new BubbleData(mContext, mBubbleLogger);
-
-        Rect availableRect = new Rect(0, 0, 1000, 5000);
-        when(mPositioner.getAvailableRect()).thenReturn(availableRect);
-        when(mPositioner.getOrientation()).thenReturn(Configuration.ORIENTATION_PORTRAIT);
-        when(mPositioner.getInsets()).thenReturn(Insets.of(0, 0, 0, 0));
+        mPositioner = new TestableBubblePositioner(mContext, mWindowManager);
+        mBubbleData = new BubbleData(mContext, mBubbleLogger, mPositioner);
 
         TestableNotificationInterruptStateProviderImpl interruptionStateProvider =
                 new TestableNotificationInterruptStateProviderImpl(mContext.getContentResolver(),
@@ -516,7 +509,7 @@
     }
 
     @Test
-    public void testRemoveLastExpandedCollapses() {
+    public void testRemoveLastExpanded_selectsOverflow() {
         // Mark it as a bubble and add it explicitly
         mEntryListener.onEntryAdded(mRow.getEntry());
         mEntryListener.onEntryAdded(mRow2.getEntry());
@@ -554,11 +547,39 @@
                         stackView.getExpandedBubble().getKey()).getKey(),
                 Bubbles.DISMISS_USER_GESTURE);
 
-        // Make sure state changes and collapse happens
+        // Overflow should be selected
+        assertEquals(mBubbleData.getSelectedBubble().getKey(), BubbleOverflow.KEY);
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, BubbleOverflow.KEY);
+        assertTrue(mBubbleController.hasBubbles());
+    }
+
+    @Test
+    public void testRemoveLastExpandedEmptyOverflow_collapses() {
+        // Mark it as a bubble and add it explicitly
+        mEntryListener.onEntryAdded(mRow.getEntry());
+        mBubbleController.updateBubble(mBubbleEntry);
+
+        // Expand
+        BubbleStackView stackView = mBubbleController.getStackView();
+        mBubbleData.setExpanded(true);
+
+        assertTrue(mBubbleController.isStackExpanded());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
+
+        // Block the bubble so it won't be in the overflow
+        mBubbleController.removeBubble(
+                mBubbleData.getBubbleInStackWithKey(
+                        stackView.getExpandedBubble().getKey()).getKey(),
+                Bubbles.DISMISS_BLOCKED);
+
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey());
+
+        // We should be collapsed
         verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey());
         assertFalse(mBubbleController.hasBubbles());
     }
 
+
     @Test
     public void testAutoExpand_fails_noFlag() {
         assertFalse(mBubbleController.isStackExpanded());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubblePositioner.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubblePositioner.java
new file mode 100644
index 0000000..24a7cd5
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubblePositioner.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.wmshell;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.graphics.Insets;
+import android.graphics.Rect;
+import android.view.WindowManager;
+
+import com.android.wm.shell.bubbles.BubblePositioner;
+
+public class TestableBubblePositioner extends BubblePositioner {
+
+    public TestableBubblePositioner(Context context,
+            WindowManager windowManager) {
+        super(context, windowManager);
+
+        updateInternal(Configuration.ORIENTATION_PORTRAIT,
+                Insets.of(0, 0, 0, 0),
+                new Rect(0, 0, 500, 1000));
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java
index 6a303a9..a658469 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java
@@ -20,7 +20,6 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.content.pm.PackageManager;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import androidx.test.runner.AndroidJUnit4;
@@ -31,13 +30,12 @@
 import com.android.systemui.keyguard.ScreenLifecycle;
 import com.android.systemui.model.SysUiState;
 import com.android.systemui.navigationbar.NavigationModeController;
-import com.android.systemui.shared.system.InputConsumerController;
-import com.android.systemui.shared.system.TaskStackChangeListener;
-import com.android.systemui.shared.system.TaskStackChangeListeners;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.policy.ConfigurationController;
 import com.android.systemui.tracing.ProtoTracer;
 import com.android.wm.shell.ShellDump;
+import com.android.wm.shell.apppairs.AppPairs;
+import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout;
 import com.android.wm.shell.onehanded.OneHanded;
 import com.android.wm.shell.onehanded.OneHandedGestureHandler;
 import com.android.wm.shell.onehanded.OneHandedTransitionCallback;
@@ -56,13 +54,11 @@
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 public class WMShellTest extends SysuiTestCase {
-    InputConsumerController mInputConsumerController;
     WMShell mWMShell;
 
     @Mock CommandQueue mCommandQueue;
     @Mock ConfigurationController mConfigurationController;
     @Mock KeyguardUpdateMonitor mKeyguardUpdateMonitor;
-    @Mock InputConsumerController mMockInputConsumerController;
     @Mock NavigationModeController mNavigationModeController;
     @Mock ScreenLifecycle mScreenLifecycle;
     @Mock SysUiState mSysUiState;
@@ -70,8 +66,10 @@
     @Mock PipTouchHandler mPipTouchHandler;
     @Mock SplitScreen mSplitScreen;
     @Mock OneHanded mOneHanded;
+    @Mock HideDisplayCutout mHideDisplayCutout;
     @Mock ProtoTracer mProtoTracer;
     @Mock ShellDump mShellDump;
+    @Mock AppPairs mAppPairs;
 
     @Before
     public void setUp() {
@@ -80,7 +78,8 @@
         mWMShell = new WMShell(mContext, mCommandQueue, mConfigurationController,
                 mKeyguardUpdateMonitor, mNavigationModeController,
                 mScreenLifecycle, mSysUiState, Optional.of(mPip), Optional.of(mSplitScreen),
-                Optional.of(mOneHanded), mProtoTracer, Optional.of(mShellDump));
+                Optional.of(mOneHanded), Optional.of(mHideDisplayCutout), mProtoTracer,
+                Optional.of(mShellDump), Optional.of(mAppPairs));
 
         when(mPip.getPipTouchHandler()).thenReturn(mPipTouchHandler);
     }
@@ -113,4 +112,12 @@
                 OneHandedGestureHandler.OneHandedGestureEventCallback.class));
         verify(mOneHanded).registerTransitionCallback(any(OneHandedTransitionCallback.class));
     }
+
+    @Test
+    public void initHideDisplayCutout_registersCallbacks() {
+        mWMShell.initHideDisplayCutout(mHideDisplayCutout);
+
+        verify(mConfigurationController).addCallback(
+                any(ConfigurationController.ConfigurationListener.class));
+    }
 }
diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java b/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java
index dae16b2..6dabe76 100644
--- a/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java
+++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java
@@ -207,6 +207,11 @@
             case AccessibilityEvent.TYPE_GESTURE_DETECTION_START:
                 startGestureDetecting();
                 break;
+            case AccessibilityEvent.TYPE_GESTURE_DETECTION_END:
+                // Clear to make sure that we don't accidentally execute passthrough, and that we
+                // are ready for the next interaction.
+                clear();
+                break;
             default:
                 break;
         }
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index 1c4d752..f1988e9 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -95,6 +95,8 @@
 import android.util.SparseIntArray;
 import android.util.SparseLongArray;
 import android.util.TypedValue;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 import android.util.proto.ProtoOutputStream;
 import android.view.Display;
@@ -3075,8 +3077,7 @@
         int N;
 
         try {
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(stream, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(stream);
             out.startDocument(null, true);
             out.startTag(null, "gs");
             out.attribute(null, "version", String.valueOf(CURRENT_VERSION));
@@ -3138,8 +3139,7 @@
             List<LoadedWidgetState> outLoadedWidgets) {
         int version = -1;
         try {
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(stream, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(stream);
 
             int legacyProviderIndex = -1;
             int legacyHostIndex = -1;
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java
index 70cf045..f205662 100644
--- a/services/core/java/android/content/pm/PackageManagerInternal.java
+++ b/services/core/java/android/content/pm/PackageManagerInternal.java
@@ -1126,4 +1126,16 @@
      * Notifies that a package has crashed or ANR'd.
      */
     public abstract void notifyPackageCrashOrAnr(String packageName);
+
+    /**
+     * Requesting the checksums for APKs within a package.
+     * See {@link PackageManager#requestChecksums} for details.
+     *
+     * @param executor to use for digest calculations.
+     * @param handler to use for postponed calculations.
+     */
+    public abstract void requestChecksums(@NonNull String packageName, boolean includeSplits,
+            @Checksum.Type int optional, @Checksum.Type int required,
+            @Nullable List trustedInstallers, @NonNull IntentSender statusReceiver, int userId,
+            @NonNull Executor executor, @NonNull Handler handler);
 }
diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java
index f079546..735d248 100644
--- a/services/core/java/com/android/server/PackageWatchdog.java
+++ b/services/core/java/com/android/server/PackageWatchdog.java
@@ -40,6 +40,8 @@
 import android.util.LongArrayQueue;
 import android.util.MathUtils;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.GuardedBy;
@@ -934,8 +936,7 @@
         mAllObservers.clear();
         try {
             infile = mPolicyFile.openRead();
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(infile, StandardCharsets.UTF_8.name());
+            final TypedXmlPullParser parser = Xml.resolvePullParser(infile);
             XmlUtils.beginDocument(parser, TAG_PACKAGE_WATCHDOG);
             int outerDepth = parser.getDepth();
             while (XmlUtils.nextElementWithin(parser, outerDepth)) {
@@ -1027,8 +1028,7 @@
             }
 
             try {
-                XmlSerializer out = new FastXmlSerializer();
-                out.setOutput(stream, StandardCharsets.UTF_8.name());
+                TypedXmlSerializer out = Xml.resolveSerializer(stream);
                 out.startDocument(null, true);
                 out.startTag(null, TAG_PACKAGE_WATCHDOG);
                 out.attribute(null, ATTR_VERSION, Integer.toString(DB_VERSION));
diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java
index edeb049..2455e76 100644
--- a/services/core/java/com/android/server/SensorPrivacyService.java
+++ b/services/core/java/com/android/server/SensorPrivacyService.java
@@ -30,6 +30,8 @@
 import android.util.ArrayMap;
 import android.util.AtomicFile;
 import android.util.Log;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.GuardedBy;
@@ -101,9 +103,8 @@
                 mEnabled = enable;
                 FileOutputStream outputStream = null;
                 try {
-                    XmlSerializer serializer = new FastXmlSerializer();
                     outputStream = mAtomicFile.startWrite();
-                    serializer.setOutput(outputStream, StandardCharsets.UTF_8.name());
+                    TypedXmlSerializer serializer = Xml.resolveSerializer(outputStream);
                     serializer.startDocument(null, true);
                     serializer.startTag(null, XML_TAG_SENSOR_PRIVACY);
                     serializer.attribute(null, XML_ATTRIBUTE_ENABLED, String.valueOf(enable));
@@ -153,8 +154,7 @@
             }
             boolean enabled;
             try (FileInputStream inputStream = mAtomicFile.openRead()) {
-                XmlPullParser parser = Xml.newPullParser();
-                parser.setInput(inputStream, StandardCharsets.UTF_8.name());
+                TypedXmlPullParser parser = Xml.resolvePullParser(inputStream);
                 XmlUtils.beginDocument(parser, XML_TAG_SENSOR_PRIVACY);
                 parser.next();
                 String tagName = parser.getName();
@@ -176,9 +176,8 @@
             synchronized (mLock) {
                 FileOutputStream outputStream = null;
                 try {
-                    XmlSerializer serializer = new FastXmlSerializer();
                     outputStream = mAtomicFile.startWrite();
-                    serializer.setOutput(outputStream, StandardCharsets.UTF_8.name());
+                    TypedXmlSerializer serializer = Xml.resolveSerializer(outputStream);
                     serializer.startDocument(null, true);
                     serializer.startTag(null, XML_TAG_SENSOR_PRIVACY);
                     serializer.attribute(null, XML_ATTRIBUTE_ENABLED, String.valueOf(mEnabled));
diff --git a/services/core/java/com/android/server/ServiceWatcher.java b/services/core/java/com/android/server/ServiceWatcher.java
index b78b5d9..3ccb6e5 100644
--- a/services/core/java/com/android/server/ServiceWatcher.java
+++ b/services/core/java/com/android/server/ServiceWatcher.java
@@ -185,9 +185,49 @@
     private final Handler mHandler;
     private final Intent mIntent;
 
+    private final PackageMonitor mPackageMonitor = new PackageMonitor() {
+        @Override
+        public boolean onPackageChanged(String packageName, int uid, String[] components) {
+            return true;
+        }
+
+        @Override
+        public void onSomePackagesChanged() {
+            onBestServiceChanged(false);
+        }
+    };
+    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action == null) {
+                return;
+            }
+            int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
+            if (userId == UserHandle.USER_NULL) {
+                return;
+            }
+
+            switch (action) {
+                case Intent.ACTION_USER_SWITCHED:
+                    onUserSwitched(userId);
+                    break;
+                case Intent.ACTION_USER_UNLOCKED:
+                    onUserUnlocked(userId);
+                    break;
+                default:
+                    break;
+            }
+
+        }
+    };
+
     @Nullable private final OnBindRunner mOnBind;
     @Nullable private final Runnable mOnUnbind;
 
+    // write from caller thread only, read anywhere
+    private volatile boolean mRegistered;
+
     // read/write from handler thread only
     private int mCurrentUserId;
 
@@ -225,77 +265,65 @@
     }
 
     /**
-     * Register this class, which will start the process of determining the best matching service
-     * and maintaining a binding to it. Will return false and fail if there are no possible matching
-     * services at the time this functions is called.
+     * Returns true if there is at least one component that could satisfy the ServiceWatcher's
+     * constraints.
      */
-    public boolean register() {
-        if (mContext.getPackageManager().queryIntentServicesAsUser(mIntent,
+    public boolean checkServiceResolves() {
+        return !mContext.getPackageManager().queryIntentServicesAsUser(mIntent,
                 MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE | MATCH_SYSTEM_ONLY,
-                UserHandle.USER_SYSTEM).isEmpty()) {
-            return false;
-        }
+                UserHandle.USER_SYSTEM).isEmpty();
+    }
 
-        new PackageMonitor() {
-            @Override
-            public boolean onPackageChanged(String packageName, int uid, String[] components) {
-                return true;
-            }
+    /**
+     * Starts the process of determining the best matching service and maintaining a binding to it.
+     */
+    public void register() {
+        Preconditions.checkState(!mRegistered);
 
-            @Override
-            public void onSomePackagesChanged() {
-                onBestServiceChanged(false);
-            }
-        }.register(mContext, UserHandle.ALL, true, mHandler);
+        mPackageMonitor.register(mContext, UserHandle.ALL, true, mHandler);
 
         IntentFilter intentFilter = new IntentFilter();
         intentFilter.addAction(Intent.ACTION_USER_SWITCHED);
         intentFilter.addAction(Intent.ACTION_USER_UNLOCKED);
-        mContext.registerReceiverAsUser(new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                String action = intent.getAction();
-                if (action == null) {
-                    return;
-                }
-                int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
-                if (userId == UserHandle.USER_NULL) {
-                    return;
-                }
-
-                switch (action) {
-                    case Intent.ACTION_USER_SWITCHED:
-                        onUserSwitched(userId);
-                        break;
-                    case Intent.ACTION_USER_UNLOCKED:
-                        onUserUnlocked(userId);
-                        break;
-                    default:
-                        break;
-                }
-
-            }
-        }, UserHandle.ALL, intentFilter, null, mHandler);
+        mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, intentFilter, null,
+                mHandler);
 
         mCurrentUserId = ActivityManager.getCurrentUser();
 
+        mRegistered = true;
+
         mHandler.post(() -> onBestServiceChanged(false));
-        return true;
+    }
+
+    /**
+     * Stops the process of determining the best matching service and releases any binding.
+     */
+    public void unregister() {
+        Preconditions.checkState(mRegistered);
+
+        mRegistered = false;
+
+        mPackageMonitor.unregister();
+        mContext.unregisterReceiver(mBroadcastReceiver);
+
+        mHandler.post(() -> onBestServiceChanged(false));
     }
 
     private void onBestServiceChanged(boolean forceRebind) {
         Preconditions.checkState(Looper.myLooper() == mHandler.getLooper());
 
-        List<ResolveInfo> resolveInfos = mContext.getPackageManager().queryIntentServicesAsUser(
-                mIntent,
-                GET_META_DATA | MATCH_DIRECT_BOOT_AUTO | MATCH_SYSTEM_ONLY,
-                mCurrentUserId);
-
         ServiceInfo bestServiceInfo = ServiceInfo.NONE;
-        for (ResolveInfo resolveInfo : resolveInfos) {
-            ServiceInfo serviceInfo = new ServiceInfo(resolveInfo, mCurrentUserId);
-            if (serviceInfo.compareTo(bestServiceInfo) > 0) {
-                bestServiceInfo = serviceInfo;
+
+        if (mRegistered) {
+            List<ResolveInfo> resolveInfos = mContext.getPackageManager().queryIntentServicesAsUser(
+                    mIntent,
+                    GET_META_DATA | MATCH_DIRECT_BOOT_AUTO | MATCH_SYSTEM_ONLY,
+                    mCurrentUserId);
+            for (ResolveInfo resolveInfo : resolveInfos) {
+                ServiceInfo serviceInfo = new ServiceInfo(resolveInfo, mCurrentUserId);
+                if (serviceInfo.compareTo(bestServiceInfo) > 0) {
+                    bestServiceInfo = serviceInfo;
+                }
             }
         }
 
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index ab933a8..783866a 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -130,6 +130,8 @@
 import android.util.Pair;
 import android.util.Slog;
 import android.util.TimeUtils;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.GuardedBy;
@@ -2023,8 +2025,7 @@
         FileInputStream fis = null;
         try {
             fis = mSettingsFile.openRead();
-            final XmlPullParser in = Xml.newPullParser();
-            in.setInput(fis, StandardCharsets.UTF_8.name());
+            final TypedXmlPullParser in = Xml.resolvePullParser(fis);
 
             int type;
             while ((type = in.next()) != END_DOCUMENT) {
@@ -2063,8 +2064,7 @@
         try {
             fos = mSettingsFile.startWrite();
 
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(fos, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(fos);
             out.startDocument(null, true);
             out.startTag(null, TAG_VOLUMES);
             writeIntAttribute(out, ATTR_VERSION, VERSION_FIX_PRIMARY);
diff --git a/services/core/java/com/android/server/SystemUpdateManagerService.java b/services/core/java/com/android/server/SystemUpdateManagerService.java
index 6c1ffdd..61a7d00 100644
--- a/services/core/java/com/android/server/SystemUpdateManagerService.java
+++ b/services/core/java/com/android/server/SystemUpdateManagerService.java
@@ -38,6 +38,8 @@
 import android.provider.Settings;
 import android.util.AtomicFile;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.util.FastXmlSerializer;
@@ -130,8 +132,7 @@
     private Bundle loadSystemUpdateInfoLocked() {
         PersistableBundle loadedBundle = null;
         try (FileInputStream fis = mFile.openRead()) {
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(fis, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(fis);
             loadedBundle = readInfoFileLocked(parser);
         } catch (FileNotFoundException e) {
             Slog.i(TAG, "No existing info file " + mFile.getBaseFile());
@@ -216,8 +217,7 @@
         try {
             fos = mFile.startWrite();
 
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(fos, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(fos);
             out.startDocument(null, true);
 
             out.startTag(null, TAG_INFO);
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index 770e8de..eb55512 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -78,6 +78,7 @@
 import android.telephony.data.ApnSetting;
 import android.telephony.emergency.EmergencyNumber;
 import android.telephony.ims.ImsReasonInfo;
+import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.LocalLog;
 import android.util.Pair;
@@ -2564,12 +2565,33 @@
                 TelephonyUtils.dataStateToString(pdcs.getState()));
         intent.putExtra(PHONE_CONSTANTS_DATA_APN_KEY, pdcs.getApnSetting().getApnName());
         intent.putExtra(PHONE_CONSTANTS_DATA_APN_TYPE_KEY,
-                ApnSetting.getApnTypesStringFromBitmask(pdcs.getApnSetting().getApnTypeBitmask()));
+                getApnTypesStringFromBitmask(pdcs.getApnSetting().getApnTypeBitmask()));
         intent.putExtra(PHONE_CONSTANTS_SLOT_KEY, slotIndex);
         intent.putExtra(PHONE_CONSTANTS_SUBSCRIPTION_KEY, subId);
         mContext.sendBroadcastAsUser(intent, UserHandle.ALL, Manifest.permission.READ_PHONE_STATE);
     }
 
+    /**
+     * Reimplementation of {@link ApnSetting#getApnTypesStringFromBitmask}.
+     */
+    @VisibleForTesting
+    public static String getApnTypesStringFromBitmask(int apnTypeBitmask) {
+        List<String> types = new ArrayList<>();
+        int remainingApnTypes = apnTypeBitmask;
+        // special case for DEFAULT since it's not a pure bit
+        if ((remainingApnTypes & ApnSetting.TYPE_DEFAULT) == ApnSetting.TYPE_DEFAULT) {
+            types.add(ApnSetting.TYPE_DEFAULT_STRING);
+            remainingApnTypes &= ~ApnSetting.TYPE_DEFAULT;
+        }
+        while (remainingApnTypes != 0) {
+            int highestApnTypeBit = Integer.highestOneBit(remainingApnTypes);
+            String apnString = ApnSetting.getApnTypeString(highestApnTypeBit);
+            if (!TextUtils.isEmpty(apnString)) types.add(apnString);
+            remainingApnTypes &= ~highestApnTypeBit;
+        }
+        return TextUtils.join(",", types);
+    }
+
     private void enforceNotifyPermissionOrCarrierPrivilege(String method) {
         if (checkNotifyPermission()) {
             return;
diff --git a/services/core/java/com/android/server/adb/AdbDebuggingManager.java b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
index ed83a64..f59af76 100644
--- a/services/core/java/com/android/server/adb/AdbDebuggingManager.java
+++ b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
@@ -64,6 +64,8 @@
 import android.util.AtomicFile;
 import android.util.Base64;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.R;
@@ -1935,8 +1937,7 @@
                 return keyMap;
             }
             try (FileInputStream keyStream = mAtomicKeyFile.openRead()) {
-                XmlPullParser parser = Xml.newPullParser();
-                parser.setInput(keyStream, StandardCharsets.UTF_8.name());
+                TypedXmlPullParser parser = Xml.resolvePullParser(keyStream);
                 // Check for supported keystore version.
                 XmlUtils.beginDocument(parser, XML_KEYSTORE_START_TAG);
                 if (parser.next() != XmlPullParser.END_DOCUMENT) {
@@ -2007,8 +2008,7 @@
                 return keyMap;
             }
             try (FileInputStream keyStream = mAtomicKeyFile.openRead()) {
-                XmlPullParser parser = Xml.newPullParser();
-                parser.setInput(keyStream, StandardCharsets.UTF_8.name());
+                TypedXmlPullParser parser = Xml.resolvePullParser(keyStream);
                 XmlUtils.beginDocument(parser, XML_TAG_ADB_KEY);
                 while (parser.next() != XmlPullParser.END_DOCUMENT) {
                     String tagName = parser.getName();
@@ -2058,8 +2058,7 @@
                 return trustedNetworks;
             }
             try (FileInputStream keyStream = mAtomicKeyFile.openRead()) {
-                XmlPullParser parser = Xml.newPullParser();
-                parser.setInput(keyStream, StandardCharsets.UTF_8.name());
+                TypedXmlPullParser parser = Xml.resolvePullParser(keyStream);
                 // Check for supported keystore version.
                 XmlUtils.beginDocument(parser, XML_KEYSTORE_START_TAG);
                 if (parser.next() != XmlPullParser.END_DOCUMENT) {
@@ -2144,9 +2143,8 @@
             }
             FileOutputStream keyStream = null;
             try {
-                XmlSerializer serializer = new FastXmlSerializer();
                 keyStream = mAtomicKeyFile.startWrite();
-                serializer.setOutput(keyStream, StandardCharsets.UTF_8.name());
+                TypedXmlSerializer serializer = Xml.resolveSerializer(keyStream);
                 serializer.startDocument(null, true);
 
                 serializer.startTag(null, XML_KEYSTORE_START_TAG);
diff --git a/services/core/java/com/android/server/am/ActiveInstrumentation.java b/services/core/java/com/android/server/am/ActiveInstrumentation.java
index db63638..43474d5 100644
--- a/services/core/java/com/android/server/am/ActiveInstrumentation.java
+++ b/services/core/java/com/android/server/am/ActiveInstrumentation.java
@@ -70,6 +70,9 @@
     // The uid of the process who started this instrumentation.
     int mSourceUid;
 
+    // True if instrumentation should take place without restarting the target process.
+    boolean mNoRestart;
+
     ActiveInstrumentation(ActivityManagerService service) {
         mService = service;
     }
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index e1124ab..62392c9 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -1930,9 +1930,7 @@
         ActivityServiceConnectionsHolder<ConnectionRecord> activity = null;
         if (token != null) {
             activity = mAm.mAtmInternal.getServiceConnectionsHolder(token);
-            // TODO(b/171280916): Remove the check after we have another API get window context
-            //  token than getActivityToken.
-            if (activity == null && !mAm.mWindowManager.isWindowToken(token)) {
+            if (activity == null) {
                 Slog.w(TAG, "Binding with unknown activity: " + token);
                 return 0;
             }
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 796ea0e..4ca1358 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -25,6 +25,7 @@
 import static android.app.ActivityManager.INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS;
 import static android.app.ActivityManager.INSTR_FLAG_DISABLE_ISOLATED_STORAGE;
 import static android.app.ActivityManager.INSTR_FLAG_DISABLE_TEST_API_CHECKS;
+import static android.app.ActivityManager.INSTR_FLAG_NO_RESTART;
 import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
 import static android.app.ActivityManager.PROCESS_STATE_TOP;
 import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY;
@@ -14218,9 +14219,12 @@
         synchronized(this) {
             InstrumentationInfo ii = null;
             ApplicationInfo ai = null;
+
+            boolean noRestart = (flags & INSTR_FLAG_NO_RESTART) != 0;
+
             try {
                 ii = mContext.getPackageManager().getInstrumentationInfo(
-                    className, STOCK_PM_FLAGS);
+                        className, STOCK_PM_FLAGS);
                 ai = AppGlobals.getPackageManager().getApplicationInfo(
                         ii.targetPackage, STOCK_PM_FLAGS, userId);
             } catch (PackageManager.NameNotFoundException e) {
@@ -14236,24 +14240,33 @@
                         "Unable to find instrumentation target package: " + ii.targetPackage);
                 return false;
             }
-            if (!ai.hasCode()) {
+
+            if (ii.targetPackage.equals("android")) {
+                if (!noRestart) {
+                    reportStartInstrumentationFailureLocked(watcher, className,
+                            "Cannot instrument system server without 'no-restart'");
+                    return false;
+                }
+            } else if (!ai.hasCode()) {
                 reportStartInstrumentationFailureLocked(watcher, className,
                         "Instrumentation target has no code: " + ii.targetPackage);
                 return false;
             }
 
-            int match = mContext.getPackageManager().checkSignatures(
-                    ii.targetPackage, ii.packageName);
-            if (match < 0 && match != PackageManager.SIGNATURE_FIRST_NOT_SIGNED) {
-                String msg = "Permission Denial: starting instrumentation "
-                        + className + " from pid="
-                        + Binder.getCallingPid()
-                        + ", uid=" + Binder.getCallingPid()
-                        + " not allowed because package " + ii.packageName
-                        + " does not have a signature matching the target "
-                        + ii.targetPackage;
-                reportStartInstrumentationFailureLocked(watcher, className, msg);
-                throw new SecurityException(msg);
+            if (!Build.IS_DEBUGGABLE) {
+                int match = mContext.getPackageManager().checkSignatures(
+                        ii.targetPackage, ii.packageName);
+                if (match < 0 && match != PackageManager.SIGNATURE_FIRST_NOT_SIGNED) {
+                    String msg = "Permission Denial: starting instrumentation "
+                            + className + " from pid="
+                            + Binder.getCallingPid()
+                            + ", uid=" + Binder.getCallingPid()
+                            + " not allowed because package " + ii.packageName
+                            + " does not have a signature matching the target "
+                            + ii.targetPackage;
+                    reportStartInstrumentationFailureLocked(watcher, className, msg);
+                    throw new SecurityException(msg);
+                }
             }
 
             ActiveInstrumentation activeInstr = new ActiveInstrumentation(this);
@@ -14276,6 +14289,7 @@
             activeInstr.mHasBackgroundActivityStartsPermission = checkPermission(
                     START_ACTIVITIES_FROM_BACKGROUND, callingPid, callingUid)
                             == PackageManager.PERMISSION_GRANTED;
+            activeInstr.mNoRestart = noRestart;
 
             boolean disableHiddenApiChecks = ai.usesNonSdkApi()
                     || (flags & INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS) != 0;
@@ -14291,18 +14305,25 @@
                     && (flags & INSTR_FLAG_DISABLE_ISOLATED_STORAGE) != 0;
 
             final long origId = Binder.clearCallingIdentity();
-            // Instrumentation can kill and relaunch even persistent processes
-            forceStopPackageLocked(ii.targetPackage, -1, true, false, true, true, false, userId,
-                    "start instr");
-            // Inform usage stats to make the target package active
-            if (mUsageStatsService != null) {
-                mUsageStatsService.reportEvent(ii.targetPackage, userId,
-                        UsageEvents.Event.SYSTEM_INTERACTION);
+
+            ProcessRecord app;
+            if (noRestart) {
+                app = getProcessRecordLocked(ai.processName, ai.uid, true);
+            } else {
+                // Instrumentation can kill and relaunch even persistent processes
+                forceStopPackageLocked(ii.targetPackage, -1, true, false, true, true, false, userId,
+                        "start instr");
+                // Inform usage stats to make the target package active
+                if (mUsageStatsService != null) {
+                    mUsageStatsService.reportEvent(ii.targetPackage, userId,
+                            UsageEvents.Event.SYSTEM_INTERACTION);
+                }
+                app = addAppLocked(ai, defProcess, false, disableHiddenApiChecks,
+                        disableTestApiChecks, mountExtStorageFull, abiOverride,
+                        ZYGOTE_POLICY_FLAG_EMPTY);
             }
 
-            ProcessRecord app = addAppLocked(ai, defProcess, false, disableHiddenApiChecks,
-                    disableTestApiChecks, mountExtStorageFull, abiOverride,
-                    ZYGOTE_POLICY_FLAG_EMPTY);
+
             app.setActiveInstrumentation(activeInstr);
             activeInstr.mFinished = false;
             activeInstr.mSourceUid = callingUid;
@@ -14318,11 +14339,34 @@
                         ii.packageName, AppOpsManager.MODE_ALLOWED);
             }
             Binder.restoreCallingIdentity(origId);
+
+            if (noRestart) {
+                instrumentWithoutRestart(activeInstr, ai);
+            }
         }
 
         return true;
     }
 
+    private void instrumentWithoutRestart(ActiveInstrumentation activeInstr,
+            ApplicationInfo targetInfo) {
+        ProcessRecord pr;
+        synchronized (this) {
+            pr = getProcessRecordLocked(targetInfo.processName, targetInfo.uid, true);
+        }
+
+        try {
+            pr.thread.instrumentWithoutRestart(
+                    activeInstr.mClass,
+                    activeInstr.mArguments,
+                    activeInstr.mWatcher,
+                    activeInstr.mUiAutomationConnection,
+                    targetInfo);
+        } catch (RemoteException e) {
+            Slog.i(TAG, "RemoteException from instrumentWithoutRestart", e);
+        }
+    }
+
     private boolean isCallerShell() {
         final int callingUid = Binder.getCallingUid();
         return callingUid == SHELL_UID || callingUid == ROOT_UID;
@@ -14421,8 +14465,11 @@
         instr.removeProcess(app);
         app.setActiveInstrumentation(null);
 
-        forceStopPackageLocked(app.info.packageName, -1, false, false, true, true, false, app.userId,
-                "finished inst");
+        if (!instr.mNoRestart) {
+            forceStopPackageLocked(app.info.packageName, -1, false, false, true, true, false,
+                    app.userId,
+                    "finished inst");
+        }
     }
 
     public void finishInstrumentation(IApplicationThread target,
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index d434783..09937e3 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -141,6 +141,8 @@
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
 import android.util.TimeUtils;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.GuardedBy;
@@ -3065,7 +3067,7 @@
         final int proxyMode = noteOperationUnchecked(code, proxyUid, resolveProxyPackageName,
                 proxyAttributionTag, Process.INVALID_UID, null, null, proxyFlags,
                 !isProxyTrusted, "proxy " + message, shouldCollectMessage);
-        if (proxyMode != AppOpsManager.MODE_ALLOWED || Binder.getCallingUid() == proxiedUid) {
+        if (proxyMode != AppOpsManager.MODE_ALLOWED) {
             return proxyMode;
         }
 
@@ -3550,8 +3552,7 @@
                 resolvedProxyPackageName, proxyAttributionTag, Process.INVALID_UID, null, null,
                 proxyFlags, startIfModeDefault, !isProxyTrusted, "proxy " + message,
                 shouldCollectMessage, false);
-        if (!shouldStartForMode(proxyMode, startIfModeDefault)
-                || Binder.getCallingUid() == proxiedUid) {
+        if (!shouldStartForMode(proxyMode, startIfModeDefault)) {
             return proxyMode;
         }
 
@@ -4292,8 +4293,7 @@
                 boolean success = false;
                 mUidStates.clear();
                 try {
-                    XmlPullParser parser = Xml.newPullParser();
-                    parser.setInput(stream, StandardCharsets.UTF_8.name());
+                    TypedXmlPullParser parser = Xml.resolvePullParser(stream);
                     int type;
                     while ((type = parser.next()) != XmlPullParser.START_TAG
                             && type != XmlPullParser.END_DOCUMENT) {
@@ -4551,8 +4551,7 @@
             List<AppOpsManager.PackageOps> allOps = getPackagesForOps(null);
 
             try {
-                XmlSerializer out = new FastXmlSerializer();
-                out.setOutput(stream, StandardCharsets.UTF_8.name());
+                TypedXmlSerializer out = Xml.resolveSerializer(stream);
                 out.startDocument(null, true);
                 out.startTag(null, "app-ops");
                 out.attribute(null, "v", String.valueOf(CURRENT_VERSION));
diff --git a/services/core/java/com/android/server/appop/HistoricalRegistry.java b/services/core/java/com/android/server/appop/HistoricalRegistry.java
index 3d22a15..f49b5dc 100644
--- a/services/core/java/com/android/server/appop/HistoricalRegistry.java
+++ b/services/core/java/com/android/server/appop/HistoricalRegistry.java
@@ -669,10 +669,12 @@
 
     void shutdown() {
         synchronized (mInMemoryLock) {
-            if (mMode != AppOpsManager.HISTORICAL_MODE_DISABLED) {
-                persistPendingHistory();
+            if (mMode == AppOpsManager.HISTORICAL_MODE_DISABLED) {
+                return;
             }
         }
+        // Do not call persistPendingHistory inside the memory lock, due to possible deadlock
+        persistPendingHistory();
     }
 
     void persistPendingHistory() {
diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java
index d52cf02..eeec1bb 100644
--- a/services/core/java/com/android/server/biometrics/AuthService.java
+++ b/services/core/java/com/android/server/biometrics/AuthService.java
@@ -333,7 +333,7 @@
                 // initialization from here. AIDL HALs are initialized by FingerprintService since
                 // the HAL interface provides ID, strength, and other configuration information.
                 fingerprintService.initializeConfiguration(config.id, config.strength);
-                authenticator = new FingerprintAuthenticator(fingerprintService, config);
+                authenticator = new FingerprintAuthenticator(fingerprintService, config.id);
                 break;
 
             case TYPE_FACE:
@@ -348,7 +348,7 @@
                 // initialization from here. AIDL HALs are initialized by FaceService since
                 // the HAL interface provides ID, strength, and other configuration information.
                 faceService.initializeConfiguration(config.id, config.strength);
-                authenticator = new FaceAuthenticator(faceService, config);
+                authenticator = new FaceAuthenticator(faceService, config.id);
                 break;
 
             case TYPE_IRIS:
@@ -359,7 +359,8 @@
                     return;
                 }
 
-                authenticator = new IrisAuthenticator(irisService, config);
+                irisService.initializeConfiguration(config.id, config.strength);
+                authenticator = new IrisAuthenticator(irisService, config.id);
                 break;
 
             default:
diff --git a/services/core/java/com/android/server/biometrics/AuthSession.java b/services/core/java/com/android/server/biometrics/AuthSession.java
index 3c18cd4..637a896 100644
--- a/services/core/java/com/android/server/biometrics/AuthSession.java
+++ b/services/core/java/com/android/server/biometrics/AuthSession.java
@@ -17,9 +17,11 @@
 package com.android.server.biometrics;
 
 import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
 import static android.hardware.biometrics.BiometricAuthenticator.TYPE_NONE;
 
 import android.annotation.IntDef;
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.Context;
 import android.hardware.biometrics.BiometricAuthenticator;
@@ -33,6 +35,8 @@
 import android.hardware.biometrics.PromptInfo;
 import android.hardware.face.FaceManager;
 import android.hardware.fingerprint.FingerprintManager;
+import android.hardware.fingerprint.FingerprintSensorProperties;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.security.KeyStore;
@@ -68,47 +72,54 @@
      */
     static final int STATE_AUTH_CALLED = 1;
     /**
-     * Authentication started, BiometricPrompt is showing and the hardware is authenticating.
+     * Authentication started, BiometricPrompt is showing and the hardware is authenticating. At
+     * this point, the BiometricPrompt UI has been requested, but is not necessarily done animating
+     * in yet.
      */
     static final int STATE_AUTH_STARTED = 2;
     /**
+     * Same as {@link #STATE_AUTH_STARTED}, except the BiometricPrompt UI is done animating in.
+     */
+    static final int STATE_AUTH_STARTED_UI_SHOWING = 3;
+    /**
      * Authentication is paused, waiting for the user to press "try again" button. Only
      * passive modalities such as Face or Iris should have this state. Note that for passive
      * modalities, the HAL enters the idle state after onAuthenticated(false) which differs from
      * fingerprint.
      */
-    static final int STATE_AUTH_PAUSED = 3;
+    static final int STATE_AUTH_PAUSED = 4;
     /**
      * Paused, but "try again" was pressed. Sensors have new cookies and we're now waiting for all
      * cookies to be returned.
      */
-    static final int STATE_AUTH_PAUSED_RESUMING = 4;
+    static final int STATE_AUTH_PAUSED_RESUMING = 5;
     /**
      * Authentication is successful, but we're waiting for the user to press "confirm" button.
      */
-    static final int STATE_AUTH_PENDING_CONFIRM = 5;
+    static final int STATE_AUTH_PENDING_CONFIRM = 6;
     /**
      * Biometric authenticated, waiting for SysUI to finish animation
      */
-    static final int STATE_AUTHENTICATED_PENDING_SYSUI = 6;
+    static final int STATE_AUTHENTICATED_PENDING_SYSUI = 7;
     /**
      * Biometric error, waiting for SysUI to finish animation
      */
-    static final int STATE_ERROR_PENDING_SYSUI = 7;
+    static final int STATE_ERROR_PENDING_SYSUI = 8;
     /**
      * Device credential in AuthController is showing
      */
-    static final int STATE_SHOWING_DEVICE_CREDENTIAL = 8;
+    static final int STATE_SHOWING_DEVICE_CREDENTIAL = 9;
     /**
      * The client binder died, and sensors were authenticating at the time. Cancel has been
      * requested and we're waiting for the HAL(s) to send ERROR_CANCELED.
      */
-    static final int STATE_CLIENT_DIED_CANCELLING = 9;
+    static final int STATE_CLIENT_DIED_CANCELLING = 10;
 
     @IntDef({
             STATE_AUTH_IDLE,
             STATE_AUTH_CALLED,
             STATE_AUTH_STARTED,
+            STATE_AUTH_STARTED_UI_SHOWING,
             STATE_AUTH_PAUSED,
             STATE_AUTH_PAUSED_RESUMING,
             STATE_AUTH_PENDING_CONFIRM,
@@ -150,6 +161,7 @@
     private final int mCallingPid;
     private final int mCallingUserId;
     private final boolean mDebugEnabled;
+    private final List<FingerprintSensorPropertiesInternal> mFingerprintSensorProperties;
 
     // The current state, which can be either idle, called, or started
     private @SessionState int mState = STATE_AUTH_IDLE;
@@ -165,12 +177,25 @@
     // Timestamp when hardware authentication occurred
     private long mAuthenticatedTimeMs;
 
-    AuthSession(Context context, IStatusBarService statusBarService,
-            IBiometricSysuiReceiver sysuiReceiver, KeyStore keystore, Random random,
-            ClientDeathReceiver clientDeathReceiver, PreAuthInfo preAuthInfo, IBinder token,
-            long operationId, int userId, IBiometricSensorReceiver sensorReceiver,
-            IBiometricServiceReceiver clientReceiver, String opPackageName, PromptInfo promptInfo,
-            int callingUid, int callingPid, int callingUserId, boolean debugEnabled) {
+    AuthSession(@NonNull Context context,
+            @NonNull IStatusBarService statusBarService,
+            @NonNull IBiometricSysuiReceiver sysuiReceiver,
+            @NonNull KeyStore keystore,
+            @NonNull Random random,
+            @NonNull ClientDeathReceiver clientDeathReceiver,
+            @NonNull PreAuthInfo preAuthInfo,
+            @NonNull IBinder token,
+            long operationId,
+            int userId,
+            @NonNull IBiometricSensorReceiver sensorReceiver,
+            @NonNull IBiometricServiceReceiver clientReceiver,
+            @NonNull String opPackageName,
+            @NonNull PromptInfo promptInfo,
+            int callingUid,
+            int callingPid,
+            int callingUserId,
+            boolean debugEnabled,
+            @NonNull List<FingerprintSensorPropertiesInternal> fingerprintSensorProperties) {
         mContext = context;
         mStatusBarService = statusBarService;
         mSysuiReceiver = sysuiReceiver;
@@ -189,6 +214,7 @@
         mCallingPid = callingPid;
         mCallingUserId = callingUserId;
         mDebugEnabled = debugEnabled;
+        mFingerprintSensorProperties = fingerprintSensorProperties;
 
         try {
             mClientReceiver.asBinder().linkToDeath(this, 0 /* flags */);
@@ -267,7 +293,10 @@
 
         if (allCookiesReceived()) {
             mStartTimeMs = System.currentTimeMillis();
-            startAllPreparedSensors();
+
+            // For UDFPS, do not start until BiometricPrompt UI is shown. Otherwise, the UDFPS
+            // affordance will be shown before the BP UI is finished animating in.
+            startAllPreparedSensorsExceptUdfps();
 
             // No need to request the UI if we're coming from the paused state.
             if (mState != STATE_AUTH_PAUSED_RESUMING) {
@@ -311,13 +340,41 @@
         return false;
     }
 
-    private void startAllPreparedSensors() {
+    private boolean isUdfpsSensor(@NonNull BiometricSensor sensor) {
+        if (sensor.modality != TYPE_FINGERPRINT) {
+            return false;
+        }
+
+        for (FingerprintSensorPropertiesInternal prop : mFingerprintSensorProperties) {
+            if (sensor.id == prop.sensorId && prop.isAnyUdfpsType()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void startAllPreparedSensorsExceptUdfps() {
         for (BiometricSensor sensor : mPreAuthInfo.eligibleSensors) {
+            if (isUdfpsSensor(sensor)) {
+                Slog.d(TAG, "Skipping UDFPS, sensorId: " + sensor.id);
+                continue;
+            }
             try {
                 sensor.startSensor();
             } catch (RemoteException e) {
-                Slog.e(TAG, "Unable to start prepared client, sensor ID: "
-                        + sensor.id, e);
+                Slog.e(TAG, "Unable to start prepared client, sensor: " + sensor, e);
+            }
+        }
+    }
+
+    private void startPreparedUdfpsSensors() {
+        for (BiometricSensor sensor : mPreAuthInfo.eligibleSensors) {
+            if (isUdfpsSensor(sensor)) {
+                try {
+                    sensor.startSensor();
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Unable to start UDFPS sensor: " + sensor, e);
+                }
             }
         }
     }
@@ -390,7 +447,8 @@
                 break;
             }
 
-            case STATE_AUTH_STARTED: {
+            case STATE_AUTH_STARTED:
+            case STATE_AUTH_STARTED_UI_SHOWING: {
                 final boolean errorLockout = error == BiometricConstants.BIOMETRIC_ERROR_LOCKOUT
                         || error == BiometricConstants.BIOMETRIC_ERROR_LOCKOUT_PERMANENT;
                 if (isAllowDeviceCredential() && errorLockout) {
@@ -463,6 +521,17 @@
         }
     }
 
+    void onDialogAnimatedIn() {
+        if (mState != STATE_AUTH_STARTED) {
+            Slog.w(TAG, "onDialogAnimatedIn, unexpected state: " + mState);
+        }
+
+        mState = STATE_AUTH_STARTED_UI_SHOWING;
+
+        // For UDFPS devices, we can now start the sensor.
+        startPreparedUdfpsSensors();
+    }
+
     void onTryAgainPressed() {
         if (mState != STATE_AUTH_PAUSED) {
             Slog.w(TAG, "onTryAgainPressed, state: " + mState);
@@ -543,13 +612,15 @@
      */
     boolean onClientDied() {
         try {
-            if (mState == STATE_AUTH_STARTED) {
-                mState = STATE_CLIENT_DIED_CANCELLING;
-                cancelAllSensors();
-                return false;
-            } else {
-                mStatusBarService.hideAuthenticationDialog();
-                return true;
+            switch (mState) {
+                case STATE_AUTH_STARTED:
+                case STATE_AUTH_STARTED_UI_SHOWING:
+                    mState = STATE_CLIENT_DIED_CANCELLING;
+                    cancelAllSensors();
+                    return false;
+                default:
+                    mStatusBarService.hideAuthenticationDialog();
+                    return true;
             }
         } catch (RemoteException e) {
             Slog.e(TAG, "Remote Exception: " + e);
@@ -676,7 +747,10 @@
      * @return true if this AuthSession is finished, e.g. should be set to null
      */
     boolean onCancelAuthSession(boolean force) {
-        if (mState == STATE_AUTH_STARTED && !force) {
+        final boolean authStarted = mState == STATE_AUTH_STARTED
+                || mState == STATE_AUTH_STARTED_UI_SHOWING;
+
+        if (authStarted && !force) {
             cancelAllSensors();
             // Wait for ERROR_CANCELED to be returned from the sensors
             return false;
@@ -705,7 +779,7 @@
      * {@link #STATE_SHOWING_DEVICE_CREDENTIAL} or dismissed.
      */
     private void cancelBiometricOnly() {
-        if (mState == STATE_AUTH_STARTED) {
+        if (mState == STATE_AUTH_STARTED || mState == STATE_AUTH_STARTED_UI_SHOWING) {
             cancelAllSensors();
         }
     }
diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java
index 3e0a40f..196582a 100644
--- a/services/core/java/com/android/server/biometrics/BiometricService.java
+++ b/services/core/java/com/android/server/biometrics/BiometricService.java
@@ -39,6 +39,8 @@
 import android.hardware.biometrics.IBiometricServiceReceiver;
 import android.hardware.biometrics.IBiometricSysuiReceiver;
 import android.hardware.biometrics.PromptInfo;
+import android.hardware.fingerprint.FingerprintManager;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
 import android.net.Uri;
 import android.os.Binder;
 import android.os.DeadObjectException;
@@ -90,6 +92,7 @@
     private static final int MSG_ON_DEVICE_CREDENTIAL_PRESSED = 12;
     private static final int MSG_ON_SYSTEM_EVENT = 13;
     private static final int MSG_CLIENT_DIED = 14;
+    private static final int MSG_ON_DIALOG_ANIMATED_IN = 15;
 
     private final Injector mInjector;
     private final DevicePolicyManager mDevicePolicyManager;
@@ -221,6 +224,11 @@
                     break;
                 }
 
+                case MSG_ON_DIALOG_ANIMATED_IN: {
+                    handleOnDialogAnimatedIn();
+                    break;
+                }
+
                 default:
                     Slog.e(TAG, "Unknown message: " + msg);
                     break;
@@ -451,6 +459,11 @@
         public void onSystemEvent(int event) {
             mHandler.obtainMessage(MSG_ON_SYSTEM_EVENT, event).sendToTarget();
         }
+
+        @Override
+        public void onDialogAnimatedIn() {
+            mHandler.obtainMessage(MSG_ON_DIALOG_ANIMATED_IN).sendToTarget();
+        }
     };
 
     private final AuthSession.ClientDeathReceiver mClientDeathReceiver = () -> {
@@ -594,20 +607,6 @@
                 }
             }
 
-            // This happens infrequently enough, not worth caching.
-            final String[] configs = mInjector.getConfiguration(getContext());
-            boolean idFound = false;
-            for (int i = 0; i < configs.length; i++) {
-                SensorConfig config = new SensorConfig(configs[i]);
-                if (config.id == id) {
-                    idFound = true;
-                    break;
-                }
-            }
-            if (!idFound) {
-                throw new IllegalStateException("Cannot register unknown id");
-            }
-
             mSensors.add(new BiometricSensor(id, modality, strength, authenticator) {
                 @Override
                 boolean confirmationAlwaysRequired(int userId) {
@@ -763,6 +762,16 @@
         public DevicePolicyManager getDevicePolicyManager(Context context) {
             return context.getSystemService(DevicePolicyManager.class);
         }
+
+        public List<FingerprintSensorPropertiesInternal> getFingerprintSensorProperties(
+                Context context) {
+            final FingerprintManager fpm = context.getSystemService(FingerprintManager.class);
+            if (fpm != null) {
+                return fpm.getSensorPropertiesInternal();
+            } else {
+                return new ArrayList<>();
+            }
+        }
     }
 
     /**
@@ -946,7 +955,7 @@
 
     private void handleClientDied() {
         if (mCurrentAuthSession == null) {
-            Slog.e(TAG, "Auth session null");
+            Slog.e(TAG, "handleClientDied: AuthSession is null");
             return;
         }
 
@@ -957,6 +966,15 @@
         }
     }
 
+    private void handleOnDialogAnimatedIn() {
+        if (mCurrentAuthSession == null) {
+            Slog.e(TAG, "handleOnDialogAnimatedIn: AuthSession is null");
+            return;
+        }
+
+        mCurrentAuthSession.onDialogAnimatedIn();
+    }
+
     /**
      * Invoked when each service has notified that its client is ready to be started. When
      * all biometrics are ready, this invokes the SystemUI dialog through StatusBar.
@@ -1040,7 +1058,8 @@
         mCurrentAuthSession = new AuthSession(getContext(), mStatusBarService, mSysuiReceiver,
                 mKeyStore, mRandom, mClientDeathReceiver, preAuthInfo, token, operationId, userId,
                 mBiometricSensorReceiver, receiver, opPackageName, promptInfo, callingUid,
-                callingPid, callingUserId, debugEnabled);
+                callingPid, callingUserId, debugEnabled,
+                mInjector.getFingerprintSensorProperties(getContext()));
         try {
             mCurrentAuthSession.goToInitialState();
         } catch (RemoteException e) {
@@ -1067,5 +1086,12 @@
             pw.println(" " + sensor);
         }
         pw.println("CurrentSession: " + mCurrentAuthSession);
+
+        final List<FingerprintSensorPropertiesInternal> fpProps =
+                mInjector.getFingerprintSensorProperties(getContext());
+        pw.println("FingerprintSensorProperties: " + fpProps.size());
+        for (FingerprintSensorPropertiesInternal prop : fpProps) {
+            pw.println(" " + prop);
+        }
     }
 }
diff --git a/services/core/java/com/android/server/biometrics/Utils.java b/services/core/java/com/android/server/biometrics/Utils.java
index 88804e2..6741942 100644
--- a/services/core/java/com/android/server/biometrics/Utils.java
+++ b/services/core/java/com/android/server/biometrics/Utils.java
@@ -453,7 +453,7 @@
      * {@link SensorPropertiesInternal} strength.
      */
     public static @SensorProperties.Strength int authenticatorStrengthToPropertyStrength(
-            @BiometricManager.Authenticators.Types int strength) {
+            @Authenticators.Types int strength) {
         switch (strength) {
             case BiometricManager.Authenticators.BIOMETRIC_CONVENIENCE:
                 return SensorProperties.STRENGTH_CONVENIENCE;
@@ -465,4 +465,18 @@
                 throw new IllegalArgumentException("Unknown strength: " + strength);
         }
     }
+
+    public static @Authenticators.Types int propertyStrengthToAuthenticatorStrength(
+            @SensorProperties.Strength int strength) {
+        switch (strength) {
+            case SensorProperties.STRENGTH_CONVENIENCE:
+                return Authenticators.BIOMETRIC_CONVENIENCE;
+            case SensorProperties.STRENGTH_WEAK:
+                return Authenticators.BIOMETRIC_WEAK;
+            case SensorProperties.STRENGTH_STRONG:
+                return Authenticators.BIOMETRIC_STRONG;
+            default:
+                throw new IllegalArgumentException("Unknown strength: " + strength);
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
index ce2d340..2784f46 100644
--- a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
+++ b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
@@ -20,6 +20,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.Context;
+import android.hardware.biometrics.BiometricConstants;
 import android.hardware.biometrics.IBiometricService;
 import android.os.Handler;
 import android.os.IBinder;
@@ -378,9 +379,20 @@
             return;
         }
         if (mCurrentOperation.state != Operation.STATE_WAITING_FOR_COOKIE) {
-            Slog.e(getTag(), "Operation is in the wrong state: " + mCurrentOperation
-                    + ", expected STATE_WAITING_FOR_COOKIE");
-            return;
+            if (mCurrentOperation.state == Operation.STATE_WAITING_IN_QUEUE_CANCELING) {
+                Slog.d(getTag(), "Operation was marked for cancellation, cancelling now: "
+                        + mCurrentOperation);
+                // This should trigger the internal onClientFinished callback, which clears the
+                // operation and starts the next one.
+                final Interruptable interruptable = (Interruptable) mCurrentOperation.clientMonitor;
+                interruptable.onError(BiometricConstants.BIOMETRIC_ERROR_CANCELED,
+                        0 /* vendorCode */);
+                return;
+            } else {
+                Slog.e(getTag(), "Operation is in the wrong state: " + mCurrentOperation
+                        + ", expected STATE_WAITING_FOR_COOKIE");
+                return;
+            }
         }
         if (mCurrentOperation.clientMonitor.getCookie() != cookie) {
             Slog.e(getTag(), "Mismatched cookie for operation: " + mCurrentOperation
@@ -461,6 +473,13 @@
             Slog.w(getTag(), "Cancel already invoked for operation: " + operation);
             return;
         }
+        if (operation.state == Operation.STATE_WAITING_FOR_COOKIE) {
+            Slog.w(getTag(), "Skipping cancellation for non-started operation: " + operation);
+            // We can set it to null immediately, since the HAL was never notified to start.
+            mCurrentOperation = null;
+            startNextOperationIfIdle();
+            return;
+        }
         Slog.d(getTag(), "[Cancelling] Current client: " + operation.clientMonitor);
         final Interruptable interruptable = (Interruptable) operation.clientMonitor;
         interruptable.cancel();
@@ -505,8 +524,9 @@
                 mCurrentOperation.clientMonitor instanceof AuthenticationConsumer;
         final boolean tokenMatches = mCurrentOperation.clientMonitor.getToken() == token;
         if (!isAuthenticating || !tokenMatches) {
-            Slog.w(getTag(), "Not cancelling authentication, isEnrolling: " + isAuthenticating
-                    + " tokenMatches: " + tokenMatches);
+            Slog.w(getTag(), "Not cancelling authentication"
+                    + ", current operation : " + mCurrentOperation
+                    + ", tokenMatches: " + tokenMatches);
             return;
         }
 
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java b/services/core/java/com/android/server/biometrics/sensors/BiometricServiceCallback.java
similarity index 64%
copy from packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java
copy to services/core/java/com/android/server/biometrics/sensors/BiometricServiceCallback.java
index 4de3166..2ae6ccd 100644
--- a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java
+++ b/services/core/java/com/android/server/biometrics/sensors/BiometricServiceCallback.java
@@ -14,15 +14,15 @@
  * limitations under the License.
  */
 
-package com.android.systemui;
-
-import dagger.Module;
+package com.android.server.biometrics.sensors;
 
 /**
- * Dagger module for including the CarSysUIComponent.
- *
- * TODO(b/162923491): Remove or otherwise refactor this module. This is a stop gap.
+ * System_server services that require BiometricService to load before finishing initialization
+ * should implement this interface.
  */
-@Module(subcomponents = {CarSysUIComponent.class})
-public abstract class CarSysUIComponentModule {
+public interface BiometricServiceCallback {
+    /**
+     * Notifies the service that BiometricService is initialized.
+     */
+    void onBiometricServiceReady();
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/ClientMonitorCallbackConverter.java b/services/core/java/com/android/server/biometrics/sensors/ClientMonitorCallbackConverter.java
index c87f62f..61e7c89 100644
--- a/services/core/java/com/android/server/biometrics/sensors/ClientMonitorCallbackConverter.java
+++ b/services/core/java/com/android/server/biometrics/sensors/ClientMonitorCallbackConverter.java
@@ -37,7 +37,7 @@
  * It may be possible at some point in the future to combine I<Sensor>ServiceReceivers to share
  * a common interface.
  */
-public final class ClientMonitorCallbackConverter {
+public class ClientMonitorCallbackConverter {
     private IBiometricSensorReceiver mSensorReceiver; // BiometricService
     private IFaceServiceReceiver mFaceServiceReceiver; // FaceManager
     private IFingerprintServiceReceiver mFingerprintServiceReceiver; // FingerprintManager
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java
index e742d10..b3e6cad 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java
@@ -32,10 +32,10 @@
     private final IFaceService mFaceService;
     private final int mSensorId;
 
-    public FaceAuthenticator(IFaceService faceService, SensorConfig config)
+    public FaceAuthenticator(IFaceService faceService, int sensorId)
             throws RemoteException {
         mFaceService = faceService;
-        mSensorId = config.id;
+        mSensorId = sensorId;
     }
 
     @Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
index 65e57f1..1e0764a 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
@@ -19,6 +19,7 @@
 import static android.Manifest.permission.INTERACT_ACROSS_USERS;
 import static android.Manifest.permission.MANAGE_BIOMETRIC;
 import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL;
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -26,6 +27,7 @@
 import android.hardware.biometrics.BiometricManager;
 import android.hardware.biometrics.BiometricsProtoEnums;
 import android.hardware.biometrics.IBiometricSensorReceiver;
+import android.hardware.biometrics.IBiometricService;
 import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
 import android.hardware.biometrics.face.IFace;
 import android.hardware.biometrics.face.SensorProps;
@@ -54,7 +56,9 @@
 import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
 import com.android.server.biometrics.sensors.LockoutResetDispatcher;
 import com.android.server.biometrics.sensors.LockoutTracker;
+import com.android.server.biometrics.sensors.BiometricServiceCallback;
 import com.android.server.biometrics.sensors.face.aidl.FaceProvider;
+import com.android.server.biometrics.sensors.face.hidl.Face10;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -67,10 +71,11 @@
  * The service is responsible for maintaining a list of clients and dispatching all
  * face-related events.
  */
-public class FaceService extends SystemService {
+public class FaceService extends SystemService implements BiometricServiceCallback {
 
     protected static final String TAG = "FaceService";
 
+    private final FaceServiceWrapper mServiceWrapper;
     private final LockoutResetDispatcher mLockoutResetDispatcher;
     private final LockPatternUtils mLockPatternUtils;
     @NonNull
@@ -506,21 +511,23 @@
                 @BiometricManager.Authenticators.Types int strength) {
             Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
             mServiceProviders.add(
-                    new com.android.server.biometrics.sensors.face.hidl.Face10(getContext(),
-                            sensorId, strength, mLockoutResetDispatcher));
+                    new Face10(getContext(), sensorId, strength, mLockoutResetDispatcher));
         }
     }
 
     public FaceService(Context context) {
         super(context);
+        mServiceWrapper = new FaceServiceWrapper();
         mLockoutResetDispatcher = new LockoutResetDispatcher(context);
         mLockPatternUtils = new LockPatternUtils(context);
         mServiceProviders = new ArrayList<>();
-
-        initializeAidlHals();
     }
 
-    private void initializeAidlHals() {
+    @Override
+    public void onBiometricServiceReady() {
+        final IBiometricService biometricService = IBiometricService.Stub.asInterface(
+                ServiceManager.getService(Context.BIOMETRIC_SERVICE));
+
         final String[] instances = ServiceManager.getDeclaredInstances(IFace.DESCRIPTOR);
         if (instances == null || instances.length == 0) {
             return;
@@ -543,6 +550,23 @@
                     final FaceProvider provider = new FaceProvider(getContext(), props, instance,
                             mLockoutResetDispatcher);
                     mServiceProviders.add(provider);
+
+                    // Register each sensor individually with BiometricService
+                    for (SensorProps prop : props) {
+                        final int sensorId = prop.commonProps.sensorId;
+                        @BiometricManager.Authenticators.Types int strength =
+                                Utils.propertyStrengthToAuthenticatorStrength(
+                                        prop.commonProps.sensorStrength);
+                        final FaceAuthenticator authenticator =
+                                new FaceAuthenticator(mServiceWrapper, sensorId);
+                        try {
+                            biometricService.registerAuthenticator(sensorId, TYPE_FACE, strength,
+                                    authenticator);
+                        } catch (RemoteException e) {
+                            Slog.e(TAG, "Remote exception when registering sensorId: "
+                                    + sensorId);
+                        }
+                    }
                 } catch (RemoteException e) {
                     Slog.e(TAG, "Remote exception when initializing instance: " + fqName);
                 }
@@ -552,7 +576,7 @@
 
     @Override
     public void onStart() {
-        publishBinderService(Context.FACE_SERVICE, new FaceServiceWrapper());
+        publishBinderService(Context.FACE_SERVICE, mServiceWrapper);
     }
 
     private native NativeHandle convertSurfaceToNativeHandle(Surface surface);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java
index f77bc79..9f9d9cc 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java
@@ -32,10 +32,10 @@
     private final IFingerprintService mFingerprintService;
     private final int mSensorId;
 
-    public FingerprintAuthenticator(IFingerprintService fingerprintService, SensorConfig config)
+    public FingerprintAuthenticator(IFingerprintService fingerprintService, int sensorId)
             throws RemoteException {
         mFingerprintService = fingerprintService;
-        mSensorId = config.id;
+        mSensorId = sensorId;
     }
 
     @Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
index 99569b1..b84d095 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
@@ -24,14 +24,17 @@
 import static android.Manifest.permission.USE_BIOMETRIC;
 import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL;
 import static android.Manifest.permission.USE_FINGERPRINT;
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.AppOpsManager;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.hardware.biometrics.BiometricManager;
 import android.hardware.biometrics.BiometricsProtoEnums;
 import android.hardware.biometrics.IBiometricSensorReceiver;
+import android.hardware.biometrics.IBiometricService;
 import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
 import android.hardware.biometrics.ITestSession;
 import android.hardware.biometrics.fingerprint.IFingerprint;
@@ -65,6 +68,7 @@
 import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
 import com.android.server.biometrics.sensors.LockoutResetDispatcher;
 import com.android.server.biometrics.sensors.LockoutTracker;
+import com.android.server.biometrics.sensors.BiometricServiceCallback;
 import com.android.server.biometrics.sensors.fingerprint.aidl.FingerprintProvider;
 import com.android.server.biometrics.sensors.fingerprint.hidl.Fingerprint21;
 import com.android.server.biometrics.sensors.fingerprint.hidl.Fingerprint21UdfpsMock;
@@ -80,7 +84,7 @@
  * The service is responsible for maintaining a list of clients and dispatching all
  * fingerprint-related events.
  */
-public class FingerprintService extends SystemService {
+public class FingerprintService extends SystemService implements BiometricServiceCallback {
 
     protected static final String TAG = "FingerprintService";
 
@@ -88,6 +92,7 @@
     private final LockoutResetDispatcher mLockoutResetDispatcher;
     private final GestureAvailabilityDispatcher mGestureAvailabilityDispatcher;
     private final LockPatternUtils mLockPatternUtils;
+    private final FingerprintServiceWrapper mServiceWrapper;
     @NonNull private List<ServiceProvider> mServiceProviders;
 
     /**
@@ -572,7 +577,8 @@
         }
 
         @Override // Binder call
-        public void initializeConfiguration(int sensorId, int strength) {
+        public void initializeConfiguration(int sensorId,
+                @BiometricManager.Authenticators.Types int strength) {
             Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
 
             final Fingerprint21 fingerprint21;
@@ -626,16 +632,19 @@
 
     public FingerprintService(Context context) {
         super(context);
+        mServiceWrapper = new FingerprintServiceWrapper();
         mAppOps = context.getSystemService(AppOpsManager.class);
         mGestureAvailabilityDispatcher = new GestureAvailabilityDispatcher();
         mLockoutResetDispatcher = new LockoutResetDispatcher(context);
         mLockPatternUtils = new LockPatternUtils(context);
         mServiceProviders = new ArrayList<>();
-
-        initializeAidlHals();
     }
 
-    private void initializeAidlHals() {
+    @Override
+    public void onBiometricServiceReady() {
+        final IBiometricService biometricService = IBiometricService.Stub.asInterface(
+                        ServiceManager.getService(Context.BIOMETRIC_SERVICE));
+
         final String[] instances = ServiceManager.getDeclaredInstances(IFingerprint.DESCRIPTOR);
         if (instances == null || instances.length == 0) {
             return;
@@ -659,6 +668,23 @@
                             new FingerprintProvider(getContext(), props, instance,
                                     mLockoutResetDispatcher, mGestureAvailabilityDispatcher);
                     mServiceProviders.add(provider);
+
+                    // Register each sensor individually with BiometricService
+                    for (SensorProps prop : props) {
+                        final int sensorId = prop.commonProps.sensorId;
+                        @BiometricManager.Authenticators.Types int strength =
+                                Utils.propertyStrengthToAuthenticatorStrength(
+                                        prop.commonProps.sensorStrength);
+                        final FingerprintAuthenticator authenticator =
+                                new FingerprintAuthenticator(mServiceWrapper, sensorId);
+                        try {
+                            biometricService.registerAuthenticator(sensorId,
+                                    TYPE_FINGERPRINT, strength, authenticator);
+                        } catch (RemoteException e) {
+                            Slog.e(TAG, "Remote exception when registering sensorId: "
+                                    + sensorId);
+                        }
+                    }
                 } catch (RemoteException e) {
                     Slog.e(TAG, "Remote exception when initializing instance: " + fqName);
                 }
@@ -668,7 +694,7 @@
 
     @Override
     public void onStart() {
-        publishBinderService(Context.FINGERPRINT_SERVICE, new FingerprintServiceWrapper());
+        publishBinderService(Context.FINGERPRINT_SERVICE, mServiceWrapper);
     }
 
     @Nullable
diff --git a/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java
index 0400ef5..b756d8e 100644
--- a/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java
+++ b/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java
@@ -31,10 +31,8 @@
 public final class IrisAuthenticator extends IBiometricAuthenticator.Stub {
     private final IIrisService mIrisService;
 
-    public IrisAuthenticator(IIrisService irisService, SensorConfig config) throws
-            RemoteException {
+    public IrisAuthenticator(IIrisService irisService, int sensorId) throws RemoteException {
         mIrisService = irisService;
-        mIrisService.initializeConfiguration(config.id);
     }
 
     @Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/iris/IrisService.java b/services/core/java/com/android/server/biometrics/sensors/iris/IrisService.java
index bcf63dc..08b2489 100644
--- a/services/core/java/com/android/server/biometrics/sensors/iris/IrisService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/iris/IrisService.java
@@ -42,7 +42,7 @@
      */
     private final class IrisServiceWrapper extends IIrisService.Stub {
         @Override // Binder call
-        public void initializeConfiguration(int sensorId) {
+        public void initializeConfiguration(int sensorId, int strength) {
             Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
         }
     }
diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java
index e9c4b51..9a1f1e5 100644
--- a/services/core/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/core/java/com/android/server/content/SyncStorageEngine.java
@@ -50,6 +50,8 @@
 import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 import android.util.proto.ProtoInputStream;
 import android.util.proto.ProtoOutputStream;
@@ -1635,8 +1637,7 @@
             if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
                 Slog.v(TAG_FILE, "Reading " + mAccountInfoFile.getBaseFile());
             }
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(fis, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(fis);
             int eventType = parser.getEventType();
             while (eventType != XmlPullParser.START_TAG &&
                     eventType != XmlPullParser.END_DOCUMENT) {
@@ -1988,8 +1989,7 @@
 
         try {
             fos = mAccountInfoFile.startWrite();
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(fos, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(fos);
             out.startDocument(null, true);
             out.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
 
diff --git a/services/core/java/com/android/server/display/AmbientBrightnessStatsTracker.java b/services/core/java/com/android/server/display/AmbientBrightnessStatsTracker.java
index 6e571bd..928799b 100644
--- a/services/core/java/com/android/server/display/AmbientBrightnessStatsTracker.java
+++ b/services/core/java/com/android/server/display/AmbientBrightnessStatsTracker.java
@@ -22,6 +22,8 @@
 import android.os.SystemClock;
 import android.os.UserManager;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -165,8 +167,7 @@
         }
 
         public void writeToXML(OutputStream stream) throws IOException {
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(stream, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(stream);
             out.startDocument(null, true);
             out.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
 
@@ -206,8 +207,7 @@
         public void readFromXML(InputStream stream) throws IOException {
             try {
                 Map<Integer, Deque<AmbientBrightnessDayStats>> parsedStats = new HashMap<>();
-                XmlPullParser parser = Xml.newPullParser();
-                parser.setInput(stream, StandardCharsets.UTF_8.name());
+                TypedXmlPullParser parser = Xml.resolvePullParser(stream);
 
                 int type;
                 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
diff --git a/services/core/java/com/android/server/display/BrightnessTracker.java b/services/core/java/com/android/server/display/BrightnessTracker.java
index 9e82d4f..3ae99ef 100644
--- a/services/core/java/com/android/server/display/BrightnessTracker.java
+++ b/services/core/java/com/android/server/display/BrightnessTracker.java
@@ -55,6 +55,8 @@
 import android.provider.Settings;
 import android.util.AtomicFile;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 import android.view.Display;
 
@@ -536,8 +538,7 @@
     @VisibleForTesting
     @GuardedBy("mEventsLock")
     void writeEventsLocked(OutputStream stream) throws IOException {
-        XmlSerializer out = new FastXmlSerializer();
-        out.setOutput(stream, StandardCharsets.UTF_8.name());
+        TypedXmlSerializer out = Xml.resolveSerializer(stream);
         out.startDocument(null, true);
         out.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
 
@@ -607,8 +608,7 @@
     @GuardedBy("mEventsLock")
     void readEventsLocked(InputStream stream) throws IOException {
         try {
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(stream, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(stream);
 
             int type;
             while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 3ac2185..004e481 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -89,6 +89,7 @@
 import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.SparseIntArray;
 import android.util.Spline;
 import android.view.Display;
 import android.view.DisplayInfo;
@@ -96,6 +97,7 @@
 import android.view.Surface;
 import android.view.SurfaceControl;
 
+import com.android.internal.BrightnessSynchronizer;
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.DumpUtils;
@@ -112,7 +114,6 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
-import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.function.Consumer;
@@ -235,15 +236,28 @@
     private final DisplayBlanker mDisplayBlanker = new DisplayBlanker() {
         @Override
         public void requestDisplayState(int displayId, int state, float brightness) {
+            // TODO (b/168210494): Stop applying default display state to all displays.
+            if (displayId != Display.DEFAULT_DISPLAY) {
+                return;
+            }
+            final int[] displayIds;
+            synchronized (mSyncRoot) {
+                displayIds = mLogicalDisplayMapper.getDisplayIdsLocked();
+            }
+
             // The order of operations is important for legacy reasons.
             if (state == Display.STATE_OFF) {
-                requestGlobalDisplayStateInternal(state, brightness);
+                for (int id : displayIds) {
+                    requestDisplayStateInternal(id, state, brightness);
+                }
             }
 
             mDisplayPowerCallbacks.onDisplayStateChange(state);
 
             if (state != Display.STATE_OFF) {
-                requestGlobalDisplayStateInternal(state, brightness);
+                for (int id : displayIds) {
+                    requestDisplayStateInternal(id, state, brightness);
+                }
             }
         }
     };
@@ -257,13 +271,16 @@
     /** The {@link Handler} used by all {@link DisplayPowerController}s. */
     private Handler mPowerHandler;
 
-    // The overall display state, independent of changes that might influence one
-    // display or another in particular.
-    private int mGlobalDisplayState = Display.STATE_ON;
+    // A map from LogicalDisplay ID to display power state.
+    @GuardedBy("mSyncRoot")
+    private final SparseIntArray mDisplayStates = new SparseIntArray();
 
-    // The overall display brightness.
-    // For now, this only applies to the default display but we may split it up eventually.
-    private float mGlobalDisplayBrightness;
+    // A map from LogicalDisplay ID to display brightness.
+    @GuardedBy("mSyncRoot")
+    private final SparseArray<Float> mDisplayBrightnesses = new SparseArray<>();
+
+    // The default brightness.
+    private final float mDisplayDefaultBrightness;
 
     // Set to true when there are pending display changes that have yet to be applied
     // to the surface flinger state.
@@ -317,11 +334,6 @@
     // DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY flag set.
     private final int mDefaultDisplayDefaultColorMode;
 
-    // Temporary list of deferred work to perform when setting the display state.
-    // Only used by requestDisplayState.  The field is self-synchronized and only
-    // intended for use inside of the requestGlobalDisplayStateInternal function.
-    private final ArrayList<Runnable> mTempDisplayStateWorkQueue = new ArrayList<Runnable>();
-
     // Lists of UIDs that are present on the displays. Maps displayId -> array of UIDs.
     private final SparseArray<IntArray> mDisplayAccessUIDs = new SparseArray<>();
 
@@ -372,7 +384,7 @@
         mMinimumBrightnessSpline = Spline.createSpline(lux, nits);
 
         PowerManager pm = mContext.getSystemService(PowerManager.class);
-        mGlobalDisplayBrightness = pm.getBrightnessConstraint(
+        mDisplayDefaultBrightness = pm.getBrightnessConstraint(
                 PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT);
         mCurrentUserId = UserHandle.USER_SYSTEM;
         ColorSpace[] colorSpaces = SurfaceControl.getCompositionColorSpaces();
@@ -589,7 +601,7 @@
         }
     }
 
-    private void requestGlobalDisplayStateInternal(int state, float brightnessState) {
+    private void requestDisplayStateInternal(int displayId, int state, float brightnessState) {
         if (state == Display.STATE_UNKNOWN) {
             state = Display.STATE_ON;
         }
@@ -602,38 +614,40 @@
             brightnessState = PowerManager.BRIGHTNESS_MAX;
         }
 
-        synchronized (mTempDisplayStateWorkQueue) {
-            try {
-                // Update the display state within the lock.
-                // Note that we do not need to schedule traversals here although it
-                // may happen as a side-effect of displays changing state.
-                synchronized (mSyncRoot) {
-                    if (mGlobalDisplayState == state
-                            && mGlobalDisplayBrightness == brightnessState) {
-                        return; // no change
-                    }
+        // Update the display state within the lock.
+        // Note that we do not need to schedule traversals here although it
+        // may happen as a side-effect of displays changing state.
+        final Runnable runnable;
+        final String traceMessage;
+        synchronized (mSyncRoot) {
+            final int index = mDisplayStates.indexOfKey(displayId);
 
-                    Trace.traceBegin(Trace.TRACE_TAG_POWER, "requestGlobalDisplayState("
-                            + Display.stateToString(state)
-                            + ", brightness=" + brightnessState + ")");
-
-                    mGlobalDisplayState = state;
-                    mGlobalDisplayBrightness = brightnessState;
-                    applyGlobalDisplayStateLocked(mTempDisplayStateWorkQueue);
-                }
-
-                // Setting the display power state can take hundreds of milliseconds
-                // to complete so we defer the most expensive part of the work until
-                // after we have exited the critical section to avoid blocking other
-                // threads for a long time.
-                for (int i = 0; i < mTempDisplayStateWorkQueue.size(); i++) {
-                    mTempDisplayStateWorkQueue.get(i).run();
-                }
-                Trace.traceEnd(Trace.TRACE_TAG_POWER);
-            } finally {
-                mTempDisplayStateWorkQueue.clear();
+            if (index < 0 || (mDisplayStates.valueAt(index) == state
+                    && BrightnessSynchronizer.floatEquals(mDisplayBrightnesses.valueAt(index),
+                    brightnessState))) {
+                return; // Display no longer exists or no change.
             }
+
+            traceMessage = "requestDisplayStateInternal("
+                    + displayId + ", "
+                    + Display.stateToString(state)
+                    + ", brightness=" + brightnessState + ")";
+            Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, traceMessage, displayId);
+
+            mDisplayStates.setValueAt(index, state);
+            mDisplayBrightnesses.setValueAt(index, brightnessState);
+            runnable = updateDisplayStateLocked(
+                    mLogicalDisplayMapper.getLocked(displayId).getPrimaryDisplayDeviceLocked());
         }
+
+        // Setting the display power state can take hundreds of milliseconds
+        // to complete so we defer the most expensive part of the work until
+        // after we have exited the critical section to avoid blocking other
+        // threads for a long time.
+        if (runnable != null) {
+            runnable.run();
+        }
+        Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, traceMessage, displayId);
     }
 
     private class SettingsObserver extends ContentObserver {
@@ -987,6 +1001,8 @@
             recordTopInsetLocked(display);
         }
         addDisplayPowerControllerLocked(displayId);
+        mDisplayStates.append(displayId, Display.STATE_OFF);
+        mDisplayBrightnesses.append(displayId, mDisplayDefaultBrightness);
 
         DisplayManagerGlobal.invalidateLocalDisplayInfoCaches();
 
@@ -1021,6 +1037,8 @@
     private void handleLogicalDisplayRemovedLocked(@NonNull LogicalDisplay display) {
         final int displayId = display.getDisplayIdLocked();
         mDisplayPowerControllers.delete(displayId);
+        mDisplayStates.delete(displayId);
+        mDisplayBrightnesses.delete(displayId);
         DisplayManagerGlobal.invalidateLocalDisplayInfoCaches();
         sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_REMOVED);
         scheduleTraversalLocked(false);
@@ -1035,15 +1053,6 @@
         handleLogicalDisplayChangedLocked(display);
     }
 
-    private void applyGlobalDisplayStateLocked(List<Runnable> workQueue) {
-        mDisplayDeviceRepo.forEachLocked((DisplayDevice device) -> {
-            Runnable runnable = updateDisplayStateLocked(device);
-            if (runnable != null) {
-                workQueue.add(runnable);
-            }
-        });
-    }
-
     private Runnable updateDisplayStateLocked(DisplayDevice device) {
         // Blank or unblank the display immediately to match the state requested
         // by the display power controller (if known).
@@ -1052,12 +1061,16 @@
             // TODO - b/170498827 The rules regarding what display state to apply to each
             // display will depend on the configuration/mapping of logical displays.
             // Clean up LogicalDisplay.isEnabled() mechanism once this is fixed.
-            int state = mGlobalDisplayState;
             final LogicalDisplay display = mLogicalDisplayMapper.getLocked(device);
-            if (display != null && !display.isEnabled()) {
+            final int state;
+            final int displayId = display.getDisplayIdLocked();
+            if (display.isEnabled()) {
+                state = mDisplayStates.get(displayId);
+            } else {
                 state = Display.STATE_OFF;
             }
-            return device.requestDisplayStateLocked(state, mGlobalDisplayBrightness);
+            final float brightness = mDisplayBrightnesses.get(displayId);
+            return device.requestDisplayStateLocked(state, brightness);
         }
         return null;
     }
@@ -1587,13 +1600,24 @@
             pw.println("  mOnlyCode=" + mOnlyCore);
             pw.println("  mSafeMode=" + mSafeMode);
             pw.println("  mPendingTraversal=" + mPendingTraversal);
-            pw.println("  mGlobalDisplayState=" + Display.stateToString(mGlobalDisplayState));
             pw.println("  mViewports=" + mViewports);
             pw.println("  mDefaultDisplayDefaultColorMode=" + mDefaultDisplayDefaultColorMode);
             pw.println("  mWifiDisplayScanRequestCount=" + mWifiDisplayScanRequestCount);
             pw.println("  mStableDisplaySize=" + mStableDisplaySize);
             pw.println("  mMinimumBrightnessCurve=" + mMinimumBrightnessCurve);
 
+            pw.println();
+            final int displayStateCount = mDisplayStates.size();
+            pw.println("Display States: size=" + displayStateCount);
+            for (int i = 0; i < displayStateCount; i++) {
+                final int displayId = mDisplayStates.keyAt(i);
+                final int displayState = mDisplayStates.valueAt(i);
+                final float brightness = mDisplayBrightnesses.valueAt(i);
+                pw.println("  Display Id=" + displayId);
+                pw.println("  Display State=" + Display.stateToString(displayState));
+                pw.println("  Display Brightness=" + brightness);
+            }
+
             IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "    ");
             ipw.increaseIndent();
 
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 09c9aab..f488260 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -685,8 +685,6 @@
     }
 
     private void initialize() {
-        // Initialize the power state object for the default display.
-        // In the future, we might manage multiple displays independently.
         mPowerState = new DisplayPowerState(mBlanker,
                 mColorFadeEnabled ? new ColorFade(mDisplayId) : null, mDisplayId);
 
diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java
index e35becc..979c3b8 100644
--- a/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -588,7 +588,7 @@
     }
 
     /**
-     * Swap the underlying {@link DisplayDevice} with the specificed LogicalDisplay.
+     * Swap the underlying {@link DisplayDevice} with the specified LogicalDisplay.
      *
      * @param targetDisplay The display with which to swap display-devices.
      * @return {@code true} if the displays were swapped, {@code false} otherwise.
diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
index a843af5..45c38b4 100644
--- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java
+++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
@@ -17,6 +17,7 @@
 package com.android.server.display;
 
 import android.content.Context;
+import android.os.Process;
 import android.os.SystemProperties;
 import android.text.TextUtils;
 import android.util.Slog;
@@ -149,6 +150,10 @@
         return null;
     }
 
+    public int[] getDisplayIdsLocked() {
+        return getDisplayIdsLocked(Process.SYSTEM_UID);
+    }
+
     public int[] getDisplayIdsLocked(int callingUid) {
         final int count = mLogicalDisplays.size();
         int[] displayIds = new int[count];
diff --git a/services/core/java/com/android/server/display/PersistentDataStore.java b/services/core/java/com/android/server/display/PersistentDataStore.java
index 09b0b3a..494dd39 100644
--- a/services/core/java/com/android/server/display/PersistentDataStore.java
+++ b/services/core/java/com/android/server/display/PersistentDataStore.java
@@ -25,6 +25,7 @@
 import android.util.SparseArray;
 import android.util.SparseLongArray;
 import android.util.TimeUtils;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 import android.view.Display;
 
@@ -323,8 +324,7 @@
 
         XmlPullParser parser;
         try {
-            parser = Xml.newPullParser();
-            parser.setInput(new BufferedInputStream(is), StandardCharsets.UTF_8.name());
+            parser = Xml.resolvePullParser(is);
             loadFromXml(parser);
         } catch (IOException ex) {
             Slog.w(TAG, "Failed to load display manager persistent store data.", ex);
@@ -343,8 +343,7 @@
             os = mInjector.startWrite();
             boolean success = false;
             try {
-                XmlSerializer serializer = new FastXmlSerializer();
-                serializer.setOutput(new BufferedOutputStream(os), StandardCharsets.UTF_8.name());
+                TypedXmlSerializer serializer = Xml.resolveSerializer(os);
                 saveToXml(serializer);
                 serializer.flush();
                 success = true;
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java
index 3794da3..0566d32 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java
@@ -23,6 +23,7 @@
 import android.annotation.Nullable;
 import android.annotation.StringDef;
 import android.content.Context;
+import android.content.SharedPreferences;
 import android.hardware.hdmi.HdmiControlManager;
 import android.os.Environment;
 import android.os.SystemProperties;
@@ -59,15 +60,19 @@
 
     private static final String ETC_DIR = "etc";
     private static final String CONFIG_FILE = "cec_config.xml";
+    private static final String SHARED_PREFS_DIR = "shared_prefs";
+    private static final String SHARED_PREFS_NAME = "cec_config.xml";
 
     @IntDef({
         STORAGE_SYSPROPS,
         STORAGE_GLOBAL_SETTINGS,
+        STORAGE_SHARED_PREFS,
     })
     private @interface Storage {}
 
     private static final int STORAGE_SYSPROPS = 0;
     private static final int STORAGE_GLOBAL_SETTINGS = 1;
+    private static final int STORAGE_SHARED_PREFS = 2;
 
     private static final String VALUE_TYPE_STRING = "string";
     private static final String VALUE_TYPE_INT = "int";
@@ -78,18 +83,6 @@
     })
     private @interface ValueType {}
 
-    /**
-     * System property key for Power State Change on Active Source Lost.
-     */
-    public static final String SYSPROP_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST =
-            "ro.hdmi.cec.source.power_state_change_on_active_source_lost";
-
-    /**
-     * System property key for Audio Mode Muting.
-     */
-    public static final String SYSPROP_SYSTEM_AUDIO_MODE_MUTING =
-            "ro.hdmi.cec.audio.system_audio_mode_muting.enabled";
-
     @NonNull private final Context mContext;
     @NonNull private final StorageAdapter mStorageAdapter;
     @Nullable private final CecSettings mSystemConfig;
@@ -99,6 +92,20 @@
      * Setting storage input/output helper class.
      */
     public static class StorageAdapter {
+        @NonNull private final Context mContext;
+        @NonNull private final SharedPreferences mSharedPrefs;
+
+        StorageAdapter(@NonNull Context context) {
+            mContext = context;
+            // The package info in the context isn't initialized in the way it is for normal apps,
+            // so the standard, name-based context.getSharedPreferences doesn't work. Instead, we
+            // build the path manually below using the same policy that appears in ContextImpl.
+            final Context deviceContext = mContext.createDeviceProtectedStorageContext();
+            final File prefsFile = new File(new File(Environment.getDataSystemDirectory(),
+                                                     SHARED_PREFS_DIR), SHARED_PREFS_NAME);
+            mSharedPrefs = deviceContext.getSharedPreferences(prefsFile, Context.MODE_PRIVATE);
+        }
+
         /**
          * Read the value from a system property.
          * Returns the given default value if the system property is not set.
@@ -120,20 +127,35 @@
          * Read the value from a global setting.
          * Returns the given default value if the system property is not set.
          */
-        public String retrieveGlobalSetting(@NonNull Context context,
-                                            @NonNull String storageKey,
+        public String retrieveGlobalSetting(@NonNull String storageKey,
                                             @NonNull String defaultValue) {
-            String value = Global.getString(context.getContentResolver(), storageKey);
+            String value = Global.getString(mContext.getContentResolver(), storageKey);
             return value != null ? value : defaultValue;
         }
 
         /**
          * Write the value to a global setting.
          */
-        public void storeGlobalSetting(@NonNull Context context,
-                                       @NonNull String storageKey,
+        public void storeGlobalSetting(@NonNull String storageKey,
                                        @NonNull String value) {
-            Global.putString(context.getContentResolver(), storageKey, value);
+            Global.putString(mContext.getContentResolver(), storageKey, value);
+        }
+
+        /**
+         * Read the value from a shared preference.
+         * Returns the given default value if the preference is not set.
+         */
+        public String retrieveSharedPref(@NonNull String storageKey,
+                                         @NonNull String defaultValue) {
+            return mSharedPrefs.getString(storageKey, defaultValue);
+        }
+
+        /**
+         * Write the value to a shared preference.
+         */
+        public void storeSharedPref(@NonNull String storageKey,
+                                    @NonNull String value) {
+            mSharedPrefs.edit().putString(storageKey, value).apply();
         }
     }
 
@@ -155,7 +177,7 @@
     }
 
     HdmiCecConfig(@NonNull Context context) {
-        this(context, new StorageAdapter(),
+        this(context, new StorageAdapter(context),
              readSettingsFromFile(Environment.buildPath(Environment.getRootDirectory(),
                                                         ETC_DIR, CONFIG_FILE)),
              readSettingsFromFile(Environment.buildPath(Environment.getVendorDirectory(),
@@ -234,9 +256,9 @@
             case HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP:
                 return STORAGE_GLOBAL_SETTINGS;
             case HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST:
-                return STORAGE_SYSPROPS;
+                return STORAGE_SHARED_PREFS;
             case HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING:
-                return STORAGE_SYSPROPS;
+                return STORAGE_SHARED_PREFS;
             default:
                 throw new RuntimeException("Invalid CEC setting '" + setting.getName()
                         + "' storage.");
@@ -252,9 +274,9 @@
             case HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP:
                 return Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP;
             case HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST:
-                return SYSPROP_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST;
+                return setting.getName();
             case HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING:
-                return SYSPROP_SYSTEM_AUDIO_MODE_MUTING;
+                return setting.getName();
             default:
                 throw new RuntimeException("Invalid CEC setting '" + setting.getName()
                     + "' storage key.");
@@ -269,7 +291,10 @@
             return mStorageAdapter.retrieveSystemProperty(storageKey, defaultValue);
         } else if (storage == STORAGE_GLOBAL_SETTINGS) {
             Slog.d(TAG, "Reading '" + storageKey + "' global setting.");
-            return mStorageAdapter.retrieveGlobalSetting(mContext, storageKey, defaultValue);
+            return mStorageAdapter.retrieveGlobalSetting(storageKey, defaultValue);
+        } else if (storage == STORAGE_SHARED_PREFS) {
+            Slog.d(TAG, "Reading '" + storageKey + "' shared preference.");
+            return mStorageAdapter.retrieveSharedPref(storageKey, defaultValue);
         }
         return null;
     }
@@ -282,7 +307,10 @@
             mStorageAdapter.storeSystemProperty(storageKey, value);
         } else if (storage == STORAGE_GLOBAL_SETTINGS) {
             Slog.d(TAG, "Setting '" + storageKey + "' global setting.");
-            mStorageAdapter.storeGlobalSetting(mContext, storageKey, value);
+            mStorageAdapter.storeGlobalSetting(storageKey, value);
+        } else if (storage == STORAGE_SHARED_PREFS) {
+            Slog.d(TAG, "Setting '" + storageKey + "' shared pref.");
+            mStorageAdapter.storeSharedPref(storageKey, value);
         }
     }
 
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
index 4110de6..46b09dc 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
@@ -778,11 +778,14 @@
             switchToAudioInput();
         }
         // Mute device when feature is turned off and unmute device when feature is turned on.
-        // PROPERTY_SYSTEM_AUDIO_MODE_MUTING_ENABLE is false when device never needs to be muted.
+        // CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING is false when device never needs to be muted.
+        boolean systemAudioModeMutingEnabled = mService.getHdmiCecConfig().getIntValue(
+                    HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING)
+                        == HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_ENABLED;
         boolean currentMuteStatus =
                 mService.getAudioManager().isStreamMute(AudioManager.STREAM_MUSIC);
         if (currentMuteStatus == newSystemAudioMode) {
-            if (HdmiProperties.system_audio_mode_muting().orElse(true) || newSystemAudioMode) {
+            if (systemAudioModeMutingEnabled || newSystemAudioMode) {
                 mService.getAudioManager()
                         .adjustStreamVolume(
                                 AudioManager.STREAM_MUSIC,
@@ -806,7 +809,7 @@
         // Audio Mode is off even without terminating the ARC. This can stop the current
         // audio device from playing audio when system audio mode is off.
         if (mArcIntentUsed
-                && !HdmiProperties.system_audio_mode_muting().orElse(true)
+                && !systemAudioModeMutingEnabled
                 && !newSystemAudioMode
                 && getLocalActivePort() == Constants.CEC_SWITCH_ARC) {
             routeToInputFromPortId(getRoutingPort());
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
index 9877919..109f6a7 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
@@ -66,13 +66,6 @@
                     .playback_device_action_on_routing_control()
                     .orElse(HdmiProperties.playback_device_action_on_routing_control_values.NONE);
 
-    // Behaviour of the device when <Active Source> is lost in favor of another device.
-    @VisibleForTesting
-    protected HdmiProperties.power_state_change_on_active_source_lost_values
-            mPowerStateChangeOnActiveSourceLost = HdmiProperties
-                    .power_state_change_on_active_source_lost()
-                    .orElse(HdmiProperties.power_state_change_on_active_source_lost_values.NONE);
-
     HdmiCecLocalDevicePlayback(HdmiControlService service) {
         super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
 
@@ -81,14 +74,6 @@
         // The option is false by default. Update settings db as well to have the right
         // initial setting on UI.
         mService.writeBooleanSetting(Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED, mAutoTvOff);
-
-        // Initialize settings database with System Property value. This will be the initial
-        // setting on the UI. If no System Property is set, the option is set to to_tv by default.
-        mService.writeStringSetting(Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
-                mService.readStringSetting(Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
-                        HdmiProperties.send_standby_on_sleep().orElse(
-                                HdmiProperties.send_standby_on_sleep_values.TO_TV).name()
-                                .toLowerCase()));
     }
 
     @Override
@@ -195,11 +180,8 @@
             case HdmiControlService.STANDBY_SCREEN_OFF:
                 // Get latest setting value
                 @HdmiControlManager.StandbyBehavior
-                String sendStandbyOnSleep = mService.readStringSetting(
-                        Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
-                        HdmiProperties.send_standby_on_sleep().orElse(
-                                HdmiProperties.send_standby_on_sleep_values.TO_TV).name()
-                                .toLowerCase());
+                String sendStandbyOnSleep = mService.getHdmiCecConfig().getStringValue(
+                        HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP);
                 switch (sendStandbyOnSleep) {
                     case HdmiControlManager.SEND_STANDBY_ON_SLEEP_TO_TV:
                         mService.sendCecCommand(
@@ -290,11 +272,12 @@
     @ServiceThreadOnly
     protected void onActiveSourceLost() {
         assertRunOnServiceThread();
-        switch (mPowerStateChangeOnActiveSourceLost) {
-            case STANDBY_NOW:
+        switch (mService.getHdmiCecConfig().getStringValue(
+                    HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST)) {
+            case HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW:
                 mService.standby();
                 return;
-            case NONE:
+            case HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE:
                 return;
         }
     }
diff --git a/services/core/java/com/android/server/hdmi/HdmiUtils.java b/services/core/java/com/android/server/hdmi/HdmiUtils.java
index cdc28e6..e47b544 100644
--- a/services/core/java/com/android/server/hdmi/HdmiUtils.java
+++ b/services/core/java/com/android/server/hdmi/HdmiUtils.java
@@ -537,6 +537,33 @@
         return cmd.getParams()[1];
     }
 
+    /**
+     * Build a CEC message from a hex byte string with bytes separated by {@code :}.
+     *
+     * <p>This format is used by both cec-client and www.cec-o-matic.com
+     */
+    public static HdmiCecMessage buildMessage(String message) {
+        String[] parts = message.split(":");
+
+        if (parts.length < 2) {
+            throw new IllegalArgumentException("Message is too short");
+        }
+        for (String part : parts) {
+            if (part.length() != 2) {
+                throw new IllegalArgumentException("Malformatted CEC message: " + message);
+            }
+        }
+
+        int src = Integer.parseInt(parts[0].substring(0, 1), 16);
+        int dest = Integer.parseInt(parts[0].substring(1, 2), 16);
+        int opcode = Integer.parseInt(parts[1], 16);
+        byte[] params = new byte[parts.length - 2];
+        for (int i = 0; i < params.length; i++) {
+            params[i] = (byte) Integer.parseInt(parts[i + 2], 16);
+        }
+        return new HdmiCecMessage(src, dest, opcode, params);
+    }
+
     public static class ShortAudioDescriptorXmlParser {
         // We don't use namespaces
         private static final String NS = null;
diff --git a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
index 53f9a10..f9f97fe 100644
--- a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
+++ b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
@@ -19,7 +19,6 @@
 import android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback;
 import android.hardware.hdmi.IHdmiControlCallback;
 import android.os.RemoteException;
-import android.provider.Settings.Global;
 import android.util.Slog;
 
 import java.util.ArrayList;
@@ -166,8 +165,9 @@
         if (service.isAudioSystemDevice()) {
             return false;
         }
-        String sendStandbyOnSleep = service.readStringSetting(
-                Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP, "");
+        @HdmiControlManager.StandbyBehavior String sendStandbyOnSleep =
+                service.getHdmiCecConfig().getStringValue(
+                        HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP);
         return sendStandbyOnSleep.equals(HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST);
     }
 }
diff --git a/services/core/java/com/android/server/hdmi/VolumeControlAction.java b/services/core/java/com/android/server/hdmi/VolumeControlAction.java
index 0011387..d5761e170 100644
--- a/services/core/java/com/android/server/hdmi/VolumeControlAction.java
+++ b/services/core/java/com/android/server/hdmi/VolumeControlAction.java
@@ -138,7 +138,6 @@
     }
 
     private boolean handleReportAudioStatus(HdmiCecMessage cmd) {
-        byte params[] = cmd.getParams();
         boolean mute = HdmiUtils.isAudioStatusMute(cmd);
         int volume = HdmiUtils.getAudioStatusVolume(cmd);
         mLastAvrVolume = volume;
diff --git a/services/core/java/com/android/server/input/PersistentDataStore.java b/services/core/java/com/android/server/input/PersistentDataStore.java
index 196787a..f61662d 100644
--- a/services/core/java/com/android/server/input/PersistentDataStore.java
+++ b/services/core/java/com/android/server/input/PersistentDataStore.java
@@ -29,6 +29,8 @@
 import android.hardware.input.TouchCalibration;
 import android.util.AtomicFile;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import java.io.BufferedInputStream;
@@ -214,10 +216,9 @@
             return;
         }
 
-        XmlPullParser parser;
+        TypedXmlPullParser parser;
         try {
-            parser = Xml.newPullParser();
-            parser.setInput(new BufferedInputStream(is), StandardCharsets.UTF_8.name());
+            parser = Xml.resolvePullParser(is);
             loadFromXml(parser);
         } catch (IOException ex) {
             Slog.w(InputManagerService.TAG, "Failed to load input manager persistent store data.", ex);
@@ -236,8 +237,7 @@
             os = mAtomicFile.startWrite();
             boolean success = false;
             try {
-                XmlSerializer serializer = new FastXmlSerializer();
-                serializer.setOutput(new BufferedOutputStream(os), StandardCharsets.UTF_8.name());
+                TypedXmlSerializer serializer = Xml.resolveSerializer(os);
                 saveToXml(serializer);
                 serializer.flush();
                 success = true;
diff --git a/services/core/java/com/android/server/inputmethod/AdditionalSubtypeUtils.java b/services/core/java/com/android/server/inputmethod/AdditionalSubtypeUtils.java
index f79ac16..a077b04 100644
--- a/services/core/java/com/android/server/inputmethod/AdditionalSubtypeUtils.java
+++ b/services/core/java/com/android/server/inputmethod/AdditionalSubtypeUtils.java
@@ -25,6 +25,8 @@
 import android.util.ArrayMap;
 import android.util.AtomicFile;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodSubtype;
@@ -139,8 +141,7 @@
         final AtomicFile subtypesFile = getAdditionalSubtypeFile(inputMethodDir);
         try {
             fos = subtypesFile.startWrite();
-            final XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(fos, StandardCharsets.UTF_8.name());
+            final TypedXmlSerializer out = Xml.resolveSerializer(fos);
             out.startDocument(null, true);
             out.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
             out.startTag(null, NODE_SUBTYPES);
@@ -207,8 +208,7 @@
             return;
         }
         try (FileInputStream fis = subtypesFile.openRead()) {
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(fis, StandardCharsets.UTF_8.name());
+            final TypedXmlPullParser parser = Xml.resolvePullParser(fis);
             int type = parser.getEventType();
             // Skip parsing until START_TAG
             while (true) {
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
index 7b29e5b..02a36dc 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
@@ -227,7 +227,7 @@
                     WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG, null /* options */);
             mSettingsContext = new ContextThemeWrapper(
                     windowContext, com.android.internal.R.style.Theme_DeviceDefault_Settings);
-            mSwitchingDialogToken = mSettingsContext.getActivityToken();
+            mSwitchingDialogToken = mSettingsContext.getWindowContextToken();
         }
         // TODO(b/159767464): register the listener to another display again if window token is not
         // yet created.
diff --git a/services/core/java/com/android/server/location/GeocoderProxy.java b/services/core/java/com/android/server/location/GeocoderProxy.java
index 3b74d5a..3ac148d 100644
--- a/services/core/java/com/android/server/location/GeocoderProxy.java
+++ b/services/core/java/com/android/server/location/GeocoderProxy.java
@@ -60,7 +60,11 @@
     }
 
     private boolean register() {
-        return mServiceWatcher.register();
+        boolean resolves = mServiceWatcher.checkServiceResolves();
+        if (resolves) {
+            mServiceWatcher.register();
+        }
+        return resolves;
     }
 
     /**
diff --git a/services/core/java/com/android/server/location/HardwareActivityRecognitionProxy.java b/services/core/java/com/android/server/location/HardwareActivityRecognitionProxy.java
index eed1aac..7b400b6 100644
--- a/services/core/java/com/android/server/location/HardwareActivityRecognitionProxy.java
+++ b/services/core/java/com/android/server/location/HardwareActivityRecognitionProxy.java
@@ -75,7 +75,11 @@
     }
 
     private boolean register() {
-        return mServiceWatcher.register();
+        boolean resolves = mServiceWatcher.checkServiceResolves();
+        if (resolves) {
+            mServiceWatcher.register();
+        }
+        return resolves;
     }
 
     private void onBind(IBinder binder, ComponentName service) throws RemoteException {
diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java
index 086757f..2bb2dcc 100644
--- a/services/core/java/com/android/server/location/LocationManagerService.java
+++ b/services/core/java/com/android/server/location/LocationManagerService.java
@@ -1212,9 +1212,7 @@
 
         ipw.println("Event Log:");
         ipw.increaseIndent();
-        for (String log : mInjector.getLocationEventLog()) {
-            ipw.println(log);
-        }
+        mInjector.getLocationEventLog().iterate(ipw::println);
         ipw.decreaseIndent();
     }
 
diff --git a/services/core/java/com/android/server/location/ProxyLocationProvider.java b/services/core/java/com/android/server/location/ProxyLocationProvider.java
index ce9b10d..555b2d2 100644
--- a/services/core/java/com/android/server/location/ProxyLocationProvider.java
+++ b/services/core/java/com/android/server/location/ProxyLocationProvider.java
@@ -92,7 +92,11 @@
     }
 
     private boolean register() {
-        return mServiceWatcher.register();
+        boolean resolves = mServiceWatcher.checkServiceResolves();
+        if (resolves) {
+            mServiceWatcher.register();
+        }
+        return resolves;
     }
 
     private void onBind(IBinder binder, ComponentName service) throws RemoteException {
diff --git a/services/core/java/com/android/server/location/geofence/GeofenceProxy.java b/services/core/java/com/android/server/location/geofence/GeofenceProxy.java
index 686a66b..bdfa6d7 100644
--- a/services/core/java/com/android/server/location/geofence/GeofenceProxy.java
+++ b/services/core/java/com/android/server/location/geofence/GeofenceProxy.java
@@ -75,16 +75,16 @@
     }
 
     private boolean register(Context context) {
-        if (mServiceWatcher.register()) {
+        boolean resolves = mServiceWatcher.checkServiceResolves();
+        if (resolves) {
+            mServiceWatcher.register();
             context.bindServiceAsUser(
                     new Intent(context, GeofenceHardwareService.class),
                     new GeofenceProxyServiceConnection(),
                     Context.BIND_AUTO_CREATE,
                     UserHandle.SYSTEM);
-            return true;
         }
-
-        return false;
+        return resolves;
     }
 
     private class GeofenceProxyServiceConnection implements ServiceConnection {
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 74491c5..83f4ca2 100644
--- a/services/core/java/com/android/server/location/timezone/LocationTimeZoneManagerService.java
+++ b/services/core/java/com/android/server/location/timezone/LocationTimeZoneManagerService.java
@@ -79,8 +79,8 @@
 
         @Override
         public void onStart() {
-            if (TimeZoneDetectorService.GEOLOCATION_TIME_ZONE_DETECTION_ENABLED) {
-                Context context = getContext();
+            Context context = getContext();
+            if (TimeZoneDetectorService.isGeoLocationTimeZoneDetectionEnabled(context)) {
                 mService = new LocationTimeZoneManagerService(context);
 
                 // The service currently exposes no LocalService or Binder API, but it extends
@@ -93,7 +93,8 @@
 
         @Override
         public void onBootPhase(int phase) {
-            if (TimeZoneDetectorService.GEOLOCATION_TIME_ZONE_DETECTION_ENABLED) {
+            Context context = getContext();
+            if (TimeZoneDetectorService.isGeoLocationTimeZoneDetectionEnabled(context)) {
                 if (phase == PHASE_SYSTEM_SERVICES_READY) {
                     // The location service must be functioning after this boot phase.
                     mService.onSystemReady();
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 3801877..94062fa 100644
--- a/services/core/java/com/android/server/location/timezone/RealLocationTimeZoneProviderProxy.java
+++ b/services/core/java/com/android/server/location/timezone/RealLocationTimeZoneProviderProxy.java
@@ -78,10 +78,14 @@
     }
 
     private boolean register() {
-        return mServiceWatcher.register();
+        boolean resolves = mServiceWatcher.checkServiceResolves();
+        if (resolves) {
+            mServiceWatcher.register();
+        }
+        return resolves;
     }
 
-    private void onBind(IBinder binder, ComponentName componentName) throws RemoteException {
+    private void onBind(IBinder binder, ComponentName componentName) {
         processServiceWatcherCallbackOnThreadingDomainThread(() -> onBindOnHandlerThread(binder));
     }
 
diff --git a/services/core/java/com/android/server/location/util/LocationEventLog.java b/services/core/java/com/android/server/location/util/LocationEventLog.java
index 134b142..0caab05 100644
--- a/services/core/java/com/android/server/location/util/LocationEventLog.java
+++ b/services/core/java/com/android/server/location/util/LocationEventLog.java
@@ -59,46 +59,46 @@
     }
 
     /** Logs a location enabled/disabled event. */
-    public synchronized void logLocationEnabled(int userId, boolean enabled) {
+    public void logLocationEnabled(int userId, boolean enabled) {
         addLogEvent(EVENT_LOCATION_POWER_SAVE_MODE_CHANGE, userId, enabled);
     }
 
     /** Logs a location provider enabled/disabled event. */
-    public synchronized void logProviderEnabled(String provider, int userId, boolean enabled) {
+    public void logProviderEnabled(String provider, int userId, boolean enabled) {
         addLogEvent(EVENT_PROVIDER_ENABLED, provider, userId, enabled);
     }
 
     /** Logs a location provider being replaced/unreplaced by a mock provider. */
-    public synchronized void logProviderMocked(String provider, boolean mocked) {
+    public void logProviderMocked(String provider, boolean mocked) {
         addLogEvent(EVENT_PROVIDER_MOCKED, provider, mocked);
     }
 
     /** Logs a new client registration for a location provider. */
-    public synchronized void logProviderClientRegistered(String provider, CallerIdentity identity,
+    public void logProviderClientRegistered(String provider, CallerIdentity identity,
             LocationRequest request) {
         addLogEvent(EVENT_PROVIDER_REGISTER_CLIENT, provider, identity, request);
     }
 
     /** Logs a client unregistration for a location provider. */
-    public synchronized void logProviderClientUnregistered(String provider,
+    public void logProviderClientUnregistered(String provider,
             CallerIdentity identity) {
         addLogEvent(EVENT_PROVIDER_UNREGISTER_CLIENT, provider, identity);
     }
 
     /** Logs a change to the provider request for a location provider. */
-    public synchronized void logProviderUpdateRequest(String provider, ProviderRequest request) {
+    public void logProviderUpdateRequest(String provider, ProviderRequest request) {
         addLogEvent(EVENT_PROVIDER_UPDATE_REQUEST, provider, request);
     }
 
     /** Logs a new incoming location for a location provider. */
-    public synchronized void logProviderReceivedLocations(String provider, int numLocations) {
+    public void logProviderReceivedLocations(String provider, int numLocations) {
         if (Build.IS_DEBUGGABLE || D) {
             addLogEvent(EVENT_PROVIDER_RECEIVE_LOCATION, provider, numLocations);
         }
     }
 
     /** Logs a location deliver for a client of a location provider. */
-    public synchronized void logProviderDeliveredLocations(String provider, int numLocations,
+    public void logProviderDeliveredLocations(String provider, int numLocations,
             CallerIdentity identity) {
         if (Build.IS_DEBUGGABLE || D) {
             addLogEvent(EVENT_PROVIDER_DELIVER_LOCATION, provider, numLocations, identity);
@@ -106,7 +106,7 @@
     }
 
     /** Logs that the location power save mode has changed. */
-    public synchronized void logLocationPowerSaveMode(
+    public void logLocationPowerSaveMode(
             @LocationPowerSaveMode int locationPowerSaveMode) {
         addLogEvent(EVENT_LOCATION_POWER_SAVE_MODE_CHANGE, locationPowerSaveMode);
     }
diff --git a/services/core/java/com/android/server/media/MediaServerUtils.java b/services/core/java/com/android/server/media/MediaServerUtils.java
new file mode 100644
index 0000000..5fa2b1c
--- /dev/null
+++ b/services/core/java/com/android/server/media/MediaServerUtils.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.media;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Binder;
+
+import java.io.PrintWriter;
+
+/**
+ * Util class for media server.
+ */
+class MediaServerUtils {
+    /**
+     * Verify that caller holds {@link android.Manifest.permission#DUMP}.
+     */
+    public static boolean checkDumpPermission(Context context, String tag, PrintWriter pw) {
+        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()
+                    + " due to missing android.permission.DUMP permission");
+            return false;
+        } else {
+            return true;
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index d5ce8a6..c23bfc4 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -83,9 +83,7 @@
 
 import com.android.internal.R;
 import com.android.internal.annotations.GuardedBy;
-import com.android.internal.util.DumpUtils;
 import com.android.server.SystemService;
-import com.android.server.SystemService.TargetUser;
 import com.android.server.Watchdog;
 import com.android.server.Watchdog.Monitor;
 
@@ -1885,7 +1883,7 @@
 
         @Override
         public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) {
-            if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
+            if (!MediaServerUtils.checkDumpPermission(mContext, TAG, pw)) return;
 
             pw.println("MEDIA SESSION SERVICE (dumpsys media_session)");
             pw.println();
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index dd6c8f5..a44ddcb 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -217,6 +217,8 @@
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
 import android.util.SparseLongArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.R;
@@ -2226,8 +2228,7 @@
         FileInputStream fis = null;
         try {
             fis = mPolicyFile.openRead();
-            final XmlPullParser in = Xml.newPullParser();
-            in.setInput(fis, StandardCharsets.UTF_8.name());
+            final TypedXmlPullParser in = Xml.resolvePullParser(fis);
 
              // Must save the <restrict-background> tags and convert them to <uid-policy> later,
              // to skip UIDs that were explicitly denylisted.
@@ -2496,8 +2497,7 @@
         try {
             fos = mPolicyFile.startWrite();
 
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(fos, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(fos);
             out.startDocument(null, true);
 
             out.startTag(null, TAG_POLICY_LIST);
diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index 12c24d4..81a6641 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -1084,12 +1084,10 @@
             return nativeIfaceStats;
         } else {
             // When tethering offload is in use, nativeIfaceStats does not contain usage from
-            // offload, add it back here.
-            // When tethering offload is not in use, nativeIfaceStats contains tethering usage.
-            // this does not cause double-counting of tethering traffic, because
-            // NetdTetheringStatsProvider returns zero NetworkStats
-            // when called with STATS_PER_IFACE.
-            return nativeIfaceStats + getTetherStats(iface, type);
+            // offload, add it back here. Note that the included statistics might be stale
+            // since polling newest stats from hardware might impact system health and not
+            // suitable for TrafficStats API use cases.
+            return nativeIfaceStats + getProviderIfaceStats(iface, type);
         }
     }
 
@@ -1100,39 +1098,28 @@
             return nativeTotalStats;
         } else {
             // Refer to comment in getIfaceStats
-            return nativeTotalStats + getTetherStats(IFACE_ALL, type);
+            return nativeTotalStats + getProviderIfaceStats(IFACE_ALL, type);
         }
     }
 
-    private long getTetherStats(String iface, int type) {
-        final NetworkStats tetherSnapshot;
-        final long token = Binder.clearCallingIdentity();
-        try {
-            tetherSnapshot = getNetworkStatsTethering(STATS_PER_IFACE);
-        } catch (RemoteException e) {
-            Slog.w(TAG, "Error get TetherStats: " + e);
-            return 0;
-        } finally {
-            Binder.restoreCallingIdentity(token);
-        }
-        HashSet<String> limitIfaces;
+    private long getProviderIfaceStats(@Nullable String iface, int type) {
+        final NetworkStats providerSnapshot = getNetworkStatsFromProviders(STATS_PER_IFACE);
+        final HashSet<String> limitIfaces;
         if (iface == IFACE_ALL) {
             limitIfaces = null;
         } else {
-            limitIfaces = new HashSet<String>();
+            limitIfaces = new HashSet<>();
             limitIfaces.add(iface);
         }
-        NetworkStats.Entry entry = tetherSnapshot.getTotal(null, limitIfaces);
-        if (LOGD) Slog.d(TAG, "TetherStats: iface=" + iface + " type=" + type +
-                " entry=" + entry);
+        final NetworkStats.Entry entry = providerSnapshot.getTotal(null, limitIfaces);
         switch (type) {
-            case 0: // TYPE_RX_BYTES
+            case TrafficStats.TYPE_RX_BYTES:
                 return entry.rxBytes;
-            case 1: // TYPE_RX_PACKETS
+            case TrafficStats.TYPE_RX_PACKETS:
                 return entry.rxPackets;
-            case 2: // TYPE_TX_BYTES
+            case TrafficStats.TYPE_TX_BYTES:
                 return entry.txBytes;
-            case 3: // TYPE_TX_PACKETS
+            case TrafficStats.TYPE_TX_PACKETS:
                 return entry.txPackets;
             default:
                 return 0;
@@ -1429,14 +1416,6 @@
         final NetworkStats devSnapshot = readNetworkStatsSummaryDev();
         Trace.traceEnd(TRACE_TAG_NETWORK);
 
-        // Tethering snapshot for dev and xt stats. Counts per-interface data from tethering stats
-        // providers that isn't already counted by dev and XT stats.
-        Trace.traceBegin(TRACE_TAG_NETWORK, "snapshotTether");
-        final NetworkStats tetherSnapshot = getNetworkStatsTethering(STATS_PER_IFACE);
-        Trace.traceEnd(TRACE_TAG_NETWORK);
-        xtSnapshot.combineAllValues(tetherSnapshot);
-        devSnapshot.combineAllValues(tetherSnapshot);
-
         // Snapshot for dev/xt stats from all custom stats providers. Counts per-interface data
         // from stats providers that isn't already counted by dev and XT stats.
         Trace.traceBegin(TRACE_TAG_NETWORK, "snapshotStatsProvider");
@@ -1511,29 +1490,7 @@
         final boolean persistUid = (flags & FLAG_PERSIST_UID) != 0;
         final boolean persistForce = (flags & FLAG_PERSIST_FORCE) != 0;
 
-        // Request asynchronous stats update from all providers for next poll. And wait a bit of
-        // time to allow providers report-in given that normally binder call should be fast. Note
-        // that size of list might be changed because addition/removing at the same time. For
-        // addition, the stats of the missed provider can only be collected in next poll;
-        // for removal, wait might take up to MAX_STATS_PROVIDER_POLL_WAIT_TIME_MS
-        // once that happened.
-        // TODO: request with a valid token.
-        Trace.traceBegin(TRACE_TAG_NETWORK, "provider.requestStatsUpdate");
-        final int registeredCallbackCount = mStatsProviderCbList.size();
-        mStatsProviderSem.drainPermits();
-        invokeForAllStatsProviderCallbacks(
-                (cb) -> cb.mProvider.onRequestStatsUpdate(0 /* unused */));
-        try {
-            mStatsProviderSem.tryAcquire(registeredCallbackCount,
-                    MAX_STATS_PROVIDER_POLL_WAIT_TIME_MS, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException e) {
-            // Strictly speaking it's possible a provider happened to deliver between the timeout
-            // and the log, and that doesn't matter too much as this is just a debug log.
-            Log.d(TAG, "requestStatsUpdate - providers responded "
-                    + mStatsProviderSem.availablePermits()
-                    + "/" + registeredCallbackCount + " : " + e);
-        }
-        Trace.traceEnd(TRACE_TAG_NETWORK);
+        performPollFromProvidersLocked();
 
         // TODO: consider marking "untrusted" times in historical stats
         final long currentTime = mClock.millis();
@@ -1578,6 +1535,33 @@
         Trace.traceEnd(TRACE_TAG_NETWORK);
     }
 
+    @GuardedBy("mStatsLock")
+    private void performPollFromProvidersLocked() {
+        // Request asynchronous stats update from all providers for next poll. And wait a bit of
+        // time to allow providers report-in given that normally binder call should be fast. Note
+        // that size of list might be changed because addition/removing at the same time. For
+        // addition, the stats of the missed provider can only be collected in next poll;
+        // for removal, wait might take up to MAX_STATS_PROVIDER_POLL_WAIT_TIME_MS
+        // once that happened.
+        // TODO: request with a valid token.
+        Trace.traceBegin(TRACE_TAG_NETWORK, "provider.requestStatsUpdate");
+        final int registeredCallbackCount = mStatsProviderCbList.size();
+        mStatsProviderSem.drainPermits();
+        invokeForAllStatsProviderCallbacks(
+                (cb) -> cb.mProvider.onRequestStatsUpdate(0 /* unused */));
+        try {
+            mStatsProviderSem.tryAcquire(registeredCallbackCount,
+                    MAX_STATS_PROVIDER_POLL_WAIT_TIME_MS, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            // Strictly speaking it's possible a provider happened to deliver between the timeout
+            // and the log, and that doesn't matter too much as this is just a debug log.
+            Log.d(TAG, "requestStatsUpdate - providers responded "
+                    + mStatsProviderSem.availablePermits()
+                    + "/" + registeredCallbackCount + " : " + e);
+        }
+        Trace.traceEnd(TRACE_TAG_NETWORK);
+    }
+
     /**
      * Sample recent statistics summary into {@link EventLog}.
      */
@@ -1931,9 +1915,13 @@
     }
 
     /**
-     * Return snapshot of current tethering statistics. Will return empty
-     * {@link NetworkStats} if any problems are encountered.
+     * Return snapshot of current non-offloaded tethering statistics. Will return empty
+     * {@link NetworkStats} if any problems are encountered, or queried by {@code STATS_PER_IFACE}
+     * since it is already included by {@link #nativeGetIfaceStat}.
+     * See {@code OffloadTetheringStatsProvider} for offloaded tethering stats.
      */
+    // TODO: Remove this by implementing {@link NetworkStatsProvider} for non-offloaded
+    //  tethering stats.
     private NetworkStats getNetworkStatsTethering(int how) throws RemoteException {
         try {
             return mNetworkManager.getNetworkStatsTethering(how);
@@ -2226,13 +2214,6 @@
         }
     }
 
-    private static int TYPE_RX_BYTES;
-    private static int TYPE_RX_PACKETS;
-    private static int TYPE_TX_BYTES;
-    private static int TYPE_TX_PACKETS;
-    private static int TYPE_TCP_RX_PACKETS;
-    private static int TYPE_TCP_TX_PACKETS;
-
     private static native long nativeGetTotalStat(int type, boolean useBpfStats);
     private static native long nativeGetIfaceStat(String iface, int type, boolean useBpfStats);
     private static native long nativeGetUidStat(int uid, int type, boolean useBpfStats);
diff --git a/services/core/java/com/android/server/net/watchlist/WatchlistSettings.java b/services/core/java/com/android/server/net/watchlist/WatchlistSettings.java
index c2f3ba0..4506b7d 100644
--- a/services/core/java/com/android/server/net/watchlist/WatchlistSettings.java
+++ b/services/core/java/com/android/server/net/watchlist/WatchlistSettings.java
@@ -20,6 +20,8 @@
 import android.util.AtomicFile;
 import android.util.Log;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -92,8 +94,7 @@
             return;
         }
         try (FileInputStream stream = mXmlFile.openRead()){
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(stream, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(stream);
             XmlUtils.beginDocument(parser, "network-watchlist-settings");
             final int outerDepth = parser.getDepth();
             while (XmlUtils.nextElementWithin(parser, outerDepth)) {
@@ -145,8 +146,7 @@
             return;
         }
         try {
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(stream, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(stream);
             out.startDocument(null, true);
             out.startTag(null, "network-watchlist-settings");
             out.startTag(null, "secret-key");
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 1516cde..dfeb682 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -330,6 +330,9 @@
     static final int MAX_PACKAGE_NOTIFICATIONS = 50;
     static final float DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE = 5f;
 
+    // To limit bad UX of seeing a toast many seconds after if was triggered.
+    static final int MAX_PACKAGE_TOASTS = 5;
+
     // message codes
     static final int MESSAGE_DURATION_REACHED = 2;
     // 3: removed to a different handler
@@ -494,6 +497,10 @@
     final ArrayList<ToastRecord> mToastQueue = new ArrayList<>();
     final ArrayMap<String, NotificationRecord> mSummaryByGroupKey = new ArrayMap<>();
 
+    // True if the toast that's on top of the queue is being shown at the moment.
+    @GuardedBy("mToastQueue")
+    private boolean mIsCurrentToastShown = false;
+
     // The last key in this list owns the hardware.
     ArrayList<String> mLights = new ArrayList<>();
 
@@ -2945,8 +2952,8 @@
                             final ToastRecord r = mToastQueue.get(i);
                             if (r.pkg.equals(pkg)) {
                                 count++;
-                                if (count >= MAX_PACKAGE_NOTIFICATIONS) {
-                                    Slog.e(TAG, "Package has already posted " + count
+                                if (count >= MAX_PACKAGE_TOASTS) {
+                                    Slog.e(TAG, "Package has already queued " + count
                                             + " toasts. Not showing more. Package=" + pkg);
                                     return;
                                 }
@@ -7297,10 +7304,15 @@
 
     @GuardedBy("mToastQueue")
     void showNextToastLocked() {
+        if (mIsCurrentToastShown) {
+            return; // Don't show the same toast twice.
+        }
+
         ToastRecord record = mToastQueue.get(0);
         while (record != null) {
             if (record.show()) {
                 scheduleDurationReachedLocked(record);
+                mIsCurrentToastShown = true;
                 return;
             }
             int index = mToastQueue.indexOf(record);
@@ -7316,6 +7328,10 @@
         ToastRecord record = mToastQueue.get(index);
         record.hide();
 
+        if (index == 0) {
+            mIsCurrentToastShown = false;
+        }
+
         ToastRecord lastToast = mToastQueue.remove(index);
 
         mWindowManagerInternal.removeWindowToken(lastToast.windowToken, false /* removeWindows */,
diff --git a/services/core/java/com/android/server/om/OverlayManagerSettings.java b/services/core/java/com/android/server/om/OverlayManagerSettings.java
index 3d520bf..8a2d823 100644
--- a/services/core/java/com/android/server/om/OverlayManagerSettings.java
+++ b/services/core/java/com/android/server/om/OverlayManagerSettings.java
@@ -25,6 +25,8 @@
 import android.os.UserHandle;
 import android.util.ArrayMap;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -405,10 +407,9 @@
         public static void restore(@NonNull final ArrayList<SettingsItem> table,
                 @NonNull final InputStream is) throws IOException, XmlPullParserException {
 
-            try (InputStreamReader reader = new InputStreamReader(is)) {
+            {
                 table.clear();
-                final XmlPullParser parser = Xml.newPullParser();
-                parser.setInput(reader);
+                final TypedXmlPullParser parser = Xml.resolvePullParser(is);
                 XmlUtils.beginDocument(parser, TAG_OVERLAYS);
                 int version = XmlUtils.readIntAttribute(parser, ATTR_VERSION);
                 if (version != CURRENT_VERSION) {
@@ -465,8 +466,7 @@
 
         public static void persist(@NonNull final ArrayList<SettingsItem> table,
                 @NonNull final OutputStream os) throws IOException, XmlPullParserException {
-            final FastXmlSerializer xml = new FastXmlSerializer();
-            xml.setOutput(os, "utf-8");
+            final TypedXmlSerializer xml = Xml.resolveSerializer(os);
             xml.startDocument(null, true);
             xml.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
             xml.startTag(null, TAG_OVERLAYS);
@@ -481,7 +481,7 @@
             xml.endDocument();
         }
 
-        private static void persistRow(@NonNull final FastXmlSerializer xml,
+        private static void persistRow(@NonNull final TypedXmlSerializer xml,
                 @NonNull final SettingsItem item) throws IOException {
             xml.startTag(null, TAG_ITEM);
             XmlUtils.writeStringAttribute(xml, ATTR_PACKAGE_NAME, item.mPackageName);
diff --git a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
index 47fcc08..dd507a3 100644
--- a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
+++ b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
@@ -297,9 +297,8 @@
         }
 
         @Override
-        public void onUiIntensiveBugreportDumpsFinished(String callingPackage)
-                throws RemoteException {
-            mListener.onUiIntensiveBugreportDumpsFinished(callingPackage);
+        public void onUiIntensiveBugreportDumpsFinished() throws RemoteException {
+            mListener.onUiIntensiveBugreportDumpsFinished();
         }
 
         @Override
diff --git a/services/core/java/com/android/server/pm/CrossProfileIntentFilter.java b/services/core/java/com/android/server/pm/CrossProfileIntentFilter.java
index ff4049b..ea2439e 100644
--- a/services/core/java/com/android/server/pm/CrossProfileIntentFilter.java
+++ b/services/core/java/com/android/server/pm/CrossProfileIntentFilter.java
@@ -16,14 +16,19 @@
 
 package com.android.server.pm;
 
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.UserHandle;
+import android.util.Log;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
+
 import com.android.internal.util.XmlUtils;
+
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
-import android.content.IntentFilter;
-import android.util.Log;
+
 import java.io.IOException;
-import android.os.UserHandle;
 
 /**
  * The {@link PackageManagerService} maintains some {@link CrossProfileIntentFilter}s for each user.
@@ -63,7 +68,7 @@
         return mOwnerPackage;
     }
 
-    CrossProfileIntentFilter(XmlPullParser parser) throws XmlPullParserException, IOException {
+    CrossProfileIntentFilter(TypedXmlPullParser parser) throws XmlPullParserException, IOException {
         mTargetUserId = getIntFromXml(parser, ATTR_TARGET_USER_ID, UserHandle.USER_NULL);
         mOwnerPackage = getStringFromXml(parser, ATTR_OWNER_PACKAGE, "");
         mFlags = getIntFromXml(parser, ATTR_FLAGS, 0);
@@ -98,7 +103,7 @@
         }
     }
 
-    String getStringFromXml(XmlPullParser parser, String attribute, String defaultValue) {
+    String getStringFromXml(TypedXmlPullParser parser, String attribute, String defaultValue) {
         String value = parser.getAttributeValue(null, attribute);
         if (value == null) {
             String msg = "Missing element under " + TAG +": " + attribute + " at " +
@@ -110,7 +115,7 @@
         }
     }
 
-    int getIntFromXml(XmlPullParser parser, String attribute, int defaultValue) {
+    int getIntFromXml(TypedXmlPullParser parser, String attribute, int defaultValue) {
         String stringValue = getStringFromXml(parser, attribute, null);
         if (stringValue != null) {
             return Integer.parseInt(stringValue);
@@ -118,7 +123,7 @@
         return defaultValue;
     }
 
-    public void writeToXml(XmlSerializer serializer) throws IOException {
+    public void writeToXml(TypedXmlSerializer serializer) throws IOException {
         serializer.attribute(null, ATTR_TARGET_USER_ID, Integer.toString(mTargetUserId));
         serializer.attribute(null, ATTR_FLAGS, Integer.toString(mFlags));
         serializer.attribute(null, ATTR_OWNER_PACKAGE, mOwnerPackage);
diff --git a/services/core/java/com/android/server/pm/InstantAppRegistry.java b/services/core/java/com/android/server/pm/InstantAppRegistry.java
index efbdfea..3f2c235 100644
--- a/services/core/java/com/android/server/pm/InstantAppRegistry.java
+++ b/services/core/java/com/android/server/pm/InstantAppRegistry.java
@@ -43,6 +43,8 @@
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.GuardedBy;
@@ -1020,8 +1022,7 @@
         final String packageName = instantDir.getName();
 
         try {
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(in, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(in);
             return new UninstalledInstantAppState(
                     parseMetadata(parser, packageName), timestamp);
         } catch (XmlPullParserException | IOException e) {
@@ -1061,7 +1062,7 @@
     }
 
     private static @Nullable
-    InstantAppInfo parseMetadata(@NonNull XmlPullParser parser,
+    InstantAppInfo parseMetadata(@NonNull TypedXmlPullParser parser,
                                  @NonNull String packageName)
             throws IOException, XmlPullParserException {
         final int outerDepth = parser.getDepth();
@@ -1073,7 +1074,7 @@
         return null;
     }
 
-    private static InstantAppInfo parsePackage(@NonNull XmlPullParser parser,
+    private static InstantAppInfo parsePackage(@NonNull TypedXmlPullParser parser,
                                                @NonNull String packageName)
             throws IOException, XmlPullParserException {
         String label = parser.getAttributeValue(null, ATTR_LABEL);
@@ -1098,7 +1099,7 @@
                 requestedPermissions, grantedPermissions);
     }
 
-    private static void parsePermissions(@NonNull XmlPullParser parser,
+    private static void parsePermissions(@NonNull TypedXmlPullParser parser,
             @NonNull List<String> outRequestedPermissions,
             @NonNull List<String> outGrantedPermissions)
             throws IOException, XmlPullParserException {
@@ -1128,8 +1129,7 @@
         try {
             out = destination.startWrite();
 
-            XmlSerializer serializer = Xml.newSerializer();
-            serializer.setOutput(out, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer serializer = Xml.resolveSerializer(out);
             serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
 
             serializer.startDocument(null, true);
diff --git a/services/core/java/com/android/server/pm/KeySetManagerService.java b/services/core/java/com/android/server/pm/KeySetManagerService.java
index dabcc35..86f024f 100644
--- a/services/core/java/com/android/server/pm/KeySetManagerService.java
+++ b/services/core/java/com/android/server/pm/KeySetManagerService.java
@@ -26,12 +26,13 @@
 import android.util.Base64;
 import android.util.LongSparseArray;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 
 import com.android.server.pm.parsing.pkg.AndroidPackage;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
 
 import java.io.IOException;
 import java.io.PrintWriter;
@@ -671,7 +672,7 @@
         }
     }
 
-    void writeKeySetManagerServiceLPr(XmlSerializer serializer) throws IOException {
+    void writeKeySetManagerServiceLPr(TypedXmlSerializer serializer) throws IOException {
         serializer.startTag(null, "keyset-settings");
         serializer.attribute(null, "version", Integer.toString(CURRENT_VERSION));
         writePublicKeysLPr(serializer);
@@ -685,7 +686,7 @@
         serializer.endTag(null, "keyset-settings");
     }
 
-    void writePublicKeysLPr(XmlSerializer serializer) throws IOException {
+    void writePublicKeysLPr(TypedXmlSerializer serializer) throws IOException {
         serializer.startTag(null, "keys");
         for (int pKeyIndex = 0; pKeyIndex < mPublicKeys.size(); pKeyIndex++) {
             long id = mPublicKeys.keyAt(pKeyIndex);
@@ -699,7 +700,7 @@
         serializer.endTag(null, "keys");
     }
 
-    void writeKeySetsLPr(XmlSerializer serializer) throws IOException {
+    void writeKeySetsLPr(TypedXmlSerializer serializer) throws IOException {
         serializer.startTag(null, "keysets");
         for (int keySetIndex = 0; keySetIndex < mKeySetMapping.size(); keySetIndex++) {
             long id = mKeySetMapping.keyAt(keySetIndex);
@@ -716,7 +717,7 @@
         serializer.endTag(null, "keysets");
     }
 
-    void readKeySetsLPw(XmlPullParser parser, ArrayMap<Long, Integer> keySetRefCounts)
+    void readKeySetsLPw(TypedXmlPullParser parser, ArrayMap<Long, Integer> keySetRefCounts)
             throws XmlPullParserException, IOException {
         int type;
         long currentKeySetId = 0;
@@ -757,7 +758,7 @@
         addRefCountsFromSavedPackagesLPw(keySetRefCounts);
     }
 
-    void readKeysLPw(XmlPullParser parser)
+    void readKeysLPw(TypedXmlPullParser parser)
             throws XmlPullParserException, IOException {
         int outerDepth = parser.getDepth();
         int type;
@@ -773,7 +774,7 @@
         }
     }
 
-    void readKeySetListLPw(XmlPullParser parser)
+    void readKeySetListLPw(TypedXmlPullParser parser)
             throws XmlPullParserException, IOException {
         int outerDepth = parser.getDepth();
         int type;
@@ -798,7 +799,7 @@
         }
     }
 
-    void readPublicKeyLPw(XmlPullParser parser)
+    void readPublicKeyLPw(TypedXmlPullParser parser)
             throws XmlPullParserException {
         String encodedID = parser.getAttributeValue(null, "identifier");
         long identifier = Long.parseLong(encodedID);
diff --git a/services/core/java/com/android/server/pm/OWNERS b/services/core/java/com/android/server/pm/OWNERS
index e48862e..cca2b83 100644
--- a/services/core/java/com/android/server/pm/OWNERS
+++ b/services/core/java/com/android/server/pm/OWNERS
@@ -45,17 +45,17 @@
 per-file SELinuxMMAC.java = cbrubaker@google.com, jeffv@google.com, jgalenson@google.com, nnk@google.com
 
 # shortcuts
-per-file LauncherAppsService.java = omakoto@google.com, yamasani@google.com
-per-file ShareTargetInfo.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutBitmapSaver.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutDumpFiles.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutLauncher.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutNonPersistentUser.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutPackage.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutPackageInfo.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutPackageItem.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutParser.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutRequestPinProcessor.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutService.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutUser.java = omakoto@google.com, yamasani@google.com
+per-file LauncherAppsService.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShareTargetInfo.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutBitmapSaver.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutDumpFiles.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutLauncher.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutNonPersistentUser.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutPackage.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutPackageInfo.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutPackageItem.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutParser.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutRequestPinProcessor.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutService.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutUser.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
 
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index c282b99..34019c7 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -71,6 +71,8 @@
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.R;
@@ -78,7 +80,6 @@
 import com.android.internal.content.PackageHelper;
 import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
 import com.android.internal.notification.SystemNotificationChannels;
-import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.ImageUtils;
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.server.IoThread;
@@ -91,9 +92,7 @@
 
 import libcore.io.IoUtils;
 
-import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
 
 import java.io.CharArrayWriter;
 import java.io.File;
@@ -102,7 +101,6 @@
 import java.io.FileOutputStream;
 import java.io.FilenameFilter;
 import java.io.IOException;
-import java.nio.charset.StandardCharsets;
 import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -383,8 +381,7 @@
         FileInputStream fis = null;
         try {
             fis = mSessionsFile.openRead();
-            final XmlPullParser in = Xml.newPullParser();
-            in.setInput(fis, StandardCharsets.UTF_8.name());
+            final TypedXmlPullParser in = Xml.resolvePullParser(fis);
 
             int type;
             while ((type = in.next()) != END_DOCUMENT) {
@@ -467,8 +464,7 @@
         try {
             fos = mSessionsFile.startWrite();
 
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(fos, StandardCharsets.UTF_8.name());
+            final TypedXmlSerializer out = Xml.resolveSerializer(fos);
             out.startDocument(null, true);
             out.startTag(null, TAG_SESSIONS);
             final int size = mSessions.size();
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 57b80ea..ab5b9d1 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -131,6 +131,8 @@
 import android.util.MathUtils;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.apk.ApkSignatureVerifier;
 
 import com.android.internal.R;
@@ -3943,7 +3945,7 @@
         }
     }
 
-    private static void writeGrantedRuntimePermissionsLocked(XmlSerializer out,
+    private static void writeGrantedRuntimePermissionsLocked(TypedXmlSerializer out,
             String[] grantedRuntimePermissions) throws IOException {
         if (grantedRuntimePermissions != null) {
             for (String permission : grantedRuntimePermissions) {
@@ -3954,7 +3956,7 @@
         }
     }
 
-    private static void writeWhitelistedRestrictedPermissionsLocked(@NonNull XmlSerializer out,
+    private static void writeWhitelistedRestrictedPermissionsLocked(@NonNull TypedXmlSerializer out,
             @Nullable List<String> whitelistedRestrictedPermissions) throws IOException {
         if (whitelistedRestrictedPermissions != null) {
             final int permissionCount = whitelistedRestrictedPermissions.size();
@@ -3966,7 +3968,7 @@
         }
     }
 
-    private static void writeAutoRevokePermissionsMode(@NonNull XmlSerializer out, int mode)
+    private static void writeAutoRevokePermissionsMode(@NonNull TypedXmlSerializer out, int mode)
             throws IOException {
         out.startTag(null, TAG_AUTO_REVOKE_PERMISSIONS_MODE);
         writeIntAttribute(out, ATTR_MODE, mode);
@@ -3979,12 +3981,12 @@
     }
 
     /**
-     * Write this session to a {@link XmlSerializer}.
+     * Write this session to a {@link TypedXmlSerializer}.
      *
      * @param out Where to write the session to
      * @param sessionsDir The directory containing the sessions
      */
-    void write(@NonNull XmlSerializer out, @NonNull File sessionsDir) throws IOException {
+    void write(@NonNull TypedXmlSerializer out, @NonNull File sessionsDir) throws IOException {
         synchronized (mLock) {
             if (mDestroyed && !params.isStaged) {
                 return;
@@ -4127,7 +4129,7 @@
     }
 
     /**
-     * Read new session from a {@link XmlPullParser xml description} and create it.
+     * Read new session from a {@link TypedXmlPullParser xml description} and create it.
      *
      * @param in The source of the description
      * @param callback Callback the session uses to notify about changes of it's state
@@ -4139,7 +4141,7 @@
      * @param sessionProvider
      * @return The newly created session
      */
-    public static PackageInstallerSession readFromXml(@NonNull XmlPullParser in,
+    public static PackageInstallerSession readFromXml(@NonNull TypedXmlPullParser in,
             @NonNull PackageInstallerService.InternalCallback callback, @NonNull Context context,
             @NonNull PackageManagerService pm, Looper installerThread,
             @NonNull StagingManager stagingManager, @NonNull File sessionsDir,
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 7afd3db..a03c405c 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -319,6 +319,8 @@
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
 import android.util.TimingsTraceLog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 import android.util.apk.ApkSignatureVerifier;
 import android.util.jar.StrictJarFile;
@@ -2214,14 +2216,15 @@
             // that the installer requested to be granted at install time.
             if (whitelistedRestrictedPermissions != null
                     && !whitelistedRestrictedPermissions.isEmpty()) {
-                mPermissionManager.setWhitelistedRestrictedPermissions(
-                        res.pkg, res.newUsers, whitelistedRestrictedPermissions,
-                        Process.myUid(), FLAG_PERMISSION_WHITELIST_INSTALLER);
+                mPermissionManager.setAllowlistedRestrictedPermissions(res.pkg,
+                        whitelistedRestrictedPermissions, FLAG_PERMISSION_WHITELIST_INSTALLER,
+                        res.newUsers);
             }
 
-            if (autoRevokePermissionsMode == MODE_ALLOWED || autoRevokePermissionsMode == MODE_IGNORED) {
-                mPermissionManager.setAutoRevokeWhitelisted(res.pkg.getPackageName(),
-                        autoRevokePermissionsMode == MODE_IGNORED, UserHandle.myUserId());
+            if (autoRevokePermissionsMode == MODE_ALLOWED
+                    || autoRevokePermissionsMode == MODE_IGNORED) {
+                mPermissionManager.setAutoRevokeExempted(res.pkg,
+                        autoRevokePermissionsMode == MODE_IGNORED, res.newUsers);
             }
 
             // Now that we successfully installed the package, grant runtime
@@ -2231,8 +2234,9 @@
             // legacy apps.
             if (grantPermissions) {
                 final int callingUid = Binder.getCallingUid();
-                mPermissionManager.grantRequestedRuntimePermissions(
-                        res.pkg, res.newUsers, grantedPermissions, callingUid);
+                mPermissionManager.grantRequestedRuntimePermissions(res.pkg,
+                        grantedPermissions != null ? Arrays.asList(grantedPermissions) : null,
+                        res.newUsers);
             }
 
             final String installerPackageName =
@@ -2531,8 +2535,20 @@
             @Checksum.Type int optional,
             @Checksum.Type int required, @Nullable List trustedInstallers,
             @NonNull IntentSender statusReceiver, int userId) {
+        requestChecksumsInternal(packageName, includeSplits, optional, required, trustedInstallers,
+                statusReceiver, userId, mInjector.getBackgroundExecutor(),
+                mInjector.getBackgroundHandler());
+    }
+
+    private void requestChecksumsInternal(@NonNull String packageName, boolean includeSplits,
+            @Checksum.Type int optional,
+            @Checksum.Type int required, @Nullable List trustedInstallers,
+            @NonNull IntentSender statusReceiver, int userId, @NonNull Executor executor,
+            @NonNull Handler handler) {
         Objects.requireNonNull(packageName);
         Objects.requireNonNull(statusReceiver);
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(handler);
 
         final ApplicationInfo applicationInfo = getApplicationInfoInternal(packageName, 0,
                 Binder.getCallingUid(), userId);
@@ -2556,10 +2572,10 @@
         final Certificate[] trustedCerts = (trustedInstallers != null) ? decodeCertificates(
                 trustedInstallers) : null;
 
-        mInjector.getBackgroundExecutor().execute(() -> {
+        executor.execute(() -> {
             ApkChecksums.Injector injector = new ApkChecksums.Injector(
                     () -> mContext,
-                    () -> mInjector.getBackgroundHandler(),
+                    () -> handler,
                     () -> mInjector.getIncrementalManager());
             ApkChecksums.getChecksums(filesToChecksum, optional, required, trustedCerts,
                     statusReceiver, injector);
@@ -6604,14 +6620,16 @@
     }
 
     // NOTE: Can't remove due to unsupported app usage
+    @NonNull
     @Override
-    public String[] getAppOpPermissionPackages(String permName) {
-        try {
-            // Because this is accessed via the package manager service AIDL,
-            // go through the permission manager service AIDL
-            return mPermissionManagerService.getAppOpPermissionPackages(permName);
-        } catch (RemoteException ignore) { }
-        return null;
+    public String[] getAppOpPermissionPackages(String permissionName) {
+        if (permissionName == null) {
+            return EmptyArray.STRING;
+        }
+        if (getInstantAppPackageName(getCallingUid()) != null) {
+            return EmptyArray.STRING;
+        }
+        return mPermissionManager.getAppOpPermissionPackages(permissionName);
     }
 
     @Override
@@ -10818,7 +10836,7 @@
                     continue;
                 }
                 final PackageSetting staticLibPkgSetting = getPackageSetting(
-                        toStaticSharedLibraryPackageName(sharedLibraryInfo.getPackageName(),
+                        toStaticSharedLibraryPackageName(sharedLibraryInfo.getName(),
                                 sharedLibraryInfo.getLongVersion()));
                 if (staticLibPkgSetting == null) {
                     Slog.wtf(TAG, "Shared lib without setting: " + sharedLibraryInfo);
@@ -13544,12 +13562,15 @@
             }
 
             if (installed) {
-                if ((installFlags & PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS)
-                        != 0 && pkgSetting.pkg != null) {
-                    whiteListedPermissions = pkgSetting.pkg.getRequestedPermissions();
+                if (pkgSetting.pkg != null) {
+                    if ((installFlags & PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS)
+                            != 0) {
+                        whiteListedPermissions = pkgSetting.pkg.getRequestedPermissions();
+                    }
+                    mPermissionManager.setAllowlistedRestrictedPermissions(pkgSetting.pkg,
+                            whiteListedPermissions, FLAG_PERMISSION_WHITELIST_INSTALLER,
+                            new int[] { userId });
                 }
-                mPermissionManager.setWhitelistedRestrictedPermissions(packageName,
-                        whiteListedPermissions, FLAG_PERMISSION_WHITELIST_INSTALLER, userId);
 
                 if (pkgSetting.pkg != null) {
                     synchronized (mInstallLock) {
@@ -20682,7 +20703,7 @@
      * Common machinery for picking apart a restored XML blob and passing
      * it to a caller-supplied functor to be applied to the running system.
      */
-    private void restoreFromXml(XmlPullParser parser, int userId,
+    private void restoreFromXml(TypedXmlPullParser parser, int userId,
             String expectedStartTag, BlobXmlRestorer functor)
             throws IOException, XmlPullParserException {
         int type;
@@ -20710,7 +20731,8 @@
     }
 
     private interface BlobXmlRestorer {
-        void apply(XmlPullParser parser, int userId) throws IOException, XmlPullParserException;
+        void apply(TypedXmlPullParser parser, int userId)
+                throws IOException, XmlPullParserException;
     }
 
     /**
@@ -20726,7 +20748,7 @@
 
         ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
         try {
-            final XmlSerializer serializer = new FastXmlSerializer();
+            final TypedXmlSerializer serializer = Xml.newFastSerializer();
             serializer.setOutput(dataStream, StandardCharsets.UTF_8.name());
             serializer.startDocument(null, true);
             serializer.startTag(null, TAG_PREFERRED_BACKUP);
@@ -20755,7 +20777,7 @@
         }
 
         try {
-            final XmlPullParser parser = Xml.newPullParser();
+            final TypedXmlPullParser parser = Xml.newFastPullParser();
             parser.setInput(new ByteArrayInputStream(backup), StandardCharsets.UTF_8.name());
             restoreFromXml(parser, userId, TAG_PREFERRED_BACKUP,
                     (readParser, readUserId) -> {
@@ -20784,7 +20806,7 @@
 
         ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
         try {
-            final XmlSerializer serializer = new FastXmlSerializer();
+            final TypedXmlSerializer serializer = Xml.newFastSerializer();
             serializer.setOutput(dataStream, StandardCharsets.UTF_8.name());
             serializer.startDocument(null, true);
             serializer.startTag(null, TAG_DEFAULT_APPS);
@@ -20813,7 +20835,7 @@
         }
 
         try {
-            final XmlPullParser parser = Xml.newPullParser();
+            final TypedXmlPullParser parser = Xml.newFastPullParser();
             parser.setInput(new ByteArrayInputStream(backup), StandardCharsets.UTF_8.name());
             restoreFromXml(parser, userId, TAG_DEFAULT_APPS,
                     (parser1, userId1) -> {
@@ -20842,7 +20864,7 @@
 
         ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
         try {
-            final XmlSerializer serializer = new FastXmlSerializer();
+            final TypedXmlSerializer serializer = Xml.newFastSerializer();
             serializer.setOutput(dataStream, StandardCharsets.UTF_8.name());
             serializer.startDocument(null, true);
             serializer.startTag(null, TAG_INTENT_FILTER_VERIFICATION);
@@ -20871,7 +20893,7 @@
         }
 
         try {
-            final XmlPullParser parser = Xml.newPullParser();
+            final TypedXmlPullParser parser = Xml.newFastPullParser();
             parser.setInput(new ByteArrayInputStream(backup), StandardCharsets.UTF_8.name());
             restoreFromXml(parser, userId, TAG_INTENT_FILTER_VERIFICATION,
                     (parser1, userId1) -> {
@@ -22634,7 +22656,7 @@
                 pw.flush();
                 FileOutputStream fout = new FileOutputStream(fd);
                 BufferedOutputStream str = new BufferedOutputStream(fout);
-                XmlSerializer serializer = new FastXmlSerializer();
+                TypedXmlSerializer serializer = Xml.newFastSerializer();
                 try {
                     serializer.setOutput(str, StandardCharsets.UTF_8.name());
                     serializer.startDocument(null, true);
@@ -25021,14 +25043,7 @@
 
         @Override
         public boolean isPermissionsReviewRequired(String packageName, int userId) {
-            synchronized (mLock) {
-                final AndroidPackage pkg = mPackages.get(packageName);
-                if (pkg == null) {
-                    return false;
-                }
-
-                return mPermissionManager.isPermissionsReviewRequired(pkg, userId);
-            }
+            return mPermissionManager.isPermissionsReviewRequired(packageName, userId);
         }
 
         @Override
@@ -25908,6 +25923,14 @@
             }
             ps.setStatesOnCrashOrAnr();
         }
+
+        public void requestChecksums(@NonNull String packageName, boolean includeSplits,
+                @Checksum.Type int optional, @Checksum.Type int required,
+                @Nullable List trustedInstallers, @NonNull IntentSender statusReceiver, int userId,
+                @NonNull Executor executor, @NonNull Handler handler) {
+            requestChecksumsInternal(packageName, includeSplits, optional, required,
+                    trustedInstallers, statusReceiver, userId, executor, handler);
+        }
     }
 
 
@@ -26057,8 +26080,8 @@
         if (!SecurityLog.isLoggingEnabled()) {
             return;
         }
-        mProcessLoggingHandler.logAppProcessStart(mContext, this, apkFile, packageName, processName,
-                uid, seinfo, pid);
+        mProcessLoggingHandler.logAppProcessStart(mContext, mPmInternal, apkFile, packageName,
+                processName, uid, seinfo, pid);
     }
 
     public CompilerStats.PackageStats getCompilerPackageStats(String pkgName) {
@@ -26118,27 +26141,29 @@
             throw new SecurityException(
                     "Caller uid " + callingUid + " does not own package " + packageName);
         }
-        ApplicationInfo info = getApplicationInfo(packageName, flags, userId);
-        if (info == null) {
-            return false;
-        }
-        if (info.targetSdkVersion < Build.VERSION_CODES.O) {
-            return false;
-        }
         if (isInstantApp(packageName, userId)) {
             return false;
         }
-        String appOpPermission = Manifest.permission.REQUEST_INSTALL_PACKAGES;
-        String[] packagesDeclaringPermission =
-                mPermissionManager.getAppOpPermissionPackages(appOpPermission, callingUid);
-        if (!ArrayUtils.contains(packagesDeclaringPermission, packageName)) {
-            if (throwIfPermNotDeclared) {
-                throw new SecurityException("Need to declare " + appOpPermission
-                        + " to call this api");
-            } else {
-                Slog.e(TAG, "Need to declare " + appOpPermission + " to call this api");
+        synchronized (mLock) {
+            final AndroidPackage pkg = mPackages.get(packageName);
+            if (pkg == null) {
                 return false;
             }
+            if (pkg.getTargetSdkVersion() < Build.VERSION_CODES.O) {
+                return false;
+            }
+            if (!pkg.getRequestedPermissions().contains(
+                    android.Manifest.permission.REQUEST_INSTALL_PACKAGES)) {
+                final String message = "Need to declare "
+                        + android.Manifest.permission.REQUEST_INSTALL_PACKAGES
+                        + " to call this api";
+                if (throwIfPermNotDeclared) {
+                    throw new SecurityException(message);
+                } else {
+                    Slog.e(TAG, message);
+                    return false;
+                }
+            }
         }
         if (mUserManager.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, userId)
                   || mUserManager.hasUserRestriction(
diff --git a/services/core/java/com/android/server/pm/PackageSignatures.java b/services/core/java/com/android/server/pm/PackageSignatures.java
index b7d1eec..e74792c 100644
--- a/services/core/java/com/android/server/pm/PackageSignatures.java
+++ b/services/core/java/com/android/server/pm/PackageSignatures.java
@@ -21,6 +21,8 @@
 import android.content.pm.PackageParser.SigningDetails.SignatureSchemeVersion;
 import android.content.pm.Signature;
 import android.util.Log;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 
 import com.android.internal.util.XmlUtils;
 
@@ -52,7 +54,7 @@
         mSigningDetails = PackageParser.SigningDetails.UNKNOWN;
     }
 
-    void writeXml(XmlSerializer serializer, String tagName,
+    void writeXml(TypedXmlSerializer serializer, String tagName,
             ArrayList<Signature> writtenSignatures) throws IOException {
         if (mSigningDetails.signatures == null) {
             return;
@@ -75,8 +77,9 @@
         serializer.endTag(null, tagName);
     }
 
-    private void writeCertsListXml(XmlSerializer serializer, ArrayList<Signature> writtenSignatures,
-            Signature[] signatures, boolean isPastSigs) throws IOException {
+    private void writeCertsListXml(TypedXmlSerializer serializer,
+            ArrayList<Signature> writtenSignatures, Signature[] signatures, boolean isPastSigs)
+            throws IOException {
         for (int i=0; i<signatures.length; i++) {
             serializer.startTag(null, "cert");
             final Signature sig = signatures[i];
@@ -104,7 +107,7 @@
         }
     }
 
-    void readXml(XmlPullParser parser, ArrayList<Signature> readSignatures)
+    void readXml(TypedXmlPullParser parser, ArrayList<Signature> readSignatures)
             throws IOException, XmlPullParserException {
         PackageParser.SigningDetails.Builder builder =
                 new PackageParser.SigningDetails.Builder();
@@ -150,7 +153,7 @@
         }
     }
 
-    private int readCertsListXml(XmlPullParser parser, ArrayList<Signature> readSignatures,
+    private int readCertsListXml(TypedXmlPullParser parser, ArrayList<Signature> readSignatures,
             ArrayList<Signature> signatures, int count, boolean isPastSigs,
             PackageParser.SigningDetails.Builder builder)
             throws IOException, XmlPullParserException {
diff --git a/services/core/java/com/android/server/pm/PersistentPreferredActivity.java b/services/core/java/com/android/server/pm/PersistentPreferredActivity.java
index 5a6fd09..6e6ab83 100644
--- a/services/core/java/com/android/server/pm/PersistentPreferredActivity.java
+++ b/services/core/java/com/android/server/pm/PersistentPreferredActivity.java
@@ -19,12 +19,13 @@
 import android.content.ComponentName;
 import android.content.IntentFilter;
 import android.util.Log;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 
 import com.android.internal.util.XmlUtils;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
 
 import java.io.IOException;
 
@@ -46,7 +47,8 @@
         mIsSetByDpm = isSetByDpm;
     }
 
-    PersistentPreferredActivity(XmlPullParser parser) throws XmlPullParserException, IOException {
+    PersistentPreferredActivity(TypedXmlPullParser parser)
+            throws XmlPullParserException, IOException {
         String shortComponent = parser.getAttributeValue(null, ATTR_NAME);
         mComponent = ComponentName.unflattenFromString(shortComponent);
         if (mComponent == null) {
@@ -86,7 +88,7 @@
         }
     }
 
-    public void writeToXml(XmlSerializer serializer) throws IOException {
+    public void writeToXml(TypedXmlSerializer serializer) throws IOException {
         serializer.attribute(null, ATTR_NAME, mComponent.flattenToShortString());
         serializer.attribute(null, ATTR_SET_BY_DPM, Boolean.toString(mIsSetByDpm));
         serializer.startTag(null, ATTR_FILTER);
diff --git a/services/core/java/com/android/server/pm/PreferredActivity.java b/services/core/java/com/android/server/pm/PreferredActivity.java
index 8916926..4e1dcb2 100644
--- a/services/core/java/com/android/server/pm/PreferredActivity.java
+++ b/services/core/java/com/android/server/pm/PreferredActivity.java
@@ -16,15 +16,15 @@
 
 package com.android.server.pm;
 
-import com.android.internal.util.XmlUtils;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
-
 import android.content.ComponentName;
 import android.content.IntentFilter;
 import android.util.Log;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
+
+import com.android.internal.util.XmlUtils;
+
+import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
 
@@ -41,19 +41,19 @@
         mPref = new PreferredComponent(this, match, set, activity, always);
     }
 
-    PreferredActivity(XmlPullParser parser) throws XmlPullParserException, IOException {
+    PreferredActivity(TypedXmlPullParser parser) throws XmlPullParserException, IOException {
         mPref = new PreferredComponent(this, parser);
     }
 
-    public void writeToXml(XmlSerializer serializer, boolean full) throws IOException {
+    public void writeToXml(TypedXmlSerializer serializer, boolean full) throws IOException {
         mPref.writeToXml(serializer, full);
         serializer.startTag(null, "filter");
             super.writeToXml(serializer);
         serializer.endTag(null, "filter");
     }
 
-    public boolean onReadTag(String tagName, XmlPullParser parser) throws XmlPullParserException,
-            IOException {
+    public boolean onReadTag(String tagName, TypedXmlPullParser parser)
+            throws XmlPullParserException, IOException {
         if (tagName.equals("filter")) {
             if (DEBUG_FILTERS) {
                 Log.i(TAG, "Starting to parse filter...");
diff --git a/services/core/java/com/android/server/pm/PreferredComponent.java b/services/core/java/com/android/server/pm/PreferredComponent.java
index c312fc0..f743bbd 100644
--- a/services/core/java/com/android/server/pm/PreferredComponent.java
+++ b/services/core/java/com/android/server/pm/PreferredComponent.java
@@ -29,6 +29,8 @@
 import android.content.pm.ActivityInfo;
 import android.content.pm.ResolveInfo;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 
 import java.io.IOException;
 import java.io.PrintWriter;
@@ -57,7 +59,7 @@
     private final String mSetupWizardPackageName;
 
     public interface Callbacks {
-        public boolean onReadTag(String tagName, XmlPullParser parser)
+        public boolean onReadTag(String tagName, TypedXmlPullParser parser)
                 throws XmlPullParserException, IOException;
     }
 
@@ -97,7 +99,7 @@
         }
     }
 
-    public PreferredComponent(Callbacks callbacks, XmlPullParser parser)
+    public PreferredComponent(Callbacks callbacks, TypedXmlPullParser parser)
             throws XmlPullParserException, IOException {
         mCallbacks = callbacks;
         mShortComponent = parser.getAttributeValue(null, ATTR_NAME);
@@ -182,7 +184,7 @@
         return mParseError;
     }
 
-    public void writeToXml(XmlSerializer serializer, boolean full) throws IOException {
+    public void writeToXml(TypedXmlSerializer serializer, boolean full) throws IOException {
         final int NS = mSetClasses != null ? mSetClasses.length : 0;
         serializer.attribute(null, ATTR_NAME, mShortComponent);
         if (full) {
diff --git a/services/core/java/com/android/server/pm/ProcessLoggingHandler.java b/services/core/java/com/android/server/pm/ProcessLoggingHandler.java
index 7fb34951d..ce77c91 100644
--- a/services/core/java/com/android/server/pm/ProcessLoggingHandler.java
+++ b/services/core/java/com/android/server/pm/ProcessLoggingHandler.java
@@ -26,13 +26,12 @@
 import android.content.IntentSender;
 import android.content.pm.ApkChecksum;
 import android.content.pm.Checksum;
-import android.content.pm.IPackageManager;
+import android.content.pm.PackageManagerInternal;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.HandlerExecutor;
 import android.os.IBinder;
-import android.os.Message;
 import android.os.Parcelable;
-import android.os.RemoteException;
 import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.Slog;
@@ -42,12 +41,11 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.Executor;
 
 public final class ProcessLoggingHandler extends Handler {
     private static final String TAG = "ProcessLoggingHandler";
 
-    private static final int LOG_APP_PROCESS_START_MSG = 1;
-
     private static final int CHECKSUM_TYPE = Checksum.TYPE_WHOLE_SHA256;
 
     static class LoggingInfo {
@@ -55,6 +53,9 @@
         public List<Bundle> pendingLogEntries = new ArrayList<>();
     }
 
+    // Executor to handle checksum calculations.
+    private final Executor mExecutor = new HandlerExecutor(this);
+
     // Apk path to logging info map.
     private final ArrayMap<String, LoggingInfo> mLoggingInfo = new ArrayMap<>();
 
@@ -62,25 +63,7 @@
         super(BackgroundThread.getHandler().getLooper());
     }
 
-    @Override
-    public void handleMessage(Message msg) {
-        switch (msg.what) {
-            case LOG_APP_PROCESS_START_MSG: {
-                Bundle bundle = msg.getData();
-                long startTimestamp = bundle.getLong("startTimestamp");
-                String processName = bundle.getString("processName");
-                int uid = bundle.getInt("uid");
-                String seinfo = bundle.getString("seinfo");
-                int pid = bundle.getInt("pid");
-                String apkHash = bundle.getString("apkHash");
-                SecurityLog.writeEvent(SecurityLog.TAG_APP_PROCESS_START, processName,
-                        startTimestamp, uid, pid, seinfo, apkHash);
-                break;
-            }
-        }
-    }
-
-    void logAppProcessStart(Context context, IPackageManager pms, String apkFile,
+    void logAppProcessStart(Context context, PackageManagerInternal pmi, String apkFile,
             String packageName, String processName, int uid, String seinfo, int pid) {
         Bundle data = new Bundle();
         data.putLong("startTimestamp", System.currentTimeMillis());
@@ -125,7 +108,7 @@
         // Request base checksums when first added entry.
         // Capturing local loggingInfo to still log even if hash was invalidated.
         try {
-            pms.requestChecksums(packageName, false, 0, CHECKSUM_TYPE, null,
+            pmi.requestChecksums(packageName, false, 0, CHECKSUM_TYPE, null,
                     new IntentSender((IIntentSender) new IIntentSender.Stub() {
                         @Override
                         public void send(int code, Intent intent, String resolvedType,
@@ -133,10 +116,10 @@
                                 String requiredPermission, Bundle options) {
                             processChecksums(loggingInfo, intent);
                         }
-                    }), context.getUserId());
-        } catch (RemoteException e) {
-            Slog.e(TAG, "requestChecksums() failed", e);
-            processChecksums(loggingInfo, null);
+                    }), context.getUserId(), mExecutor, this);
+        } catch (Throwable t) {
+            Slog.e(TAG, "requestChecksums() failed", t);
+            enqueueProcessChecksum(loggingInfo, null);
         }
     }
 
@@ -148,9 +131,16 @@
         for (ApkChecksum checksum : checksums) {
             if (checksum.getType() == CHECKSUM_TYPE) {
                 processChecksum(loggingInfo, checksum.getValue());
-                break;
+                return;
             }
         }
+
+        Slog.e(TAG, "requestChecksums() failed to return SHA256, see logs for details.");
+        processChecksum(loggingInfo, null);
+    }
+
+    void enqueueProcessChecksum(final LoggingInfo loggingInfo, final byte[] hash) {
+        this.post(() -> processChecksum(loggingInfo, null));
     }
 
     void processChecksum(final LoggingInfo loggingInfo, final byte[] hash) {
@@ -178,22 +168,28 @@
 
         if (pendingLogEntries != null) {
             for (Bundle data : pendingLogEntries) {
-                enqueueSecurityLogEvent(data, apkHash);
+                logSecurityLogEvent(data, apkHash);
             }
         }
     }
 
-    void enqueueSecurityLogEvent(Bundle data, String apkHash) {
-        data.putString("apkHash", apkHash);
-
-        Message msg = this.obtainMessage(LOG_APP_PROCESS_START_MSG);
-        msg.setData(data);
-        this.sendMessage(msg);
-    }
-
     void invalidateBaseApkHash(String apkFile) {
         synchronized (mLoggingInfo) {
             mLoggingInfo.remove(apkFile);
         }
     }
+
+    void enqueueSecurityLogEvent(Bundle data, String apkHash) {
+        this.post(() -> logSecurityLogEvent(data, apkHash));
+    }
+
+    void logSecurityLogEvent(Bundle bundle, String apkHash) {
+        long startTimestamp = bundle.getLong("startTimestamp");
+        String processName = bundle.getString("processName");
+        int uid = bundle.getInt("uid");
+        String seinfo = bundle.getString("seinfo");
+        int pid = bundle.getInt("pid");
+        SecurityLog.writeEvent(SecurityLog.TAG_APP_PROCESS_START, processName,
+                startTimestamp, uid, pid, seinfo, apkHash);
+    }
 }
diff --git a/services/core/java/com/android/server/pm/RestrictionsSet.java b/services/core/java/com/android/server/pm/RestrictionsSet.java
index 5aff6bb..4d74b08 100644
--- a/services/core/java/com/android/server/pm/RestrictionsSet.java
+++ b/services/core/java/com/android/server/pm/RestrictionsSet.java
@@ -22,12 +22,13 @@
 import android.os.Bundle;
 import android.os.UserManager;
 import android.util.SparseArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 
 import com.android.internal.annotations.VisibleForTesting;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
 
 import java.io.IOException;
 import java.io.PrintWriter;
@@ -183,7 +184,7 @@
     /**
      * Serialize a given {@link RestrictionsSet} to XML.
      */
-    public void writeRestrictions(@NonNull XmlSerializer serializer, @NonNull String outerTag)
+    public void writeRestrictions(@NonNull TypedXmlSerializer serializer, @NonNull String outerTag)
             throws IOException {
         serializer.startTag(null, outerTag);
         for (int i = 0; i < mUserRestrictions.size(); i++) {
@@ -199,7 +200,7 @@
     /**
      * Read restrictions from XML.
      */
-    public static RestrictionsSet readRestrictions(@NonNull XmlPullParser parser,
+    public static RestrictionsSet readRestrictions(@NonNull TypedXmlPullParser parser,
             @NonNull String outerTag) throws IOException, XmlPullParserException {
         RestrictionsSet restrictionsSet = new RestrictionsSet();
         int userId = 0;
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 71e7358..35fa7fc 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -74,6 +74,7 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
 import android.service.pm.PackageServiceDumpProto;
 import android.text.TextUtils;
 import android.util.ArrayMap;
@@ -88,6 +89,8 @@
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
 import android.util.SparseLongArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 import android.util.proto.ProtoOutputStream;
 
@@ -96,13 +99,13 @@
 import com.android.internal.os.BackgroundThread;
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.CollectionUtils;
-import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.internal.util.JournaledFile;
 import com.android.internal.util.XmlUtils;
 import com.android.permission.persistence.RuntimePermissionsPersistence;
 import com.android.permission.persistence.RuntimePermissionsState;
 import com.android.server.LocalServices;
+import com.android.server.backup.PreferredActivityBackupHelper;
 import com.android.server.pm.Installer.InstallerException;
 import com.android.server.pm.parsing.PackageInfoUtils;
 import com.android.server.pm.parsing.pkg.AndroidPackage;
@@ -117,10 +120,7 @@
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
 
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileInputStream;
@@ -1297,7 +1297,7 @@
      *
      * @see PreferredActivityBackupHelper
      */
-    void readPreferredActivitiesLPw(XmlPullParser parser, int userId)
+    void readPreferredActivitiesLPw(TypedXmlPullParser parser, int userId)
             throws XmlPullParserException, IOException {
         int outerDepth = parser.getDepth();
         int type;
@@ -1330,7 +1330,7 @@
         }
     }
 
-    private void readPersistentPreferredActivitiesLPw(XmlPullParser parser, int userId)
+    private void readPersistentPreferredActivitiesLPw(TypedXmlPullParser parser, int userId)
             throws XmlPullParserException, IOException {
         int outerDepth = parser.getDepth();
         int type;
@@ -1352,7 +1352,7 @@
         }
     }
 
-    private void readCrossProfileIntentFiltersLPw(XmlPullParser parser, int userId)
+    private void readCrossProfileIntentFiltersLPw(TypedXmlPullParser parser, int userId)
             throws XmlPullParserException, IOException {
         int outerDepth = parser.getDepth();
         int type;
@@ -1374,8 +1374,8 @@
         }
     }
 
-    private void readDomainVerificationLPw(XmlPullParser parser, PackageSettingBase packageSetting)
-            throws XmlPullParserException, IOException {
+    private void readDomainVerificationLPw(TypedXmlPullParser parser,
+            PackageSettingBase packageSetting) throws XmlPullParserException, IOException {
         IntentFilterVerificationInfo ivi = new IntentFilterVerificationInfo(parser);
         packageSetting.setIntentFilterVerificationInfo(ivi);
         if (DEBUG_PARSER) {
@@ -1383,7 +1383,7 @@
         }
     }
 
-    private void readRestoredIntentFilterVerifications(XmlPullParser parser)
+    private void readRestoredIntentFilterVerifications(TypedXmlPullParser parser)
             throws XmlPullParserException, IOException {
         int outerDepth = parser.getDepth();
         int type;
@@ -1407,7 +1407,7 @@
         }
     }
 
-    void readDefaultAppsLPw(XmlPullParser parser, int userId)
+    void readDefaultAppsLPw(TypedXmlPullParser parser, int userId)
             throws XmlPullParserException, IOException {
         int outerDepth = parser.getDepth();
         int type;
@@ -1431,7 +1431,7 @@
         }
     }
 
-    void readBlockUninstallPackagesLPw(XmlPullParser parser, int userId)
+    void readBlockUninstallPackagesLPw(TypedXmlPullParser parser, int userId)
             throws XmlPullParserException, IOException {
         int outerDepth = parser.getDepth();
         int type;
@@ -1521,8 +1521,7 @@
                 str = new FileInputStream(userPackagesStateFile);
                 if (DEBUG_MU) Log.i(TAG, "Reading " + userPackagesStateFile);
             }
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(str, StandardCharsets.UTF_8.name());
+            final TypedXmlPullParser parser = Xml.resolvePullParser(str);
 
             int type;
             while ((type=parser.next()) != XmlPullParser.START_TAG
@@ -1752,7 +1751,7 @@
         return packages.contains(packageName);
     }
 
-    private ArraySet<String> readComponentsLPr(XmlPullParser parser)
+    private ArraySet<String> readComponentsLPr(TypedXmlPullParser parser)
             throws IOException, XmlPullParserException {
         ArraySet<String> components = null;
         int type;
@@ -1784,7 +1783,7 @@
      * for recording packages.xml internally and for supporting backup/restore of the
      * preferred activity configuration.
      */
-    void writePreferredActivitiesLPr(XmlSerializer serializer, int userId, boolean full)
+    void writePreferredActivitiesLPr(TypedXmlSerializer serializer, int userId, boolean full)
             throws IllegalArgumentException, IllegalStateException, IOException {
         serializer.startTag(null, "preferred-activities");
         PreferredIntentResolver pir = mPreferredActivities.get(userId);
@@ -1798,7 +1797,7 @@
         serializer.endTag(null, "preferred-activities");
     }
 
-    void writePersistentPreferredActivitiesLPr(XmlSerializer serializer, int userId)
+    void writePersistentPreferredActivitiesLPr(TypedXmlSerializer serializer, int userId)
             throws IllegalArgumentException, IllegalStateException, IOException {
         serializer.startTag(null, TAG_PERSISTENT_PREFERRED_ACTIVITIES);
         PersistentPreferredIntentResolver ppir = mPersistentPreferredActivities.get(userId);
@@ -1812,7 +1811,7 @@
         serializer.endTag(null, TAG_PERSISTENT_PREFERRED_ACTIVITIES);
     }
 
-    void writeCrossProfileIntentFiltersLPr(XmlSerializer serializer, int userId)
+    void writeCrossProfileIntentFiltersLPr(TypedXmlSerializer serializer, int userId)
             throws IllegalArgumentException, IllegalStateException, IOException {
         serializer.startTag(null, TAG_CROSS_PROFILE_INTENT_FILTERS);
         CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(userId);
@@ -1826,7 +1825,7 @@
         serializer.endTag(null, TAG_CROSS_PROFILE_INTENT_FILTERS);
     }
 
-    void writeDomainVerificationsLPr(XmlSerializer serializer,
+    void writeDomainVerificationsLPr(TypedXmlSerializer serializer,
                                      IntentFilterVerificationInfo verificationInfo)
             throws IllegalArgumentException, IllegalStateException, IOException {
         if (verificationInfo != null && verificationInfo.getPackageName() != null) {
@@ -1841,7 +1840,7 @@
     }
 
     // Specifically for backup/restore
-    void writeAllDomainVerificationsLPr(XmlSerializer serializer, int userId)
+    void writeAllDomainVerificationsLPr(TypedXmlSerializer serializer, int userId)
             throws IllegalArgumentException, IllegalStateException, IOException {
         serializer.startTag(null, TAG_ALL_INTENT_FILTER_VERIFICATION);
         final int N = mPackages.size();
@@ -1856,7 +1855,7 @@
     }
 
     // Specifically for backup/restore
-    void readAllDomainVerificationsLPr(XmlPullParser parser, int userId)
+    void readAllDomainVerificationsLPr(TypedXmlPullParser parser, int userId)
             throws XmlPullParserException, IOException {
         mRestoredIntentFilterVerifications.clear();
 
@@ -1896,7 +1895,7 @@
         }
     }
 
-    void writeDefaultAppsLPr(XmlSerializer serializer, int userId)
+    void writeDefaultAppsLPr(TypedXmlSerializer serializer, int userId)
             throws IllegalArgumentException, IllegalStateException, IOException {
         serializer.startTag(null, TAG_DEFAULT_APPS);
         String defaultBrowser = mDefaultBrowserApp.get(userId);
@@ -1908,7 +1907,7 @@
         serializer.endTag(null, TAG_DEFAULT_APPS);
     }
 
-    void writeBlockUninstallPackagesLPr(XmlSerializer serializer, int userId)
+    void writeBlockUninstallPackagesLPr(TypedXmlSerializer serializer, int userId)
             throws IOException  {
         ArraySet<String> packages = mBlockUninstallPackages.get(userId);
         if (packages != null) {
@@ -1955,10 +1954,7 @@
 
         try {
             final FileOutputStream fstr = new FileOutputStream(userPackagesStateFile);
-            final BufferedOutputStream str = new BufferedOutputStream(fstr);
-
-            final XmlSerializer serializer = new FastXmlSerializer();
-            serializer.setOutput(str, StandardCharsets.UTF_8.name());
+            final TypedXmlSerializer serializer = Xml.resolveSerializer(fstr);
             serializer.startDocument(null, true);
             serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
 
@@ -2076,9 +2072,9 @@
 
             serializer.endDocument();
 
-            str.flush();
+            fstr.flush();
             FileUtils.sync(fstr);
-            str.close();
+            fstr.close();
 
             // New settings successfully written, old ones are no longer
             // needed.
@@ -2108,7 +2104,7 @@
         }
     }
 
-    void readInstallPermissionsLPr(XmlPullParser parser,
+    void readInstallPermissionsLPr(TypedXmlPullParser parser,
             LegacyPermissionState permissionsState) throws IOException, XmlPullParserException {
         int outerDepth = parser.getDepth();
         int type;
@@ -2138,7 +2134,7 @@
         }
     }
 
-    void writePermissionsLPr(XmlSerializer serializer, Collection<PermissionState> permissionStates)
+    void writePermissionsLPr(TypedXmlSerializer serializer, Collection<PermissionState> permissionStates)
             throws IOException {
         if (permissionStates.isEmpty()) {
             return;
@@ -2157,7 +2153,7 @@
         serializer.endTag(null, TAG_PERMISSIONS);
     }
 
-    void readUsesStaticLibLPw(XmlPullParser parser, PackageSetting outPs)
+    void readUsesStaticLibLPw(TypedXmlPullParser parser, PackageSetting outPs)
             throws IOException, XmlPullParserException {
         String libName = parser.getAttributeValue(null, ATTR_NAME);
         String libVersionStr = parser.getAttributeValue(null, ATTR_VERSION);
@@ -2179,7 +2175,7 @@
         XmlUtils.skipCurrentTag(parser);
     }
 
-    void writeUsesStaticLibLPw(XmlSerializer serializer, String[] usesStaticLibraries,
+    void writeUsesStaticLibLPw(TypedXmlSerializer serializer, String[] usesStaticLibraries,
             long[] usesStaticLibraryVersions) throws IOException {
         if (ArrayUtils.isEmpty(usesStaticLibraries) || ArrayUtils.isEmpty(usesStaticLibraryVersions)
                 || usesStaticLibraries.length != usesStaticLibraryVersions.length) {
@@ -2236,8 +2232,7 @@
                 }
                 str = new FileInputStream(mStoppedPackagesFilename);
             }
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(str, null);
+            final TypedXmlPullParser parser = Xml.resolvePullParser(str);
 
             int type;
             while ((type=parser.next()) != XmlPullParser.START_TAG
@@ -2334,12 +2329,8 @@
         mPastSignatures.clear();
 
         try {
-            FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
-            BufferedOutputStream str = new BufferedOutputStream(fstr);
-
-            //XmlSerializer serializer = XmlUtils.serializerInstance();
-            XmlSerializer serializer = new FastXmlSerializer();
-            serializer.setOutput(str, StandardCharsets.UTF_8.name());
+            final FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
+            final TypedXmlSerializer serializer = Xml.resolveSerializer(fstr);
             serializer.startDocument(null, true);
             serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
 
@@ -2429,9 +2420,9 @@
 
             serializer.endDocument();
 
-            str.flush();
+            fstr.flush();
             FileUtils.sync(fstr);
-            str.close();
+            fstr.close();
 
             // New settings successfully written, old ones are no longer
             // needed.
@@ -2685,7 +2676,7 @@
         }
     }
 
-    void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg)
+    void writeDisabledSysPackageLPr(TypedXmlSerializer serializer, final PackageSetting pkg)
             throws java.io.IOException {
         serializer.startTag(null, "updated-package");
         serializer.attribute(null, ATTR_NAME, pkg.name);
@@ -2727,7 +2718,7 @@
         serializer.endTag(null, "updated-package");
     }
 
-    void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg)
+    void writePackageLPr(TypedXmlSerializer serializer, final PackageSetting pkg)
             throws java.io.IOException {
         serializer.startTag(null, "package");
         serializer.attribute(null, ATTR_NAME, pkg.name);
@@ -2823,7 +2814,7 @@
         serializer.endTag(null, "package");
     }
 
-    void writeSigningKeySetLPr(XmlSerializer serializer,
+    void writeSigningKeySetLPr(TypedXmlSerializer serializer,
             PackageKeySetData data) throws IOException {
         serializer.startTag(null, "proper-signing-keyset");
         serializer.attribute(null, "identifier",
@@ -2831,7 +2822,7 @@
         serializer.endTag(null, "proper-signing-keyset");
     }
 
-    void writeUpgradeKeySetsLPr(XmlSerializer serializer,
+    void writeUpgradeKeySetsLPr(TypedXmlSerializer serializer,
             PackageKeySetData data) throws IOException {
         if (data.isUsingUpgradeKeySets()) {
             for (long id : data.getUpgradeKeySets()) {
@@ -2842,7 +2833,7 @@
         }
     }
 
-    void writeKeySetAliasesLPr(XmlSerializer serializer,
+    void writeKeySetAliasesLPr(TypedXmlSerializer serializer,
             PackageKeySetData data) throws IOException {
         for (Map.Entry<String, Long> e: data.getAliases().entrySet()) {
             serializer.startTag(null, "defined-keyset");
@@ -2892,8 +2883,7 @@
                 }
                 str = new FileInputStream(mSettingsFilename);
             }
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(str, StandardCharsets.UTF_8.name());
+            final TypedXmlPullParser parser = Xml.resolvePullParser(str);
 
             int type;
             while ((type = parser.next()) != XmlPullParser.START_TAG
@@ -3147,9 +3137,8 @@
                     Log.d(TAG, "Reading default preferred " + f);
                 }
 
-                try (InputStream str = new BufferedInputStream(new FileInputStream(f))) {
-                    XmlPullParser parser = Xml.newPullParser();
-                    parser.setInput(str, null);
+                try (InputStream str = new FileInputStream(f)) {
+                    final TypedXmlPullParser parser = Xml.resolvePullParser(str);
 
                     int type;
                     while ((type = parser.next()) != XmlPullParser.START_TAG
@@ -3420,7 +3409,7 @@
         }
     }
 
-    private void readDefaultPreferredActivitiesLPw(XmlPullParser parser, int userId)
+    private void readDefaultPreferredActivitiesLPw(TypedXmlPullParser parser, int userId)
             throws XmlPullParserException, IOException {
         final PackageManagerInternal pmInternal =
                 LocalServices.getService(PackageManagerInternal.class);
@@ -3452,8 +3441,8 @@
         }
     }
 
-    private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException,
-            IOException {
+    private void readDisabledSysPackageLPw(TypedXmlPullParser parser)
+            throws XmlPullParserException, IOException {
         String name = parser.getAttributeValue(null, ATTR_NAME);
         String realName = parser.getAttributeValue(null, "realName");
         String codePathStr = parser.getAttributeValue(null, "codePath");
@@ -3551,7 +3540,8 @@
     private static int PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE = 1<<28;
     private static int PRE_M_APP_INFO_FLAG_PRIVILEGED = 1<<30;
 
-    private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException {
+    private void readPackageLPw(TypedXmlPullParser parser)
+            throws XmlPullParserException, IOException {
         String name = null;
         String realName = null;
         String idStr = null;
@@ -3891,7 +3881,7 @@
         }
     }
 
-    private Map<String, ArraySet<String>> readMimeGroupLPw(XmlPullParser parser,
+    private Map<String, ArraySet<String>> readMimeGroupLPw(TypedXmlPullParser parser,
             Map<String, ArraySet<String>> mimeGroups) throws XmlPullParserException, IOException {
         String groupName = parser.getAttributeValue(null, ATTR_NAME);
         if (groupName == null) {
@@ -3932,7 +3922,7 @@
         return mimeGroups;
     }
 
-    private void writeMimeGroupLPr(XmlSerializer serializer,
+    private void writeMimeGroupLPr(TypedXmlSerializer serializer,
             Map<String, ArraySet<String>> mimeGroups) throws IOException {
         if (mimeGroups == null) {
             return;
@@ -3952,8 +3942,8 @@
         }
     }
 
-    private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
-            int userId) throws IOException, XmlPullParserException {
+    private void readDisabledComponentsLPw(PackageSettingBase packageSetting,
+            TypedXmlPullParser parser, int userId) throws IOException, XmlPullParserException {
         int outerDepth = parser.getDepth();
         int type;
         while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -3980,8 +3970,8 @@
         }
     }
 
-    private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
-            int userId) throws IOException, XmlPullParserException {
+    private void readEnabledComponentsLPw(PackageSettingBase packageSetting,
+            TypedXmlPullParser parser, int userId) throws IOException, XmlPullParserException {
         int outerDepth = parser.getDepth();
         int type;
         while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -4008,7 +3998,8 @@
         }
     }
 
-    private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException,IOException {
+    private void readSharedUserLPw(TypedXmlPullParser parser)
+            throws XmlPullParserException, IOException {
         String name = null;
         String idStr = null;
         int pkgFlags = 0;
@@ -5547,8 +5538,7 @@
             }
 
             try {
-                XmlPullParser parser = Xml.newPullParser();
-                parser.setInput(in, null);
+                final TypedXmlPullParser parser = Xml.resolvePullParser(in);
                 parseRuntimePermissionsLPr(parser, userId);
 
             } catch (XmlPullParserException | IOException e) {
@@ -5562,7 +5552,7 @@
         // Private internals
 
         @GuardedBy("Settings.this.mLock")
-        private void parseRuntimePermissionsLPr(XmlPullParser parser, int userId)
+        private void parseRuntimePermissionsLPr(TypedXmlPullParser parser, int userId)
                 throws IOException, XmlPullParserException {
             final int outerDepth = parser.getDepth();
             int type;
@@ -5608,7 +5598,7 @@
             }
         }
 
-        private void parsePermissionsLPr(XmlPullParser parser,
+        private void parsePermissionsLPr(TypedXmlPullParser parser,
                 LegacyPermissionState permissionsState, int userId)
                 throws IOException, XmlPullParserException {
             final int outerDepth = parser.getDepth();
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 24082b8..3b91d6a 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -94,6 +94,8 @@
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
 import android.util.TimeUtils;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.GuardedBy;
@@ -102,7 +104,6 @@
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.os.BackgroundThread;
 import com.android.internal.util.DumpUtils;
-import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.Preconditions;
 import com.android.internal.util.XmlUtils;
@@ -121,7 +122,6 @@
 import org.xmlpull.v1.XmlPullParserException;
 import org.xmlpull.v1.XmlSerializer;
 
-import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileDescriptor;
 import java.io.FileInputStream;
@@ -131,7 +131,6 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PrintWriter;
-import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -2548,8 +2547,7 @@
         AtomicFile userListFile = new AtomicFile(mUserListFile);
         try {
             fis = userListFile.openRead();
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(fis, StandardCharsets.UTF_8.name());
+            final TypedXmlPullParser parser = Xml.resolvePullParser(fis);
             int type;
             while ((type = parser.next()) != XmlPullParser.START_TAG
                     && type != XmlPullParser.END_DOCUMENT) {
@@ -2874,8 +2872,7 @@
         AtomicFile userFile = new AtomicFile(new File(mUsersDir, userData.info.id + XML_SUFFIX));
         try {
             fos = userFile.startWrite();
-            final BufferedOutputStream bos = new BufferedOutputStream(fos);
-            writeUserLP(userData, bos);
+            writeUserLP(userData, fos);
             userFile.finishWrite(fos);
         } catch (Exception ioe) {
             Slog.e(LOG_TAG, "Error writing user info " + userData.info.id, ioe);
@@ -2893,9 +2890,7 @@
     @VisibleForTesting
     void writeUserLP(UserData userData, OutputStream os)
             throws IOException, XmlPullParserException {
-        // XmlSerializer serializer = XmlUtils.serializerInstance();
-        final XmlSerializer serializer = new FastXmlSerializer();
-        serializer.setOutput(os, StandardCharsets.UTF_8.name());
+        final TypedXmlSerializer serializer = Xml.resolveSerializer(os);
         serializer.startDocument(null, true);
         serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
 
@@ -3001,11 +2996,7 @@
         AtomicFile userListFile = new AtomicFile(mUserListFile);
         try {
             fos = userListFile.startWrite();
-            final BufferedOutputStream bos = new BufferedOutputStream(fos);
-
-            // XmlSerializer serializer = XmlUtils.serializerInstance();
-            final XmlSerializer serializer = new FastXmlSerializer();
-            serializer.setOutput(bos, StandardCharsets.UTF_8.name());
+            final TypedXmlSerializer serializer = Xml.resolveSerializer(fos);
             serializer.startDocument(null, true);
             serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
 
@@ -3092,8 +3083,7 @@
         RestrictionsSet localRestrictions = null;
         Bundle globalRestrictions = null;
 
-        XmlPullParser parser = Xml.newPullParser();
-        parser.setInput(is, StandardCharsets.UTF_8.name());
+        final TypedXmlPullParser parser = Xml.resolvePullParser(is);
         int type;
         while ((type = parser.next()) != XmlPullParser.START_TAG
                 && type != XmlPullParser.END_DOCUMENT) {
@@ -3231,7 +3221,7 @@
         return userData;
     }
 
-    private int readIntAttribute(XmlPullParser parser, String attr, int defaultValue) {
+    private int readIntAttribute(TypedXmlPullParser parser, String attr, int defaultValue) {
         String valueString = parser.getAttributeValue(null, attr);
         if (valueString == null) return defaultValue;
         try {
@@ -3241,7 +3231,7 @@
         }
     }
 
-    private long readLongAttribute(XmlPullParser parser, String attr, long defaultValue) {
+    private long readLongAttribute(TypedXmlPullParser parser, String attr, long defaultValue) {
         String valueString = parser.getAttributeValue(null, attr);
         if (valueString == null) return defaultValue;
         try {
@@ -4259,8 +4249,7 @@
         FileInputStream fis = null;
         try {
             fis = restrictionsFile.openRead();
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(fis, StandardCharsets.UTF_8.name());
+            final TypedXmlPullParser parser = Xml.resolvePullParser(fis);
             XmlUtils.nextElement(parser);
             if (parser.getEventType() != XmlPullParser.START_TAG) {
                 Slog.e(LOG_TAG, "Unable to read restrictions file "
@@ -4279,7 +4268,7 @@
     }
 
     private static void readEntry(Bundle restrictions, ArrayList<String> values,
-            XmlPullParser parser) throws XmlPullParserException, IOException {
+            TypedXmlPullParser parser) throws XmlPullParserException, IOException {
         int type = parser.getEventType();
         if (type == XmlPullParser.START_TAG && parser.getName().equals(TAG_ENTRY)) {
             String key = parser.getAttributeValue(null, ATTR_KEY);
@@ -4322,7 +4311,7 @@
         }
     }
 
-    private static Bundle readBundleEntry(XmlPullParser parser, ArrayList<String> values)
+    private static Bundle readBundleEntry(TypedXmlPullParser parser, ArrayList<String> values)
             throws IOException, XmlPullParserException {
         Bundle childBundle = new Bundle();
         final int outerDepth = parser.getDepth();
@@ -4347,10 +4336,7 @@
         FileOutputStream fos = null;
         try {
             fos = restrictionsFile.startWrite();
-            final BufferedOutputStream bos = new BufferedOutputStream(fos);
-
-            final XmlSerializer serializer = new FastXmlSerializer();
-            serializer.setOutput(bos, StandardCharsets.UTF_8.name());
+            final TypedXmlSerializer serializer = Xml.resolveSerializer(fos);
             serializer.startDocument(null, true);
             serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
 
@@ -4366,7 +4352,7 @@
         }
     }
 
-    private static void writeBundle(Bundle restrictions, XmlSerializer serializer)
+    private static void writeBundle(Bundle restrictions, TypedXmlSerializer serializer)
             throws IOException {
         for (String key : restrictions.keySet()) {
             Object value = restrictions.get(key);
diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
index 87a883c..145dd24 100644
--- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
+++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
@@ -41,8 +41,11 @@
 import android.util.Log;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 
 import com.android.internal.util.Preconditions;
+import com.android.internal.util.XmlUtils;
 import com.android.server.LocalServices;
 
 import com.google.android.collect.Sets;
@@ -327,6 +330,11 @@
 
     public static void writeRestrictions(@NonNull XmlSerializer serializer,
             @Nullable Bundle restrictions, @NonNull String tag) throws IOException {
+        writeRestrictions(XmlUtils.makeTyped(serializer), restrictions, tag);
+    }
+
+    public static void writeRestrictions(@NonNull TypedXmlSerializer serializer,
+            @Nullable Bundle restrictions, @NonNull String tag) throws IOException {
         if (restrictions == null) {
             return;
         }
@@ -348,6 +356,10 @@
     }
 
     public static void readRestrictions(XmlPullParser parser, Bundle restrictions) {
+        readRestrictions(XmlUtils.makeTyped(parser), restrictions);
+    }
+
+    public static void readRestrictions(TypedXmlPullParser parser, Bundle restrictions) {
         restrictions.clear();
         for (String key : USER_RESTRICTIONS) {
             final String value = parser.getAttributeValue(null, key);
@@ -358,6 +370,10 @@
     }
 
     public static Bundle readRestrictions(XmlPullParser parser) {
+        return readRestrictions(XmlUtils.makeTyped(parser));
+    }
+
+    public static Bundle readRestrictions(TypedXmlPullParser parser) {
         final Bundle result = new Bundle();
         readRestrictions(parser, result);
         return result;
diff --git a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
index f058ad9..252ba60 100644
--- a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
+++ b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
@@ -418,6 +418,8 @@
     @VisibleForTesting
     static boolean hasAutoGeneratedRROSuffix(String name) {
         return name.endsWith(".auto_generated_rro_product__")
+                // TODO(b/172956245): temporary workaround until OEMs can customize name
+                || name.endsWith("carui.rro") || name.endsWith("carui.overlayable.rro")
                 || name.endsWith(".auto_generated_rro_vendor__");
     }
 
diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
index 2d2e72a..9dde7df 100644
--- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
+++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
@@ -275,8 +275,8 @@
             return null;
         }
 
-        ActivityInfo info =
-                PackageInfoWithoutStateUtils.generateActivityInfoUnchecked(a, applicationInfo);
+        final ActivityInfo info = PackageInfoWithoutStateUtils.generateActivityInfoUnchecked(
+                a, flags, applicationInfo);
         assignSharedFieldsForComponentInfo(info, a, pkgSetting, userId);
         return info;
     }
@@ -310,8 +310,8 @@
             return null;
         }
 
-        ServiceInfo info =
-                PackageInfoWithoutStateUtils.generateServiceInfoUnchecked(s, applicationInfo);
+        final ServiceInfo info = PackageInfoWithoutStateUtils.generateServiceInfoUnchecked(
+                s, flags, applicationInfo);
         assignSharedFieldsForComponentInfo(info, s, pkgSetting, userId);
         return info;
     }
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index bf5a50e..8940256 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -60,6 +60,7 @@
 import android.util.Log;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.TypedXmlPullParser;
 import android.util.Xml;
 
 import com.android.internal.util.ArrayUtils;
@@ -820,7 +821,7 @@
                     CONTACTS_PERMISSIONS, STORAGE_PERMISSIONS);
         }
 
-        // Atthention Service
+        // Attention Service
         String attentionServicePackageName =
                 mContext.getPackageManager().getAttentionServicePackageName();
         if (!TextUtils.isEmpty(attentionServicePackageName)) {
@@ -1410,7 +1411,7 @@
             try (
                 InputStream str = new BufferedInputStream(new FileInputStream(file))
             ) {
-                XmlPullParser parser = Xml.newPullParser();
+                TypedXmlPullParser parser = Xml.newFastPullParser();
                 parser.setInput(str, null);
                 parse(pm, parser, grantExceptions);
             } catch (XmlPullParserException | IOException e) {
@@ -1421,7 +1422,7 @@
         return grantExceptions;
     }
 
-    private void parse(PackageManagerWrapper pm, XmlPullParser parser,
+    private void parse(PackageManagerWrapper pm, TypedXmlPullParser parser,
             Map<String, List<DefaultPermissionGrant>> outGrantExceptions)
             throws IOException, XmlPullParserException {
         final int outerDepth = parser.getDepth();
@@ -1439,7 +1440,7 @@
         }
     }
 
-    private void parseExceptions(PackageManagerWrapper pm, XmlPullParser parser,
+    private void parseExceptions(PackageManagerWrapper pm, TypedXmlPullParser parser,
             Map<String, List<DefaultPermissionGrant>> outGrantExceptions)
             throws IOException, XmlPullParserException {
         final int outerDepth = parser.getDepth();
@@ -1488,7 +1489,7 @@
         }
     }
 
-    private void parsePermission(XmlPullParser parser, List<DefaultPermissionGrant>
+    private void parsePermission(TypedXmlPullParser parser, List<DefaultPermissionGrant>
             outPackageExceptions) throws IOException, XmlPullParserException {
         final int outerDepth = parser.getDepth();
         int type;
diff --git a/services/core/java/com/android/server/pm/permission/LegacyPermission.java b/services/core/java/com/android/server/pm/permission/LegacyPermission.java
index a19a05a..48243a4 100644
--- a/services/core/java/com/android/server/pm/permission/LegacyPermission.java
+++ b/services/core/java/com/android/server/pm/permission/LegacyPermission.java
@@ -21,15 +21,14 @@
 import android.annotation.Nullable;
 import android.content.pm.PermissionInfo;
 import android.util.Log;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 
 import com.android.server.pm.DumpState;
 import com.android.server.pm.PackageManagerService;
 
 import libcore.util.EmptyArray;
 
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlSerializer;
-
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.lang.annotation.Retention;
@@ -133,7 +132,7 @@
      * @hide
      */
     public static boolean read(@NonNull Map<String, LegacyPermission> out,
-            @NonNull XmlPullParser parser) {
+            @NonNull TypedXmlPullParser parser) {
         final String tagName = parser.getName();
         if (!tagName.equals(TAG_ITEM)) {
             return false;
@@ -166,7 +165,7 @@
         return true;
     }
 
-    private static int readInt(@NonNull XmlPullParser parser, @Nullable String namespace,
+    private static int readInt(@NonNull TypedXmlPullParser parser, @Nullable String namespace,
             @NonNull String name, int defaultValue) {
         final String value = parser.getAttributeValue(namespace, name);
         if (value == null) {
@@ -186,7 +185,7 @@
     /**
      * @hide
      */
-    public void write(@NonNull XmlSerializer serializer) throws IOException {
+    public void write(@NonNull TypedXmlSerializer serializer) throws IOException {
         if (mPermissionInfo.packageName == null) {
             return;
         }
diff --git a/services/core/java/com/android/server/pm/permission/LegacyPermissionSettings.java b/services/core/java/com/android/server/pm/permission/LegacyPermissionSettings.java
index cc0b798..f63600a 100644
--- a/services/core/java/com/android/server/pm/permission/LegacyPermissionSettings.java
+++ b/services/core/java/com/android/server/pm/permission/LegacyPermissionSettings.java
@@ -21,6 +21,8 @@
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Log;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.util.XmlUtils;
@@ -99,14 +101,14 @@
         }
     }
 
-    public void readPermissions(@NonNull XmlPullParser parser) throws IOException,
+    public void readPermissions(@NonNull TypedXmlPullParser parser) throws IOException,
             XmlPullParserException {
         synchronized (mLock) {
             readPermissions(mPermissions, parser);
         }
     }
 
-    public void readPermissionTrees(@NonNull XmlPullParser parser) throws IOException,
+    public void readPermissionTrees(@NonNull TypedXmlPullParser parser) throws IOException,
             XmlPullParserException {
         synchronized (mLock) {
             readPermissions(mPermissionTrees, parser);
@@ -114,7 +116,7 @@
     }
 
     public static void readPermissions(@NonNull ArrayMap<String, LegacyPermission> out,
-            @NonNull XmlPullParser parser) throws IOException, XmlPullParserException {
+            @NonNull TypedXmlPullParser parser) throws IOException, XmlPullParserException {
         int outerDepth = parser.getDepth();
         int type;
         while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -132,7 +134,7 @@
         }
     }
 
-    public void writePermissions(@NonNull XmlSerializer serializer) throws IOException {
+    public void writePermissions(@NonNull TypedXmlSerializer serializer) throws IOException {
         synchronized (mLock) {
             for (LegacyPermission bp : mPermissions.values()) {
                 bp.write(serializer);
@@ -140,7 +142,7 @@
         }
     }
 
-    public void writePermissionTrees(@NonNull XmlSerializer serializer) throws IOException {
+    public void writePermissionTrees(@NonNull TypedXmlSerializer serializer) throws IOException {
         synchronized (mLock) {
             for (LegacyPermission bp : mPermissionTrees.values()) {
                 bp.write(serializer);
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index ff661a8..955e51f 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -582,21 +582,15 @@
         }
     }
 
-    @Override
-    public String[] getAppOpPermissionPackages(String permName) {
-        return getAppOpPermissionPackagesInternal(permName, getCallingUid());
-    }
-
-    private String[] getAppOpPermissionPackagesInternal(String permName, int callingUid) {
-        if (mPackageManagerInt.getInstantAppPackageName(callingUid) != null) {
-            return null;
-        }
+    @NonNull
+    private String[] getAppOpPermissionPackagesInternal(@NonNull String permissionName) {
         synchronized (mLock) {
-            final ArraySet<String> pkgs = mRegistry.getAppOpPermissionPackages(permName);
-            if (pkgs == null) {
-                return null;
+            final ArraySet<String> packageNames = mRegistry.getAppOpPermissionPackages(
+                    permissionName);
+            if (packageNames == null) {
+                return EmptyArray.STRING;
             }
-            return pkgs.toArray(new String[pkgs.size()]);
+            return packageNames.toArray(new String[0]);
         }
     }
 
@@ -1299,7 +1293,7 @@
     public boolean addWhitelistedRestrictedPermission(@NonNull String packageName,
             @NonNull String permName, @PermissionWhitelistFlags int flags,
             @UserIdInt int userId) {
-        // Other argument checks are done in get/setWhitelistedRestrictedPermissions
+        // Other argument checks are done in get/setAllowlistedRestrictedPermissions
         Objects.requireNonNull(permName);
 
         if (!checkExistsAndEnforceCannotModifyImmutablyRestrictedPermission(permName)) {
@@ -1313,7 +1307,7 @@
         }
         if (permissions.indexOf(permName) < 0) {
             permissions.add(permName);
-            return setWhitelistedRestrictedPermissionsInternal(packageName, permissions,
+            return setAllowlistedRestrictedPermissions(packageName, permissions,
                     flags, userId);
         }
         return false;
@@ -1344,7 +1338,7 @@
     public boolean removeWhitelistedRestrictedPermission(@NonNull String packageName,
             @NonNull String permName, @PermissionWhitelistFlags int flags,
             @UserIdInt int userId) {
-        // Other argument checks are done in get/setWhitelistedRestrictedPermissions
+        // Other argument checks are done in get/setAllowlistedRestrictedPermissions
         Objects.requireNonNull(permName);
 
         if (!checkExistsAndEnforceCannotModifyImmutablyRestrictedPermission(permName)) {
@@ -1354,13 +1348,13 @@
         final List<String> permissions =
                 getWhitelistedRestrictedPermissions(packageName, flags, userId);
         if (permissions != null && permissions.remove(permName)) {
-            return setWhitelistedRestrictedPermissionsInternal(packageName, permissions,
+            return setAllowlistedRestrictedPermissions(packageName, permissions,
                     flags, userId);
         }
         return false;
     }
 
-    private boolean setWhitelistedRestrictedPermissionsInternal(@NonNull String packageName,
+    private boolean setAllowlistedRestrictedPermissions(@NonNull String packageName,
             @Nullable List<String> permissions, @PermissionWhitelistFlags int flags,
             @UserIdInt int userId) {
         Objects.requireNonNull(packageName);
@@ -1375,7 +1369,7 @@
         if (UserHandle.getCallingUserId() != userId) {
             mContext.enforceCallingOrSelfPermission(
                     Manifest.permission.INTERACT_ACROSS_USERS,
-                    "setWhitelistedRestrictedPermissions for user " + userId);
+                    "setAllowlistedRestrictedPermissions for user " + userId);
         }
 
         final AndroidPackage pkg = mPackageManagerInt.getPackage(packageName);
@@ -1437,8 +1431,8 @@
 
         final long identity = Binder.clearCallingIdentity();
         try {
-            setWhitelistedRestrictedPermissionsForUsers(pkg, new int[]{ userId }, permissions,
-                    Process.myUid(), flags, mDefaultPermissionCallback);
+            setAllowlistedRestrictedPermissionsInternal(pkg, permissions, flags,
+                    new int[] { userId });
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
@@ -1453,25 +1447,34 @@
 
         final AndroidPackage pkg = mPackageManagerInt.getPackage(packageName);
         final int callingUid = Binder.getCallingUid();
-        final int packageUid = UserHandle.getUid(userId, pkg.getUid());
 
         if (!checkAutoRevokeAccess(pkg, callingUid)) {
             return false;
         }
 
-        if (mAppOpsManager
-                .checkOpNoThrow(AppOpsManager.OP_AUTO_REVOKE_MANAGED_BY_INSTALLER,
-                        packageUid, packageName)
-                != MODE_ALLOWED) {
+        return setAutoRevokeExemptedInternal(pkg, whitelisted, userId);
+    }
+
+    private void setAutoRevokeExemptedInternal(@NonNull AndroidPackage pkg, boolean exempted,
+            @NonNull int[] userIds) {
+        for (final int userId : userIds) {
+            setAutoRevokeExemptedInternal(pkg, exempted, userId);
+        }
+    }
+
+    private boolean setAutoRevokeExemptedInternal(@NonNull AndroidPackage pkg, boolean exempted,
+            @UserIdInt int userId) {
+        final int packageUid = UserHandle.getUid(userId, pkg.getUid());
+        if (mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_AUTO_REVOKE_MANAGED_BY_INSTALLER,
+                packageUid, pkg.getPackageName()) != MODE_ALLOWED) {
             // Whitelist user set - don't override
             return false;
         }
 
         final long identity = Binder.clearCallingIdentity();
         try {
-            mAppOpsManager.setMode(AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED,
-                    packageUid, packageName,
-                    whitelisted ? MODE_IGNORED : MODE_ALLOWED);
+            mAppOpsManager.setMode(AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, packageUid,
+                    pkg.getPackageName(), exempted ? MODE_IGNORED : MODE_ALLOWED);
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
@@ -1833,8 +1836,8 @@
      * @param pkg The package for which to reset.
      * @param userId The device user for which to do a reset.
      */
-    private void resetRuntimePermissionsInternal(final AndroidPackage pkg,
-            final int userId) {
+    private void resetRuntimePermissionsInternal(@NonNull AndroidPackage pkg,
+            @UserIdInt int userId) {
         final String packageName = pkg.getPackageName();
 
         // These are flags that can change base on user actions.
@@ -2655,7 +2658,7 @@
     }
 
     @NonNull
-    private Set<String> getGrantedPermissions(@NonNull String packageName,
+    private Set<String> getGrantedPermissionsInternal(@NonNull String packageName,
             @UserIdInt int userId) {
         final PackageSetting ps = mPackageManagerInt.getPackageSetting(packageName);
         if (ps == null) {
@@ -2694,7 +2697,7 @@
     }
 
     @NonNull
-    private int[] getPermissionGids(@NonNull String permissionName, @UserIdInt int userId) {
+    private int[] getPermissionGidsInternal(@NonNull String permissionName, @UserIdInt int userId) {
         synchronized (mLock) {
             Permission permission = mRegistry.getPermission(permissionName);
             if (permission == null) {
@@ -3747,8 +3750,13 @@
         return false;
     }
 
-    private boolean isPermissionsReviewRequired(@NonNull AndroidPackage pkg,
+    private boolean isPermissionsReviewRequiredInternal(@NonNull String packageName,
             @UserIdInt int userId) {
+        final AndroidPackage pkg = mPackageManagerInt.getPackage(packageName);
+        if (pkg == null) {
+            return false;
+        }
+
         // Permission review applies only to apps not supporting the new permission model.
         if (pkg.getTargetSdkVersion() >= Build.VERSION_CODES.M) {
             return false;
@@ -3762,20 +3770,19 @@
                         + userId);
                 return false;
             }
-            return uidState.isPermissionReviewRequired();
+            return uidState.isPermissionsReviewRequired();
         }
     }
 
-    private void grantRequestedRuntimePermissions(AndroidPackage pkg, int[] userIds,
-            String[] grantedPermissions, int callingUid, PermissionCallback callback) {
+    private void grantRequestedRuntimePermissionsInternal(@NonNull AndroidPackage pkg,
+            @Nullable List<String> permissions, @NonNull int[] userIds) {
         for (int userId : userIds) {
-            grantRequestedRuntimePermissionsForUser(pkg, userId, grantedPermissions, callingUid,
-                    callback);
+            grantRequestedRuntimePermissionsForUser(pkg, permissions, userId);
         }
     }
 
-    private void grantRequestedRuntimePermissionsForUser(AndroidPackage pkg, int userId,
-            String[] grantedPermissions, int callingUid, PermissionCallback callback) {
+    private void grantRequestedRuntimePermissionsForUser(@NonNull AndroidPackage pkg,
+            @Nullable List<String> permissions, int userId) {
         final int immutableFlags = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED
                 | PackageManager.FLAG_PERMISSION_POLICY_FIXED;
 
@@ -3787,6 +3794,8 @@
 
         final boolean instantApp = mPackageManagerInt.isInstantApp(pkg.getPackageName(), userId);
 
+        final int myUid = Process.myUid();
+
         for (String permission : pkg.getRequestedPermissions()) {
             final boolean shouldGrantPermission;
             synchronized (mLock) {
@@ -3794,36 +3803,36 @@
                 shouldGrantPermission = bp != null && (bp.isRuntime() || bp.isDevelopment())
                         && (!instantApp || bp.isInstant())
                         && (supportsRuntimePermissions || !bp.isRuntimeOnly())
-                        && (grantedPermissions == null
-                                || ArrayUtils.contains(grantedPermissions, permission));
+                        && (permissions == null || permissions.contains(permission));
             }
             if (shouldGrantPermission) {
                 final int flags = getPermissionFlagsInternal(permission, pkg.getPackageName(),
-                        callingUid, userId);
+                        myUid, userId);
                 if (supportsRuntimePermissions) {
                     // Installer cannot change immutable permissions.
                     if ((flags & immutableFlags) == 0) {
                         grantRuntimePermissionInternal(permission, pkg.getPackageName(), false,
-                                callingUid, userId, callback);
+                                myUid, userId, mDefaultPermissionCallback);
                     }
                 } else {
                     // In permission review mode we clear the review flag and the revoked compat
                     // flag when we are asked to install the app with all permissions granted.
                     if ((flags & compatFlags) != 0) {
                         updatePermissionFlagsInternal(permission, pkg.getPackageName(), compatFlags,
-                                0, callingUid, userId, false, callback);
+                                0, myUid, userId, false, mDefaultPermissionCallback);
                     }
                 }
             }
         }
     }
 
-    private void setWhitelistedRestrictedPermissionsForUsers(@NonNull AndroidPackage pkg,
-            @UserIdInt int[] userIds, @Nullable List<String> permissions, int callingUid,
-            @PermissionWhitelistFlags int whitelistFlags, PermissionCallback callback) {
+    private void setAllowlistedRestrictedPermissionsInternal(@NonNull AndroidPackage pkg,
+            @Nullable List<String> permissions, @PermissionWhitelistFlags int allowlistFlags,
+            @UserIdInt int[] userIds) {
         SparseArray<ArraySet<String>> oldGrantedRestrictedPermissions = new SparseArray<>();
         boolean updatePermissions = false;
         final int permissionCount = pkg.getRequestedPermissions().size();
+        final int myUid = Process.myUid();
 
         for (int i = 0; i < userIds.length; i++) {
             int userId = userIds[i];
@@ -3855,11 +3864,11 @@
                 }
 
                 final int oldFlags = getPermissionFlagsInternal(permissionName,
-                        pkg.getPackageName(), callingUid, userId);
+                        pkg.getPackageName(), myUid, userId);
 
                 int newFlags = oldFlags;
                 int mask = 0;
-                int whitelistFlagsCopy = whitelistFlags;
+                int whitelistFlagsCopy = allowlistFlags;
                 while (whitelistFlagsCopy != 0) {
                     final int flag = 1 << Integer.numberOfTrailingZeros(whitelistFlagsCopy);
                     whitelistFlagsCopy &= ~flag;
@@ -3934,13 +3943,13 @@
                 }
 
                 updatePermissionFlagsInternal(permissionName, pkg.getPackageName(), mask, newFlags,
-                        callingUid, userId, false, null /*callback*/);
+                        myUid, userId, false, null /*callback*/);
             }
         }
 
         if (updatePermissions) {
             // Update permission of this app to take into account the new whitelist state.
-            restorePermissionState(pkg, false, pkg.getPackageName(), callback);
+            restorePermissionState(pkg, false, pkg.getPackageName(), mDefaultPermissionCallback);
 
             // If this resulted in losing a permission we need to kill the app.
             for (int i = 0; i < userIds.length; i++) {
@@ -3965,7 +3974,7 @@
                         isGranted = uidState.isPermissionGranted(permissionName);
                     }
                     if (!isGranted) {
-                        callback.onPermissionRevoked(pkg.getUid(), userId, null);
+                        mDefaultPermissionCallback.onPermissionRevoked(pkg.getUid(), userId, null);
                         break;
                     }
                 }
@@ -4993,10 +5002,14 @@
         public void systemReady() {
             PermissionManagerService.this.systemReady();
         }
+
         @Override
-        public boolean isPermissionsReviewRequired(@NonNull AndroidPackage pkg,
+        public boolean isPermissionsReviewRequired(@NonNull String packageName,
                 @UserIdInt int userId) {
-            return PermissionManagerService.this.isPermissionsReviewRequired(pkg, userId);
+            Objects.requireNonNull(packageName, "packageName");
+            // TODO(b/173235285): Some caller may pass USER_ALL as userId.
+            //Preconditions.checkArgumentNonnegative(userId, "userId");
+            return isPermissionsReviewRequiredInternal(packageName, userId);
         }
 
         @Override
@@ -5055,37 +5068,44 @@
         @Override
         public Set<String> getGrantedPermissions(@NonNull String packageName,
                 @UserIdInt int userId) {
-            return PermissionManagerService.this.getGrantedPermissions(packageName, userId);
+            Objects.requireNonNull(packageName, "packageName");
+            Preconditions.checkArgumentNonNegative(userId, "userId");
+            return getGrantedPermissionsInternal(packageName, userId);
         }
         @NonNull
         @Override
         public int[] getPermissionGids(@NonNull String permissionName, @UserIdInt int userId) {
-            return PermissionManagerService.this.getPermissionGids(permissionName, userId);
+            Objects.requireNonNull(permissionName, "permissionName");
+            Preconditions.checkArgumentNonNegative(userId, "userId");
+            return getPermissionGidsInternal(permissionName, userId);
+        }
+        @NonNull
+        @Override
+        public String[] getAppOpPermissionPackages(@NonNull String permissionName) {
+            Objects.requireNonNull(permissionName, "permissionName");
+            return PermissionManagerService.this.getAppOpPermissionPackagesInternal(permissionName);
         }
         @Override
-        public void grantRequestedRuntimePermissions(AndroidPackage pkg, int[] userIds,
-                String[] grantedPermissions, int callingUid) {
-            PermissionManagerService.this.grantRequestedRuntimePermissions(
-                    pkg, userIds, grantedPermissions, callingUid, mDefaultPermissionCallback);
+        public void grantRequestedRuntimePermissions(@NonNull AndroidPackage pkg,
+                @Nullable List<String> permissions, @NonNull int[] userIds) {
+            Objects.requireNonNull(pkg, "pkg");
+            Objects.requireNonNull(userIds, "userIds");
+            grantRequestedRuntimePermissionsInternal(pkg, permissions, userIds);
         }
         @Override
-        public void setWhitelistedRestrictedPermissions(@NonNull AndroidPackage pkg,
-                @NonNull int[] userIds, @Nullable List<String> permissions, int callingUid,
-                @PackageManager.PermissionWhitelistFlags int flags) {
-            setWhitelistedRestrictedPermissionsForUsers(pkg, userIds, permissions,
-                    callingUid, flags, mDefaultPermissionCallback);
+        public void setAllowlistedRestrictedPermissions(@NonNull AndroidPackage pkg,
+                @Nullable List<String> permissions, @PermissionWhitelistFlags int allowlistFlags,
+                @NonNull int[] userIds) {
+            Objects.requireNonNull(pkg, "pkg");
+            Objects.requireNonNull(userIds, "userIds");
+            setAllowlistedRestrictedPermissionsInternal(pkg, permissions, allowlistFlags, userIds);
         }
         @Override
-        public void setWhitelistedRestrictedPermissions(String packageName,
-                List<String> permissions, int flags, int userId) {
-            PermissionManagerService.this.setWhitelistedRestrictedPermissionsInternal(
-                    packageName, permissions, flags, userId);
-        }
-        @Override
-        public void setAutoRevokeWhitelisted(
-                @NonNull String packageName, boolean whitelisted, int userId) {
-            PermissionManagerService.this.setAutoRevokeWhitelisted(
-                    packageName, whitelisted, userId);
+        public void setAutoRevokeExempted(@NonNull AndroidPackage pkg, boolean exempted,
+                @NonNull int[] userIds) {
+            Objects.requireNonNull(pkg, "pkg");
+            Objects.requireNonNull(userIds, "userIds");
+            setAutoRevokeExemptedInternal(pkg, exempted, userIds);
         }
         @Override
         public void updatePermissions(@NonNull String packageName, @Nullable AndroidPackage pkg) {
@@ -5098,18 +5118,15 @@
                     .updateAllPermissions(volumeUuid, sdkUpdated, mDefaultPermissionCallback);
         }
         @Override
-        public void resetRuntimePermissions(AndroidPackage pkg, int userId) {
-            PermissionManagerService.this.resetRuntimePermissionsInternal(pkg, userId);
+        public void resetRuntimePermissions(@NonNull AndroidPackage pkg, @UserIdInt int userId) {
+            Objects.requireNonNull(pkg, "pkg");
+            Preconditions.checkArgumentNonNegative(userId, "userId");
+            resetRuntimePermissionsInternal(pkg, userId);
         }
         @Override
-        public void resetAllRuntimePermissions(final int userId) {
-            mPackageManagerInt.forEachPackage(
-                    (AndroidPackage pkg) -> resetRuntimePermissionsInternal(pkg, userId));
-        }
-        @Override
-        public String[] getAppOpPermissionPackages(String permName, int callingUid) {
-            return PermissionManagerService.this
-                    .getAppOpPermissionPackagesInternal(permName, callingUid);
+        public void resetAllRuntimePermissions(@UserIdInt int userId) {
+            Preconditions.checkArgumentNonNegative(userId, "userId");
+            mPackageManagerInt.forEachPackage(pkg -> resetRuntimePermissionsInternal(pkg, userId));
         }
         @Override
         public void enforceCrossUserPermission(int callingUid, int userId,
@@ -5344,12 +5361,6 @@
         }
 
         @Override
-        public void grantDefaultPermissionsToDefaultBrowser(String packageName, int userId) {
-            mDefaultPermissionGrantPolicy.grantDefaultPermissionsToDefaultBrowser(packageName,
-                    userId);
-        }
-
-        @Override
         public void onNewUserCreated(int userId) {
             // NOTE: This adds UPDATE_PERMISSIONS_REPLACE_PKG
             PermissionManagerService.this.updateAllPermissions(StorageManager.UUID_PRIVATE_INTERNAL,
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java
index df81bac..7656b2e 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java
@@ -179,22 +179,52 @@
 
     public abstract void systemReady();
 
-    public abstract boolean isPermissionsReviewRequired(@NonNull AndroidPackage pkg,
+    /**
+     * Get whether permission review is required for a package.
+     *
+     * @param packageName the name of the package
+     * @param userId the user ID
+     * @return whether permission review is required
+     */
+    //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+    public abstract boolean isPermissionsReviewRequired(@NonNull String packageName,
             @UserIdInt int userId);
 
-    public abstract void grantRequestedRuntimePermissions(
-            @NonNull AndroidPackage pkg, @NonNull int[] userIds,
-            @NonNull String[] grantedPermissions, int callingUid);
-    public abstract void setWhitelistedRestrictedPermissions(
-            @NonNull AndroidPackage pkg, @NonNull int[] userIds,
-            @NonNull List<String> permissions, int callingUid,
-            @PackageManager.PermissionWhitelistFlags int whitelistFlags);
-    /** Sets the allowlisted, restricted permissions for the given package. */
-    public abstract void setWhitelistedRestrictedPermissions(
-            @NonNull String packageName, @NonNull List<String> permissions,
-            @PackageManager.PermissionWhitelistFlags int flags, int userId);
-    public abstract void setAutoRevokeWhitelisted(
-            @NonNull String packageName, boolean whitelisted, int userId);
+    /**
+     * Grant the requested runtime permissions for a package, or an explicit subset of them.
+     *
+     * @param pkg the package
+     * @param permissions the names of the subset of permissions to be granted, or {@code null} for
+     *                    granting all the requested permissions
+     * @param userIds the user IDs
+     */
+    //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+    public abstract void grantRequestedRuntimePermissions(@NonNull AndroidPackage pkg,
+            @Nullable List<String> permissions, @NonNull int[] userIds);
+
+    /**
+     * Set the allowlisted restricted permissions for a package, or an explicit subset of them.
+     *
+     * @param pkg the package
+     * @param permissions the names of the subset of permissions to be allowlisted, or {@code null}
+     *                    for allowlisting all the requested restricted permissions
+     * @param userIds the user IDs
+     */
+    //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+    public abstract void setAllowlistedRestrictedPermissions(
+            @NonNull AndroidPackage pkg, @Nullable List<String> permissions,
+            @PackageManager.PermissionWhitelistFlags int allowlistFlags, @NonNull int[] userIds);
+
+    /**
+     * Set whether a package is exempted from auto revoke.
+     *
+     * @param pkg the package
+     * @param exempted whether the package is exempted from auto revoke
+     * @param userIds the user IDs
+     */
+    //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+    public abstract void setAutoRevokeExempted(@NonNull AndroidPackage pkg, boolean exempted,
+            @NonNull int[] userIds);
 
     /**
      * Update permissions when a package changed.
@@ -227,21 +257,26 @@
     public abstract void updateAllPermissions(@Nullable String volumeUuid, boolean sdkUpdate);
 
     /**
-     * Resets any user permission state changes (eg. permissions and flags) of all
-     * packages installed for the given user.
+     * Reset the runtime permission state changes for a package.
      *
-     * @see #resetRuntimePermissions(AndroidPackage, int)
+     * TODO(zhanghai): Turn this into package change callback?
+     *
+     * @param pkg the package
+     * @param userId the user ID
      */
-    public abstract void resetAllRuntimePermissions(@UserIdInt int userId);
-
-    /**
-     * Resets any user permission state changes (eg. permissions and flags) of the
-     * specified package for the given user.
-     */
+    //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
     public abstract void resetRuntimePermissions(@NonNull AndroidPackage pkg,
             @UserIdInt int userId);
 
     /**
+     * Reset the runtime permission state changes for all packages.
+     *
+     * @param userId the user ID
+     */
+    //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+    public abstract void resetAllRuntimePermissions(@UserIdInt int userId);
+
+    /**
      * We might auto-grant permissions if any permission of the group is already granted. Hence if
      * the group of a granted permission changes we need to revoke it to avoid having permissions of
      * the new group auto-granted.
@@ -327,20 +362,36 @@
 
     /**
      * Get all the permissions granted to a package.
+     *
+     * @param packageName the name of the package
+     * @param userId the user ID
+     * @return the names of the granted permissions
      */
+    //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
     @NonNull
     public abstract Set<String> getGrantedPermissions(@NonNull String packageName,
             @UserIdInt int userId);
 
     /**
      * Get the GIDs of a permission.
+     *
+     * @param permissionName the name of the permission
+     * @param userId the user ID
+     * @return the GIDs of the permission
      */
-    @Nullable
+    //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+    @NonNull
     public abstract int[] getPermissionGids(@NonNull String permissionName, @UserIdInt int userId);
 
-    /** Retrieve the packages that have requested the given app op permission */
-    public abstract @Nullable String[] getAppOpPermissionPackages(
-            @NonNull String permName, int callingUid);
+    /**
+     * Get the packages that have requested an app op permission.
+     *
+     * @param permissionName the name of the app op permission
+     * @return the names of the packages that have requested the app op permission
+     */
+    //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+    @NonNull
+    public abstract String[] getAppOpPermissionPackages(@NonNull String permissionName);
 
     /**
      * Enforces the request is from the system or an app that has INTERACT_ACROSS_USERS
@@ -368,10 +419,6 @@
             boolean requireFullPermission, boolean checkShell,
             boolean requirePermissionWhenSameUser, @NonNull String message);
 
-    /** Grants default browser permissions to the given package */
-    public abstract void grantDefaultPermissionsToDefaultBrowser(
-            @NonNull String packageName, @UserIdInt int userId);
-
     /** HACK HACK methods to allow for partial migration of data to the PermissionManager class */
     @Nullable
     public abstract Permission getPermissionTEMP(@NonNull String permName);
diff --git a/services/core/java/com/android/server/pm/permission/UidPermissionState.java b/services/core/java/com/android/server/pm/permission/UidPermissionState.java
index 04d82e8..3ef4e46 100644
--- a/services/core/java/com/android/server/pm/permission/UidPermissionState.java
+++ b/services/core/java/com/android/server/pm/permission/UidPermissionState.java
@@ -308,7 +308,7 @@
         return anyChanged;
     }
 
-    public boolean isPermissionReviewRequired() {
+    public boolean isPermissionsReviewRequired() {
         if (mPermissions == null) {
             return false;
         }
diff --git a/services/core/java/com/android/server/power/ThermalManagerService.java b/services/core/java/com/android/server/power/ThermalManagerService.java
index ae0db44..db408488 100644
--- a/services/core/java/com/android/server/power/ThermalManagerService.java
+++ b/services/core/java/com/android/server/power/ThermalManagerService.java
@@ -514,6 +514,9 @@
                         pw.println("Current cooling devices from HAL:");
                         dumpItemsLocked(pw, "\t",
                                 mHalWrapper.getCurrentCoolingDevices(false, 0));
+                        pw.println("Temperature static thresholds from HAL:");
+                        dumpItemsLocked(pw, "\t",
+                                mHalWrapper.getTemperatureThresholds(false, 0));
                     }
                 }
             } finally {
diff --git a/services/core/java/com/android/server/power/batterysaver/FileUpdater.java b/services/core/java/com/android/server/power/batterysaver/FileUpdater.java
index c08b610..1387617 100644
--- a/services/core/java/com/android/server/power/batterysaver/FileUpdater.java
+++ b/services/core/java/com/android/server/power/batterysaver/FileUpdater.java
@@ -23,6 +23,8 @@
 import android.util.ArrayMap;
 import android.util.AtomicFile;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.GuardedBy;
@@ -316,8 +318,7 @@
             outs = file.startWrite();
 
             // Write to XML
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(outs, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(outs);
             out.startDocument(null, true);
             out.startTag(null, TAG_DEFAULT_ROOT);
 
@@ -344,8 +345,7 @@
         }
         Map<String, String> read = null;
         try (FileInputStream in = file.openRead()) {
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(in, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(in);
 
             int type;
             while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index fb47ebb..bd2d382 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -24,15 +24,18 @@
 import android.app.ITransientNotificationCallback;
 import android.app.Notification;
 import android.app.StatusBarManager;
+import android.app.compat.CompatChanges;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledSince;
 import android.content.ComponentName;
 import android.content.Context;
-import android.hardware.biometrics.BiometricAuthenticator;
 import android.hardware.biometrics.IBiometricSysuiReceiver;
 import android.hardware.biometrics.PromptInfo;
 import android.hardware.display.DisplayManager;
 import android.hardware.display.DisplayManager.DisplayListener;
 import android.net.Uri;
 import android.os.Binder;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
@@ -84,6 +87,18 @@
     private static final String TAG = "StatusBarManagerService";
     private static final boolean SPEW = false;
 
+    /**
+     * Apps targeting {@code Build.VERSION_CODES.S} or higher need {@link
+     * android.Manifest.permission#STATUS_BAR} permission to collapse the status bar panels due to
+     * security reasons.
+     *
+     * This was being exploited by malware to prevent the user from accessing critical
+     * notifications.
+     */
+    @ChangeId
+    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.S)
+    private static final long LOCK_DOWN_COLLAPSE_STATUS_BAR = 173031413L;
+
     private final Context mContext;
 
     private Handler mHandler = new Handler();
@@ -605,7 +620,11 @@
 
     @Override
     public void collapsePanels() {
-        enforceExpandStatusBar();
+        if (CompatChanges.isChangeEnabled(LOCK_DOWN_COLLAPSE_STATUS_BAR, Binder.getCallingUid())) {
+            enforceStatusBar();
+        } else {
+            enforceExpandStatusBar();
+        }
 
         if (mBar != null) {
             try {
diff --git a/services/core/java/com/android/server/storage/CacheQuotaStrategy.java b/services/core/java/com/android/server/storage/CacheQuotaStrategy.java
index aafadf9..d2614e4 100644
--- a/services/core/java/com/android/server/storage/CacheQuotaStrategy.java
+++ b/services/core/java/com/android/server/storage/CacheQuotaStrategy.java
@@ -46,6 +46,8 @@
 import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseLongArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -280,9 +282,8 @@
     private void writeXmlToFile(List<CacheQuotaHint> processedRequests) {
         FileOutputStream fileStream = null;
         try {
-            XmlSerializer out = new FastXmlSerializer();
             fileStream = mPreviousValuesFile.startWrite();
-            out.setOutput(fileStream, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(fileStream);
             saveToXml(out, processedRequests, 0);
             mPreviousValuesFile.finishWrite(fileStream);
         } catch (Exception e) {
@@ -342,8 +343,7 @@
 
     protected static Pair<Long, List<CacheQuotaHint>> readFromXml(InputStream inputStream)
             throws XmlPullParserException, IOException {
-        XmlPullParser parser = Xml.newPullParser();
-        parser.setInput(inputStream, StandardCharsets.UTF_8.name());
+        TypedXmlPullParser parser = Xml.resolvePullParser(inputStream);
 
         int eventType = parser.getEventType();
         while (eventType != XmlPullParser.START_TAG &&
diff --git a/services/core/java/com/android/server/timezone/PackageStatusStorage.java b/services/core/java/com/android/server/timezone/PackageStatusStorage.java
index 04f0871..7652c43 100644
--- a/services/core/java/com/android/server/timezone/PackageStatusStorage.java
+++ b/services/core/java/com/android/server/timezone/PackageStatusStorage.java
@@ -25,6 +25,8 @@
 
 import android.util.AtomicFile;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import java.io.File;
@@ -265,8 +267,7 @@
     private static XmlPullParser parseToPackageStatusTag(FileInputStream fis)
             throws ParseException {
         try {
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(fis, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(fis);
             int type;
             while ((type = parser.next()) != END_DOCUMENT) {
                 final String tag = parser.getName();
@@ -315,8 +316,7 @@
         FileOutputStream fos = null;
         try {
             fos = mPackageStatusFile.startWrite();
-            XmlSerializer serializer = new FastXmlSerializer();
-            serializer.setOutput(fos, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer serializer = Xml.resolveSerializer(fos);
             serializer.startDocument(null /* encoding */, true /* standalone */);
             final String namespace = null;
             serializer.startTag(namespace, TAG_PACKAGE_STATUS);
diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
index 68a086d..033bfa6 100644
--- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
+++ b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
@@ -59,14 +59,25 @@
     private static final String TAG = "TimeZoneDetectorService";
 
     /**
-     * A "feature switch" for enabling / disabling location-based time zone detection. If this is
-     * {@code false}, there should be few / little changes in behavior with previous releases and
-     * little overhead associated with geolocation components.
-     * TODO(b/151304765) Remove this when the feature is on for all.
+     * A "feature switch" for location-based time zone detection. If this is {@code false}. It is
+     * initialized and never refreshed; it affects what services are started on boot so consistency
+     * is important.
      */
-    public static final boolean GEOLOCATION_TIME_ZONE_DETECTION_ENABLED =
-            SystemProperties.getBoolean(
-                    "persist.sys.location_time_zone_detection_feature_enabled", false);
+    @Nullable
+    private static Boolean sGeoLocationTimeZoneDetectionEnabled;
+
+    /** Returns {@code true} if the location-based time zone detection feature is enabled. */
+    public static boolean isGeoLocationTimeZoneDetectionEnabled(Context context) {
+        if (sGeoLocationTimeZoneDetectionEnabled == null) {
+            // The config value is expected to be the main switch. Platform developers can also
+            // enable the feature using a persistent system property.
+            sGeoLocationTimeZoneDetectionEnabled = context.getResources().getBoolean(
+                    com.android.internal.R.bool.config_enableGeolocationTimeZoneDetection)
+                    || SystemProperties.getBoolean(
+                            "persist.sys.location_time_zone_detection_feature_enabled", false);
+        }
+        return sGeoLocationTimeZoneDetectionEnabled;
+    }
 
     /**
      * Handles the service lifecycle for {@link TimeZoneDetectorService} and
@@ -84,9 +95,11 @@
             Context context = getContext();
             Handler handler = FgThread.getHandler();
 
+            boolean geolocationTimeZoneDetectionEnabled =
+                    isGeoLocationTimeZoneDetectionEnabled(context);
             TimeZoneDetectorStrategy timeZoneDetectorStrategy =
                     TimeZoneDetectorStrategyImpl.create(
-                            context, handler, GEOLOCATION_TIME_ZONE_DETECTION_ENABLED);
+                            context, handler, geolocationTimeZoneDetectionEnabled);
 
             // Create and publish the local service for use by internal callers.
             TimeZoneDetectorInternal internal =
diff --git a/services/core/java/com/android/server/tv/PersistentDataStore.java b/services/core/java/com/android/server/tv/PersistentDataStore.java
index 8f2194c..355c385 100644
--- a/services/core/java/com/android/server/tv/PersistentDataStore.java
+++ b/services/core/java/com/android/server/tv/PersistentDataStore.java
@@ -26,6 +26,7 @@
 import android.text.TextUtils;
 import android.util.AtomicFile;
 import android.util.Slog;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.util.FastXmlSerializer;
@@ -167,8 +168,7 @@
 
         XmlPullParser parser;
         try {
-            parser = Xml.newPullParser();
-            parser.setInput(new BufferedInputStream(is), StandardCharsets.UTF_8.name());
+            parser = Xml.resolvePullParser(is);
             loadFromXml(parser);
         } catch (IOException | XmlPullParserException ex) {
             Slog.w(TAG, "Failed to load tv input manager persistent store data.", ex);
@@ -200,8 +200,7 @@
             os = mAtomicFile.startWrite();
             boolean success = false;
             try {
-                XmlSerializer serializer = new FastXmlSerializer();
-                serializer.setOutput(new BufferedOutputStream(os), StandardCharsets.UTF_8.name());
+                TypedXmlSerializer serializer = Xml.resolveSerializer(os);
                 saveToXml(serializer);
                 serializer.flush();
                 success = true;
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index abcba5d..afbe552 100755
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -134,12 +134,15 @@
     private final Object mLock = new Object();
 
     // ID of the current user.
+    @GuardedBy("mLock")
     private int mCurrentUserId = UserHandle.USER_SYSTEM;
 
     // A map from user id to UserState.
+    @GuardedBy("mLock")
     private final SparseArray<UserState> mUserStates = new SparseArray<>();
 
     // A map from session id to session state saved in userstate
+    @GuardedBy("mLock")
     private final Map<String, SessionState> mSessionIdToSessionStateMap = new HashMap<>();
 
     private final WatchLogHandler mWatchLogHandler;
@@ -280,7 +283,7 @@
         return pm.checkPermission(android.Manifest.permission.TV_INPUT_HARDWARE,
                 component.getPackageName()) == PackageManager.PERMISSION_GRANTED;
     }
-
+    @GuardedBy("mLock")
     private void buildTvInputListLocked(int userId, String[] updatedPackages) {
         UserState userState = getOrCreateUserStateLocked(userId);
         userState.packageSet.clear();
@@ -368,6 +371,7 @@
         userState.inputMap = inputMap;
     }
 
+    @GuardedBy("mLock")
     private void buildTvContentRatingSystemListLocked(int userId) {
         UserState userState = getOrCreateUserStateLocked(userId);
         userState.contentRatingSystemList.clear();
@@ -444,6 +448,7 @@
         }
     }
 
+    @GuardedBy("mLock")
     private void clearSessionAndNotifyClientLocked(SessionState state) {
         if (state.client != null) {
             try {
@@ -528,6 +533,7 @@
         return context.getContentResolver();
     }
 
+    @GuardedBy("mLock")
     private UserState getOrCreateUserStateLocked(int userId) {
         UserState userState = mUserStates.get(userId);
         if (userState == null) {
@@ -537,6 +543,7 @@
         return userState;
     }
 
+    @GuardedBy("mLock")
     private ServiceState getServiceStateLocked(ComponentName component, int userId) {
         UserState userState = getOrCreateUserStateLocked(userId);
         ServiceState serviceState = userState.serviceStateMap.get(component);
@@ -546,12 +553,13 @@
         }
         return serviceState;
     }
-
+    @GuardedBy("mLock")
     private SessionState getSessionStateLocked(IBinder sessionToken, int callingUid, int userId) {
         UserState userState = getOrCreateUserStateLocked(userId);
         return getSessionStateLocked(sessionToken, callingUid, userState);
     }
 
+    @GuardedBy("mLock")
     private SessionState getSessionStateLocked(IBinder sessionToken,
             int callingUid, UserState userState) {
         SessionState sessionState = userState.sessionStateMap.get(sessionToken);
@@ -566,10 +574,12 @@
         return sessionState;
     }
 
+    @GuardedBy("mLock")
     private ITvInputSession getSessionLocked(IBinder sessionToken, int callingUid, int userId) {
         return getSessionLocked(getSessionStateLocked(sessionToken, callingUid, userId));
     }
 
+    @GuardedBy("mLock")
     private ITvInputSession getSessionLocked(SessionState sessionState) {
         ITvInputSession session = sessionState.session;
         if (session == null) {
@@ -585,6 +595,7 @@
                 false, methodName, null);
     }
 
+    @GuardedBy("mLock")
     private void updateServiceConnectionLocked(ComponentName component, int userId) {
         UserState userState = getOrCreateUserStateLocked(userId);
         ServiceState serviceState = userState.serviceStateMap.get(component);
@@ -638,6 +649,7 @@
         }
     }
 
+    @GuardedBy("mLock")
     private void abortPendingCreateSessionRequestsLocked(ServiceState serviceState,
             String inputId, int userId) {
         // Let clients know the create session requests are failed.
@@ -658,6 +670,7 @@
         updateServiceConnectionLocked(serviceState.component, userId);
     }
 
+    @GuardedBy("mLock")
     private boolean createSessionInternalLocked(ITvInputService service, IBinder sessionToken,
             int userId) {
         UserState userState = getOrCreateUserStateLocked(userId);
@@ -691,6 +704,7 @@
         return created;
     }
 
+    @GuardedBy("mLock")
     private void sendSessionTokenToClientLocked(ITvInputClient client, String inputId,
             IBinder sessionToken, InputChannel channel, int seq) {
         try {
@@ -700,6 +714,7 @@
         }
     }
 
+    @GuardedBy("mLock")
     private void releaseSessionLocked(IBinder sessionToken, int callingUid, int userId) {
         SessionState sessionState = null;
         try {
@@ -725,6 +740,7 @@
         removeSessionStateLocked(sessionToken, userId);
     }
 
+    @GuardedBy("mLock")
     private void removeSessionStateLocked(IBinder sessionToken, int userId) {
         UserState userState = getOrCreateUserStateLocked(userId);
         if (sessionToken == userState.mainSessionToken) {
@@ -767,6 +783,7 @@
         mWatchLogHandler.obtainMessage(WatchLogHandler.MSG_LOG_WATCH_END, args).sendToTarget();
     }
 
+    @GuardedBy("mLock")
     private void setMainLocked(IBinder sessionToken, boolean isMain, int callingUid, int userId) {
         try {
             SessionState sessionState = getSessionStateLocked(sessionToken, callingUid, userId);
@@ -785,6 +802,7 @@
         }
     }
 
+    @GuardedBy("mLock")
     private void notifyInputAddedLocked(UserState userState, String inputId) {
         if (DEBUG) {
             Slog.d(TAG, "notifyInputAddedLocked(inputId=" + inputId + ")");
@@ -800,6 +818,7 @@
         userState.mCallbacks.finishBroadcast();
     }
 
+    @GuardedBy("mLock")
     private void notifyInputRemovedLocked(UserState userState, String inputId) {
         if (DEBUG) {
             Slog.d(TAG, "notifyInputRemovedLocked(inputId=" + inputId + ")");
@@ -815,6 +834,7 @@
         userState.mCallbacks.finishBroadcast();
     }
 
+    @GuardedBy("mLock")
     private void notifyInputUpdatedLocked(UserState userState, String inputId) {
         if (DEBUG) {
             Slog.d(TAG, "notifyInputUpdatedLocked(inputId=" + inputId + ")");
@@ -830,6 +850,7 @@
         userState.mCallbacks.finishBroadcast();
     }
 
+    @GuardedBy("mLock")
     private void notifyInputStateChangedLocked(UserState userState, String inputId,
             int state, ITvInputManagerCallback targetCallback) {
         if (DEBUG) {
@@ -855,6 +876,7 @@
         }
     }
 
+    @GuardedBy("mLock")
     private void notifyCurrentChannelInfosUpdatedLocked(UserState userState) {
         if (DEBUG) {
             Slog.d(TAG, "notifyCurrentChannelInfosUpdatedLocked");
@@ -874,6 +896,7 @@
         userState.mCallbacks.finishBroadcast();
     }
 
+    @GuardedBy("mLock")
     private void updateTvInputInfoLocked(UserState userState, TvInputInfo inputInfo) {
         if (DEBUG) {
             Slog.d(TAG, "updateTvInputInfoLocked(inputInfo=" + inputInfo + ")");
@@ -897,6 +920,7 @@
         userState.mCallbacks.finishBroadcast();
     }
 
+    @GuardedBy("mLock")
     private void setStateLocked(String inputId, int state, int userId) {
         UserState userState = getOrCreateUserStateLocked(userId);
         TvInputState inputState = userState.inputMap.get(inputId);
@@ -2138,6 +2162,7 @@
             mTvInputHardwareManager.onDeviceUnavailable(deviceId);
         }
 
+        @GuardedBy("mLock")
         private int getClientPidLocked(String sessionId)
                 throws IllegalStateException {
             if (mSessionIdToSessionStateMap.get(sessionId) == null) {
@@ -2277,6 +2302,7 @@
         }
     }
 
+    @GuardedBy("mLock")
     private List<TunedInfo> getCurrentTunedInfosInternalLocked(
             UserState userState, int callingPid, int callingUid) {
         List<TunedInfo> channelInfos = new ArrayList<>();
@@ -2375,9 +2401,9 @@
         // service.
         private final PersistentDataStore persistentDataStore;
 
-        @GuardedBy("mLock")
+        @GuardedBy("TvInputManagerService.this.mLock")
         private final Map<Integer, Integer> mAppTagMap = new HashMap<>();
-        @GuardedBy("mLock")
+        @GuardedBy("TvInputManagerService.this.mLock")
         private int mNextAppTag = 1;
 
         private UserState(Context context, int userId) {
@@ -2625,6 +2651,7 @@
             }
         }
 
+        @GuardedBy("mLock")
         private void addHardwareInputLocked(TvInputInfo inputInfo) {
             ServiceState serviceState = getServiceStateLocked(mComponent, mUserId);
             serviceState.hardwareInputMap.put(inputInfo.getId(), inputInfo);
@@ -2694,6 +2721,7 @@
             }
         }
 
+        @GuardedBy("mLock")
         private boolean addSessionTokenToClientStateLocked(ITvInputSession session) {
             try {
                 session.asBinder().linkToDeath(mSessionState, 0);
diff --git a/services/core/java/com/android/server/uri/UriGrantsManagerService.java b/services/core/java/com/android/server/uri/UriGrantsManagerService.java
index f6acc64..bbb5374 100644
--- a/services/core/java/com/android/server/uri/UriGrantsManagerService.java
+++ b/services/core/java/com/android/server/uri/UriGrantsManagerService.java
@@ -75,6 +75,8 @@
 import android.util.AtomicFile;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.GuardedBy;
@@ -657,8 +659,7 @@
         FileInputStream fis = null;
         try {
             fis = mGrantFile.openRead();
-            final XmlPullParser in = Xml.newPullParser();
-            in.setInput(fis, StandardCharsets.UTF_8.name());
+            final TypedXmlPullParser in = Xml.resolvePullParser(fis);
 
             int type;
             while ((type = in.next()) != END_DOCUMENT) {
@@ -1313,8 +1314,7 @@
         try {
             fos = mGrantFile.startWrite(startTime);
 
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(fos, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(fos);
             out.startDocument(null, true);
             out.startTag(null, TAG_URI_GRANTS);
             for (UriPermission.Snapshot perm : persist) {
diff --git a/services/core/java/com/android/server/utils/eventlog/LocalEventLog.java b/services/core/java/com/android/server/utils/eventlog/LocalEventLog.java
index c160647..12c6a7a 100644
--- a/services/core/java/com/android/server/utils/eventlog/LocalEventLog.java
+++ b/services/core/java/com/android/server/utils/eventlog/LocalEventLog.java
@@ -21,14 +21,14 @@
 
 import com.android.internal.util.Preconditions;
 
-import java.util.ConcurrentModificationException;
 import java.util.ListIterator;
 import java.util.NoSuchElementException;
+import java.util.function.Consumer;
 
 /**
  * An in-memory event log to support historical event information.
  */
-public abstract class LocalEventLog implements Iterable<String> {
+public abstract class LocalEventLog {
 
     private interface Log {
         // true if this is a filler element that should not be queried
@@ -93,7 +93,6 @@
     private final Log[] mLog;
     private int mLogSize;
     private int mLogEndIndex;
-    private int mModificationCount;
 
     // invalid if log is empty
     private long mStartRealtimeMs;
@@ -103,7 +102,6 @@
         mLog = new Log[size];
         mLogSize = 0;
         mLogEndIndex = 0;
-        mModificationCount = 0;
 
         mStartRealtimeMs = -1;
         mLastLogRealtimeMs = -1;
@@ -128,7 +126,7 @@
      * into {@link #createLogEvent(long, int, Object...)} in addition to a time delta, and should be
      * used to construct an appropriate {@link LogEvent} object.
      */
-    public void addLogEvent(int event, Object... args) {
+    public synchronized void addLogEvent(int event, Object... args) {
         long timeMs = SystemClock.elapsedRealtime();
 
         // calculate delta
@@ -175,28 +173,28 @@
         mLog[mLogEndIndex] = event;
         mLogEndIndex = incrementIndex(mLogEndIndex);
         mLastLogRealtimeMs = mLastLogRealtimeMs + event.getTimeDeltaMs();
-
-        mModificationCount++;
     }
 
     /** Clears the log of all entries. */
-    public void clear() {
+    public synchronized void clear() {
         mLogEndIndex = 0;
         mLogSize = 0;
-        mModificationCount++;
 
         mStartRealtimeMs = -1;
         mLastLogRealtimeMs = -1;
     }
 
     // checks if the log is empty (if empty, times are invalid)
-    private boolean isEmpty() {
+    private synchronized boolean isEmpty() {
         return mLogSize == 0;
     }
 
-    @Override
-    public ListIterator<String> iterator() {
-        return new LogIterator();
+    /** Iterates over the event log, passing each log string to the given consumer. */
+    public synchronized void iterate(Consumer<String> consumer) {
+        LogIterator it = new LogIterator();
+        while (it.hasNext()) {
+            consumer.accept(it.next());
+        }
     }
 
     // returns the index of the first element
@@ -222,8 +220,6 @@
 
     private class LogIterator implements ListIterator<String> {
 
-        private final int mModificationGuard;
-
         private final long mSystemTimeDeltaMs;
 
         private long mCurrentRealtimeMs;
@@ -231,7 +227,6 @@
         private int mCount;
 
         LogIterator() {
-            mModificationGuard = mModificationCount;
             mSystemTimeDeltaMs = System.currentTimeMillis() - SystemClock.elapsedRealtime();
             mCurrentRealtimeMs = mStartRealtimeMs;
             mIndex = startIndex();
@@ -251,8 +246,6 @@
         @Override
         // return then increment
         public String next() {
-            checkModifications();
-
             if (!hasNext()) {
                 throw new NoSuchElementException();
             }
@@ -276,8 +269,6 @@
         @Override
         // decrement then return
         public String previous() {
-            checkModifications();
-
             Log log;
             long currentDeltaMs;
             long realtimeMs;
@@ -303,12 +294,6 @@
             return getTimePrefix(realtimeMs + mSystemTimeDeltaMs) + log.getLogString();
         }
 
-        private void checkModifications() {
-            if (mModificationGuard != mModificationCount) {
-                throw new ConcurrentModificationException();
-            }
-        }
-
         @Override
         public int nextIndex() {
             throw new UnsupportedOperationException();
diff --git a/services/core/java/com/android/server/vibrator/VibrationSettings.java b/services/core/java/com/android/server/vibrator/VibrationSettings.java
index ad2b3354..06a1f59 100644
--- a/services/core/java/com/android/server/vibrator/VibrationSettings.java
+++ b/services/core/java/com/android/server/vibrator/VibrationSettings.java
@@ -152,8 +152,8 @@
     /**
      * Return {@code true} if the device should vibrate for ringtones.
      *
-     * <p>This checks the current {@link AudioManager#getRingerMode()} against user settings for
-     * vibrations while ringing.
+     * <p>This checks the current {@link AudioManager#getRingerModeInternal()} against user settings
+     * for vibrations while ringing.
      */
     public boolean shouldVibrateForRingtone() {
         int ringerMode = mAudioManager.getRingerModeInternal();
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 8b0963b..329589e 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -90,6 +90,8 @@
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 import android.view.Display;
 import android.view.DisplayInfo;
@@ -2910,10 +2912,9 @@
         FileOutputStream fstream = null;
         BufferedOutputStream stream = null;
         try {
-            XmlSerializer out = new FastXmlSerializer();
             fstream = new FileOutputStream(journal.chooseForWrite(), false);
             stream = new BufferedOutputStream(fstream);
-            out.setOutput(stream, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(stream);
             out.startDocument(null, true);
 
             WallpaperData wallpaper;
@@ -3110,8 +3111,7 @@
         final DisplayData wpdData = getDisplayDataOrCreate(DEFAULT_DISPLAY);
         try {
             stream = new FileInputStream(file);
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(stream, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(stream);
 
             int type;
             do {
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index d13b8d4..6f97936 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -1866,7 +1866,14 @@
             }
         }
 
-        if (mRestrictedBgActivity && (newTask || !targetTask.isUidPresent(mCallingUid))
+        // Do not allow background activity start in new task or in a task that uid is not present.
+        // Also do not allow pinned window to start single instance activity in background,
+        // as it will recreate the window and makes it to foreground.
+        boolean blockBalInTask = (newTask
+                || !targetTask.isUidPresent(mCallingUid)
+                || (LAUNCH_SINGLE_INSTANCE == mLaunchMode && targetTask.inPinnedWindowingMode()));
+
+        if (mRestrictedBgActivity && blockBalInTask
                 && handleBackgroundActivityAbort(mStartActivity)) {
             Slog.e(TAG, "Abort background activity starts from " + mCallingUid);
             return START_ABORTED;
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 2cbc514..5f14956 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -698,8 +698,8 @@
     private final class SettingObserver extends ContentObserver {
         private final Uri mFontScaleUri = Settings.System.getUriFor(FONT_SCALE);
         private final Uri mHideErrorDialogsUri = Settings.Global.getUriFor(HIDE_ERROR_DIALOGS);
-        private final Uri mForceBoldTextUri = Settings.Secure.getUriFor(
-                Settings.Secure.FORCE_BOLD_TEXT);
+        private final Uri mFontWeightAdjustmentUri = Settings.Secure.getUriFor(
+                Settings.Secure.FONT_WEIGHT_ADJUSTMENT);
 
         SettingObserver() {
             super(mH);
@@ -707,7 +707,8 @@
             resolver.registerContentObserver(mFontScaleUri, false, this, UserHandle.USER_ALL);
             resolver.registerContentObserver(mHideErrorDialogsUri, false, this,
                     UserHandle.USER_ALL);
-            resolver.registerContentObserver(mForceBoldTextUri, false, this, UserHandle.USER_ALL);
+            resolver.registerContentObserver(
+                    mFontWeightAdjustmentUri, false, this, UserHandle.USER_ALL);
         }
 
         @Override
@@ -720,8 +721,8 @@
                     synchronized (mGlobalLock) {
                         updateShouldShowDialogsLocked(getGlobalConfiguration());
                     }
-                } else if (mForceBoldTextUri.equals(uri)) {
-                    updateForceBoldTextIfNeeded(userId);
+                } else if (mFontWeightAdjustmentUri.equals(uri)) {
+                    updateFontWeightAdjustmentIfNeeded(userId);
                 }
             }
         }
@@ -5422,16 +5423,22 @@
         }
     }
 
-    private void updateForceBoldTextIfNeeded(@UserIdInt int userId) {
-        final int forceBoldTextConfig = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                Settings.Secure.FORCE_BOLD_TEXT, Configuration.FORCE_BOLD_TEXT_UNDEFINED, userId);
+    private void updateFontWeightAdjustmentIfNeeded(@UserIdInt int userId) {
+        final int fontWeightAdjustment =
+                Settings.Secure.getIntForUser(
+                        mContext.getContentResolver(),
+                        Settings.Secure.FONT_WEIGHT_ADJUSTMENT,
+                        Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED,
+                        userId);
+
         synchronized (mGlobalLock) {
-            if (getGlobalConfiguration().forceBoldText == forceBoldTextConfig) {
+            if (getGlobalConfiguration().fontWeightAdjustment == fontWeightAdjustment) {
                 return;
             }
+
             final Configuration configuration =
                     mWindowManager.computeNewConfiguration(DEFAULT_DISPLAY);
-            configuration.forceBoldText = forceBoldTextConfig;
+            configuration.fontWeightAdjustment = fontWeightAdjustment;
             updatePersistentConfiguration(configuration, userId);
         }
     }
diff --git a/services/core/java/com/android/server/wm/AppWarnings.java b/services/core/java/com/android/server/wm/AppWarnings.java
index 21b6809..d40dea2 100644
--- a/services/core/java/com/android/server/wm/AppWarnings.java
+++ b/services/core/java/com/android/server/wm/AppWarnings.java
@@ -27,6 +27,8 @@
 import android.util.AtomicFile;
 import android.util.DisplayMetrics;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.util.FastXmlSerializer;
@@ -477,8 +479,7 @@
         try {
             fos = mConfigFile.startWrite();
 
-            final XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(fos, StandardCharsets.UTF_8.name());
+            final TypedXmlSerializer out = Xml.resolveSerializer(fos);
             out.startDocument(null, true);
             out.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
             out.startTag(null, "packages");
@@ -519,8 +520,7 @@
         try {
             fis = mConfigFile.openRead();
 
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(fis, StandardCharsets.UTF_8.name());
+            final TypedXmlPullParser parser = Xml.resolvePullParser(fis);
 
             int eventType = parser.getEventType();
             while (eventType != XmlPullParser.START_TAG &&
diff --git a/services/core/java/com/android/server/wm/CompatModePackages.java b/services/core/java/com/android/server/wm/CompatModePackages.java
index 7e55f0a..120cf7d 100644
--- a/services/core/java/com/android/server/wm/CompatModePackages.java
+++ b/services/core/java/com/android/server/wm/CompatModePackages.java
@@ -35,6 +35,8 @@
 import android.util.AtomicFile;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.protolog.common.ProtoLog;
@@ -93,8 +95,7 @@
         FileInputStream fis = null;
         try {
             fis = mFile.openRead();
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(fis, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(fis);
             int eventType = parser.getEventType();
             while (eventType != XmlPullParser.START_TAG &&
                     eventType != XmlPullParser.END_DOCUMENT) {
@@ -362,8 +363,7 @@
 
         try {
             fos = mFile.startWrite();
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(fos, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(fos);
             out.startDocument(null, true);
             out.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
             out.startTag(null, "compat-packages");
diff --git a/services/core/java/com/android/server/wm/DisplayAreaPolicy.java b/services/core/java/com/android/server/wm/DisplayAreaPolicy.java
index be18d0a..76a5cda 100644
--- a/services/core/java/com/android/server/wm/DisplayAreaPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayAreaPolicy.java
@@ -22,8 +22,11 @@
 import static android.view.WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
 import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
+import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
+import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
 import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER;
 import static android.window.DisplayAreaOrganizer.FEATURE_FULLSCREEN_MAGNIFICATION;
+import static android.window.DisplayAreaOrganizer.FEATURE_HIDE_DISPLAY_CUTOUT;
 import static android.window.DisplayAreaOrganizer.FEATURE_ONE_HANDED;
 import static android.window.DisplayAreaOrganizer.FEATURE_WINDOWED_MAGNIFICATION;
 
@@ -99,6 +102,12 @@
                             // layer
                             .setNewDisplayAreaSupplier(DisplayArea.Dimmable::new)
                             .build())
+                    .addFeature(new Feature.Builder(wmService.mPolicy, "HideDisplayCutout",
+                            FEATURE_HIDE_DISPLAY_CUTOUT)
+                            .all()
+                            .except(TYPE_NAVIGATION_BAR, TYPE_NAVIGATION_BAR_PANEL, TYPE_STATUS_BAR,
+                                    TYPE_NOTIFICATION_SHADE)
+                            .build())
                     .addFeature(new Feature.Builder(wmService.mPolicy, "OneHanded",
                             FEATURE_ONE_HANDED)
                             .all()
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 9011ba0..61cc430 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -2969,10 +2969,6 @@
 
         mDisplayContent.getInsetsPolicy().updateBarControlTarget(win);
 
-        final int fullscreenAppearance = updateLightStatusBarLw(0 /* appearance */,
-                mTopFullscreenOpaqueWindowState, mTopFullscreenOpaqueOrDimmingWindowState);
-        final int dockedAppearance = updateLightStatusBarLw(0 /* appearance */,
-                mTopDockedOpaqueWindowState, mTopDockedOpaqueOrDimmingWindowState);
         final boolean inSplitScreen =
                 mService.mRoot.getDefaultTaskDisplayArea().isSplitScreenModeActivated();
         if (inSplitScreen) {
@@ -2984,6 +2980,12 @@
         mService.getStackBounds(inSplitScreen ? WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
                         : WINDOWING_MODE_FULLSCREEN,
                 ACTIVITY_TYPE_UNDEFINED, mNonDockedStackBounds);
+        final int fullscreenAppearance = updateLightStatusBarLw(0 /* appearance */,
+                mTopFullscreenOpaqueWindowState, mTopFullscreenOpaqueOrDimmingWindowState,
+                mNonDockedStackBounds);
+        final int dockedAppearance = updateLightStatusBarLw(0 /* appearance */,
+                mTopDockedOpaqueWindowState, mTopDockedOpaqueOrDimmingWindowState,
+                mDockedStackBounds);
         final int disableFlags = win.getSystemUiVisibility() & StatusBarManager.DISABLE_MASK;
         final int opaqueAppearance = updateSystemBarsLw(win, disableFlags);
         final WindowState navColorWin = chooseNavigationColorWindowLw(
@@ -3049,10 +3051,14 @@
     }
 
     private int updateLightStatusBarLw(@Appearance int appearance, WindowState opaque,
-            WindowState opaqueOrDimming) {
+            WindowState opaqueOrDimming, Rect stackBounds) {
+        final DisplayRotation displayRotation = mDisplayContent.getDisplayRotation();
+        final int statusBarHeight = mStatusBarHeightForRotation[displayRotation.getRotation()];
+        final boolean stackBoundsContainStatusBar =
+                stackBounds.isEmpty() ? false : stackBounds.top < statusBarHeight;
         final boolean onKeyguard = isKeyguardShowing() && !isKeyguardOccluded();
         final WindowState statusColorWin = onKeyguard ? mNotificationShade : opaqueOrDimming;
-        if (statusColorWin != null) {
+        if (stackBoundsContainStatusBar && statusColorWin != null) {
             if (statusColorWin == opaque || onKeyguard) {
                 // If the top fullscreen-or-dimming window is also the top fullscreen, respect
                 // its light flag.
diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettingsProvider.java b/services/core/java/com/android/server/wm/DisplayWindowSettingsProvider.java
index a7f7c48..83da136e 100644
--- a/services/core/java/com/android/server/wm/DisplayWindowSettingsProvider.java
+++ b/services/core/java/com/android/server/wm/DisplayWindowSettingsProvider.java
@@ -28,6 +28,8 @@
 import android.os.Environment;
 import android.util.AtomicFile;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 import android.view.DisplayAddress;
 import android.view.DisplayInfo;
@@ -280,8 +282,7 @@
         FileData fileData = new FileData();
         boolean success = false;
         try {
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(stream, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(stream);
             int type;
             while ((type = parser.next()) != XmlPullParser.START_TAG
                     && type != XmlPullParser.END_DOCUMENT) {
@@ -419,8 +420,7 @@
 
         boolean success = false;
         try {
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(stream, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(stream);
             out.startDocument(null, true);
 
             out.startTag(null, "display-settings");
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index a2b9cf9..73641f4 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -287,7 +287,8 @@
         if (mShowingTransientTypes.indexOf(ITYPE_STATUS_BAR) != -1) {
             return mDummyControlTarget;
         }
-        if (focusedWin == mPolicy.getNotificationShade()) {
+        final WindowState notificationShade = mPolicy.getNotificationShade();
+        if (focusedWin == notificationShade) {
             // Notification shade has control anyways, no reason to force anything.
             return focusedWin;
         }
@@ -308,9 +309,10 @@
             // fake control to the client, so that it can re-show the bar during this scenario.
             return mDummyControlTarget;
         }
-        if (!canBeTopFullscreenOpaqueWindow(focusedWin) && mPolicy.topAppHidesStatusBar()) {
+        if (!canBeTopFullscreenOpaqueWindow(focusedWin) && mPolicy.topAppHidesStatusBar()
+                && (notificationShade == null || !notificationShade.canReceiveKeys())) {
             // Non-fullscreen focused window should not break the state that the top-fullscreen-app
-            // window hides status bar.
+            // window hides status bar, unless the notification shade can receive keys.
             return mPolicy.getTopFullscreenOpaqueWindow();
         }
         return focusedWin;
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index ac9c289..90c3f9e 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -5888,7 +5888,21 @@
         try {
             // Protect against recursion.
             mInResumeTopActivity = true;
-            result = resumeTopActivityInnerLocked(prev, options);
+
+            // TODO(b/172885410): Allow the top activities of all visible leaf tasks to be resumed
+            if (mCreatedByOrganizer && !isLeafTask()
+                    && getConfiguration().windowConfiguration.getWindowingMode()
+                            == WINDOWING_MODE_FULLSCREEN) {
+                for (int i = mChildren.size() - 1; i >= 0; i--) {
+                    final Task child = (Task) getChildAt(i);
+                    if (!child.shouldBeVisible(null /* starting */)) {
+                        break;
+                    }
+                    result |= child.resumeTopActivityUncheckedLocked(prev, options);
+                }
+            } else {
+                result = resumeTopActivityInnerLocked(prev, options);
+            }
 
             // When resuming the top activity, it may be necessary to pause the top activity (for
             // example, returning to the lock screen. We suppress the normal pause logic in
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index f11cd93..499fbf6 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -434,8 +434,7 @@
 
         if (hop.isReparent()) {
             final boolean isNonOrganizedRootableTask =
-                    (task.isRootTask() && !task.mCreatedByOrganizer)
-                            || task.getParent().asTask().mCreatedByOrganizer;
+                    task.isRootTask() || task.getParent().asTask().mCreatedByOrganizer;
             if (isNonOrganizedRootableTask) {
                 WindowContainer newParent = hop.getNewParent() == null
                         ? dc.getDefaultTaskDisplayArea()
diff --git a/services/core/jni/com_android_server_net_NetworkStatsService.cpp b/services/core/jni/com_android_server_net_NetworkStatsService.cpp
index 0275f3e..10b248a 100644
--- a/services/core/jni/com_android_server_net_NetworkStatsService.cpp
+++ b/services/core/jni/com_android_server_net_NetworkStatsService.cpp
@@ -215,21 +215,6 @@
 };
 
 int register_android_server_net_NetworkStatsService(JNIEnv* env) {
-    jclass netStatsService = env->FindClass("com/android/server/net/NetworkStatsService");
-    jfieldID rxBytesId = env->GetStaticFieldID(netStatsService, "TYPE_RX_BYTES", "I");
-    jfieldID rxPacketsId = env->GetStaticFieldID(netStatsService, "TYPE_RX_PACKETS", "I");
-    jfieldID txBytesId = env->GetStaticFieldID(netStatsService, "TYPE_TX_BYTES", "I");
-    jfieldID txPacketsId = env->GetStaticFieldID(netStatsService, "TYPE_TX_PACKETS", "I");
-    jfieldID tcpRxPacketsId = env->GetStaticFieldID(netStatsService, "TYPE_TCP_RX_PACKETS", "I");
-    jfieldID tcpTxPacketsId = env->GetStaticFieldID(netStatsService, "TYPE_TCP_TX_PACKETS", "I");
-
-    env->SetStaticIntField(netStatsService, rxBytesId, RX_BYTES);
-    env->SetStaticIntField(netStatsService, rxPacketsId, RX_PACKETS);
-    env->SetStaticIntField(netStatsService, txBytesId, TX_BYTES);
-    env->SetStaticIntField(netStatsService, txPacketsId, TX_PACKETS);
-    env->SetStaticIntField(netStatsService, tcpRxPacketsId, TCP_RX_PACKETS);
-    env->SetStaticIntField(netStatsService, tcpTxPacketsId, TCP_TX_PACKETS);
-
     return jniRegisterNativeMethods(env, "com/android/server/net/NetworkStatsService", gMethods,
                                     NELEM(gMethods));
 }
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java b/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java
index 412f582..d29534e 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java
@@ -16,6 +16,7 @@
 
 package com.android.server.devicepolicy;
 
+import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;
 import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
 
 import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
@@ -130,6 +131,7 @@
     private static final String TAG_ALWAYS_ON_VPN_PACKAGE = "vpn-package";
     private static final String TAG_ALWAYS_ON_VPN_LOCKDOWN = "vpn-lockdown";
     private static final String TAG_COMMON_CRITERIA_MODE = "common-criteria-mode";
+    private static final String TAG_PASSWORD_COMPLEXITY = "password-complexity";
     private static final String ATTR_VALUE = "value";
     private static final String ATTR_LAST_NETWORK_LOGGING_NOTIFICATION = "last-notification";
     private static final String ATTR_NUM_NETWORK_LOGGING_NOTIFICATIONS = "num-notifications";
@@ -142,6 +144,9 @@
     @NonNull
     PasswordPolicy mPasswordPolicy = new PasswordPolicy();
 
+    @DevicePolicyManager.PasswordComplexity
+    int mPasswordComplexity = PASSWORD_COMPLEXITY_NONE;
+
     @Nullable
     FactoryResetProtectionPolicy mFactoryResetProtectionPolicy = null;
 
@@ -518,6 +523,10 @@
         if (mCommonCriteriaMode) {
             writeAttributeValueToXml(out, TAG_COMMON_CRITERIA_MODE, mCommonCriteriaMode);
         }
+
+        if (mPasswordComplexity != PASSWORD_COMPLEXITY_NONE) {
+            writeAttributeValueToXml(out, TAG_PASSWORD_COMPLEXITY, mPasswordComplexity);
+        }
     }
 
     void writeTextToXml(XmlSerializer out, String tag, String text) throws IOException {
@@ -777,6 +786,8 @@
             } else if (TAG_COMMON_CRITERIA_MODE.equals(tag)) {
                 mCommonCriteriaMode = Boolean.parseBoolean(
                         parser.getAttributeValue(null, ATTR_VALUE));
+            } else if (TAG_PASSWORD_COMPLEXITY.equals(tag)) {
+                mPasswordComplexity = Integer.parseInt(parser.getAttributeValue(null, ATTR_VALUE));
             } else {
                 Slog.w(DevicePolicyManagerService.LOG_TAG, "Unknown admin tag: " + tag);
                 XmlUtils.skipCurrentTag(parser);
@@ -1112,5 +1123,8 @@
 
         pw.print("mCommonCriteriaMode=");
         pw.println(mCommonCriteriaMode);
+
+        pw.print("mPasswordComplexity=");
+        pw.println(mPasswordComplexity);
     }
 }
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
index eff222a..ce61d50 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
@@ -15,8 +15,10 @@
  */
 package com.android.server.devicepolicy;
 
+import android.app.admin.DevicePolicySafetyChecker;
 import android.app.admin.IDevicePolicyManager;
 import android.content.ComponentName;
+import android.util.Slog;
 
 import com.android.server.SystemService;
 
@@ -30,6 +32,9 @@
  * should be added here to avoid build breakage in downstream branches.
  */
 abstract class BaseIDevicePolicyManager extends IDevicePolicyManager.Stub {
+
+    private static final String TAG = BaseIDevicePolicyManager.class.getSimpleName();
+
     /**
      * To be called by {@link DevicePolicyManagerService#Lifecycle} during the various boot phases.
      *
@@ -55,6 +60,16 @@
      */
     abstract void handleStopUser(int userId);
 
+    /**
+     * Sets the {@link DevicePolicySafetyChecker}.
+     *
+     * <p>Currently, it's called only by {@code SystemServer} on
+     * {@link android.content.pm.PackageManager#FEATURE_AUTOMOTIVE automotive builds}
+     */
+    public void setDevicePolicySafetyChecker(DevicePolicySafetyChecker safetyChecker) {
+        Slog.w(TAG, "setDevicePolicySafetyChecker() not implemented by " + getClass());
+    }
+
     public void clearSystemUpdatePolicyFreezePeriodRecord() {
     }
 
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyData.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyData.java
index 130cfd5..bdb7f79 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyData.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyData.java
@@ -25,6 +25,8 @@
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.util.FastXmlSerializer;
@@ -154,8 +156,7 @@
         FileOutputStream stream = null;
         try {
             stream = new FileOutputStream(file.chooseForWrite(), false);
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(stream, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(stream);
             out.startDocument(null, true);
 
             out.startTag(null, "policies");
@@ -372,8 +373,7 @@
         boolean needsRewrite = false;
         try {
             stream = new FileInputStream(file);
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(stream, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(stream);
 
             int type;
             while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 2190392..e8861c4 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -60,6 +60,9 @@
 import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS;
 import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
 import static android.app.admin.DevicePolicyManager.NON_ORG_OWNED_PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
+import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_HIGH;
+import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_LOW;
+import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_MEDIUM;
 import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;
 import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC;
 import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC;
@@ -135,9 +138,11 @@
 import android.app.admin.DevicePolicyCache;
 import android.app.admin.DevicePolicyEventLogger;
 import android.app.admin.DevicePolicyManager;
+import android.app.admin.DevicePolicyManager.DevicePolicyOperation;
 import android.app.admin.DevicePolicyManager.PasswordComplexity;
 import android.app.admin.DevicePolicyManager.PersonalAppsSuspensionReason;
 import android.app.admin.DevicePolicyManagerInternal;
+import android.app.admin.DevicePolicySafetyChecker;
 import android.app.admin.DeviceStateCache;
 import android.app.admin.FactoryResetProtectionPolicy;
 import android.app.admin.NetworkEvent;
@@ -148,6 +153,7 @@
 import android.app.admin.StartInstallingUpdateCallback;
 import android.app.admin.SystemUpdateInfo;
 import android.app.admin.SystemUpdatePolicy;
+import android.app.admin.UnsafeStateException;
 import android.app.backup.IBackupManager;
 import android.app.trust.TrustManager;
 import android.app.usage.UsageStatsManagerInternal;
@@ -249,6 +255,8 @@
 import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 import android.view.IWindowManager;
 import android.view.accessibility.AccessibilityManager;
@@ -267,7 +275,6 @@
 import com.android.internal.telephony.SmsApplication;
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.DumpUtils;
-import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.FunctionalUtils.ThrowingRunnable;
 import com.android.internal.util.FunctionalUtils.ThrowingSupplier;
 import com.android.internal.util.JournaledFile;
@@ -295,9 +302,7 @@
 
 import com.google.android.collect.Sets;
 
-import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
 
 import java.io.File;
 import java.io.FileDescriptor;
@@ -306,7 +311,6 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.lang.reflect.Constructor;
-import java.nio.charset.StandardCharsets;
 import java.text.DateFormat;
 import java.time.LocalDate;
 import java.util.ArrayList;
@@ -634,6 +638,9 @@
     @VisibleForTesting
     final TransferOwnershipMetadataManager mTransferOwnershipMetadataManager;
 
+    @Nullable
+    private DevicePolicySafetyChecker mSafetyChecker;
+
     public static final class Lifecycle extends SystemService {
         private BaseIDevicePolicyManager mService;
 
@@ -645,8 +652,8 @@
                 dpmsClassName = DevicePolicyManagerService.class.getName();
             }
             try {
-                Class serviceClass = Class.forName(dpmsClassName);
-                Constructor constructor = serviceClass.getConstructor(Context.class);
+                Class<?> serviceClass = Class.forName(dpmsClassName);
+                Constructor<?> constructor = serviceClass.getConstructor(Context.class);
                 mService = (BaseIDevicePolicyManager) constructor.newInstance(context);
             } catch (Exception e) {
                 throw new IllegalStateException(
@@ -655,6 +662,11 @@
             }
         }
 
+        /** Sets the {@link DevicePolicySafetyChecker}. */
+        public void setDevicePolicySafetyChecker(DevicePolicySafetyChecker safetyChecker) {
+            mService.setDevicePolicySafetyChecker(safetyChecker);
+        }
+
         @Override
         public void onStart() {
             publishBinderService(Context.DEVICE_POLICY_SERVICE, mService);
@@ -953,6 +965,38 @@
         }
     }
 
+    @Override
+    public void setDevicePolicySafetyChecker(DevicePolicySafetyChecker safetyChecker) {
+        Slog.i(LOG_TAG, "Setting DevicePolicySafetyChecker as " + safetyChecker.getClass());
+        mSafetyChecker = safetyChecker;
+    }
+
+    /**
+     * Checks if the feature is supported and it's safe to execute the given {@code operation}.
+     *
+     * <p>Typically called at the beginning of each API method as:
+     *
+     * <pre><code>
+     *
+     * if (!canExecute(operation, permission)) return;
+     *
+     * </code></pre>
+     *
+     * @return {@code true} when it's safe to execute, {@code false} when the feature is not
+     * supported or the caller does not have the given {@code requiredPermission}.
+     *
+     * @throws UnsafeStateException if it's not safe to execute the operation.
+     */
+    boolean canExecute(@DevicePolicyOperation int operation, @NonNull String requiredPermission) {
+        if (!mHasFeature && !hasCallingPermission(requiredPermission)) {
+            return false;
+        }
+        if (mSafetyChecker == null || mSafetyChecker.isDevicePolicyOperationSafe(operation)) {
+            return true;
+        }
+        throw mSafetyChecker.newUnsafeStateException(operation);
+    }
+
     /**
      * Unit test will subclass it to inject mocks.
      */
@@ -1228,10 +1272,15 @@
             SystemProperties.set(key, value);
         }
 
+        // TODO (b/137101239): clean up split system user codes
         boolean userManagerIsSplitSystemUser() {
             return UserManager.isSplitSystemUser();
         }
 
+        boolean userManagerIsHeadlessSystemUserMode() {
+            return UserManager.isHeadlessSystemUserMode();
+        }
+
         String getDevicePolicyFilePathForSystemUser() {
             return "/data/system/";
         }
@@ -2932,8 +2981,7 @@
         synchronized (getLockObject()) {
             final long now = System.currentTimeMillis();
 
-            List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
-                    userHandle, /* parent */ false);
+            List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(userHandle);
             final int N = admins.size();
             for (int i = 0; i < N; i++) {
                 ActiveAdmin admin = admins.get(i);
@@ -3385,6 +3433,7 @@
                 final PasswordPolicy passwordPolicy = ap.mPasswordPolicy;
                 if (passwordPolicy.quality != quality) {
                     passwordPolicy.quality = quality;
+                    ap.mPasswordComplexity = PASSWORD_COMPLEXITY_NONE;
                     resetInactivePasswordRequirementsIfRPlus(userId, ap);
                     updatePasswordValidityCheckpointLocked(userId, parent);
                     updatePasswordQualityCacheForUserGroup(userId);
@@ -3448,8 +3497,9 @@
         PasswordMetrics metrics = mLockSettingsInternal.getUserPasswordMetrics(credentialOwner);
         // Update the checkpoint only if the user's password metrics is known
         if (metrics != null) {
+            final int userToCheck = getProfileParentUserIfRequested(userHandle, parent);
             final boolean newCheckpoint = isPasswordSufficientForUserWithoutCheckpointLocked(
-                    metrics, userHandle, parent);
+                    metrics, userToCheck);
             if (newCheckpoint != policy.mPasswordValidAtLastCheckpoint) {
                 policy.mPasswordValidAtLastCheckpoint = newCheckpoint;
                 affectedUserIds.add(credentialOwner);
@@ -3503,8 +3553,8 @@
             }
 
             // Return the strictest policy across all participating admins.
-            List<ActiveAdmin> admins =
-                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
+            List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
+                    getProfileParentUserIfRequested(userHandle, parent));
             final int N = admins.size();
             for (int i = 0; i < N; i++) {
                 ActiveAdmin admin = admins.get(i);
@@ -3516,16 +3566,13 @@
         }
     }
 
-    private List<ActiveAdmin> getActiveAdminsForLockscreenPoliciesLocked(
-            int userHandle, boolean parent) {
-        if (!parent && isSeparateProfileChallengeEnabled(userHandle)) {
+    private List<ActiveAdmin> getActiveAdminsForLockscreenPoliciesLocked(int userHandle) {
+        if (isSeparateProfileChallengeEnabled(userHandle)) {
             // If this user has a separate challenge, only return its restrictions.
             return getUserDataUnchecked(userHandle).mAdminList;
         }
-        // Either parent == true, or isSeparateProfileChallengeEnabled == false
-        // If parent is true, query the parent user of userHandle by definition,
-        // If isSeparateProfileChallengeEnabled is false, userHandle points to a managed profile
-        // with unified challenge so also need to query the parent user who owns the credential.
+        // If isSeparateProfileChallengeEnabled is false and userHandle points to a managed profile
+        // we need to query the parent user who owns the credential.
         return getActiveAdminsForUserAndItsManagedProfilesLocked(getProfileParentId(userHandle),
                 (user) -> !mLockPatternUtils.isSeparateProfileChallengeEnabled(user.id));
     }
@@ -3616,6 +3663,10 @@
     private void ensureMinimumQuality(
             int userId, ActiveAdmin admin, int minimumQuality, String operation) {
         mInjector.binderWithCleanCallingIdentity(() -> {
+            // This check will also take care of the case where the password requirements
+            // are specified as complexity rather than quality: When a password complexity
+            // is set, the quality is reset to "unspecified" which will be below any value
+            // of minimumQuality.
             if (admin.mPasswordPolicy.quality < minimumQuality
                     && passwordQualityInvocationOrderCheckEnabled(admin.info.getPackageName(),
                     userId)) {
@@ -3719,8 +3770,8 @@
             }
 
             // Return the strictest policy across all participating admins.
-            List<ActiveAdmin> admins =
-                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
+            List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
+                    getProfileParentUserIfRequested(userHandle, parent));
             final int N = admins.size();
             for (int i = 0; i < N; i++) {
                 ActiveAdmin admin = admins.get(i);
@@ -3837,7 +3888,8 @@
         }
 
         // Return the strictest policy across all participating admins.
-        List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
+        List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
+                getProfileParentUserIfRequested(userHandle, parent));
         final int N = admins.size();
         for (int i = 0; i < N; i++) {
             ActiveAdmin admin = admins.get(i);
@@ -4076,8 +4128,8 @@
             }
 
             int maxValue = 0;
-            final List<ActiveAdmin> admins =
-                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
+            final List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
+                    getProfileParentUserIfRequested(userHandle, parent));
             final int N = admins.size();
             for (int i = 0; i < N; i++) {
                 final ActiveAdmin admin = admins.get(i);
@@ -4098,25 +4150,16 @@
      */
     @Override
     public PasswordMetrics getPasswordMinimumMetrics(@UserIdInt int userHandle) {
-        return getPasswordMinimumMetrics(userHandle, false /* parent */);
-    }
-
-    /**
-     * Calculates strictest (maximum) value for a given password property enforced by admin[s].
-     */
-    private PasswordMetrics getPasswordMinimumMetrics(@UserIdInt int userHandle, boolean parent) {
+        final CallerIdentity caller = getCallerIdentity();
+        Preconditions.checkCallAuthorization(hasFullCrossUsersPermission(caller, userHandle));
         if (!mHasFeature) {
             new PasswordMetrics(CREDENTIAL_TYPE_NONE);
         }
         Preconditions.checkArgumentNonnegative(userHandle, "Invalid userId");
 
-        final CallerIdentity caller = getCallerIdentity();
-        Preconditions.checkCallAuthorization(hasFullCrossUsersPermission(caller, userHandle));
-
         ArrayList<PasswordMetrics> adminMetrics = new ArrayList<>();
         synchronized (getLockObject()) {
-            List<ActiveAdmin> admins =
-                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
+            List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(userHandle);
             for (ActiveAdmin admin : admins) {
                 adminMetrics.add(admin.mPasswordPolicy.getMinMetrics());
             }
@@ -4142,8 +4185,9 @@
             int credentialOwner = getCredentialOwner(userHandle, parent);
             DevicePolicyData policy = getUserDataUnchecked(credentialOwner);
             PasswordMetrics metrics = mLockSettingsInternal.getUserPasswordMetrics(credentialOwner);
+            final int userToCheck = getProfileParentUserIfRequested(userHandle, parent);
             boolean activePasswordSufficientForUserLocked = isActivePasswordSufficientForUserLocked(
-                    policy.mPasswordValidAtLastCheckpoint, metrics, userHandle, parent);
+                    policy.mPasswordValidAtLastCheckpoint, metrics, userToCheck);
             return activePasswordSufficientForUserLocked;
         }
     }
@@ -4182,7 +4226,7 @@
             DevicePolicyData policy = getUserDataUnchecked(credentialOwner);
             PasswordMetrics metrics = mLockSettingsInternal.getUserPasswordMetrics(credentialOwner);
             return isActivePasswordSufficientForUserLocked(
-                    policy.mPasswordValidAtLastCheckpoint, metrics, targetUser, false);
+                    policy.mPasswordValidAtLastCheckpoint, metrics, targetUser);
         }
     }
 
@@ -4212,6 +4256,8 @@
             for (ActiveAdmin admin : admins) {
                 adminMetrics.add(admin.mPasswordPolicy.getMinMetrics());
             }
+            //TODO: Take complexity into account, would need to take complexity from all admins
+            //in the admins list.
             return PasswordMetrics.validatePasswordMetrics(PasswordMetrics.merge(adminMetrics),
                     PASSWORD_COMPLEXITY_NONE, false, metrics).isEmpty();
         }
@@ -4219,7 +4265,7 @@
 
     private boolean isActivePasswordSufficientForUserLocked(
             boolean passwordValidAtLastCheckpoint, @Nullable PasswordMetrics metrics,
-            int userHandle, boolean parent) {
+            int userHandle) {
         if (!mInjector.storageManagerIsFileBasedEncryptionEnabled() && (metrics == null)) {
             // Before user enters their password for the first time after a reboot, return the
             // value of this flag, which tells us whether the password was valid the last time
@@ -4236,41 +4282,44 @@
             throw new IllegalStateException("isActivePasswordSufficient called on FBE-locked user");
         }
 
-        return isPasswordSufficientForUserWithoutCheckpointLocked(metrics, userHandle, parent);
+        return isPasswordSufficientForUserWithoutCheckpointLocked(metrics, userHandle);
     }
 
     /**
      * Returns {@code true} if the password represented by the {@code metrics} argument
      * sufficiently fulfills the password requirements for the user corresponding to
-     * {@code userId} (or its parent, if {@code parent} is set to {@code true}).
+     * {@code userId}.
      */
     private boolean isPasswordSufficientForUserWithoutCheckpointLocked(
-            @NonNull PasswordMetrics metrics, @UserIdInt int userId, boolean parent) {
-        PasswordMetrics minMetrics = getPasswordMinimumMetrics(userId, parent);
+            @NonNull PasswordMetrics metrics, @UserIdInt int userId) {
+        final int complexity = getEffectivePasswordComplexityRequirementLocked(userId);
+        PasswordMetrics minMetrics = getPasswordMinimumMetrics(userId);
         final List<PasswordValidationError> passwordValidationErrors =
                 PasswordMetrics.validatePasswordMetrics(
-                        minMetrics, PASSWORD_COMPLEXITY_NONE, false, metrics);
+                        minMetrics, complexity, false, metrics);
         return passwordValidationErrors.isEmpty();
     }
 
     @Override
     @PasswordComplexity
     public int getPasswordComplexity(boolean parent) {
+        final CallerIdentity caller = getNonPrivilegedOrAdminCallerIdentity(null);
         DevicePolicyEventLogger
                 .createEvent(DevicePolicyEnums.GET_USER_PASSWORD_COMPLEXITY_LEVEL)
                 .setStrings(parent ? CALLED_FROM_PARENT : NOT_CALLED_FROM_PARENT,
                         mInjector.getPackageManager().getPackagesForUid(
                                 mInjector.binderGetCallingUid()))
                 .write();
-        final CallerIdentity caller = getCallerIdentity();
 
         Preconditions.checkCallAuthorization(!parent || (isDeviceOwner(caller)
                         || isProfileOwner(caller) || isSystemUid(caller)),
                 "Only profile owner, device owner and system may call this method.");
         enforceUserUnlocked(caller.getUserId());
-        mContext.enforceCallingOrSelfPermission(
-                REQUEST_PASSWORD_COMPLEXITY,
-                "Must have " + REQUEST_PASSWORD_COMPLEXITY + " permission.");
+        Preconditions.checkCallAuthorization(
+                hasCallingOrSelfPermission(REQUEST_PASSWORD_COMPLEXITY)
+                        || isDeviceOwner(caller) || isProfileOwner(caller),
+                "Must have " + REQUEST_PASSWORD_COMPLEXITY
+                        + " permission, or be a profile owner or device owner.");
 
         synchronized (getLockObject()) {
             final int credentialOwner = getCredentialOwner(caller.getUserId(), parent);
@@ -4280,6 +4329,73 @@
     }
 
     @Override
+    public void setRequiredPasswordComplexity(int passwordComplexity, boolean calledOnParent) {
+        if (!mHasFeature) {
+            return;
+        }
+        final Set<Integer> allowedModes = Set.of(PASSWORD_COMPLEXITY_NONE, PASSWORD_COMPLEXITY_LOW,
+                PASSWORD_COMPLEXITY_MEDIUM, PASSWORD_COMPLEXITY_HIGH);
+        Preconditions.checkArgument(allowedModes.contains(passwordComplexity),
+                "Provided complexity is not one of the allowed values.");
+
+        final CallerIdentity caller = getAdminCallerIdentity(null);
+        Preconditions.checkCallAuthorization(isDeviceOwner(caller) || isProfileOwner(caller));
+        Preconditions.checkArgument(!calledOnParent || isProfileOwner(caller));
+
+        synchronized (getLockObject()) {
+            final ActiveAdmin admin = getParentOfAdminIfRequired(
+                    getProfileOwnerOrDeviceOwnerLocked(caller), calledOnParent);
+            if (admin.mPasswordComplexity != passwordComplexity) {
+                mInjector.binderWithCleanCallingIdentity(() -> {
+                    admin.mPasswordComplexity = passwordComplexity;
+                    // Reset the password policy.
+                    admin.mPasswordPolicy = new PasswordPolicy();
+                    updatePasswordValidityCheckpointLocked(caller.getUserId(), calledOnParent);
+                    updatePasswordQualityCacheForUserGroup(caller.getUserId());
+                    saveSettingsLocked(caller.getUserId());
+                    //TODO: Log password complexity change if security logging is enabled.
+                });
+            }
+        }
+        //TODO: Log metrics.
+    }
+
+    private int getEffectivePasswordComplexityRequirementLocked(@UserIdInt int userHandle) {
+        ensureLocked();
+        List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(userHandle);
+        int maxRequiredComplexity = PASSWORD_COMPLEXITY_NONE;
+        for (ActiveAdmin admin : admins) {
+            final ComponentName adminComponent = admin.info.getComponent();
+            final int adminUser = admin.getUserHandle().getIdentifier();
+            // Password complexity is only taken into account from DO/PO
+            if (isDeviceOwner(adminComponent, adminUser)
+                    || isProfileOwner(adminComponent, adminUser)) {
+                maxRequiredComplexity = Math.max(maxRequiredComplexity, admin.mPasswordComplexity);
+            }
+        }
+        return maxRequiredComplexity;
+    }
+
+    @Override
+    public int getRequiredPasswordComplexity(boolean calledOnParent) {
+        if (!mHasFeature) {
+            return PASSWORD_COMPLEXITY_NONE;
+        }
+
+        final CallerIdentity caller = getAdminCallerIdentity(null);
+        Preconditions.checkCallAuthorization(
+                isDeviceOwner(caller) || isProfileOwner(caller));
+
+        Preconditions.checkArgument(!calledOnParent || hasProfileOwner(caller.getUserId()));
+
+        synchronized (getLockObject()) {
+            final ActiveAdmin requiredAdmin = getParentOfAdminIfRequired(
+                    getDeviceOrProfileOwnerAdminLocked(caller.getUserId()), calledOnParent);
+            return requiredAdmin.mPasswordComplexity;
+        }
+    }
+
+    @Override
     public int getCurrentFailedPasswordAttempts(int userHandle, boolean parent) {
         if (!mLockPatternUtils.hasSecureLockScreen()) {
             return 0;
@@ -4382,7 +4498,8 @@
         ActiveAdmin strictestAdmin = null;
 
         // Return the strictest policy across all participating admins.
-        List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
+        List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
+                getProfileParentUserIfRequested(userHandle, parent));
         final int N = admins.size();
         for (int i = 0; i < N; i++) {
             ActiveAdmin admin = admins.get(i);
@@ -4468,15 +4585,16 @@
         synchronized (getLockObject()) {
             final PasswordMetrics minMetrics = getPasswordMinimumMetrics(userHandle);
             final List<PasswordValidationError> validationErrors;
+            final int complexity = getEffectivePasswordComplexityRequirementLocked(userHandle);
             // TODO: Consider changing validation API to take LockscreenCredential.
             if (password.isEmpty()) {
                 validationErrors = PasswordMetrics.validatePasswordMetrics(
-                        minMetrics, PASSWORD_COMPLEXITY_NONE, false /* isPin */,
+                        minMetrics, complexity, false /* isPin */,
                         new PasswordMetrics(CREDENTIAL_TYPE_NONE));
             } else {
                 // TODO(b/120484642): remove getBytes() below
                 validationErrors = PasswordMetrics.validatePassword(
-                        minMetrics, PASSWORD_COMPLEXITY_NONE, false, password.getBytes());
+                        minMetrics, complexity, false, password.getBytes());
             }
 
             if (!validationErrors.isEmpty()) {
@@ -4591,7 +4709,7 @@
             // Update the device timeout
             final int parentId = getProfileParentId(userId);
             final long timeMs = getMaximumTimeToLockPolicyFromAdmins(
-                    getActiveAdminsForLockscreenPoliciesLocked(parentId, false));
+                    getActiveAdminsForLockscreenPoliciesLocked(parentId));
 
             final DevicePolicyData policy = getUserDataUnchecked(parentId);
             if (policy.mLastMaximumTimeToLock == timeMs) {
@@ -4613,7 +4731,7 @@
         final long timeMs;
         if (isSeparateProfileChallengeEnabled(userId)) {
             timeMs = getMaximumTimeToLockPolicyFromAdmins(
-                    getActiveAdminsForLockscreenPoliciesLocked(userId, false /* parent */));
+                    getActiveAdminsForLockscreenPoliciesLocked(userId));
         } else {
             timeMs = Long.MAX_VALUE;
         }
@@ -4646,7 +4764,7 @@
             }
             // Return the strictest policy across all participating admins.
             final List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
-                    userHandle, parent);
+                    getProfileParentUserIfRequested(userHandle, parent));
             final long timeMs = getMaximumTimeToLockPolicyFromAdmins(admins);
             return timeMs == Long.MAX_VALUE ? 0 : timeMs;
         }
@@ -4730,7 +4848,8 @@
             }
 
             // Return the strictest policy across all participating admins.
-            List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(userId, parent);
+            List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
+                    getProfileParentUserIfRequested(userId, parent));
 
             long strongAuthUnlockTimeout = DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS;
             for (int i = 0; i < admins.size(); i++) {
@@ -4756,9 +4875,10 @@
 
     @Override
     public void lockNow(int flags, boolean parent) {
-        if (!mHasFeature && !hasCallingPermission(permission.LOCK_DEVICE)) {
+        if (!canExecute(DevicePolicyManager.OPERATION_LOCK_NOW, permission.LOCK_DEVICE)) {
             return;
         }
+
         final CallerIdentity caller = getCallerIdentity();
 
         final int callingUserId = caller.getUserId();
@@ -6157,8 +6277,7 @@
      */
     private Set<Integer> updatePasswordExpirationsLocked(int userHandle) {
         final ArraySet<Integer> affectedUserIds = new ArraySet<>();
-        List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
-                userHandle, /* parent */ false);
+        List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(userHandle);
         for (int i = 0; i < admins.size(); i++) {
             ActiveAdmin admin = admins.get(i);
             if (admin.info.usesPolicy(DeviceAdminInfo.USES_POLICY_EXPIRE_PASSWORD)) {
@@ -7162,7 +7281,8 @@
                     admins = getUserDataUnchecked(userHandle).mAdminList;
                 } else {
                     // Otherwise return those set by admins in the user and its profiles.
-                    admins = getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
+                    admins = getActiveAdminsForLockscreenPoliciesLocked(
+                            getProfileParentUserIfRequested(userHandle, parent));
                 }
 
                 int which = DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NONE;
@@ -7229,7 +7349,6 @@
                 || (caller.hasPackage()
                 && isCallerDelegate(caller, DELEGATION_KEEP_UNINSTALLED_PACKAGES)));
 
-        // TODO In split system user mode, allow apps on user 0 to query the list
         synchronized (getLockObject()) {
             return getKeepUninstalledPackagesLocked();
         }
@@ -7462,6 +7581,10 @@
         }
     }
 
+    private int getDeviceOwnerUserIdUncheckedLocked() {
+        return mOwners.hasDeviceOwner() ? mOwners.getDeviceOwnerUserId() : UserHandle.USER_NULL;
+    }
+
     @Override
     public int getDeviceOwnerUserId() {
         if (!mHasFeature) {
@@ -7470,7 +7593,7 @@
         Preconditions.checkCallAuthorization(canManageUsers(getCallerIdentity()));
 
         synchronized (getLockObject()) {
-            return mOwners.hasDeviceOwner() ? mOwners.getDeviceOwnerUserId() : UserHandle.USER_NULL;
+            return getDeviceOwnerUserIdUncheckedLocked();
         }
     }
 
@@ -8011,7 +8134,7 @@
      */
     private @Nullable ActiveAdmin getDeviceOrProfileOwnerAdminLocked(int userHandle) {
         ActiveAdmin admin = getProfileOwnerAdminLocked(userHandle);
-        if (admin == null && getDeviceOwnerUserId() == userHandle) {
+        if (admin == null && getDeviceOwnerUserIdUncheckedLocked() == userHandle) {
             admin = getDeviceOwnerAdminLocked();
         }
         return admin;
@@ -8437,6 +8560,14 @@
         });
     }
 
+    private int getProfileParentUserIfRequested(int userHandle, boolean parent) {
+        if (parent) {
+            return getProfileParentId(userHandle);
+        }
+
+        return userHandle;
+    }
+
     private int getCredentialOwner(final int userHandle, final boolean parent) {
         return mInjector.binderWithCleanCallingIdentity(() -> {
             int effectiveUserHandle = userHandle;
@@ -8543,6 +8674,8 @@
         pw.printf("mIsWatch=%b\n", mIsWatch);
         pw.printf("mIsAutomotive=%b\n", mIsAutomotive);
         pw.printf("mHasTelephonyFeature=%b\n", mHasTelephonyFeature);
+        String safetyChecker = mSafetyChecker == null ? "N/A" : mSafetyChecker.getClass().getName();
+        pw.printf("mSafetyChecker=%b\n", safetyChecker);
         pw.decreaseIndent();
     }
 
@@ -8719,8 +8852,8 @@
             // Search through all admins that use KEYGUARD_DISABLE_TRUST_AGENTS and keep track
             // of the options. If any admin doesn't have options, discard options for the rest
             // and return null.
-            List<ActiveAdmin> admins =
-                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
+            List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
+                    getProfileParentUserIfRequested(userHandle, parent));
             boolean allAdminsHaveOptions = true;
             final int N = admins.size();
             for (int i = 0; i < N; i++) {
@@ -10374,12 +10507,12 @@
         Preconditions.checkCallAuthorization(!isManagedProfile(caller.getUserId()),
                 "User %d is not allowed to call setSecondaryLockscreenEnabled",
                         caller.getUserId());
-        // Allow testOnly admins to bypass supervision config requirement.
-        Preconditions.checkCallAuthorization(isAdminTestOnlyLocked(who, caller.getUserId())
-                        || isDefaultSupervisor(caller), "Admin %s is not the "
-                + "default supervision component", caller.getComponentName());
 
         synchronized (getLockObject()) {
+            // Allow testOnly admins to bypass supervision config requirement.
+            Preconditions.checkCallAuthorization(isAdminTestOnlyLocked(who, caller.getUserId())
+                    || isDefaultSupervisor(caller), "Admin %s is not the "
+                    + "default supervision component", caller.getComponentName());
             DevicePolicyData policy = getUserData(caller.getUserId());
             policy.mSecondaryLockscreenEnabled = enabled;
             saveSettingsLocked(caller.getUserId());
@@ -11981,6 +12114,9 @@
                 case DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE:
                 case DevicePolicyManager.ACTION_PROVISION_FINANCED_DEVICE:
                     return checkDeviceOwnerProvisioningPreCondition(callingUserId);
+                // TODO (b/137101239): clean up split system user codes
+                //  ACTION_PROVISION_MANAGED_USER and ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE
+                //  only supported on split-user systems.
                 case DevicePolicyManager.ACTION_PROVISION_MANAGED_USER:
                     return checkManagedUserProvisioningPreCondition(callingUserId);
                 case DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE:
@@ -12003,24 +12139,27 @@
         if (mOwners.hasProfileOwner(deviceOwnerUserId)) {
             return CODE_USER_HAS_PROFILE_OWNER;
         }
-        if (!mUserManager.isUserRunning(new UserHandle(deviceOwnerUserId))) {
+        // System user is always running in headless system user mode.
+        if (!mInjector.userManagerIsHeadlessSystemUserMode()
+                && !mUserManager.isUserRunning(new UserHandle(deviceOwnerUserId))) {
             return CODE_USER_NOT_RUNNING;
         }
         if (mIsWatch && hasPaired(UserHandle.USER_SYSTEM)) {
             return CODE_HAS_PAIRED;
         }
+        // TODO (b/137101239): clean up split system user codes
         if (isAdb) {
-            // if shell command runs after user setup completed check device status. Otherwise, OK.
+            // If shell command runs after user setup completed check device status. Otherwise, OK.
             if (mIsWatch || hasUserSetupCompleted(UserHandle.USER_SYSTEM)) {
-                if (!mInjector.userManagerIsSplitSystemUser()) {
-                    if (mUserManager.getUserCount() > 1) {
-                        return CODE_NONSYSTEM_USER_EXISTS;
-                    }
-                    if (hasIncompatibleAccountsOrNonAdb) {
-                        return CODE_ACCOUNTS_NOT_EMPTY;
-                    }
-                } else {
-                    // STOPSHIP Do proper check in split user mode
+                // In non-headless system user mode, DO can be setup only if
+                // there's no non-system user
+                if (!mInjector.userManagerIsHeadlessSystemUserMode()
+                        && !mInjector.userManagerIsSplitSystemUser()
+                        && mUserManager.getUserCount() > 1) {
+                    return CODE_NONSYSTEM_USER_EXISTS;
+                }
+                if (hasIncompatibleAccountsOrNonAdb) {
+                    return CODE_ACCOUNTS_NOT_EMPTY;
                 }
             }
             return CODE_OK;
@@ -12030,19 +12169,26 @@
                 if (deviceOwnerUserId != UserHandle.USER_SYSTEM) {
                     return CODE_NOT_SYSTEM_USER;
                 }
-                // In non-split user mode, only provision DO before setup wizard completes
+                // Only provision DO before setup wizard completes
+                // TODO (b/171423186): implement deferred DO setup for headless system user mode
                 if (hasUserSetupCompleted(UserHandle.USER_SYSTEM)) {
                     return CODE_USER_SETUP_COMPLETED;
                 }
-            } else {
+            }  else {
                 // STOPSHIP Do proper check in split user mode
             }
             return CODE_OK;
         }
     }
 
-    private int checkDeviceOwnerProvisioningPreCondition(@UserIdInt int deviceOwnerUserId) {
+    private int checkDeviceOwnerProvisioningPreCondition(@UserIdInt int callingUserId) {
         synchronized (getLockObject()) {
+            final int deviceOwnerUserId = mInjector.userManagerIsHeadlessSystemUserMode()
+                    ? UserHandle.USER_SYSTEM
+                    : callingUserId;
+            Slog.i(LOG_TAG,
+                    String.format("Calling user %d, device owner will be set on user %d",
+                            callingUserId, deviceOwnerUserId));
             // hasIncompatibleAccountsOrNonAdb doesn't matter since the caller is not adb.
             return checkDeviceOwnerProvisioningPreConditionLocked(/* owner unknown */ null,
                     deviceOwnerUserId, /* isAdb= */ false,
@@ -12050,6 +12196,7 @@
         }
     }
 
+    // TODO (b/137101239): clean up split system user codes
     private int checkManagedProfileProvisioningPreCondition(String packageName,
             @UserIdInt int callingUserId) {
         if (!hasFeatureManagedUsers()) {
@@ -12138,6 +12285,7 @@
         return null;
     }
 
+    // TODO (b/137101239): clean up split system user codes
     private int checkManagedUserProvisioningPreCondition(int callingUserId) {
         if (!hasFeatureManagedUsers()) {
             return CODE_MANAGED_USERS_NOT_SUPPORTED;
@@ -12159,6 +12307,7 @@
         return CODE_OK;
     }
 
+    // TODO (b/137101239): clean up split system user codes
     private int checkManagedShareableDeviceProvisioningPreCondition(int callingUserId) {
         if (!mInjector.userManagerIsSplitSystemUser()) {
             // ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE only supported on split-user systems.
@@ -12731,9 +12880,8 @@
             return true;
         }
         if (userId == UserHandle.USER_SYSTEM) {
-            // The system user is always affiliated in a DO device, even if the DO is set on a
-            // different user. This could be the case if the DO is set in the primary user
-            // of a split user device.
+            // The system user is always affiliated in a DO device,
+            // even if in headless system user mode.
             return true;
         }
 
@@ -14044,8 +14192,7 @@
                 return null;
             }
             try (FileInputStream stream = new FileInputStream(bundleFile)) {
-                XmlPullParser parser = Xml.newPullParser();
-                parser.setInput(stream, null);
+                TypedXmlPullParser parser = Xml.resolvePullParser(stream);
                 parser.next();
                 return PersistableBundle.restoreFromXml(parser);
             } catch (IOException | XmlPullParserException | IllegalArgumentException e) {
@@ -14198,8 +14345,7 @@
         FileOutputStream stream = null;
         try {
             stream = atomicFile.startWrite();
-            final XmlSerializer serializer = new FastXmlSerializer();
-            serializer.setOutput(stream, StandardCharsets.UTF_8.name());
+            final TypedXmlSerializer serializer = Xml.resolveSerializer(stream);
             serializer.startDocument(null, true);
             serializer.startTag(null, TAG_TRANSFER_OWNERSHIP_BUNDLE);
             bundle.saveToXml(serializer);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
index cced359..9e98fc5 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
@@ -39,6 +39,8 @@
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.SparseIntArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -735,8 +737,7 @@
             FileOutputStream outputStream = null;
             try {
                 outputStream = f.startWrite();
-                final XmlSerializer out = new FastXmlSerializer();
-                out.setOutput(outputStream, StandardCharsets.UTF_8.name());
+                final TypedXmlSerializer out = Xml.resolveSerializer(outputStream);
 
                 // Root tag
                 out.startDocument(null, true);
@@ -776,8 +777,7 @@
             InputStream input = null;
             try {
                 input = f.openRead();
-                final XmlPullParser parser = Xml.newPullParser();
-                parser.setInput(input, StandardCharsets.UTF_8.name());
+                final TypedXmlPullParser parser = Xml.resolvePullParser(input);
 
                 int type;
                 int depth = 0;
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/TransferOwnershipMetadataManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/TransferOwnershipMetadataManager.java
index 4b66bea..58ece07 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/TransferOwnershipMetadataManager.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/TransferOwnershipMetadataManager.java
@@ -24,6 +24,8 @@
 import android.text.TextUtils;
 import android.util.AtomicFile;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -84,8 +86,7 @@
         FileOutputStream stream = null;
         try {
             stream = atomicFile.startWrite();
-            final XmlSerializer serializer = new FastXmlSerializer();
-            serializer.setOutput(stream, StandardCharsets.UTF_8.name());
+            final TypedXmlSerializer serializer = Xml.resolveSerializer(stream);
             serializer.startDocument(null, true);
             insertSimpleTag(serializer, TAG_USER_ID, Integer.toString(params.userId));
             insertSimpleTag(serializer,
@@ -122,8 +123,7 @@
         Slog.d(TAG, "Loading TransferOwnershipMetadataManager from "
                 + transferOwnershipMetadataFile);
         try (FileInputStream stream = new FileInputStream(transferOwnershipMetadataFile)) {
-            final XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(stream, null);
+            final TypedXmlPullParser parser = Xml.resolvePullParser(stream);
             return parseMetadataFile(parser);
         } catch (IOException | XmlPullParserException | IllegalArgumentException e) {
             Slog.e(TAG, "Caught exception while trying to load the "
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index dfa726f..10b3265 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -34,6 +34,7 @@
 import android.app.ApplicationErrorReport;
 import android.app.INotificationManager;
 import android.app.SystemServiceRegistry;
+import android.app.admin.DevicePolicySafetyChecker;
 import android.app.usage.UsageStatsManagerInternal;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -101,6 +102,7 @@
 import com.android.server.audio.AudioService;
 import com.android.server.biometrics.AuthService;
 import com.android.server.biometrics.BiometricService;
+import com.android.server.biometrics.sensors.BiometricServiceCallback;
 import com.android.server.biometrics.sensors.face.FaceService;
 import com.android.server.biometrics.sensors.fingerprint.FingerprintService;
 import com.android.server.biometrics.sensors.iris.IrisService;
@@ -195,8 +197,10 @@
 import java.io.FileDescriptor;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Locale;
 import java.util.Timer;
 import java.util.concurrent.CountDownLatch;
@@ -1468,7 +1472,10 @@
         }
         t.traceEnd();
 
-        if (mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
+        final DevicePolicyManagerService.Lifecycle dpms;
+        if (mFactoryTestMode == FactoryTest.FACTORY_TEST_LOW_LEVEL) {
+            dpms = null;
+        } else {
             t.traceBegin("StartLockSettingsService");
             try {
                 mSystemServiceManager.startService(LOCK_SETTINGS_SERVICE_CLASS);
@@ -1505,7 +1512,7 @@
             // Always start the Device Policy Manager, so that the API is compatible with
             // API8.
             t.traceBegin("StartDevicePolicyManager");
-            mSystemServiceManager.startService(DevicePolicyManagerService.Lifecycle.class);
+            dpms = mSystemServiceManager.startService(DevicePolicyManagerService.Lifecycle.class);
             t.traceEnd();
 
             if (!isWatch) {
@@ -2089,9 +2096,12 @@
             final boolean hasFeatureFingerprint
                     = mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT);
 
+            final List<BiometricServiceCallback> biometricServiceCallback = new ArrayList<>();
             if (hasFeatureFace) {
                 t.traceBegin("StartFaceSensor");
-                mSystemServiceManager.startService(FaceService.class);
+                final FaceService faceService =
+                        mSystemServiceManager.startService(FaceService.class);
+                biometricServiceCallback.add(faceService);
                 t.traceEnd();
             }
 
@@ -2103,13 +2113,20 @@
 
             if (hasFeatureFingerprint) {
                 t.traceBegin("StartFingerprintSensor");
-                mSystemServiceManager.startService(FingerprintService.class);
+                final FingerprintService fingerprintService =
+                        mSystemServiceManager.startService(FingerprintService.class);
+                biometricServiceCallback.add(fingerprintService);
                 t.traceEnd();
             }
 
-            // Start this service after all biometric services.
+            // Start this service after all biometric sensor services are started.
             t.traceBegin("StartBiometricService");
             mSystemServiceManager.startService(BiometricService.class);
+            for (BiometricServiceCallback service : biometricServiceCallback) {
+                Slog.d(TAG, "Notifying onBiometricServiceReady for: "
+                        + service.getClass().getSimpleName());
+                service.onBiometricServiceReady();
+            }
             t.traceEnd();
 
             t.traceBegin("StartAuthService");
@@ -2427,6 +2444,9 @@
                 if (cshs instanceof Dumpable) {
                     mDumper.addDumpable((Dumpable) cshs);
                 }
+                if (cshs instanceof DevicePolicySafetyChecker) {
+                    dpms.setDevicePolicySafetyChecker((DevicePolicySafetyChecker) cshs);
+                }
                 t.traceEnd();
             }
 
diff --git a/services/net/Android.bp b/services/net/Android.bp
index 1ccd512..a52fe12 100644
--- a/services/net/Android.bp
+++ b/services/net/Android.bp
@@ -22,13 +22,14 @@
 
 // Version of services.net for usage by the wifi mainline module.
 // Note: This is compiled against module_current.
-// TODO(b/145825329): This should be moved to networkstack-client,
+// TODO(b/172457099): This should be moved to networkstack-client,
 // with dependencies moved to frameworks/libs/net right.
 java_library {
     name: "services.net-module-wifi",
     srcs: [
         ":framework-services-net-module-wifi-shared-srcs",
         ":net-module-utils-srcs",
+        ":net-utils-services-common-srcs",
         "java/android/net/ip/IpClientCallbacks.java",
         "java/android/net/ip/IpClientManager.java",
         "java/android/net/ip/IpClientUtil.java",
@@ -39,6 +40,7 @@
         "java/android/net/TcpKeepalivePacketData.java",
     ],
     sdk_version: "module_current",
+    min_sdk_version: "30",
     libs: [
         "unsupportedappusage",
         "framework-wifi-util-lib",
@@ -49,7 +51,6 @@
         "netd_aidl_interface-V3-java",
         "netlink-client",
         "networkstack-client",
-        "net-utils-services-common",
     ],
     apex_available: [
         "com.android.wifi",
diff --git a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java
index 1944965..0d878b4 100644
--- a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java
+++ b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java
@@ -28,7 +28,6 @@
 import android.os.Looper;
 import android.os.RemoteException;
 import android.os.ServiceManager;
-import android.os.SystemProperties;
 import android.os.UpdateEngine;
 import android.os.UpdateEngineCallback;
 import android.provider.DeviceConfig;
@@ -227,8 +226,8 @@
         }
 
         // Sample for a fraction of app launches.
-        int traceFrequency =
-                SystemProperties.getInt("persist.profcollectd.applaunch_trace_freq", 2);
+        int traceFrequency = DeviceConfig.getInt(DeviceConfig.NAMESPACE_PROFCOLLECT_NATIVE_BOOT,
+                "applaunch_trace_freq", 2);
         int randomNum = ThreadLocalRandom.current().nextInt(100);
         if (randomNum < traceFrequency) {
             try {
diff --git a/services/tests/inprocesstests/Android.bp b/services/tests/inprocesstests/Android.bp
new file mode 100644
index 0000000..6dd059f
--- /dev/null
+++ b/services/tests/inprocesstests/Android.bp
@@ -0,0 +1,12 @@
+android_test {
+    name: "FrameworksInProcessTests",
+    srcs: ["src/**/*.java"],
+    static_libs: [
+        "androidx.test.core",
+        "androidx.test.rules",
+        "services.core",
+        "truth-prebuilt",
+        "platform-test-annotations",
+    ],
+    test_suites: ["general-tests"],
+}
diff --git a/packages/CarSystemUI/samples/sample1/rro/AndroidManifest.xml b/services/tests/inprocesstests/AndroidManifest.xml
similarity index 62%
rename from packages/CarSystemUI/samples/sample1/rro/AndroidManifest.xml
rename to services/tests/inprocesstests/AndroidManifest.xml
index 5c25056..efb4a53 100644
--- a/packages/CarSystemUI/samples/sample1/rro/AndroidManifest.xml
+++ b/services/tests/inprocesstests/AndroidManifest.xml
@@ -15,10 +15,16 @@
   -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.android.systemui.rro">
-    <overlay
-        android:targetPackage="com.android.systemui"
-        android:isStatic="false"
-        android:resourcesMap="@xml/car_sysui_overlays"
-    />
-</manifest>
\ No newline at end of file
+          package="com.android.frameworks.inprocesstests" >
+
+    <uses-sdk android:minSdkVersion="28" android:targetSdkVersion="28" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="android"
+                     android:label="Frameworks In-Process Tests"/>
+
+</manifest>
diff --git a/services/tests/inprocesstests/AndroidTest.xml b/services/tests/inprocesstests/AndroidTest.xml
new file mode 100644
index 0000000..89abe3c
--- /dev/null
+++ b/services/tests/inprocesstests/AndroidTest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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 frameworks in-process tests">
+    <option name="test-suite-tag" value="apct" />
+    <option name="test-suite-tag" value="apct-instrumentation" />
+
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true"/>
+        <option name="test-file-name" value="FrameworksInProcessTests.apk"/>
+    </target_preparer>
+
+    <!-- Restart to clear test code from system server -->
+    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+        <option name="teardown-command" value="am restart" />
+    </target_preparer>
+
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest">
+        <option name="package" value="com.android.frameworks.inprocesstests"/>
+        <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
+        <option name="restart" value="false" />
+    </test>
+</configuration>
diff --git a/services/tests/inprocesstests/src/com/android/frameworks/inprocesstests/InstrumentSystemServerTest.java b/services/tests/inprocesstests/src/com/android/frameworks/inprocesstests/InstrumentSystemServerTest.java
new file mode 100644
index 0000000..47fc73f
--- /dev/null
+++ b/services/tests/inprocesstests/src/com/android/frameworks/inprocesstests/InstrumentSystemServerTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.frameworks.inprocesstests;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.os.Process;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.Test;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+
+public class InstrumentSystemServerTest {
+
+    private static final String TAG = "InstrumentSystemServerTest";
+
+    @Test
+    public void testCodeIsRunningInSystemServer() throws Exception {
+        assertThat(InstrumentationRegistry.getInstrumentation().getTargetContext().getPackageName())
+                .isEqualTo("android");
+        assertThat(Process.myUid()).isEqualTo(Process.SYSTEM_UID);
+        assertThat(readCmdLine()).isEqualTo("system_server");
+    }
+
+    private static String readCmdLine() throws Exception {
+        BufferedReader in = null;
+        try {
+            in = new BufferedReader(new FileReader("/proc/self/cmdline"));
+            return in.readLine().trim();
+        } finally {
+            in.close();
+        }
+    }
+
+}
diff --git a/services/tests/servicestests/src/com/android/server/VibratorServiceTest.java b/services/tests/servicestests/src/com/android/server/VibratorServiceTest.java
index 5ddb571..c1f83cb 100644
--- a/services/tests/servicestests/src/com/android/server/VibratorServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/VibratorServiceTest.java
@@ -806,7 +806,7 @@
     private void setRingerMode(int ringerMode) {
         AudioManager audioManager = mContextSpy.getSystemService(AudioManager.class);
         audioManager.setRingerModeInternal(ringerMode);
-        assertEquals(ringerMode, audioManager.getRingerMode());
+        assertEquals(ringerMode, audioManager.getRingerModeInternal());
     }
 
     private void setUserSetting(String settingName, int value) {
diff --git a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java
index 0d0ac6d..726e48a 100644
--- a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java
@@ -20,6 +20,10 @@
 
 import static org.testng.Assert.expectThrows;
 
+import android.app.appsearch.AppSearchSchema;
+import android.app.appsearch.GenericDocument;
+import android.app.appsearch.SearchResultPage;
+import android.app.appsearch.SearchSpec;
 import android.app.appsearch.exceptions.AppSearchException;
 
 import com.android.server.appsearch.proto.DocumentProto;
@@ -27,20 +31,19 @@
 import com.android.server.appsearch.proto.IndexingConfig;
 import com.android.server.appsearch.proto.PropertyConfigProto;
 import com.android.server.appsearch.proto.PropertyProto;
-import com.android.server.appsearch.proto.ResultSpecProto;
 import com.android.server.appsearch.proto.SchemaProto;
 import com.android.server.appsearch.proto.SchemaTypeConfigProto;
-import com.android.server.appsearch.proto.ScoringSpecProto;
-import com.android.server.appsearch.proto.SearchResultProto;
 import com.android.server.appsearch.proto.SearchSpecProto;
-import com.android.server.appsearch.proto.StatusProto;
 import com.android.server.appsearch.proto.TermMatchType;
+import com.google.common.collect.ImmutableSet;
 
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.Set;
 
 public class AppSearchImplTest {
@@ -93,7 +96,7 @@
 
         SchemaProto expectedSchema = SchemaProto.newBuilder()
                 .addTypes(SchemaTypeConfigProto.newBuilder()
-                    .setSchemaType("databaseName/Foo").build())
+                        .setSchemaType("databaseName/Foo").build())
                 .addTypes(SchemaTypeConfigProto.newBuilder()
                         .setSchemaType("databaseName/TestType")
                         .addProperties(PropertyConfigProto.newBuilder()
@@ -120,7 +123,7 @@
     }
 
     @Test
-    public void testRewriteDocumentProto() {
+    public void testAddDocumentTypePrefix() {
         DocumentProto insideDocument = DocumentProto.newBuilder()
                 .setUri("inside-uri")
                 .setSchema("type")
@@ -146,30 +149,56 @@
                 .build();
 
         DocumentProto.Builder actualDocument = documentProto.toBuilder();
-        mAppSearchImpl.rewriteDocumentTypes("databaseName/", actualDocument, /*add=*/true);
+        mAppSearchImpl.addPrefixToDocument(actualDocument, "databaseName/");
         assertThat(actualDocument.build()).isEqualTo(expectedDocumentProto);
-        mAppSearchImpl.rewriteDocumentTypes("databaseName/", actualDocument, /*add=*/false);
-        assertThat(actualDocument.build()).isEqualTo(documentProto);
+    }
+
+    @Test
+    public void testRemoveDocumentTypePrefixes() {
+        DocumentProto insideDocument = DocumentProto.newBuilder()
+                .setUri("inside-uri")
+                .setSchema("databaseName1/type")
+                .setNamespace("databaseName2/namespace")
+                .build();
+        DocumentProto documentProto = DocumentProto.newBuilder()
+                .setUri("uri")
+                .setSchema("databaseName2/type")
+                .setNamespace("databaseName3/namespace")
+                .addProperties(PropertyProto.newBuilder().addDocumentValues(insideDocument))
+                .build();
+
+        DocumentProto expectedInsideDocument = DocumentProto.newBuilder()
+                .setUri("inside-uri")
+                .setSchema("type")
+                .setNamespace("namespace")
+                .build();
+        // Since we don't pass in "databaseName3/" as a prefix to remove, it stays on the Document.
+        DocumentProto expectedDocumentProto = DocumentProto.newBuilder()
+                .setUri("uri")
+                .setSchema("type")
+                .setNamespace("namespace")
+                .addProperties(PropertyProto.newBuilder().addDocumentValues(expectedInsideDocument))
+                .build();
+
+        DocumentProto.Builder actualDocument = documentProto.toBuilder();
+        mAppSearchImpl.removeDatabasesFromDocument(actualDocument);
+        assertThat(actualDocument.build()).isEqualTo(expectedDocumentProto);
     }
 
     @Test
     public void testOptimize() throws Exception {
         // Insert schema
-        SchemaProto schema = SchemaProto.newBuilder()
-                .addTypes(SchemaTypeConfigProto.newBuilder()
-                        .setSchemaType("type").build())
-                .build();
-        mAppSearchImpl.setSchema("database", schema, /*forceOverride=*/false);
+        Set<AppSearchSchema> schemas =
+                Collections.singleton(new AppSearchSchema.Builder("type").build());
+        mAppSearchImpl.setSchema("database", schemas, /*forceOverride=*/false);
 
         // Insert enough documents.
         for (int i = 0; i < AppSearchImpl.OPTIMIZE_THRESHOLD_DOC_COUNT
                 + AppSearchImpl.CHECK_OPTIMIZE_INTERVAL; i++) {
-            DocumentProto insideDocument = DocumentProto.newBuilder()
-                    .setUri("inside-uri" + i)
-                    .setSchema("type")
-                    .setNamespace("namespace")
-                    .build();
-            mAppSearchImpl.putDocument("database", insideDocument);
+            GenericDocument document =
+                    new GenericDocument.Builder("uri" + i, "type").setNamespace(
+                            "namespace").build();
+            mAppSearchImpl.putDocument("database", document);
         }
 
         // Check optimize() will release 0 docs since there is no deletion.
@@ -179,7 +208,7 @@
         // delete 999 documents , we will reach the threshold to trigger optimize() in next
         // deletion.
         for (int i = 0; i < AppSearchImpl.OPTIMIZE_THRESHOLD_DOC_COUNT - 1; i++) {
-            mAppSearchImpl.remove("database", "namespace", "inside-uri" + i);
+            mAppSearchImpl.remove("database", "namespace", "uri" + i);
         }
 
         // optimize() still not be triggered since we are in the interval to call getOptimizeInfo()
@@ -191,65 +220,111 @@
         for (int i = AppSearchImpl.OPTIMIZE_THRESHOLD_DOC_COUNT;
                 i < AppSearchImpl.OPTIMIZE_THRESHOLD_DOC_COUNT
                         + AppSearchImpl.CHECK_OPTIMIZE_INTERVAL; i++) {
-            mAppSearchImpl.remove("database", "namespace", "inside-uri" + i);
+            mAppSearchImpl.remove("database", "namespace", "uri" + i);
         }
 
         // Verify optimize() is triggered
         optimizeInfo = mAppSearchImpl.getOptimizeInfoResult();
         assertThat(optimizeInfo.getOptimizableDocs())
-                .isLessThan((long) AppSearchImpl.CHECK_OPTIMIZE_INTERVAL);
+                .isLessThan(AppSearchImpl.CHECK_OPTIMIZE_INTERVAL);
     }
 
     @Test
-    public void testRewriteSearchSpec() throws Exception {
+    public void testRewriteSearchSpec_OneInstance() throws Exception {
         SearchSpecProto.Builder searchSpecProto =
                 SearchSpecProto.newBuilder().setQuery("");
 
         // Insert schema
-        SchemaProto schema = SchemaProto.newBuilder()
-                .addTypes(SchemaTypeConfigProto.newBuilder()
-                        .setSchemaType("type").build())
-                .build();
-        mAppSearchImpl.setSchema("database", schema, /*forceOverride=*/false);
+        Set<AppSearchSchema> schemas =
+                Collections.singleton(new AppSearchSchema.Builder("type").build());
+        mAppSearchImpl.setSchema("database", schemas, /*forceOverride=*/false);
+
         // Insert document
-        DocumentProto insideDocument = DocumentProto.newBuilder()
-                .setUri("inside-uri")
-                .setSchema("type")
-                .setNamespace("namespace")
-                .build();
-        mAppSearchImpl.putDocument("database", insideDocument);
+        GenericDocument document = new GenericDocument.Builder("uri", "type").setNamespace(
+                "namespace").build();
+        mAppSearchImpl.putDocument("database", document);
 
         // Rewrite SearchSpec
-        mAppSearchImpl.rewriteSearchSpecForNonEmptyDatabase(
-                "database", searchSpecProto);
+        mAppSearchImpl.rewriteSearchSpecForDatabases(searchSpecProto, Collections.singleton(
+                "database"));
         assertThat(searchSpecProto.getSchemaTypeFiltersList()).containsExactly("database/type");
         assertThat(searchSpecProto.getNamespaceFiltersList()).containsExactly("database/namespace");
     }
 
     @Test
+    public void testRewriteSearchSpec_TwoInstances() throws Exception {
+        SearchSpecProto.Builder searchSpecProto =
+                SearchSpecProto.newBuilder().setQuery("");
+
+        // Insert schema
+        Set<AppSearchSchema> schemas = Set.of(
+                new AppSearchSchema.Builder("typeA").build(),
+                new AppSearchSchema.Builder("typeB").build());
+        mAppSearchImpl.setSchema("database1", schemas, /*forceOverride=*/false);
+        mAppSearchImpl.setSchema("database2", schemas, /*forceOverride=*/false);
+
+        // Insert documents
+        GenericDocument document1 = new GenericDocument.Builder("uri", "typeA").setNamespace(
+                "namespace").build();
+        mAppSearchImpl.putDocument("database1", document1);
+
+        GenericDocument document2 = new GenericDocument.Builder("uri", "typeB").setNamespace(
+                "namespace").build();
+        mAppSearchImpl.putDocument("database2", document2);
+
+        // Rewrite SearchSpec
+        mAppSearchImpl.rewriteSearchSpecForDatabases(searchSpecProto,
+                ImmutableSet.of("database1", "database2"));
+        assertThat(searchSpecProto.getSchemaTypeFiltersList()).containsExactly(
+                "database1/typeA", "database1/typeB", "database2/typeA", "database2/typeB");
+        assertThat(searchSpecProto.getNamespaceFiltersList()).containsExactly(
+                "database1/namespace", "database2/namespace");
+    }
+
+    @Test
     public void testQueryEmptyDatabase() throws Exception {
-        SearchResultProto searchResultProto = mAppSearchImpl.query("EmptyDatabase",
-                SearchSpecProto.getDefaultInstance(),
-                ResultSpecProto.getDefaultInstance(), ScoringSpecProto.getDefaultInstance());
-        assertThat(searchResultProto.getResultsCount()).isEqualTo(0);
-        assertThat(searchResultProto.getStatus().getCode()).isEqualTo(StatusProto.Code.OK);
+        SearchSpec searchSpec =
+                new SearchSpec.Builder().setTermMatch(TermMatchType.Code.PREFIX_VALUE).build();
+        SearchResultPage searchResultPage = mAppSearchImpl.query(
+                "EmptyDatabase",
+                "", searchSpec);
+        assertThat(searchResultPage.getResults()).isEmpty();
+    }
+
+    @Test
+    public void testGlobalQueryEmptyDatabase() throws Exception {
+        SearchSpec searchSpec =
+                new SearchSpec.Builder().setTermMatch(TermMatchType.Code.PREFIX_VALUE).build();
+        SearchResultPage searchResultPage = mAppSearchImpl.query(
+                "EmptyDatabase",
+                "", searchSpec);
+        assertThat(searchResultPage.getResults()).isEmpty();
     }
 
     @Test
     public void testRemoveEmptyDatabase_NoExceptionThrown() throws Exception {
-        mAppSearchImpl.removeByType("EmptyDatabase", "FakeType");
-        mAppSearchImpl.removeByNamespace("EmptyDatabase", "FakeNamespace");
-        mAppSearchImpl.removeAll("EmptyDatabase");
+        SearchSpec searchSpec =
+                new SearchSpec.Builder().addSchema("FakeType").setTermMatch(
+                        TermMatchType.Code.PREFIX_VALUE).build();
+        mAppSearchImpl.removeByQuery("EmptyDatabase",
+                "", searchSpec);
+
+        searchSpec =
+                new SearchSpec.Builder().addNamespace("FakeNamespace").setTermMatch(
+                        TermMatchType.Code.PREFIX_VALUE).build();
+        mAppSearchImpl.removeByQuery("EmptyDatabase",
+                "", searchSpec);
+
+        searchSpec = new SearchSpec.Builder().setTermMatch(TermMatchType.Code.PREFIX_VALUE).build();
+        mAppSearchImpl.removeByQuery("EmptyDatabase", "", searchSpec);
     }
 
     @Test
     public void testSetSchema() throws Exception {
-        // Create schemas
-        SchemaProto schemaProto = SchemaProto.newBuilder()
-                .addTypes(SchemaTypeConfigProto.newBuilder().setSchemaType("Email")).build();
-
+        Set<AppSearchSchema> schemas =
+                Collections.singleton(new AppSearchSchema.Builder("Email").build());
         // Set schema Email to AppSearch database1
-        mAppSearchImpl.setSchema("database1", schemaProto, /*forceOverride=*/false);
+        mAppSearchImpl.setSchema("database1", schemas, /*forceOverride=*/false);
 
         // Create excepted schemaType proto.
         SchemaProto exceptedProto = SchemaProto.newBuilder()
@@ -261,13 +336,11 @@
 
     @Test
     public void testRemoveSchema() throws Exception {
-        // Create schemas
-        SchemaProto schemaProto = SchemaProto.newBuilder()
-                .addTypes(SchemaTypeConfigProto.newBuilder().setSchemaType("Email"))
-                .addTypes(SchemaTypeConfigProto.newBuilder().setSchemaType("Document")).build();
-
+        Set<AppSearchSchema> schemas = new HashSet<>();
+        schemas.add(new AppSearchSchema.Builder("Email").build());
+        schemas.add(new AppSearchSchema.Builder("Document").build());
         // Set schema Email and Document to AppSearch database1
-        mAppSearchImpl.setSchema("database1", schemaProto, /*forceOverride=*/false);
+        mAppSearchImpl.setSchema("database1", schemas, /*forceOverride=*/false);
 
         // Create excepted schemaType proto.
         SchemaProto exceptedProto = SchemaProto.newBuilder()
@@ -279,19 +352,16 @@
         assertThat(mAppSearchImpl.getSchemaProto().getTypesList())
                 .containsExactlyElementsIn(exceptedProto.getTypesList());
 
-        // Save only Email this time.
-        schemaProto = SchemaProto.newBuilder()
-                .addTypes(SchemaTypeConfigProto.newBuilder().setSchemaType("Email")).build();
-
+        final Set<AppSearchSchema> finalSchemas = Collections.singleton(new AppSearchSchema.Builder(
+                "Email").build());
         // Check the incompatible error has been thrown.
-        SchemaProto finalSchemaProto = schemaProto;
         AppSearchException e = expectThrows(AppSearchException.class, () ->
-                mAppSearchImpl.setSchema("database1", finalSchemaProto, /*forceOverride=*/false));
+                mAppSearchImpl.setSchema("database1", finalSchemas, /*forceOverride=*/false));
         assertThat(e).hasMessageThat().contains("Schema is incompatible");
         assertThat(e).hasMessageThat().contains("Deleted types: [database1/Document]");
 
         // ForceOverride to delete.
-        mAppSearchImpl.setSchema("database1", finalSchemaProto, /*forceOverride=*/true);
+        mAppSearchImpl.setSchema("database1", finalSchemas, /*forceOverride=*/true);
 
         // Check Document schema is removed.
         exceptedProto = SchemaProto.newBuilder()
@@ -304,13 +374,13 @@
     @Test
     public void testRemoveSchema_differentDataBase() throws Exception {
         // Create schemas
-        SchemaProto emailAndDocSchemaProto = SchemaProto.newBuilder()
-                .addTypes(SchemaTypeConfigProto.newBuilder().setSchemaType("Email"))
-                .addTypes(SchemaTypeConfigProto.newBuilder().setSchemaType("Document")).build();
+        Set<AppSearchSchema> schemas = new HashSet<>();
+        schemas.add(new AppSearchSchema.Builder("Email").build());
+        schemas.add(new AppSearchSchema.Builder("Document").build());
 
         // Set schema Email and Document to AppSearch database1 and 2
-        mAppSearchImpl.setSchema("database1", emailAndDocSchemaProto, /*forceOverride=*/false);
-        mAppSearchImpl.setSchema("database2", emailAndDocSchemaProto, /*forceOverride=*/false);
+        mAppSearchImpl.setSchema("database1", schemas, /*forceOverride=*/false);
+        mAppSearchImpl.setSchema("database2", schemas, /*forceOverride=*/false);
 
         // Create excepted schemaType proto.
         SchemaProto exceptedProto = SchemaProto.newBuilder()
@@ -325,10 +395,8 @@
                 .containsExactlyElementsIn(exceptedProto.getTypesList());
 
         // Save only Email to database1 this time.
-        SchemaProto emailSchemaProto = SchemaProto.newBuilder()
-                        .addTypes(SchemaTypeConfigProto.newBuilder().setSchemaType("Email"))
-                .build();
-        mAppSearchImpl.setSchema("database1", emailSchemaProto, /*forceOverride=*/true);
+        schemas = Collections.singleton(new AppSearchSchema.Builder("Email").build());
+        mAppSearchImpl.setSchema("database1", schemas, /*forceOverride=*/true);
 
         // Create excepted schemaType list, database 1 should only contain Email but database 2
         // remains in same.
diff --git a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/converter/SnippetTest.java b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/converter/SnippetTest.java
index d5762a1..2e9286c 100644
--- a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/converter/SnippetTest.java
+++ b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/converter/SnippetTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.app.appsearch.SearchResult;
+import android.app.appsearch.SearchResultPage;
 
 import com.android.server.appsearch.proto.DocumentProto;
 import com.android.server.appsearch.proto.PropertyProto;
@@ -75,8 +76,9 @@
                 .build();
 
         // Making ResultReader and getting Snippet values.
-        for (SearchResultProto.ResultProto proto : searchResultProto.getResultsList()) {
-            SearchResult result = SearchResultToProtoConverter.convertSearchResult(proto);
+        SearchResultPage searchResultPage =
+                SearchResultToProtoConverter.convertToSearchResultPage(searchResultProto);
+        for (SearchResult result : searchResultPage.getResults()) {
             SearchResult.MatchInfo match = result.getMatches().get(0);
             assertThat(match.getPropertyPath()).isEqualTo(propertyKeyString);
             assertThat(match.getFullText()).isEqualTo(propertyValueString);
@@ -121,8 +123,9 @@
                 .addResults(resultProto)
                 .build();
 
-        for (SearchResultProto.ResultProto proto : searchResultProto.getResultsList()) {
-            SearchResult result = SearchResultToProtoConverter.convertSearchResult(proto);
+        SearchResultPage searchResultPage =
+                SearchResultToProtoConverter.convertToSearchResultPage(searchResultProto);
+        for (SearchResult result : searchResultPage.getResults()) {
             assertThat(result.getMatches()).isEmpty();
         }
     }
@@ -182,8 +185,9 @@
                 .build();
 
         // Making ResultReader and getting Snippet values.
-        for (SearchResultProto.ResultProto proto : searchResultProto.getResultsList()) {
-            SearchResult result = SearchResultToProtoConverter.convertSearchResult(proto);
+        SearchResultPage searchResultPage =
+                SearchResultToProtoConverter.convertToSearchResultPage(searchResultProto);
+        for (SearchResult result : searchResultPage.getResults()) {
 
             SearchResult.MatchInfo match1 = result.getMatches().get(0);
             assertThat(match1.getPropertyPath()).isEqualTo("sender.name");
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java
index e8c9697..6b000f3 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java
@@ -24,12 +24,16 @@
 import static junit.framework.Assert.assertTrue;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.annotation.NonNull;
 import android.app.admin.DevicePolicyManager;
 import android.app.trust.ITrustManager;
 import android.content.Context;
@@ -39,6 +43,9 @@
 import android.hardware.biometrics.IBiometricServiceReceiver;
 import android.hardware.biometrics.IBiometricSysuiReceiver;
 import android.hardware.biometrics.PromptInfo;
+import android.hardware.biometrics.SensorProperties;
+import android.hardware.fingerprint.FingerprintSensorProperties;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
 import android.os.Binder;
 import android.os.IBinder;
 import android.os.RemoteException;
@@ -79,7 +86,8 @@
     private IBinder mToken;
 
     // Assume all tests can be done with the same set of sensors for now.
-    private List<BiometricSensor> mSensors;
+    @NonNull private List<BiometricSensor> mSensors;
+    @NonNull private List<FingerprintSensorPropertiesInternal> mFingerprintSensorProps;
 
     @Before
     public void setUp() throws Exception {
@@ -88,11 +96,12 @@
         mRandom = new Random();
         mToken = new Binder();
         mSensors = new ArrayList<>();
+        mFingerprintSensorProps = new ArrayList<>();
     }
 
     @Test
     public void testNewAuthSession_eligibleSensorsSetToStateUnknown() throws RemoteException {
-        setupFingerprint(0 /* id */);
+        setupFingerprint(0 /* id */, FingerprintSensorProperties.TYPE_REAR);
         setupFace(1 /* id */, false /* confirmationAlwaysRequired */);
 
         final AuthSession session = createAuthSession(mSensors,
@@ -110,10 +119,9 @@
     }
 
     @Test
-    public void testStartNewAuthSession()
-            throws RemoteException {
+    public void testStartNewAuthSession() throws RemoteException {
         setupFace(0 /* id */, false /* confirmationAlwaysRequired */);
-        setupFingerprint(1 /* id */);
+        setupFingerprint(1 /* id */, FingerprintSensorProperties.TYPE_REAR);
 
         final boolean requireConfirmation = true;
         final long operationId = 123;
@@ -175,6 +183,60 @@
         }
     }
 
+    @Test
+    public void testUdfpsAuth_sensorStartsAfterDialogAnimationCompletes() throws RemoteException {
+        // For UDFPS-only setups, ensure that the sensor does not start auth until after the
+        // BiometricPrompt UI is finished animating. Otherwise, the UDFPS affordance will be
+        // shown before the BiometricPrompt is shown.
+        setupFingerprint(0 /* id */, FingerprintSensorProperties.TYPE_UDFPS_OPTICAL);
+
+        final long operationId = 123;
+        final int userId = 10;
+        final int callingUid = 100;
+        final int callingPid = 1000;
+        final int callingUserId = 10000;
+
+        final AuthSession session = createAuthSession(mSensors,
+                false /* checkDevicePolicyManager */,
+                Authenticators.BIOMETRIC_STRONG,
+                operationId,
+                userId,
+                callingUid,
+                callingPid,
+                callingUserId);
+        assertEquals(mSensors.size(), session.mPreAuthInfo.eligibleSensors.size());
+
+        for (BiometricSensor sensor : session.mPreAuthInfo.eligibleSensors) {
+            assertEquals(BiometricSensor.STATE_UNKNOWN, sensor.getSensorState());
+            assertEquals(0, sensor.getCookie());
+        }
+
+        session.goToInitialState();
+
+        final int cookie1 = session.mPreAuthInfo.eligibleSensors.get(0).getCookie();
+        session.onCookieReceived(cookie1);
+        for (BiometricSensor sensor : session.mPreAuthInfo.eligibleSensors) {
+            if (cookie1 == sensor.getCookie()) {
+                assertEquals(BiometricSensor.STATE_COOKIE_RETURNED, sensor.getSensorState());
+            } else {
+                assertEquals(BiometricSensor.STATE_WAITING_FOR_COOKIE, sensor.getSensorState());
+            }
+        }
+        assertTrue(session.allCookiesReceived());
+
+        // UDFPS does not start even if all cookies are received
+        assertEquals(AuthSession.STATE_AUTH_STARTED, session.getState());
+        verify(mStatusBarService).showAuthenticationDialog(any(), any(), any(),
+                anyBoolean(), anyBoolean(), anyInt(), any(), anyLong());
+
+        // Notify AuthSession that the UI is shown. Then, UDFPS sensor should be started.
+        session.onDialogAnimatedIn();
+        assertEquals(AuthSession.STATE_AUTH_STARTED_UI_SHOWING, session.getState());
+        assertEquals(BiometricSensor.STATE_AUTHENTICATING,
+                session.mPreAuthInfo.eligibleSensors.get(0).getSensorState());
+
+    }
+
     private PreAuthInfo createPreAuthInfo(List<BiometricSensor> sensors, int userId,
             PromptInfo promptInfo, boolean checkDevicePolicyManager) throws RemoteException {
         return PreAuthInfo.create(mTrustManager,
@@ -197,11 +259,10 @@
 
         final PreAuthInfo preAuthInfo = createPreAuthInfo(sensors, userId, promptInfo,
                 checkDevicePolicyManager);
-
         return new AuthSession(mContext, mStatusBarService, mSysuiReceiver, mKeyStore,
                 mRandom, mClientDeathReceiver, preAuthInfo, mToken, operationId, userId,
                 mSensorReceiver, mClientReceiver, TEST_PACKAGE, promptInfo, callingUid,
-                callingPid, callingUserId, false /* debugEnabled */);
+                callingPid, callingUserId, false /* debugEnabled */, mFingerprintSensorProps);
     }
 
     private PromptInfo createPromptInfo(@Authenticators.Types int authenticators) {
@@ -210,8 +271,8 @@
         return promptInfo;
     }
 
-
-    private void setupFingerprint(int id) throws RemoteException {
+    private void setupFingerprint(int id, @FingerprintSensorProperties.SensorType int type)
+            throws RemoteException {
         IBiometricAuthenticator fingerprintAuthenticator = mock(IBiometricAuthenticator.class);
         when(fingerprintAuthenticator.isHardwareDetected(any())).thenReturn(true);
         when(fingerprintAuthenticator.hasEnrolledTemplates(anyInt(), any())).thenReturn(true);
@@ -229,6 +290,12 @@
                 return false; // fingerprint does not support confirmation
             }
         });
+
+        mFingerprintSensorProps.add(new FingerprintSensorPropertiesInternal(id,
+                SensorProperties.STRENGTH_STRONG,
+                5 /* maxEnrollmentsPerUser */,
+                type,
+                false /* resetLockoutRequiresHardwareAuthToken */));
     }
 
     private void setupFace(int id, boolean confirmationAlwaysRequired) throws RemoteException {
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java
index 3b60594..435c700 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java
@@ -1456,16 +1456,6 @@
                 mFingerprintAuthenticator);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void testRegistrationWithUnknownId_throwsIllegalStateException() throws Exception {
-        mBiometricService = new BiometricService(mContext, mInjector);
-        mBiometricService.onStart();
-
-        mBiometricService.mImpl.registerAuthenticator(
-                100 /* id */, 2 /* modality */, 15 /* strength */,
-                mFingerprintAuthenticator);
-    }
-
     @Test(expected = IllegalArgumentException.class)
     public void testRegistrationWithNullAuthenticator_throwsIllegalArgumentException()
             throws Exception {
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
index c890c52..24e7d7d 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
@@ -20,20 +20,27 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
 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.never;
 import static org.mockito.Mockito.verify;
 
 import android.content.Context;
+import android.hardware.biometrics.BiometricConstants;
 import android.hardware.biometrics.IBiometricService;
+import android.os.Binder;
+import android.os.IBinder;
 import android.platform.test.annotations.Presubmit;
 
 import androidx.annotation.NonNull;
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 
+import com.android.server.biometrics.sensors.BiometricScheduler.Operation;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
@@ -44,8 +51,10 @@
 public class BiometricSchedulerTest {
 
     private static final String TAG = "BiometricSchedulerTest";
+    private static final int TEST_SENSOR_ID = 1;
 
     private BiometricScheduler mScheduler;
+    private IBinder mToken;
 
     @Mock
     private Context mContext;
@@ -55,6 +64,7 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+        mToken = new Binder();
         mScheduler = new BiometricScheduler(TAG, null /* gestureAvailabilityTracker */,
                 mBiometricService);
     }
@@ -63,8 +73,8 @@
     public void testClientDuplicateFinish_ignoredBySchedulerAndDoesNotCrash() {
         final ClientMonitor.LazyDaemon<Object> nonNullDaemon = () -> mock(Object.class);
 
-        final ClientMonitor<Object> client1 = new TestClientMonitor(mContext, nonNullDaemon);
-        final ClientMonitor<Object> client2 = new TestClientMonitor(mContext, nonNullDaemon);
+        final ClientMonitor<Object> client1 = new TestClientMonitor(mContext, mToken, nonNullDaemon);
+        final ClientMonitor<Object> client2 = new TestClientMonitor(mContext, mToken, nonNullDaemon);
         mScheduler.scheduleClientMonitor(client1);
         mScheduler.scheduleClientMonitor(client2);
 
@@ -80,8 +90,8 @@
         final ClientMonitor.LazyDaemon<Object> lazyDaemon1 = () -> null;
         final ClientMonitor.LazyDaemon<Object> lazyDaemon2 = () -> daemon2;
 
-        final TestClientMonitor client1 = new TestClientMonitor(mContext, lazyDaemon1);
-        final TestClientMonitor client2 = new TestClientMonitor(mContext, lazyDaemon2);
+        final TestClientMonitor client1 = new TestClientMonitor(mContext, mToken, lazyDaemon1);
+        final TestClientMonitor client2 = new TestClientMonitor(mContext, mToken, lazyDaemon2);
 
         final ClientMonitor.Callback callback1 = mock(ClientMonitor.Callback.class);
         final ClientMonitor.Callback callback2 = mock(ClientMonitor.Callback.class);
@@ -110,16 +120,18 @@
     }
 
     @Test
-    public void testRemovesOnlyBiometricPromptOperation_whenNullHal() {
+    public void testRemovesOnlyBiometricPromptOperation_whenNullHal() throws Exception {
         // Second non-BiometricPrompt client has a valid daemon
         final Object daemon2 = mock(Object.class);
 
         final ClientMonitor.LazyDaemon<Object> lazyDaemon1 = () -> null;
         final ClientMonitor.LazyDaemon<Object> lazyDaemon2 = () -> daemon2;
 
-        final TestClientMonitor client1 =
-                new TestBiometricPromptClientMonitor(mContext, lazyDaemon1);
-        final TestClientMonitor client2 = new TestClientMonitor(mContext, lazyDaemon2);
+        final ClientMonitorCallbackConverter listener1 = mock(ClientMonitorCallbackConverter.class);
+
+        final BiometricPromptClientMonitor client1 =
+                new BiometricPromptClientMonitor(mContext, mToken, lazyDaemon1, listener1);
+        final TestClientMonitor client2 = new TestClientMonitor(mContext, mToken, lazyDaemon2);
 
         final ClientMonitor.Callback callback1 = mock(ClientMonitor.Callback.class);
         final ClientMonitor.Callback callback2 = mock(ClientMonitor.Callback.class);
@@ -139,8 +151,10 @@
         // Simulate that the BiometricPrompt client's sensor is ready
         mScheduler.startPreparedClient(client1.getCookie());
 
-        assertTrue(client1.wasUnableToStart());
-        verify(callback1).onClientFinished(eq(client1), eq(false) /* success */);
+        // Client 1 cleans up properly
+        verify(listener1).onError(eq(TEST_SENSOR_ID), anyInt(),
+                eq(BiometricConstants.BIOMETRIC_ERROR_CANCELED), eq(0));
+        verify(callback1).onClientFinished(eq(client1), eq(true) /* success */);
         verify(callback1, never()).onClientStarted(any());
 
         // Client 2 was able to start
@@ -149,10 +163,45 @@
         verify(callback2).onClientStarted(eq(client2));
     }
 
-    private static class TestBiometricPromptClientMonitor extends TestClientMonitor {
-        public TestBiometricPromptClientMonitor(@NonNull Context context,
-                @NonNull LazyDaemon<Object> lazyDaemon) {
-            super(context, lazyDaemon, 1 /* cookie */);
+    @Test
+    public void testCancelNotInvoked_whenOperationWaitingForCookie() {
+        final ClientMonitor.LazyDaemon<Object> lazyDaemon1 = () -> mock(Object.class);
+        final BiometricPromptClientMonitor client1 = new BiometricPromptClientMonitor(mContext,
+                mToken, lazyDaemon1, mock(ClientMonitorCallbackConverter.class));
+        final ClientMonitor.Callback callback1 = mock(ClientMonitor.Callback.class);
+
+        // Schedule a BiometricPrompt authentication request
+        mScheduler.scheduleClientMonitor(client1, callback1);
+
+        assertEquals(Operation.STATE_WAITING_FOR_COOKIE, mScheduler.mCurrentOperation.state);
+        assertEquals(client1, mScheduler.mCurrentOperation.clientMonitor);
+        assertEquals(0, mScheduler.mPendingOperations.size());
+
+        // Request it to be canceled. The operation can be canceled immediately, and the scheduler
+        // should go back to idle, since in this case the framework has not even requested the HAL
+        // to authenticate yet.
+        mScheduler.cancelAuthentication(mToken);
+        assertNull(mScheduler.mCurrentOperation);
+    }
+
+    private static class BiometricPromptClientMonitor extends AuthenticationClient<Object> {
+
+        public BiometricPromptClientMonitor(@NonNull Context context, @NonNull IBinder token,
+                @NonNull LazyDaemon<Object> lazyDaemon, ClientMonitorCallbackConverter listener) {
+            super(context, lazyDaemon, token, listener, 0 /* targetUserId */, 0 /* operationId */,
+                    false /* restricted */, TAG, 1 /* cookie */, false /* requireConfirmation */,
+                    TEST_SENSOR_ID, true /* isStrongBiometric */, 0 /* statsModality */,
+                    0 /* statsClient */, null /* taskStackListener */, mock(LockoutTracker.class));
+        }
+
+        @Override
+        protected void stopHalOperation() {
+
+        }
+
+        @Override
+        protected void startHalOperation() {
+
         }
     }
 
@@ -160,16 +209,15 @@
         private boolean mUnableToStart;
         private boolean mStarted;
 
-        public TestClientMonitor(@NonNull Context context, @NonNull LazyDaemon<Object> lazyDaemon) {
-            super(context, lazyDaemon, null /* token */, null /* listener */, 0 /* userId */,
-                    TAG, 0 /* cookie */, 0 /* sensorId */, 0 /* statsModality */,
-                    0 /* statsAction */, 0 /* statsClient */);
+        public TestClientMonitor(@NonNull Context context, @NonNull IBinder token,
+                @NonNull LazyDaemon<Object> lazyDaemon) {
+            this(context, token, lazyDaemon, 0 /* cookie */);
         }
 
-        public TestClientMonitor(@NonNull Context context, @NonNull LazyDaemon<Object> lazyDaemon,
-                int cookie) {
-            super(context, lazyDaemon, null /* token */, null /* listener */, 0 /* userId */,
-                    TAG, cookie, 0 /* sensorId */, 0 /* statsModality */,
+        public TestClientMonitor(@NonNull Context context, @NonNull IBinder token,
+                @NonNull LazyDaemon<Object> lazyDaemon, int cookie) {
+            super(context, lazyDaemon, token /* token */, null /* listener */, 0 /* userId */,
+                    TAG, cookie, TEST_SENSOR_ID, 0 /* statsModality */,
                     0 /* statsAction */, 0 /* statsClient */);
         }
 
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/Face10Test.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/Face10Test.java
index b0f7b0c..35fc7f0 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/Face10Test.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/Face10Test.java
@@ -16,22 +16,28 @@
 
 package com.android.server.biometrics.sensors.face;
 
+import static org.mockito.Mockito.when;
+
 import android.content.Context;
 import android.hardware.biometrics.BiometricManager;
 import android.os.Binder;
 import android.os.IBinder;
+import android.os.UserManager;
 import android.platform.test.annotations.Presubmit;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 
 import com.android.server.biometrics.sensors.LockoutResetDispatcher;
+import com.android.server.biometrics.sensors.face.hidl.Face10;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.ArrayList;
+
 @Presubmit
 @SmallTest
 public class Face10Test {
@@ -41,6 +47,8 @@
 
     @Mock
     private Context mContext;
+    @Mock
+    private UserManager mUserManager;
 
     private LockoutResetDispatcher mLockoutResetDispatcher;
     private com.android.server.biometrics.sensors.face.hidl.Face10 mFace10;
@@ -54,10 +62,13 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        when(mUserManager.getAliveUsers()).thenReturn(new ArrayList<>());
+
         mLockoutResetDispatcher = new LockoutResetDispatcher(mContext);
-        mFace10 = new com.android.server.biometrics.sensors.face.hidl.Face10(mContext, SENSOR_ID,
-                BiometricManager.Authenticators.BIOMETRIC_STRONG, mLockoutResetDispatcher,
-                false /* supportsSelfIllumination */, 1 /* maxTemplatesAllowed */);
+        mFace10 = new Face10(mContext, SENSOR_ID, BiometricManager.Authenticators.BIOMETRIC_STRONG,
+                mLockoutResetDispatcher, false /* supportsSelfIllumination */,
+                1 /* maxTemplatesAllowed */);
         mBinder = new Binder();
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index 77e1676..c0c82d5 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -25,6 +25,7 @@
 import static android.app.admin.DevicePolicyManager.ID_TYPE_MEID;
 import static android.app.admin.DevicePolicyManager.ID_TYPE_SERIAL;
 import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_HIGH;
+import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_LOW;
 import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_MEDIUM;
 import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;
 import static android.app.admin.DevicePolicyManager.WIPE_EUICC;
@@ -6690,6 +6691,140 @@
                 .isEqualTo(DevicePolicyManager.PERSONAL_APPS_SUSPENDED_PROFILE_TIMEOUT);
     }
 
+    @Test
+    public void testSetRequiredPasswordComplexity_UnauthorizedCallersOnDO() throws Exception {
+        mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
+        setupDeviceOwner();
+        // DO must be able to set it.
+        dpm.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_LOW);
+        // But not on the parent DPM.
+        assertExpectException(IllegalArgumentException.class, null,
+                () -> parentDpm.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_LOW));
+        // Another package must not be allowed to set password complexity.
+        mContext.binder.callingUid = DpmMockContext.ANOTHER_UID;
+        assertExpectException(SecurityException.class, null,
+                () -> dpm.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_LOW));
+    }
+
+    @Test
+    public void testSetRequiredPasswordComplexity_UnauthorizedCallersOnPO() throws Exception {
+        mContext.binder.callingUid = DpmMockContext.CALLER_UID;
+        setupProfileOwner();
+        // PO must be able to set it.
+        dpm.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_LOW);
+        // And on the parent profile DPM instance.
+        parentDpm.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_LOW);
+        // Another package must not be allowed to set password complexity.
+        mContext.binder.callingUid = DpmMockContext.ANOTHER_UID;
+        assertExpectException(SecurityException.class, null,
+                () -> dpm.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_LOW));
+    }
+
+    @Test
+    public void testSetRequiredPasswordComplexity_validValuesOnly() throws Exception {
+        mContext.binder.callingUid = DpmMockContext.CALLER_UID;
+        setupProfileOwner();
+
+        // Cannot set value other than password_complexity none/low/medium/high
+        assertExpectException(IllegalArgumentException.class, null, () ->
+                dpm.setRequiredPasswordComplexity(-1));
+        assertExpectException(IllegalArgumentException.class, null, () ->
+                dpm.setRequiredPasswordComplexity(7));
+        assertExpectException(IllegalArgumentException.class, null, () ->
+                dpm.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_HIGH + 1));
+
+        final Set<Integer> allowedModes = Set.of(PASSWORD_COMPLEXITY_NONE, PASSWORD_COMPLEXITY_LOW,
+                PASSWORD_COMPLEXITY_MEDIUM, PASSWORD_COMPLEXITY_HIGH);
+        for (int complexity : allowedModes) {
+            // Ensure exception is not thrown.
+            dpm.setRequiredPasswordComplexity(complexity);
+        }
+    }
+
+    @Test
+    public void testSetRequiredPasswordComplexity_setAndGet() throws Exception {
+        mContext.binder.callingUid = DpmMockContext.CALLER_UID;
+        setupProfileOwner();
+
+        final Set<Integer> allowedModes = Set.of(PASSWORD_COMPLEXITY_NONE, PASSWORD_COMPLEXITY_LOW,
+                PASSWORD_COMPLEXITY_MEDIUM, PASSWORD_COMPLEXITY_HIGH);
+        for (int complexity : allowedModes) {
+            dpm.setRequiredPasswordComplexity(complexity);
+            assertThat(dpm.getRequiredPasswordComplexity()).isEqualTo(complexity);
+        }
+    }
+
+    @Test
+    public void testSetRequiredPasswordComplexityOnParent_setAndGet() throws Exception {
+        final int managedProfileUserId = 15;
+        final int managedProfileAdminUid = UserHandle.getUid(managedProfileUserId, 19436);
+
+        addManagedProfile(admin1, managedProfileAdminUid, admin1);
+        mContext.binder.callingUid = managedProfileAdminUid;
+
+        final Set<Integer> allowedModes = Set.of(PASSWORD_COMPLEXITY_NONE, PASSWORD_COMPLEXITY_LOW,
+                PASSWORD_COMPLEXITY_MEDIUM, PASSWORD_COMPLEXITY_HIGH);
+        for (int complexity : allowedModes) {
+            dpm.getParentProfileInstance(admin1).setRequiredPasswordComplexity(complexity);
+            assertThat(dpm.getParentProfileInstance(admin1).getRequiredPasswordComplexity())
+                    .isEqualTo(complexity);
+            assertThat(dpm.getRequiredPasswordComplexity()).isEqualTo(PASSWORD_COMPLEXITY_NONE);
+        }
+    }
+
+    @Test
+    public void testSetRequiredPasswordComplexity_isSufficient() throws Exception {
+        mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
+        mContext.packageName = admin1.getPackageName();
+        setupDeviceOwner();
+
+        dpm.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_HIGH);
+        assertThat(dpm.getRequiredPasswordComplexity()).isEqualTo(PASSWORD_COMPLEXITY_HIGH);
+        when(getServices().packageManager.getPackagesForUid(
+                DpmMockContext.CALLER_SYSTEM_USER_UID)).thenReturn(new String[0]);
+        mServiceContext.permissions.add(permission.REQUEST_PASSWORD_COMPLEXITY);
+        assertThat(dpm.getPasswordComplexity()).isEqualTo(PASSWORD_COMPLEXITY_NONE);
+
+        reset(mContext.spiedContext);
+        PasswordMetrics passwordMetricsNoSymbols = computeForPassword("1234".getBytes());
+        setActivePasswordState(passwordMetricsNoSymbols);
+        assertThat(dpm.getPasswordComplexity()).isEqualTo(PASSWORD_COMPLEXITY_LOW);
+        assertThat(dpm.isActivePasswordSufficient()).isFalse();
+
+        reset(mContext.spiedContext);
+        passwordMetricsNoSymbols = computeForPassword("84125312943a".getBytes());
+        setActivePasswordState(passwordMetricsNoSymbols);
+        assertThat(dpm.getPasswordComplexity()).isEqualTo(PASSWORD_COMPLEXITY_HIGH);
+        // using isActivePasswordSufficient
+        assertThat(dpm.isActivePasswordSufficient()).isTrue();
+    }
+
+    @Test
+    public void testSetRequiredPasswordComplexity_resetBySettingQuality() throws Exception {
+        mContext.binder.callingUid = DpmMockContext.CALLER_UID;
+        setupProfileOwner();
+
+        // Test that calling setPasswordQuality resets complexity to none.
+        dpm.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_HIGH);
+        assertThat(dpm.getRequiredPasswordComplexity()).isEqualTo(PASSWORD_COMPLEXITY_HIGH);
+        dpm.setPasswordQuality(admin1, DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX);
+        assertThat(dpm.getRequiredPasswordComplexity()).isEqualTo(PASSWORD_COMPLEXITY_NONE);
+    }
+
+    @Test
+    public void testSetRequiredPasswordComplexity_overridesQuality() throws Exception {
+        mContext.binder.callingUid = DpmMockContext.CALLER_UID;
+        setupProfileOwner();
+
+        // Test that calling setRequiredPasswordComplexity resets password quality.
+        dpm.setPasswordQuality(admin1, DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX);
+        assertThat(dpm.getPasswordQuality(admin1)).isEqualTo(
+                DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX);
+        dpm.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_HIGH);
+        assertThat(dpm.getPasswordQuality(admin1)).isEqualTo(
+                DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
+    }
+
     private void setUserUnlocked(int userHandle, boolean unlocked) {
         when(getServices().userManager.isUserUnlocked(eq(userHandle))).thenReturn(unlocked);
     }
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 52899fa..227e8c7 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java
@@ -50,6 +50,15 @@
                     + "    </allowed-values>"
                     + "    <default-value string-value=\"to_tv\" />"
                     + "  </setting>"
+                    + "  <setting name=\"power_state_change_on_active_source_lost\""
+                    + "           value-type=\"string\""
+                    + "           user-configurable=\"true\">"
+                    + "    <allowed-values>"
+                    + "      <value string-value=\"none\" />"
+                    + "      <value string-value=\"standby_now\" />"
+                    + "    </allowed-values>"
+                    + "    <default-value string-value=\"none\" />"
+                    + "  </setting>"
                     + "  <setting name=\"hdmi_cec_version\""
                     + "           value-type=\"int\""
                     + "           user-configurable=\"true\">"
@@ -59,10 +68,19 @@
                     + "    </allowed-values>"
                     + "    <default-value int-value=\"0x05\" />"
                     + "  </setting>"
+                    + "  <setting name=\"system_audio_mode_muting\""
+                    + "           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) {
-        super(context, new StorageAdapter(), parseFromString(SYSTEM_CONFIG_XML), null);
+        super(context, new StorageAdapter(context), parseFromString(SYSTEM_CONFIG_XML), null);
     }
 
     private static CecSettings parseFromString(@NonNull String configXml) {
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java
index dd74f22..d10e075 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java
@@ -27,7 +27,6 @@
 import android.hardware.hdmi.HdmiControlManager;
 import android.platform.test.annotations.Presubmit;
 import android.provider.Settings.Global;
-import android.sysprop.HdmiProperties;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
@@ -609,7 +608,7 @@
 
     @Test
     public void getStringValue_GlobalSetting_BasicSanity() {
-        when(mStorageAdapter.retrieveGlobalSetting(mContext,
+        when(mStorageAdapter.retrieveGlobalSetting(
                   Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
                   HdmiControlManager.SEND_STANDBY_ON_SLEEP_TO_TV))
             .thenReturn(HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST);
@@ -634,20 +633,19 @@
     }
 
     @Test
-    public void getStringValue_SystemProperty_BasicSanity() {
-        when(mStorageAdapter.retrieveSystemProperty(
-                  HdmiCecConfig.SYSPROP_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
-                  HdmiProperties.power_state_change_on_active_source_lost_values
-                      .NONE.name().toLowerCase()))
-                .thenReturn(HdmiProperties.power_state_change_on_active_source_lost_values
-                       .STANDBY_NOW.name().toLowerCase());
+    public void getStringValue_SharedPref_BasicSanity() {
+        when(mStorageAdapter.retrieveSharedPref(
+                  HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                  HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE))
+                .thenReturn(
+                        HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
         HdmiCecConfig hdmiCecConfig = HdmiCecConfig.createFromStrings(
                 mContext, mStorageAdapter,
                 "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"
                 + "<cec-settings>"
                 + "  <setting name=\"power_state_change_on_active_source_lost\""
                 + "           value-type=\"string\""
-                + "           user-configurable=\"false\">"
+                + "           user-configurable=\"true\">"
                 + "    <allowed-values>"
                 + "      <value string-value=\"none\" />"
                 + "      <value string-value=\"standby_now\" />"
@@ -657,8 +655,7 @@
                 + "</cec-settings>", null);
         assertThat(hdmiCecConfig.getStringValue(
                     HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST))
-                .isEqualTo(HdmiProperties.power_state_change_on_active_source_lost_values
-                        .STANDBY_NOW.name().toLowerCase());
+                .isEqualTo(HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
     }
 
     @Test
@@ -704,7 +701,7 @@
 
     @Test
     public void getIntValue_GlobalSetting_BasicSanity() {
-        when(mStorageAdapter.retrieveGlobalSetting(mContext,
+        when(mStorageAdapter.retrieveGlobalSetting(
                   Global.HDMI_CONTROL_ENABLED,
                   Integer.toString(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED)))
             .thenReturn(Integer.toString(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED));
@@ -729,7 +726,7 @@
 
     @Test
     public void getIntValue_GlobalSetting_HexValue() {
-        when(mStorageAdapter.retrieveGlobalSetting(mContext,
+        when(mStorageAdapter.retrieveGlobalSetting(
                   Global.HDMI_CONTROL_ENABLED,
                   Integer.toHexString(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED)))
             .thenReturn(Integer.toString(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED));
@@ -753,9 +750,9 @@
     }
 
     @Test
-    public void getIntValue_SystemProperty_BasicSanity() {
-        when(mStorageAdapter.retrieveSystemProperty(
-                  HdmiCecConfig.SYSPROP_SYSTEM_AUDIO_MODE_MUTING,
+    public void getIntValue_SharedPref_BasicSanity() {
+        when(mStorageAdapter.retrieveSharedPref(
+                  HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
                   Integer.toString(HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_ENABLED)))
                 .thenReturn(Integer.toString(HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED));
         HdmiCecConfig hdmiCecConfig = HdmiCecConfig.createFromStrings(
@@ -861,13 +858,13 @@
                 + "</cec-settings>", null);
         hdmiCecConfig.setStringValue(HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP,
                                HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST);
-        verify(mStorageAdapter).storeGlobalSetting(mContext,
+        verify(mStorageAdapter).storeGlobalSetting(
                   Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
                   HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST);
     }
 
     @Test
-    public void setStringValue_SystemProperty_BasicSanity() {
+    public void setStringValue_SharedPref_BasicSanity() {
         HdmiCecConfig hdmiCecConfig = HdmiCecConfig.createFromStrings(
                 mContext, mStorageAdapter,
                 "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"
@@ -884,12 +881,10 @@
                 + "</cec-settings>", null);
         hdmiCecConfig.setStringValue(
                   HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
-                  HdmiProperties.power_state_change_on_active_source_lost_values
-                      .STANDBY_NOW.name().toLowerCase());
-        verify(mStorageAdapter).storeSystemProperty(
-                  HdmiCecConfig.SYSPROP_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
-                  HdmiProperties.power_state_change_on_active_source_lost_values
-                      .STANDBY_NOW.name().toLowerCase());
+                  HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
+        verify(mStorageAdapter).storeSharedPref(
+                  HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                  HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
     }
 
     @Test
@@ -973,7 +968,7 @@
                 + "</cec-settings>", null);
         hdmiCecConfig.setIntValue(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
                                   HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
-        verify(mStorageAdapter).storeGlobalSetting(mContext,
+        verify(mStorageAdapter).storeGlobalSetting(
                   Global.HDMI_CONTROL_ENABLED,
                   Integer.toString(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED));
     }
@@ -996,13 +991,13 @@
                 + "</cec-settings>", null);
         hdmiCecConfig.setIntValue(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
                                   HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
-        verify(mStorageAdapter).storeGlobalSetting(mContext,
+        verify(mStorageAdapter).storeGlobalSetting(
                   Global.HDMI_CONTROL_ENABLED,
                   Integer.toString(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED));
     }
 
     @Test
-    public void setIntValue_SystemProperty_BasicSanity() {
+    public void setIntValue_SharedPref_BasicSanity() {
         HdmiCecConfig hdmiCecConfig = HdmiCecConfig.createFromStrings(
                 mContext, mStorageAdapter,
                 "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"
@@ -1020,8 +1015,8 @@
         hdmiCecConfig.setIntValue(
                 HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
                 HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED);
-        verify(mStorageAdapter).storeSystemProperty(
-                HdmiCecConfig.SYSPROP_SYSTEM_AUDIO_MODE_MUTING,
+        verify(mStorageAdapter).storeSharedPref(
+                HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
                 Integer.toString(HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED));
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
index 2553094..3fd3ce3 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
@@ -27,6 +27,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Context;
+import android.hardware.hdmi.HdmiControlManager;
 import android.hardware.hdmi.HdmiDeviceInfo;
 import android.hardware.hdmi.HdmiPortInfo;
 import android.hardware.hdmi.IHdmiControlCallback;
@@ -452,6 +453,39 @@
     }
 
     @Test
+    public void systemAudioModeMuting_enabled() {
+        mHdmiControlService.getHdmiCecConfig().setIntValue(
+                HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
+                HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_ENABLED);
+        mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(true);
+        assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isTrue();
+        assertThat(mHdmiControlService.getAudioManager().isStreamMute(
+                AudioManager.STREAM_MUSIC)).isFalse();
+        mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(false);
+        assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isFalse();
+        assertThat(mHdmiControlService.getAudioManager().isStreamMute(
+                AudioManager.STREAM_MUSIC)).isTrue();
+    }
+
+    @Test
+    public void systemAudioModeMuting_disabled() {
+        mHdmiControlService.getHdmiCecConfig().setIntValue(
+                HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
+                HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED);
+        mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(true);
+        assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isTrue();
+        assertThat(mHdmiControlService.getAudioManager().isStreamMute(
+                AudioManager.STREAM_MUSIC)).isFalse();
+        mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(false);
+        assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isFalse();
+        assertThat(mHdmiControlService.getAudioManager().isStreamMute(
+                AudioManager.STREAM_MUSIC)).isFalse();
+        mHdmiControlService.getHdmiCecConfig().setIntValue(
+                HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
+                HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_ENABLED);
+    }
+
+    @Test
     public void terminateSystemAudioMode_systemAudioModeOff() throws Exception {
         mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(false);
         assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isFalse();
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 9646b5d..cdb49ad 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
@@ -35,7 +35,6 @@
 import android.os.PowerManager;
 import android.os.test.TestLooper;
 import android.platform.test.annotations.Presubmit;
-import android.provider.Settings.Global;
 import android.sysprop.HdmiProperties;
 import android.view.KeyEvent;
 
@@ -116,16 +115,16 @@
                         return false;
                     }
 
-                @Override
-                PowerManager getPowerManager() {
-                    return powerManager;
-                }
+                    @Override
+                    PowerManager getPowerManager() {
+                        return powerManager;
+                    }
 
-                @Override
-                HdmiCecConfig getHdmiCecConfig() {
-                    return hdmiCecConfig;
-                }
-            };
+                    @Override
+                    HdmiCecConfig getHdmiCecConfig() {
+                        return hdmiCecConfig;
+                    }
+                };
 
         mHdmiCecLocalDevicePlayback = new HdmiCecLocalDevicePlayback(mHdmiControlService);
         mHdmiCecLocalDevicePlayback.init();
@@ -283,8 +282,9 @@
 
     @Test
     public void handleRoutingChange_otherDevice_None() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
         mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -301,8 +301,9 @@
 
     @Test
     public void handleRoutingChange_sameDevice_None_ActiveSource() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
         mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -320,8 +321,9 @@
 
     @Test
     public void handleRoutingChange_sameDevice_None_InactiveSource() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
         mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                 "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -339,8 +341,9 @@
 
     @Test
     public void handleRoutingChange_otherDevice_StandbyNow() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
         mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -353,8 +356,9 @@
 
     @Test
     public void handleRoutingChange_otherDevice_StandbyNow_InactiveSource() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
         mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                 "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -367,8 +371,9 @@
 
     @Test
     public void handleRoutingChange_sameDevice_StandbyNow_ActiveSource() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
         mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -382,8 +387,9 @@
 
     @Test
     public void handleRoutingInformation_otherDevice_None() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
         mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -399,8 +405,9 @@
 
     @Test
     public void handleRoutingInformation_sameDevice_None_ActiveSource() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
         mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -418,8 +425,9 @@
 
     @Test
     public void handleRoutingInformation_sameDevice_None_InactiveSource() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
         mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                 "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -437,8 +445,9 @@
 
     @Test
     public void handleRoutingInformation_otherDevice_StandbyNow() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
         mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -451,8 +460,9 @@
 
     @Test
     public void handleRoutingInformation_otherDevice_StandbyNow_InactiveSource() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
         mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                 "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -465,8 +475,9 @@
 
     @Test
     public void handleRoutingInformation_sameDevice_StandbyNow_ActiveSource() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
         mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -536,8 +547,8 @@
 
     @Test
     public void handleOnStandby_ScreenOff_NotActiveSource_ToTv() {
-        mHdmiCecLocalDevicePlayback.mService.writeStringSetting(
-                Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP,
                 HdmiControlManager.SEND_STANDBY_ON_SLEEP_TO_TV);
         mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                 "HdmiCecLocalDevicePlaybackTest");
@@ -556,8 +567,8 @@
 
     @Test
     public void handleOnStandby_ScreenOff_NotActiveSource_Broadcast() {
-        mHdmiCecLocalDevicePlayback.mService.writeStringSetting(
-                Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP,
                 HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST);
         mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                 "HdmiCecLocalDevicePlaybackTest");
@@ -576,8 +587,8 @@
 
     @Test
     public void handleOnStandby_ScreenOff_NotActiveSource_None() {
-        mHdmiCecLocalDevicePlayback.mService.writeStringSetting(
-                Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP,
                 HdmiControlManager.SEND_STANDBY_ON_SLEEP_NONE);
         mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                 "HdmiCecLocalDevicePlaybackTest");
@@ -596,8 +607,8 @@
 
     @Test
     public void handleOnStandby_ScreenOff_ActiveSource_ToTv() {
-        mHdmiCecLocalDevicePlayback.mService.writeStringSetting(
-                Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP,
                 HdmiControlManager.SEND_STANDBY_ON_SLEEP_TO_TV);
         mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
@@ -616,8 +627,8 @@
 
     @Test
     public void handleOnStandby_ScreenOff_ActiveSource_Broadcast() {
-        mHdmiCecLocalDevicePlayback.mService.writeStringSetting(
-                Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP,
                 HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST);
         mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
@@ -636,8 +647,8 @@
 
     @Test
     public void handleOnStandby_ScreenOff_ActiveSource_None() {
-        mHdmiCecLocalDevicePlayback.mService.writeStringSetting(
-                Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP,
                 HdmiControlManager.SEND_STANDBY_ON_SLEEP_NONE);
         mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
@@ -741,8 +752,9 @@
 
     @Test
     public void handleActiveSource_ActiveSource_None() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
         mStandby = false;
         HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress);
@@ -758,8 +770,9 @@
 
     @Test
     public void handleActiveSource_notActiveSource_None() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
         mStandby = false;
         HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
         assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue();
@@ -774,8 +787,9 @@
 
     @Test
     public void handleActiveSource_ActiveSource_StandbyNow() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
         mStandby = false;
         HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress);
@@ -787,8 +801,9 @@
 
     @Test
     public void handleActiveSource_notActiveSource_StandbyNow() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
         mStandby = false;
         HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
         assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue();
@@ -1027,8 +1042,9 @@
 
     @Test
     public void handleSetStreamPath_otherDevice_None() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.NONE;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
         mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -1045,8 +1061,9 @@
 
     @Test
     public void handleSetStreamPath_otherDevice_StandbyNow() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
         mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
                 mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -1059,8 +1076,9 @@
 
     @Test
     public void handleSetStreamPath_otherDevice_StandbyNow_InactiveSource() {
-        mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost =
-                HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW;
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
         mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
                 "HdmiCecLocalDevicePlaybackTest");
         mStandby = false;
@@ -1073,8 +1091,8 @@
 
     @Test
     public void oneTouchPlay_SendStandbyOnSleepToTv() {
-        mHdmiCecLocalDevicePlayback.mService.writeStringSetting(
-                Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP,
                 HdmiControlManager.SEND_STANDBY_ON_SLEEP_TO_TV);
         mHdmiControlService.oneTouchPlay(new IHdmiControlCallback.Stub() {
             @Override
@@ -1096,8 +1114,8 @@
 
     @Test
     public void oneTouchPlay_SendStandbyOnSleepBroadcast() {
-        mHdmiCecLocalDevicePlayback.mService.writeStringSetting(
-                Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP,
                 HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST);
         mHdmiControlService.oneTouchPlay(new IHdmiControlCallback.Stub() {
             @Override
@@ -1119,8 +1137,8 @@
 
     @Test
     public void oneTouchPlay_SendStandbyOnSleepNone() {
-        mHdmiCecLocalDevicePlayback.mService.writeStringSetting(
-                Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP,
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_SEND_STANDBY_ON_SLEEP,
                 HdmiControlManager.SEND_STANDBY_ON_SLEEP_NONE);
         mHdmiControlService.oneTouchPlay(new IHdmiControlCallback.Stub() {
             @Override
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java
index 6882ec1..6f62014 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java
@@ -18,6 +18,7 @@
 import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
 import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1;
 import static com.android.server.hdmi.Constants.ADDR_TV;
+import static com.android.server.hdmi.HdmiUtils.buildMessage;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -183,21 +184,4 @@
 
         assertThat(message).isEqualTo(buildMessage("0F:A6:06:10:4A:10"));
     }
-
-    /**
-     * Build a CEC message from a hex byte string with bytes separated by {@code :}.
-     *
-     * <p>This format is used by both cec-client and www.cec-o-matic.com
-     */
-    private static HdmiCecMessage buildMessage(String message) {
-        String[] parts = message.split(":");
-        int src = Integer.parseInt(parts[0].substring(0, 1), 16);
-        int dest = Integer.parseInt(parts[0].substring(1, 2), 16);
-        int opcode = Integer.parseInt(parts[1], 16);
-        byte[] params = new byte[parts.length - 2];
-        for (int i = 0; i < params.length; i++) {
-            params[i] = (byte) Integer.parseInt(parts[i + 2], 16);
-        }
-        return new HdmiCecMessage(src, dest, opcode, params);
-    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
index 0e9f01a..f3a4366 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
@@ -513,23 +513,6 @@
     }
 
     private IntegerSubject assertMessageValidity(String message) {
-        return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message)));
-    }
-
-    /**
-     * Build a CEC message from a hex byte string with bytes separated by {@code :}.
-     *
-     * <p>This format is used by both cec-client and www.cec-o-matic.com
-     */
-    private static HdmiCecMessage buildMessage(String message) {
-        String[] parts = message.split(":");
-        int src = Integer.parseInt(parts[0].substring(0, 1), 16);
-        int dest = Integer.parseInt(parts[0].substring(1, 2), 16);
-        int opcode = Integer.parseInt(parts[1], 16);
-        byte[] params = new byte[parts.length - 2];
-        for (int i = 0; i < params.length; i++) {
-            params[i] = (byte) Integer.parseInt(parts[i + 2], 16);
-        }
-        return new HdmiCecMessage(src, dest, opcode, params);
+        return assertThat(mHdmiCecMessageValidator.isValid(HdmiUtils.buildMessage(message)));
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiUtilsTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiUtilsTest.java
index dbf3b53..5316ef6 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiUtilsTest.java
@@ -19,6 +19,7 @@
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.testng.Assert.assertThrows;
 
 import android.hardware.hdmi.HdmiControlManager;
 import android.hardware.hdmi.HdmiDeviceInfo;
@@ -614,4 +615,51 @@
         assertThat(HdmiUtils.isEligibleAddressForCecVersion(HdmiControlManager.HDMI_CEC_VERSION_2_0,
                 Constants.ADDR_SPECIFIC_USE)).isTrue();
     }
+
+    @Test
+    public void testBuildMessage_validation() {
+        assertThrows(IllegalArgumentException.class, () -> HdmiUtils.buildMessage("04"));
+        assertThrows(IllegalArgumentException.class, () -> HdmiUtils.buildMessage("041"));
+        assertThrows(IllegalArgumentException.class, () -> HdmiUtils.buildMessage("041:00"));
+        assertThrows(IllegalArgumentException.class, () -> HdmiUtils.buildMessage("04:000"));
+        assertThrows(IllegalArgumentException.class, () -> HdmiUtils.buildMessage("04:00:000"));
+        assertThrows(IllegalArgumentException.class, () -> HdmiUtils.buildMessage("04:00:00:000"));
+
+        assertThrows(NumberFormatException.class, () -> HdmiUtils.buildMessage("G0:00"));
+        assertThrows(NumberFormatException.class, () -> HdmiUtils.buildMessage("0G:00"));
+        assertThrows(NumberFormatException.class, () -> HdmiUtils.buildMessage("04:G0"));
+        assertThrows(NumberFormatException.class, () -> HdmiUtils.buildMessage("04:00:G0"));
+        assertThrows(NumberFormatException.class, () -> HdmiUtils.buildMessage("04:00:0G"));
+    }
+
+    @Test
+    public void testBuildMessage_source() {
+        assertThat(HdmiUtils.buildMessage("04:00").getSource()).isEqualTo(Constants.ADDR_TV);
+        assertThat(HdmiUtils.buildMessage("40:00").getSource()).isEqualTo(
+                Constants.ADDR_PLAYBACK_1);
+    }
+
+    @Test
+    public void testBuildMessage_destination() {
+        assertThat(HdmiUtils.buildMessage("04:00").getDestination()).isEqualTo(
+                Constants.ADDR_PLAYBACK_1);
+        assertThat(HdmiUtils.buildMessage("40:00").getDestination()).isEqualTo(Constants.ADDR_TV);
+    }
+
+    @Test
+    public void testBuildMessage_opcode() {
+        assertThat(HdmiUtils.buildMessage("04:00").getOpcode()).isEqualTo(
+                Constants.MESSAGE_FEATURE_ABORT);
+        assertThat(HdmiUtils.buildMessage("04:36").getOpcode()).isEqualTo(
+                Constants.MESSAGE_STANDBY);
+        assertThat(HdmiUtils.buildMessage("04:FF").getOpcode()).isEqualTo(
+                Integer.parseInt("FF", 16));
+    }
+
+    @Test
+    public void testBuildMessage_params() {
+        assertThat(HdmiUtils.buildMessage("04:00:00").getParams()).isEqualTo(new byte[]{0x00});
+        assertThat(HdmiUtils.buildMessage("40:32:65:6E:67").getParams()).isEqualTo(
+                new byte[]{0x65, 0x6E, 0x67});
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java
index 4a6e11b..bbb83b6 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java
@@ -27,12 +27,13 @@
 import android.platform.test.annotations.Presubmit;
 import android.util.AtomicFile;
 import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.internal.os.BackgroundThread;
-import com.android.internal.util.FastXmlSerializer;
 
 import libcore.io.IoUtils;
 
@@ -43,16 +44,13 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -200,8 +198,7 @@
         try {
             fos = mSessionsFile.startWrite();
 
-            XmlSerializer out = new FastXmlSerializer();
-            out.setOutput(fos, StandardCharsets.UTF_8.name());
+            TypedXmlSerializer out = Xml.resolveSerializer(fos);
             out.startDocument(null, true);
             out.startTag(null, TAG_SESSIONS);
             for (PackageInstallerSession session : sessions) {
@@ -227,8 +224,7 @@
         FileInputStream fis = null;
         try {
             fis = mSessionsFile.openRead();
-            final XmlPullParser in = Xml.newPullParser();
-            in.setInput(fis, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser in = Xml.resolvePullParser(fis);
 
             int type;
             while ((type = in.next()) != END_DOCUMENT) {
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageSignaturesTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageSignaturesTest.java
index 7108490..89c3d50 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageSignaturesTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageSignaturesTest.java
@@ -24,6 +24,7 @@
 import android.content.Context;
 import android.content.pm.PackageParser;
 import android.content.pm.Signature;
+import android.util.TypedXmlPullParser;
 import android.util.Xml;
 
 import androidx.test.InstrumentationRegistry;
@@ -38,7 +39,6 @@
 
 import java.io.File;
 import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -137,7 +137,7 @@
         // first call to readXml should return the list with the expected signature, then the second
         // call should reference this signature and complete successfully with no new entries in the
         // List.
-        XmlPullParser parser = getXMLFromResources("xml/one-signer.xml");
+        TypedXmlPullParser parser = getXMLFromResources("xml/one-signer.xml");
         ArrayList<Signature> signatures = new ArrayList<>();
         mPackageSetting.signatures.readXml(parser, signatures);
         Set<String> expectedSignatures = createSetOfSignatures(FIRST_EXPECTED_SIGNATURE);
@@ -164,7 +164,7 @@
         // If the cert tag key attribute does not contain a valid public key then a
         // CertificateException should be thrown when attempting to build the SigningDetails; in
         // this case the signing details should be set to UNKNOWN.
-        XmlPullParser parser = getXMLFromResources(
+        TypedXmlPullParser parser = getXMLFromResources(
                 "xml/one-signer-invalid-public-key-cert-key.xml");
         ArrayList<Signature> signatures = new ArrayList<>();
         mPackageSetting.signatures.readXml(parser, signatures);
@@ -351,7 +351,7 @@
         // When rotating the signing key a developer is able to specify the capabilities granted to
         // the apps signed with the previous key. This test verifies a previous signing certificate
         // with the flags set to 0 does not have any capabilities.
-        XmlPullParser parser = getXMLFromResources("xml/two-signers-in-lineage-no-caps.xml");
+        TypedXmlPullParser parser = getXMLFromResources("xml/two-signers-in-lineage-no-caps.xml");
         ArrayList<Signature> signatures = new ArrayList<>();
         mPackageSetting.signatures.readXml(parser, signatures);
         // obtain the Signature in the list matching the previous signing certificate
@@ -377,7 +377,7 @@
      */
     private void verifyReadXmlReturnsExpectedSignatures(String xmlFile, int expectedSchemeVersion,
             String... expectedSignatureValues) throws Exception {
-        XmlPullParser parser = getXMLFromResources(xmlFile);
+        TypedXmlPullParser parser = getXMLFromResources(xmlFile);
         ArrayList<Signature> signatures = new ArrayList<>();
         mPackageSetting.signatures.readXml(parser, signatures);
         Set<String> expectedSignatures = createSetOfSignatures(expectedSignatureValues);
@@ -394,7 +394,7 @@
      */
     private void verifyReadXmlReturnsExpectedSignaturesAndLineage(String xmlFile,
             int schemeVersion, String... expectedSignatureValues) throws Exception {
-        XmlPullParser parser = getXMLFromResources(xmlFile);
+        TypedXmlPullParser parser = getXMLFromResources(xmlFile);
         ArrayList<Signature> signatures = new ArrayList<>();
         mPackageSetting.signatures.readXml(parser, signatures);
         Set<String> expectedSignatures = createSetOfSignatures(expectedSignatureValues);
@@ -447,11 +447,10 @@
         return result;
     }
 
-    private XmlPullParser getXMLFromResources(String xmlFile) throws Exception {
+    private TypedXmlPullParser getXMLFromResources(String xmlFile) throws Exception {
         InputStream xmlStream = mContext.getResources().getAssets().open(
                 TEST_RESOURCES_FOLDER + "/" + xmlFile);
-        XmlPullParser result = Xml.newPullParser();
-        result.setInput(xmlStream, StandardCharsets.UTF_8.name());
+        TypedXmlPullParser result = Xml.resolvePullParser(xmlStream);
         int type;
         // advance the parser to the first tag
         while ((type = result.next()) != XmlPullParser.START_TAG
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java
index 8aa0e3fe..2cc9992 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java
@@ -133,20 +133,16 @@
     public void shouldVibrateForRingtones_withVibrateWhenRinging_onlyIgnoreSettingsForSilentMode() {
         setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
 
-        mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_SILENT);
-        assertEquals(AudioManager.RINGER_MODE_SILENT, mAudioManager.getRingerMode());
+        setRingerMode(AudioManager.RINGER_MODE_SILENT);
         assertFalse(mVibrationSettings.shouldVibrateForRingtone());
 
-        mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_MAX);
-        assertEquals(AudioManager.RINGER_MODE_MAX, mAudioManager.getRingerMode());
+        setRingerMode(AudioManager.RINGER_MODE_MAX);
         assertTrue(mVibrationSettings.shouldVibrateForRingtone());
 
-        mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL);
-        assertEquals(AudioManager.RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
+        setRingerMode(AudioManager.RINGER_MODE_NORMAL);
         assertTrue(mVibrationSettings.shouldVibrateForRingtone());
 
-        mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_VIBRATE);
-        assertEquals(AudioManager.RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
+        setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
         assertTrue(mVibrationSettings.shouldVibrateForRingtone());
     }
 
@@ -155,20 +151,16 @@
         setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
         setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 1);
 
-        mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_SILENT);
-        assertEquals(AudioManager.RINGER_MODE_SILENT, mAudioManager.getRingerMode());
+        setRingerMode(AudioManager.RINGER_MODE_SILENT);
         assertFalse(mVibrationSettings.shouldVibrateForRingtone());
 
-        mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_MAX);
-        assertEquals(AudioManager.RINGER_MODE_MAX, mAudioManager.getRingerMode());
+        setRingerMode(AudioManager.RINGER_MODE_MAX);
         assertTrue(mVibrationSettings.shouldVibrateForRingtone());
 
-        mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL);
-        assertEquals(AudioManager.RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
+        setRingerMode(AudioManager.RINGER_MODE_NORMAL);
         assertTrue(mVibrationSettings.shouldVibrateForRingtone());
 
-        mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_VIBRATE);
-        assertEquals(AudioManager.RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
+        setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
         assertTrue(mVibrationSettings.shouldVibrateForRingtone());
     }
 
@@ -177,20 +169,16 @@
         setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
         setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 0);
 
-        mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_VIBRATE);
-        assertEquals(AudioManager.RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
+        setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
         assertTrue(mVibrationSettings.shouldVibrateForRingtone());
 
-        mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_SILENT);
-        assertEquals(AudioManager.RINGER_MODE_SILENT, mAudioManager.getRingerMode());
+        setRingerMode(AudioManager.RINGER_MODE_SILENT);
         assertFalse(mVibrationSettings.shouldVibrateForRingtone());
 
-        mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_MAX);
-        assertEquals(AudioManager.RINGER_MODE_MAX, mAudioManager.getRingerMode());
+        setRingerMode(AudioManager.RINGER_MODE_MAX);
         assertFalse(mVibrationSettings.shouldVibrateForRingtone());
 
-        mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL);
-        assertEquals(AudioManager.RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
+        setRingerMode(AudioManager.RINGER_MODE_NORMAL);
         assertFalse(mVibrationSettings.shouldVibrateForRingtone());
     }
 
@@ -294,6 +282,10 @@
         Settings.Global.putInt(mContextSpy.getContentResolver(), settingName, value);
         // FakeSettingsProvider don't support testing triggering ContentObserver yet.
         mVibrationSettings.updateSettings();
-        mAudioManager.reloadAudioSettings();
+    }
+
+    private void setRingerMode(int ringerMode) {
+        mAudioManager.setRingerModeInternal(ringerMode);
+        assertEquals(ringerMode, mAudioManager.getRingerModeInternal());
     }
 }
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 87aaba2..09a4289 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -4923,6 +4923,32 @@
     }
 
     @Test
+    public void testDontCallShowToastAgainOnTheSameCustomToast() throws Exception {
+        final String testPackage = "testPackageName";
+        assertEquals(0, mService.mToastQueue.size());
+        mService.isSystemUid = false;
+
+        // package is not suspended
+        when(mPackageManager.isPackageSuspendedForUser(testPackage, UserHandle.getUserId(mUid)))
+                .thenReturn(false);
+
+        setAppInForegroundForToasts(mUid, true);
+
+        Binder token = new Binder();
+        ITransientNotification callback = mock(ITransientNotification.class);
+        INotificationManager nmService = (INotificationManager) mService.mService;
+
+        // first time trying to show the toast, showToast gets called
+        nmService.enqueueToast(testPackage, token, callback, 2000, 0);
+        verify(callback, times(1)).show(any());
+
+        // second time trying to show the same toast, showToast isn't called again (total number of
+        // invocations stays at one)
+        nmService.enqueueToast(testPackage, token, callback, 2000, 0);
+        verify(callback, times(1)).show(any());
+    }
+
+    @Test
     public void testAllowForegroundTextToasts() throws Exception {
         final String testPackage = "testPackageName";
         assertEquals(0, mService.mToastQueue.size());
@@ -4959,6 +4985,33 @@
     }
 
     @Test
+    public void testDontCallShowToastAgainOnTheSameTextToast() throws Exception {
+        final String testPackage = "testPackageName";
+        assertEquals(0, mService.mToastQueue.size());
+        mService.isSystemUid = false;
+
+        // package is not suspended
+        when(mPackageManager.isPackageSuspendedForUser(testPackage, UserHandle.getUserId(mUid)))
+                .thenReturn(false);
+
+        setAppInForegroundForToasts(mUid, true);
+
+        Binder token = new Binder();
+        INotificationManager nmService = (INotificationManager) mService.mService;
+
+        // first time trying to show the toast, showToast gets called
+        nmService.enqueueTextToast(testPackage, token, "Text", 2000, 0, null);
+        verify(mStatusBar, times(1))
+                .showToast(anyInt(), any(), any(), any(), any(), anyInt(), any());
+
+        // second time trying to show the same toast, showToast isn't called again (total number of
+        // invocations stays at one)
+        nmService.enqueueTextToast(testPackage, token, "Text", 2000, 0, null);
+        verify(mStatusBar, times(1))
+                .showToast(anyInt(), any(), any(), any(), any(), anyInt(), any());
+    }
+
+    @Test
     public void backgroundSystemCustomToast_callsSetProcessImportantAsForegroundForToast() throws
             Exception {
         final String testPackage = "testPackageName";
@@ -5102,6 +5155,32 @@
         assertEquals(1, mService.mToastQueue.size());
     }
 
+    @Test
+    public void testLimitNumberOfQueuedToastsFromPackage() throws Exception {
+        final String testPackage = "testPackageName";
+        assertEquals(0, mService.mToastQueue.size());
+        mService.isSystemUid = false;
+
+        // package is not suspended
+        when(mPackageManager.isPackageSuspendedForUser(testPackage, UserHandle.getUserId(mUid)))
+                .thenReturn(false);
+
+        INotificationManager nmService = (INotificationManager) mService.mService;
+
+        // Trying to quickly enqueue more toast than allowed.
+        for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_TOASTS + 1; i++) {
+            nmService.enqueueTextToast(
+                    testPackage,
+                    new Binder(),
+                    "Text",
+                    /* duration */ 2000,
+                    /* displayId */ 0,
+                    /* callback */ null);
+        }
+        // Only allowed number enqueued, rest ignored.
+        assertEquals(NotificationManagerService.MAX_PACKAGE_TOASTS, mService.mToastQueue.size());
+    }
+
     private void setAppInForegroundForToasts(int uid, boolean inForeground) {
         int importance = (inForeground) ? IMPORTANCE_FOREGROUND : IMPORTANCE_NONE;
         when(mActivityManager.getUidImportance(mUid)).thenReturn(importance);
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
index c05eb8e..5a6e556 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
@@ -31,12 +31,15 @@
 import static android.app.ActivityManager.START_TASK_TO_FRONT;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
 import static android.content.Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT;
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static android.content.Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED;
 import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;
+import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE;
+import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
 import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.clearInvocations;
@@ -304,7 +307,12 @@
     }
 
     private ActivityStarter prepareStarter(@Intent.Flags int launchFlags) {
-        return prepareStarter(launchFlags, true /* mockGetLaunchStack */);
+        return prepareStarter(launchFlags, true /* mockGetLaunchStack */, LAUNCH_MULTIPLE);
+    }
+
+    private ActivityStarter prepareStarter(@Intent.Flags int launchFlags,
+            boolean mockGetLaunchStack) {
+        return prepareStarter(launchFlags, mockGetLaunchStack, LAUNCH_MULTIPLE);
     }
 
     /**
@@ -318,7 +326,7 @@
      * @return A {@link ActivityStarter} with default setup.
      */
     private ActivityStarter prepareStarter(@Intent.Flags int launchFlags,
-            boolean mockGetLaunchStack) {
+            boolean mockGetLaunchStack, int launchMode) {
         // always allow test to start activity.
         doReturn(true).when(mSupervisor).checkStartAnyActivityPermission(
                 any(), any(), any(), anyInt(), anyInt(), anyInt(), any(), any(),
@@ -362,6 +370,7 @@
 
         info.applicationInfo = new ApplicationInfo();
         info.applicationInfo.packageName = ActivityBuilder.getDefaultComponent().getPackageName();
+        info.launchMode = launchMode;
 
         return new ActivityStarter(mController, mAtm,
                 mAtm.mStackSupervisor, mock(ActivityStartInterceptor.class))
@@ -416,7 +425,8 @@
     @Test
     public void testSplitScreenDeliverToTop() {
         final ActivityStarter starter = prepareStarter(
-                FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | FLAG_ACTIVITY_SINGLE_TOP, false);
+                FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | FLAG_ACTIVITY_SINGLE_TOP,
+                false /* mockGetLaunchStack */);
         final ActivityRecord splitPrimaryFocusActivity =
                 new ActivityBuilder(mAtm).setCreateTask(true).build();
         final ActivityRecord splitSecondReusableActivity =
@@ -584,6 +594,12 @@
                 UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
                 UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
                 true, false, false, false, false);
+        runAndVerifyBackgroundActivityStartsSubtest(
+                "disallowed_pinned_singleinstance_aborted", true,
+                UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
+                UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
+                false, false, false, false, false, true);
+
     }
 
     /**
@@ -647,11 +663,28 @@
             boolean callerIsTempAllowed,
             boolean callerIsInstrumentingWithBackgroundActivityStartPrivileges,
             boolean isCallingUidDeviceOwner) {
+        runAndVerifyBackgroundActivityStartsSubtest(name, shouldHaveAborted, callingUid,
+                callingUidHasVisibleWindow, callingUidProcState, realCallingUid,
+                realCallingUidHasVisibleWindow, realCallingUidProcState,
+                hasForegroundActivities, callerIsRecents, callerIsTempAllowed,
+                callerIsInstrumentingWithBackgroundActivityStartPrivileges,
+                isCallingUidDeviceOwner, false /* isPinnedSingleInstance */);
+    }
+
+    private void runAndVerifyBackgroundActivityStartsSubtest(String name, boolean shouldHaveAborted,
+            int callingUid, boolean callingUidHasVisibleWindow, int callingUidProcState,
+            int realCallingUid, boolean realCallingUidHasVisibleWindow, int realCallingUidProcState,
+            boolean hasForegroundActivities, boolean callerIsRecents,
+            boolean callerIsTempAllowed,
+            boolean callerIsInstrumentingWithBackgroundActivityStartPrivileges,
+            boolean isCallingUidDeviceOwner,
+            boolean isPinnedSingleInstance) {
         // window visibility
         doReturn(callingUidHasVisibleWindow).when(mAtm.mWindowManager.mRoot)
                 .isAnyNonToastWindowVisibleForUid(callingUid);
         doReturn(realCallingUidHasVisibleWindow).when(mAtm.mWindowManager.mRoot)
                 .isAnyNonToastWindowVisibleForUid(realCallingUid);
+
         // process importance
         doReturn(callingUidProcState).when(mAtm).getUidState(callingUid);
         doReturn(realCallingUidProcState).when(mAtm).getUidState(realCallingUid);
@@ -679,9 +712,20 @@
         // callingUid is the device owner
         doReturn(isCallingUidDeviceOwner).when(mAtm).isDeviceOwner(callingUid);
 
+        int launchMode = LAUNCH_MULTIPLE;
+        if (isPinnedSingleInstance) {
+            final ActivityRecord baseActivity =
+                    new ActivityBuilder(mAtm).setCreateTask(true).build();
+            baseActivity.getRootTask()
+                    .setWindowingMode(WINDOWING_MODE_PINNED);
+            doReturn(baseActivity).when(mRootWindowContainer).findTask(any(), any());
+            launchMode = LAUNCH_SINGLE_INSTANCE;
+        }
+
         final ActivityOptions options = spy(ActivityOptions.makeBasic());
         ActivityRecord[] outActivity = new ActivityRecord[1];
-        ActivityStarter starter = prepareStarter(FLAG_ACTIVITY_NEW_TASK)
+        ActivityStarter starter = prepareStarter(
+                FLAG_ACTIVITY_NEW_TASK, true, launchMode)
                 .setCallingPackage("com.whatever.dude")
                 .setCaller(caller)
                 .setCallingUid(callingUid)
diff --git a/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
index 0a960be..a9f6b50 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
@@ -63,8 +63,8 @@
                 mDisplayContent.getDisplayId());
 
         assertImeSwitchContextMetricsValidity(contextOnSecondaryDisplay, mDisplayContent);
-        assertThat(contextOnDefaultDisplay.getActivityToken())
-                .isEqualTo(contextOnSecondaryDisplay.getActivityToken());
+        assertThat(contextOnDefaultDisplay.getWindowContextToken())
+                .isEqualTo(contextOnSecondaryDisplay.getWindowContextToken());
     }
 
     private void assertImeSwitchContextMetricsValidity(Context context, DisplayContent dc) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
index 02d9c42..bbe811d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
@@ -29,6 +29,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
 import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
 import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
+import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -226,6 +227,40 @@
         // mTopFullscreenOpaqueWindowState is still fullscreenApp.
         verify(sbmi).setWindowState(mDisplayContent.mDisplayId, StatusBarManager.WINDOW_STATUS_BAR,
                 StatusBarManager.WINDOW_STATE_SHOWING);
+
+        // Add a system window: panel.
+        final WindowState panel = addWindow(TYPE_STATUS_BAR_SUB_PANEL, "panel");
+        mDisplayContent.getInsetsPolicy().updateBarControlTarget(panel);
+
+        // panel is the focused window, but it can only control navigation bar.
+        // Because fullscreenApp is hiding status bar.
+        InsetsSourceControl[] panelControls =
+                mDisplayContent.getInsetsStateController().getControlsForDispatch(panel);
+        assertNotNull(panelControls);
+        assertEquals(1, panelControls.length);
+        assertEquals(ITYPE_NAVIGATION_BAR, panelControls[0].getType());
+
+        // Add notificationShade and make it can receive keys.
+        final WindowState shade = addWindow(TYPE_NOTIFICATION_SHADE, "notificationShade");
+        shade.setHasSurface(true);
+        assertTrue(shade.canReceiveKeys());
+        mDisplayContent.getInsetsPolicy().updateBarControlTarget(panel);
+
+        // panel can control both system bars now.
+        panelControls = mDisplayContent.getInsetsStateController().getControlsForDispatch(panel);
+        assertNotNull(panelControls);
+        assertEquals(2, panelControls.length);
+
+        // Make notificationShade cannot receive keys.
+        shade.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
+        assertFalse(shade.canReceiveKeys());
+        mDisplayContent.getInsetsPolicy().updateBarControlTarget(panel);
+
+        // panel can only control navigation bar now.
+        panelControls = mDisplayContent.getInsetsStateController().getControlsForDispatch(panel);
+        assertNotNull(panelControls);
+        assertEquals(1, panelControls.length);
+        assertEquals(ITYPE_NAVIGATION_BAR, panelControls[0].getType());
     }
 
     @UseTestDisplay(addWindows = W_ACTIVITY)
diff --git a/services/usb/Android.bp b/services/usb/Android.bp
index 1a23c8c..aa8bbde 100644
--- a/services/usb/Android.bp
+++ b/services/usb/Android.bp
@@ -21,5 +21,6 @@
         "android.hardware.usb-V1.2-java",
         "android.hardware.usb.gadget-V1.0-java",
         "android.hardware.usb.gadget-V1.1-java",
+        "android.hardware.usb.gadget-V1.2-java",
     ],
 }
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index 58859e0..3af88e1 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -55,8 +55,9 @@
 import android.hardware.usb.UsbPortStatus;
 import android.hardware.usb.gadget.V1_0.GadgetFunction;
 import android.hardware.usb.gadget.V1_0.IUsbGadget;
-import android.hardware.usb.gadget.V1_0.IUsbGadgetCallback;
 import android.hardware.usb.gadget.V1_0.Status;
+import android.hardware.usb.gadget.V1_2.IUsbGadgetCallback;
+import android.hardware.usb.gadget.V1_2.UsbSpeed;
 import android.hidl.manager.V1_0.IServiceManager;
 import android.hidl.manager.V1_0.IServiceNotification;
 import android.os.BatteryManager;
@@ -166,6 +167,8 @@
     private static final int MSG_RESET_USB_GADGET = 19;
     private static final int MSG_ACCESSORY_HANDSHAKE_TIMEOUT = 20;
     private static final int MSG_INCREASE_SENDSTRING_COUNT = 21;
+    private static final int MSG_UPDATE_USB_SPEED = 22;
+    private static final int MSG_UPDATE_HAL_VERSION = 23;
 
     private static final int AUDIO_MODE_SOURCE = 1;
 
@@ -532,6 +535,8 @@
         protected SharedPreferences mSettings;
         protected int mCurrentUser;
         protected boolean mCurrentUsbFunctionsReceived;
+        protected int mUsbSpeed;
+        protected int mCurrentGadgetHalVersion;
 
         /**
          * The persistent property which stores whether adb is enabled or not.
@@ -902,6 +907,7 @@
                     } else {
                         mPendingBootBroadcast = true;
                     }
+                    updateUsbSpeed();
                     break;
                 case MSG_UPDATE_PORT_STATE:
                     SomeArgs args = (SomeArgs) msg.obj;
@@ -1117,6 +1123,26 @@
             return mCurrentAccessory;
         }
 
+        protected void updateUsbGadgetHalVersion() {
+            sendMessage(MSG_UPDATE_HAL_VERSION, null);
+        }
+
+        protected void updateUsbSpeed() {
+            if (mCurrentGadgetHalVersion < UsbManager.GADGET_HAL_V1_0) {
+                mUsbSpeed = UsbSpeed.UNKNOWN;
+                return;
+            }
+
+            if (mConnected && mConfigured) {
+                sendMessage(MSG_UPDATE_USB_SPEED, null);
+            } else {
+                // clear USB speed due to disconnected
+                mUsbSpeed = UsbSpeed.UNKNOWN;
+            }
+
+            return;
+        }
+
         protected void updateUsbNotification(boolean force) {
             if (mNotificationManager == null || !mUseUsbNotification
                     || ("0".equals(getSystemProperty("persist.charging.notify", "")))) {
@@ -1324,6 +1350,14 @@
             return mScreenUnlockedFunctions;
         }
 
+        public int getUsbSpeed() {
+            return mUsbSpeed;
+        }
+
+        public int getGadgetHalVersion() {
+            return mCurrentGadgetHalVersion;
+        }
+
         /**
          * Dump a functions mask either as proto-enums (if dumping to proto) or a string (if dumping
          * to a print writer)
@@ -1450,6 +1484,9 @@
                 mCurrentFunctions = UsbManager.FUNCTION_NONE;
                 mCurrentUsbFunctionsReceived = true;
 
+                mUsbSpeed = UsbSpeed.UNKNOWN;
+                mCurrentGadgetHalVersion = UsbManager.GADGET_HAL_NOT_SUPPORTED;
+
                 String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim();
                 updateState(state);
             } catch (Exception e) {
@@ -1826,10 +1863,13 @@
                             USB_GADGET_HAL_DEATH_COOKIE);
                     mCurrentFunctions = UsbManager.FUNCTION_NONE;
                     mCurrentUsbFunctionsRequested = true;
+                    mUsbSpeed = UsbSpeed.UNKNOWN;
+                    mCurrentGadgetHalVersion = UsbManager.GADGET_HAL_V1_0;
                     mGadgetProxy.getCurrentUsbFunctions(new UsbGadgetCallback());
                 }
                 String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim();
                 updateState(state);
+                updateUsbGadgetHalVersion();
             } catch (NoSuchElementException e) {
                 Slog.e(TAG, "Usb gadget hal not found", e);
             } catch (RemoteException e) {
@@ -1935,6 +1975,48 @@
                         }
                     }
                     break;
+                case MSG_UPDATE_USB_SPEED:
+                    synchronized (mGadgetProxyLock) {
+                        if (mGadgetProxy == null) {
+                            Slog.e(TAG, "mGadgetProxy is null");
+                            break;
+                        }
+
+                        try {
+                            android.hardware.usb.gadget.V1_2.IUsbGadget gadgetProxy =
+                                    android.hardware.usb.gadget.V1_2.IUsbGadget
+                                            .castFrom(mGadgetProxy);
+                            if (gadgetProxy != null) {
+                                gadgetProxy.getUsbSpeed(new UsbGadgetCallback());
+                            }
+                        } catch (RemoteException e) {
+                            Slog.e(TAG, "get UsbSpeed failed", e);
+                        }
+                    }
+                    break;
+                case MSG_UPDATE_HAL_VERSION:
+                    synchronized (mGadgetProxyLock) {
+                        if (mGadgetProxy == null) {
+                            Slog.e(TAG, "mGadgetProxy is null");
+                            break;
+                        }
+
+                        android.hardware.usb.gadget.V1_2.IUsbGadget gadgetProxy =
+                                android.hardware.usb.gadget.V1_2.IUsbGadget.castFrom(mGadgetProxy);
+                        if (gadgetProxy == null) {
+                            android.hardware.usb.gadget.V1_1.IUsbGadget gadgetProxyV1By1 =
+                                    android.hardware.usb.gadget.V1_1.IUsbGadget
+                                            .castFrom(mGadgetProxy);
+                            if (gadgetProxyV1By1 == null) {
+                                mCurrentGadgetHalVersion = UsbManager.GADGET_HAL_V1_0;
+                                break;
+                            }
+                            mCurrentGadgetHalVersion = UsbManager.GADGET_HAL_V1_1;
+                            break;
+                        }
+                        mCurrentGadgetHalVersion = UsbManager.GADGET_HAL_V1_2;
+                    }
+                    break;
                 default:
                     super.handleMessage(msg);
             }
@@ -1982,6 +2064,11 @@
                 sendMessage(MSG_GET_CURRENT_USB_FUNCTIONS, functions,
                         status == Status.FUNCTIONS_APPLIED);
             }
+
+            @Override
+            public void getUsbSpeedCb(int speed) {
+                mUsbSpeed = speed;
+            }
         }
 
         private void setUsbConfig(long config, boolean chargingFunctions) {
@@ -2090,6 +2177,14 @@
         return mHandler.getEnabledFunctions();
     }
 
+    public int getCurrentUsbSpeed() {
+        return mHandler.getUsbSpeed();
+    }
+
+    public int getGadgetHalVersion() {
+        return mHandler.getGadgetHalVersion();
+    }
+
     /**
      * Returns a dup of the control file descriptor for the given function.
      */
diff --git a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
index 26ee03c..f638660 100644
--- a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
+++ b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
@@ -53,6 +53,8 @@
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.SparseIntArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.GuardedBy;
@@ -435,8 +437,7 @@
             FileInputStream fis = null;
             try {
                 fis = new FileInputStream(sSingleUserSettingsFile);
-                XmlPullParser parser = Xml.newPullParser();
-                parser.setInput(fis, StandardCharsets.UTF_8.name());
+                TypedXmlPullParser parser = Xml.resolvePullParser(fis);
 
                 XmlUtils.nextElement(parser);
                 while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
@@ -470,8 +471,7 @@
         FileInputStream stream = null;
         try {
             stream = mSettingsFile.openRead();
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(stream, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(stream);
 
             XmlUtils.nextElement(parser);
             while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
@@ -516,8 +516,7 @@
                 try {
                     fos = mSettingsFile.startWrite();
 
-                    FastXmlSerializer serializer = new FastXmlSerializer();
-                    serializer.setOutput(fos, StandardCharsets.UTF_8.name());
+                    TypedXmlSerializer serializer = Xml.resolveSerializer(fos);
                     serializer.startDocument(null, true);
                     serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output",
                                     true);
diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java
index 444cb5c..edd4a38 100644
--- a/services/usb/java/com/android/server/usb/UsbService.java
+++ b/services/usb/java/com/android/server/usb/UsbService.java
@@ -638,6 +638,31 @@
     }
 
     @Override
+    public int getCurrentUsbSpeed() {
+        Preconditions.checkNotNull(mDeviceManager, "DeviceManager must not be null");
+
+        final long ident = Binder.clearCallingIdentity();
+        try {
+            return mDeviceManager.getCurrentUsbSpeed();
+        } finally {
+            Binder.restoreCallingIdentity(ident);
+        }
+    }
+
+    @Override
+    public int getGadgetHalVersion() {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
+        Preconditions.checkNotNull(mDeviceManager, "DeviceManager must not be null");
+
+        final long ident = Binder.clearCallingIdentity();
+        try {
+            return mDeviceManager.getGadgetHalVersion();
+        } finally {
+            Binder.restoreCallingIdentity(ident);
+        }
+    }
+
+    @Override
     public void resetUsbGadget() {
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
         Preconditions.checkNotNull(mDeviceManager, "DeviceManager must not be null");
diff --git a/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java b/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java
index e20b1a4d..5874b4b 100644
--- a/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java
+++ b/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java
@@ -47,6 +47,8 @@
 import android.util.AtomicFile;
 import android.util.Slog;
 import android.util.SparseBooleanArray;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
 import android.util.Xml;
 
 import com.android.internal.annotations.GuardedBy;
@@ -355,8 +357,7 @@
         mAccessoryPersistentPermissionMap.clear();
 
         try (FileInputStream in = mPermissionsFile.openRead()) {
-            XmlPullParser parser = Xml.newPullParser();
-            parser.setInput(in, StandardCharsets.UTF_8.name());
+            TypedXmlPullParser parser = Xml.resolvePullParser(in);
 
             XmlUtils.nextElement(parser);
             while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
@@ -440,8 +441,7 @@
                 FileOutputStream out = null;
                 try {
                     out = mPermissionsFile.startWrite();
-                    FastXmlSerializer serializer = new FastXmlSerializer();
-                    serializer.setOutput(out, StandardCharsets.UTF_8.name());
+                    TypedXmlSerializer serializer = Xml.resolveSerializer(out);
                     serializer.startDocument(null, true);
                     serializer.startTag(null, "permissions");
 
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
index 64f8c58..632ad4c 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
@@ -1140,6 +1140,25 @@
     }
 
     /**
+     * Stops and unloads all models. This is intended as a clean-up call with the expectation that
+     * this instance is not used after.
+     * @hide
+     */
+    public void detach() {
+        synchronized (mLock) {
+            for (ModelData model : mModelDataMap.values()) {
+                forceStopAndUnloadModelLocked(model, null);
+            }
+            mModelDataMap.clear();
+            internalClearGlobalStateLocked();
+            if (mModule != null) {
+                mModule.detach();
+                mModule = null;
+            }
+        }
+    }
+
+    /**
      * Stops and unloads a sound model, and removes any reference to the model if successful.
      *
      * @param modelData The model data to remove.
@@ -1170,7 +1189,7 @@
         }
         if (modelData.isModelStarted()) {
             Slog.d(TAG, "Stopping previously started dangling model " + modelData.getHandle());
-            if (mModule.stopRecognition(modelData.getHandle()) != STATUS_OK) {
+            if (mModule.stopRecognition(modelData.getHandle()) == STATUS_OK) {
                 modelData.setStopped();
                 modelData.setRequested(false);
             } else {
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerInternal.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerInternal.java
index f77d490..a976257 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerInternal.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerInternal.java
@@ -27,6 +27,7 @@
 import android.hardware.soundtrigger.SoundTrigger.ModuleProperties;
 import android.hardware.soundtrigger.SoundTrigger.RecognitionConfig;
 import android.media.permission.Identity;
+import android.os.IBinder;
 
 import com.android.server.voiceinteraction.VoiceInteractionManagerService;
 
@@ -46,10 +47,12 @@
     int STATUS_ERROR = SoundTrigger.STATUS_ERROR;
     int STATUS_OK = SoundTrigger.STATUS_OK;
 
-    Session attachAsOriginator(@NonNull Identity originatorIdentity);
+    Session attachAsOriginator(@NonNull Identity originatorIdentity,
+            @NonNull IBinder client);
 
     Session attachAsMiddleman(@NonNull Identity middlemanIdentity,
-            @NonNull Identity originatorIdentity);
+            @NonNull Identity originatorIdentity,
+            @NonNull IBinder client);
 
     /**
      * Dumps service-wide information.
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
index 5999044..6c9f41c 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
@@ -226,33 +226,45 @@
 
     class SoundTriggerServiceStub extends ISoundTriggerService.Stub {
         @Override
-        public ISoundTriggerSession attachAsOriginator(Identity originatorIdentity) {
+        public ISoundTriggerSession attachAsOriginator(Identity originatorIdentity,
+                @NonNull IBinder client) {
             try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect(
                     originatorIdentity)) {
-                return new SoundTriggerSessionStub(newSoundTriggerHelper());
+                return new SoundTriggerSessionStub(newSoundTriggerHelper(), client);
             }
         }
 
         @Override
         public ISoundTriggerSession attachAsMiddleman(Identity originatorIdentity,
-                Identity middlemanIdentity) {
+                Identity middlemanIdentity,
+                @NonNull IBinder client) {
             try (SafeCloseable ignored = PermissionUtil.establishIdentityIndirect(mContext,
                     SOUNDTRIGGER_DELEGATE_IDENTITY, middlemanIdentity,
                     originatorIdentity)) {
-                return new SoundTriggerSessionStub(newSoundTriggerHelper());
+                return new SoundTriggerSessionStub(newSoundTriggerHelper(), client);
             }
         }
     }
 
     class SoundTriggerSessionStub extends ISoundTriggerSession.Stub {
         private final SoundTriggerHelper mSoundTriggerHelper;
+        // Used to detect client death.
+        private final IBinder mClient;
         private final TreeMap<UUID, SoundModel> mLoadedModels = new TreeMap<>();
         private final Object mCallbacksLock = new Object();
         private final TreeMap<UUID, IRecognitionStatusCallback> mCallbacks = new TreeMap<>();
 
         SoundTriggerSessionStub(
-                SoundTriggerHelper soundTriggerHelper) {
+                SoundTriggerHelper soundTriggerHelper, @NonNull IBinder client) {
             mSoundTriggerHelper = soundTriggerHelper;
+            mClient = client;
+            try {
+                mClient.linkToDeath(() -> {
+                    clientDied();
+                }, 0);
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Failed to register death listener.", e);
+            }
         }
 
         @Override
@@ -790,6 +802,13 @@
             }
         }
 
+        private void clientDied() {
+            Slog.w(TAG, "Client died, cleaning up session.");
+            sEventLogger.log(new SoundTriggerLogger.StringEvent(
+                    "Client died, cleaning up session."));
+            mSoundTriggerHelper.detach();
+        }
+
         /**
          * Local end for a {@link SoundTriggerDetectionService}. Operations are queued up and
          * executed when the service connects.
@@ -1457,10 +1476,19 @@
 
         private class SessionImpl implements Session {
             private final @NonNull SoundTriggerHelper mSoundTriggerHelper;
+            private final @NonNull IBinder mClient;
 
             private SessionImpl(
-                    @NonNull SoundTriggerHelper soundTriggerHelper) {
+                    @NonNull SoundTriggerHelper soundTriggerHelper, @NonNull IBinder client) {
                 mSoundTriggerHelper = soundTriggerHelper;
+                mClient = client;
+                try {
+                    mClient.linkToDeath(() -> {
+                        clientDied();
+                    }, 0);
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Failed to register death listener.", e);
+                }
             }
 
             @Override
@@ -1507,22 +1535,31 @@
             public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
                 mSoundTriggerHelper.dump(fd, pw, args);
             }
+
+            private void clientDied() {
+                Slog.w(TAG, "Client died, cleaning up session.");
+                sEventLogger.log(new SoundTriggerLogger.StringEvent(
+                        "Client died, cleaning up session."));
+                mSoundTriggerHelper.detach();
+            }
         }
 
         @Override
-        public Session attachAsOriginator(@NonNull Identity originatorIdentity) {
+        public Session attachAsOriginator(@NonNull Identity originatorIdentity,
+                @NonNull IBinder client) {
             try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect(
                     originatorIdentity)) {
-                return new SessionImpl(newSoundTriggerHelper());
+                return new SessionImpl(newSoundTriggerHelper(), client);
             }
         }
 
         @Override
         public Session attachAsMiddleman(@NonNull Identity middlemanIdentity,
-                @NonNull Identity originatorIdentity) {
+                @NonNull Identity originatorIdentity,
+                @NonNull IBinder client) {
             try (SafeCloseable ignored = PermissionUtil.establishIdentityIndirect(mContext,
                     SOUNDTRIGGER_DELEGATE_IDENTITY, middlemanIdentity, originatorIdentity)) {
-                return new SessionImpl(newSoundTriggerHelper());
+                return new SessionImpl(newSoundTriggerHelper(), client);
             }
         }
 
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index 547d253..2bcf3b5 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -257,12 +257,13 @@
 
         @Override
         public @NonNull IVoiceInteractionSoundTriggerSession createSoundTriggerSessionAsOriginator(
-                @NonNull Identity originatorIdentity) {
+                @NonNull Identity originatorIdentity, IBinder client) {
             Objects.requireNonNull(originatorIdentity);
             try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect(
                     originatorIdentity)) {
                 SoundTriggerSession session = new SoundTriggerSession(
-                        mSoundTriggerInternal.attachAsOriginator(IdentityContext.getNonNull()));
+                        mSoundTriggerInternal.attachAsOriginator(IdentityContext.getNonNull(),
+                                client));
                 synchronized (mSessions) {
                     mSessions.add(new WeakReference<>(session));
                 }
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index bbf34df..724a9e4 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -767,6 +767,19 @@
             "android.telecom.extra.AUDIO_CODEC";
 
     /**
+     * Float connection extra key used to store the audio codec bitrate in kbps for the current
+     * {@link Connection}.
+     */
+    public static final String EXTRA_AUDIO_CODEC_BITRATE_KBPS =
+            "android.telecom.extra.AUDIO_CODEC_BITRATE_KBPS";
+
+    /**
+     * Float connection extra key used to store the audio codec bandwidth in khz for the current
+     * {@link Connection}.
+     */
+    public static final String EXTRA_AUDIO_CODEC_BANDWIDTH_KHZ =
+            "android.telecom.extra.AUDIO_CODEC_BANDWIDTH_KHZ";
+    /**
      * Connection event used to inform Telecom that it should play the on hold tone.  This is used
      * to play a tone when the peer puts the current call on hold.  Sent to Telecom via
      * {@link #sendConnectionEvent(String, Bundle)}.
diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java
index 982e5f3..07de617 100644
--- a/telecomm/java/android/telecom/InCallService.java
+++ b/telecomm/java/android/telecom/InCallService.java
@@ -680,6 +680,7 @@
     public static abstract class VideoCall {
 
         /** @hide */
+        @SuppressWarnings("HiddenAbstractMethod")
         public abstract void destroy();
 
         /**
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index b335a90..7143bef 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -997,13 +997,14 @@
      */
     @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
     public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme) {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getDefaultOutgoingPhoneAccount(uriScheme,
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getDefaultOutgoingPhoneAccount(uriScheme,
                         mContext.getOpPackageName(), mContext.getAttributionTag());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#getDefaultOutgoingPhoneAccount", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#getDefaultOutgoingPhoneAccount", e);
         }
         return null;
     }
@@ -1023,13 +1024,14 @@
      */
     @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
     public @Nullable PhoneAccountHandle getUserSelectedOutgoingPhoneAccount() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getUserSelectedOutgoingPhoneAccount(
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getUserSelectedOutgoingPhoneAccount(
                         mContext.getOpPackageName());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#getUserSelectedOutgoingPhoneAccount", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#getUserSelectedOutgoingPhoneAccount", e);
         }
         return null;
     }
@@ -1045,12 +1047,13 @@
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
     @SystemApi
     public void setUserSelectedOutgoingPhoneAccount(@Nullable PhoneAccountHandle accountHandle) {
-        try {
-            if (isServiceConnected()) {
-                getTelecomService().setUserSelectedOutgoingPhoneAccount(accountHandle);
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                service.setUserSelectedOutgoingPhoneAccount(accountHandle);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#setUserSelectedOutgoingPhoneAccount");
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#setUserSelectedOutgoingPhoneAccount");
         }
     }
 
@@ -1064,13 +1067,14 @@
      * @see SubscriptionManager#getDefaultVoiceSubscriptionId()
      */
     public PhoneAccountHandle getSimCallManager() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getSimCallManager(
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getSimCallManager(
                         SubscriptionManager.getDefaultSubscriptionId());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#getSimCallManager");
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#getSimCallManager");
         }
         return null;
     }
@@ -1086,12 +1090,13 @@
      * @see SubscriptionManager#getActiveSubscriptionInfoList()
      */
     public @Nullable PhoneAccountHandle getSimCallManagerForSubscription(int subscriptionId) {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getSimCallManager(subscriptionId);
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getSimCallManager(subscriptionId);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#getSimCallManager");
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#getSimCallManager");
         }
         return null;
     }
@@ -1109,12 +1114,13 @@
      */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 119305590)
     public PhoneAccountHandle getSimCallManager(int userId) {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getSimCallManagerForUser(userId);
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getSimCallManagerForUser(userId);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#getSimCallManagerForUser");
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#getSimCallManagerForUser");
         }
         return null;
     }
@@ -1151,13 +1157,14 @@
             android.Manifest.permission.READ_PHONE_STATE
     })
     public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme) {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getPhoneAccountsSupportingScheme(uriScheme,
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getPhoneAccountsSupportingScheme(uriScheme,
                         mContext.getOpPackageName());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsSupportingScheme", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsSupportingScheme", e);
         }
         return new ArrayList<>();
     }
@@ -1192,13 +1199,14 @@
      */
     @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
     public List<PhoneAccountHandle> getSelfManagedPhoneAccounts() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getSelfManagedPhoneAccounts(mContext.getOpPackageName(),
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getSelfManagedPhoneAccounts(mContext.getOpPackageName(),
                         mContext.getAttributionTag());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#getSelfManagedPhoneAccounts()", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#getSelfManagedPhoneAccounts()", e);
         }
         return new ArrayList<>();
     }
@@ -1217,14 +1225,15 @@
     @RequiresPermission(READ_PRIVILEGED_PHONE_STATE)
     public @NonNull List<PhoneAccountHandle> getCallCapablePhoneAccounts(
             boolean includeDisabledAccounts) {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getCallCapablePhoneAccounts(includeDisabledAccounts,
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getCallCapablePhoneAccounts(includeDisabledAccounts,
                         mContext.getOpPackageName(), mContext.getAttributionTag());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#getCallCapablePhoneAccounts("
+                        + includeDisabledAccounts + ")", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#getCallCapablePhoneAccounts(" +
-                    includeDisabledAccounts + ")", e);
         }
         return new ArrayList<>();
     }
@@ -1238,15 +1247,16 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     @Deprecated
     public List<PhoneAccountHandle> getPhoneAccountsForPackage() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getPhoneAccountsForPackage(mContext.getPackageName());
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getPhoneAccountsForPackage(mContext.getPackageName());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsForPackage", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsForPackage", e);
         }
         return null;
     }
@@ -1259,12 +1269,13 @@
      * @return The {@link PhoneAccount} object.
      */
     public PhoneAccount getPhoneAccount(PhoneAccountHandle account) {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getPhoneAccount(account);
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getPhoneAccount(account);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#getPhoneAccount", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#getPhoneAccount", e);
         }
         return null;
     }
@@ -1277,12 +1288,13 @@
      */
     @SystemApi
     public int getAllPhoneAccountsCount() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getAllPhoneAccountsCount();
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getAllPhoneAccountsCount();
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccountsCount", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccountsCount", e);
         }
         return 0;
     }
@@ -1295,12 +1307,13 @@
      */
     @SystemApi
     public List<PhoneAccount> getAllPhoneAccounts() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getAllPhoneAccounts();
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getAllPhoneAccounts();
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccounts", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccounts", e);
         }
         return Collections.EMPTY_LIST;
     }
@@ -1313,12 +1326,13 @@
      */
     @SystemApi
     public List<PhoneAccountHandle> getAllPhoneAccountHandles() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getAllPhoneAccountHandles();
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getAllPhoneAccountHandles();
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccountHandles", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccountHandles", e);
         }
         return Collections.EMPTY_LIST;
     }
@@ -1338,12 +1352,13 @@
      * @param account The complete {@link PhoneAccount}.
      */
     public void registerPhoneAccount(PhoneAccount account) {
-        try {
-            if (isServiceConnected()) {
-                getTelecomService().registerPhoneAccount(account);
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                service.registerPhoneAccount(account);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#registerPhoneAccount", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#registerPhoneAccount", e);
         }
     }
 
@@ -1353,12 +1368,13 @@
      * @param accountHandle A {@link PhoneAccountHandle} for the {@link PhoneAccount} to unregister.
      */
     public void unregisterPhoneAccount(PhoneAccountHandle accountHandle) {
-        try {
-            if (isServiceConnected()) {
-                getTelecomService().unregisterPhoneAccount(accountHandle);
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                service.unregisterPhoneAccount(accountHandle);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#unregisterPhoneAccount", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#unregisterPhoneAccount", e);
         }
     }
 
@@ -1367,7 +1383,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void clearPhoneAccounts() {
         clearAccounts();
     }
@@ -1377,14 +1393,15 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void clearAccounts() {
-        try {
-            if (isServiceConnected()) {
-                getTelecomService().clearAccounts(mContext.getPackageName());
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                service.clearAccounts(mContext.getPackageName());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#clearAccounts", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#clearAccounts", e);
         }
     }
 
@@ -1393,12 +1410,15 @@
      * @hide
      */
     public void clearAccountsForPackage(String packageName) {
-        try {
-            if (isServiceConnected() && !TextUtils.isEmpty(packageName)) {
-                getTelecomService().clearAccounts(packageName);
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                if (!TextUtils.isEmpty(packageName)) {
+                    service.clearAccounts(packageName);
+                }
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#clearAccountsForPackage", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#clearAccountsForPackage", e);
         }
     }
 
@@ -1409,14 +1429,15 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public ComponentName getDefaultPhoneApp() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getDefaultPhoneApp();
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getDefaultPhoneApp();
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException attempting to get the default phone app.", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException attempting to get the default phone app.", e);
         }
         return null;
     }
@@ -1428,12 +1449,13 @@
      *         selected as the default dialer.
      */
     public String getDefaultDialerPackage() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getDefaultDialerPackage();
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getDefaultDialerPackage();
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException attempting to get the default dialer package name.", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException attempting to get the default dialer package name.", e);
         }
         return null;
     }
@@ -1449,13 +1471,14 @@
     @SystemApi
     @RequiresPermission(READ_PRIVILEGED_PHONE_STATE)
     public @Nullable String getDefaultDialerPackage(@NonNull UserHandle userHandle) {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getDefaultDialerPackageForUser(
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getDefaultDialerPackageForUser(
                         userHandle.getIdentifier());
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException attempting to get the default dialer package name.", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException attempting to get the default dialer package name.", e);
         }
         return null;
     }
@@ -1482,12 +1505,13 @@
             android.Manifest.permission.MODIFY_PHONE_STATE,
             android.Manifest.permission.WRITE_SECURE_SETTINGS})
     public boolean setDefaultDialer(@Nullable String packageName) {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().setDefaultDialer(packageName);
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.setDefaultDialer(packageName);
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException attempting to set the default dialer.", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException attempting to set the default dialer.", e);
         }
         return false;
     }
@@ -1499,12 +1523,13 @@
      *         preloaded.
      */
     public @Nullable String getSystemDialerPackage() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getSystemDialerPackage();
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getSystemDialerPackage();
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException attempting to get the system dialer package name.", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException attempting to get the system dialer package name.", e);
         }
         return null;
     }
@@ -1518,13 +1543,14 @@
      */
     @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
     public boolean isVoiceMailNumber(PhoneAccountHandle accountHandle, String number) {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().isVoiceMailNumber(accountHandle, number,
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.isVoiceMailNumber(accountHandle, number,
                         mContext.getOpPackageName(), mContext.getAttributionTag());
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException calling ITelecomService#isVoiceMailNumber.", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException calling ITelecomService#isVoiceMailNumber.", e);
         }
         return false;
     }
@@ -1538,13 +1564,14 @@
      */
     @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
     public String getVoiceMailNumber(PhoneAccountHandle accountHandle) {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getVoiceMailNumber(accountHandle,
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getVoiceMailNumber(accountHandle,
                         mContext.getOpPackageName(), mContext.getAttributionTag());
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException calling ITelecomService#hasVoiceMailNumber.", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException calling ITelecomService#hasVoiceMailNumber.", e);
         }
         return null;
     }
@@ -1569,13 +1596,14 @@
             android.Manifest.permission.READ_PHONE_NUMBERS
             }, conditional = true)
     public String getLine1Number(PhoneAccountHandle accountHandle) {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getLine1Number(accountHandle,
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getLine1Number(accountHandle,
                         mContext.getOpPackageName(), mContext.getAttributionTag());
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException calling ITelecomService#getLine1Number.", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException calling ITelecomService#getLine1Number.", e);
         }
         return null;
     }
@@ -1589,13 +1617,14 @@
      */
     @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
     public boolean isInCall() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().isInCall(mContext.getOpPackageName(),
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.isInCall(mContext.getOpPackageName(),
                         mContext.getAttributionTag());
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException calling isInCall().", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException calling isInCall().", e);
         }
         return false;
     }
@@ -1610,15 +1639,16 @@
      *      companion app; {@code false} otherwise.
      */
     public boolean hasCompanionInCallServiceAccess() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().hasCompanionInCallServiceAccess(
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.hasCompanionInCallServiceAccess(
                         mContext.getOpPackageName());
-            }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException calling hasCompanionInCallServiceAccess().", e);
-            if (!isSystemProcess()) {
-                e.rethrowAsRuntimeException();
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException calling hasCompanionInCallServiceAccess().", e);
+                if (!isSystemProcess()) {
+                    e.rethrowAsRuntimeException();
+                }
             }
         }
         return false;
@@ -1637,13 +1667,14 @@
      */
     @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
     public boolean isInManagedCall() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().isInManagedCall(mContext.getOpPackageName(),
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.isInManagedCall(mContext.getOpPackageName(),
                         mContext.getAttributionTag());
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException calling isInManagedCall().", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException calling isInManagedCall().", e);
         }
         return false;
     }
@@ -1666,12 +1697,13 @@
      */
     @SystemApi
     public @CallState int getCallState() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getCallState();
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getCallState();
+            } catch (RemoteException e) {
+                Log.d(TAG, "RemoteException calling getCallState().", e);
             }
-        } catch (RemoteException e) {
-            Log.d(TAG, "RemoteException calling getCallState().", e);
         }
         return TelephonyManager.CALL_STATE_IDLE;
     }
@@ -1688,12 +1720,13 @@
             android.Manifest.permission.READ_PHONE_STATE
     })
     public boolean isRinging() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().isRinging(mContext.getOpPackageName());
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.isRinging(mContext.getOpPackageName());
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException attempting to get ringing state of phone app.", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException attempting to get ringing state of phone app.", e);
         }
         return false;
     }
@@ -1716,12 +1749,13 @@
     @RequiresPermission(Manifest.permission.ANSWER_PHONE_CALLS)
     @Deprecated
     public boolean endCall() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().endCall(mContext.getPackageName());
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.endCall(mContext.getPackageName());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#endCall", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#endCall", e);
         }
         return false;
     }
@@ -1742,12 +1776,13 @@
             {Manifest.permission.ANSWER_PHONE_CALLS, Manifest.permission.MODIFY_PHONE_STATE})
     @Deprecated
     public void acceptRingingCall() {
-        try {
-            if (isServiceConnected()) {
-                getTelecomService().acceptRingingCall(mContext.getPackageName());
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                service.acceptRingingCall(mContext.getPackageName());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#acceptRingingCall", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#acceptRingingCall", e);
         }
     }
 
@@ -1763,13 +1798,14 @@
             {Manifest.permission.ANSWER_PHONE_CALLS, Manifest.permission.MODIFY_PHONE_STATE})
     @Deprecated
     public void acceptRingingCall(int videoState) {
-        try {
-            if (isServiceConnected()) {
-                getTelecomService().acceptRingingCallWithVideoState(
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                service.acceptRingingCallWithVideoState(
                         mContext.getPackageName(), videoState);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#acceptRingingCallWithVideoState", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#acceptRingingCallWithVideoState", e);
         }
     }
 
@@ -1793,12 +1829,13 @@
      */
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
     public void silenceRinger() {
-        try {
-            if (isServiceConnected()) {
-                getTelecomService().silenceRinger(mContext.getOpPackageName());
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                service.silenceRinger(mContext.getOpPackageName());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error calling ITelecomService#silenceRinger", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelecomService#silenceRinger", e);
         }
     }
 
@@ -1810,13 +1847,14 @@
             android.Manifest.permission.READ_PHONE_STATE
     })
     public boolean isTtySupported() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().isTtySupported(mContext.getOpPackageName(),
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.isTtySupported(mContext.getOpPackageName(),
                         mContext.getAttributionTag());
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException attempting to get TTY supported state.", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException attempting to get TTY supported state.", e);
         }
         return false;
     }
@@ -1834,13 +1872,14 @@
     @SystemApi
     @RequiresPermission(READ_PRIVILEGED_PHONE_STATE)
     public @TtyMode int getCurrentTtyMode() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().getCurrentTtyMode(mContext.getOpPackageName(),
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.getCurrentTtyMode(mContext.getOpPackageName(),
                         mContext.getAttributionTag());
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException attempting to get the current TTY mode.", e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException attempting to get the current TTY mode.", e);
         }
         return TTY_MODE_OFF;
     }
@@ -1876,8 +1915,9 @@
      *            {@link ConnectionService#onCreateIncomingConnection}.
      */
     public void addNewIncomingCall(PhoneAccountHandle phoneAccount, Bundle extras) {
-        try {
-            if (isServiceConnected()) {
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
                 if (extras != null && extras.getBoolean(EXTRA_IS_HANDOVER) &&
                         mContext.getApplicationContext().getApplicationInfo().targetSdkVersion >
                                 Build.VERSION_CODES.O_MR1) {
@@ -1885,11 +1925,10 @@
                             "acceptHandover for API > O-MR1");
                     return;
                 }
-                getTelecomService().addNewIncomingCall(
-                        phoneAccount, extras == null ? new Bundle() : extras);
+                service.addNewIncomingCall(phoneAccount, extras == null ? new Bundle() : extras);
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException adding a new incoming call: " + phoneAccount, e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException adding a new incoming call: " + phoneAccount, e);
         }
     }
 
@@ -1924,13 +1963,14 @@
      */
     public void addNewIncomingConference(@NonNull PhoneAccountHandle phoneAccount,
             @NonNull Bundle extras) {
-        try {
-            if (isServiceConnected()) {
-                getTelecomService().addNewIncomingConference(
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                service.addNewIncomingConference(
                         phoneAccount, extras == null ? new Bundle() : extras);
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException adding a new incoming conference: " + phoneAccount, e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException adding a new incoming conference: " + phoneAccount, e);
         }
     }
 
@@ -1947,13 +1987,14 @@
      */
     @SystemApi
     public void addNewUnknownCall(PhoneAccountHandle phoneAccount, Bundle extras) {
-        try {
-            if (isServiceConnected()) {
-                getTelecomService().addNewUnknownCall(
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                service.addNewUnknownCall(
                         phoneAccount, extras == null ? new Bundle() : extras);
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException adding a new unknown call: " + phoneAccount, e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException adding a new unknown call: " + phoneAccount, e);
         }
     }
 
@@ -2374,12 +2415,13 @@
      */
     public void acceptHandover(Uri srcAddr, @VideoProfile.VideoState int videoState,
             PhoneAccountHandle destAcct) {
-        try {
-            if (isServiceConnected()) {
-                getTelecomService().acceptHandover(srcAddr, videoState, destAcct);
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                service.acceptHandover(srcAddr, videoState, destAcct);
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException acceptHandover: " + e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException acceptHandover: " + e);
         }
     }
 
@@ -2393,13 +2435,14 @@
     @SystemApi
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
     public boolean isInEmergencyCall() {
-        try {
-            if (isServiceConnected()) {
-                return getTelecomService().isInEmergencyCall();
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                return service.isInEmergencyCall();
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException isInEmergencyCall: " + e);
+                return false;
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException isInEmergencyCall: " + e);
-            return false;
         }
         return false;
     }
@@ -2411,12 +2454,13 @@
      * @hide
      */
     public void handleCallIntent(Intent intent, String callingPackageProxy) {
-        try {
-            if (isServiceConnected()) {
-                getTelecomService().handleCallIntent(intent, callingPackageProxy);
+        ITelecomService service = getTelecomService();
+        if (service != null) {
+            try {
+                service.handleCallIntent(intent, callingPackageProxy);
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException handleCallIntent: " + e);
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException handleCallIntent: " + e);
         }
     }
 
@@ -2428,14 +2472,11 @@
         if (mTelecomServiceOverride != null) {
             return mTelecomServiceOverride;
         }
-        return ITelecomService.Stub.asInterface(ServiceManager.getService(Context.TELECOM_SERVICE));
-    }
-
-    private boolean isServiceConnected() {
-        boolean isConnected = getTelecomService() != null;
-        if (!isConnected) {
+        ITelecomService service = ITelecomService.Stub.asInterface(
+                ServiceManager.getService(Context.TELECOM_SERVICE));
+        if (service == null) {
             Log.w(TAG, "Telecom Service not found.");
         }
-        return isConnected;
+        return service;
     }
 }
diff --git a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
index b92d410..7629163 100644
--- a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
+++ b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
@@ -33,6 +33,7 @@
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.util.TelephonyUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -316,7 +317,7 @@
                 String[] packageNames = new String[enabledCarrierPackages.size()];
                 enabledCarrierPackages.toArray(packageNames);
                 permissionManager.grantDefaultPermissionsToEnabledCarrierApps(packageNames,
-                        UserHandle.of(userId), Runnable::run, isSuccess -> { });
+                        UserHandle.of(userId), TelephonyUtils.DIRECT_EXECUTOR, isSuccess -> { });
             }
         } catch (PackageManager.NameNotFoundException e) {
             Log.w(TAG, "Could not reach PackageManager", e);
diff --git a/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java b/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
index b8ca326..1252965 100644
--- a/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
+++ b/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
@@ -34,6 +34,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Supplier;
 
@@ -44,6 +45,8 @@
     public static boolean IS_USER = "user".equals(android.os.Build.TYPE);
     public static boolean IS_DEBUGGABLE = SystemProperties.getInt("ro.debuggable", 0) == 1;
 
+    public static final Executor DIRECT_EXECUTOR = Runnable::run;
+
     /**
      * Verify that caller holds {@link android.Manifest.permission#DUMP}.
      *
diff --git a/packages/CarSystemUI/res/values/themes.xml b/telephony/java/android/telephony/CarrierBandwidth.aidl
similarity index 63%
copy from packages/CarSystemUI/res/values/themes.xml
copy to telephony/java/android/telephony/CarrierBandwidth.aidl
index f82be3c..d0861b8 100644
--- a/packages/CarSystemUI/res/values/themes.xml
+++ b/telephony/java/android/telephony/CarrierBandwidth.aidl
@@ -1,13 +1,11 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
+/*
+ * Copyright 2020 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -15,9 +13,5 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
--->
-
-<resources>
-    <style name="Theme.Notification" parent="Theme.DeviceDefault.NoActionBar.Notification">
-    </style>
-</resources>
+package android.telephony;
+parcelable CarrierBandwidth;
\ No newline at end of file
diff --git a/telephony/java/android/telephony/CarrierBandwidth.java b/telephony/java/android/telephony/CarrierBandwidth.java
new file mode 100644
index 0000000..17747a3
--- /dev/null
+++ b/telephony/java/android/telephony/CarrierBandwidth.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+/**
+ * Defines downlink and uplink capacity of a network in kbps
+ * @hide
+ */
+@SystemApi
+public final class CarrierBandwidth implements Parcelable {
+    /**
+     * Any field that is not reported shall be set to INVALID
+     */
+    public static final int INVALID = -1;
+
+    /**
+     * Estimated downlink capacity in kbps of the primary carrier.
+     * This bandwidth estimate shall be the estimated maximum sustainable link bandwidth.
+     * This will be {@link #INVALID} if the network is not connected
+     */
+    private int mPrimaryDownlinkCapacityKbps;
+
+    /**
+     * Estimated uplink capacity in kbps of the primary carrier.
+     * This bandwidth estimate shall be the estimated maximum sustainable link bandwidth.
+     * This will be {@link #INVALID} if the network is not connected
+     */
+    private int mPrimaryUplinkCapacityKbps;
+
+    /**
+     * Estimated downlink capacity in kbps of the secondary carrier in a dual connected network.
+     * This bandwidth estimate shall be the estimated maximum sustainable link bandwidth.
+     * This will be {@link #INVALID} if the network is not connected
+     */
+    private int mSecondaryDownlinkCapacityKbps;
+
+    /**
+     * Estimated uplink capacity in kbps of the secondary carrier in a dual connected network.
+     * This bandwidth estimate shall be the estimated maximum sustainable link bandwidth.
+     * This will be {@link #INVALID} if the network is not connected
+     */
+    private int mSecondaryUplinkCapacityKbps;
+
+    /** @hide **/
+    public CarrierBandwidth(Parcel in) {
+        mPrimaryDownlinkCapacityKbps = in.readInt();
+        mPrimaryUplinkCapacityKbps = in.readInt();
+        mSecondaryDownlinkCapacityKbps = in.readInt();
+        mSecondaryUplinkCapacityKbps = in.readInt();
+    }
+
+    /** @hide **/
+    public CarrierBandwidth() {
+        mPrimaryDownlinkCapacityKbps = INVALID;
+        mPrimaryUplinkCapacityKbps = INVALID;
+        mSecondaryDownlinkCapacityKbps = INVALID;
+        mSecondaryUplinkCapacityKbps = INVALID;
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param primaryDownlinkCapacityKbps Estimated downlink capacity in kbps of
+     *        the primary carrier.
+     * @param primaryUplinkCapacityKbps Estimated uplink capacity in kbps of
+     *        the primary carrier.
+     * @param secondaryDownlinkCapacityKbps Estimated downlink capacity in kbps of
+     *        the secondary carrier
+     * @param secondaryUplinkCapacityKbps Estimated uplink capacity in kbps of
+     *        the secondary carrier
+     */
+    public CarrierBandwidth(int primaryDownlinkCapacityKbps, int primaryUplinkCapacityKbps,
+            int secondaryDownlinkCapacityKbps, int secondaryUplinkCapacityKbps) {
+        mPrimaryDownlinkCapacityKbps = primaryDownlinkCapacityKbps;
+        mPrimaryUplinkCapacityKbps = primaryUplinkCapacityKbps;
+        mSecondaryDownlinkCapacityKbps = secondaryDownlinkCapacityKbps;
+        mSecondaryUplinkCapacityKbps = secondaryUplinkCapacityKbps;
+    }
+
+    /**
+     * Retrieves the upstream bandwidth for the primary network in Kbps.  This always only refers to
+     * the estimated first hop transport bandwidth.
+     * This will be INVALID if the network is not connected
+     *
+     * @return The estimated first hop upstream (device to network) bandwidth.
+     */
+    public int getPrimaryDownlinkCapacityKbps() {
+        return mPrimaryDownlinkCapacityKbps;
+    }
+
+    /**
+     * Retrieves the downstream bandwidth for the primary network in Kbps.  This always only refers
+     * to the estimated first hop transport bandwidth.
+     * This will be INVALID if the network is not connected
+     *
+     * @return The estimated first hop downstream (network to device) bandwidth.
+     */
+    public int getPrimaryUplinkCapacityKbps() {
+        return mPrimaryUplinkCapacityKbps;
+    }
+
+    /**
+     * Retrieves the upstream bandwidth for the secondary network in Kbps.  This always only refers
+     * to the estimated first hop transport bandwidth.
+     * This will be INVALID if the network is not connected
+     *
+     * @return The estimated first hop upstream (device to network) bandwidth.
+     */
+    public int getSecondaryDownlinkCapacityKbps() {
+        return mSecondaryDownlinkCapacityKbps;
+    }
+
+    /**
+     * Retrieves the downstream bandwidth for the secondary network in Kbps.  This always only
+     * refers to the estimated first hop transport bandwidth.
+     * This will be INVALID if the network is not connected
+     *
+     * @return The estimated first hop downstream (network to device) bandwidth.
+     */
+    public int getSecondaryUplinkCapacityKbps() {
+        return mSecondaryUplinkCapacityKbps;
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return "CarrierBandwidth: {primaryDownlinkCapacityKbps=" + mPrimaryDownlinkCapacityKbps
+                + " primaryUplinkCapacityKbps=" + mPrimaryUplinkCapacityKbps
+                + " secondaryDownlinkCapacityKbps=" + mSecondaryDownlinkCapacityKbps
+                + " secondaryUplinkCapacityKbps=" + mSecondaryUplinkCapacityKbps
+                + "}";
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(
+                mPrimaryDownlinkCapacityKbps,
+                mPrimaryUplinkCapacityKbps,
+                mSecondaryDownlinkCapacityKbps,
+                mSecondaryUplinkCapacityKbps);
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o == null || !(o instanceof CallQuality) || hashCode() != o.hashCode()) {
+            return false;
+        }
+        if (this == o) {
+            return true;
+        }
+        CarrierBandwidth s = (CarrierBandwidth) o;
+        return (mPrimaryDownlinkCapacityKbps == s.mPrimaryDownlinkCapacityKbps
+                && mPrimaryUplinkCapacityKbps == s.mPrimaryUplinkCapacityKbps
+                && mSecondaryDownlinkCapacityKbps == s.mSecondaryDownlinkCapacityKbps
+                && mSecondaryDownlinkCapacityKbps == s.mSecondaryDownlinkCapacityKbps);
+    }
+
+    /**
+     * {@link Parcelable#describeContents}
+     */
+    public int describeContents() {
+        return 0;
+    }
+
+    /**
+     * {@link Parcelable#writeToParcel}
+     * @hide
+     */
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(mPrimaryDownlinkCapacityKbps);
+        dest.writeInt(mPrimaryUplinkCapacityKbps);
+        dest.writeInt(mSecondaryDownlinkCapacityKbps);
+        dest.writeInt(mSecondaryUplinkCapacityKbps);
+    }
+
+    public static final @android.annotation.NonNull Parcelable.Creator<CarrierBandwidth> CREATOR =
+            new Parcelable.Creator() {
+            public CarrierBandwidth createFromParcel(Parcel in) {
+                return new CarrierBandwidth(in);
+            }
+
+            public CarrierBandwidth[] newArray(int size) {
+                return new CarrierBandwidth[size];
+            }
+    };
+}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index b806313..902dc06 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -4792,7 +4792,7 @@
      */
     @NonNull
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public static PersistableBundle getDefaultConfig() {
         return new PersistableBundle(sDefaults);
     }
diff --git a/telephony/java/android/telephony/CellLocation.java b/telephony/java/android/telephony/CellLocation.java
index 8f5ec36..e595002 100644
--- a/telephony/java/android/telephony/CellLocation.java
+++ b/telephony/java/android/telephony/CellLocation.java
@@ -98,12 +98,14 @@
     /**
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract void fillInNotifierBundle(Bundle bundle);
 
     /**
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
     public abstract boolean isEmpty();
 
@@ -111,6 +113,7 @@
      * Invalidate this object.  The location area code and the cell id are set to -1.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract void setStateInvalid();
 
     /**
diff --git a/telephony/java/android/telephony/ImsManager.java b/telephony/java/android/telephony/ImsManager.java
index 28feab2..42d7707 100644
--- a/telephony/java/android/telephony/ImsManager.java
+++ b/telephony/java/android/telephony/ImsManager.java
@@ -22,7 +22,12 @@
 import android.annotation.SystemApi;
 import android.annotation.SystemService;
 import android.content.Context;
+import android.telephony.BinderCacheManager;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyFrameworkInitializer;
+import android.telephony.ims.aidl.IImsRcsController;
+
+import com.android.internal.telephony.ITelephony;
 
 /**
  * Provides access to information about Telephony IMS services on the device.
@@ -30,8 +35,6 @@
 @SystemService(Context.TELEPHONY_IMS_SERVICE)
 public class ImsManager {
 
-    private Context mContext;
-
     /**
      * <p>Broadcast Action: Indicates that a previously allowed IMS operation was rejected by the
      * network due to the network returning a "forbidden" response. This may be due to a
@@ -87,6 +90,14 @@
     public static final String EXTRA_WFC_REGISTRATION_FAILURE_MESSAGE =
             "android.telephony.ims.extra.WFC_REGISTRATION_FAILURE_MESSAGE";
 
+    // Cache Telephony Binder interfaces, one cache per process.
+    private static final BinderCacheManager<ITelephony> sTelephonyCache =
+            new BinderCacheManager<>(ImsManager::getITelephonyInterface);
+    private static final BinderCacheManager<IImsRcsController> sRcsCache =
+            new BinderCacheManager<>(ImsManager::getIImsRcsControllerInterface);
+
+    private final Context mContext;
+
     /**
      * Use {@link Context#getSystemService(String)} to get an instance of this class.
      * @hide
@@ -108,7 +119,7 @@
             throw new IllegalArgumentException("Invalid subscription ID: " + subscriptionId);
         }
 
-        return new ImsRcsManager(mContext, subscriptionId);
+        return new ImsRcsManager(mContext, subscriptionId, sRcsCache);
     }
 
     /**
@@ -124,17 +135,19 @@
             throw new IllegalArgumentException("Invalid subscription ID: " + subscriptionId);
         }
 
-        return new ImsMmTelManager(subscriptionId);
+        return new ImsMmTelManager(subscriptionId, sTelephonyCache);
     }
 
     /**
-     * Create an instance of SipDelegateManager for the subscription id specified.
+     * Create an instance of {@link SipDelegateManager} for the subscription id specified.
      * <p>
-     * Used for RCS single registration cases, where an IMS application needs to forward SIP
-     * traffic through the device's IMS service.
-     * @param subscriptionId The ID of the subscription that this SipDelegateManager will use.
+     * Allows an IMS application to forward SIP traffic through the device's IMS service,
+     * which is used for cellular carriers that require the device to share a single IMS
+     * registration for both MMTEL and RCS features.
+     * @param subscriptionId The ID of the subscription that this {@link SipDelegateManager} will
+     *                       be bound to.
      * @throws IllegalArgumentException if the subscription is invalid.
-     * @return a SipDelegateManager instance for the specified subscription ID.
+     * @return a {@link SipDelegateManager} instance for the specified subscription ID.
      * @hide
      */
     @SystemApi
@@ -144,6 +157,22 @@
             throw new IllegalArgumentException("Invalid subscription ID: " + subscriptionId);
         }
 
-        return new SipDelegateManager(mContext, subscriptionId);
+        return new SipDelegateManager(mContext, subscriptionId, sRcsCache);
+    }
+
+    private static IImsRcsController getIImsRcsControllerInterface() {
+        return IImsRcsController.Stub.asInterface(
+                TelephonyFrameworkInitializer
+                        .getTelephonyServiceManager()
+                        .getTelephonyImsServiceRegisterer()
+                        .get());
+    }
+
+    private static ITelephony getITelephonyInterface() {
+        return ITelephony.Stub.asInterface(
+                TelephonyFrameworkInitializer
+                        .getTelephonyServiceManager()
+                        .getTelephonyServiceRegisterer()
+                        .get());
     }
 }
diff --git a/telephony/java/android/telephony/NetworkRegistrationInfo.java b/telephony/java/android/telephony/NetworkRegistrationInfo.java
index f8a200a..8507d85 100644
--- a/telephony/java/android/telephony/NetworkRegistrationInfo.java
+++ b/telephony/java/android/telephony/NetworkRegistrationInfo.java
@@ -20,6 +20,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
+import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.telephony.AccessNetworkConstants.TransportType;
@@ -635,7 +636,8 @@
                 .append(" cellIdentity=").append(mCellIdentity)
                 .append(" voiceSpecificInfo=").append(mVoiceSpecificInfo)
                 .append(" dataSpecificInfo=").append(mDataSpecificInfo)
-                .append(" nrState=").append(nrStateToString(mNrState))
+                .append(" nrState=").append(Build.IS_DEBUGGABLE
+                        ? nrStateToString(mNrState) : "****")
                 .append(" rRplmn=").append(mRplmn)
                 .append(" isUsingCarrierAggregation=").append(mIsUsingCarrierAggregation)
                 .append("}").toString();
diff --git a/telephony/java/android/telephony/PinResult.java b/telephony/java/android/telephony/PinResult.java
index c2a4f33..b8c1ffe 100644
--- a/telephony/java/android/telephony/PinResult.java
+++ b/telephony/java/android/telephony/PinResult.java
@@ -19,6 +19,7 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -27,10 +28,16 @@
 import java.util.Objects;
 
 /**
- * Holds the result from a pin attempt.
+ * Holds the result from a PIN attempt.
+ *
+ * @see TelephonyManager#supplyIccLockPin
+ * @see TelephonyManager#supplyIccLockPuk
+ * @see TelephonyManager#setIccLockEnabled
+ * @see TelephonyManager#changeIccLockPin
  *
  * @hide
  */
+@SystemApi
 public final class PinResult implements Parcelable {
     /** @hide */
     @IntDef({
@@ -64,24 +71,24 @@
     private static final PinResult sFailedResult =
             new PinResult(PinResult.PIN_RESULT_TYPE_FAILURE, -1);
 
-    private final @PinResultType int mType;
+    private final @PinResultType int mResult;
 
     private final int mAttemptsRemaining;
 
     /**
-     * Returns either success, incorrect or failure.
+     * Returns the result of the PIN attempt.
      *
-     * @see #PIN_RESULT_TYPE_SUCCESS
-     * @see #PIN_RESULT_TYPE_INCORRECT
-     * @see #PIN_RESULT_TYPE_FAILURE
-     * @return The result type of the pin attempt.
+     * @return The result of the PIN attempt.
      */
-    public @PinResultType int getType() {
-        return mType;
+    public @PinResultType int getResult() {
+        return mResult;
     }
 
     /**
-     * The number of pin attempts remaining.
+     * Returns the number of PIN attempts remaining.
+     * This will be set when {@link #getResult} is {@link #PIN_RESULT_TYPE_INCORRECT}.
+     * Indicates the number of attempts at entering the PIN before the SIM will be locked and
+     * require a PUK unlock to be performed.
      *
      * @return Number of attempts remaining.
      */
@@ -89,22 +96,32 @@
         return mAttemptsRemaining;
     }
 
+    /**
+     * Used to indicate a failed PIN attempt result.
+     *
+     * @return default PinResult for failure.
+     *
+     * @hide
+     */
     @NonNull
     public static PinResult getDefaultFailedResult() {
         return sFailedResult;
     }
 
     /**
-     * PinResult constructor
+     * PinResult constructor.
      *
-     * @param type The type of pin result.
+     * @param result The pin result value.
      * @see #PIN_RESULT_TYPE_SUCCESS
      * @see #PIN_RESULT_TYPE_INCORRECT
      * @see #PIN_RESULT_TYPE_FAILURE
+     * @see #PIN_RESULT_TYPE_ABORTED
      * @param attemptsRemaining Number of pin attempts remaining.
+     *
+     * @hide
      */
-    public PinResult(@PinResultType int type, int attemptsRemaining) {
-        mType = type;
+    public PinResult(@PinResultType int result, int attemptsRemaining) {
+        mResult = result;
         mAttemptsRemaining = attemptsRemaining;
     }
 
@@ -114,7 +131,7 @@
      * @hide
      */
     private PinResult(Parcel in) {
-        mType = in.readInt();
+        mResult = in.readInt();
         mAttemptsRemaining = in.readInt();
     }
 
@@ -124,11 +141,11 @@
     @NonNull
     @Override
     public String toString() {
-        return "type: " + getType() + ", attempts remaining: " + getAttemptsRemaining();
+        return "result: " + getResult() + ", attempts remaining: " + getAttemptsRemaining();
     }
 
     /**
-     * Required to be Parcelable
+     * Describe the contents of this object.
      */
     @Override
     public int describeContents() {
@@ -136,15 +153,17 @@
     }
 
     /**
-     * Required to be Parcelable
+     * Write this object to a Parcel.
      */
     @Override
     public void writeToParcel(@NonNull Parcel out, int flags) {
-        out.writeInt(mType);
+        out.writeInt(mResult);
         out.writeInt(mAttemptsRemaining);
     }
 
-    /** Required to be Parcelable */
+    /**
+     * Parcel creator class.
+     */
     public static final @NonNull Parcelable.Creator<PinResult> CREATOR = new Creator<PinResult>() {
         public PinResult createFromParcel(Parcel in) {
             return new PinResult(in);
@@ -156,7 +175,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(mAttemptsRemaining, mType);
+        return Objects.hash(mAttemptsRemaining, mResult);
     }
 
     @Override
@@ -171,7 +190,7 @@
             return false;
         }
         PinResult other = (PinResult) obj;
-        return (mType == other.mType
+        return (mResult == other.mResult
                 && mAttemptsRemaining == other.mAttemptsRemaining);
     }
 }
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 41b3ee6..dedb1af 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -1102,7 +1102,8 @@
                     .append(", isUsingCarrierAggregation=").append(isUsingCarrierAggregation())
                     .append(", mLteEarfcnRsrpBoost=").append(mLteEarfcnRsrpBoost)
                     .append(", mNetworkRegistrationInfos=").append(mNetworkRegistrationInfos)
-                    .append(", mNrFrequencyRange=").append(mNrFrequencyRange)
+                    .append(", mNrFrequencyRange=").append(Build.IS_DEBUGGABLE
+                            ? mNrFrequencyRange : FREQUENCY_RANGE_UNKNOWN)
                     .append(", mOperatorAlphaLongRaw=").append(mOperatorAlphaLongRaw)
                     .append(", mOperatorAlphaShortRaw=").append(mOperatorAlphaShortRaw)
                     .append(", mIsDataRoamingFromRegistration=")
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index e65b641..4eacad3 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -4661,7 +4661,7 @@
      * be implemented instead.
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void setVisualVoicemailEnabled(PhoneAccountHandle phoneAccountHandle, boolean enabled){
     }
 
@@ -4676,7 +4676,7 @@
      */
     @SystemApi
     @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public boolean isVisualVoicemailEnabled(PhoneAccountHandle phoneAccountHandle){
         return false;
     }
@@ -4695,7 +4695,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     @Nullable
     public Bundle getVisualVoicemailSettings(){
         try {
@@ -8621,7 +8621,7 @@
 
     /** @hide */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public int checkCarrierPrivilegesForPackage(String pkgName) {
         try {
             ITelephony telephony = getITelephony();
@@ -8637,7 +8637,7 @@
 
     /** @hide */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public int checkCarrierPrivilegesForPackageAnyPhone(String pkgName) {
         try {
             ITelephony telephony = getITelephony();
@@ -8713,7 +8713,7 @@
 
     /** @hide */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void dial(String number) {
         try {
             ITelephony telephony = getITelephony();
@@ -8772,7 +8772,7 @@
      */
     @Deprecated
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void silenceRinger() {
         // No-op
     }
@@ -8871,9 +8871,13 @@
         return false;
     }
 
-    /** @hide */
+    /**
+     * @deprecated use {@link #supplyIccLockPin(String)} instead.
+     * @hide
+     */
     @SystemApi
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+    @Deprecated
     public int[] supplyPinReportResult(String pin) {
         try {
             ITelephony telephony = getITelephony();
@@ -8885,65 +8889,91 @@
         return new int[0];
     }
 
-    /** @hide */
+    /**
+     * @deprecated use {@link #supplyIccLockPuk(String, String)} instead.
+     * @hide
+     */
     @SystemApi
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+    @Deprecated
     public int[] supplyPukReportResult(String puk, String pin) {
         try {
             ITelephony telephony = getITelephony();
             if (telephony != null)
                 return telephony.supplyPukReportResultForSubscriber(getSubId(), puk, pin);
         } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelephony#]", e);
+            Log.e(TAG, "Error calling ITelephony#supplyPukReportResultForSubscriber", e);
         }
         return new int[0];
     }
 
     /**
-     * Used when the user attempts to enter their pin.
+     * Supplies a PIN to unlock the ICC and returns the corresponding {@link PinResult}.
+     * Used when the user enters their ICC unlock PIN to attempt an unlock.
      *
-     * @param pin The user entered pin.
-     * @return The result of the pin.
+     * @param pin The user entered PIN.
+     * @return The result of the PIN.
+     * @throws SecurityException if the caller doesn't have the permission.
+     * @throws IllegalStateException if the Telephony process is not currently available.
+     *
+     * <p>Requires Permission:
+     * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
+     * app has carrier privileges (see {@link #hasCarrierPrivileges}).
      *
      * @hide
      */
-    @Nullable
+    @SystemApi
+    @NonNull
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
-    public PinResult supplyPinReportPinResult(@NonNull String pin) {
+    public PinResult supplyIccLockPin(@NonNull String pin) {
         try {
             ITelephony telephony = getITelephony();
             if (telephony != null) {
                 int[] result = telephony.supplyPinReportResultForSubscriber(getSubId(), pin);
                 return new PinResult(result[0], result[1]);
+            } else {
+                throw new IllegalStateException("telephony service is null.");
             }
         } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelephony#supplyPinReportResultForSubscriber", e);
+            Log.e(TAG, "Error calling ITelephony#supplyIccLockPin", e);
+            e.rethrowFromSystemServer();
         }
-        return null;
+        return PinResult.getDefaultFailedResult();
     }
 
     /**
-     * Used when the user attempts to enter the puk or their pin.
+     * Supplies a PUK and PIN to unlock the ICC and returns the corresponding {@link PinResult}.
+     * Used when the user enters their ICC unlock PUK and PIN to attempt an unlock.
      *
-     * @param puk The product unblocking key.
-     * @param pin The user entered pin.
-     * @return The result of the pin.
+     * @param puk The product unlocking key.
+     * @param pin The user entered PIN.
+     * @return The result of the PUK and PIN.
+     * @throws SecurityException if the caller doesn't have the permission.
+     * @throws IllegalStateException if the Telephony process is not currently available.
+     *
+     * <p>Requires Permission:
+     * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
+     * app has carrier privileges (see {@link #hasCarrierPrivileges}).
      *
      * @hide
      */
-    @Nullable
+    @SystemApi
+    @NonNull
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
-    public PinResult supplyPukReportPinResult(@NonNull String puk, @NonNull String pin) {
+    public PinResult supplyIccLockPuk(@NonNull String puk, @NonNull String pin) {
         try {
             ITelephony telephony = getITelephony();
             if (telephony != null) {
                 int[] result = telephony.supplyPukReportResultForSubscriber(getSubId(), puk, pin);
                 return new PinResult(result[0], result[1]);
+            } else {
+                throw new IllegalStateException("telephony service is null.");
             }
         } catch (RemoteException e) {
-            Log.e(TAG, "Error calling ITelephony#]", e);
+            Log.e(TAG, "Error calling ITelephony#supplyIccLockPuk", e);
+            e.rethrowFromSystemServer();
         }
-        return null;
+        return PinResult.getDefaultFailedResult();
     }
 
     /**
@@ -13628,18 +13658,22 @@
     }
 
     /**
-     * The IccLock state or password was changed successfully.
+     * Indicates that the ICC PIN lock state or PIN was changed successfully.
      * @hide
      */
     public static final int CHANGE_ICC_LOCK_SUCCESS = Integer.MAX_VALUE;
 
     /**
-     * Check whether ICC pin lock is enabled.
-     * This is a sync call which returns the cached pin enabled state.
+     * Check whether ICC PIN lock is enabled.
+     * This is a sync call which returns the cached PIN enabled state.
      *
-     * @return {@code true} if ICC lock enabled, {@code false} if ICC lock disabled.
-     *
+     * @return {@code true} if ICC PIN lock enabled, {@code false} if disabled.
      * @throws SecurityException if the caller doesn't have the permission.
+     * @throws IllegalStateException if the Telephony process is not currently available.
+     *
+     * <p>Requires Permission:
+     * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE}
+     * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
      *
      * @hide
      */
@@ -13651,81 +13685,124 @@
             ITelephony telephony = getITelephony();
             if (telephony != null) {
                 return telephony.isIccLockEnabled(getSubId());
+            } else {
+                throw new IllegalStateException("telephony service is null.");
             }
         } catch (RemoteException e) {
             Log.e(TAG, "isIccLockEnabled RemoteException", e);
+            e.rethrowFromSystemServer();
         }
         return false;
     }
 
     /**
-     * Set the ICC pin lock enabled or disabled.
+     * Enable or disable the ICC PIN lock.
      *
-     * If enable/disable ICC pin lock successfully, a value of {@link Integer#MAX_VALUE} is
-     * returned.
-     * If an incorrect old password is specified, the return value will indicate how many more
-     * attempts the user can make to change the password before the SIM is locked.
-     * Using PUK code to unlock SIM if enter the incorrect old password 3 times.
-     *
-     * @param enabled    "true" for locked, "false" for unlocked.
-     * @param password   needed to change the ICC pin state, aka. Pin1
-     * @return an integer representing the status of IccLock enabled or disabled in the following
-     * three cases:
-     *   - {@link TelephonyManager#CHANGE_ICC_LOCK_SUCCESS} if enabled or disabled IccLock
-     *   successfully.
-     *   - Positive number and zero for remaining password attempts.
-     *   - Negative number for other failure cases (such like enabling/disabling PIN failed).
-     *
+     * @param enabled "true" for locked, "false" for unlocked.
+     * @param pin needed to change the ICC PIN lock, aka. Pin1.
+     * @return the result of enabling or disabling the ICC PIN lock.
      * @throws SecurityException if the caller doesn't have the permission.
+     * @throws IllegalStateException if the Telephony process is not currently available.
+     *
+     * <p>Requires Permission:
+     * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
+     * app has carrier privileges (see {@link #hasCarrierPrivileges}).
      *
      * @hide
      */
+    @SystemApi
+    @NonNull
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
-    public int setIccLockEnabled(boolean enabled, @NonNull String password) {
-        checkNotNull(password, "setIccLockEnabled password can't be null.");
+    public PinResult setIccLockEnabled(boolean enabled, @NonNull String pin) {
+        checkNotNull(pin, "setIccLockEnabled pin can't be null.");
         try {
             ITelephony telephony = getITelephony();
             if (telephony != null) {
-                return telephony.setIccLockEnabled(getSubId(), enabled, password);
+                int result = telephony.setIccLockEnabled(getSubId(), enabled, pin);
+                if (result == CHANGE_ICC_LOCK_SUCCESS) {
+                    return new PinResult(PinResult.PIN_RESULT_TYPE_SUCCESS, 0);
+                } else if (result < 0) {
+                    return PinResult.getDefaultFailedResult();
+                } else {
+                    return new PinResult(PinResult.PIN_RESULT_TYPE_INCORRECT, result);
+                }
+            } else {
+                throw new IllegalStateException("telephony service is null.");
             }
         } catch (RemoteException e) {
             Log.e(TAG, "setIccLockEnabled RemoteException", e);
+            e.rethrowFromSystemServer();
         }
-        return 0;
+        return PinResult.getDefaultFailedResult();
     }
 
     /**
-     * Change the ICC password used in ICC pin lock.
+     * Change the ICC lock PIN.
      *
-     * If the password was changed successfully, a value of {@link Integer#MAX_VALUE} is returned.
-     * If an incorrect old password is specified, the return value will indicate how many more
-     * attempts the user can make to change the password before the SIM is locked.
-     * Using PUK code to unlock SIM if enter the incorrect old password 3 times.
-     *
-     * @param oldPassword is the old password
-     * @param newPassword is the new password
-     * @return an integer representing the status of IccLock changed in the following three cases:
-     *   - {@link TelephonyManager#CHANGE_ICC_LOCK_SUCCESS} if changed IccLock successfully.
-     *   - Positive number and zero for remaining password attempts.
-     *   - Negative number for other failure cases (such like enabling/disabling PIN failed).
-     *
+     * @param oldPin is the old PIN
+     * @param newPin is the new PIN
+     * @return The result of changing the ICC lock PIN.
      * @throws SecurityException if the caller doesn't have the permission.
+     * @throws IllegalStateException if the Telephony process is not currently available.
+     *
+     * <p>Requires Permission:
+     * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
+     * app has carrier privileges (see {@link #hasCarrierPrivileges}).
      *
      * @hide
      */
+    @SystemApi
+    @NonNull
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
-    public int changeIccLockPassword(@NonNull String oldPassword, @NonNull String newPassword) {
-        checkNotNull(oldPassword, "changeIccLockPassword oldPassword can't be null.");
-        checkNotNull(newPassword, "changeIccLockPassword newPassword can't be null.");
+    public PinResult changeIccLockPin(@NonNull String oldPin, @NonNull String newPin) {
+        checkNotNull(oldPin, "changeIccLockPin oldPin can't be null.");
+        checkNotNull(newPin, "changeIccLockPin newPin can't be null.");
         try {
             ITelephony telephony = getITelephony();
             if (telephony != null) {
-                return telephony.changeIccLockPassword(getSubId(), oldPassword, newPassword);
+                int result = telephony.changeIccLockPassword(getSubId(), oldPin, newPin);
+                if (result == CHANGE_ICC_LOCK_SUCCESS) {
+                    return new PinResult(PinResult.PIN_RESULT_TYPE_SUCCESS, 0);
+                } else if (result < 0) {
+                    return PinResult.getDefaultFailedResult();
+                } else {
+                    return new PinResult(PinResult.PIN_RESULT_TYPE_INCORRECT, result);
+                }
+            } else {
+                throw new IllegalStateException("telephony service is null.");
             }
         } catch (RemoteException e) {
-            Log.e(TAG, "changeIccLockPassword RemoteException", e);
+            Log.e(TAG, "changeIccLockPin RemoteException", e);
+            e.rethrowFromSystemServer();
         }
-        return 0;
+        return PinResult.getDefaultFailedResult();
+    }
+
+    /**
+     * Get carrier bandwidth. In case of Dual connected network this will report
+     * bandwidth per primary and secondary network.
+     * @return CarrierBandwidth with bandwidth of both primary and secondary carrier.
+     * @throws IllegalStateException if the Telephony process is not currently available.
+     * @hide
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+    @NonNull
+    public CarrierBandwidth getCarrierBandwidth() {
+        try {
+            ITelephony service = getITelephony();
+            if (service != null) {
+                return service.getCarrierBandwidth(getSubId());
+            } else {
+                throw new IllegalStateException("telephony service is null.");
+            }
+        } catch (RemoteException ex) {
+            Log.e(TAG, "getCarrierBandwidth RemoteException", ex);
+            ex.rethrowFromSystemServer();
+        }
+
+        //Should not reach. Adding return statement to make compiler happy
+        return null;
     }
 
     /**
diff --git a/telephony/java/android/telephony/data/ApnSetting.java b/telephony/java/android/telephony/data/ApnSetting.java
index ff9329ef..d58fa912 100644
--- a/telephony/java/android/telephony/data/ApnSetting.java
+++ b/telephony/java/android/telephony/data/ApnSetting.java
@@ -18,6 +18,8 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.StringDef;
+import android.annotation.SystemApi;
 import android.content.ContentValues;
 import android.database.Cursor;
 import android.hardware.radio.V1_5.ApnTypes;
@@ -26,6 +28,7 @@
 import android.os.Parcelable;
 import android.provider.Telephony;
 import android.provider.Telephony.Carriers;
+import android.telephony.Annotation;
 import android.telephony.Annotation.ApnType;
 import android.telephony.Annotation.NetworkType;
 import android.telephony.ServiceState;
@@ -133,6 +136,25 @@
     @Retention(RetentionPolicy.SOURCE)
     public @interface Skip464XlatStatus {}
 
+    /** @hide */
+    @StringDef(value = {
+            TYPE_ALL_STRING,
+            TYPE_CBS_STRING,
+            TYPE_DEFAULT_STRING,
+            TYPE_DUN_STRING,
+            TYPE_EMERGENCY_STRING,
+            TYPE_FOTA_STRING,
+            TYPE_HIPRI_STRING,
+            TYPE_IA_STRING,
+            TYPE_IMS_STRING,
+            TYPE_MCX_STRING,
+            TYPE_MMS_STRING,
+            TYPE_SUPL_STRING,
+            TYPE_XCAP_STRING,
+    }, prefix = "TYPE_", suffix = "_STRING")
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ApnTypeString {}
+
     /**
      * APN types for data connections.  These are usage categories for an APN
      * entry.  One APN entry may support multiple APN types, eg, a single APN
@@ -140,99 +162,133 @@
      * connections.<br/>
      * APN_TYPE_ALL is a special type to indicate that this APN entry can
      * service all data connections.
-     * <p>
-     * Note: The goal is to deprecate this.  Due to the Carrier Table being used
-     * directly, this isn't feasible right now.
      *
      * @hide
      */
+    @SystemApi
     public static final String TYPE_ALL_STRING = "*";
 
     /**
      * APN type for default data traffic
      *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
      * @hide
      */
+    @SystemApi
     public static final String TYPE_DEFAULT_STRING = "default";
 
 
     /**
-     * APN type for MMS traffic
+     * APN type for MMS (Multimedia Messaging Service) traffic.
      *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
      * @hide
      */
+    @SystemApi
     public static final String TYPE_MMS_STRING = "mms";
 
 
     /**
-     * APN type for SUPL assisted GPS
+     * APN type for SUPL (Secure User Plane Location) assisted GPS.
      *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
      * @hide
      */
+    @SystemApi
     public static final String TYPE_SUPL_STRING = "supl";
 
     /**
-     * APN type for DUN traffic
+     * APN type for DUN (Dial-up networking) traffic
      *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
      * @hide
      */
+    @SystemApi
     public static final String TYPE_DUN_STRING = "dun";
 
     /**
-     * APN type for HiPri traffic
+     * APN type for high-priority traffic
      *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
      * @hide
      */
+    @SystemApi
     public static final String TYPE_HIPRI_STRING = "hipri";
 
     /**
-     * APN type for FOTA
+     * APN type for FOTA (Firmware over-the-air) traffic.
      *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
      * @hide
      */
+    @SystemApi
     public static final String TYPE_FOTA_STRING = "fota";
 
     /**
-     * APN type for IMS
+     * APN type for IMS (IP Multimedia Subsystem) traffic.
      *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
      * @hide
      */
+    @SystemApi
     public static final String TYPE_IMS_STRING = "ims";
 
     /**
-     * APN type for CBS
+     * APN type for CBS (Carrier Branded Services) traffic.
      *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
      * @hide
      */
+    @SystemApi
     public static final String TYPE_CBS_STRING = "cbs";
 
     /**
-     * APN type for IA Initial Attach APN
+     * APN type for the IA (Initial Attach) APN
      *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
      * @hide
      */
+    @SystemApi
     public static final String TYPE_IA_STRING = "ia";
 
     /**
      * APN type for Emergency PDN. This is not an IA apn, but is used
      * for access to carrier services in an emergency call situation.
      *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
      * @hide
      */
+    @SystemApi
     public static final String TYPE_EMERGENCY_STRING = "emergency";
 
     /**
-     * APN type for Mission Critical Services
+     * APN type for Mission Critical Services.
      *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
      * @hide
      */
+    @SystemApi
     public static final String TYPE_MCX_STRING = "mcx";
 
     /**
-     * APN type for XCAP
+     * APN type for XCAP (XML Configuration Access Protocol) traffic.
      *
+     * Note: String representations of APN types are intended for system apps to communicate with
+     * modem components or carriers. Non-system apps should use the integer variants instead.
      * @hide
      */
+    @SystemApi
     public static final String TYPE_XCAP_STRING = "xcap";
 
 
@@ -1426,16 +1482,43 @@
     }
 
     /**
-     * @param apnType APN type
-     * @return APN type in string format
+     * Converts the integer representation of APN type to its string representation.
+     *
+     * @param apnType APN type as an integer
+     * @return String representation of the APN type, or an empty string if the provided integer is
+     * not a valid APN type.
      * @hide
      */
-    public static String getApnTypeString(int apnType) {
+    @SystemApi
+    public static @NonNull @ApnTypeString String getApnTypeString(@Annotation.ApnType int apnType) {
         if (apnType == TYPE_ALL) {
             return "*";
         }
         String apnTypeString = APN_TYPE_INT_MAP.get(apnType);
-        return apnTypeString == null ? "Unknown" : apnTypeString;
+        return apnTypeString == null ? "" : apnTypeString;
+    }
+
+    /**
+     * Same as {@link #getApnTypeString(int)}, but returns "Unknown" instead of an empty string
+     * when provided with an invalid int for compatibility purposes.
+     * @hide
+     */
+    public static @NonNull String getApnTypeStringInternal(@Annotation.ApnType int apnType) {
+        String result = getApnTypeString(apnType);
+        return TextUtils.isEmpty(result) ? "Unknown" : result;
+    }
+
+    /**
+     * Converts the string representation of an APN type to its integer representation.
+     *
+     * @param apnType APN type as a string
+     * @return Integer representation of the APN type, or 0 if the provided string is not a valid
+     * APN type.
+     * @hide
+     */
+    @SystemApi
+    public static @Annotation.ApnType int getApnTypeInt(@NonNull @ApnTypeString String apnType) {
+        return APN_TYPE_STRING_MAP.getOrDefault(apnType.toLowerCase(), 0);
     }
 
     /**
diff --git a/telephony/java/android/telephony/ims/DelegateMessageCallback.java b/telephony/java/android/telephony/ims/DelegateMessageCallback.java
new file mode 100644
index 0000000..beec4a6
--- /dev/null
+++ b/telephony/java/android/telephony/ims/DelegateMessageCallback.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.ims;
+
+import android.annotation.NonNull;
+import android.telephony.ims.stub.SipDelegate;
+
+/**
+ * Callback interface provided to the SipTransport implementation to notify a remote application of
+ * the following:
+ * <ul>
+ *     <li>A new incoming SIP message associated with the feature tags the SipDelegate registered
+ *     with has been received or an in-dialog request to this SipDelegate has been received.</li>
+ *     <li>Acknowledge that an outgoing SIP message from the RCS application has been sent
+ *     successfully or notify the application of the reason why it was not sent</li>
+ * </ul>
+ * @hide
+ */
+public interface DelegateMessageCallback {
+
+    /**
+     * Send a new incoming SIP message to the remote application for processing.
+     */
+    void onMessageReceived(@NonNull SipMessage message);
+
+    /**
+     * Notify the remote application that a previous request to send a SIP message using
+     * {@link SipDelegate#sendMessage} has succeeded.
+     *
+     * @param viaTransactionId The transaction ID found in the via header field of the
+     *         previously sent {@link SipMessage}.
+     */
+    void onMessageSent(@NonNull String viaTransactionId);
+
+    /**
+     * Notify the remote application that a previous request to send a SIP message using
+     * {@link SipDelegate#sendMessage} has failed.
+     *
+     * @param viaTransactionId The Transaction ID found in the via header field of the previously
+     *         sent {@link SipMessage}.
+     * @param reason The reason for the failure.
+     */
+    void onMessageSendFailure(@NonNull String viaTransactionId,
+            @SipDelegateManager.MessageFailureReason int reason);
+}
diff --git a/packages/CarSystemUI/res/values/themes.xml b/telephony/java/android/telephony/ims/DelegateRegistrationState.aidl
similarity index 63%
copy from packages/CarSystemUI/res/values/themes.xml
copy to telephony/java/android/telephony/ims/DelegateRegistrationState.aidl
index f82be3c..756ea92 100644
--- a/packages/CarSystemUI/res/values/themes.xml
+++ b/telephony/java/android/telephony/ims/DelegateRegistrationState.aidl
@@ -1,13 +1,11 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
+/*
+ * Copyright (c) 2020 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -15,9 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
--->
 
-<resources>
-    <style name="Theme.Notification" parent="Theme.DeviceDefault.NoActionBar.Notification">
-    </style>
-</resources>
+package android.telephony.ims;
+
+parcelable DelegateRegistrationState;
diff --git a/telephony/java/android/telephony/ims/DelegateRegistrationState.java b/telephony/java/android/telephony/ims/DelegateRegistrationState.java
new file mode 100644
index 0000000..4facfa7
--- /dev/null
+++ b/telephony/java/android/telephony/ims/DelegateRegistrationState.java
@@ -0,0 +1,327 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.ims;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.ArraySet;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Contains the full state of the IMS feature tags associated with a SipDelegate and managed by the
+ * ImsService.
+ * @hide
+ */
+public final class DelegateRegistrationState implements Parcelable {
+
+    /**
+     * This feature tag has been deregistered for an unknown reason. Outgoing out-of-dialog SIP
+     * messages associated with feature tags that are not registered will fail.
+     */
+    public static final int DEREGISTERED_REASON_UNKNOWN = 0;
+
+    /**
+     * This feature tag has been deregistered because it is not provisioned to be used on this radio
+     * access technology or PDN. Outgoing out-of-dialog SIP messages associated with feature tags
+     * that are not registered will fail.
+     * <p>
+     * There may be new incoming SIP dialog requests on a feature that that is not provisioned. It
+     * is still expected that the SipDelegateConnection responds to the request.
+     */
+    public static final int DEREGISTERED_REASON_NOT_PROVISIONED = 1;
+
+    /**
+     * This feature tag has been deregistered because IMS has been deregistered. All outgoing SIP
+     * messages will fail until IMS registration occurs.
+     */
+    public static final int DEREGISTERED_REASON_NOT_REGISTERED = 2;
+
+    /**
+     * This feature tag is being deregistered because the PDN that the IMS registration is on is
+     *changing.
+     * All open SIP dialogs need to be closed before the PDN change can proceed.
+     */
+    public static final int DEREGISTERING_REASON_PDN_CHANGE = 3;
+
+    /**
+     * This feature tag is being deregistered due to a provisioning change. This can be triggered by
+     * many things, such as a provisioning change triggered by the carrier network, a radio access
+     * technology change by the modem causing a different set of feature tags to be provisioned, or
+     * a user triggered hange, such as data being enabled/disabled.
+     * <p>
+     * All open SIP dialogs associated with the new deprovisioned feature tag need to be closed
+     * before the IMS registration modification can proceed.
+     */
+    public static final int DEREGISTERING_REASON_PROVISIONING_CHANGE = 4;
+
+    /**
+     * This feature tag is deregistering because the SipDelegate associated with this feature tag
+     * needs to change its supported feature set.
+     * <p>
+     * All open SIP Dialogs associated with this feature tag must be closed before this operation
+     * can proceed.
+     */
+    public static final int DEREGISTERING_REASON_FEATURE_TAGS_CHANGING = 5;
+
+    /**
+     * This feature tag is deregistering because the SipDelegate is in the process of being
+     * destroyed.
+     * <p>
+     * All open SIP Dialogs associated with this feature tag must be closed before this operation
+     * can proceed.
+     */
+    public static final int DEREGISTERING_REASON_DESTROY_PENDING = 6;
+
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(prefix = "DEREGISTERED_REASON_", value = {
+            DEREGISTERED_REASON_UNKNOWN,
+            DEREGISTERED_REASON_NOT_PROVISIONED,
+            DEREGISTERED_REASON_NOT_REGISTERED
+    })
+    public @interface DeregisteredReason {}
+
+
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(prefix = "DEREGISTERING_REASON_", value = {
+            DEREGISTERING_REASON_PDN_CHANGE,
+            DEREGISTERING_REASON_PROVISIONING_CHANGE,
+            DEREGISTERING_REASON_FEATURE_TAGS_CHANGING,
+            DEREGISTERING_REASON_DESTROY_PENDING
+    })
+    public @interface DeregisteringReason {}
+
+    private final ArrayList<String> mRegisteredTags = new ArrayList<>();
+    private final ArrayList<FeatureTagState> mDeregisteringTags = new ArrayList<>();
+    private final ArrayList<FeatureTagState> mDeregisteredTags = new ArrayList<>();
+
+    /**
+     * Builder used to create new instances of {@link DelegateRegistrationState}.
+     */
+    public static class Builder {
+
+        private final DelegateRegistrationState mState;
+
+        /* Create a new instance of {@link Builder} */
+        public Builder() {
+            mState = new DelegateRegistrationState();
+        }
+
+        /**
+         * Add a feature tag that is currently included in the current network IMS Registration.
+         * @param featureTag The IMS media feature tag included in the current IMS registration.
+         * @return The in-progress Builder instance for RegistrationState.
+         */
+        public Builder addRegisteredFeatureTag(@NonNull String featureTag) {
+            if (!mState.mRegisteredTags.contains(featureTag)) {
+                mState.mRegisteredTags.add(featureTag);
+            }
+            return this;
+        }
+
+        /**
+         * Add a list of feature tags that are currently included in the current network IMS
+         * Registration.
+         * @param featureTags The IMS media feature tags included in the current IMS registration.
+         * @return The in-progress Builder instance for RegistrationState.
+         */
+        public Builder addRegisteredFeatureTags(@NonNull Set<String> featureTags) {
+            mState.mRegisteredTags.addAll(featureTags);
+            return this;
+        }
+
+        /**
+         * Add a feature tag that is in the current network IMS Registration, but is in the progress
+         * of being deregistered and requires action from the RCS application before the IMS
+         * registration can be modified.
+         *
+         * See {@link DeregisteringReason} for more information regarding what is required by the
+         * RCS application to proceed.
+         *
+         * @param featureTag The media feature tag that has limited or no availability due to its
+         *         current deregistering state.
+         * @param reason The reason why the media feature tag has moved to the deregistering state.
+         *         The availability of the feature tag depends on the {@link DeregisteringReason}.
+         * @return The in-progress Builder instance for RegistrationState.
+         */
+        public Builder addDeregisteringFeatureTag(@NonNull String featureTag,
+                @DeregisteringReason int reason) {
+            boolean ftExists = mState.mDeregisteringTags.stream().anyMatch(
+                    f -> f.getFeatureTag().equals(featureTag));
+            if (!ftExists) {
+                mState.mDeregisteringTags.add(new FeatureTagState(featureTag, reason));
+            }
+            return this;
+        }
+
+        /**
+         * Add a feature tag that is currently not included in the network RCS registration. See
+         * {@link DeregisteredReason} for more information regarding the reason for why the feature
+         * tag is not registered.
+         * @param featureTag The media feature tag that is not registered.
+         * @param reason The reason why the media feature tag has been deregistered.
+         * @return The in-progress Builder instance for RegistrationState.
+         */
+        public Builder addDeregisteredFeatureTag(@NonNull String featureTag,
+                @DeregisteredReason int reason) {
+            boolean ftExists = mState.mDeregisteredTags.stream().anyMatch(
+                    f -> f.getFeatureTag().equals(featureTag));
+            if (!ftExists) {
+                mState.mDeregisteredTags.add(new FeatureTagState(featureTag, reason));
+            }
+            return this;
+        }
+
+        /**
+         * @return the finalized instance.
+         */
+        public DelegateRegistrationState build() {
+            return mState;
+        }
+    }
+
+    /**
+     * The builder should be used to construct a new instance of this class.
+     */
+    private DelegateRegistrationState() {}
+
+    /**
+     * Used for unparcelling only.
+     */
+    private DelegateRegistrationState(Parcel source) {
+        source.readList(mRegisteredTags, null /*classloader*/);
+        readStateFromParcel(source, mDeregisteringTags);
+        readStateFromParcel(source, mDeregisteredTags);
+    }
+
+    /**
+     * Get the feature tags that this SipDelegate is associated with that are currently part of the
+     * network IMS registration. SIP Messages both in and out of a SIP Dialog may be sent and
+     * received using these feature tags.
+     * @return A Set of feature tags that the SipDelegate has associated with that are included in
+     * the network IMS registration.
+     */
+    public @NonNull Set<String> getRegisteredFeatureTags() {
+        return new ArraySet<>(mRegisteredTags);
+    }
+
+    /**
+     * Get the feature tags that this SipDelegate is associated with that are currently part of the
+     * network IMS registration but are in the process of being deregistered.
+     * <p>
+     * Any incoming SIP messages associated with a feature tag included in this list will still be
+     * delivered. Outgoing SIP messages that are still in-dialog will be delivered to the
+     * SipDelegate, but outgoing out-of-dialog SIP messages with  a feature tag that is included in
+     * this list will fail.
+     * <p>
+     * The SipDelegate will stay in this state for a limited period of time while it waits for the
+     * RCS application to perform a specific action. More details on the actions that can cause this
+     * state as well as the expected response are included in the reason codes and can be found in
+     * {@link DeregisteringReason}.
+     * @return A Set of feature tags that the SipDelegate has associated with that are included in
+     * the network IMS registration but are in the process of deregistering.
+     */
+    public @NonNull Set<FeatureTagState> getDeregisteringFeatureTags() {
+        return new ArraySet<>(mDeregisteringTags);
+    }
+
+    /**
+     * Get the list of feature tags that are associated with this SipDelegate but are not currently
+     * included in the network IMS registration.
+     * <p>
+     * See {@link DeregisteredReason} codes for more information related to the reasons why this may
+     * occur.
+     * <p>
+     * Due to network race conditions, there may still be onditions where an incoming out-of-dialog
+     * SIP message is delivered for a feature tag that is considered deregistered. Due to this
+     * condition, in-dialog outgoing SIP messages for deregistered feature tags will still be
+     * allowed as long as they are in response to a dialog started by a remote party. Any outgoing
+     * out-of-dialog SIP messages associated with feature tags included in this list will fail to be
+     * sent.
+     * @return A list of feature tags that the SipDelegate has associated with that not included in
+     * the network IMS registration.
+     */
+    public @NonNull Set<FeatureTagState> getDeregisteredFeatureTags() {
+        return new ArraySet<>(mDeregisteredTags);
+    }
+
+    public static final Creator<DelegateRegistrationState> CREATOR =
+            new Creator<DelegateRegistrationState>() {
+        @Override
+        public DelegateRegistrationState createFromParcel(Parcel source) {
+            return new DelegateRegistrationState(source);
+        }
+
+        @Override
+        public DelegateRegistrationState[] newArray(int size) {
+            return new DelegateRegistrationState[size];
+        }
+    };
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeList(mRegisteredTags);
+        writeStateToParcel(dest, mDeregisteringTags);
+        writeStateToParcel(dest, mDeregisteredTags);
+    }
+
+    private void writeStateToParcel(Parcel dest, List<FeatureTagState> state) {
+        dest.writeInt(state.size());
+        for (FeatureTagState s : state) {
+            dest.writeString(s.getFeatureTag());
+            dest.writeInt(s.getState());
+        }
+    }
+
+    private void readStateFromParcel(Parcel source, List<FeatureTagState> emptyState) {
+        int len = source.readInt();
+        for (int i = 0; i < len; i++) {
+            String ft = source.readString();
+            int reason = source.readInt();
+            emptyState.add(new FeatureTagState(ft, reason));
+        }
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        DelegateRegistrationState that = (DelegateRegistrationState) o;
+        return mRegisteredTags.equals(that.mRegisteredTags)
+                && mDeregisteringTags.equals(that.mDeregisteringTags)
+                && mDeregisteredTags.equals(that.mDeregisteredTags);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mRegisteredTags, mDeregisteringTags, mDeregisteredTags);
+    }
+}
diff --git a/packages/CarSystemUI/res/values/themes.xml b/telephony/java/android/telephony/ims/DelegateRequest.aidl
similarity index 63%
rename from packages/CarSystemUI/res/values/themes.xml
rename to telephony/java/android/telephony/ims/DelegateRequest.aidl
index f82be3c..60c990f 100644
--- a/packages/CarSystemUI/res/values/themes.xml
+++ b/telephony/java/android/telephony/ims/DelegateRequest.aidl
@@ -1,13 +1,11 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
+/*
+ * Copyright (c) 2020 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -15,9 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
--->
 
-<resources>
-    <style name="Theme.Notification" parent="Theme.DeviceDefault.NoActionBar.Notification">
-    </style>
-</resources>
+package android.telephony.ims;
+
+parcelable DelegateRequest;
diff --git a/telephony/java/android/telephony/ims/DelegateRequest.java b/telephony/java/android/telephony/ims/DelegateRequest.java
new file mode 100644
index 0000000..f384901
--- /dev/null
+++ b/telephony/java/android/telephony/ims/DelegateRequest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.os.Parcel;
+import android.os.Parcelable;
+import android.telephony.ims.stub.SipDelegate;
+import android.util.ArraySet;
+
+import java.util.ArrayList;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Contains information required for the creation of a {@link SipDelegate} and the associated
+ * SipDelegateConnection given back to the requesting application.
+ * @hide
+ */
+public final class DelegateRequest implements Parcelable {
+
+    private final ArrayList<String> mFeatureTags;
+
+    /**
+     * Create a new DelegateRequest, which will be used to create a SipDelegate by the ImsService.
+     * @param featureTags The list of IMS feature tags that will be associated with the SipDelegate
+     *                    created using this DelegateRequest. All feature tags are expected to be in
+     *                    the format defined in RCC.07 section 2.6.1.3.
+     */
+    public DelegateRequest(@NonNull Set<String> featureTags) {
+        if (featureTags == null) {
+            throw new IllegalStateException("Invalid arguments, featureTags List can not be null");
+        }
+        mFeatureTags = new ArrayList<>(featureTags);
+    }
+
+    /**
+     * @return the list of IMS feature tag associated with this DelegateRequest in the format
+     * defined in RCC.07 section 2.6.1.3.
+     */
+    public Set<String> getFeatureTags() {
+        return new ArraySet<>(mFeatureTags);
+    }
+
+    /**
+     * Internal constructor used only for unparcelling.
+     */
+    private DelegateRequest(Parcel in) {
+        mFeatureTags = new ArrayList<>();
+        in.readList(mFeatureTags, null /*classLoader*/);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeList(mFeatureTags);
+    }
+
+    public static final @NonNull Creator<DelegateRequest> CREATOR = new Creator<DelegateRequest>() {
+        @Override
+        public DelegateRequest createFromParcel(Parcel source) {
+            return new DelegateRequest(source);
+        }
+
+        @Override
+        public DelegateRequest[] newArray(int size) {
+            return new DelegateRequest[size];
+        }
+    };
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        DelegateRequest that = (DelegateRequest) o;
+        return mFeatureTags.equals(that.mFeatureTags);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mFeatureTags);
+    }
+}
diff --git a/telephony/java/android/telephony/ims/DelegateStateCallback.java b/telephony/java/android/telephony/ims/DelegateStateCallback.java
new file mode 100644
index 0000000..0f1afc4
--- /dev/null
+++ b/telephony/java/android/telephony/ims/DelegateStateCallback.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.telephony.ims.stub.SipDelegate;
+import android.telephony.ims.stub.SipTransportImplBase;
+
+import java.util.List;
+
+/**
+ * Callback interface to notify a remote application of the following:
+ * <ul>
+ *     <li>the {@link SipDelegate} associated with this callback has been created or destroyed in
+ *         response to a creation or destruction request from the framework</li>
+ *     <li>the SIP IMS configuration associated with this {@link SipDelegate} has changed</li>
+ *     <li>the IMS registration of the feature tags associated with this {@link SipDelegate} have
+ *         changed.</li>
+ * </ul>
+ * @hide
+ */
+public interface DelegateStateCallback {
+
+    /**
+     * This must be called by the ImsService after {@link SipTransportImplBase#createSipDelegate} is
+     * called by the framework to notify the framework and remote application that the
+     * {@link SipDelegate} has been successfully created.
+     *
+     * @param delegate The SipDelegate created to service the DelegateRequest.
+     * @param deniedTags A List of {@link FeatureTagState}, which contains the feature tags
+     *    associated with this {@link SipDelegate} that have no access to send/receive SIP messages
+     *    as well as a reason for why the feature tag is denied. For more information on the reason
+     *    why the feature tag was denied access, see the
+     *    {@link SipDelegateManager.DeniedReason} reasons. This is considered a permanent denial due
+     *    to this {@link SipDelegate} not supporting a feature or this ImsService already
+     *    implementing this feature elsewhere. If all features of this {@link SipDelegate} are
+     *    denied, {@link #onCreated(SipDelegate, List)} should still be called as the framework will
+     *    later call {@link SipTransportImplBase#destroySipDelegate(SipDelegate, int)} to clean the
+     *    delegate up.
+     */
+    void onCreated(@NonNull SipDelegate delegate, @Nullable List<FeatureTagState> deniedTags);
+
+    /**
+     * This must be called by the ImsService after the framework calls
+     * {@link SipTransportImplBase#destroySipDelegate} to notify the framework and remote
+     * application that the procedure to destroy the {@link SipDelegate} has been completed.
+     * @param reasonCode The reason for closing this delegate.
+     */
+    void onDestroyed(@SipDelegateManager.SipDelegateDestroyReason int reasonCode);
+
+    /**
+     * Call to notify the remote application of a configuration change associated with this
+     * {@link SipDelegate}.
+     * <p>
+     * The remote application will not be able to proceed sending SIP messages until after this
+     * configuration is sent the first time, so this configuration should be sent as soon as the
+     * {@link SipDelegate} has access to these configuration parameters.
+     * <p>
+     * Incoming SIP messages should not be routed to the remote application until AFTER this
+     * configuration change is sent to ensure that the remote application can respond correctly.
+     * Similarly, if there is an event that triggers the IMS configuration to change, incoming SIP
+     * messages routing should be delayed until the {@link SipDelegate} sends the IMS configuration
+     * change event to reduce conditions where the remote application is using a stale IMS
+     * configuration.
+     */
+    void onImsConfigurationChanged(@NonNull SipDelegateImsConfiguration config);
+
+    /**
+     * Call to notify the remote application that the {@link SipDelegate} has modified the IMS
+     * registration state of the RCS feature tags that were requested as part of the initial
+     * {@link DelegateRequest}.
+     * <p>
+     * See {@link DelegateRegistrationState} for more information about how IMS Registration state
+     * should be communicated the associated SipDelegateConnection in cases such as
+     * IMS deregistration, handover, PDN change, provisioning changes, etc…
+     * <p>
+     * Note: Even after the status of the feature tags are updated here to deregistered, the
+     * SipDelegate must still be able to handle these messages and call
+     * {@link DelegateMessageCallback#onMessageSendFailure} to notify the RCS application that the
+     * message was not sent.
+     *
+     * @param registrationState The current network IMS registration state for all feature tags
+     *         associated with this SipDelegate.
+     */
+    void onFeatureTagRegistrationChanged(@NonNull DelegateRegistrationState registrationState);
+}
diff --git a/packages/CarSystemUI/res/values/themes.xml b/telephony/java/android/telephony/ims/FeatureTagState.aidl
similarity index 63%
copy from packages/CarSystemUI/res/values/themes.xml
copy to telephony/java/android/telephony/ims/FeatureTagState.aidl
index f82be3c..bce5574 100644
--- a/packages/CarSystemUI/res/values/themes.xml
+++ b/telephony/java/android/telephony/ims/FeatureTagState.aidl
@@ -1,13 +1,11 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
+/*
+ * Copyright (c) 2020 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -15,9 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
--->
 
-<resources>
-    <style name="Theme.Notification" parent="Theme.DeviceDefault.NoActionBar.Notification">
-    </style>
-</resources>
+package android.telephony.ims;
+
+parcelable FeatureTagState;
diff --git a/telephony/java/android/telephony/ims/FeatureTagState.java b/telephony/java/android/telephony/ims/FeatureTagState.java
new file mode 100644
index 0000000..060be6f
--- /dev/null
+++ b/telephony/java/android/telephony/ims/FeatureTagState.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.ims;
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.telephony.ims.stub.DelegateConnectionStateCallback;
+import android.telephony.ims.stub.SipDelegate;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Maps an IMS media feature tag 3gpp universal resource name (URN) previously mapped to a
+ * {@link SipDelegate} in the associated {@link DelegateRequest} to its current availability
+ * state as set by the ImsService managing the related IMS registration.
+ *
+ * This class is only used to report more information about a IMS feature tag that is not fully
+ * available at this time.
+ * <p>
+ * Please see {@link DelegateRegistrationState}, {@link DelegateStateCallback}, and
+ * {@link DelegateConnectionStateCallback} for more information about how this class is used to
+ * convey the state of IMS feature tags that were requested by {@link DelegateRequest} but are not
+ * currently available.
+ * @hide
+ */
+public final class FeatureTagState implements Parcelable {
+
+    private final String mFeatureTag;
+    private final int mState;
+
+    /**
+     * Associate an IMS feature tag with its current state. See {@link DelegateRegistrationState}
+     * and {@link DelegateConnectionStateCallback#onFeatureTagStatusChanged(
+     * DelegateRegistrationState, List)} and
+     * {@link DelegateStateCallback#onCreated(SipDelegate, List)} for examples on how and when this
+     * is used.
+     *
+     * @param featureTag The IMS feature tag that is deregistered, in the process of
+     *                   deregistering, or denied.
+     * @param state The {@link DelegateRegistrationState.DeregisteredReason},
+     *         {@link DelegateRegistrationState.DeregisteringReason}, or
+     *         {@link SipDelegateManager.DeniedReason} associated with this feature tag.
+     */
+    public FeatureTagState(@NonNull String featureTag, int state) {
+        mFeatureTag = featureTag;
+        mState = state;
+    }
+
+    /**
+     * Used for constructing instances during un-parcelling.
+     */
+    private FeatureTagState(Parcel source) {
+        mFeatureTag = source.readString();
+        mState = source.readInt();
+    }
+
+    /**
+     * @return The IMS feature tag string that is in the process of deregistering,
+     * deregistered, or denied.
+     */
+    public @NonNull String getFeatureTag() {
+        return mFeatureTag;
+    }
+
+    /**
+     * @return The reason for why the feature tag is currently in the process of deregistering,
+     * has been deregistered, or has been denied. See {@link DelegateRegistrationState} and
+     * {@link DelegateConnectionStateCallback} for more information.
+     */
+    public int getState() {
+        return mState;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(mFeatureTag);
+        dest.writeInt(mState);
+    }
+
+    public static final Creator<FeatureTagState> CREATOR = new Creator<FeatureTagState>() {
+        @Override
+        public FeatureTagState createFromParcel(Parcel source) {
+            return new FeatureTagState(source);
+        }
+
+        @Override
+        public FeatureTagState[] newArray(int size) {
+            return new FeatureTagState[size];
+        }
+    };
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        FeatureTagState that = (FeatureTagState) o;
+        return mState == that.mState
+                && mFeatureTag.equals(that.mFeatureTag);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mFeatureTag, mState);
+    }
+
+    @Override
+    public String toString() {
+        return "FeatureTagState{" + "mFeatureTag='" + mFeatureTag + ", mState=" + mState + '}';
+    }
+}
diff --git a/telephony/java/android/telephony/ims/ImsCallProfile.java b/telephony/java/android/telephony/ims/ImsCallProfile.java
index 9a55cec..1b51936 100644
--- a/telephony/java/android/telephony/ims/ImsCallProfile.java
+++ b/telephony/java/android/telephony/ims/ImsCallProfile.java
@@ -450,8 +450,6 @@
     /** Indicates if we have known the intent of the user for the call is emergency */
     private boolean mHasKnownUserIntentEmergency = false;
 
-    private Set<RtpHeaderExtensionType> mOfferedRtpHeaderExtensionTypes = new ArraySet<>();
-
     private Set<RtpHeaderExtensionType> mAcceptedRtpHeaderExtensionTypes = new ArraySet<>();
 
     /**
@@ -692,7 +690,6 @@
         out.writeBoolean(mHasKnownUserIntentEmergency);
         out.writeInt(mRestrictCause);
         out.writeInt(mCallerNumberVerificationStatus);
-        out.writeArray(mOfferedRtpHeaderExtensionTypes.toArray());
         out.writeArray(mAcceptedRtpHeaderExtensionTypes.toArray());
     }
 
@@ -708,9 +705,6 @@
         mHasKnownUserIntentEmergency = in.readBoolean();
         mRestrictCause = in.readInt();
         mCallerNumberVerificationStatus = in.readInt();
-        Object[] offered = in.readArray(RtpHeaderExtensionType.class.getClassLoader());
-        mOfferedRtpHeaderExtensionTypes = Arrays.stream(offered)
-                .map(o -> (RtpHeaderExtensionType) o).collect(Collectors.toSet());
         Object[] accepted = in.readArray(RtpHeaderExtensionType.class.getClassLoader());
         mAcceptedRtpHeaderExtensionTypes = Arrays.stream(accepted)
                 .map(o -> (RtpHeaderExtensionType) o).collect(Collectors.toSet());
@@ -1106,46 +1100,13 @@
     }
 
     /**
-     * For an incoming or outgoing call, indicates the {@link RtpHeaderExtensionType}s which the
-     * caller is offering to make available.
-     * <p>
-     * For outgoing calls, an {@link ImsService} will reserve
-     * {@link RtpHeaderExtensionType#getLocalIdentifier()} identifiers the telephony stack has
-     * proposed to use and not use these same local identifiers.  The offered header extension
-     * types for an outgoing call can be found in the
-     * {@link ImsCallProfile#getOfferedRtpHeaderExtensionTypes()} and will be available to the
-     * {@link ImsService} in {@link MmTelFeature#createCallSession(ImsCallProfile)}.
-     * The {@link ImsService} sets the accepted {@link #setAcceptedRtpHeaderExtensionTypes(Set)}
-     * when the SDP offer/accept process has completed.
-     * <p>
-     * According to RFC8285, RTP header extensions available to a call are determined using the
-     * offer/accept phase of the SDP protocol (see RFC4566).
-     *
-     * @return the {@link RtpHeaderExtensionType}s which were offered by other end of the call.
-     */
-    public @NonNull Set<RtpHeaderExtensionType> getOfferedRtpHeaderExtensionTypes() {
-        return mOfferedRtpHeaderExtensionTypes;
-    }
-
-    /**
-     * Sets the offered {@link RtpHeaderExtensionType}s for this call.
-     * <p>
-     * According to RFC8285, RTP header extensions available to a call are determined using the
-     * offer/accept phase of the SDP protocol (see RFC4566).
-     *
-     * @param rtpHeaderExtensions the {@link RtpHeaderExtensionType}s which are offered.
-     */
-    public void setOfferedRtpHeaderExtensionTypes(@NonNull Set<RtpHeaderExtensionType>
-                    rtpHeaderExtensions) {
-        mOfferedRtpHeaderExtensionTypes.clear();
-        mOfferedRtpHeaderExtensionTypes.addAll(rtpHeaderExtensions);
-    }
-
-    /**
      * Gets the {@link RtpHeaderExtensionType}s which have been accepted by both ends of the call.
      * <p>
      * According to RFC8285, RTP header extensions available to a call are determined using the
      * offer/accept phase of the SDP protocol (see RFC4566).
+     * <p>
+     * The offered header extension types supported by the framework and exposed to the
+     * {@link ImsService} via {@link MmTelFeature#changeOfferedRtpHeaderExtensionTypes(Set)}.
      *
      * @return the {@link RtpHeaderExtensionType}s which were accepted by the other end of the call.
      */
diff --git a/telephony/java/android/telephony/ims/ImsMmTelManager.java b/telephony/java/android/telephony/ims/ImsMmTelManager.java
index 76c1faf..218875e3 100644
--- a/telephony/java/android/telephony/ims/ImsMmTelManager.java
+++ b/telephony/java/android/telephony/ims/ImsMmTelManager.java
@@ -29,6 +29,7 @@
 import android.os.RemoteException;
 import android.os.ServiceSpecificException;
 import android.telephony.AccessNetworkConstants;
+import android.telephony.BinderCacheManager;
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyFrameworkInitializer;
@@ -213,6 +214,7 @@
     }
 
     private final int mSubId;
+    private final BinderCacheManager<ITelephony> mBinderCache;
 
     /**
      * Create an instance of {@link ImsMmTelManager} for the subscription id specified.
@@ -242,7 +244,8 @@
             throw new IllegalArgumentException("Invalid subscription ID");
         }
 
-        return new ImsMmTelManager(subId);
+        return new ImsMmTelManager(subId, new BinderCacheManager<>(
+                ImsMmTelManager::getITelephonyInterface));
     }
 
     /**
@@ -250,8 +253,9 @@
      * @hide
      */
     @VisibleForTesting
-    public ImsMmTelManager(int subId) {
+    public ImsMmTelManager(int subId, BinderCacheManager<ITelephony> binderCache) {
         mSubId = subId;
+        mBinderCache = binderCache;
     }
 
     /**
@@ -1367,7 +1371,11 @@
         }
     }
 
-    private static ITelephony getITelephony() {
+    private ITelephony getITelephony() {
+        return mBinderCache.getBinder();
+    }
+
+    private static ITelephony getITelephonyInterface() {
         ITelephony binder = ITelephony.Stub.asInterface(
                 TelephonyFrameworkInitializer
                         .getTelephonyServiceManager()
diff --git a/telephony/java/android/telephony/ims/ImsRcsManager.java b/telephony/java/android/telephony/ims/ImsRcsManager.java
index 5a32075..074aefe 100644
--- a/telephony/java/android/telephony/ims/ImsRcsManager.java
+++ b/telephony/java/android/telephony/ims/ImsRcsManager.java
@@ -28,6 +28,7 @@
 import android.os.RemoteException;
 import android.provider.Settings;
 import android.telephony.AccessNetworkConstants;
+import android.telephony.BinderCacheManager;
 import android.telephony.CarrierConfigManager;
 import android.telephony.TelephonyFrameworkInitializer;
 import android.telephony.ims.aidl.IImsCapabilityCallback;
@@ -149,14 +150,17 @@
 
     private final int mSubId;
     private final Context mContext;
+    private final BinderCacheManager<IImsRcsController> mBinderCache;
 
     /**
      * Use {@link ImsManager#getImsRcsManager(int)} to create an instance of this class.
      * @hide
      */
-    public ImsRcsManager(Context context, int subId) {
+    public ImsRcsManager(Context context, int subId,
+            BinderCacheManager<IImsRcsController> binderCache) {
         mSubId = subId;
         mContext = context;
+        mBinderCache = binderCache;
     }
 
     /**
diff --git a/telephony/java/android/telephony/ims/SipDelegateConnection.java b/telephony/java/android/telephony/ims/SipDelegateConnection.java
new file mode 100644
index 0000000..6bfdc2c
--- /dev/null
+++ b/telephony/java/android/telephony/ims/SipDelegateConnection.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.telephony.ims.stub.SipDelegate;
+
+/**
+ * Represents a connection to the remote {@link SipDelegate} that is managed by the
+ * {@link ImsService} implementing IMS for the subscription that is associated with it.
+ * <p>
+ * The remote delegate will handle messages sent by this {@link SipDelegateConnection}, notifying
+ * the associated {@link DelegateMessageCallback} when the message was either sent successfully or
+ * failed to be sent.
+ * <p>
+ * It is also the responsibility of this {@link SipDelegateConnection} to acknowledge when incoming
+ * SIP messages have been received successfully via
+ * {@link DelegateMessageCallback#onMessageReceived(SipMessage)} or when there was an error
+ * receiving the message using {@link #notifyMessageReceived(String)} and
+ * {@link #notifyMessageReceiveError(String, int)}.
+ *
+ * @see SipDelegateManager#createSipDelegate
+ * @hide
+ */
+public interface SipDelegateConnection {
+
+    /**
+     * Send a SIP message to the SIP delegate to be sent over the carrier’s network. The
+     * {@link SipMessage} will either be acknowledged with
+     * {@link DelegateMessageCallback#onMessageSent(String)} upon successful sending of this message
+     * or {@link DelegateMessageCallback#onMessageSendFailure(String, int)} if there was an error
+     * sending the message.
+     * @param sipMessage The SipMessage to be sent.
+     * @param configVersion The SipDelegateImsConfiguration version used to construct the
+     *                      SipMessage. See {@link SipDelegateImsConfiguration#getVersion} for more
+     *                      information on this parameter and why it is used.
+     */
+    void sendMessage(@NonNull SipMessage sipMessage, int configVersion);
+
+    /**
+     * Notify the {@link SipDelegate} that a SIP message received from
+     * {@link DelegateMessageCallback#onMessageReceived(SipMessage)} has been received successfully
+     * and is being processed.
+     * @param viaTransactionId Per RFC3261 Sec 8.1.1.7 the transaction ID associated with the Via
+     *         branch parameter.
+     */
+    void notifyMessageReceived(@NonNull String viaTransactionId);
+
+    /**
+     * Notify the SIP delegate that the SIP message has been received from
+     * {@link DelegateMessageCallback#onMessageReceived(SipMessage)}, however there was an error
+     * processing it.
+     * @param viaTransactionId Per RFC3261 Sec 8.1.1.7 the transaction ID associated with the Via
+     *         branch parameter.
+     * @param reason The reason why the error occurred.
+     */
+    void notifyMessageReceiveError(@NonNull String viaTransactionId,
+            @SipDelegateManager.MessageFailureReason int reason);
+}
diff --git a/packages/CarSystemUI/res/values/themes.xml b/telephony/java/android/telephony/ims/SipDelegateImsConfiguration.aidl
similarity index 63%
copy from packages/CarSystemUI/res/values/themes.xml
copy to telephony/java/android/telephony/ims/SipDelegateImsConfiguration.aidl
index f82be3c..44ae1b1 100644
--- a/packages/CarSystemUI/res/values/themes.xml
+++ b/telephony/java/android/telephony/ims/SipDelegateImsConfiguration.aidl
@@ -1,13 +1,11 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
+/*
+ * Copyright (c) 2020 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -15,9 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
--->
 
-<resources>
-    <style name="Theme.Notification" parent="Theme.DeviceDefault.NoActionBar.Notification">
-    </style>
-</resources>
+package android.telephony.ims;
+
+parcelable SipDelegateImsConfiguration;
diff --git a/telephony/java/android/telephony/ims/SipDelegateImsConfiguration.java b/telephony/java/android/telephony/ims/SipDelegateImsConfiguration.java
new file mode 100644
index 0000000..8abd0ee
--- /dev/null
+++ b/telephony/java/android/telephony/ims/SipDelegateImsConfiguration.java
@@ -0,0 +1,499 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.os.Parcel;
+import android.os.Parcelable;
+import android.os.PersistableBundle;
+import android.telephony.ims.stub.SipDelegate;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * The IMS registration and other attributes that the {@link SipDelegateConnection} used by the
+ * IMS application will need to be aware of to correctly generate outgoing {@link SipMessage}s.
+ * <p>
+ * The IMS service must generate new instances of this configuration as the IMS configuration
+ * managed by the IMS service changes. Along with each {@link SipDelegateImsConfiguration} instance
+ * containing the configuration is the "version", which should be incremented every time a new
+ * {@link SipDelegateImsConfiguration} instance is created. The {@link SipDelegateConnection} will
+ * include the version of the {@link SipDelegateImsConfiguration} instance that it used in order for
+ * the {@link SipDelegate} to easily identify if the IMS application used a now stale configuration
+ * to generate the {@link SipMessage} and return
+ * {@link SipDelegateManager#MESSAGE_FAILURE_REASON_STALE_IMS_CONFIGURATION} in
+ * {@link DelegateMessageCallback#onMessageSendFailure(String, int)} so that the IMS application can
+ * regenerate that {@link SipMessage} using the correct {@link SipDelegateImsConfiguration}
+ * instance.
+ * <p>
+ * Every time the IMS configuration state changes in the IMS service, a full configuration should
+ * be generated. The new  {@link SipDelegateImsConfiguration} instance should not be an incremental
+ * update.
+ * @hide
+ */
+public class SipDelegateImsConfiguration implements Parcelable {
+
+    /**
+     * IPV4 Address type.
+     * <p>
+     * Used as a potential value for {@link #KEY_SIP_CONFIG_IPTYPE_STRING}.
+     */
+    public static final String IPTYPE_IPV4 = "IPV4";
+
+    /**
+     * IPV6 Address type.
+     * <p>
+     * Used as a potential value for {@link #KEY_SIP_CONFIG_IPTYPE_STRING}.
+     */
+    public static final String IPTYPE_IPV6 = "IPV6";
+
+    /**
+     * The SIP transport uses UDP.
+     * <p>
+     * Used as a potential value for {@link #KEY_SIP_CONFIG_TRANSPORT_TYPE_STRING}.
+     */
+    public static final String SIP_TRANSPORT_UDP = "UDP";
+
+    /**
+     * The SIP transport uses TCP.
+     * <p>
+     * Used as a potential value for {@link #KEY_SIP_CONFIG_TRANSPORT_TYPE_STRING}.
+     */
+    public static final String SIP_TRANSPORT_TCP = "TCP";
+
+    /**
+     * Flag specifying if SIP compact form is enabled
+     */
+    public static final String KEY_SIP_CONFIG_IS_COMPACT_FORM_ENABLED_BOOL =
+            "sip_config_is_compact_form_enabled_bool";
+
+    /**
+     * Flag specifying if SIP keepalives are enabled
+     */
+    public static final String KEY_SIP_CONFIG_IS_KEEPALIVE_ENABLED_BOOL =
+            "sip_config_is_keepalive_enabled_bool";
+
+    /**
+     * Maximum SIP payload to be sent on UDP. If the SIP message payload is greater than max udp
+     * payload size, then TCP must be used
+     */
+    public static final String KEY_SIP_CONFIG_MAX_PAYLOAD_SIZE_ON_UDP_INT =
+            "sip_config_udp_max_payload_size_int";
+
+    /**
+     * Transport protocol used for SIP signaling.
+     * Available options are: {@link #SIP_TRANSPORT_UDP }, {@link #SIP_TRANSPORT_TCP }
+     */
+    public static final String KEY_SIP_CONFIG_TRANSPORT_TYPE_STRING =
+            "sip_config_protocol_type_string";
+
+    /**
+     * IMS public user identifier string
+     */
+    public static final String KEY_SIP_CONFIG_UE_PUBLIC_USER_ID_STRING =
+            "sip_config_ue_public_user_id_string";
+
+    /**
+     * IMS private user identifier string
+     */
+    public static final String KEY_SIP_CONFIG_UE_PRIVATE_USER_ID_STRING =
+            "sip_config_ue_private_user_id_string";
+
+    /**
+     * IMS home domain string
+     */
+    public static final String KEY_SIP_CONFIG_HOME_DOMAIN_STRING = "sip_config_home_domain_string";
+
+    /**
+     * IMEI string. Application can include the Instance-ID feature tag " +sip.instance" in the
+     * Contact header with a value of the device IMEI in the form "urn:gsma:imei:<device IMEI>".
+     */
+    public static final String KEY_SIP_CONFIG_IMEI_STRING = "sip_config_imei_string";
+
+    /**
+     * IP address type for SIP signaling.
+     * Available options are: {@link #IPTYPE_IPV6}, {@link #IPTYPE_IPV4}
+     */
+    public static final String KEY_SIP_CONFIG_IPTYPE_STRING = "sip_config_iptype_string";
+
+    /**
+     * Local IPaddress used for SIP signaling.
+     */
+    public static final String KEY_SIP_CONFIG_UE_DEFAULT_IPADDRESS_STRING =
+            "sip_config_ue_default_ipaddress_string";
+
+    /**
+     * Local port used for sending SIP traffic
+     */
+    public static final String KEY_SIP_CONFIG_UE_DEFAULT_PORT_INT =
+            "sip_config_ue_default_port_int";
+
+    /**
+     * SIP server / PCSCF default ip address
+     */
+    public static final String KEY_SIP_CONFIG_SERVER_DEFAULT_IPADDRESS_STRING =
+            "sip_config_server_default_ipaddress_string";
+
+    /**
+     * SIP server / PCSCF port used for sending SIP traffic
+     */
+    public static final String KEY_SIP_CONFIG_SERVER_DEFAULT_PORT_INT =
+            "sip_config_server_default_port_int";
+
+    /**
+     * Flag specifying if Network Address Translation is enabled and UE is behind a NAT.
+     */
+    public static final String KEY_SIP_CONFIG_IS_NAT_ENABLED_BOOL =
+            "sip_config_is_nat_enabled_bool";
+
+    /**
+     * UE's public IPaddress when UE is behind a NAT.
+     * <p>
+     * This key will not exist if {@link #KEY_SIP_CONFIG_IS_NAT_ENABLED_BOOL} is {@code false}.
+     */
+    public static final String KEY_SIP_CONFIG_UE_PUBLIC_IPADDRESS_WITH_NAT_STRING =
+            "sip_config_ue_public_ipaddress_with_nat_string";
+
+    /**
+     * UE's public SIP port when UE is behind a NAT.
+     * <p>
+     * This key will not exist if {@link #KEY_SIP_CONFIG_IS_NAT_ENABLED_BOOL} is {@code false}.
+     */
+    public static final String KEY_SIP_CONFIG_UE_PUBLIC_PORT_WITH_NAT_INT =
+            "sip_config_ue_public_port_with_nat_int";
+
+    /**
+     * Flag specifying if Globally routable user-agent uri (GRUU) is enabled as per TS 23.808
+     */
+    public static final String KEY_SIP_CONFIG_IS_GRUU_ENABLED_BOOL =
+            "sip_config_is_gruu_enabled_bool";
+
+    /**
+     * UE's Globally routable user-agent uri if this feature is enabled.
+     * <p>
+     * This key will not exist if {@link #KEY_SIP_CONFIG_IS_GRUU_ENABLED_BOOL} is {@code false}.
+     */
+    public static final String KEY_SIP_CONFIG_UE_PUBLIC_GRUU_STRING =
+            "sip_config_ue_public_gruu_string";
+
+    /**
+     * Flag specifying if SIP over IPSec is enabled.
+     */
+    public static final String KEY_SIP_CONFIG_IS_IPSEC_ENABLED_BOOL =
+            "sip_config_is_ipsec_enabled_bool";
+    /**
+     * UE's SIP port used to send traffic when IPSec is enabled.
+     * <p>
+     * This key will not exist if {@link #KEY_SIP_CONFIG_IS_IPSEC_ENABLED_BOOL} is {@code false}.
+     */
+    public static final String KEY_SIP_CONFIG_UE_IPSEC_CLIENT_PORT_INT =
+            "sip_config_ue_ipsec_client_port_int";
+
+    /**
+     * UE's SIP port used to receive traffic when IPSec is enabled.
+     * <p>
+     * This key will not exist if {@link #KEY_SIP_CONFIG_IS_IPSEC_ENABLED_BOOL} is {@code false}.
+     */
+    public static final String KEY_SIP_CONFIG_UE_IPSEC_SERVER_PORT_INT =
+            "sip_config_ue_ipsec_server_port_int";
+
+    /**
+     * UE's SIP port used for the previous IPsec security association if IPSec is enabled.
+     * <p>
+     * This key will not exist if {@link #KEY_SIP_CONFIG_IS_IPSEC_ENABLED_BOOL} is {@code false}.
+     */
+    public static final String KEY_SIP_CONFIG_UE_IPSEC_OLD_CLIENT_PORT_INT =
+            "sip_config_ue_ipsec_old_client_port_int";
+
+    /**
+     * Port number used by the SIP server to send SIP traffic when IPSec is enabled.
+     * <p>
+     * This key will not exist if {@link #KEY_SIP_CONFIG_IS_IPSEC_ENABLED_BOOL} is {@code false}.
+     */
+    public static final String KEY_SIP_CONFIG_SERVER_IPSEC_CLIENT_PORT_INT =
+            "sip_config_server_ipsec_client_port_int";
+
+    /**
+     * Port number used by the SIP server to receive incoming SIP traffic when IPSec is enabled.
+     * <p>
+     * This key will not exist if {@link #KEY_SIP_CONFIG_IS_IPSEC_ENABLED_BOOL} is {@code false}.
+     */
+    public static final String KEY_SIP_CONFIG_SERVER_IPSEC_SERVER_PORT_INT =
+            "sip_config_server_ipsec_server_port_int";
+
+    /**
+     * Port number used by the SIP server to send SIP traffic on the previous IPSec security
+     * association when IPSec is enabled.
+     * <p>
+     * This key will not exist if {@link #KEY_SIP_CONFIG_IS_IPSEC_ENABLED_BOOL} is {@code false}.
+     */
+    public static final String KEY_SIP_CONFIG_SERVER_IPSEC_OLD_CLIENT_PORT_INT =
+            "sip_config_server_ipsec_old_client_port_int";
+    /**
+     * SIP Authentication header string
+     */
+    public static final String KEY_SIP_CONFIG_AUTHENTICATION_HEADER_STRING =
+            "sip_config_auhentication_header_string";
+
+    /**
+     * SIP Authentication nonce string
+     */
+    public static final String KEY_SIP_CONFIG_AUTHENTICATION_NONCE_STRING =
+            "sip_config_authentication_nonce_string";
+
+    /**
+     * SIP service route header string
+     */
+    public static final String KEY_SIP_CONFIG_SERVICE_ROUTE_HEADER_STRING =
+            "sip_config_service_route_header_string";
+
+    /**
+     * SIP security verify header string
+     */
+    public static final String KEY_SIP_CONFIG_SECURITY_VERIFY_HEADER_STRING =
+            "sip_config_security_verify_header_string";
+
+    /**
+     * SIP Path header string
+     */
+    public static final String KEY_SIP_CONFIG_PATH_HEADER_STRING =
+            "sip_config_path_header_string";
+
+    /**
+     * SIP User part string in contact header
+     */
+    public static final String KEY_SIP_CONFIG_URI_USER_PART_STRING =
+            "sip_config_uri_user_part_string";
+
+    /**
+     * SIP P-access-network-info header string
+     */
+    public static final String KEY_SIP_CONFIG_P_ACCESS_NETWORK_INFO_HEADER_STRING =
+            "sip_config_p_access_network_info_header_string";
+
+    /**
+     * SIP P-last-access-network-info header string
+     */
+    public static final String KEY_SIP_CONFIG_P_LAST_ACCESS_NETWORK_INFO_HEADER_STRING =
+            "sip_config_p_last_access_network_info_header_string";
+
+    /**
+     * SIP P-associated-uri header string
+     */
+    public static final String KEY_SIP_CONFIG_P_ASSOCIATED_URI_HEADER_STRING =
+            "sip_config_p_associated_uri_header_string";
+
+    /**@hide*/
+    @StringDef(prefix = "KEY_SIP_CONFIG", suffix = "_STRING", value = {
+            KEY_SIP_CONFIG_TRANSPORT_TYPE_STRING,
+            KEY_SIP_CONFIG_UE_PUBLIC_USER_ID_STRING,
+            KEY_SIP_CONFIG_UE_PRIVATE_USER_ID_STRING,
+            KEY_SIP_CONFIG_HOME_DOMAIN_STRING,
+            KEY_SIP_CONFIG_IMEI_STRING,
+            KEY_SIP_CONFIG_IPTYPE_STRING,
+            KEY_SIP_CONFIG_UE_DEFAULT_IPADDRESS_STRING,
+            KEY_SIP_CONFIG_SERVER_DEFAULT_IPADDRESS_STRING,
+            KEY_SIP_CONFIG_UE_PUBLIC_IPADDRESS_WITH_NAT_STRING,
+            KEY_SIP_CONFIG_UE_PUBLIC_GRUU_STRING,
+            KEY_SIP_CONFIG_AUTHENTICATION_HEADER_STRING,
+            KEY_SIP_CONFIG_AUTHENTICATION_NONCE_STRING,
+            KEY_SIP_CONFIG_SERVICE_ROUTE_HEADER_STRING,
+            KEY_SIP_CONFIG_SECURITY_VERIFY_HEADER_STRING,
+            KEY_SIP_CONFIG_PATH_HEADER_STRING,
+            KEY_SIP_CONFIG_URI_USER_PART_STRING,
+            KEY_SIP_CONFIG_P_ACCESS_NETWORK_INFO_HEADER_STRING,
+            KEY_SIP_CONFIG_P_LAST_ACCESS_NETWORK_INFO_HEADER_STRING,
+            KEY_SIP_CONFIG_P_ASSOCIATED_URI_HEADER_STRING
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface StringConfigKey {}
+
+    /**@hide*/
+    @StringDef(prefix = "KEY_SIP_CONFIG", suffix = "_INT", value = {
+            KEY_SIP_CONFIG_MAX_PAYLOAD_SIZE_ON_UDP_INT,
+            KEY_SIP_CONFIG_UE_DEFAULT_PORT_INT,
+            KEY_SIP_CONFIG_SERVER_DEFAULT_PORT_INT,
+            KEY_SIP_CONFIG_UE_PUBLIC_PORT_WITH_NAT_INT,
+            KEY_SIP_CONFIG_UE_IPSEC_CLIENT_PORT_INT,
+            KEY_SIP_CONFIG_UE_IPSEC_SERVER_PORT_INT,
+            KEY_SIP_CONFIG_UE_IPSEC_OLD_CLIENT_PORT_INT,
+            KEY_SIP_CONFIG_SERVER_IPSEC_CLIENT_PORT_INT,
+            KEY_SIP_CONFIG_SERVER_IPSEC_SERVER_PORT_INT,
+            KEY_SIP_CONFIG_SERVER_IPSEC_OLD_CLIENT_PORT_INT
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface IntConfigKey {}
+
+    /**@hide*/
+    @StringDef(prefix = "KEY_SIP_CONFIG", suffix = "_BOOL", value = {
+            KEY_SIP_CONFIG_IS_COMPACT_FORM_ENABLED_BOOL,
+            KEY_SIP_CONFIG_IS_KEEPALIVE_ENABLED_BOOL,
+            KEY_SIP_CONFIG_IS_NAT_ENABLED_BOOL,
+            KEY_SIP_CONFIG_IS_GRUU_ENABLED_BOOL,
+            KEY_SIP_CONFIG_IS_IPSEC_ENABLED_BOOL
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface BooleanConfigKey {}
+
+    /**
+     * Builder class to be used when constructing a new SipDelegateImsConfiguration.
+     */
+    public static class Builder {
+        private final long mVersion;
+        private final PersistableBundle mBundle;
+
+        /**
+         * Creates an empty implementation of SipDelegateImsConfiguration.
+         * @param version The version associated with the SipDelegateImsConfiguration being built.
+         *                See {@link #getVersion} for more information.
+         */
+        public Builder(int version) {
+            mVersion = version;
+            mBundle = new PersistableBundle();
+        }
+        /**
+         * Clones an existing implementation of SipDelegateImsConfiguration to handle situations
+         * where only a small number of parameters have changed from the previous configuration.
+         * <p>
+         * Automatically increments the version of this configuration by 1. See {@link #getVersion}
+         * for more information.
+         */
+        public Builder(@NonNull SipDelegateImsConfiguration config) {
+            mVersion = config.getVersion() + 1;
+            mBundle = config.copyBundle();
+        }
+        /**
+         * Put a string value into this configuration bundle for the given key.
+         */
+        public Builder putString(@StringConfigKey String key, String value) {
+            mBundle.putString(key, value);
+            return this;
+        }
+
+        /**
+         * Replace the existing default value with a new value for a given key.
+         */
+        public Builder putInt(@IntConfigKey String key, int value) {
+            mBundle.putInt(key, value);
+            return this;
+        }
+
+        /**
+         * Replace the existing default value with a new value for a given key.
+         */
+        public Builder putBoolean(@BooleanConfigKey String key, boolean value) {
+            mBundle.putBoolean(key, value);
+            return this;
+        }
+
+        /**
+         * @return a new SipDelegateImsConfiguration from this Builder.
+         */
+        public SipDelegateImsConfiguration build() {
+            return new SipDelegateImsConfiguration(mVersion, mBundle);
+        }
+    }
+
+    private final long mVersion;
+    private final PersistableBundle mBundle;
+
+    private SipDelegateImsConfiguration(long version, PersistableBundle bundle) {
+        mVersion = version;
+        mBundle = bundle;
+    }
+
+    private SipDelegateImsConfiguration(Parcel source) {
+        mVersion = source.readLong();
+        mBundle = source.readPersistableBundle();
+    }
+
+    /**
+     * @return the string value associated with a given key or {@code null} if it doesn't exist.
+     */
+    public @StringConfigKey String getString(String key) {
+        return mBundle.getString(key);
+    }
+
+    /**
+     * @return the Integer value associated with a given key or {@code null} if the value doesn't
+     * exist.
+     */
+    public @IntConfigKey Integer getInt(String key) {
+        if (!mBundle.containsKey(key)) {
+            return null;
+        }
+        return mBundle.getInt(key);
+    }
+
+    /**
+     * @return the Integer value associated with a given key or {@code null} if the value doesn't
+     * exist.
+     */
+    public @BooleanConfigKey Boolean getBoolen(String key) {
+        if (!mBundle.containsKey(key)) {
+            return null;
+        }
+        return mBundle.getBoolean(key);
+    }
+
+    /**
+     * @return a shallow copy of the full configuration.
+     */
+    public PersistableBundle copyBundle() {
+        return new PersistableBundle(mBundle);
+    }
+
+    /**
+     * An integer representing the version number of this SipDelegateImsConfiguration.
+     * {@link SipMessage}s that are created using this configuration will also have a this
+     * version number associated with them, which will allow the IMS service to validate that the
+     * {@link SipMessage} was using the latest configuration during creation and not a stale
+     * configuration due to race conditions between the configuration being updated and the RCS
+     * application not receiving the updated configuration before generating a new message.
+     *
+     * @return the version number associated with this {@link SipDelegateImsConfiguration}.
+     */
+    public long getVersion() {
+        return mVersion;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeLong(mVersion);
+        dest.writePersistableBundle(mBundle);
+    }
+
+    public static final Creator<SipDelegateImsConfiguration> CREATOR =
+            new Creator<SipDelegateImsConfiguration>() {
+        @Override
+        public SipDelegateImsConfiguration createFromParcel(Parcel source) {
+            return new SipDelegateImsConfiguration(source);
+        }
+
+        @Override
+        public SipDelegateImsConfiguration[] newArray(int size) {
+            return new SipDelegateImsConfiguration[size];
+        }
+    };
+}
diff --git a/telephony/java/android/telephony/ims/SipDelegateManager.java b/telephony/java/android/telephony/ims/SipDelegateManager.java
index 82c8a9c..337b7d4 100644
--- a/telephony/java/android/telephony/ims/SipDelegateManager.java
+++ b/telephony/java/android/telephony/ims/SipDelegateManager.java
@@ -17,29 +17,251 @@
 package android.telephony.ims;
 
 import android.Manifest;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
 import android.annotation.RequiresPermission;
 import android.annotation.SystemApi;
 import android.content.Context;
-import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.ServiceSpecificException;
+import android.telephony.BinderCacheManager;
 import android.telephony.CarrierConfigManager;
-import android.telephony.TelephonyFrameworkInitializer;
 import android.telephony.ims.aidl.IImsRcsController;
+import android.telephony.ims.aidl.SipDelegateConnectionAidlWrapper;
+import android.telephony.ims.stub.DelegateConnectionMessageCallback;
+import android.telephony.ims.stub.DelegateConnectionStateCallback;
+import android.telephony.ims.stub.SipDelegate;
 
 import com.android.internal.annotations.VisibleForTesting;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.concurrent.Executor;
+
 /**
- * Manages the creation and destruction of SipDelegates, which allow an IMS application to forward
- * SIP messages for the purposes of providing a single IMS registration to the carrier's IMS network
- * from multiple sources.
+ * Manages the creation and destruction of SipDelegates for the {@link ImsService} managing IMS
+ * for the subscription ID that this SipDelegateManager has been created for.
+ *
+ * This allows multiple IMS applications to forward SIP messages to/from their application for the
+ * purposes of providing a single IMS registration to the carrier's IMS network from potentially
+ * many IMS stacks implementing a subset of the supported MMTEL/RCS features.
  * @hide
  */
 @SystemApi
 public class SipDelegateManager {
 
+    /**
+     * The SIP message has failed being sent or received for an unknown reason.
+     * <p>
+     * The caller should retry a message that failed with this response.
+     * @hide
+     */
+    public static final int MESSAGE_FAILURE_REASON_UNKNOWN = 0;
+
+    /**
+     * The remote service associated with this connection has died and the message was not
+     * properly sent/received.
+     * <p>
+     * This is considered a permanent error and the system will automatically begin the teardown and
+     * destruction of the SipDelegate. No further messages should be sent on this transport.
+     * @hide
+     */
+    public static final int MESSAGE_FAILURE_REASON_DELEGATE_DEAD = 1;
+
+    /**
+     * The message has not been sent/received because the delegate is in the process of closing and
+     * has become unavailable. No further messages should be sent/received on this delegate.
+     * @hide
+     */
+    public static final int MESSAGE_FAILURE_REASON_DELEGATE_CLOSED = 2;
+
+    /**
+     * The SIP message has an invalid start line and the message can not be sent.
+     * @hide
+     */
+    public static final int MESSAGE_FAILURE_REASON_INVALID_START_LINE = 3;
+
+    /**
+     * One or more of the header fields in the header section of the outgoing SIP message is invalid
+     * and the SIP message can not be sent.
+     * @hide
+     */
+    public static final int MESSAGE_FAILURE_REASON_INVALID_HEADER_FIELDS = 4;
+
+    /**
+     * The body content of the SIP message is invalid and the message can not be sent.
+     * @hide
+     */
+    public static final int MESSAGE_FAILURE_REASON_INVALID_BODY_CONTENT = 5;
+
+    /**
+     * The feature tag associated with the outgoing message does not match any known feature tags
+     * and this message can not be sent.
+     * @hide
+     */
+    public static final int MESSAGE_FAILURE_REASON_INVALID_FEATURE_TAG = 6;
+
+    /**
+     * The feature tag associated with the outgoing message is not enabled for the associated
+     * SipDelegateConnection and can not be sent.
+     * @hide
+     */
+    public static final int MESSAGE_FAILURE_REASON_TAG_NOT_ENABLED_FOR_DELEGATE = 7;
+
+    /**
+     * The link to the network has been lost and the outgoing message has failed to send.
+     * <p>
+     * This message should be retried when connectivity to the network is re-established. See
+     * {@link android.net.ConnectivityManager.NetworkCallback} for how this can be determined.
+     * @hide
+     */
+    public static final int MESSAGE_FAILURE_REASON_NETWORK_NOT_AVAILABLE = 8;
+
+    /**
+     * The outgoing SIP message has not been sent due to the SipDelegate not being registered for
+     * IMS at this time.
+     * <p>
+     * This is considered a temporary failure, the message should not be retried until an IMS
+     * registration change callback is received via
+     * {@link DelegateConnectionStateCallback#onFeatureTagStatusChanged}
+     * @hide
+     */
+    public static final int MESSAGE_FAILURE_REASON_NOT_REGISTERED = 9;
+
+    /**
+     * The outgoing SIP message has not been sent because the {@link SipDelegateImsConfiguration}
+     * version associated with the outgoing {@link SipMessage} is now stale and has failed
+     * validation checks.
+     * <p>
+     * The @link SipMessage} should be recreated using the newest
+     * {@link SipDelegateImsConfiguration} and sent again.
+     * @hide
+     */
+    public static final int MESSAGE_FAILURE_REASON_STALE_IMS_CONFIGURATION = 10;
+
+    /**
+     * The outgoing SIP message has not been sent because the internal state of the associated
+     * {@link SipDelegate} is changing and has temporarily brought the transport down.
+     * <p>
+     * This is considered a temporary error and the {@link SipDelegateConnection} should resend the
+     * message once {@link DelegateRegistrationState#DEREGISTERING_REASON_FEATURE_TAGS_CHANGING} is
+     * no longer reported.
+     * @hide
+     */
+    public static final int MESSAGE_FAILURE_REASON_INTERNAL_DELEGATE_STATE_TRANSITION = 11;
+
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(prefix = "MESSAGE_FAILURE_REASON_", value = {
+            MESSAGE_FAILURE_REASON_UNKNOWN,
+            MESSAGE_FAILURE_REASON_DELEGATE_DEAD,
+            MESSAGE_FAILURE_REASON_DELEGATE_CLOSED,
+            MESSAGE_FAILURE_REASON_INVALID_START_LINE,
+            MESSAGE_FAILURE_REASON_INVALID_HEADER_FIELDS,
+            MESSAGE_FAILURE_REASON_INVALID_BODY_CONTENT,
+            MESSAGE_FAILURE_REASON_INVALID_FEATURE_TAG,
+            MESSAGE_FAILURE_REASON_TAG_NOT_ENABLED_FOR_DELEGATE,
+            MESSAGE_FAILURE_REASON_NETWORK_NOT_AVAILABLE,
+            MESSAGE_FAILURE_REASON_NOT_REGISTERED,
+            MESSAGE_FAILURE_REASON_STALE_IMS_CONFIGURATION,
+            MESSAGE_FAILURE_REASON_INTERNAL_DELEGATE_STATE_TRANSITION
+    })
+    public @interface MessageFailureReason {}
+
+
+    /**
+     * Access to use this feature tag has been denied for an unknown reason.
+     * @hide
+     */
+    public static final int DENIED_REASON_UNKNOWN = 0;
+
+    /**
+     * This feature tag is allowed to be used by this SipDelegateConnection, but it is in use by
+     * another SipDelegateConnection and can not be associated with this delegate. The feature tag
+     * will stay in this state until the feature tag is release by the other application.
+     * @hide
+     */
+    public static final int DENIED_REASON_IN_USE_BY_ANOTHER_DELEGATE = 1;
+
+    /**
+     * Access to use this feature tag has been denied because this application does not have the
+     * permissions required to access this feature tag.
+     * @hide
+     */
+    public static final int DENIED_REASON_NOT_ALLOWED = 2;
+
+    /**
+     * Access to use this feature tag has been denied because single registration is not allowed by
+     * the carrier at this time. The application should fall back to dual registration if
+     * applicable.
+     * @hide
+     */
+    public static final int DENIED_REASON_SINGLE_REGISTRATION_NOT_ALLOWED = 3;
+
+    /**
+     * This feature tag is not recognized as a valid feature tag by the SipDelegate and has been
+     * denied.
+     * @hide
+     */
+    public static final int DENIED_REASON_INVALID = 4;
+
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(prefix = "DENIED_REASON_", value = {
+            DENIED_REASON_UNKNOWN,
+            DENIED_REASON_IN_USE_BY_ANOTHER_DELEGATE,
+            DENIED_REASON_NOT_ALLOWED,
+            DENIED_REASON_SINGLE_REGISTRATION_NOT_ALLOWED,
+            DENIED_REASON_INVALID
+    })
+    public @interface DeniedReason {}
+
+    /**
+     * The SipDelegate has closed due to an unknown reason.
+     * @hide
+     */
+    public static final int SIP_DELEGATE_DESTROY_REASON_UNKNOWN = 0;
+
+    /**
+     * The SipDelegate has closed because the IMS service has died unexpectedly.
+     * @hide
+     */
+    public static final int SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD = 1;
+
+    /**
+     * The SipDelegate has closed because the IMS application has requested that the connection be
+     * destroyed.
+     * @hide
+     */
+    public static final int SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP = 2;
+
+    /**
+     * The SipDelegate has closed because the IMS service does not support the creation of
+     * SipDelegates.
+     * @hide
+     */
+    public static final int SIP_DELEGATE_DESTROY_REASON_SERVICE_NOT_SUPPORTED = 3;
+
+    /**
+     * The SipDelegate has been closed due to the user disabling RCS.
+     * @hide
+     */
+    public static final int SIP_DELEGATE_DESTROY_REASON_USER_DISABLED_RCS = 4;
+
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(prefix = "SIP_DELEGATE_DESTROY_REASON", value = {
+            SIP_DELEGATE_DESTROY_REASON_UNKNOWN,
+            SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD,
+            SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP,
+            SIP_DELEGATE_DESTROY_REASON_SERVICE_NOT_SUPPORTED,
+            SIP_DELEGATE_DESTROY_REASON_USER_DISABLED_RCS
+    })
+    public @interface SipDelegateDestroyReason {}
+
     private final Context mContext;
     private final int mSubId;
+    private final BinderCacheManager<IImsRcsController> mBinderCache;
 
     /**
      * Only visible for testing. To instantiate an instance of this class, please use
@@ -47,9 +269,11 @@
      * @hide
      */
     @VisibleForTesting
-    public SipDelegateManager(Context context, int subId) {
+    public SipDelegateManager(Context context, int subId,
+            BinderCacheManager<IImsRcsController> binderCache) {
         mContext = context;
         mSubId = subId;
+        mBinderCache = binderCache;
     }
 
     /**
@@ -69,7 +293,7 @@
     @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
     public boolean isSupported() throws ImsException {
         try {
-            IImsRcsController controller = getIImsRcsController();
+            IImsRcsController controller = mBinderCache.getBinder();
             if (controller == null) {
                 throw new ImsException("Telephony server is down",
                         ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
@@ -83,11 +307,90 @@
         }
     }
 
-    private IImsRcsController getIImsRcsController() {
-        IBinder binder = TelephonyFrameworkInitializer
-                .getTelephonyServiceManager()
-                .getTelephonyImsServiceRegisterer()
-                .get();
-        return IImsRcsController.Stub.asInterface(binder);
+    /**
+     * Request that the ImsService implementation create a SipDelegate, which will configure the
+     * ImsService to forward SIP traffic that matches the filtering criteria set in supplied
+     * {@link DelegateRequest} to the application that the supplied callbacks are registered for.
+     * <p>
+     * This API requires that the caller is running as part of a long-running process and will
+     * always be available to handle incoming messages. One mechanism that can be used for this is
+     * the {@link android.service.carrier.CarrierMessagingClientService}, which the framework keeps
+     * a persistent binding to when the app is the default SMS application.
+     * @param request The parameters that are associated with the SipDelegate creation request that
+     *                will be used to create the SipDelegate connection.
+     * @param executor The executor that will be used to call the callbacks associated with this
+     *          SipDelegate.
+     * @param dc The callback that will be used to notify the listener of the creation/destruction
+     *           of the remote SipDelegate as well as changes to the state of the remote SipDelegate
+     *           connection.
+     * @param mc The callback that will be used to notify the listener of new incoming SIP messages
+     *           as well as the status of messages that were sent by the associated
+     *           SipDelegateConnection.
+     * @throws ImsException Thrown if there was a problem communicating with the ImsService
+     * associated with this SipDelegateManager. See {@link ImsException#getCode()}.
+     * @hide
+     */
+    @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
+    public void createSipDelegate(@NonNull DelegateRequest request, @NonNull Executor executor,
+            @NonNull DelegateConnectionStateCallback dc,
+            @NonNull DelegateConnectionMessageCallback mc) throws ImsException {
+        if (request == null || executor == null || dc == null || mc == null) {
+            throw new IllegalArgumentException("Invalid arguments passed into createSipDelegate");
+        }
+        try {
+            SipDelegateConnectionAidlWrapper wrapper =
+                    new SipDelegateConnectionAidlWrapper(executor, dc, mc);
+            IImsRcsController controller = mBinderCache.listenOnBinder(wrapper,
+                    wrapper::binderDied);
+            if (controller == null) {
+                throw new ImsException("Telephony server is down",
+                        ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+            }
+            controller.createSipDelegate(mSubId, request, wrapper.getStateCallbackBinder(),
+                    wrapper.getMessageCallbackBinder());
+        } catch (ServiceSpecificException e) {
+            throw new ImsException(e.getMessage(), e.errorCode);
+        } catch (RemoteException e) {
+            throw new ImsException(e.getMessage(),
+                    ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+        }
+    }
+
+    /**
+     * Destroy a previously created {@link SipDelegateConnection} that was created using
+     * {@link #createSipDelegate}.
+     * <p>
+     * This will also clean up all related callbacks in the associated ImsService.
+     * @param delegateConnection The SipDelegateConnection to destroy.
+     * @param reason The reason for why this SipDelegateConnection was destroyed.
+     * @hide
+     */
+    @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
+    public void destroySipDelegate(@NonNull SipDelegateConnection delegateConnection,
+            @SipDelegateDestroyReason int reason) {
+
+        if (delegateConnection == null) {
+            throw new IllegalArgumentException("invalid argument passed into destroySipDelegate");
+        }
+        if (delegateConnection instanceof SipDelegateConnectionAidlWrapper) {
+            SipDelegateConnectionAidlWrapper w =
+                    (SipDelegateConnectionAidlWrapper) delegateConnection;
+            try {
+                IImsRcsController c = mBinderCache.removeRunnable(w);
+                c.destroySipDelegate(mSubId, w.getSipDelegateBinder(), reason);
+            } catch (RemoteException e) {
+                // Connection to telephony died, but this will signal destruction of SipDelegate
+                // eventually anyway, so return normally.
+                try {
+                    w.getStateCallbackBinder().onDestroyed(
+                            SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+                } catch (RemoteException ignore) {
+                    // Local to process.
+                }
+            }
+        } else {
+            throw new IllegalArgumentException("Unknown SipDelegateConnection implementation passed"
+                    + " into this method");
+        }
     }
 }
diff --git a/packages/CarSystemUI/res/values/themes.xml b/telephony/java/android/telephony/ims/SipMessage.aidl
similarity index 63%
copy from packages/CarSystemUI/res/values/themes.xml
copy to telephony/java/android/telephony/ims/SipMessage.aidl
index f82be3c..5140f8a 100644
--- a/packages/CarSystemUI/res/values/themes.xml
+++ b/telephony/java/android/telephony/ims/SipMessage.aidl
@@ -1,13 +1,11 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
+/*
+ * Copyright (c) 2020 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -15,9 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
--->
 
-<resources>
-    <style name="Theme.Notification" parent="Theme.DeviceDefault.NoActionBar.Notification">
-    </style>
-</resources>
+package android.telephony.ims;
+
+parcelable SipMessage;
diff --git a/telephony/java/android/telephony/ims/SipMessage.java b/telephony/java/android/telephony/ims/SipMessage.java
new file mode 100644
index 0000000..c3b1be2
--- /dev/null
+++ b/telephony/java/android/telephony/ims/SipMessage.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.os.Build;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Represents a partially encoded SIP message. See RFC 3261 for more information on how SIP
+ * messages are structured and used.
+ * <p>
+ * The SIP message is represented in a partially encoded form in order to allow for easier
+ * verification and should not be used as a generic SIP message container.
+ * @hide
+ */
+public final class SipMessage implements Parcelable {
+    // Should not be set to true for production!
+    private static final boolean IS_DEBUGGING = Build.IS_ENG;
+
+    private static final String[] SIP_REQUEST_METHODS = new String[] {"INVITE", "ACK", "OPTIONS",
+            "BYE", "CANCEL", "REGISTER"};
+
+    private final String mStartLine;
+    private final String mHeaderSection;
+    private final byte[] mContent;
+
+    /**
+     * Represents a partially encoded SIP message.
+     *
+     * @param startLine The start line of the message, containing either the request-line or
+     *                  status-line.
+     * @param headerSection A String containing the full unencoded SIP message header.
+     * @param content UTF-8 encoded SIP message body.
+     */
+    public SipMessage(@NonNull String startLine, @NonNull String headerSection,
+            @NonNull byte[] content) {
+        if (startLine == null || headerSection == null || content == null) {
+            throw new IllegalArgumentException("One or more null parameters entered");
+        }
+        mStartLine = startLine;
+        mHeaderSection = headerSection;
+        mContent = content;
+    }
+
+    /**
+     * Private constructor used only for unparcelling.
+     */
+    private SipMessage(Parcel source) {
+        mStartLine = source.readString();
+        mHeaderSection = source.readString();
+        mContent = new byte[source.readInt()];
+        source.readByteArray(mContent);
+    }
+    /**
+     * @return The start line of the SIP message, which contains either the request-line or
+     * status-line.
+     */
+    public @NonNull String getStartLine() {
+        return mStartLine;
+    }
+
+    /**
+     * @return The full, unencoded header section of the SIP message.
+     */
+    public @NonNull String getHeaderSection() {
+        return mHeaderSection;
+    }
+
+    /**
+     * @return only the UTF-8 encoded SIP message body.
+     */
+    public @NonNull byte[] getContent() {
+        return mContent;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(mStartLine);
+        dest.writeString(mHeaderSection);
+        dest.writeInt(mContent.length);
+        dest.writeByteArray(mContent);
+    }
+
+    public static final Creator<SipMessage> CREATOR = new Creator<SipMessage>() {
+        @Override
+        public SipMessage createFromParcel(Parcel source) {
+            return new SipMessage(source);
+        }
+
+        @Override
+        public SipMessage[] newArray(int size) {
+            return new SipMessage[size];
+        }
+    };
+
+    @Override
+    public String toString() {
+        StringBuilder b = new StringBuilder();
+        b.append("StartLine: [");
+        if (IS_DEBUGGING) {
+            b.append(mStartLine);
+        } else {
+            b.append(sanitizeStartLineRequest(mStartLine));
+        }
+        b.append("], [");
+        b.append("Header: [");
+        if (IS_DEBUGGING) {
+            b.append(mHeaderSection);
+        } else {
+            // only identify transaction id/call ID when it is available.
+            b.append("***");
+        }
+        b.append("], ");
+        b.append("Content: [NOT SHOWN]");
+        return b.toString();
+    }
+
+    /**
+     * Start lines containing requests are formatted: METHOD SP Request-URI SP SIP-Version CRLF.
+     * Detect if this is a REQUEST and redact Request-URI portion here, as it contains PII.
+     */
+    private String sanitizeStartLineRequest(String startLine) {
+        String[] splitLine = startLine.split(" ");
+        if (splitLine == null || splitLine.length == 0)  {
+            return "(INVALID STARTLINE)";
+        }
+        for (String method : SIP_REQUEST_METHODS) {
+            if (splitLine[0].contains(method)) {
+                return splitLine[0] + " <Request-URI> " + splitLine[2];
+            }
+        }
+        return startLine;
+    }
+}
diff --git a/telephony/java/android/telephony/ims/aidl/IImsMmTelFeature.aidl b/telephony/java/android/telephony/ims/aidl/IImsMmTelFeature.aidl
index b9a6b3c..37fec7a 100644
--- a/telephony/java/android/telephony/ims/aidl/IImsMmTelFeature.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IImsMmTelFeature.aidl
@@ -21,6 +21,7 @@
 import android.telephony.ims.aidl.IImsSmsListener;
 import android.telephony.ims.aidl.IImsCapabilityCallback;
 import android.telephony.ims.feature.CapabilityChangeRequest;
+import android.telephony.ims.RtpHeaderExtensionType;
 
 import android.telephony.ims.ImsCallProfile;
 import com.android.ims.internal.IImsCallSession;
@@ -29,6 +30,8 @@
 import com.android.ims.internal.IImsRegistrationListener;
 import com.android.ims.internal.IImsUt;
 
+import java.util.List;
+
 /**
  * See MmTelFeature for more information.
  * {@hide}
@@ -37,6 +40,7 @@
     void setListener(IImsMmTelListener l);
     int getFeatureState();
     ImsCallProfile createCallProfile(int callSessionType, int callType);
+    void changeOfferedRtpHeaderExtensionTypes(in List<RtpHeaderExtensionType> types);
     IImsCallSession createCallSession(in ImsCallProfile profile);
     int shouldProcessCall(in String[] uris);
     IImsUt getUtInterface();
diff --git a/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl b/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl
index 8e84e93..f218e35 100644
--- a/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl
@@ -17,10 +17,15 @@
 package android.telephony.ims.aidl;
 
 import android.net.Uri;
+import android.telephony.ims.DelegateRequest;
 import android.telephony.ims.aidl.IImsCapabilityCallback;
+import android.telephony.ims.aidl.IImsRegistrationCallback;
 import android.telephony.ims.aidl.IRcsUceControllerCallback;
 import android.telephony.ims.aidl.IRcsUcePublishStateCallback;
-import android.telephony.ims.aidl.IImsRegistrationCallback;
+import android.telephony.ims.aidl.IRcsUcePublishStateCallback;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+import android.telephony.ims.aidl.ISipDelegateConnectionStateCallback;
 
 import com.android.ims.ImsFeatureContainer;
 import com.android.ims.internal.IImsServiceFeatureCallback;
@@ -58,6 +63,10 @@
 
     // SipDelegateManager
     boolean isSipDelegateSupported(int subId);
+    void createSipDelegate(int subId, in DelegateRequest request,
+            ISipDelegateConnectionStateCallback delegateState,
+            ISipDelegateMessageCallback delegateMessage);
+    void destroySipDelegate(int subId, ISipDelegate connection, int reason);
 
     // Internal commands that should not be made public
     void registerRcsFeatureCallback(int slotId, in IImsServiceFeatureCallback callback);
diff --git a/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl b/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl
new file mode 100644
index 0000000..477ee95
--- /dev/null
+++ b/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.ims.aidl;
+
+import android.telephony.ims.SipMessage;
+
+/**
+ * See {@link SipDelegate} and {@link SipDelegateConnection} for docs regarding this callback.
+ * {@hide}
+ */
+oneway interface ISipDelegate {
+    void sendMessage(in SipMessage sipMessage, int configVersion);
+    void notifyMessageReceived(in String viaTransactionId);
+    void notifyMessageReceiveError(in String viaTransactionId, int reason);
+
+    // only used by SipDelegate.
+    void closeDialog(in String callId);
+}
diff --git a/telephony/java/android/telephony/ims/aidl/ISipDelegateConnectionStateCallback.aidl b/telephony/java/android/telephony/ims/aidl/ISipDelegateConnectionStateCallback.aidl
new file mode 100644
index 0000000..ddfcb99
--- /dev/null
+++ b/telephony/java/android/telephony/ims/aidl/ISipDelegateConnectionStateCallback.aidl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.ims.aidl;
+
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateImsConfiguration;
+import android.telephony.ims.aidl.ISipDelegate;
+
+/**
+ * See {@link SipDelegateConnectionStateCallback} for docs regarding this callback.
+ * {@hide}
+ */
+oneway interface ISipDelegateConnectionStateCallback {
+    void onCreated(ISipDelegate c);
+    void onFeatureTagStatusChanged(in DelegateRegistrationState registrationState,
+                in List<FeatureTagState> deniedFeatureTags);
+    void onImsConfigurationChanged(in SipDelegateImsConfiguration registeredSipConfig);
+    void onDestroyed(int reason);
+}
diff --git a/telephony/java/android/telephony/ims/aidl/ISipDelegateMessageCallback.aidl b/telephony/java/android/telephony/ims/aidl/ISipDelegateMessageCallback.aidl
new file mode 100644
index 0000000..30b7d6c
--- /dev/null
+++ b/telephony/java/android/telephony/ims/aidl/ISipDelegateMessageCallback.aidl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.ims.aidl;
+
+import android.telephony.ims.SipMessage;
+
+/**
+ * See {@link DelegateMessageCallback} and {@link DelegateConnectionMessageCallback} for docs
+ * regarding this callback.
+ * {@hide}
+ */
+oneway interface ISipDelegateMessageCallback {
+   void onMessageReceived(in SipMessage message);
+   void onMessageSent(in String viaTransactionId);
+   void onMessageSendFailure(in String viaTransactionId, int reason);
+}
diff --git a/telephony/java/android/telephony/ims/aidl/ISipDelegateStateCallback.aidl b/telephony/java/android/telephony/ims/aidl/ISipDelegateStateCallback.aidl
new file mode 100644
index 0000000..609ee26
--- /dev/null
+++ b/telephony/java/android/telephony/ims/aidl/ISipDelegateStateCallback.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.ims.aidl;
+
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateImsConfiguration;
+import android.telephony.ims.aidl.ISipDelegate;
+
+/**
+ * See {@link SipDelegateStateCallback} for docs regarding this callback.
+ * {@hide}
+ */
+oneway interface ISipDelegateStateCallback {
+    void onCreated(ISipDelegate c, in List<FeatureTagState> deniedFeatureTags);
+    void onFeatureTagRegistrationChanged(in DelegateRegistrationState registrationState);
+    void onImsConfigurationChanged(in SipDelegateImsConfiguration registeredSipConfig);
+    void onDestroyed(int reason);
+}
diff --git a/telephony/java/android/telephony/ims/aidl/ISipTransport.aidl b/telephony/java/android/telephony/ims/aidl/ISipTransport.aidl
index fe23343..cd88839 100644
--- a/telephony/java/android/telephony/ims/aidl/ISipTransport.aidl
+++ b/telephony/java/android/telephony/ims/aidl/ISipTransport.aidl
@@ -16,9 +16,17 @@
 
 package android.telephony.ims.aidl;
 
+import android.telephony.ims.DelegateRequest;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+import android.telephony.ims.aidl.ISipDelegateStateCallback;
+
 /**
  * Interface for commands to the SIP Transport implementation.
  * {@hide}
  */
-interface ISipTransport {
+oneway interface ISipTransport {
+    void createSipDelegate(in DelegateRequest request, ISipDelegateStateCallback dc,
+            ISipDelegateMessageCallback mc);
+    void destroySipDelegate(ISipDelegate delegate, int reason);
 }
diff --git a/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java b/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java
new file mode 100644
index 0000000..a7f62cc
--- /dev/null
+++ b/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Binder;
+import android.os.RemoteException;
+import android.telephony.ims.DelegateMessageCallback;
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.DelegateStateCallback;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateImsConfiguration;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.SipMessage;
+import android.telephony.ims.stub.SipDelegate;
+
+import java.util.List;
+import java.util.concurrent.Executor;
+
+/**
+ * Implementation of callbacks by wrapping the internal AIDL from telephony. Also implements
+ * ISipDelegate internally when {@link DelegateStateCallback#onCreated(SipDelegate, List)} is called
+ * in order to trampoline events back to telephony.
+ * @hide
+ */
+public class SipDelegateAidlWrapper implements DelegateStateCallback, DelegateMessageCallback {
+
+    private final ISipDelegate.Stub mDelegateBinder = new ISipDelegate.Stub() {
+        @Override
+        public void sendMessage(SipMessage sipMessage, int configVersion) {
+            SipDelegate d = mDelegate;
+            final long token = Binder.clearCallingIdentity();
+            try {
+                mExecutor.execute(() -> d.sendMessage(sipMessage, configVersion));
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+
+        @Override
+        public void notifyMessageReceived(String viaTransactionId)  {
+            SipDelegate d = mDelegate;
+            final long token = Binder.clearCallingIdentity();
+            try {
+                mExecutor.execute(() -> d.notifyMessageReceived(viaTransactionId));
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+
+        }
+
+        @Override
+        public void notifyMessageReceiveError(String viaTransactionId, int reason) {
+            SipDelegate d = mDelegate;
+            final long token = Binder.clearCallingIdentity();
+            try {
+                mExecutor.execute(() -> d.notifyMessageReceiveError(viaTransactionId, reason));
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+
+        }
+
+        @Override
+        public void closeDialog(String callId)  {
+            SipDelegate d = mDelegate;
+            final long token = Binder.clearCallingIdentity();
+            try {
+                mExecutor.execute(() -> d.closeDialog(callId));
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+    };
+
+    private final ISipDelegateMessageCallback mMessageBinder;
+    private final ISipDelegateStateCallback mStateBinder;
+    private final Executor mExecutor;
+
+    private volatile SipDelegate mDelegate;
+
+    public SipDelegateAidlWrapper(Executor executor, ISipDelegateStateCallback stateBinder,
+            ISipDelegateMessageCallback messageBinder) {
+        mExecutor = executor;
+        mStateBinder = stateBinder;
+        mMessageBinder = messageBinder;
+    }
+
+    @Override
+    public void onMessageReceived(SipMessage message) {
+        try {
+            mMessageBinder.onMessageReceived(message);
+        } catch (RemoteException e) {
+            // BinderDied will be called on SipTransport instance to trigger destruction. Notify
+            // failure message failure locally for now.
+            SipDelegate d = mDelegate;
+            if (d != null) {
+                notifyLocalMessageFailedToBeReceived(message,
+                        SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_DEAD);
+            }
+        }
+    }
+
+    @Override
+    public void onMessageSent(String viaTransactionId) {
+        try {
+            mMessageBinder.onMessageSent(viaTransactionId);
+        } catch (RemoteException e) {
+            // BinderDied will trigger destroySipDelegate, so just ignore this locally.
+        }
+    }
+
+    @Override
+    public void onMessageSendFailure(String viaTransactionId, int reason) {
+        try {
+            mMessageBinder.onMessageSendFailure(viaTransactionId, reason);
+        } catch (RemoteException e) {
+            // BinderDied will trigger destroySipDelegate, so just ignore this locally.
+        }
+    }
+
+    @Override
+    public void onCreated(@NonNull SipDelegate delegate,
+            @Nullable List<FeatureTagState> deniedTags) {
+        mDelegate = delegate;
+        try {
+            mStateBinder.onCreated(mDelegateBinder, deniedTags);
+        } catch (RemoteException e) {
+            // BinderDied will trigger destroySipDelegate, so just ignore this locally.
+        }
+    }
+
+    @Override
+    public void onFeatureTagRegistrationChanged(DelegateRegistrationState registrationState) {
+        try {
+            mStateBinder.onFeatureTagRegistrationChanged(registrationState);
+        } catch (RemoteException e) {
+            // BinderDied will trigger destroySipDelegate, so just ignore this locally.
+        }
+    }
+
+    @Override
+    public void onImsConfigurationChanged(@NonNull SipDelegateImsConfiguration config) {
+        try {
+            mStateBinder.onImsConfigurationChanged(config);
+        } catch (RemoteException e) {
+            // BinderDied will trigger destroySipDelegate, so just ignore this locally.
+        }
+    }
+
+    @Override
+    public void onDestroyed(int reasonCode) {
+        mDelegate = null;
+        try {
+            mStateBinder.onDestroyed(reasonCode);
+        } catch (RemoteException e) {
+            // Do not worry about this if the remote side is already dead.
+        }
+    }
+
+    public SipDelegate getDelegate()  {
+        return mDelegate;
+    }
+
+    public ISipDelegate getDelegateBinder() {
+        return mDelegateBinder;
+    }
+
+    private void notifyLocalMessageFailedToBeReceived(SipMessage m, int reason) {
+        //TODO: parse transaction ID or throw IllegalArgumentException if the SipMessage
+        // transaction ID can not be parsed.
+        SipDelegate d = mDelegate;
+        if (d != null) {
+            mExecutor.execute(() -> d.notifyMessageReceiveError(null, reason));
+        }
+    }
+}
diff --git a/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
new file mode 100644
index 0000000..3bd1a46
--- /dev/null
+++ b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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;
+
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateConnection;
+import android.telephony.ims.SipDelegateImsConfiguration;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.SipMessage;
+import android.telephony.ims.stub.DelegateConnectionMessageCallback;
+import android.telephony.ims.stub.DelegateConnectionStateCallback;
+import android.telephony.ims.stub.SipDelegate;
+import android.util.ArraySet;
+import android.util.Log;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Wrapper class implementing {@link SipDelegateConnection} using AIDL, which is returned to the
+ * local process. Also holds a reference to incoming connection message and state AIDL impl to
+ * trampoline events to callbacks as well as notify the local process in the event that the remote
+ * process becomes unavailable.
+ * <p>
+ * When the remote {@link SipDelegate} is created, this instance tracks the
+ * {@link ISipDelegate} associated with it and implements the
+ * {@link SipDelegateConnection} sent back to the local callback.
+ * @hide
+ */
+public class SipDelegateConnectionAidlWrapper implements SipDelegateConnection,
+        IBinder.DeathRecipient {
+    private static final String LOG_TAG = "SipDelegateCAW";
+
+    private final ISipDelegateConnectionStateCallback.Stub mStateBinder =
+            new ISipDelegateConnectionStateCallback.Stub() {
+        @Override
+        public void onCreated(ISipDelegate c) {
+            associateSipDelegate(c);
+            final long token = Binder.clearCallingIdentity();
+            try {
+                mExecutor.execute(() ->
+                        mStateCallback.onCreated(SipDelegateConnectionAidlWrapper.this));
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+
+        @Override
+        public void onFeatureTagStatusChanged(DelegateRegistrationState registrationState,
+                List<FeatureTagState> deniedFeatureTags) {
+            final long token = Binder.clearCallingIdentity();
+            try {
+                mExecutor.execute(() ->
+                        mStateCallback.onFeatureTagStatusChanged(registrationState,
+                                new ArraySet<>(deniedFeatureTags)));
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+
+        @Override
+        public void onImsConfigurationChanged(SipDelegateImsConfiguration registeredSipConfig) {
+            final long token = Binder.clearCallingIdentity();
+            try {
+                mExecutor.execute(() ->
+                        mStateCallback.onImsConfigurationChanged(registeredSipConfig));
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+
+        @Override
+        public void onDestroyed(int reason) {
+            invalidateSipDelegateBinder();
+            final long token = Binder.clearCallingIdentity();
+            try {
+                mExecutor.execute(() ->
+                        mStateCallback.onDestroyed(reason));
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+    };
+
+    private final ISipDelegateMessageCallback.Stub mMessageBinder =
+            new ISipDelegateMessageCallback.Stub() {
+                @Override
+                public void onMessageReceived(SipMessage message) {
+                    final long token = Binder.clearCallingIdentity();
+                    try {
+                        mExecutor.execute(() ->
+                                mMessageCallback.onMessageReceived(message));
+                    } finally {
+                        Binder.restoreCallingIdentity(token);
+                    }
+                }
+
+                @Override
+                public void onMessageSent(String viaTransactionId) {
+                    final long token = Binder.clearCallingIdentity();
+                    try {
+                        mExecutor.execute(() ->
+                                mMessageCallback.onMessageSent(viaTransactionId));
+                    } finally {
+                        Binder.restoreCallingIdentity(token);
+                    }
+                }
+
+                @Override
+                public void onMessageSendFailure(String viaTransactionId, int reason) {
+                    final long token = Binder.clearCallingIdentity();
+                    try {
+                        mExecutor.execute(() ->
+                                mMessageCallback.onMessageSendFailure(viaTransactionId, reason));
+                    } finally {
+                        Binder.restoreCallingIdentity(token);
+                    }
+                }
+            };
+
+
+    private final Executor mExecutor;
+    private final DelegateConnectionStateCallback mStateCallback;
+    private final DelegateConnectionMessageCallback mMessageCallback;
+    private final AtomicReference<ISipDelegate> mDelegateBinder =
+            new AtomicReference<>();
+
+    /**
+     * Wrap the local state and message callbacks, calling the implementation of these interfaces
+     * when the remote process calls these methods.
+     */
+    public SipDelegateConnectionAidlWrapper(Executor executor,
+            DelegateConnectionStateCallback stateCallback,
+            DelegateConnectionMessageCallback messageCallback) {
+        mExecutor = executor;
+        mStateCallback = stateCallback;
+        mMessageCallback = messageCallback;
+    }
+
+    @Override
+    public void sendMessage(SipMessage sipMessage, int configVersion) {
+        try {
+            ISipDelegate conn = getSipDelegateBinder();
+            if (conn == null) {
+                notifyLocalMessageFailedToSend(sipMessage,
+                        SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_CLOSED);
+                return;
+            }
+            conn.sendMessage(sipMessage, configVersion);
+        } catch (RemoteException e) {
+            notifyLocalMessageFailedToSend(sipMessage,
+                        SipDelegateManager.MESSAGE_FAILURE_REASON_DELEGATE_DEAD);
+        }
+    }
+
+    @Override
+    public void notifyMessageReceived(String viaTransactionId) {
+        try {
+            ISipDelegate conn = getSipDelegateBinder();
+            if (conn == null) {
+                return;
+            }
+            conn.notifyMessageReceived(viaTransactionId);
+        } catch (RemoteException e) {
+            // Nothing to do here, app will eventually get remote death callback.
+        }
+    }
+
+    @Override
+    public void notifyMessageReceiveError(String viaTransactionId, int reason) {
+        try {
+            ISipDelegate conn = getSipDelegateBinder();
+            if (conn == null) {
+                return;
+            }
+            conn.notifyMessageReceiveError(viaTransactionId, reason);
+        } catch (RemoteException e) {
+            // Nothing to do here, app will eventually get remote death callback.
+        }
+    }
+
+    // Also called upon IImsRcsController death (telephony process dies).
+    @Override
+    public void binderDied() {
+        invalidateSipDelegateBinder();
+        mExecutor.execute(() -> mStateCallback.onDestroyed(
+                SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD));
+    }
+
+    /**
+     * @return Implementation of state binder.
+     */
+    public ISipDelegateConnectionStateCallback getStateCallbackBinder() {
+        return mStateBinder;
+    }
+
+    /**
+     * @return Implementation of message binder.
+     */
+    public ISipDelegateMessageCallback getMessageCallbackBinder() {
+        return mMessageBinder;
+    }
+
+    /**
+     * @return The ISipDelegateConnection associated with this wrapper.
+     */
+    public ISipDelegate getSipDelegateBinder() {
+        return mDelegateBinder.get();
+    }
+
+    private void associateSipDelegate(ISipDelegate c) {
+        if (c != null) {
+            try {
+                c.asBinder().linkToDeath(this, 0 /*flags*/);
+            } catch (RemoteException e) {
+                // already dead.
+                c = null;
+            }
+        }
+        mDelegateBinder.set(c);
+    }
+
+    private void invalidateSipDelegateBinder() {
+        ISipDelegate oldVal = mDelegateBinder.getAndUpdate((unused) -> null);
+        if (oldVal != null) {
+            try {
+                oldVal.asBinder().unlinkToDeath(this, 0 /*flags*/);
+            } catch (NoSuchElementException e) {
+                Log.i(LOG_TAG, "invalidateSipDelegateBinder: " + e);
+            }
+        }
+    }
+
+    private void notifyLocalMessageFailedToSend(SipMessage m, int reason) {
+        //TODO: parse transaction ID or throw IllegalArgumentException if the SipMessage
+        // transaction ID can not be parsed.
+        mExecutor.execute(() ->
+                mMessageCallback.onMessageSendFailure(null, reason));
+    }
+}
diff --git a/telephony/java/android/telephony/ims/feature/ImsFeature.java b/telephony/java/android/telephony/ims/feature/ImsFeature.java
index b0a7b62..96ca022 100644
--- a/telephony/java/android/telephony/ims/feature/ImsFeature.java
+++ b/telephony/java/android/telephony/ims/feature/ImsFeature.java
@@ -509,6 +509,7 @@
      * @return true if the capability is enabled, false otherwise.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     public abstract boolean queryCapabilityConfiguration(int capability, int radioTech);
 
     /**
@@ -547,5 +548,6 @@
      * @return Binder instance that the framework will use to communicate with this feature.
      * @hide
      */
+    @SuppressWarnings("HiddenAbstractMethod")
     protected abstract IInterface getBinder();
 }
diff --git a/telephony/java/android/telephony/ims/feature/MmTelFeature.java b/telephony/java/android/telephony/ims/feature/MmTelFeature.java
index 508d1a7..e823417 100644
--- a/telephony/java/android/telephony/ims/feature/MmTelFeature.java
+++ b/telephony/java/android/telephony/ims/feature/MmTelFeature.java
@@ -27,6 +27,8 @@
 import android.telephony.ims.ImsCallProfile;
 import android.telephony.ims.ImsCallSession;
 import android.telephony.ims.ImsReasonInfo;
+import android.telephony.ims.ImsService;
+import android.telephony.ims.RtpHeaderExtensionType;
 import android.telephony.ims.aidl.IImsCapabilityCallback;
 import android.telephony.ims.aidl.IImsMmTelFeature;
 import android.telephony.ims.aidl.IImsMmTelListener;
@@ -37,6 +39,7 @@
 import android.telephony.ims.stub.ImsRegistrationImplBase;
 import android.telephony.ims.stub.ImsSmsImplBase;
 import android.telephony.ims.stub.ImsUtImplBase;
+import android.util.ArraySet;
 
 import com.android.ims.internal.IImsCallSession;
 import com.android.ims.internal.IImsEcbm;
@@ -45,6 +48,8 @@
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.List;
+import java.util.Set;
 
 /**
  * Base implementation for Voice and SMS (IR-92) and Video (IR-94) IMS support.
@@ -93,6 +98,18 @@
         }
 
         @Override
+        public void changeOfferedRtpHeaderExtensionTypes(List<RtpHeaderExtensionType> types)
+                throws RemoteException {
+            synchronized (mLock) {
+                try {
+                    MmTelFeature.this.changeOfferedRtpHeaderExtensionTypes(new ArraySet<>(types));
+                } catch (Exception e) {
+                    throw new RemoteException(e.getMessage());
+                }
+            }
+        }
+
+        @Override
         public IImsCallSession createCallSession(ImsCallProfile profile) throws RemoteException {
             synchronized (mLock) {
                 return createCallSessionInterface(profile);
@@ -623,6 +640,24 @@
     }
 
     /**
+     * Called by the framework to report a change to the RTP header extension types which should be
+     * offered during SDP negotiation (see RFC8285 for more information).
+     * <p>
+     * The {@link ImsService} should report the RTP header extensions which were accepted during
+     * SDP negotiation using {@link ImsCallProfile#setAcceptedRtpHeaderExtensionTypes(Set)}.
+     *
+     * @param extensionTypes The RTP header extensions the framework wishes to offer during
+     *                       outgoing and incoming call setup.  An empty list indicates that there
+     *                       are no framework defined RTP header extension types to offer.
+     * @hide
+     */
+    @SystemApi
+    public void changeOfferedRtpHeaderExtensionTypes(
+            @NonNull Set<RtpHeaderExtensionType> extensionTypes) {
+        // Base implementation - should be overridden if RTP header extension handling is supported.
+    }
+
+    /**
      * @hide
      */
     public IImsCallSession createCallSessionInterface(ImsCallProfile profile)
diff --git a/telephony/java/android/telephony/ims/stub/DelegateConnectionMessageCallback.java b/telephony/java/android/telephony/ims/stub/DelegateConnectionMessageCallback.java
new file mode 100644
index 0000000..59f9601
--- /dev/null
+++ b/telephony/java/android/telephony/ims/stub/DelegateConnectionMessageCallback.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.ims.stub;
+
+import android.annotation.NonNull;
+import android.telephony.ims.SipDelegateConnection;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.SipMessage;
+
+/**
+ * The callback associated with a {@link SipDelegateConnection}, which handles newly received
+ * messages as well as the result of sending a SIP message.
+ * @hide
+ */
+public interface DelegateConnectionMessageCallback {
+
+    /**
+     * A new {@link SipMessage} has been received from the delegate.
+     * @param message the {@link SipMessage} routed to this RCS application.
+     */
+    void onMessageReceived(@NonNull SipMessage message);
+
+    /**
+     * A message previously sent to the SIP delegate using
+     * {@link SipDelegateConnection#sendMessage} has been successfully sent.
+     * @param viaTransactionId The transaction ID found in the via header field of the
+     *                         previously sent {@link SipMessage}.
+     */
+    void onMessageSent(@NonNull String viaTransactionId);
+
+    /**
+     * A message previously sent to the SIP delegate using
+     * {@link SipDelegateConnection#sendMessage} has failed to be sent.
+     * @param viaTransactionId The Transaction ID found in the via header field of the
+     *                         previously sent {@link SipMessage}.
+     * @param reason The reason for the failure.
+     */
+    void onMessageSendFailure(String viaTransactionId,
+            @SipDelegateManager.MessageFailureReason int reason);
+}
diff --git a/telephony/java/android/telephony/ims/stub/DelegateConnectionStateCallback.java b/telephony/java/android/telephony/ims/stub/DelegateConnectionStateCallback.java
new file mode 100644
index 0000000..9761805
--- /dev/null
+++ b/telephony/java/android/telephony/ims/stub/DelegateConnectionStateCallback.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.stub;
+
+import android.annotation.NonNull;
+import android.telephony.ims.DelegateRegistrationState;
+import android.telephony.ims.DelegateRequest;
+import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateConnection;
+import android.telephony.ims.SipDelegateImsConfiguration;
+import android.telephony.ims.SipDelegateManager;
+
+import java.util.Set;
+
+/**
+ * The callback associated with a {@link SipDelegateConnection} that manages the state of the
+ * SipDelegateConnection.
+ * <p>
+ * After {@link SipDelegateManager#createSipDelegate} is used to request a new
+ * {@link SipDelegateConnection} be created, {@link #onCreated} will be called with the
+ * {@link SipDelegateConnection} instance that must be used to communicate with the remote
+ * {@link SipDelegate}.
+ * <p>
+ * After, {@link #onFeatureTagStatusChanged} will always be called at least once with the current
+ * status of the feature tags that have been requested. The application may receive multiple
+ * {@link #onFeatureTagStatusChanged} callbacks over the lifetime of the associated
+ * {@link SipDelegateConnection}, which will signal changes to how SIP messages associated with
+ * those feature tags will be handled.
+ * <p>
+ * In order to start sending SIP messages, the SIP configuration parameters will need to be
+ * received, so the messaging application should make no assumptions about these parameters and wait
+ * until {@link #onImsConfigurationChanged(SipDelegateImsConfiguration)} has been called. This is
+ * guaranteed to happen after the first {@link #onFeatureTagStatusChanged} if there is at least one
+ * feature tag that has been successfully associated with the {@link SipDelegateConnection}. If all
+ * feature tags were denied, no IMS configuration will be sent.
+ * <p>
+ * The {@link SipDelegateConnection} will stay associated with this RCS application until either the
+ * RCS application calls {@link SipDelegateManager#destroySipDelegate} or telephony destroys the
+ * {@link SipDelegateConnection}. In both cases, {@link #onDestroyed(int)}  will be called.
+ * Telephony destroying the {@link SipDelegateConnection} instance is rare and will only happen in
+ * rare cases, such as if telephony itself or IMS service dies unexpectedly. See
+ * {@link SipDelegateManager.SipDelegateDestroyReason} reasons for more information on all of the
+ * cases that will trigger the {@link SipDelegateConnection} to be destroyed.
+ *
+ * @hide
+ */
+public interface DelegateConnectionStateCallback {
+
+    /**
+     * A {@link SipDelegateConnection} has been successfully created for the
+     * {@link DelegateRequest} used when calling {@link SipDelegateManager#createSipDelegate}.
+     */
+    void onCreated(@NonNull SipDelegateConnection c);
+
+    /**
+     * The status of the RCS feature tags that were requested as part of the initial
+     * {@link DelegateRequest}.
+     * <p>
+     * There are four states that each RCS feature tag can be in: registered, deregistering,
+     * deregistered, and denied.
+     * <p>
+     * When a feature tag is considered registered, SIP messages associated with that feature tag
+     * may be sent and received freely.
+     * <p>
+     * When a feature tag is deregistering, the network IMS registration still contains the feature
+     * tag, however the IMS service and associated {@link SipDelegate} is in the progress of
+     * modifying the IMS registration to remove this feature tag and requires the application to
+     * perform an action before the IMS registration can change. The specific action required for
+     * the SipDelegate to continue modifying the IMS registration can be found in the definition of
+     * each {@link DelegateRegistrationState.DeregisteringReason}.
+     * <p>
+     * When a feature tag is in the deregistered state, new out-of-dialog SIP messages for that
+     * feature tag will be rejected, however due to network race conditions, the RCS application
+     * should still be able to handle new out-of-dialog SIP requests from the network. This may not
+     * be possible, however, if the IMS registration itself was lost. See the
+     * {@link DelegateRegistrationState.DeregisteredReason} reasons for more information on how SIP
+     * messages are handled in each of these cases.
+     * <p>
+     * If a feature tag is denied, no incoming messages will be routed to the associated
+     * {@link DelegateConnectionMessageCallback} and all outgoing SIP messages related to this
+     * feature tag will be rejected. See {@link SipDelegateManager.DeniedReason}
+     * reasons for more information about the conditions when this will happen.
+     * <p>
+     * The set of feature tags contained in the registered, deregistering, deregistered, and denied
+     * lists will always equal the set of feature tags requested in the initial
+     * {@link DelegateRequest}.
+     * <p>
+     * Transitions of feature tags from registered, deregistering, and deregistered and vice-versa
+     * may happen quite often, however transitions to/from denied are rare and only occur if the
+     * user has changed the role of your application to add/remove support for one or more requested
+     * feature tags or carrier provisioning has enabled or disabled single registration entirely.
+     * Please see {@link SipDelegateManager.DeniedReason} reasons for an explanation of each of
+     * these cases as well as what may cause them to change.
+     *
+     * @param registrationState The new IMS registration state of each of the feature tags
+     *     associated with the {@link SipDelegate}.
+     * @param deniedFeatureTags A list of {@link FeatureTagState} objects, each containing a feature
+     *     tag associated with this {@link SipDelegateConnection} that has no access to
+     *     send/receive SIP messages as well as a reason for why the feature tag is denied. For more
+     *     information on the reason why the feature tag was denied access, see the
+     *     {@link SipDelegateManager.DeniedReason} reasons.
+     */
+    void onFeatureTagStatusChanged(@NonNull DelegateRegistrationState registrationState,
+            @NonNull Set<FeatureTagState> deniedFeatureTags);
+
+
+    /**
+     * IMS configuration of the underlying IMS stack used by this IMS application for construction
+     * of the SIP messages that will be sent over the carrier's network.
+     * <p>
+     * There should never be assumptions made about the configuration of the underling IMS stack and
+     * the IMS application should wait for this indication before sending out any outgoing SIP
+     * messages.
+     * <p>
+     * Configuration may change due to IMS registration changes as well as
+     * other optional events on the carrier network. If IMS stack is already registered at the time
+     * of callback registration, then this method shall be invoked with the current configuration.
+     * Otherwise, there may be a delay in this method being called if initial IMS registration has
+     * not compleed yet.
+     *
+     * @param registeredSipConfig The configuration of the IMS stack registered on the IMS network.
+     */
+    void onImsConfigurationChanged(@NonNull SipDelegateImsConfiguration registeredSipConfig);
+
+    /**
+     * The previously created {@link SipDelegateConnection} instance delivered via
+     * {@link #onCreated(SipDelegateConnection)} has been destroyed. This interface should no longer
+     * be used for any SIP message handling.
+     *
+     * @param reason The reason for the failure.
+     */
+    void onDestroyed(@SipDelegateManager.SipDelegateDestroyReason int reason);
+}
diff --git a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
index 12abdd1..a6f5c45 100644
--- a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
+++ b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
@@ -17,6 +17,8 @@
 package android.telephony.ims.stub;
 
 import android.annotation.IntDef;
+import android.annotation.IntRange;
+import android.annotation.Nullable;
 import android.annotation.SystemApi;
 import android.net.Uri;
 import android.os.RemoteException;
@@ -126,6 +128,57 @@
     }
 
     /**
+     * Called by the framework to request that the ImsService perform the network registration
+     * of all SIP delegates associated with this ImsService.
+     * <p>
+     * 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
+    }
+
+
+    /**
+     * Called by the framework to request that the ImsService perform the network deregistration of
+     * all SIP delegates associated with this ImsService.
+     * <p>
+     * This is typically called in situations where the user has changed the configuration of the
+     * device (for example, the default messaging application) and the framework is reconfiguring
+     * the tags associated with each IMS application.
+     * <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
+    }
+
+    /**
+     * Called by the framework to notify the ImsService that a SIP delegate connection has received
+     * a SIP message containing a permanent failure response (such as a 403) or an indication that a
+     * SIP response timer has timed out in response to an outgoing SIP message. This method will be
+     * called when this condition occurs to trigger the ImsService to tear down the full IMS
+     * registration and re-register again.
+     *
+     * @param sipCode The SIP error code that represents a permanent failure that was received in
+     *    response to a request generated by the IMS application. See RFC3261 7.2 for the general
+     *    classes of responses available here, however the codes that generate this condition may
+     *    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,
+            @Nullable String sipReason) {
+        // Stub implementation, ImsService should implement this
+    }
+
+
+    /**
      * Notify the framework that the device is connected to the IMS network.
      *
      * @param imsRadioTech the radio access technology. Valid values are defined as
diff --git a/telephony/java/android/telephony/ims/stub/SipDelegate.java b/telephony/java/android/telephony/ims/stub/SipDelegate.java
new file mode 100644
index 0000000..3ec9709
--- /dev/null
+++ b/telephony/java/android/telephony/ims/stub/SipDelegate.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.ims.stub;
+
+import android.annotation.NonNull;
+import android.telephony.ims.DelegateMessageCallback;
+import android.telephony.ims.ImsService;
+import android.telephony.ims.SipDelegateImsConfiguration;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.SipMessage;
+
+/**
+ * The {@link SipDelegate} is implemented by the {@link ImsService} and allows a privileged
+ * IMS application to use this delegate to send SIP messages as well as acknowledge the receipt of
+ * incoming SIP messages delivered to the application over the existing IMS registration, allowing
+ * for a single IMS registration for multiple IMS applications.
+ * <p>
+ * Once the SIP delegate is created for that application,
+ * {@link ImsRegistrationImplBase#updateSipDelegateRegistration()} will be called, indicating that
+ * the application is finished setting up SipDelegates and the existing IMS registration may be
+ * modified to include the features managed by these SipDelegates.
+ * <p>
+ * This SipDelegate will need to notify the remote application of the registration of these features
+ * as well as the associated {@link SipDelegateImsConfiguration} before the application can start
+ * sending/receiving SIP messages via the transport. See
+ * {@link android.telephony.ims.DelegateStateCallback} for more information.
+ * @hide
+ */
+public interface SipDelegate {
+
+    /**
+     * The framework calls this method when a remote RCS application wishes to send a new outgoing
+     * SIP message.
+     * <p>
+     * Once sent, this SIP delegate should notify the remote application of the success or
+     * failure using {@link DelegateMessageCallback#onMessageSent(String)} or
+     * {@link DelegateMessageCallback#onMessageSendFailure(String, int)}.
+     * @param message The SIP message to be sent over the operator’s network.
+     * @param configVersion The SipDelegateImsConfiguration version used to construct the
+     *         SipMessage. See {@link SipDelegateImsConfiguration} for more information. If the
+     *         version specified here does not match the most recently constructed
+     *         {@link SipDelegateImsConfiguration}, this message should fail validation checks and
+     *         {@link DelegateMessageCallback#onMessageSendFailure} should be called with code
+     *         {@link SipDelegateManager#MESSAGE_FAILURE_REASON_STALE_IMS_CONFIGURATION}.
+     */
+    void sendMessage(@NonNull SipMessage message, int configVersion);
+
+    /**
+     * The framework is requesting that routing resources associated with the SIP dialog using the
+     * provided Call-ID to be cleaned up.
+     * <p>
+     * Typically a SIP Dialog close event will be signalled by that dialog receiving a BYE or 200 OK
+     * message, however, in some cases, the framework will request that the ImsService close the
+     * dialog due to the open dialog holding up an event such as applying a provisioning change or
+     * handing over to another transport type.
+     * @param callId The call-ID header value associated with the ongoing SIP Dialog that the
+     *         framework is requesting be closed.
+     */
+    void closeDialog(@NonNull String callId);
+
+    /**
+     * The remote application has received the SIP message and is processing it.
+     * @param viaTransactionId The Transaction ID found in the via header field of the
+     *                         previously sent {@link SipMessage}.
+     */
+    void notifyMessageReceived(@NonNull String viaTransactionId);
+
+    /**
+     * The remote application has either not received the SIP message or there was an error
+     * processing it.
+     * @param viaTransactionId The Transaction ID found in the via header field of the
+     *                         previously sent {@link SipMessage}.
+     * @param reason The reason why the message was not correctly received.
+     */
+    void notifyMessageReceiveError(@NonNull String viaTransactionId,
+            @SipDelegateManager.MessageFailureReason int reason);
+}
diff --git a/telephony/java/android/telephony/ims/stub/SipTransportImplBase.java b/telephony/java/android/telephony/ims/stub/SipTransportImplBase.java
index b2b2914..b48f631 100644
--- a/telephony/java/android/telephony/ims/stub/SipTransportImplBase.java
+++ b/telephony/java/android/telephony/ims/stub/SipTransportImplBase.java
@@ -18,27 +18,75 @@
 
 import android.annotation.NonNull;
 import android.annotation.SystemApi;
+import android.os.Binder;
+import android.os.IBinder;
+import android.telephony.ims.DelegateMessageCallback;
+import android.telephony.ims.DelegateRequest;
+import android.telephony.ims.DelegateStateCallback;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+import android.telephony.ims.aidl.ISipDelegateStateCallback;
 import android.telephony.ims.aidl.ISipTransport;
+import android.telephony.ims.aidl.SipDelegateAidlWrapper;
+import android.util.Log;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.Executor;
 
 /**
- * Manages the creation and destruction of SipDelegates in order to proxy SIP traffic to other
- * IMS applications in order to support IMS single registration.
+ * The ImsService implements this class to manage the creation and destruction of
+ * {@link SipDelegate}s.
+ *
+ * {@link SipDelegate}s allow the ImsService to forward SIP traffic generated and consumed by IMS
+ * applications as a delegate to the associated carrier's IMS Network in order to support using a
+ * single IMS registration for all MMTEL and RCS signalling traffic.
  * @hide
  */
 @SystemApi
 public class SipTransportImplBase {
+    private static final String LOG_TAG = "SipTransportIB";
+
+    private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
+        @Override
+        public void binderDied() {
+            mBinderExecutor.execute(() -> binderDiedInternal());
+        }
+    };
+
+    private final ISipTransport.Stub mSipTransportImpl = new ISipTransport.Stub() {
+        @Override
+        public void createSipDelegate(DelegateRequest request, ISipDelegateStateCallback dc,
+                ISipDelegateMessageCallback mc) {
+            final long token = Binder.clearCallingIdentity();
+            try {
+                mBinderExecutor.execute(() -> createSipDelegateInternal(request, dc, mc));
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+
+        @Override
+        public void destroySipDelegate(ISipDelegate delegate, int reason) {
+            final long token = Binder.clearCallingIdentity();
+            try {
+                mBinderExecutor.execute(() -> destroySipDelegateInternal(delegate, reason));
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+    };
 
     private final Executor mBinderExecutor;
-    private final ISipTransport mSipTransportImpl = new ISipTransport.Stub() {
-
-    };
+    private final ArrayList<SipDelegateAidlWrapper> mDelegates = new ArrayList<>();
 
     /**
      * Create an implementation of SipTransportImplBase.
      *
-     * @param executor The executor that remote calls from the framework should be called on.
+     * @param executor The executor that remote calls from the framework will be called on. This
+     *                 includes the methods here as well as the methods in {@link SipDelegate}.
      */
     public SipTransportImplBase(@NonNull Executor executor) {
         if (executor == null) {
@@ -49,6 +97,79 @@
     }
 
     /**
+     * Called by the Telephony framework to request the creation of a new {@link SipDelegate}.
+     * <p>
+     * The implementation must call {@link DelegateStateCallback#onCreated(SipDelegate, List)} with
+     * the {@link SipDelegate} that is associated with the {@link DelegateRequest}.
+     * <p>
+     * This method will be called on the Executor specified in
+     * {@link SipTransportImplBase#SipTransportImplBase(Executor)}.
+     *
+     * @param request A SIP delegate request containing the parameters that the remote RCS
+     * application wishes to use.
+     * @param dc A callback back to the remote application to be used to communicate state callbacks
+     *           for the SipDelegate.
+     * @param mc A callback back to the remote application to be used to send SIP messages to the
+     *           remote application and acknowledge the sending of outgoing SIP messages.
+     * @hide
+     */
+    public void createSipDelegate(@NonNull DelegateRequest request,
+            @NonNull DelegateStateCallback dc, @NonNull DelegateMessageCallback mc) {
+        throw new UnsupportedOperationException("destroySipDelegate not implemented!");
+    }
+
+    /**
+     * Destroys the SipDelegate associated with a remote IMS application.
+     * <p>
+     * After the delegate is destroyed, {@link DelegateStateCallback#onDestroyed(int)} must be
+     * called to notify listeners of its destruction to release associated resources.
+     * <p>
+     * This method will be called on the Executor specified in
+     * {@link SipTransportImplBase#SipTransportImplBase(Executor)}.
+     * @param delegate The delegate to be destroyed.
+     * @param reason The reason the remote connection to this {@link SipDelegate} is being
+     *         destroyed.
+     * @hide
+     */
+    public void destroySipDelegate(@NonNull SipDelegate delegate,
+            @SipDelegateManager.SipDelegateDestroyReason int reason) {
+        throw new UnsupportedOperationException("destroySipDelegate not implemented!");
+    }
+
+    private void createSipDelegateInternal(DelegateRequest r, ISipDelegateStateCallback cb,
+            ISipDelegateMessageCallback mc) {
+        SipDelegateAidlWrapper wrapper = new SipDelegateAidlWrapper(mBinderExecutor, cb, mc);
+        mDelegates.add(wrapper);
+        createSipDelegate(r, wrapper, wrapper);
+    }
+
+    private void destroySipDelegateInternal(ISipDelegate d, int reason) {
+        SipDelegateAidlWrapper result = null;
+        for (SipDelegateAidlWrapper w : mDelegates) {
+            if (Objects.equals(d, w.getDelegateBinder())) {
+                result = w;
+                break;
+            }
+        }
+
+        if (result != null) {
+            mDelegates.remove(result);
+            destroySipDelegate(result.getDelegate(), reason);
+        } else {
+            Log.w(LOG_TAG, "destroySipDelegateInternal, could not findSipDelegate corresponding to "
+                    + d);
+        }
+    }
+
+    private void binderDiedInternal() {
+        for (SipDelegateAidlWrapper w : mDelegates) {
+            destroySipDelegate(w.getDelegate(),
+                    SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD);
+        }
+        mDelegates.clear();
+    }
+
+    /**
      * @return The IInterface used by the framework.
      * @hide
      */
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 51aa9cc..0bd4851 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -31,6 +31,7 @@
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.CallForwardingInfo;
+import android.telephony.CarrierBandwidth;
 import android.telephony.CarrierRestrictionRules;
 import android.telephony.CellIdentity;
 import android.telephony.CellInfo;
@@ -2240,4 +2241,10 @@
      * @return true if dual connectivity is enabled else false
      */
     boolean isNrDualConnectivityEnabled(int subId);
+
+    /**
+     * Get carrier bandwidth per primary and secondary carrier
+     * @return CarrierBandwidth with bandwidth of both primary and secondary carrier.
+     */
+    CarrierBandwidth getCarrierBandwidth(int subId);
 }
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt
index db0eed8..a85e92c 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt
@@ -16,6 +16,7 @@
 
 package com.android.server.wm.flicker
 
+import android.platform.helpers.IAppHelper
 import com.android.server.wm.flicker.dsl.EventLogAssertion
 import com.android.server.wm.flicker.dsl.LayersAssertion
 import com.android.server.wm.flicker.dsl.WmAssertion
@@ -24,6 +25,7 @@
 const val NAVIGATION_BAR_WINDOW_TITLE = "NavigationBar"
 const val STATUS_BAR_WINDOW_TITLE = "StatusBar"
 const val DOCKED_STACK_DIVIDER = "DockedStackDivider"
+const val WALLPAPER_TITLE = "Wallpaper"
 
 @JvmOverloads
 fun WmAssertion.statusBarWindowIsAlwaysVisible(
@@ -54,6 +56,39 @@
     }
 }
 
+fun WmAssertion.launcherReplacesAppWindowAsTopWindow(
+    testApp: IAppHelper,
+    bugId: Int = 0,
+    enabled: Boolean = bugId == 0
+) {
+    all("launcherReplacesAppWindowAsTopWindow", bugId, enabled) {
+        this.showsAppWindowOnTop(testApp.getPackage())
+                .then()
+                .showsAppWindowOnTop("Launcher")
+    }
+}
+
+fun WmAssertion.wallpaperWindowBecomesVisible(
+    bugId: Int = 0,
+    enabled: Boolean = bugId == 0
+) {
+    all("wallpaperWindowBecomesVisible", bugId, enabled) {
+        this.hidesBelowAppWindow(WALLPAPER_TITLE)
+                .then()
+                .showsBelowAppWindow(WALLPAPER_TITLE)
+    }
+}
+
+fun WmAssertion.windowAlwaysVisible(
+    packageName: String,
+    bugId: Int = 0,
+    enabled: Boolean = bugId == 0
+) {
+    all("windowAlwaysVisible", bugId, enabled) {
+        this.showsAppWindowOnTop(packageName)
+    }
+}
+
 @JvmOverloads
 fun LayersAssertion.noUncoveredRegions(
     beginRotation: Int,
@@ -177,6 +212,28 @@
     }
 }
 
+fun LayersAssertion.wallpaperLayerReplacesAppLayer(
+    testApp: IAppHelper,
+    bugId: Int = 0,
+    enabled: Boolean = bugId == 0
+) {
+    all("appLayerReplacesWallpaperLayer", bugId, enabled) {
+        this.showsLayer(testApp.getPackage())
+                .then()
+                .replaceVisibleLayer(testApp.getPackage(), WALLPAPER_TITLE)
+    }
+}
+
+fun LayersAssertion.layerAlwaysVisible(
+    packageName: String,
+    bugId: Int = 0,
+    enabled: Boolean = bugId == 0
+) {
+    all("layerAlwaysVisible", bugId, enabled) {
+        this.showsLayer(packageName)
+    }
+}
+
 fun EventLogAssertion.focusChanges(
     vararg windows: String,
     bugId: Int = 0,
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt
index 01853df..a20f96d 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt
@@ -20,8 +20,21 @@
 import androidx.test.filters.RequiresDevice
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.server.wm.flicker.Flicker
+import com.android.server.wm.flicker.endRotation
 import com.android.server.wm.flicker.FlickerTestRunnerFactory
 import com.android.server.wm.flicker.FlickerTestRunner
+import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible
+import com.android.server.wm.flicker.statusBarWindowIsAlwaysVisible
+import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible
+import com.android.server.wm.flicker.statusBarLayerIsAlwaysVisible
+import com.android.server.wm.flicker.launcherReplacesAppWindowAsTopWindow
+import com.android.server.wm.flicker.wallpaperWindowBecomesVisible
+import com.android.server.wm.flicker.wallpaperLayerReplacesAppLayer
+import com.android.server.wm.flicker.noUncoveredRegions
+import com.android.server.wm.flicker.navBarLayerRotatesAndScales
+import com.android.server.wm.flicker.statusBarLayerRotatesScales
+import com.android.server.wm.flicker.visibleWindowsShownMoreThanOneConsecutiveEntry
+import com.android.server.wm.flicker.visibleLayersShownMoreThanOneConsecutiveEntry
 import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
 import com.android.server.wm.flicker.helpers.StandardAppHelper
 import com.android.server.wm.flicker.helpers.buildTestTag
@@ -34,22 +47,6 @@
 import org.junit.runners.MethodSorters
 import org.junit.runners.Parameterized
 
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
 /**
  * Test app closes by pressing back button
  * To run this test: `atest FlickerTests:CloseAppBackButtonTest`
@@ -93,6 +90,32 @@
                                 testApp.exit()
                             }
                         }
+                        assertions {
+                            windowManagerTrace {
+                                navBarWindowIsAlwaysVisible()
+                                statusBarWindowIsAlwaysVisible()
+                                visibleWindowsShownMoreThanOneConsecutiveEntry()
+
+                                launcherReplacesAppWindowAsTopWindow(testApp)
+                                wallpaperWindowBecomesVisible()
+                            }
+
+                            layersTrace {
+                                noUncoveredRegions(configuration.startRotation,
+                                        Surface.ROTATION_0, bugId = 141361128)
+                                navBarLayerRotatesAndScales(configuration.startRotation,
+                                        Surface.ROTATION_0)
+                                statusBarLayerRotatesScales(configuration.startRotation,
+                                        Surface.ROTATION_0)
+                                navBarLayerIsAlwaysVisible(
+                                        enabled = Surface.ROTATION_0 == configuration.endRotation)
+                                statusBarLayerIsAlwaysVisible(
+                                        enabled = Surface.ROTATION_0 == configuration.endRotation)
+                                visibleLayersShownMoreThanOneConsecutiveEntry()
+
+                                wallpaperLayerReplacesAppLayer(testApp)
+                            }
+                        }
                     }
         }
     }
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
new file mode 100644
index 0000000..4bbb38c
--- /dev/null
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm.flicker.close
+
+import android.view.Surface
+import androidx.test.filters.RequiresDevice
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.server.wm.flicker.Flicker
+import com.android.server.wm.flicker.endRotation
+import com.android.server.wm.flicker.FlickerTestRunnerFactory
+import com.android.server.wm.flicker.FlickerTestRunner
+import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible
+import com.android.server.wm.flicker.statusBarWindowIsAlwaysVisible
+import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible
+import com.android.server.wm.flicker.statusBarLayerIsAlwaysVisible
+import com.android.server.wm.flicker.launcherReplacesAppWindowAsTopWindow
+import com.android.server.wm.flicker.wallpaperWindowBecomesVisible
+import com.android.server.wm.flicker.wallpaperLayerReplacesAppLayer
+import com.android.server.wm.flicker.noUncoveredRegions
+import com.android.server.wm.flicker.navBarLayerRotatesAndScales
+import com.android.server.wm.flicker.statusBarLayerRotatesScales
+import com.android.server.wm.flicker.visibleWindowsShownMoreThanOneConsecutiveEntry
+import com.android.server.wm.flicker.visibleLayersShownMoreThanOneConsecutiveEntry
+import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
+import com.android.server.wm.flicker.helpers.StandardAppHelper
+import com.android.server.wm.flicker.helpers.buildTestTag
+import com.android.server.wm.flicker.helpers.setRotation
+import com.android.server.wm.flicker.helpers.waitUntilGone
+import com.android.server.wm.flicker.repetitions
+import com.android.server.wm.flicker.startRotation
+import org.junit.FixMethodOrder
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test app closes by pressing home button.
+ * To run this test: `atest FlickerTests:CloseAppHomeButtonTest`
+ */
+@RequiresDevice
+@RunWith(Parameterized::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+class CloseAppHomeButtonTest(
+    testName: String,
+    flickerSpec: Flicker
+) : FlickerTestRunner(testName, flickerSpec) {
+    companion object {
+        @Parameterized.Parameters(name = "{0}")
+        @JvmStatic
+        fun getParams(): List<Array<Any>> {
+            val instrumentation = InstrumentationRegistry.getInstrumentation()
+            val testApp = StandardAppHelper(instrumentation,
+                    "com.android.server.wm.flicker.testapp", "SimpleApp")
+            return FlickerTestRunnerFactory(instrumentation, repetitions = 10)
+                    .buildTest { configuration ->
+                        withTestName { buildTestTag("closeAppHomeButton", testApp, configuration) }
+                        repeat { configuration.repetitions }
+                        setup {
+                            test {
+                                device.wakeUpAndGoToHomeScreen()
+                            }
+                            eachRun {
+                                this.setRotation(configuration.startRotation)
+                                testApp.open()
+                            }
+                        }
+                        transitions {
+                            device.pressHome()
+                            device.waitUntilGone(testApp.getPackage())
+                        }
+                        teardown {
+                            eachRun {
+                                this.setRotation(Surface.ROTATION_0)
+                            }
+                            test {
+                                testApp.exit()
+                            }
+                        }
+                        assertions {
+                            windowManagerTrace {
+                                navBarWindowIsAlwaysVisible()
+                                statusBarWindowIsAlwaysVisible()
+                                visibleWindowsShownMoreThanOneConsecutiveEntry()
+
+                                launcherReplacesAppWindowAsTopWindow(testApp)
+                                wallpaperWindowBecomesVisible()
+                            }
+
+                            layersTrace {
+                                noUncoveredRegions(configuration.startRotation,
+                                        Surface.ROTATION_0, bugId = 141361128)
+                                navBarLayerRotatesAndScales(configuration.startRotation,
+                                        Surface.ROTATION_0)
+                                statusBarLayerRotatesScales(configuration.startRotation,
+                                        Surface.ROTATION_0)
+                                navBarLayerIsAlwaysVisible(
+                                        enabled = Surface.ROTATION_0 == configuration.endRotation)
+                                statusBarLayerIsAlwaysVisible(
+                                        enabled = Surface.ROTATION_0 == configuration.endRotation)
+                                visibleLayersShownMoreThanOneConsecutiveEntry()
+
+                                wallpaperLayerReplacesAppLayer(testApp)
+                            }
+                        }
+                    }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt
new file mode 100644
index 0000000..7b5dc872
--- /dev/null
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm.flicker.ime
+
+import android.view.Surface
+import androidx.test.filters.RequiresDevice
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.server.wm.flicker.Flicker
+import com.android.server.wm.flicker.FlickerTestRunner
+import com.android.server.wm.flicker.FlickerTestRunnerFactory
+import com.android.server.wm.flicker.helpers.buildTestTag
+import com.android.server.wm.flicker.helpers.ImeAppAutoFocusHelper
+import com.android.server.wm.flicker.helpers.reopenAppFromOverview
+import com.android.server.wm.flicker.helpers.hasWindow
+import com.android.server.wm.flicker.helpers.setRotation
+import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
+import com.android.server.wm.flicker.repetitions
+import com.android.server.wm.flicker.startRotation
+import org.junit.FixMethodOrder
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test IME window opening transitions.
+ * To run this test: `atest FlickerTests:ReOpenImeWindowTest`
+ */
+@RequiresDevice
+@RunWith(Parameterized::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+class ReOpenImeWindowTest(
+    testName: String,
+    flickerSpec: Flicker
+) : FlickerTestRunner(testName, flickerSpec) {
+    companion object {
+        @Parameterized.Parameters(name = "{0}")
+        @JvmStatic
+        fun getParams(): List<Array<Any>> {
+            val instrumentation = InstrumentationRegistry.getInstrumentation()
+            val testApp = ImeAppAutoFocusHelper(instrumentation)
+
+            return FlickerTestRunnerFactory(instrumentation, repetitions = 10)
+                    .buildTest { configuration ->
+                        withTestName { buildTestTag("reOpenImeAutoFocus", testApp, configuration) }
+                        repeat { configuration.repetitions }
+                        setup {
+                            test {
+                                device.wakeUpAndGoToHomeScreen()
+                            }
+                            eachRun {
+                                testApp.open()
+                                testApp.openIME(device)
+                                device.pressHome()
+                                device.pressRecentApps()
+                                this.setRotation(configuration.startRotation)
+                            }
+                        }
+                        transitions {
+                            device.reopenAppFromOverview()
+                            device.hasWindow(testApp.getPackage())
+                        }
+                        teardown {
+                            eachRun {
+                                testApp.closeIME(device)
+                                testApp.exit()
+                            }
+                            test {
+                                this.setRotation(Surface.ROTATION_0)
+                            }
+                        }
+                    }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
index d100383..a1a7102 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
@@ -30,6 +30,8 @@
 import com.android.server.wm.flicker.FlickerTestRunnerFactory
 import com.android.server.wm.flicker.endRotation
 import com.android.server.wm.flicker.focusDoesNotChange
+import com.android.server.wm.flicker.windowAlwaysVisible
+import com.android.server.wm.flicker.layerAlwaysVisible
 import com.android.server.wm.flicker.helpers.WindowUtils
 import com.android.server.wm.flicker.helpers.buildTestTag
 import com.android.server.wm.flicker.helpers.setRotation
@@ -39,6 +41,8 @@
 import com.android.server.wm.flicker.navBarLayerRotatesAndScales
 import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible
 import com.android.server.wm.flicker.noUncoveredRegions
+import com.android.server.wm.flicker.visibleWindowsShownMoreThanOneConsecutiveEntry
+import com.android.server.wm.flicker.visibleLayersShownMoreThanOneConsecutiveEntry
 import com.android.server.wm.flicker.repetitions
 import com.android.server.wm.flicker.startRotation
 import com.android.server.wm.flicker.statusBarLayerIsAlwaysVisible
@@ -141,6 +145,8 @@
                     windowManagerTrace {
                         navBarWindowIsAlwaysVisible(bugId = 140855415)
                         statusBarWindowIsAlwaysVisible(bugId = 140855415)
+                        visibleWindowsShownMoreThanOneConsecutiveEntry()
+                        windowAlwaysVisible(configuration.intentPackageName)
                     }
 
                     layersTrace {
@@ -152,6 +158,9 @@
                             configuration.endRotation)
                         statusBarLayerRotatesScales(configuration.startRotation,
                             configuration.endRotation, enabled = false)
+                        visibleLayersShownMoreThanOneConsecutiveEntry(
+                                enabled = configuration.startRotation == configuration.endRotation)
+                        layerAlwaysVisible(configuration.intentPackageName)
                     }
 
                     layersTrace {
diff --git a/tests/TaskOrganizerTest/Android.bp b/tests/TaskOrganizerTest/Android.bp
index 8a13dbc..91900626 100644
--- a/tests/TaskOrganizerTest/Android.bp
+++ b/tests/TaskOrganizerTest/Android.bp
@@ -16,7 +16,20 @@
 
 android_test {
     name: "TaskOrganizerTest",
-    srcs: ["**/*.java"],
+    srcs: ["**/*.java","**/*.kt"],
+    manifest: "AndroidManifest.xml",
+    test_config: "AndroidTest.xml",
     platform_apis: true,
     certificate: "platform",
-}
+
+    static_libs: [
+        "androidx.appcompat_appcompat",
+        "androidx.test.rules",
+        "androidx.test.runner",
+        "androidx.test.ext.junit",
+        "kotlin-stdlib",
+        "kotlinx-coroutines-android",
+        "flickerlib",
+        "truth-prebuilt",
+    ],
+}
\ No newline at end of file
diff --git a/tests/TaskOrganizerTest/AndroidManifest.xml b/tests/TaskOrganizerTest/AndroidManifest.xml
index 451a55f..1f1bd3e 100644
--- a/tests/TaskOrganizerTest/AndroidManifest.xml
+++ b/tests/TaskOrganizerTest/AndroidManifest.xml
@@ -16,17 +16,41 @@
     <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
     <uses-permission android:name="android.permission.MANAGE_ACTIVITY_TASKS"/>
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
+    <!-- Enable / Disable tracing !-->
+    <uses-permission android:name="android.permission.DUMP" />
     <application>
-      <service android:name=".TaskOrganizerPipTest"
-           android:exported="true">
-      </service>
       <activity android:name="TaskOrganizerMultiWindowTest"
            android:label="TaskOrganizer MW Test"
-           android:exported="true">
+           android:exported="true"
+           android:excludeFromRecents="true">
         <intent-filter>
           <action android:name="android.intent.action.MAIN"/>
           <category android:name="android.intent.category.LAUNCHER"/>
         </intent-filter>
       </activity>
+        <activity android:name="TaskOrganizerMultiWindowTest$TestActivity1"
+                  android:label="Test Activity 1"
+                  android:exported="false"
+                  android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"
+                  android:taskAffinity="com.android.test.taskembed.task1"
+                  android:excludeFromRecents="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+            </intent-filter>
+        </activity>
+        <activity android:name="TaskOrganizerMultiWindowTest$TestActivity2"
+                  android:label="Test Activity 2"
+                  android:exported="false"
+                  android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"
+                  android:taskAffinity="com.android.test.taskembed.task2"
+                  android:excludeFromRecents="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+            </intent-filter>
+        </activity>
     </application>
+    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="com.android.test.taskembed"
+                     android:label="TaskOrganizerTest">
+    </instrumentation>
 </manifest>
diff --git a/tests/TaskOrganizerTest/AndroidTest.xml b/tests/TaskOrganizerTest/AndroidTest.xml
new file mode 100644
index 0000000..45fd8b0
--- /dev/null
+++ b/tests/TaskOrganizerTest/AndroidTest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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 TaskOrganizer Test">
+    <option name="test-tag" value="TaskOrganizerTest" />
+    <target_preparer class="com.android.tradefed.targetprep.DeviceSetup">
+        <!-- keeps the screen on during tests -->
+        <option name="screen-always-on" value="on" />
+        <!-- prevents the phone from restarting -->
+        <option name="force-skip-system-props" value="true" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="false"/>
+        <option name="test-file-name" value="TaskOrganizerTest.apk"/>
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest">
+        <option name="package" value="com.android.test.taskembed"/>
+        <option name="exclude-annotation" value="androidx.test.filters.FlakyTest" />
+        <option name="shell-timeout" value="6600s" />
+        <option name="test-timeout" value="6000s" />
+        <option name="hidden-api-checks" value="false" />
+    </test>
+</configuration>
diff --git a/tests/TaskOrganizerTest/src/com/android/test/taskembed/ResizeTasksSyncTest.kt b/tests/TaskOrganizerTest/src/com/android/test/taskembed/ResizeTasksSyncTest.kt
new file mode 100644
index 0000000..abccd6cf
--- /dev/null
+++ b/tests/TaskOrganizerTest/src/com/android/test/taskembed/ResizeTasksSyncTest.kt
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.test.taskembed
+
+import android.app.Instrumentation
+import android.graphics.Rect
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.runner.AndroidJUnit4
+import com.android.server.wm.flicker.monitor.LayersTraceMonitor
+import com.android.server.wm.flicker.monitor.withSFTracing
+import com.android.server.wm.flicker.traces.layers.LayersTraceSubject.Companion.assertThat
+import org.junit.After
+import org.junit.Before
+import org.junit.FixMethodOrder
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import java.util.concurrent.CountDownLatch
+import org.junit.Assert.assertNotEquals
+
+@RunWith(AndroidJUnit4::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+class ResizeTasksSyncTest {
+    @get:Rule
+    var scenarioRule: ActivityScenarioRule<TaskOrganizerMultiWindowTest> =
+            ActivityScenarioRule<TaskOrganizerMultiWindowTest>(
+                    TaskOrganizerMultiWindowTest::class.java)
+
+    protected val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
+
+    @Before
+    fun setup() {
+        val tmpDir = instrumentation.targetContext.dataDir.toPath()
+        LayersTraceMonitor(tmpDir).stop()
+        val firstTaskBounds = Rect(0, 0, 1080, 1000)
+        val secondTaskBounds = Rect(0, 1000, 1080, 2000)
+
+        lateinit var surfaceReadyLatch: CountDownLatch
+        scenarioRule.getScenario().onActivity {
+            surfaceReadyLatch = it.openTaskView(firstTaskBounds, secondTaskBounds)
+        }
+        surfaceReadyLatch.await()
+    }
+
+    @After
+    fun teardown() {
+        scenarioRule.getScenario().close()
+    }
+
+    @Test
+    fun testResizeTwoTaskSync() {
+        val firstBounds = Rect(0, 0, 1080, 800)
+        val secondBounds = Rect(0, 1000, 1080, 1800)
+
+        val trace = withSFTracing(instrumentation, TRACE_FLAGS) {
+            lateinit var resizeReadyLatch: CountDownLatch
+            scenarioRule.getScenario().onActivity {
+                resizeReadyLatch = it.resizeTaskView(firstBounds, secondBounds)
+            }
+            resizeReadyLatch.await()
+        }
+
+        // find the frame which match resized buffer size.
+        var frame: Long = -1
+        loop@ for (trace in trace.entries) {
+            for (layer in trace.flattenedLayers) {
+                if (layer.proto.activeBuffer != null &&
+                        layer.proto.activeBuffer.width == firstBounds.width() &&
+                        layer.proto.activeBuffer.height == firstBounds.height()) {
+                    frame = layer.proto.currFrame
+                    break@loop
+                }
+            }
+        }
+        assertNotEquals(-1, frame)
+        // layer bounds should be related to parent surfaceview.
+        secondBounds.offsetTo(0, 0)
+
+        // verify buffer size should be changed to expected values.
+        assertThat(trace).layer(FIRST_ACTIVITY, frame).also {
+            it.hasLayerSize(firstBounds)
+            it.hasBufferSize(firstBounds)
+        }
+
+        assertThat(trace).layer(SECOND_ACTIVITY, frame).also {
+            it.hasLayerSize(secondBounds)
+            it.hasBufferSize(secondBounds)
+        }
+    }
+
+    companion object {
+        private const val TRACE_FLAGS = 0x1 // TRACE_CRITICAL
+        private const val FIRST_ACTIVITY = "Activity1"
+        private const val SECOND_ACTIVITY = "Activity2"
+    }
+}
\ No newline at end of file
diff --git a/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerMultiWindowTest.java b/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerMultiWindowTest.java
index ca723b8..0cf5a41 100644
--- a/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerMultiWindowTest.java
+++ b/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerMultiWindowTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2020 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,189 +16,182 @@
 
 package com.android.test.taskembed;
 
-import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
 
 import android.app.Activity;
 import android.app.ActivityManager;
-import android.app.ActivityOptions;
 import android.content.Context;
 import android.content.Intent;
+import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Rect;
 import android.os.Bundle;
 import android.view.Gravity;
-import android.view.MotionEvent;
 import android.view.SurfaceControl;
-import android.view.SurfaceHolder;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.LinearLayout;
+import android.widget.FrameLayout;
+import android.widget.TextView;
 import android.window.TaskOrganizer;
-import android.window.WindowContainerTransaction;
 import android.window.WindowContainerTransactionCallback;
 
+import java.util.concurrent.CountDownLatch;
+
 public class TaskOrganizerMultiWindowTest extends Activity {
-    static class SplitLayout extends LinearLayout implements View.OnTouchListener {
-        View mView1;
-        View mView2;
-        View mDividerView;
-
-        public boolean onTouch(View v, MotionEvent e) {
-            if (e.getAction() != MotionEvent.ACTION_UP) {
-                return true;
-            }
-
-            float x = e.getRawX(0);
-            float ratio = (float) x / (float) getWidth() ;
-            ratio = 1-ratio;
-
-            LinearLayout.LayoutParams lp1 =
-                new LinearLayout.LayoutParams(0,
-                        ViewGroup.LayoutParams.WRAP_CONTENT, ratio-0.02f);
-            LinearLayout.LayoutParams lp2 =
-                new LinearLayout.LayoutParams(0,
-                        ViewGroup.LayoutParams.WRAP_CONTENT, 1-ratio-0.02f);
-            updateViewLayout(mView1, lp2);
-            updateViewLayout(mView2, lp1);
-            return true;
-        }
-
-        SplitLayout(Context c, View v1, View v2) {
-            super(c);
-            LinearLayout.LayoutParams lp1 =
-                new LinearLayout.LayoutParams(0,
-                        ViewGroup.LayoutParams.WRAP_CONTENT, 0.48f);
-            LinearLayout.LayoutParams lp3 =
-                new LinearLayout.LayoutParams(0,
-                        ViewGroup.LayoutParams.WRAP_CONTENT, 0.48f);
-            LinearLayout.LayoutParams lp2 =
-                new LinearLayout.LayoutParams(0,
-                        ViewGroup.LayoutParams.FILL_PARENT, 0.04f);
-            lp2.gravity = Gravity.CENTER;
-
-            setWeightSum(1);
-
-            mView1 = v1;
-            mView2 = v2;
-            addView(mView1, lp1);
-
-            mDividerView = new View(getContext());
-            mDividerView.setBackgroundColor(Color.BLACK);
-            addView(mDividerView, lp2);
-            mDividerView.setOnTouchListener(this);
-
-            addView(mView2, lp3);
-        }
-    }
-
-    class ResizingTaskView extends TaskView {
-        final Intent mIntent;
-        boolean launched = false;
-        ResizingTaskView(Context c, Intent i) {
-            super(c);
-            mIntent = i;
-        }
-
-        @Override
-        public void surfaceChanged(SurfaceHolder h, int format, int width, int height) {
-            if (!launched) {
-                launchOrganizedActivity(mIntent, width, height);
-                launched = true;
-            } else {
-                resizeTask(width, height);
-            }
-        }
-
-        void resizeTask(int width, int height) {
-            final WindowContainerTransaction wct = new WindowContainerTransaction();
-            wct.setBounds(mWc, new Rect(0, 0, width, height));
-            try {
-                mOrganizer.applySyncTransaction(wct, mOrganizer.mTransactionCallback);
-            } catch (Exception e) {
-                // Oh well
-            }
-        }
-    }
-
-    private TaskView mTaskView1;
-    private TaskView mTaskView2;
-    private boolean mGotFirstTask = false;
+    private CountDownLatch mTasksReadyLatch;
+    private CountDownLatch mTasksResizeLatch;
 
     class Organizer extends TaskOrganizer {
-        private int receivedTransactions = 0;
-        SurfaceControl.Transaction mergedTransaction = new SurfaceControl.Transaction();
+        private int mReceivedTransactions = 0;
+        private SurfaceControl.Transaction mMergedTransaction = new SurfaceControl.Transaction();
         WindowContainerTransactionCallback mTransactionCallback =
                 new WindowContainerTransactionCallback() {
             @Override
             public void onTransactionReady(int id, SurfaceControl.Transaction t) {
-                mergedTransaction.merge(t);
-                receivedTransactions++;
-                if (receivedTransactions == 2) {
-                    mergedTransaction.apply();
-                    receivedTransactions = 0;
+                mMergedTransaction.merge(t);
+                mReceivedTransactions++;
+                if (mReceivedTransactions == 2) {
+                    mReceivedTransactions = 0;
+                    mMergedTransaction.apply(true);
+                    if (mTasksResizeLatch != null) {
+                        mTasksResizeLatch.countDown();
+                    }
                 }
             }
         };
 
         @Override
         public void onTaskAppeared(ActivityManager.RunningTaskInfo ti, SurfaceControl leash) {
-            if (!mGotFirstTask) {
-                mTaskView1.reparentTask(ti.token, leash);
-                mGotFirstTask = true;
-            } else {
-                mTaskView2.reparentTask(ti.token, leash);
+            if (ti.baseActivity == null) {
+                return;
             }
+
+            final String clsName = ti.baseActivity.getClassName();
+            if (clsName.contentEquals(TestActivity1.class.getName())) {
+                mTaskView1.reparentTask(ti.token, leash);
+                mOrganizer.setInterceptBackPressedOnTaskRoot(ti.token, true);
+                mTasksReadyLatch.countDown();
+            } else if (clsName.contentEquals(TestActivity2.class.getName())) {
+                mTaskView2.reparentTask(ti.token, leash);
+                mOrganizer.setInterceptBackPressedOnTaskRoot(ti.token, true);
+                mTasksReadyLatch.countDown();
+            }
+        }
+
+        @Override
+        public void onBackPressedOnTaskRoot(ActivityManager.RunningTaskInfo taskInfo) {
+            getMainThreadHandler().post(() -> {
+                finish();
+            });
         }
     }
 
     private Organizer mOrganizer = new Organizer();
-
+    private FrameLayout mTasksLayout;
+    private TaskView mTaskView1;
+    private TaskView mTaskView2;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        getWindow().getAttributes().layoutInDisplayCutoutMode =
+                LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
+
+        mTasksLayout = new FrameLayout(this);
+        setContentView(mTasksLayout);
 
         mOrganizer.registerOrganizer();
-
-        mTaskView1 = new ResizingTaskView(this, makeSettingsIntent());
-        mTaskView2 = new ResizingTaskView(this, makeContactsIntent());
-        View splitView = new SplitLayout(this, mTaskView1, mTaskView2);
-
-        setContentView(splitView);
     }
 
     @Override
     protected void onDestroy() {
         super.onDestroy();
         mOrganizer.unregisterOrganizer();
+        mTasksLayout.removeAllViews();
     }
 
-    private void addFlags(Intent intent) {
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
-    }
-
-    private Intent makeSettingsIntent() {
-        Intent intent = new Intent();
-        intent.setAction(android.provider.Settings.ACTION_SETTINGS);
-        addFlags(intent);
+    private Intent makeActivityIntent(final Class<?> clazz) {
+        Intent intent = new Intent(this, clazz);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION
+                | Intent.FLAG_ACTIVITY_CLEAR_TASK);
         return intent;
     }
 
-    private Intent makeContactsIntent() {
-        Intent intent = new Intent();
-        intent.setAction(Intent.ACTION_MAIN);
-        intent.addCategory(Intent.CATEGORY_APP_CONTACTS);
-        addFlags(intent);
-        return intent;
+    public CountDownLatch openTaskView(Rect firstBounds, Rect secondBounds) {
+        mTasksReadyLatch = new CountDownLatch(2);
+        mTaskView1 = new TaskView(this, mOrganizer, makeActivityIntent(TestActivity1.class));
+        mTaskView1.setBackgroundColor(Color.DKGRAY);
+
+        FrameLayout.LayoutParams viewLayout1 =
+                new FrameLayout.LayoutParams(firstBounds.width(), firstBounds.height(),
+                        Gravity.TOP | Gravity.LEFT);
+        viewLayout1.setMargins(firstBounds.left, firstBounds.top, 0, 0);
+        mTasksLayout.addView(mTaskView1, viewLayout1);
+
+        mTaskView2 = new TaskView(this, mOrganizer, makeActivityIntent(TestActivity2.class));
+        mTaskView2.setBackgroundColor(Color.LTGRAY);
+        FrameLayout.LayoutParams viewLayout2 =
+                new FrameLayout.LayoutParams(secondBounds.width(), secondBounds.height(),
+                        Gravity.TOP | Gravity.LEFT);
+        viewLayout2.setMargins(secondBounds.left, secondBounds.top, 0, 0);
+        mTasksLayout.addView(mTaskView2, viewLayout2);
+        return mTasksReadyLatch;
     }
 
-    private Bundle makeLaunchOptions(int width, int height) {
-        ActivityOptions o = ActivityOptions.makeBasic();
-        o.setLaunchWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
-        o.setLaunchBounds(new Rect(0, 0, width, height));
-        return o.toBundle();
+    public CountDownLatch resizeTaskView(Rect firstBounds, Rect secondBounds) {
+        mTasksResizeLatch = new CountDownLatch(1);
+
+        mTaskView1.resizeTask(firstBounds.width(), firstBounds.height());
+        mTaskView2.resizeTask(secondBounds.width(), secondBounds.height());
+
+        return mTasksResizeLatch;
     }
 
-    private void launchOrganizedActivity(Intent i, int width, int height) {
-        startActivity(i, makeLaunchOptions(width, height));
+    static class InstrumentedTextView extends TextView {
+        private final boolean mSlowDraw;
+        InstrumentedTextView(Context context, boolean slowDraw) {
+            super(context);
+            mSlowDraw = slowDraw;
+        }
+
+        @Override
+        protected void onDraw(Canvas canvas) {
+            super.onDraw(canvas);
+            if (mSlowDraw) {
+                try {
+                    Thread.sleep(20);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    public static class TestActivity1 extends Activity {
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            getWindow().getAttributes().layoutInDisplayCutoutMode =
+                    LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
+
+            TextView v = new InstrumentedTextView(this, true);
+            v.setText("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
+                    + "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
+            v.setBackgroundColor(Color.RED);
+            v.setTextColor(Color.BLACK);
+            setContentView(v);
+        }
+    }
+
+    public static class TestActivity2 extends Activity {
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            getWindow().getAttributes().layoutInDisplayCutoutMode =
+                    LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
+            TextView v = new InstrumentedTextView(this, false);
+            v.setText("ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
+                    + "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ");
+            v.setBackgroundColor(Color.GREEN);
+            v.setTextColor(Color.BLACK);
+            setContentView(v);
+        }
     }
 }
diff --git a/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerPipTest.java b/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerPipTest.java
deleted file mode 100644
index 5ec9493..0000000
--- a/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerPipTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.test.taskembed;
-
-import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
-
-import android.app.ActivityManager;
-import android.app.Service;
-import android.content.Intent;
-import android.graphics.Rect;
-import android.os.IBinder;
-import android.view.SurfaceControl;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.widget.FrameLayout;
-import android.window.TaskOrganizer;
-import android.window.WindowContainerTransaction;
-
-public class TaskOrganizerPipTest extends Service {
-    private static final int PIP_WIDTH  = 640;
-    private static final int PIP_HEIGHT = 360;
-
-    private TaskView mTaskView;
-
-    class Organizer extends TaskOrganizer {
-        public void onTaskAppeared(ActivityManager.RunningTaskInfo ti, SurfaceControl leash) {
-            mTaskView.reparentTask(ti.token, leash);
-
-            final WindowContainerTransaction wct = new WindowContainerTransaction();
-            wct.scheduleFinishEnterPip(ti.token, new Rect(0, 0, PIP_WIDTH, PIP_HEIGHT));
-            applyTransaction(wct);
-        }
-    }
-
-    private Organizer mOrganizer = new Organizer();
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return null;
-    }
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-
-        mOrganizer.registerOrganizer();
-
-        final WindowManager.LayoutParams wlp = new WindowManager.LayoutParams();
-        wlp.setTitle("TaskOrganizerPipTest");
-        wlp.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
-        wlp.width = wlp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
-
-        FrameLayout layout = new FrameLayout(this);
-        ViewGroup.LayoutParams lp =
-            new ViewGroup.LayoutParams(PIP_WIDTH, PIP_HEIGHT);
-        mTaskView = new TaskView(this);
-        layout.addView(mTaskView, lp);
-
-        WindowManager wm = getSystemService(WindowManager.class);
-        wm.addView(layout, wlp);
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        mOrganizer.unregisterOrganizer();
-    }
-}
diff --git a/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskView.java b/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskView.java
index 208018c..4ef91c7 100644
--- a/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskView.java
+++ b/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskView.java
@@ -16,65 +16,113 @@
 
 package com.android.test.taskembed;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
+
+import android.app.ActivityOptions;
 import android.content.Context;
+import android.content.Intent;
+import android.graphics.Rect;
+import android.os.Bundle;
 import android.view.SurfaceControl;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
 import android.window.WindowContainerToken;
+import android.window.WindowContainerTransaction;
 
 /**
  * Simple SurfaceView wrapper which registers a TaskOrganizer
  * after it's Surface is ready.
  */
-class TaskView extends SurfaceView implements SurfaceHolder.Callback {
-    WindowContainerToken mWc;
+class TaskView extends SurfaceView {
+    private WindowContainerToken mWc;
+    private Context mContext;
     private SurfaceControl mLeash;
+    private TaskOrganizerMultiWindowTest.Organizer mOrganizer;
+    private Intent mIntent;
+    private boolean mLaunched = false;
 
-    private boolean mSurfaceCreated = false;
-    private boolean mNeedsReparent;
-
-    TaskView(Context c) {
+    TaskView(Context c, TaskOrganizerMultiWindowTest.Organizer organizer,
+            Intent intent) {
         super(c);
-        getHolder().addCallback(this);
+        mContext = c;
+        mOrganizer = organizer;
+        mIntent = intent;
+        getHolder().addCallback(
+                new SurfaceHolder.Callback() {
+                    @Override
+                    public void surfaceCreated(SurfaceHolder holder) {}
+
+                    @Override
+                    public void surfaceChanged(SurfaceHolder holder,
+                            int format, int width, int height) {
+                        if (!mLaunched) {
+                            launchOrganizedActivity(mIntent, width, height);
+                            mLaunched = true;
+                        } else {
+                            resizeTask(width, height);
+                        }
+                    }
+
+                    @Override
+                    public void surfaceDestroyed(SurfaceHolder holder) {}
+                }
+        );
         setZOrderOnTop(true);
     }
 
-    @Override
-    public void surfaceCreated(SurfaceHolder holder) {
-        mSurfaceCreated = true;
-        if (mNeedsReparent) {
-            mNeedsReparent = false;
-            reparentLeash();
+    private void launchOrganizedActivity(Intent i, int width, int height) {
+        mContext.startActivity(i, makeLaunchOptions(width, height));
+    }
+
+    private Bundle makeLaunchOptions(int width, int height) {
+        ActivityOptions o = ActivityOptions.makeBasic();
+        o.setLaunchWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+        o.setLaunchBounds(new Rect(0, 0, width, height));
+        o.setTaskOverlay(true, true);
+        o.setTaskAlwaysOnTop(true);
+        return o.toBundle();
+    }
+
+    void resizeTask(int width, int height) {
+        final WindowContainerTransaction wct = new WindowContainerTransaction();
+        wct.setBounds(mWc, new Rect(0, 0, width, height)).setHidden(mWc, false);
+        try {
+            mOrganizer.applySyncTransaction(wct, mOrganizer.mTransactionCallback);
+        } catch (Exception e) {
+            // Oh well
         }
     }
 
-    @Override
-    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
-    }
-
-    @Override
-    public void surfaceDestroyed(SurfaceHolder holder) {
+    void hideTask() {
+        if (mWc == null) {
+            return;
+        }
+        final WindowContainerTransaction wct = new WindowContainerTransaction();
+        wct.setWindowingMode(mWc, WINDOWING_MODE_UNDEFINED).setHidden(mWc, true);
+        try {
+            mOrganizer.applySyncTransaction(wct, mOrganizer.mTransactionCallback);
+        } catch (Exception e) {
+            // Oh well
+        }
+        releaseLeash();
     }
 
     void reparentTask(WindowContainerToken wc, SurfaceControl leash) {
         mWc = wc;
         mLeash = leash;
-        if (!mSurfaceCreated) {
-            mNeedsReparent = true;
-        } else {
-            reparentLeash();
-        }
+        reparentLeash();
     }
 
-    private void reparentLeash() {
+    void reparentLeash() {
         SurfaceControl.Transaction t = new SurfaceControl.Transaction();
-        if (mLeash == null) {
-            return;
-        }
-
         t.reparent(mLeash, getSurfaceControl())
-            .setPosition(mLeash, 0, 0)
             .show(mLeash)
             .apply();
     }
+
+    void releaseLeash() {
+        SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+        t.remove(mLeash).apply();
+    }
 }
diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
index 7abe189..cd9406c 100644
--- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
+++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
@@ -35,7 +35,6 @@
 import static android.net.NetworkStats.SET_ALL;
 import static android.net.NetworkStats.SET_DEFAULT;
 import static android.net.NetworkStats.SET_FOREGROUND;
-import static android.net.NetworkStats.STATS_PER_IFACE;
 import static android.net.NetworkStats.STATS_PER_UID;
 import static android.net.NetworkStats.TAG_ALL;
 import static android.net.NetworkStats.TAG_NONE;
@@ -994,7 +993,7 @@
     public void testTethering() throws Exception {
         // pretend first mobile network comes online
         expectDefaultSettings();
-        NetworkState[] states = new NetworkState[] {buildMobile3gState(IMSI_1)};
+        final NetworkState[] states = new NetworkState[]{buildMobile3gState(IMSI_1)};
         expectNetworkStatsSummary(buildEmptyStats());
         expectNetworkStatsUidDetail(buildEmptyStats());
 
@@ -1004,23 +1003,39 @@
         incrementCurrentTime(HOUR_IN_MILLIS);
         expectDefaultSettings();
 
+        // Register custom provider and retrieve callback.
+        final TestableNetworkStatsProviderBinder provider =
+                new TestableNetworkStatsProviderBinder();
+        final INetworkStatsProviderCallback cb =
+                mService.registerNetworkStatsProvider("TEST-TETHERING-OFFLOAD", provider);
+        assertNotNull(cb);
+        final long now = getElapsedRealtime();
+
         // Traffic seen by kernel counters (includes software tethering).
-        final NetworkStats ifaceStats = new NetworkStats(getElapsedRealtime(), 1)
+        final NetworkStats swIfaceStats = new NetworkStats(now, 1)
                 .insertEntry(TEST_IFACE, 1536L, 12L, 384L, 3L);
         // Hardware tethering traffic, not seen by kernel counters.
-        final NetworkStats tetherStatsHardware = new NetworkStats(getElapsedRealtime(), 1)
-                .insertEntry(TEST_IFACE, 512L, 4L, 128L, 1L);
+        final NetworkStats tetherHwIfaceStats = new NetworkStats(now, 1)
+                .insertEntry(new NetworkStats.Entry(TEST_IFACE, UID_ALL, SET_DEFAULT,
+                        TAG_NONE, METERED_YES, ROAMING_NO, DEFAULT_NETWORK_YES,
+                        512L, 4L, 128L, 1L, 0L));
+        final NetworkStats tetherHwUidStats = new NetworkStats(now, 1)
+                .insertEntry(new NetworkStats.Entry(TEST_IFACE, UID_TETHERING, SET_DEFAULT,
+                        TAG_NONE, METERED_YES, ROAMING_NO, DEFAULT_NETWORK_YES,
+                        512L, 4L, 128L, 1L, 0L));
+        cb.notifyStatsUpdated(0 /* unused */, tetherHwIfaceStats, tetherHwUidStats);
 
-        // Traffic for UID_RED.
-        final NetworkStats uidStats = new NetworkStats(getElapsedRealtime(), 1)
+        // Fake some traffic done by apps on the device (as opposed to tethering), and record it
+        // into UID stats (as opposed to iface stats).
+        final NetworkStats localUidStats = new NetworkStats(now, 1)
                 .insertEntry(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L);
-        // All tethering traffic, both hardware and software.
-        final NetworkStats tetherStats = new NetworkStats(getElapsedRealtime(), 1)
-                .insertEntry(TEST_IFACE, UID_TETHERING, SET_DEFAULT, TAG_NONE, 1920L, 14L, 384L, 2L,
+        // Software per-uid tethering traffic.
+        final NetworkStats tetherSwUidStats = new NetworkStats(now, 1)
+                .insertEntry(TEST_IFACE, UID_TETHERING, SET_DEFAULT, TAG_NONE, 1408L, 10L, 256L, 1L,
                         0L);
 
-        expectNetworkStatsSummary(ifaceStats, tetherStatsHardware);
-        expectNetworkStatsUidDetail(uidStats, tetherStats);
+        expectNetworkStatsSummary(swIfaceStats);
+        expectNetworkStatsUidDetail(localUidStats, tetherSwUidStats);
         forcePollAndWaitForIdle();
 
         // verify service recorded history
@@ -1362,12 +1377,6 @@
     }
 
     private void expectNetworkStatsSummary(NetworkStats summary) throws Exception {
-        expectNetworkStatsSummary(summary, new NetworkStats(0L, 0));
-    }
-
-    private void expectNetworkStatsSummary(NetworkStats summary, NetworkStats tetherStats)
-            throws Exception {
-        expectNetworkStatsTethering(STATS_PER_IFACE, tetherStats);
         expectNetworkStatsSummaryDev(summary.clone());
         expectNetworkStatsSummaryXt(summary.clone());
     }
@@ -1380,11 +1389,6 @@
         when(mStatsFactory.readNetworkStatsSummaryXt()).thenReturn(summary);
     }
 
-    private void expectNetworkStatsTethering(int how, NetworkStats stats)
-            throws Exception {
-        when(mNetManager.getNetworkStatsTethering(how)).thenReturn(stats);
-    }
-
     private void expectNetworkStatsUidDetail(NetworkStats detail) throws Exception {
         expectNetworkStatsUidDetail(detail, new NetworkStats(0L, 0));
     }
diff --git a/tools/aapt2/DominatorTree_test.cpp b/tools/aapt2/DominatorTree_test.cpp
index 3e49034..52949da 100644
--- a/tools/aapt2/DominatorTree_test.cpp
+++ b/tools/aapt2/DominatorTree_test.cpp
@@ -198,5 +198,33 @@
   EXPECT_EQ(expected, printer.ToString(&tree));
 }
 
+TEST(DominatorTreeTest, MccMncIsPeertoLocale) {
+  const ConfigDescription default_config = {};
+  const ConfigDescription de_config = test::ParseConfigOrDie("de");
+  const ConfigDescription fr_config = test::ParseConfigOrDie("fr");
+  const ConfigDescription mcc_config = test::ParseConfigOrDie("mcc262");
+  const ConfigDescription mcc_fr_config = test::ParseConfigOrDie("mcc262-fr");
+  const ConfigDescription mnc_config = test::ParseConfigOrDie("mnc2");
+  const ConfigDescription mnc_fr_config = test::ParseConfigOrDie("mnc2-fr");
+  std::vector<std::unique_ptr<ResourceConfigValue>> configs;
+  configs.push_back(util::make_unique<ResourceConfigValue>(default_config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(de_config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(fr_config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(mcc_config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(mcc_fr_config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(mnc_config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(mnc_fr_config, ""));
+  DominatorTree tree(configs);
+  PrettyPrinter printer;
+  std::string expected =
+      "<default>\n"
+      "de\n"
+      "fr\n"
+      "mcc262\n"
+      "mcc262-fr\n"
+      "mnc2\n"
+      "mnc2-fr\n";
+  EXPECT_EQ(expected, printer.ToString(&tree));
+}
 
 }  // namespace aapt
diff --git a/tools/aapt2/optimize/ResourceDeduper_test.cpp b/tools/aapt2/optimize/ResourceDeduper_test.cpp
index 048e318..888de40 100644
--- a/tools/aapt2/optimize/ResourceDeduper_test.cpp
+++ b/tools/aapt2/optimize/ResourceDeduper_test.cpp
@@ -52,9 +52,11 @@
           .Build();
 
   ASSERT_TRUE(ResourceDeduper().Consume(context.get(), table.get()));
+  EXPECT_THAT(table, HasValue("android:string/dedupe", default_config));
   EXPECT_THAT(table, Not(HasValue("android:string/dedupe", ldrtl_config)));
   EXPECT_THAT(table, Not(HasValue("android:string/dedupe", land_config)));
 
+  EXPECT_THAT(table, HasValue("android:string/dedupe2", default_config));
   EXPECT_THAT(table, HasValue("android:string/dedupe2", ldrtl_v21_config));
   EXPECT_THAT(table, Not(HasValue("android:string/dedupe2", ldrtl_config)));
 
@@ -151,4 +153,24 @@
   EXPECT_THAT(table, HasValue("android:string/keep", fr_rCA_config));
 }
 
+TEST(ResourceDeduperTest, MccMncValuesAreKept) {
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+  const ConfigDescription default_config = {};
+  const ConfigDescription mcc_config = test::ParseConfigOrDie("mcc262");
+  const ConfigDescription mnc_config = test::ParseConfigOrDie("mnc2");
+
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .AddString("android:string/keep", ResourceId{}, default_config, "keep")
+          .AddString("android:string/keep", ResourceId{}, mcc_config, "keep")
+          .AddString("android:string/keep", ResourceId{}, mnc_config, "keep")
+          .Build();
+
+  ASSERT_TRUE(ResourceDeduper().Consume(context.get(), table.get()));
+  EXPECT_THAT(table, HasValue("android:string/keep", default_config));
+  EXPECT_THAT(table, HasValue("android:string/keep", mcc_config));
+  EXPECT_THAT(table, HasValue("android:string/keep", mnc_config));
+}
+
+
 }  // namespace aapt
diff --git a/wifi/api/current.txt b/wifi/api/current.txt
index 3b8c33c..911f2fb 100644
--- a/wifi/api/current.txt
+++ b/wifi/api/current.txt
@@ -323,6 +323,7 @@
     method public android.net.DhcpInfo getDhcpInfo();
     method public int getMaxNumberOfNetworkSuggestionsPerApp();
     method @IntRange(from=0) public int getMaxSignalLevel();
+    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public int getNetworkSuggestionUserApprovalStatus();
     method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public java.util.List<android.net.wifi.WifiNetworkSuggestion> getNetworkSuggestions();
     method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.net.wifi.hotspot2.PasspointConfiguration> getPasspointConfigurations();
     method public java.util.List<android.net.wifi.ScanResult> getScanResults();
@@ -393,6 +394,11 @@
     field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_INTERNAL = 1; // 0x1
     field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID = 5; // 0x5
     field public static final int STATUS_NETWORK_SUGGESTIONS_SUCCESS = 0; // 0x0
+    field public static final int STATUS_SUGGESTION_APPROVAL_APPROVED_BY_CARRIER_PRIVILEGE = 4; // 0x4
+    field public static final int STATUS_SUGGESTION_APPROVAL_APPROVED_BY_USER = 2; // 0x2
+    field public static final int STATUS_SUGGESTION_APPROVAL_PENDING = 1; // 0x1
+    field public static final int STATUS_SUGGESTION_APPROVAL_REJECTED_BY_USER = 3; // 0x3
+    field public static final int STATUS_SUGGESTION_APPROVAL_UNKNOWN = 0; // 0x0
     field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_ASSOCIATION = 1; // 0x1
     field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_AUTHENTICATION = 2; // 0x2
     field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_IP_PROVISIONING = 3; // 0x3
@@ -499,6 +505,7 @@
     method @Nullable public String getSsid();
     method public int getSubscriptionId();
     method public boolean isAppInteractionRequired();
+    method public boolean isCarrierMerged();
     method public boolean isCredentialSharedWithUser();
     method public boolean isEnhancedOpen();
     method public boolean isHiddenSsid();
@@ -514,6 +521,7 @@
     ctor public WifiNetworkSuggestion.Builder();
     method @NonNull public android.net.wifi.WifiNetworkSuggestion build();
     method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setBssid(@NonNull android.net.MacAddress);
+    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setCarrierMerged(boolean);
     method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setCredentialSharedWithUser(boolean);
     method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsAppInteractionRequired(boolean);
     method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsEnhancedMacRandomizationEnabled(boolean);
diff --git a/wifi/api/system-current.txt b/wifi/api/system-current.txt
index 5eef6f8..1d2bed8 100644
--- a/wifi/api/system-current.txt
+++ b/wifi/api/system-current.txt
@@ -345,6 +345,7 @@
     field @Deprecated public static final int RECENT_FAILURE_REFUSED_TEMPORARILY = 1002; // 0x3ea
     field @Deprecated public boolean allowAutojoin;
     field @Deprecated public int carrierId;
+    field @Deprecated public boolean carrierMerged;
     field @Deprecated public String creatorName;
     field @Deprecated public int creatorUid;
     field @Deprecated public boolean fromWifiNetworkSpecifier;
@@ -426,8 +427,10 @@
     method @Nullable public String getRequestingPackageName();
     method public double getRetriedTxPacketsPerSecond();
     method public int getScore();
+    method public int getSubscriptionId();
     method public double getSuccessfulRxPacketsPerSecond();
     method public double getSuccessfulTxPacketsPerSecond();
+    method public boolean isCarrierMerged();
     method public boolean isEphemeral();
     method public boolean isOemPaid();
     method public boolean isOemPrivate();
diff --git a/wifi/api/system-lint-baseline.txt b/wifi/api/system-lint-baseline.txt
index a5f3f7c..9a3b66a 100644
--- a/wifi/api/system-lint-baseline.txt
+++ b/wifi/api/system-lint-baseline.txt
@@ -7,5 +7,7 @@
 
 
 
+MutableBareField: android.net.wifi.WifiConfiguration#carrierMerged:
+
 MutableBareField: android.net.wifi.WifiConfiguration#subscriptionId:
     Bare field subscriptionId must be marked final, or moved behind accessors if mutable
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 7329c16..48e2312 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -275,4 +275,6 @@
     void setAutoWakeupEnabled(boolean enable);
 
     boolean isAutoWakeupEnabled();
+
+    int getNetworkSuggestionUserApprovalStatus(String packageName);
 }
diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java
index 73c52ab..034defb 100644
--- a/wifi/java/android/net/wifi/RttManager.java
+++ b/wifi/java/android/net/wifi/RttManager.java
@@ -173,7 +173,7 @@
 
     /** @deprecated Use the new {@link android.net.wifi.RttManager#getRttCapabilities()} API.*/
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public Capabilities getCapabilities() {
         throw new UnsupportedOperationException(
                 "getCapabilities is not supported in the adaptation layer");
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index e1e9757..84cd818 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -1053,6 +1053,15 @@
     public boolean oemPrivate;
 
     /**
+     * Indicate whether or not the network is a carrier merged network.
+     * This bit can only be used by suggestion network, see
+     * {@link WifiNetworkSuggestion.Builder#setCarrierMerged(boolean)}
+     * @hide
+     */
+    @SystemApi
+    public boolean carrierMerged;
+
+    /**
      * True if this Wifi configuration is created from a {@link WifiNetworkSuggestion},
      * false otherwise.
      *
@@ -2283,6 +2292,7 @@
         trusted = true; // Networks are considered trusted by default.
         oemPaid = false;
         oemPrivate = false;
+        carrierMerged = false;
         fromWifiNetworkSuggestion = false;
         fromWifiNetworkSpecifier = false;
         meteredHint = false;
@@ -2407,12 +2417,13 @@
         if (this.trusted) sbuf.append(" trusted");
         if (this.oemPaid) sbuf.append(" oemPaid");
         if (this.oemPrivate) sbuf.append(" oemPrivate");
+        if (this.carrierMerged) sbuf.append(" carrierMerged");
         if (this.fromWifiNetworkSuggestion) sbuf.append(" fromWifiNetworkSuggestion");
         if (this.fromWifiNetworkSpecifier) sbuf.append(" fromWifiNetworkSpecifier");
         if (this.meteredHint) sbuf.append(" meteredHint");
         if (this.useExternalScores) sbuf.append(" useExternalScores");
         if (this.validatedInternetAccess || this.ephemeral || this.trusted || this.oemPaid
-                || this.oemPrivate || this.fromWifiNetworkSuggestion
+                || this.oemPrivate || this.carrierMerged || this.fromWifiNetworkSuggestion
                 || this.fromWifiNetworkSpecifier || this.meteredHint || this.useExternalScores) {
             sbuf.append("\n");
         }
@@ -2980,6 +2991,7 @@
             trusted = source.trusted;
             oemPaid = source.oemPaid;
             oemPrivate = source.oemPrivate;
+            carrierMerged = source.carrierMerged;
             fromWifiNetworkSuggestion = source.fromWifiNetworkSuggestion;
             fromWifiNetworkSpecifier = source.fromWifiNetworkSpecifier;
             meteredHint = source.meteredHint;
@@ -3062,6 +3074,7 @@
         dest.writeInt(trusted ? 1 : 0);
         dest.writeInt(oemPaid ? 1 : 0);
         dest.writeInt(oemPrivate ? 1 : 0);
+        dest.writeInt(carrierMerged ? 1 : 0);
         dest.writeInt(fromWifiNetworkSuggestion ? 1 : 0);
         dest.writeInt(fromWifiNetworkSpecifier ? 1 : 0);
         dest.writeInt(meteredHint ? 1 : 0);
@@ -3141,6 +3154,7 @@
                 config.trusted = in.readInt() != 0;
                 config.oemPaid = in.readInt() != 0;
                 config.oemPrivate = in.readInt() != 0;
+                config.carrierMerged = in.readInt() != 0;
                 config.fromWifiNetworkSuggestion =  in.readInt() != 0;
                 config.fromWifiNetworkSpecifier =  in.readInt() != 0;
                 config.meteredHint = in.readInt() != 0;
diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java
index 774c043..6bd1ce5 100644
--- a/wifi/java/android/net/wifi/WifiInfo.java
+++ b/wifi/java/android/net/wifi/WifiInfo.java
@@ -25,8 +25,10 @@
 import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.telephony.SubscriptionManager;
 import android.text.TextUtils;
 
+import com.android.modules.utils.build.SdkLevel;
 import com.android.net.module.util.Inet4AddressUtils;
 
 import java.net.Inet4Address;
@@ -169,6 +171,11 @@
     private boolean mOemPrivate;
 
     /**
+     * Whether the network is a carrier merged network.
+     */
+    private boolean mCarrierMerged;
+
+    /**
      * OSU (Online Sign Up) AP for Passpoint R2.
      */
     private boolean mOsuAp;
@@ -190,6 +197,11 @@
     private String mRequestingPackageName;
 
     /**
+     * Identify which Telephony subscription provides this network.
+     */
+    private int mSubscriptionId;
+
+    /**
      * Running total count of lost (not ACKed) transmitted unicast data packets.
      * @hide
      */
@@ -315,6 +327,7 @@
         mRssi = INVALID_RSSI;
         mLinkSpeed = LINK_SPEED_UNKNOWN;
         mFrequency = -1;
+        mSubscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
     }
 
     /** @hide */
@@ -335,11 +348,13 @@
         setTrusted(false);
         setOemPaid(false);
         setOemPrivate(false);
+        setCarrierMerged(false);
         setOsuAp(false);
         setRequestingPackageName(null);
         setFQDN(null);
         setProviderFriendlyName(null);
         setPasspointUniqueId(null);
+        setSubscriptionId(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
         txBad = 0;
         txSuccess = 0;
         rxSuccess = 0;
@@ -373,11 +388,13 @@
             mTrusted = source.mTrusted;
             mOemPaid = source.mOemPaid;
             mOemPrivate = source.mOemPrivate;
+            mCarrierMerged = source.mCarrierMerged;
             mRequestingPackageName =
                     source.mRequestingPackageName;
             mOsuAp = source.mOsuAp;
             mFqdn = source.mFqdn;
             mProviderFriendlyName = source.mProviderFriendlyName;
+            mSubscriptionId = source.mSubscriptionId;
             txBad = source.txBad;
             txRetries = source.txRetries;
             txSuccess = source.txSuccess;
@@ -753,6 +770,9 @@
      */
     @SystemApi
     public boolean isOemPaid() {
+        if (!SdkLevel.isAtLeastS()) {
+            throw new UnsupportedOperationException();
+        }
         return mOemPaid;
     }
 
@@ -768,9 +788,33 @@
      */
     @SystemApi
     public boolean isOemPrivate() {
+        if (!SdkLevel.isAtLeastS()) {
+            throw new UnsupportedOperationException();
+        }
         return mOemPrivate;
     }
 
+    /**
+     * {@hide}
+     */
+    public void setCarrierMerged(boolean carrierMerged) {
+        mCarrierMerged = carrierMerged;
+    }
+
+    /**
+     * Returns true if the current Wifi network is a carrier merged network, false otherwise.
+     * @see WifiNetworkSuggestion.Builder#setCarrierMerged(boolean).
+     * {@hide}
+     */
+    @SystemApi
+    public boolean isCarrierMerged() {
+        if (!SdkLevel.isAtLeastS()) {
+            throw new UnsupportedOperationException();
+        }
+        return mCarrierMerged;
+    }
+
+
     /** {@hide} */
     public void setOsuAp(boolean osuAp) {
         mOsuAp = osuAp;
@@ -839,6 +883,28 @@
         return mRequestingPackageName;
     }
 
+    /** {@hide} */
+    public void setSubscriptionId(int subId) {
+        mSubscriptionId = subId;
+    }
+
+    /**
+     * If this network is provisioned by a carrier, returns subscription Id corresponding to the
+     * associated SIM on the device. If this network is not provisioned by a carrier, returns
+     * {@link android.telephony.SubscriptionManager#INVALID_SUBSCRIPTION_ID}
+     *
+     * @see WifiNetworkSuggestion.Builder#setSubscriptionId(int)
+     * @see android.telephony.SubscriptionInfo#getSubscriptionId()
+     * {@hide}
+     */
+    @SystemApi
+    public int getSubscriptionId() {
+        if (!SdkLevel.isAtLeastS()) {
+            throw new UnsupportedOperationException();
+        }
+        return mSubscriptionId;
+    }
+
 
     /** @hide */
     @UnsupportedAppUsage
@@ -1010,6 +1076,7 @@
         dest.writeInt(mTrusted ? 1 : 0);
         dest.writeInt(mOemPaid ? 1 : 0);
         dest.writeInt(mOemPrivate ? 1 : 0);
+        dest.writeInt(mCarrierMerged ? 1 : 0);
         dest.writeInt(score);
         dest.writeLong(txSuccess);
         dest.writeDouble(mSuccessfulTxPacketsPerSecond);
@@ -1028,6 +1095,7 @@
         dest.writeInt(mMaxSupportedTxLinkSpeed);
         dest.writeInt(mMaxSupportedRxLinkSpeed);
         dest.writeString(mPasspointUniqueId);
+        dest.writeInt(mSubscriptionId);
     }
 
     /** Implement the Parcelable interface {@hide} */
@@ -1057,6 +1125,7 @@
                 info.mTrusted = in.readInt() != 0;
                 info.mOemPaid = in.readInt() != 0;
                 info.mOemPrivate = in.readInt() != 0;
+                info.mCarrierMerged = in.readInt() != 0;
                 info.score = in.readInt();
                 info.txSuccess = in.readLong();
                 info.mSuccessfulTxPacketsPerSecond = in.readDouble();
@@ -1075,6 +1144,7 @@
                 info.mMaxSupportedTxLinkSpeed = in.readInt();
                 info.mMaxSupportedRxLinkSpeed = in.readInt();
                 info.mPasspointUniqueId = in.readString();
+                info.mSubscriptionId = in.readInt();
                 return info;
             }
 
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index ef55a56..7e04d8f 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -53,6 +53,7 @@
 import android.os.RemoteException;
 import android.os.WorkSource;
 import android.os.connectivity.WifiActivityEnergyInfo;
+import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.CloseGuard;
 import android.util.Log;
@@ -264,6 +265,44 @@
     public @interface SuggestionConnectionStatusCode {}
 
     /**
+     * Status code if suggestion approval status is unknown, an App which hasn't made any
+     * suggestions will get this code.
+     */
+    public static final int STATUS_SUGGESTION_APPROVAL_UNKNOWN = 0;
+
+    /**
+     * Status code if the calling app is still pending user approval for suggestions.
+     */
+    public static final int STATUS_SUGGESTION_APPROVAL_PENDING = 1;
+
+    /**
+     * Status code if the calling app got the user approval for suggestions.
+     */
+    public static final int STATUS_SUGGESTION_APPROVAL_APPROVED_BY_USER = 2;
+
+    /**
+     * Status code if the calling app suggestions were rejected by the user.
+     */
+    public static final int STATUS_SUGGESTION_APPROVAL_REJECTED_BY_USER = 3;
+
+    /**
+     * Status code if the calling app was approved by virtue of being a carrier privileged app.
+     * @see TelephonyManager#hasCarrierPrivileges().
+     */
+    public static final int STATUS_SUGGESTION_APPROVAL_APPROVED_BY_CARRIER_PRIVILEGE = 4;
+
+    /** @hide */
+    @IntDef(prefix = {"STATUS_SUGGESTION_APPROVAL_"},
+            value = {STATUS_SUGGESTION_APPROVAL_UNKNOWN,
+                    STATUS_SUGGESTION_APPROVAL_PENDING,
+                    STATUS_SUGGESTION_APPROVAL_APPROVED_BY_USER,
+                    STATUS_SUGGESTION_APPROVAL_REJECTED_BY_USER,
+                    STATUS_SUGGESTION_APPROVAL_APPROVED_BY_CARRIER_PRIVILEGE
+            })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface SuggestionUserApprovalStatus {}
+
+    /**
      * Broadcast intent action indicating whether Wi-Fi scanning is currently available.
      * Available extras:
      * - {@link #EXTRA_SCAN_AVAILABLE}
@@ -2010,6 +2049,26 @@
     }
 
     /**
+     * Get the Suggestion approval status of the calling app. When an app makes suggestions using
+     * the {@link #addNetworkSuggestions(List)} API they may trigger a user approval flow. This API
+     * provides the current approval status.
+     *
+     * @return Status code for the user approval. One of the STATUS_SUGGESTION_APPROVAL_ values.
+     * @throws {@link SecurityException} if the caller is missing required permissions.
+     */
+    @RequiresPermission(ACCESS_WIFI_STATE)
+    public @SuggestionUserApprovalStatus int getNetworkSuggestionUserApprovalStatus() {
+        if (!SdkLevel.isAtLeastS()) {
+            throw new UnsupportedOperationException();
+        }
+        try {
+            return mService.getNetworkSuggestionUserApprovalStatus(mContext.getOpPackageName());
+        } catch (RemoteException e) {
+            throw e.rethrowAsRuntimeException();
+        }
+    }
+
+    /**
      * Add or update a Passpoint configuration.  The configuration provides a credential
      * for connecting to Passpoint networks that are operated by the Passpoint
      * service provider specified in the configuration.
diff --git a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
index 61831ea..bd9a103 100644
--- a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
+++ b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
@@ -187,6 +187,11 @@
         private boolean mIsNetworkOemPrivate;
 
         /**
+         * Whether this network is a carrier merged network.
+         */
+        private boolean mIsCarrierMerged;
+
+        /**
          * Whether this network will use enhanced MAC randomization.
          */
         private boolean mIsEnhancedMacRandomizationEnabled;
@@ -214,6 +219,7 @@
             mIsNetworkUntrusted = false;
             mIsNetworkOemPaid = false;
             mIsNetworkOemPrivate = false;
+            mIsCarrierMerged = false;
             mPriorityGroup = 0;
             mIsEnhancedMacRandomizationEnabled = false;
             mSubscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -775,6 +781,34 @@
             return this;
         }
 
+        /**
+         * Specifies whether the suggestion represents a carrier merged network. A carrier merged
+         * Wi-Fi network is treated as part of the mobile carrier network. Such configuration may
+         * impact the user interface and data usage accounting.
+         * <p>
+         * <li>A suggestion marked as carrier merged must be metered enterprise network with a valid
+         * subscription Id set.
+         * @see #setIsMetered(boolean)
+         * @see #setSubscriptionId(int)
+         * @see #setWpa2EnterpriseConfig(WifiEnterpriseConfig)
+         * @see #setWpa3Enterprise192BitModeConfig(WifiEnterpriseConfig)
+         * @see #setWpa3EnterpriseStandardModeConfig(WifiEnterpriseConfig)
+         * @see #setPasspointConfig(PasspointConfiguration)
+         * </li>
+         * <li>If not set, defaults to false (i.e. not a carrier merged network.)</li>
+         * </p>
+         * @param isCarrierMerged Boolean indicating whether the network is treated a carrier
+         *                               merged network (if true) or non-merged network (if false);
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public @NonNull Builder setCarrierMerged(boolean isCarrierMerged) {
+            if (!SdkLevel.isAtLeastS()) {
+                throw new UnsupportedOperationException();
+            }
+            mIsCarrierMerged = isCarrierMerged;
+            return this;
+        }
+
         private void setSecurityParamsInWifiConfiguration(
                 @NonNull WifiConfiguration configuration) {
             if (!TextUtils.isEmpty(mWpa2PskPassphrase)) { // WPA-PSK network.
@@ -843,6 +877,7 @@
             wifiConfiguration.trusted = !mIsNetworkUntrusted;
             wifiConfiguration.oemPaid = mIsNetworkOemPaid;
             wifiConfiguration.oemPrivate = mIsNetworkOemPrivate;
+            wifiConfiguration.carrierMerged = mIsCarrierMerged;
             wifiConfiguration.macRandomizationSetting = mIsEnhancedMacRandomizationEnabled
                     ? WifiConfiguration.RANDOMIZATION_ENHANCED
                     : WifiConfiguration.RANDOMIZATION_PERSISTENT;
@@ -877,6 +912,7 @@
             wifiConfiguration.trusted = !mIsNetworkUntrusted;
             wifiConfiguration.oemPaid = mIsNetworkOemPaid;
             wifiConfiguration.oemPrivate = mIsNetworkOemPrivate;
+            wifiConfiguration.carrierMerged = mIsCarrierMerged;
             wifiConfiguration.subscriptionId = mSubscriptionId;
             mPasspointConfiguration.setCarrierId(mCarrierId);
             mPasspointConfiguration.setSubscriptionId(mSubscriptionId);
@@ -1004,6 +1040,14 @@
                 }
                 mIsSharedWithUser = false;
             }
+            if (mIsCarrierMerged) {
+                if (mSubscriptionId == SubscriptionManager.INVALID_SUBSCRIPTION_ID
+                        || mMeteredOverride != WifiConfiguration.METERED_OVERRIDE_METERED
+                        || !isEnterpriseSuggestion()) {
+                    throw new IllegalStateException("A carrier merged network must be a metered, "
+                            + "enterprise network with valid subscription Id");
+                }
+            }
             return new WifiNetworkSuggestion(
                     wifiConfiguration,
                     mPasspointConfiguration,
@@ -1013,8 +1057,15 @@
                     mIsInitialAutojoinEnabled,
                     mPriorityGroup);
         }
+
+        private boolean isEnterpriseSuggestion() {
+            return !(mWpa2EnterpriseConfig == null && mWpa3EnterpriseConfig == null
+                    && mWapiEnterpriseConfig == null && mPasspointConfiguration == null);
+        }
     }
 
+
+
     /**
      * Network configuration for the provided network.
      * @hide
@@ -1172,6 +1223,7 @@
                 .append(", isUnTrusted=").append(!wifiConfiguration.trusted)
                 .append(", isOemPaid=").append(wifiConfiguration.oemPaid)
                 .append(", isOemPrivate=").append(wifiConfiguration.oemPrivate)
+                .append(", isCarrierMerged").append(wifiConfiguration.carrierMerged)
                 .append(", priorityGroup=").append(priorityGroup)
                 .append(" ]");
         return sb.toString();
@@ -1291,6 +1343,16 @@
     }
 
     /**
+     * @see Builder#setCarrierMerged(boolean)
+     */
+    public boolean isCarrierMerged() {
+        if (!SdkLevel.isAtLeastS()) {
+            throw new UnsupportedOperationException();
+        }
+        return wifiConfiguration.carrierMerged;
+    }
+
+    /**
      * Get the WifiEnterpriseConfig, or null if unset.
      * @see Builder#setWapiEnterpriseConfig(WifiEnterpriseConfig)
      * @see Builder#setWpa2EnterpriseConfig(WifiEnterpriseConfig)
diff --git a/wifi/java/android/net/wifi/WifiScanner.java b/wifi/java/android/net/wifi/WifiScanner.java
index 41d0857..7c051f0 100644
--- a/wifi/java/android/net/wifi/WifiScanner.java
+++ b/wifi/java/android/net/wifi/WifiScanner.java
@@ -1267,7 +1267,7 @@
      * @param bssidInfos access points to watch
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void configureWifiChange(
             int rssiSampleSize,                             /* sample size for RSSI averaging */
             int lostApSampleSize,                           /* samples to confirm AP's loss */
@@ -1301,7 +1301,7 @@
      *                 provided on {@link #stopTrackingWifiChange}
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void startTrackingWifiChange(WifiChangeListener listener) {
         throw new UnsupportedOperationException();
     }
@@ -1312,7 +1312,7 @@
      * #stopTrackingWifiChange}
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void stopTrackingWifiChange(WifiChangeListener listener) {
         throw new UnsupportedOperationException();
     }
@@ -1320,7 +1320,7 @@
     /** @hide */
     @SystemApi
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void configureWifiChange(WifiChangeSettings settings) {
         throw new UnsupportedOperationException();
     }
@@ -1376,7 +1376,7 @@
      *                 also be provided on {@link #stopTrackingBssids}
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void startTrackingBssids(BssidInfo[] bssidInfos,
                                     int apLostThreshold, BssidListener listener) {
         throw new UnsupportedOperationException();
@@ -1387,7 +1387,7 @@
      * @param listener same object provided in {@link #startTrackingBssids}
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void stopTrackingBssids(BssidListener listener) {
         throw new UnsupportedOperationException();
     }
diff --git a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
index c881324..c253746 100644
--- a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
@@ -75,6 +75,7 @@
         config.trusted = false;
         config.oemPaid = true;
         config.oemPrivate = true;
+        config.carrierMerged = true;
         config.updateIdentifier = "1234";
         config.fromWifiNetworkSpecifier = true;
         config.fromWifiNetworkSuggestion = true;
@@ -101,6 +102,7 @@
         assertTrue(reconfig.fromWifiNetworkSuggestion);
         assertTrue(reconfig.oemPaid);
         assertTrue(reconfig.oemPrivate);
+        assertTrue(reconfig.carrierMerged);
 
         Parcel parcelWW = Parcel.obtain();
         reconfig.writeToParcel(parcelWW, 0);
@@ -116,6 +118,7 @@
         config.trusted = false;
         config.oemPaid = true;
         config.oemPrivate = true;
+        config.carrierMerged = true;
         config.updateIdentifier = "1234";
         config.fromWifiNetworkSpecifier = true;
         config.fromWifiNetworkSuggestion = true;
@@ -134,6 +137,7 @@
         assertTrue(reconfig.fromWifiNetworkSuggestion);
         assertTrue(reconfig.oemPaid);
         assertTrue(reconfig.oemPrivate);
+        assertTrue(reconfig.carrierMerged);
     }
 
     @Test
diff --git a/wifi/tests/src/android/net/wifi/WifiInfoTest.java b/wifi/tests/src/android/net/wifi/WifiInfoTest.java
index c6faf66..33438ed 100644
--- a/wifi/tests/src/android/net/wifi/WifiInfoTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiInfoTest.java
@@ -23,6 +23,7 @@
 import static org.junit.Assert.assertTrue;
 
 import android.os.Parcel;
+import android.telephony.SubscriptionManager;
 
 import androidx.test.filters.SmallTest;
 
@@ -50,6 +51,7 @@
     private static final int TEST_RSSI = -60;
     private static final int TEST_NETWORK_ID = 5;
     private static final int TEST_NETWORK_ID2 = 6;
+    private static final int TEST_SUB_ID = 1;
 
     /**
      *  Verify parcel write/read with WifiInfo.
@@ -64,6 +66,7 @@
         writeWifiInfo.setTrusted(true);
         writeWifiInfo.setOemPaid(true);
         writeWifiInfo.setOemPrivate(true);
+        writeWifiInfo.setCarrierMerged(true);
         writeWifiInfo.setOsuAp(true);
         writeWifiInfo.setFQDN(TEST_FQDN);
         writeWifiInfo.setProviderFriendlyName(TEST_PROVIDER_NAME);
@@ -71,6 +74,7 @@
         writeWifiInfo.setWifiStandard(TEST_WIFI_STANDARD);
         writeWifiInfo.setMaxSupportedTxLinkSpeedMbps(TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS);
         writeWifiInfo.setMaxSupportedRxLinkSpeedMbps(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS);
+        writeWifiInfo.setSubscriptionId(TEST_SUB_ID);
 
         Parcel parcel = Parcel.obtain();
         writeWifiInfo.writeToParcel(parcel, 0);
@@ -86,6 +90,7 @@
         assertTrue(readWifiInfo.isTrusted());
         assertTrue(readWifiInfo.isOemPaid());
         assertTrue(readWifiInfo.isOemPrivate());
+        assertTrue(readWifiInfo.isCarrierMerged());
         assertTrue(readWifiInfo.isOsuAp());
         assertTrue(readWifiInfo.isPasspointAp());
         assertEquals(TEST_PACKAGE_NAME, readWifiInfo.getRequestingPackageName());
@@ -96,6 +101,7 @@
                 readWifiInfo.getMaxSupportedTxLinkSpeedMbps());
         assertEquals(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS,
                 readWifiInfo.getMaxSupportedRxLinkSpeedMbps());
+        assertEquals(TEST_SUB_ID, readWifiInfo.getSubscriptionId());
     }
 
     @Test
@@ -108,6 +114,7 @@
         writeWifiInfo.setTrusted(true);
         writeWifiInfo.setOemPaid(true);
         writeWifiInfo.setOemPrivate(true);
+        writeWifiInfo.setCarrierMerged(true);
         writeWifiInfo.setOsuAp(true);
         writeWifiInfo.setFQDN(TEST_FQDN);
         writeWifiInfo.setProviderFriendlyName(TEST_PROVIDER_NAME);
@@ -115,6 +122,7 @@
         writeWifiInfo.setWifiStandard(TEST_WIFI_STANDARD);
         writeWifiInfo.setMaxSupportedTxLinkSpeedMbps(TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS);
         writeWifiInfo.setMaxSupportedRxLinkSpeedMbps(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS);
+        writeWifiInfo.setSubscriptionId(TEST_SUB_ID);
 
         WifiInfo readWifiInfo = new WifiInfo(writeWifiInfo);
 
@@ -125,6 +133,7 @@
         assertTrue(readWifiInfo.isTrusted());
         assertTrue(readWifiInfo.isOemPaid());
         assertTrue(readWifiInfo.isOemPrivate());
+        assertTrue(readWifiInfo.isCarrierMerged());
         assertTrue(readWifiInfo.isOsuAp());
         assertTrue(readWifiInfo.isPasspointAp());
         assertEquals(TEST_PACKAGE_NAME, readWifiInfo.getRequestingPackageName());
@@ -135,6 +144,7 @@
                 readWifiInfo.getMaxSupportedTxLinkSpeedMbps());
         assertEquals(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS,
                 readWifiInfo.getMaxSupportedRxLinkSpeedMbps());
+        assertEquals(TEST_SUB_ID, readWifiInfo.getSubscriptionId());
     }
 
     /**
@@ -154,6 +164,8 @@
         assertEquals(-1, wifiInfo.getNetworkId());
         assertFalse(wifiInfo.isOemPaid());
         assertFalse(wifiInfo.isOemPrivate());
+        assertFalse(wifiInfo.isCarrierMerged());
+        assertEquals(SubscriptionManager.INVALID_SUBSCRIPTION_ID, wifiInfo.getSubscriptionId());
     }
 
     /**
diff --git a/wifi/tests/src/android/net/wifi/WifiManagerTest.java b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
index 7340b14..5729247 100644
--- a/wifi/tests/src/android/net/wifi/WifiManagerTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
@@ -2415,4 +2415,13 @@
         assertFalse(mWifiManager.isScanAlwaysAvailable());
         verify(mWifiService).isScanAlwaysAvailable();
     }
+
+    @Test
+    public void testGetNetworkSuggestionUserApprovalStatus() throws Exception {
+        when(mWifiService.getNetworkSuggestionUserApprovalStatus(TEST_PACKAGE_NAME))
+                .thenReturn(WifiManager.STATUS_SUGGESTION_APPROVAL_APPROVED_BY_USER);
+        assertEquals(WifiManager.STATUS_SUGGESTION_APPROVAL_APPROVED_BY_USER,
+                mWifiManager.getNetworkSuggestionUserApprovalStatus());
+        verify(mWifiService).getNetworkSuggestionUserApprovalStatus(TEST_PACKAGE_NAME);
+    }
 }
diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java b/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
index 870ff0a..643a78c 100644
--- a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
@@ -1414,4 +1414,90 @@
                 .setIsInitialAutojoinEnabled(false)
                 .build();
     }
+
+    /**
+     * Validate {@link WifiNetworkSuggestion.Builder#setCarrierMerged(boolean)} (boolean)} set the
+     * correct value to the WifiConfiguration.
+     */
+    @Test
+    public void testSetCarrierMergedNetwork() {
+        assumeTrue(SdkLevel.isAtLeastS());
+
+        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
+        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
+        enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0);
+        enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
+        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setSubscriptionId(1)
+                .setWpa2EnterpriseConfig(enterpriseConfig)
+                .setCarrierMerged(true)
+                .setIsMetered(true)
+                .build();
+        assertTrue(suggestion.isCarrierMerged());
+        assertTrue(suggestion.wifiConfiguration.carrierMerged);
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+     * when set both {@link WifiNetworkSuggestion.Builder#setCarrierMerged(boolean)} (boolean)}
+     * to true on a network is not metered.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testSetCarrierMergedNetworkOnUnmeteredNetworkFail() {
+        assumeTrue(SdkLevel.isAtLeastS());
+
+        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
+        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
+        enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0);
+        enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
+        new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setSubscriptionId(1)
+                .setWpa2EnterpriseConfig(enterpriseConfig)
+                .setCarrierMerged(true)
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+     * when set both {@link WifiNetworkSuggestion.Builder#setCarrierMerged(boolean)} (boolean)}
+     * to true on a network which {@link WifiNetworkSuggestion.Builder#setSubscriptionId(int)}
+     * is not set with a valid sub id.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testSetCarrierMergedNetworkWithoutValidSubscriptionIdFail() {
+        assumeTrue(SdkLevel.isAtLeastS());
+
+        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
+        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
+        enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0);
+        enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
+        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setWpa2EnterpriseConfig(enterpriseConfig)
+                .setCarrierMerged(true)
+                .setIsMetered(true)
+                .build();
+        assertTrue(suggestion.isCarrierMerged());
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+     * when set both {@link WifiNetworkSuggestion.Builder#setCarrierMerged(boolean)} (boolean)}
+     * to true on a non enterprise network.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testSetCarrierMergedNetworkWithNonEnterpriseNetworkFail() {
+        assumeTrue(SdkLevel.isAtLeastS());
+
+        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setSubscriptionId(1)
+                .setWpa2Passphrase(TEST_PRESHARED_KEY)
+                .setCarrierMerged(true)
+                .setIsMetered(true)
+                .build();
+        assertTrue(suggestion.isCarrierMerged());
+    }
 }