Merge "Prevent updating of seekbar text when not scrubbing." into tm-dev
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index d2a86eb..805fdc4 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -11374,7 +11374,7 @@
          * Whether or not data roaming is enabled. (0 = false, 1 = true)
          * Use {@link TelephonyManager#isDataRoamingEnabled} instead of calling via settings.
          */
-        @Readable(maxTargetSdk = Build.VERSION_CODES.S)
+        @Readable(maxTargetSdk = Build.VERSION_CODES.S_V2)
         public static final String DATA_ROAMING = "data_roaming";
 
         /**
diff --git a/packages/SystemUI/res/layout/media_long_press_menu.xml b/packages/SystemUI/res/layout/media_long_press_menu.xml
index 99c5e47..a8ddd4c 100644
--- a/packages/SystemUI/res/layout/media_long_press_menu.xml
+++ b/packages/SystemUI/res/layout/media_long_press_menu.xml
@@ -26,7 +26,7 @@
         android:layout_marginStart="@dimen/qs_media_padding"
         android:layout_marginEnd="@dimen/qs_media_padding"
         android:id="@+id/remove_text"
-        android:fontFamily="@*android:string/config_headlineFontFamily"
+        android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
         android:singleLine="true"
         android:ellipsize="marquee"
         android:marqueeRepeatLimit="marquee_forever"
@@ -62,7 +62,6 @@
         android:layout_marginEnd="@dimen/qs_media_action_spacing"
         android:layout_marginBottom="@dimen/qs_media_padding"
         app:layout_constrainedWidth="true"
-        app:layout_constraintWidth_min="@dimen/min_clickable_item_size"
         app:layout_constraintHeight_min="@dimen/min_clickable_item_size"
         app:layout_constraintHorizontal_chainStyle="packed"
         app:layout_constraintStart_toStartOf="parent"
@@ -73,6 +72,7 @@
             android:id="@+id/dismiss_text"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            app:layout_constraintWidth_min="@dimen/min_clickable_item_size"
             android:layout_gravity="center|top"
             style="@style/MediaPlayer.SolidButton"
             android:background="@drawable/qs_media_solid_button"
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
index 3714c15..eab3745 100644
--- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
@@ -51,7 +51,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -100,7 +99,6 @@
 
 import com.android.internal.logging.UiEventLogger;
 import com.android.internal.policy.PhoneWindow;
-import com.android.settingslib.applications.InterestingConfigChanges;
 import com.android.systemui.R;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.broadcast.BroadcastSender;
@@ -166,10 +164,9 @@
 
     private boolean mBlockAttach = false;
     private Animator mExitAnimator;
+    private Animator mEnterAnimator;
+    private final int mOrientation;
 
-    /** Tracks config changes that require updating insets */
-    private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges(
-            ActivityInfo.CONFIG_KEYBOARD_HIDDEN);
 
     public ClipboardOverlayController(Context context,
             BroadcastDispatcher broadcastDispatcher,
@@ -255,6 +252,7 @@
         mRemoteCopyChip.setIcon(
                 Icon.createWithResource(mContext, R.drawable.ic_baseline_devices_24), true);
         mShareChip.setIcon(Icon.createWithResource(mContext, R.drawable.ic_screenshot_share), true);
+        mOrientation = mContext.getResources().getConfiguration().orientation;
 
         attachWindow();
         withWindowAttached(() -> {
@@ -266,9 +264,10 @@
                         @Override
                         public void onConfigurationChanged(Configuration overrideConfig,
                                 int newDisplayId) {
-                            if (mConfigChanges.applyNewConfig(mContext.getResources())) {
-                                updateInsets(
-                                        mWindowManager.getCurrentWindowMetrics().getWindowInsets());
+                            if (mContext.getResources().getConfiguration().orientation
+                                    != mOrientation) {
+                                mUiEventLogger.log(CLIPBOARD_OVERLAY_DISMISSED_OTHER);
+                                hideImmediate();
                             }
                         }
 
@@ -366,7 +365,7 @@
         Intent remoteCopyIntent = getRemoteCopyIntent(clipData);
         // Only show remote copy if it's available.
         PackageManager packageManager = mContext.getPackageManager();
-        if (remoteCopyIntent != null && packageManager.resolveActivity(
+        if (packageManager.resolveActivity(
                 remoteCopyIntent, PackageManager.ResolveInfoFlags.of(0)) != null) {
             mRemoteCopyChip.setVisibility(View.VISIBLE);
             mRemoteCopyChip.setOnClickListener((v) -> {
@@ -381,7 +380,9 @@
         withWindowAttached(() -> {
             updateInsets(
                     mWindowManager.getCurrentWindowMetrics().getWindowInsets());
-            mView.post(this::animateIn);
+            if (mEnterAnimator == null || !mEnterAnimator.isRunning()) {
+                mView.post(this::animateIn);
+            }
             mView.announceForAccessibility(accessibilityAnnouncement);
         });
         mTimeoutHandler.resetTimeout();
@@ -652,7 +653,8 @@
         if (mAccessibilityManager.isEnabled()) {
             mDismissButton.setVisibility(View.VISIBLE);
         }
-        getEnterAnimation().start();
+        mEnterAnimator = getEnterAnimation();
+        mEnterAnimator.start();
     }
 
     private void animateOut() {
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java
index 570d11b..c68a867 100644
--- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java
@@ -90,10 +90,12 @@
 
     @Override // ClipboardManager.OnPrimaryClipChangedListener
     public void onPrimaryClipChanged() {
-        hideImeAndFinish();
+        hideIme();
+        finish();
     }
 
     private void saveToClipboard() {
+        hideIme();
         Editable editedText = mEditText.getText();
         editedText.clearSpans();
         ClipData clip = ClipData.newPlainText("text", editedText);
@@ -101,7 +103,7 @@
         extras.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, mSensitive);
         clip.getDescription().setExtras(extras);
         mClipboardManager.setPrimaryClip(clip);
-        hideImeAndFinish();
+        finish();
     }
 
     private void share() {
@@ -114,9 +116,8 @@
         startActivity(shareIntent);
     }
 
-    private void hideImeAndFinish() {
+    private void hideIme() {
         InputMethodManager imm = getSystemService(InputMethodManager.class);
         imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
-        finish();
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt b/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt
index 9b0d432..f1d5e94 100644
--- a/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt
@@ -238,5 +238,6 @@
     fun updateColorScheme(colorScheme: ColorScheme?, enableGradient: Boolean) {
         isGradientEnabled = enableGradient
         colorTransitions.forEach { it.updateColorScheme(colorScheme) }
+        colorScheme?.let { mediaViewHolder.gutsViewHolder.colorScheme = colorScheme }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/media/GutsViewHolder.kt b/packages/SystemUI/src/com/android/systemui/media/GutsViewHolder.kt
index 1a48a84..73240b5 100644
--- a/packages/SystemUI/src/com/android/systemui/media/GutsViewHolder.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/GutsViewHolder.kt
@@ -40,6 +40,9 @@
     val dismissText: TextView = itemView.requireViewById(R.id.dismiss_text)
     val settings: ImageButton = itemView.requireViewById(R.id.settings)
 
+    private var isDismissible: Boolean = true
+    var colorScheme: ColorScheme? = null
+
     /** Marquees the main text of the guts menu. */
     fun marquee(start: Boolean, delay: Long, tag: String) {
         val gutsTextHandler = gutsText.handler
@@ -47,19 +50,31 @@
             Log.d(tag, "marquee while longPressText.getHandler() is null", Exception())
             return
         }
-        gutsTextHandler.postDelayed( { gutsText.isSelected = start }, delay)
+        gutsTextHandler.postDelayed({ gutsText.isSelected = start }, delay)
+    }
+
+    /** Set whether this control can be dismissed, and update appearance to match */
+    fun setDismissible(dismissible: Boolean) {
+        if (isDismissible == dismissible) return
+
+        isDismissible = dismissible
+        colorScheme?.let { setColors(it) }
     }
 
     /** Sets the right colors on all the guts views based on the given [ColorScheme]. */
-    fun setColors(colorScheme: ColorScheme) {
-        setSurfaceColor(surfaceFromScheme(colorScheme))
-        setTextPrimaryColor(textPrimaryFromScheme(colorScheme))
-        setAccentPrimaryColor(accentPrimaryFromScheme(colorScheme))
+    fun setColors(scheme: ColorScheme) {
+        colorScheme = scheme
+        setSurfaceColor(surfaceFromScheme(scheme))
+        setTextPrimaryColor(textPrimaryFromScheme(scheme))
+        setAccentPrimaryColor(accentPrimaryFromScheme(scheme))
     }
 
     /** Sets the surface color on all guts views that use it. */
     fun setSurfaceColor(surfaceColor: Int) {
         dismissText.setTextColor(surfaceColor)
+        if (!isDismissible) {
+            cancelText.setTextColor(surfaceColor)
+        }
     }
 
     /** Sets the primary accent color on all guts views that use it. */
@@ -74,7 +89,9 @@
     fun setTextPrimaryColor(textPrimary: Int) {
         val textColorList = ColorStateList.valueOf(textPrimary)
         gutsText.setTextColor(textColorList)
-        cancelText.setTextColor(textColorList)
+        if (isDismissible) {
+            cancelText.setTextColor(textColorList)
+        }
     }
 
     companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
index 972e93b..dea1325 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
@@ -1183,7 +1183,7 @@
         gutsViewHolder.getGutsText().setText(text);
 
         // Dismiss button
-        gutsViewHolder.getDismissText().setAlpha(isDismissible ? 1 : DISABLED_ALPHA);
+        gutsViewHolder.getDismissText().setVisibility(isDismissible ? View.VISIBLE : View.GONE);
         gutsViewHolder.getDismiss().setEnabled(isDismissible);
         gutsViewHolder.getDismiss().setOnClickListener(v -> {
             if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) return;
@@ -1194,11 +1194,18 @@
         });
 
         // Cancel button
+        TextView cancelText = gutsViewHolder.getCancelText();
+        if (isDismissible) {
+            cancelText.setBackground(mContext.getDrawable(R.drawable.qs_media_outline_button));
+        } else {
+            cancelText.setBackground(mContext.getDrawable(R.drawable.qs_media_solid_button));
+        }
         gutsViewHolder.getCancel().setOnClickListener(v -> {
             if (!mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
                 closeGuts();
             }
         });
+        gutsViewHolder.setDismissible(isDismissible);
 
         // Settings button
         gutsViewHolder.getSettings().setOnClickListener(v -> {
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt
index deb5cba..27cd1ce 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt
@@ -270,8 +270,11 @@
             }
         }
         gutsIds.forEach { id ->
-            viewState.widgetStates.get(id)?.alpha = if (isGutsVisible) 1f else 0f
-            viewState.widgetStates.get(id)?.gone = !isGutsVisible
+            viewState.widgetStates.get(id)?.let { state ->
+                // Make sure to use the unmodified state if guts are visible
+                state.alpha = if (isGutsVisible) state.alpha else 0f
+                state.gone = if (isGutsVisible) state.gone else true
+            }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java
index f84a6df..9f9fba4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java
@@ -16,7 +16,6 @@
 
 package com.android.systemui.statusbar.notification;
 
-import android.util.MathUtils;
 import android.util.Pools;
 import android.view.View;
 import android.view.animation.Interpolator;
@@ -99,10 +98,7 @@
         if (sameAs(otherState)) {
             ensureVisible();
         } else {
-            CrossFadeHelper.fadeIn(
-                    mTransformedView,
-                    MathUtils.constrainedMap(0, 1, 0.45f, 1, transformationAmount),
-                    false /* remap */);
+            CrossFadeHelper.fadeIn(mTransformedView, transformationAmount, true /* remap */);
         }
         transformViewFullyFrom(otherState, transformationAmount);
     }
@@ -298,10 +294,7 @@
             }
             return false;
         } else {
-            CrossFadeHelper.fadeOut(
-                    mTransformedView,
-                    MathUtils.constrainedMap(0, 1, 0, 0.55f, transformationAmount),
-                    false /* remap */);
+            CrossFadeHelper.fadeOut(mTransformedView, transformationAmount);
         }
         transformViewFullyTo(otherState, transformationAmount);
         return true;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt
index 8fd2d2f..b979241 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt
@@ -57,11 +57,13 @@
 
     private lateinit var animatingColorTransitionFactory: AnimatingColorTransitionFactory
     @Mock private lateinit var mediaViewHolder: MediaViewHolder
+    @Mock private lateinit var gutsViewHolder: GutsViewHolder
 
     @JvmField @Rule val mockitoRule = MockitoJUnit.rule()
 
     @Before
     fun setUp() {
+        whenever(mediaViewHolder.gutsViewHolder).thenReturn(gutsViewHolder)
         animatingColorTransitionFactory = { _, _, _ -> mockAnimatingTransition }
         whenever(extractColor.invoke(colorScheme)).thenReturn(TARGET_COLOR)
 
@@ -147,5 +149,6 @@
     fun testColorSchemeTransition_update() {
         colorSchemeTransition.updateColorScheme(colorScheme, true)
         verify(mockAnimatingTransition, times(10)).updateColorScheme(colorScheme)
+        verify(gutsViewHolder).colorScheme = colorScheme
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
index e6df106..1cce7cf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
@@ -603,6 +603,7 @@
                 .onSmartspaceMediaDataLoaded(anyObject(), anyObject(), anyBoolean())
     }
 
+    @Ignore("b/229838140")
     @Test
     fun testMediaRecommendationDisabled_removesSmartspaceData() {
         // GIVEN a media recommendation card is present
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
index 3b3bf11..5f337ab 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
@@ -241,6 +241,9 @@
 
     private void sendPendingIntent(int displayId, PendingIntent pendingIntent)
             throws PendingIntent.CanceledException {
+        final ActivityOptions options = ActivityOptions.makeBasic().setLaunchDisplayId(displayId);
+        options.setPendingIntentBackgroundActivityLaunchAllowed(true);
+        options.setPendingIntentBackgroundActivityLaunchAllowedByPermission(true);
         pendingIntent.send(
                 mContext,
                 /* code= */ 0,
@@ -248,9 +251,7 @@
                 /* onFinished= */ null,
                 /* handler= */ null,
                 /* requiredPermission= */ null,
-                ActivityOptions.makeBasic()
-                        .setLaunchDisplayId(displayId)
-                        .toBundle());
+                options.toBundle());
     }
 
     @Override // Binder call
diff --git a/services/core/java/com/android/server/adb/AdbService.java b/services/core/java/com/android/server/adb/AdbService.java
index 6667d1b..5d0c732 100644
--- a/services/core/java/com/android/server/adb/AdbService.java
+++ b/services/core/java/com/android/server/adb/AdbService.java
@@ -56,6 +56,7 @@
 import com.android.server.FgThread;
 import com.android.server.LocalServices;
 import com.android.server.SystemService;
+import com.android.server.testharness.TestHarnessModeService;
 
 import java.io.File;
 import java.io.FileDescriptor;
@@ -163,18 +164,8 @@
         }
     }
 
-    private void initAdbState() {
+    private void registerContentObservers() {
         try {
-            /*
-             * Use the normal bootmode persistent prop to maintain state of adb across
-             * all boot modes.
-             */
-            mIsAdbUsbEnabled = containsFunction(
-                    SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY, ""),
-                    UsbManager.USB_FUNCTION_ADB);
-            mIsAdbWifiEnabled = "1".equals(
-                    SystemProperties.get(WIFI_PERSISTENT_CONFIG_PROPERTY, "0"));
-
             // register observer to listen for settings changes
             mObserver = new AdbSettingsObserver();
             mContentResolver.registerContentObserver(
@@ -184,7 +175,7 @@
                     Settings.Global.getUriFor(Settings.Global.ADB_WIFI_ENABLED),
                     false, mObserver);
         } catch (Exception e) {
-            Slog.e(TAG, "Error in initAdbState", e);
+            Slog.e(TAG, "Error in registerContentObservers", e);
         }
     }
 
@@ -248,7 +239,7 @@
         mContentResolver = context.getContentResolver();
         mDebuggingManager = new AdbDebuggingManager(context);
 
-        initAdbState();
+        registerContentObservers();
         LocalServices.addService(AdbManagerInternal.class, new AdbManagerInternalImpl());
     }
 
@@ -259,10 +250,23 @@
     public void systemReady() {
         if (DEBUG) Slog.d(TAG, "systemReady");
 
+        /*
+         * Use the normal bootmode persistent prop to maintain state of adb across
+         * all boot modes.
+         */
+        mIsAdbUsbEnabled = containsFunction(
+                SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY, ""),
+                UsbManager.USB_FUNCTION_ADB);
+        boolean shouldEnableAdbUsb = mIsAdbUsbEnabled
+                || SystemProperties.getBoolean(
+                        TestHarnessModeService.TEST_HARNESS_MODE_PROPERTY, false);
+        mIsAdbWifiEnabled = "1".equals(
+                SystemProperties.get(WIFI_PERSISTENT_CONFIG_PROPERTY, "0"));
+
         // make sure the ADB_ENABLED setting value matches the current state
         try {
             Settings.Global.putInt(mContentResolver,
-                    Settings.Global.ADB_ENABLED, mIsAdbUsbEnabled ? 1 : 0);
+                    Settings.Global.ADB_ENABLED, shouldEnableAdbUsb ? 1 : 0);
             Settings.Global.putInt(mContentResolver,
                     Settings.Global.ADB_WIFI_ENABLED, mIsAdbWifiEnabled ? 1 : 0);
         } catch (SecurityException e) {
@@ -272,7 +276,7 @@
     }
 
     /**
-     * Callend in response to {@code SystemService.PHASE_BOOT_COMPLETED} from {@code SystemServer}.
+     * Called in response to {@code SystemService.PHASE_BOOT_COMPLETED} from {@code SystemServer}.
      */
     public void bootCompleted() {
         if (DEBUG) Slog.d(TAG, "boot completed");
diff --git a/services/core/java/com/android/server/pm/FileInstallArgs.java b/services/core/java/com/android/server/pm/FileInstallArgs.java
index e3ceccd..85c3cc9 100644
--- a/services/core/java/com/android/server/pm/FileInstallArgs.java
+++ b/services/core/java/com/android/server/pm/FileInstallArgs.java
@@ -172,22 +172,9 @@
             return false;
         }
 
-        if (onIncremental) {
-            Slog.i(TAG, PackageManagerServiceUtils.SELINUX_BUG
-                    + ": Skipping restorecon for Incremental install of " + beforeCodeFile);
-        } else {
-            try {
-                if (!SELinux.restoreconRecursive(afterCodeFile)) {
-                    Slog.w(TAG, "Failed to restorecon");
-                    return false;
-                }
-                PackageManagerServiceUtils.verifySelinuxLabels(afterCodeFile.getAbsolutePath());
-            } catch (Exception e) {
-                Slog.e(TAG,
-                        PackageManagerServiceUtils.SELINUX_BUG + ": Exception from restorecon on "
-                                + beforeCodeFile, e);
-                throw e;
-            }
+        if (!onIncremental && !SELinux.restoreconRecursive(afterCodeFile)) {
+            Slog.w(TAG, "Failed to restorecon");
+            return false;
         }
 
         // Reflect the rename internally
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index c710120..e62f35d 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -653,10 +653,6 @@
             Log.v(TAG, "restoreAndPostInstall userId=" + userId + " package=" + res.mPkg);
         }
 
-        if (res.mPkg != null) {
-            PackageManagerServiceUtils.verifySelinuxLabels(res.mPkg.getPath());
-        }
-
         // A restore should be requested at this point if (a) the install
         // succeeded, (b) the operation is not an update.
         final boolean update = res.mRemovedInfo != null
@@ -3580,7 +3576,6 @@
             @ParsingPackageUtils.ParseFlags int parseFlags,
             @PackageManagerService.ScanFlags int scanFlags,
             @Nullable UserHandle user) throws PackageManagerException {
-        PackageManagerServiceUtils.verifySelinuxLabels(parsedPackage.getPath());
 
         final Pair<ScanResult, Boolean> scanResultPair = scanSystemPackageLI(
                 parsedPackage, parseFlags, scanFlags, user);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 621ad52..4f8c792 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -803,6 +803,13 @@
     private AndroidPackage mPlatformPackage;
     ComponentName mCustomResolverComponentName;
 
+    // Recorded overlay paths configuration for the Android app info.
+    private String[] mPlatformPackageOverlayPaths = null;
+    private String[] mPlatformPackageOverlayResourceDirs = null;
+    // And the same paths for the replaced resolver activity package
+    private String[] mReplacedResolverPackageOverlayPaths = null;
+    private String[] mReplacedResolverPackageOverlayResourceDirs = null;
+
     private boolean mResolverReplaced = false;
 
     @NonNull
@@ -6562,11 +6569,61 @@
             });
         }
 
+        if (userId == UserHandle.USER_SYSTEM) {
+            // Keep the overlays in the system application info (and anything special cased as well)
+            // up to date to make sure system ui is themed correctly.
+            maybeUpdateSystemOverlays(targetPackageName, newOverlayPaths);
+        }
+
         invalidatePackageInfoCache();
 
         return true;
     }
 
+    private void maybeUpdateSystemOverlays(String targetPackageName, OverlayPaths newOverlayPaths) {
+        if (!mResolverReplaced) {
+            if (targetPackageName.equals("android")) {
+                if (newOverlayPaths == null) {
+                    mPlatformPackageOverlayPaths = null;
+                    mPlatformPackageOverlayResourceDirs = null;
+                } else {
+                    mPlatformPackageOverlayPaths = newOverlayPaths.getOverlayPaths().toArray(
+                            new String[0]);
+                    mPlatformPackageOverlayResourceDirs = newOverlayPaths.getResourceDirs().toArray(
+                            new String[0]);
+                }
+                applyUpdatedSystemOverlayPaths();
+            }
+        } else {
+            if (targetPackageName.equals(mResolveActivity.applicationInfo.packageName)) {
+                if (newOverlayPaths == null) {
+                    mReplacedResolverPackageOverlayPaths = null;
+                    mReplacedResolverPackageOverlayResourceDirs = null;
+                } else {
+                    mReplacedResolverPackageOverlayPaths =
+                            newOverlayPaths.getOverlayPaths().toArray(new String[0]);
+                    mReplacedResolverPackageOverlayResourceDirs =
+                            newOverlayPaths.getResourceDirs().toArray(new String[0]);
+                }
+                applyUpdatedSystemOverlayPaths();
+            }
+        }
+    }
+
+    private void applyUpdatedSystemOverlayPaths() {
+        if (mAndroidApplication == null) {
+            Slog.i(TAG, "Skipped the AndroidApplication overlay paths update - no app yet");
+        } else {
+            mAndroidApplication.overlayPaths = mPlatformPackageOverlayPaths;
+            mAndroidApplication.resourceDirs = mPlatformPackageOverlayResourceDirs;
+        }
+        if (mResolverReplaced) {
+            mResolveActivity.applicationInfo.overlayPaths = mReplacedResolverPackageOverlayPaths;
+            mResolveActivity.applicationInfo.resourceDirs =
+                    mReplacedResolverPackageOverlayResourceDirs;
+        }
+    }
+
     private void enforceAdjustRuntimePermissionsPolicyOrUpgradeRuntimePermissions(
             @NonNull String message) {
         if (mContext.checkCallingOrSelfPermission(
@@ -7043,6 +7100,7 @@
             }
             PackageManagerService.onChanged();
         }
+        applyUpdatedSystemOverlayPaths();
     }
 
     ApplicationInfo getCoreAndroidApplication() {
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index 6afc5890..3443d45 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -62,7 +62,6 @@
 import android.os.Environment;
 import android.os.FileUtils;
 import android.os.Process;
-import android.os.SELinux;
 import android.os.SystemProperties;
 import android.os.incremental.IncrementalManager;
 import android.os.incremental.IncrementalStorage;
@@ -1403,28 +1402,4 @@
             }
         }
     }
