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(