diff options
16 files changed, 201 insertions, 30 deletions
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index c872516014db..59408191cdf5 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -4194,9 +4194,8 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>       * <p>This control allows Camera extension clients to configure the strength of the applied       * extension effect. Strength equal to 0 means that the extension must not apply any       * post-processing and return a regular captured frame. Strength equal to 100 is the -     * default level of post-processing applied when the control is not supported or not set -     * by the client. Values between 0 and 100 will have different effect depending on the -     * extension type as described below:</p> +     * maximum level of post-processing. Values between 0 and 100 will have different effect +     * depending on the extension type as described below:</p>       * <ul>       * <li>{@link android.hardware.camera2.CameraExtensionCharacteristics#EXTENSION_BOKEH BOKEH} -       * the strength is expected to control the amount of blur.</li> @@ -4211,7 +4210,9 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>       * {@link android.hardware.camera2.CameraExtensionCharacteristics#getAvailableCaptureRequestKeys }.       * The control is only defined and available to clients sending capture requests via       * {@link android.hardware.camera2.CameraExtensionSession }. -     * The default value is 100.</p> +     * If the client doesn't specify the extension strength value, then a default value will +     * be set by the extension. Clients can retrieve the default value by checking the +     * corresponding capture result.</p>       * <p><b>Range of valid values:</b><br>       * 0 - 100</p>       * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index 57f7bca1f67e..905f98de75ff 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -5694,9 +5694,8 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       * <p>This control allows Camera extension clients to configure the strength of the applied       * extension effect. Strength equal to 0 means that the extension must not apply any       * post-processing and return a regular captured frame. Strength equal to 100 is the -     * default level of post-processing applied when the control is not supported or not set -     * by the client. Values between 0 and 100 will have different effect depending on the -     * extension type as described below:</p> +     * maximum level of post-processing. Values between 0 and 100 will have different effect +     * depending on the extension type as described below:</p>       * <ul>       * <li>{@link android.hardware.camera2.CameraExtensionCharacteristics#EXTENSION_BOKEH BOKEH} -       * the strength is expected to control the amount of blur.</li> @@ -5711,7 +5710,9 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       * {@link android.hardware.camera2.CameraExtensionCharacteristics#getAvailableCaptureRequestKeys }.       * The control is only defined and available to clients sending capture requests via       * {@link android.hardware.camera2.CameraExtensionSession }. -     * The default value is 100.</p> +     * If the client doesn't specify the extension strength value, then a default value will +     * be set by the extension. Clients can retrieve the default value by checking the +     * corresponding capture result.</p>       * <p><b>Range of valid values:</b><br>       * 0 - 100</p>       * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> diff --git a/core/java/android/hardware/usb/OWNERS b/core/java/android/hardware/usb/OWNERS index 8f5c2a025672..a753f9634d0d 100644 --- a/core/java/android/hardware/usb/OWNERS +++ b/core/java/android/hardware/usb/OWNERS @@ -1,3 +1,7 @@  # Bug component: 175220 +aprasath@google.com +kumarashishg@google.com +sarup@google.com +anothermark@google.com  badhri@google.com diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 23b63089849f..f60f8db5e773 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -3227,6 +3227,15 @@ public class SettingsProvider extends ContentProvider {              return settingsState.getSettingLocked(name);          } +        private static boolean shouldExcludeSettingFromReset(Setting setting, String prefix) { +            // If a prefix was specified, exclude settings whose names don't start with it. +            if (prefix != null && !setting.getName().startsWith(prefix)) { +                return true; +            } +            // Never reset SECURE_FRP_MODE, as it could be abused to bypass FRP via RescueParty. +            return Global.SECURE_FRP_MODE.equals(setting.getName()); +        } +          public void resetSettingsLocked(int type, int userId, String packageName, int mode,                  String tag) {              resetSettingsLocked(type, userId, packageName, mode, tag, /*prefix=*/ @@ -3249,7 +3258,7 @@ public class SettingsProvider extends ContentProvider {                          Setting setting = settingsState.getSettingLocked(name);                          if (packageName.equals(setting.getPackageName())) {                              if ((tag != null && !tag.equals(setting.getTag())) -                                    || (prefix != null && !setting.getName().startsWith(prefix))) { +                                    || shouldExcludeSettingFromReset(setting, prefix)) {                                  continue;                              }                              if (settingsState.resetSettingLocked(name)) { @@ -3270,7 +3279,7 @@ public class SettingsProvider extends ContentProvider {                          Setting setting = settingsState.getSettingLocked(name);                          if (!SettingsState.isSystemPackage(getContext(),                                  setting.getPackageName())) { -                            if (prefix != null && !setting.getName().startsWith(prefix)) { +                            if (shouldExcludeSettingFromReset(setting, prefix)) {                                  continue;                              }                              if (settingsState.resetSettingLocked(name)) { @@ -3291,7 +3300,7 @@ public class SettingsProvider extends ContentProvider {                          Setting setting = settingsState.getSettingLocked(name);                          if (!SettingsState.isSystemPackage(getContext(),                                  setting.getPackageName())) { -                            if (prefix != null && !setting.getName().startsWith(prefix)) { +                            if (shouldExcludeSettingFromReset(setting, prefix)) {                                  continue;                              }                              if (setting.isDefaultFromSystem()) { @@ -3316,7 +3325,7 @@ public class SettingsProvider extends ContentProvider {                      for (String name : settingsState.getSettingNamesLocked()) {                          Setting setting = settingsState.getSettingLocked(name);                          boolean someSettingChanged = false; -                        if (prefix != null && !setting.getName().startsWith(prefix)) { +                        if (shouldExcludeSettingFromReset(setting, prefix)) {                              continue;                          }                          if (setting.isDefaultFromSystem()) { diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java index eaf0dcb9b4e7..a945c33bc20a 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java @@ -464,6 +464,31 @@ public class SettingsProviderTest extends BaseSettingsProviderTest {          }      } +    // To prevent FRP bypasses, the SECURE_FRP_MODE setting should not be reset when all other +    // settings are reset.  But it should still be possible to explicitly set its value. +    @Test +    public void testSecureFrpModeSettingCannotBeReset() throws Exception { +        final String name = Settings.Global.SECURE_FRP_MODE; +        final String origValue = getSetting(SETTING_TYPE_GLOBAL, name); +        setSettingViaShell(SETTING_TYPE_GLOBAL, name, "1", false); +        try { +            assertEquals("1", getSetting(SETTING_TYPE_GLOBAL, name)); +            for (int type : new int[] { SETTING_TYPE_GLOBAL, SETTING_TYPE_SECURE }) { +                resetSettingsViaShell(type, Settings.RESET_MODE_UNTRUSTED_DEFAULTS); +                resetSettingsViaShell(type, Settings.RESET_MODE_UNTRUSTED_CHANGES); +                resetSettingsViaShell(type, Settings.RESET_MODE_TRUSTED_DEFAULTS); +            } +            // The value should still be "1".  It should not have been reset to null. +            assertEquals("1", getSetting(SETTING_TYPE_GLOBAL, name)); +            // It should still be possible to explicitly set the value to "0". +            setSettingViaShell(SETTING_TYPE_GLOBAL, name, "0", false); +            assertEquals("0", getSetting(SETTING_TYPE_GLOBAL, name)); +        } finally { +            setSettingViaShell(SETTING_TYPE_GLOBAL, name, origValue, false); +            assertEquals(origValue, getSetting(SETTING_TYPE_GLOBAL, name)); +        } +    } +      private void doTestQueryStringInBracketsViaProviderApiForType(int type) {          // Make sure we have a clean slate.          deleteStringViaProviderApi(type, FAKE_SETTING_NAME); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 841b5b3a1e82..9ff338e8d5ab 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -786,8 +786,6 @@ public class KeyguardSecurityContainer extends ConstraintLayout {      void reloadColors() {          mViewMode.reloadColors(); -        setBackgroundColor(Utils.getColorAttrDefaultColor(getContext(), -                com.android.internal.R.attr.materialColorSurface));      }      /** Handles density or font scale changes. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 25ecf1a424e0..c42a6dc5b6f2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -1509,6 +1509,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump              mColors.setSupportsDarkText(                      ColorUtils.calculateContrast(mColors.getMainColor(), Color.WHITE) > 4.5);          } + +        int surface = Utils.getColorAttr(mScrimBehind.getContext(), +                com.android.internal.R.attr.materialColorSurface).getDefaultColor(); +        for (ScrimState state : ScrimState.values()) { +            state.setSurfaceColor(surface); +        } +          mNeedsDrawableColorUpdate = true;      } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java index 7b2028310a84..e3b65ab27f48 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -122,11 +122,19 @@ public enum ScrimState {          @Override          public void prepare(ScrimState previousState) {              mBehindAlpha = mClipQsScrim ? 1 : mDefaultScrimAlpha; -            mBehindTint = mClipQsScrim ? Color.BLACK : Color.TRANSPARENT; +            mBehindTint = mClipQsScrim ? Color.BLACK : mSurfaceColor;              mNotifAlpha = mClipQsScrim ? mDefaultScrimAlpha : 0;              mNotifTint = Color.TRANSPARENT;              mFrontAlpha = 0f;          } + +        @Override +        public void setSurfaceColor(int surfaceColor) { +            super.setSurfaceColor(surfaceColor); +            if (!mClipQsScrim) { +                mBehindTint = mSurfaceColor; +            } +        }      },      /** @@ -295,6 +303,7 @@ public enum ScrimState {      int mFrontTint = Color.TRANSPARENT;      int mBehindTint = Color.TRANSPARENT;      int mNotifTint = Color.TRANSPARENT; +    int mSurfaceColor = Color.TRANSPARENT;      boolean mAnimateChange = true;      float mAodFrontScrimAlpha; @@ -409,6 +418,10 @@ public enum ScrimState {          mDefaultScrimAlpha = defaultScrimAlpha;      } +    public void setSurfaceColor(int surfaceColor) { +        mSurfaceColor = surfaceColor; +    } +      public void setWallpaperSupportsAmbientMode(boolean wallpaperSupportsAmbientMode) {          mWallpaperSupportsAmbientMode = wallpaperSupportsAmbientMode;      } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputViewController.kt index 22b4c9d81d25..736b14574da0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputViewController.kt @@ -16,6 +16,7 @@  package com.android.systemui.statusbar.policy +import android.app.ActivityOptions  import android.app.Notification  import android.app.PendingIntent  import android.app.RemoteInput @@ -275,7 +276,10 @@ class RemoteInputViewControllerImpl @Inject constructor(                  entry.sbn.instanceId)          try { -            pendingIntent.send(view.context, 0, intent) +            val options = ActivityOptions.makeBasic() +            options.setPendingIntentBackgroundActivityStartMode( +                    ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) +            pendingIntent.send(view.context, 0, intent, null, null, null, options.toBundle())          } catch (e: PendingIntent.CanceledException) {              Log.i(TAG, "Unable to send remote input result", e)              uiEventLogger.logWithInstanceId( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java index bcf3b0cbfc86..24987abd7a85 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java @@ -240,8 +240,10 @@ public class StatusBarWindowController {                      Insets.of(0, safeTouchRegionHeight, 0, 0));          }          lp.providedInsets = new InsetsFrameProvider[] { -                new InsetsFrameProvider(mInsetsSourceOwner, 0, statusBars()), -                new InsetsFrameProvider(mInsetsSourceOwner, 0, tappableElement()), +                new InsetsFrameProvider(mInsetsSourceOwner, 0, statusBars()) +                        .setInsetsSize(getInsets(height)), +                new InsetsFrameProvider(mInsetsSourceOwner, 0, tappableElement()) +                        .setInsetsSize(getInsets(height)),                  gestureInsetsProvider          };          return lp; @@ -306,12 +308,37 @@ public class StatusBarWindowController {          mLpChanged.height =                  state.mIsLaunchAnimationRunning ? ViewGroup.LayoutParams.MATCH_PARENT : mBarHeight;          for (int rot = Surface.ROTATION_0; rot <= Surface.ROTATION_270; rot++) { +            int height = SystemBarUtils.getStatusBarHeightForRotation(mContext, rot);              mLpChanged.paramsForRotation[rot].height = -                    state.mIsLaunchAnimationRunning ? ViewGroup.LayoutParams.MATCH_PARENT : -                    SystemBarUtils.getStatusBarHeightForRotation(mContext, rot); +                    state.mIsLaunchAnimationRunning ? ViewGroup.LayoutParams.MATCH_PARENT : height; +            // The status bar height could change at runtime if one display has a cutout while +            // another doesn't (like some foldables). It could also change when using debug cutouts. +            // So, we need to re-fetch the height and re-apply it to the insets each time to avoid +            // bugs like b/290300359. +            InsetsFrameProvider[] providers = mLpChanged.paramsForRotation[rot].providedInsets; +            if (providers != null) { +                for (InsetsFrameProvider provider : providers) { +                    provider.setInsetsSize(getInsets(height)); +                } +            }          }      } +    /** +     * Get the insets that should be applied to the status bar window given the current status bar +     * height. +     * +     * The status bar window height can sometimes be full-screen (see {@link #applyHeight(State)}. +     * However, the status bar *insets* should *not* be full-screen, because this would prevent apps +     * from drawing any content and can cause animations to be cancelled (see b/283958440). Instead, +     * the status bar insets should always be equal to the space occupied by the actual status bar +     * content -- setting the insets correctly will prevent window manager from unnecessarily +     * re-drawing this window and other windows. This method provides the correct insets. +     */ +    private Insets getInsets(int height) { +        return Insets.of(0, height, 0, 0); +    } +      private void apply(State state) {          if (!mIsAttached) {              return; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index a9ed17531926..7fc02280354f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -44,6 +44,9 @@ import static kotlinx.coroutines.flow.FlowKt.emptyFlow;  import android.animation.Animator;  import android.app.AlarmManager; +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.TypedArray;  import android.graphics.Color;  import android.os.Handler;  import android.testing.AndroidTestingRunner; @@ -121,6 +124,7 @@ public class ScrimControllerTest extends SysuiTestCase {      private int mScrimVisibility;      private boolean mAlwaysOnEnabled;      private TestableLooper mLooper; +    private Context mContext;      @Mock private AlarmManager mAlarmManager;      @Mock private DozeParameters mDozeParameters;      @Mock private LightBarController mLightBarController; @@ -134,6 +138,7 @@ public class ScrimControllerTest extends SysuiTestCase {      @Mock private PrimaryBouncerToGoneTransitionViewModel mPrimaryBouncerToGoneTransitionViewModel;      @Mock private KeyguardTransitionInteractor mKeyguardTransitionInteractor;      @Mock private CoroutineDispatcher mMainDispatcher; +    @Mock private TypedArray mMockTypedArray;      // TODO(b/204991468): Use a real PanelExpansionStateManager object once this bug is fixed. (The      //   event-dispatch-on-registration pattern caused some of these unit tests to fail.) @@ -182,10 +187,11 @@ public class ScrimControllerTest extends SysuiTestCase {              mNumEnds = 0;              mNumCancels = 0;          } -    }; +    }      private AnimatorListener mAnimatorListener = new AnimatorListener(); +    private int mSurfaceColor = 0x112233;      private void finishAnimationsImmediately() {          // Execute code that will trigger animations. @@ -214,10 +220,17 @@ public class ScrimControllerTest extends SysuiTestCase {      @Before      public void setup() {          MockitoAnnotations.initMocks(this); +        mContext = spy(getContext()); +        when(mContext.obtainStyledAttributes( +                new int[]{com.android.internal.R.attr.materialColorSurface})) +                .thenReturn(mMockTypedArray); + +        when(mMockTypedArray.getColorStateList(anyInt())) +                .thenAnswer((invocation) -> ColorStateList.valueOf(mSurfaceColor)); -        mScrimBehind = spy(new ScrimView(getContext())); -        mScrimInFront = new ScrimView(getContext()); -        mNotificationsScrim = new ScrimView(getContext()); +        mScrimBehind = spy(new ScrimView(mContext)); +        mScrimInFront = new ScrimView(mContext); +        mNotificationsScrim = new ScrimView(mContext);          mAlwaysOnEnabled = true;          mLooper = TestableLooper.get(this);          DejankUtils.setImmediate(true); @@ -577,7 +590,7 @@ public class ScrimControllerTest extends SysuiTestCase {          mScrimController.transitionTo(BOUNCER);          finishAnimationsImmediately();          // Front scrim should be transparent -        // Back scrim should be visible without tint +        // Back scrim should be visible and tinted to the surface color          assertScrimAlpha(Map.of(                  mScrimInFront, TRANSPARENT,                  mNotificationsScrim, TRANSPARENT, @@ -585,9 +598,31 @@ public class ScrimControllerTest extends SysuiTestCase {          assertScrimTinted(Map.of(                  mScrimInFront, false, -                mScrimBehind, false, +                mScrimBehind, true,                  mNotificationsScrim, false          )); + +        assertScrimTint(mScrimBehind, mSurfaceColor); +    } + +    @Test +    public void onThemeChange_bouncerBehindTint_isUpdatedToSurfaceColor() { +        assertEquals(BOUNCER.getBehindTint(), 0x112233); +        mSurfaceColor = 0x223344; +        mConfigurationController.notifyThemeChanged(); +        assertEquals(BOUNCER.getBehindTint(), 0x223344); +    } + +    @Test +    public void onThemeChangeWhileClipQsScrim_bouncerBehindTint_remainsBlack() { +        mScrimController.setClipsQsScrim(true); +        mScrimController.transitionTo(BOUNCER); +        finishAnimationsImmediately(); + +        assertEquals(BOUNCER.getBehindTint(), Color.BLACK); +        mSurfaceColor = 0x223344; +        mConfigurationController.notifyThemeChanged(); +        assertEquals(BOUNCER.getBehindTint(), Color.BLACK);      }      @Test @@ -619,16 +654,17 @@ public class ScrimControllerTest extends SysuiTestCase {          finishAnimationsImmediately();          // Front scrim should be transparent -        // Back scrim should be visible without tint +        // Back scrim should be visible and has a tint of surfaceColor          assertScrimAlpha(Map.of(                  mScrimInFront, TRANSPARENT,                  mNotificationsScrim, TRANSPARENT,                  mScrimBehind, OPAQUE));          assertScrimTinted(Map.of(                  mScrimInFront, false, -                mScrimBehind, false, +                mScrimBehind, true,                  mNotificationsScrim, false          )); +        assertScrimTint(mScrimBehind, mSurfaceColor);      }      @Test @@ -1809,6 +1845,13 @@ public class ScrimControllerTest extends SysuiTestCase {          assertEquals(message, hasTint, scrim.getTint() != Color.TRANSPARENT);      } +    private void assertScrimTint(ScrimView scrim, int expectedTint) { +        String message = "Tint test failed with expected scrim tint: " +                + Integer.toHexString(expectedTint) + " and actual tint: " +                + Integer.toHexString(scrim.getTint()) + " for scrim: " + getScrimName(scrim); +        assertEquals(message, expectedTint, scrim.getTint(), 0.1); +    } +      private String getScrimName(ScrimView scrim) {          if (scrim == mScrimInFront) {              return "front"; 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 47a86b1fca5c..17ada0d7fa1b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -167,6 +167,7 @@ import java.util.HashMap;  import java.util.List;  import java.util.Optional; +@Ignore("b/292153259")  @SmallTest  @RunWith(AndroidTestingRunner.class)  @TestableLooper.RunWithLooper(setAsMainLooper = true) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 476e1b4ef11e..8089dcfe7ebc 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -3074,6 +3074,22 @@ public class ActivityManagerService extends IActivityManager.Stub          }      } +    /** +     * Enforces that the uid of the caller matches the uid of the package. +     * +     * @param packageName the name of the package to match uid against. +     * @param callingUid the uid of the caller. +     * @throws SecurityException if the calling uid doesn't match uid of the package. +     */ +    private void enforceCallingPackage(String packageName, int callingUid) { +        final int userId = UserHandle.getUserId(callingUid); +        final int packageUid = getPackageManagerInternal().getPackageUid(packageName, +                /*flags=*/ 0, userId); +        if (packageUid != callingUid) { +            throw new SecurityException(packageName + " does not belong to uid " + callingUid); +        } +    } +      @Override      public void setPackageScreenCompatMode(String packageName, int mode) {          mActivityTaskManager.setPackageScreenCompatMode(packageName, mode); @@ -13618,13 +13634,16 @@ public class ActivityManagerService extends IActivityManager.Stub      // A backup agent has just come up      @Override      public void backupAgentCreated(String agentPackageName, IBinder agent, int userId) { +        final int callingUid = Binder.getCallingUid(); +        enforceCallingPackage(agentPackageName, callingUid); +          // Resolve the target user id and enforce permissions. -        userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), +        userId = mUserController.handleIncomingUser(Binder.getCallingPid(), callingUid,                  userId, /* allowAll */ false, ALLOW_FULL_ONLY, "backupAgentCreated", null);          if (DEBUG_BACKUP) {              Slog.v(TAG_BACKUP, "backupAgentCreated: " + agentPackageName + " = " + agent                      + " callingUserId = " + UserHandle.getCallingUserId() + " userId = " + userId -                    + " callingUid = " + Binder.getCallingUid() + " uid = " + Process.myUid()); +                    + " callingUid = " + callingUid + " uid = " + Process.myUid());          }          synchronized(this) { diff --git a/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java b/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java index fc3d7c8114b0..745222873698 100644 --- a/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java +++ b/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java @@ -216,6 +216,10 @@ public final class BiometricContextProvider implements BiometricContext {      public void subscribe(@NonNull OperationContextExt context,              @NonNull Consumer<OperationContext> consumer) {          mSubscribers.put(context, consumer); +        // TODO(b/294161627) Combine the getContext/subscribe APIs to avoid race +        if (context.getDisplayState() != getDisplayState()) { +            consumer.accept(context.update(this, context.isCrypto()).toAidlContext()); +        }      }      @Override diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java index a4423038a072..437510595ecb 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java @@ -252,6 +252,14 @@ public class BiometricContextProviderTest {      }      @Test +    public void testSubscribesWithDifferentState() throws RemoteException { +        final Consumer<OperationContext> nonEmptyConsumer = mock(Consumer.class); +        mListener.onDisplayStateChanged(AuthenticateOptions.DISPLAY_STATE_AOD); +        mProvider.subscribe(mOpContext, nonEmptyConsumer); +        verify(nonEmptyConsumer).accept(same(mOpContext.toAidlContext())); +    } + +    @Test      public void testUnsubscribes() throws RemoteException {          final Consumer<OperationContext> emptyConsumer = mock(Consumer.class);          mProvider.subscribe(mOpContext, emptyConsumer); @@ -259,6 +267,9 @@ public class BiometricContextProviderTest {          mListener.onDisplayStateChanged(AuthenticateOptions.DISPLAY_STATE_AOD); +        //reset to unknown to avoid trigger accept when subscribe +        mListener.onDisplayStateChanged(AuthenticateOptions.DISPLAY_STATE_UNKNOWN); +          final Consumer<OperationContext> nonEmptyConsumer = mock(Consumer.class);          mProvider.subscribe(mOpContext, nonEmptyConsumer);          mListener.onDisplayStateChanged(AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN); diff --git a/services/usb/OWNERS b/services/usb/OWNERS index 60172a36128e..d35dbb56437b 100644 --- a/services/usb/OWNERS +++ b/services/usb/OWNERS @@ -1,3 +1,7 @@ +aprasath@google.com +kumarashishg@google.com +sarup@google.com +anothermark@google.com  badhri@google.com  elaurent@google.com  albertccwang@google.com  |