-
-    // TODO(b/231951809): remove this workaround after figuring out why apk_tmp_file labels stay
-    // on the installed apps instead of the correct apk_data_file ones
-
-    public static final String SELINUX_BUG = "b/231951809";
-
-    /**
-     * A workaround for b/231951809:
-     * Verifies the SELinux labels of the passed path, and tries to correct them if detects them
-     * wrong or missing.
-     */
-    public static void verifySelinuxLabels(String path) {
-        final String expectedCon = SELinux.fileSelabelLookup(path);
-        final String actualCon = SELinux.getFileContext(path);
-        Slog.i(TAG, SELINUX_BUG + ": checking selinux labels for " + path + " expected / actual: "
-                + expectedCon + " / " + actualCon);
-        if (expectedCon == null || !expectedCon.equals(actualCon)) {
-            Slog.w(TAG, SELINUX_BUG + ": labels don't match, reapplying for " + path);
-            if (!SELinux.restoreconRecursive(new File(path))) {
-                Slog.w(TAG, SELINUX_BUG + ": Failed to reapply restorecon");
-            }
-            // well, if it didn't work now after not working at first, not much else can be done
-        }
-    }
 }
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index fa0c6c3..0c601bf 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -706,7 +706,7 @@
             }
             pinnedShortcuts.addAll(pinned);
         });
-        // Then, update the pinned state if necessary.
+        // Secondly, update the pinned state if necessary.
         final List<ShortcutInfo> pinned = findAll(pinnedShortcuts);
         if (pinned != null) {
             pinned.forEach(si -> {
@@ -720,6 +720,8 @@
                 si.clearFlags(ShortcutInfo.FLAG_PINNED);
             }
         });
+        // Then, schedule a background job to persist the pinned states.
+        mShortcutUser.forAllLaunchers(ShortcutPackageItem::scheduleSave);
 
         // Lastly, remove the ones that are no longer pinned, cached nor dynamic.
         removeOrphans();
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 a83cb5e..2c1be72 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -966,8 +966,14 @@
 
             final PackageManagerInternal packageManagerInternal = LocalServices.getService(
                     PackageManagerInternal.class);
-            if (packageManagerInternal.getPackageUid(source.getPackageName(), 0,
-                    UserHandle.getUserId(callingUid)) != source.getUid()) {
+
+            // TODO(b/234653108): Clean up this UID/package & cross-user check.
+            // If calling from the system process, allow registering attribution for package from
+            // any user
+            int userId = UserHandle.getUserId((callingUid == Process.SYSTEM_UID ? source.getUid()
+                    : callingUid));
+            if (packageManagerInternal.getPackageUid(source.getPackageName(), 0, userId)
+                    != source.getUid()) {
                 throw new SecurityException("Cannot register attribution source for package:"
                         + source.getPackageName() + " from uid:" + callingUid);
             }
diff --git a/services/core/java/com/android/server/testharness/OWNERS b/services/core/java/com/android/server/testharness/OWNERS
new file mode 100644
index 0000000..ffbbeb93
--- /dev/null
+++ b/services/core/java/com/android/server/testharness/OWNERS
@@ -0,0 +1 @@
+williamhester@google.com
diff --git a/services/core/java/com/android/server/testharness/TestHarnessModeService.java b/services/core/java/com/android/server/testharness/TestHarnessModeService.java
index 8b2b8b1..b6a4135 100644
--- a/services/core/java/com/android/server/testharness/TestHarnessModeService.java
+++ b/services/core/java/com/android/server/testharness/TestHarnessModeService.java
@@ -69,8 +69,8 @@
  * automatic updates, etc.) are all disabled by default but may be re-enabled by the user.
  */
 public class TestHarnessModeService extends SystemService {
+    public static final String TEST_HARNESS_MODE_PROPERTY = "persist.sys.test_harness";
     private static final String TAG = TestHarnessModeService.class.getSimpleName();
-    private static final String TEST_HARNESS_MODE_PROPERTY = "persist.sys.test_harness";
 
     private PersistentDataBlockManagerInternal mPersistentDataBlockManagerInternal;
 
@@ -168,9 +168,9 @@
             Slog.d(TAG, "Restarted adbd");
         }
 
-        // Disable the TTL for ADB keys before enabling ADB
+        // Disable the TTL for ADB keys before ADB is enabled as a part of AdbService's
+        // initialization.
         Settings.Global.putLong(cr, Settings.Global.ADB_ALLOWED_CONNECTION_TIME, 0);
-        Settings.Global.putInt(cr, Settings.Global.ADB_ENABLED, 1);
         Settings.Global.putInt(cr, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
         Settings.Global.putInt(cr, Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB, 0);
         Settings.Global.putInt(