Merge "Remove HID usage mapping for stylus buttons in Generic.kl" into udc-qpr-dev
diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java
index cda919f..4a79a98 100644
--- a/media/java/android/media/session/MediaSession.java
+++ b/media/java/android/media/session/MediaSession.java
@@ -267,17 +267,22 @@
}
/**
- * Set a pending intent for your media button receiver to allow restarting
- * playback after the session has been stopped. If your app is started in
- * this way an {@link Intent#ACTION_MEDIA_BUTTON} intent will be sent via
- * the pending intent.
- * <p>
- * The pending intent is recommended to be explicit to follow the security recommendation of
- * {@link PendingIntent#getActivity}.
+ * Set a pending intent for your media button receiver to allow restarting playback after the
+ * session has been stopped.
+ *
+ * <p>If your app is started in this way an {@link Intent#ACTION_MEDIA_BUTTON} intent will be
+ * sent via the pending intent.
+ *
+ * <p>The provided {@link PendingIntent} must not target an activity. Passing an activity
+ * pending intent will cause the call to be ignored. Refer to this <a
+ * href="https://developer.android.com/guide/components/activities/background-starts">guide</a>
+ * for more information.
+ *
+ * <p>The pending intent is recommended to be explicit to follow the security recommendation of
+ * {@link PendingIntent#getService}.
*
* @param mbr The {@link PendingIntent} to send the media button event to.
* @see PendingIntent#getActivity
- *
* @deprecated Use {@link #setMediaButtonBroadcastReceiver(ComponentName)} instead.
*/
@Deprecated
@@ -285,7 +290,7 @@
try {
mBinder.setMediaButtonReceiver(mbr);
} catch (RemoteException e) {
- Log.wtf(TAG, "Failure in setMediaButtonReceiver.", e);
+ e.rethrowFromSystemServer();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
index 6d68eef..8b23b5a 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
+++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
@@ -285,11 +285,7 @@
/** Enables preview loading animation in the wallpaper picker. */
// TODO(b/274443705): Tracking Bug
@JvmField
- val WALLPAPER_PICKER_PREVIEW_ANIMATION =
- unreleasedFlag(
- "wallpaper_picker_preview_animation",
- teamfood = true
- )
+ val WALLPAPER_PICKER_PREVIEW_ANIMATION = releasedFlag("wallpaper_picker_preview_animation")
/** Stop running face auth when the display state changes to OFF. */
// TODO(b/294221702): Tracking bug.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/VariableDateViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/VariableDateViewController.kt
index f040d0a..369f9ca 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/VariableDateViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/VariableDateViewController.kt
@@ -31,6 +31,7 @@
import androidx.annotation.VisibleForTesting
import com.android.systemui.Dependency
import com.android.systemui.broadcast.BroadcastDispatcher
+import com.android.systemui.shade.ShadeLogger
import com.android.systemui.util.ViewController
import com.android.systemui.util.time.SystemClock
import java.text.FieldPosition
@@ -80,6 +81,7 @@
class VariableDateViewController(
private val systemClock: SystemClock,
private val broadcastDispatcher: BroadcastDispatcher,
+ private val shadeLogger: ShadeLogger,
private val timeTickHandler: Handler,
view: VariableDateView
) : ViewController<VariableDateView>(view) {
@@ -107,24 +109,29 @@
private val intentReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
+ val action = intent.action
+ if (
+ Intent.ACTION_LOCALE_CHANGED == action ||
+ Intent.ACTION_TIMEZONE_CHANGED == action
+ ) {
+ // need to get a fresh date format
+ dateFormat = null
+ shadeLogger.d("VariableDateViewController received intent to refresh date format")
+ }
+
+ val handler = mView.handler
+
// If the handler is null, it means we received a broadcast while the view has not
// finished being attached or in the process of being detached.
// In that case, do not post anything.
- val handler = mView.handler ?: return
- val action = intent.action
- if (
+ if (handler == null) {
+ shadeLogger.d("VariableDateViewController received intent but handler was null")
+ } else if (
Intent.ACTION_TIME_TICK == action ||
Intent.ACTION_TIME_CHANGED == action ||
Intent.ACTION_TIMEZONE_CHANGED == action ||
Intent.ACTION_LOCALE_CHANGED == action
) {
- if (
- Intent.ACTION_LOCALE_CHANGED == action ||
- Intent.ACTION_TIMEZONE_CHANGED == action
- ) {
- // need to get a fresh date format
- handler.post { dateFormat = null }
- }
handler.post(::updateClock)
}
}
@@ -211,12 +218,14 @@
class Factory @Inject constructor(
private val systemClock: SystemClock,
private val broadcastDispatcher: BroadcastDispatcher,
+ private val shadeLogger: ShadeLogger,
@Named(Dependency.TIME_TICK_HANDLER_NAME) private val handler: Handler
) {
fun create(view: VariableDateView): VariableDateViewController {
return VariableDateViewController(
systemClock,
broadcastDispatcher,
+ shadeLogger,
handler,
view
)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/VariableDateViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/VariableDateViewControllerTest.kt
index 871a48c..12c1335 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/VariableDateViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/VariableDateViewControllerTest.kt
@@ -24,6 +24,7 @@
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.capture
+import com.android.systemui.util.mockito.mock
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
import org.junit.Before
@@ -99,6 +100,7 @@
controller = VariableDateViewController(
systemClock,
broadcastDispatcher,
+ mock(),
testableHandler,
view
)
diff --git a/services/core/java/com/android/server/biometrics/AuthenticationStatsCollector.java b/services/core/java/com/android/server/biometrics/AuthenticationStatsCollector.java
index 356b301..54b34de 100644
--- a/services/core/java/com/android/server/biometrics/AuthenticationStatsCollector.java
+++ b/services/core/java/com/android/server/biometrics/AuthenticationStatsCollector.java
@@ -49,7 +49,8 @@
// Upload the data every 50 attempts (average number of daily authentications).
private static final int AUTHENTICATION_UPLOAD_INTERVAL = 50;
// The maximum number of eligible biometric enrollment notification can be sent.
- private static final int MAXIMUM_ENROLLMENT_NOTIFICATIONS = 2;
+ @VisibleForTesting
+ static final int MAXIMUM_ENROLLMENT_NOTIFICATIONS = 2;
@NonNull private final Context mContext;
@@ -114,6 +115,10 @@
AuthenticationStats authenticationStats = mUserAuthenticationStatsMap.get(userId);
+ if (authenticationStats.getEnrollmentNotifications() >= MAXIMUM_ENROLLMENT_NOTIFICATIONS) {
+ return;
+ }
+
authenticationStats.authenticate(authenticated);
if (mPersisterInitialized) {
diff --git a/services/core/java/com/android/server/biometrics/AuthenticationStatsPersister.java b/services/core/java/com/android/server/biometrics/AuthenticationStatsPersister.java
index 21e93a8..74e1410 100644
--- a/services/core/java/com/android/server/biometrics/AuthenticationStatsPersister.java
+++ b/services/core/java/com/android/server/biometrics/AuthenticationStatsPersister.java
@@ -21,6 +21,7 @@
import android.content.SharedPreferences;
import android.hardware.biometrics.BiometricsProtoEnums;
import android.os.Environment;
+import android.os.UserHandle;
import android.util.Slog;
import org.json.JSONException;
@@ -72,14 +73,16 @@
JSONObject frrStatsJson = new JSONObject(frrStats);
if (modality == BiometricsProtoEnums.MODALITY_FACE) {
authenticationStatsList.add(new AuthenticationStats(
- getIntValue(frrStatsJson, USER_ID, -1 /* defaultValue */),
+ getIntValue(frrStatsJson, USER_ID,
+ UserHandle.USER_NULL /* defaultValue */),
getIntValue(frrStatsJson, FACE_ATTEMPTS),
getIntValue(frrStatsJson, FACE_REJECTIONS),
getIntValue(frrStatsJson, ENROLLMENT_NOTIFICATIONS),
modality));
} else if (modality == BiometricsProtoEnums.MODALITY_FINGERPRINT) {
authenticationStatsList.add(new AuthenticationStats(
- getIntValue(frrStatsJson, USER_ID, -1 /* defaultValue */),
+ getIntValue(frrStatsJson, USER_ID,
+ UserHandle.USER_NULL /* defaultValue */),
getIntValue(frrStatsJson, FINGERPRINT_ATTEMPTS),
getIntValue(frrStatsJson, FINGERPRINT_REJECTIONS),
getIntValue(frrStatsJson, ENROLLMENT_NOTIFICATIONS),
@@ -138,13 +141,11 @@
// If there's existing frr stats in the file, we want to update the stats for the given
// modality and keep the stats for other modalities.
- if (frrStatJson != null) {
- frrStatsSet.add(buildFrrStats(frrStatJson, totalAttempts, rejectedAttempts,
- enrollmentNotifications, modality));
- } else {
- frrStatsSet.add(buildFrrStats(userId, totalAttempts, rejectedAttempts,
- enrollmentNotifications, modality));
+ if (frrStatJson == null) {
+ frrStatJson = new JSONObject().put(USER_ID, userId);
}
+ frrStatsSet.add(buildFrrStats(frrStatJson, totalAttempts, rejectedAttempts,
+ enrollmentNotifications, modality));
mSharedPreferences.edit().putStringSet(KEY, frrStatsSet).apply();
@@ -177,29 +178,6 @@
}
}
- // Build string for new user and new authentication stats.
- private String buildFrrStats(int userId, int totalAttempts, int rejectedAttempts,
- int enrollmentNotifications, int modality)
- throws JSONException {
- if (modality == BiometricsProtoEnums.MODALITY_FACE) {
- return new JSONObject()
- .put(USER_ID, userId)
- .put(FACE_ATTEMPTS, totalAttempts)
- .put(FACE_REJECTIONS, rejectedAttempts)
- .put(ENROLLMENT_NOTIFICATIONS, enrollmentNotifications)
- .toString();
- } else if (modality == BiometricsProtoEnums.MODALITY_FINGERPRINT) {
- return new JSONObject()
- .put(USER_ID, userId)
- .put(FINGERPRINT_ATTEMPTS, totalAttempts)
- .put(FINGERPRINT_REJECTIONS, rejectedAttempts)
- .put(ENROLLMENT_NOTIFICATIONS, enrollmentNotifications)
- .toString();
- } else {
- return "";
- }
- }
-
private String getValue(JSONObject jsonObject, String key) throws JSONException {
return jsonObject.has(key) ? jsonObject.getString(key) : "";
}
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index 9185a00..4084462 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -1062,6 +1062,14 @@
!= 0) {
return;
}
+
+ if (pi != null && pi.isActivity()) {
+ Log.w(
+ TAG,
+ "Ignoring invalid media button receiver targeting an activity: " + pi);
+ return;
+ }
+
mMediaButtonReceiverHolder =
MediaButtonReceiverHolder.create(mUserId, pi, mPackageName);
mService.onMediaButtonReceiverChanged(MediaSessionRecord.this);
diff --git a/services/core/java/com/android/server/wm/AsyncRotationController.java b/services/core/java/com/android/server/wm/AsyncRotationController.java
index 0250475..0a2bbd4 100644
--- a/services/core/java/com/android/server/wm/AsyncRotationController.java
+++ b/services/core/java/com/android/server/wm/AsyncRotationController.java
@@ -455,13 +455,11 @@
* or seamless transformation in a rotated display.
*/
boolean shouldFreezeInsetsPosition(WindowState w) {
- if (TransitionController.SYNC_METHOD != BLASTSyncEngine.METHOD_BLAST) {
- // Expect a screenshot layer has covered the screen, so it is fine to let client side
- // insets animation runner update the position directly.
- return false;
- }
- return mTransitionOp != OP_LEGACY && !mIsStartTransactionCommitted
- && isTargetToken(w.mToken);
+ // Non-change transition (OP_APP_SWITCH) and METHOD_BLAST don't use screenshot so the
+ // insets should keep original position before the start transaction is applied.
+ return mTransitionOp != OP_LEGACY && (mTransitionOp == OP_APP_SWITCH
+ || TransitionController.SYNC_METHOD == BLASTSyncEngine.METHOD_BLAST)
+ && !mIsStartTransactionCommitted && isTargetToken(w.mToken);
}
/**
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java
index 83fd725..098f32b 100644
--- a/services/core/java/com/android/server/wm/KeyguardController.java
+++ b/services/core/java/com/android/server/wm/KeyguardController.java
@@ -225,7 +225,6 @@
final DisplayContent dc = mRootWindowContainer.getDefaultDisplay();
dc.requestTransitionAndLegacyPrepare(
TRANSIT_TO_FRONT, TRANSIT_FLAG_KEYGUARD_APPEARING);
- dc.mWallpaperController.showWallpaperInTransition(false /* showHome */);
mWindowManager.executeAppTransition();
}
}
@@ -282,8 +281,6 @@
TRANSIT_TO_BACK, transitFlags, null /* trigger */, dc);
updateKeyguardSleepToken();
- // Make the home wallpaper visible
- dc.mWallpaperController.showWallpaperInTransition(true /* showHome */);
// Some stack visibility might change (e.g. docked stack)
mRootWindowContainer.resumeFocusedTasksTopActivities();
mRootWindowContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index 00bedcd..9c08c74 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -314,31 +314,6 @@
|| !mWallpaperTarget.mActivityRecord.isWaitingForTransitionStart());
}
- /**
- * Make one wallpaper visible, according to {@attr showHome}.
- * This is called during the keyguard unlocking transition
- * (see {@link KeyguardController#keyguardGoingAway(int, int)}),
- * or when a keyguard unlock is cancelled (see {@link KeyguardController})
- */
- public void showWallpaperInTransition(boolean showHome) {
- updateWallpaperWindowsTarget(mFindResults);
-
- if (!mFindResults.hasTopShowWhenLockedWallpaper()) {
- Slog.w(TAG, "There is no wallpaper for the lock screen");
- return;
- }
- WindowState hideWhenLocked = mFindResults.mTopWallpaper.mTopHideWhenLockedWallpaper;
- WindowState showWhenLocked = mFindResults.mTopWallpaper.mTopShowWhenLockedWallpaper;
- if (!mFindResults.hasTopHideWhenLockedWallpaper()) {
- // Shared wallpaper, ensure its visibility
- showWhenLocked.mToken.asWallpaperToken().updateWallpaperWindows(true);
- } else {
- // Separate lock and home wallpapers: show the correct wallpaper in transition
- hideWhenLocked.mToken.asWallpaperToken().updateWallpaperWindowsInTransition(showHome);
- showWhenLocked.mToken.asWallpaperToken().updateWallpaperWindowsInTransition(!showHome);
- }
- }
-
void hideDeferredWallpapersIfNeededLegacy() {
for (int i = mWallpaperTokens.size() - 1; i >= 0; i--) {
final WallpaperWindowToken token = mWallpaperTokens.get(i);
@@ -840,10 +815,7 @@
}
}
- if (!mDisplayContent.isKeyguardGoingAway() || !mIsLockscreenLiveWallpaperEnabled) {
- // When keyguard goes away, KeyguardController handles the visibility
- updateWallpaperTokens(visible, mDisplayContent.isKeyguardLocked());
- }
+ updateWallpaperTokens(visible, mDisplayContent.isKeyguardLocked());
if (DEBUG_WALLPAPER) {
Slog.v(TAG, "adjustWallpaperWindows: wallpaper visibility " + visible
diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
index 8e0ad0d..c7fd147 100644
--- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java
+++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
@@ -128,20 +128,6 @@
}
}
- /**
- * Update the visibility of the token to {@param visible}. If a transition will collect the
- * wallpaper, then the visibility will be committed during the execution of the transition.
- *
- * waitingToShow is reset at the beginning of the transition:
- * {@link Transition#onTransactionReady(int, SurfaceControl.Transaction)}
- */
- void updateWallpaperWindowsInTransition(boolean visible) {
- if (mTransitionController.isCollecting() && mVisibleRequested != visible) {
- waitingToShow = true;
- }
- updateWallpaperWindows(visible);
- }
-
void updateWallpaperWindows(boolean visible) {
if (mVisibleRequested != visible) {
ProtoLog.d(WM_DEBUG_WALLPAPER, "Wallpaper token %s visible=%b",
@@ -212,12 +198,9 @@
commitVisibility(visible);
}
- /**
- * Commits the visibility of this token. This will directly update the visibility unless the
- * wallpaper is in a transition.
- */
+ /** Commits the visibility of this token. This will directly update the visibility. */
void commitVisibility(boolean visible) {
- if (visible == isVisible() || waitingToShow) return;
+ if (visible == isVisible()) return;
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
"commitVisibility: %s: visible=%b mVisibleRequested=%b", this,
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthenticationStatsCollectorTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthenticationStatsCollectorTest.java
index 746fb53..64e776e 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/AuthenticationStatsCollectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthenticationStatsCollectorTest.java
@@ -16,6 +16,8 @@
package com.android.server.biometrics;
+import static com.android.server.biometrics.AuthenticationStatsCollector.MAXIMUM_ENROLLMENT_NOTIFICATIONS;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
@@ -44,9 +46,11 @@
import com.android.server.biometrics.sensors.BiometricNotification;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import java.io.File;
@@ -54,6 +58,9 @@
@SmallTest
public class AuthenticationStatsCollectorTest {
+ @Rule
+ public MockitoRule mockitoRule = MockitoJUnit.rule();
+
private AuthenticationStatsCollector mAuthenticationStatsCollector;
private static final float FRR_THRESHOLD = 0.2f;
private static final int USER_ID_1 = 1;
@@ -75,7 +82,6 @@
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
when(mContext.getResources()).thenReturn(mResources);
when(mResources.getFraction(eq(R.fraction.config_biometricNotificationFrrThreshold),
@@ -130,6 +136,33 @@
assertThat(authenticationStats.getEnrollmentNotifications()).isEqualTo(0);
}
+ /**
+ * Our current use case does not need the counters to update after the notification
+ * limit is reached. If we need these counters to continue counting in the future,
+ * a separate privacy review must be done.
+ */
+ @Test
+ public void authenticate_notificationExceeded_mapMustNotBeUpdated() {
+
+ mAuthenticationStatsCollector.setAuthenticationStatsForUser(USER_ID_1,
+ new AuthenticationStats(USER_ID_1, 400 /* totalAttempts */,
+ 40 /* rejectedAttempts */,
+ MAXIMUM_ENROLLMENT_NOTIFICATIONS /* enrollmentNotifications */,
+ 0 /* modality */));
+
+ mAuthenticationStatsCollector.authenticate(USER_ID_1, false /* authenticated */);
+
+ AuthenticationStats authenticationStats =
+ mAuthenticationStatsCollector.getAuthenticationStatsForUser(USER_ID_1);
+
+ assertThat(authenticationStats.getUserId()).isEqualTo(USER_ID_1);
+ // Assert that counters haven't been updated.
+ assertThat(authenticationStats.getTotalAttempts()).isEqualTo(400);
+ assertThat(authenticationStats.getRejectedAttempts()).isEqualTo(40);
+ assertThat(authenticationStats.getEnrollmentNotifications())
+ .isEqualTo(MAXIMUM_ENROLLMENT_NOTIFICATIONS);
+ }
+
@Test
public void authenticate_frrNotExceeded_notificationNotExceeded_shouldNotSendNotification() {
@@ -156,7 +189,8 @@
mAuthenticationStatsCollector.setAuthenticationStatsForUser(USER_ID_1,
new AuthenticationStats(USER_ID_1, 500 /* totalAttempts */,
- 400 /* rejectedAttempts */, 2 /* enrollmentNotifications */,
+ 400 /* rejectedAttempts */,
+ MAXIMUM_ENROLLMENT_NOTIFICATIONS /* enrollmentNotifications */,
0 /* modality */));
mAuthenticationStatsCollector.authenticate(USER_ID_1, false /* authenticated */);
@@ -164,12 +198,12 @@
// Assert that no notification should be sent.
verify(mBiometricNotification, never()).sendFaceEnrollNotification(any());
verify(mBiometricNotification, never()).sendFpEnrollNotification(any());
- // Assert that data has been reset.
+ // Assert that data hasn't been reset.
AuthenticationStats authenticationStats = mAuthenticationStatsCollector
.getAuthenticationStatsForUser(USER_ID_1);
- assertThat(authenticationStats.getTotalAttempts()).isEqualTo(0);
- assertThat(authenticationStats.getRejectedAttempts()).isEqualTo(0);
- assertThat(authenticationStats.getFrr()).isWithin(0f).of(-1.0f);
+ assertThat(authenticationStats.getTotalAttempts()).isEqualTo(500);
+ assertThat(authenticationStats.getRejectedAttempts()).isEqualTo(400);
+ assertThat(authenticationStats.getFrr()).isWithin(0f).of(0.8f);
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
index 7544fda..be4ef6f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
@@ -1197,7 +1197,7 @@
final AsyncRotationController asyncRotationController =
mDisplayContent.getAsyncRotationController();
assertNotNull(asyncRotationController);
- assertShouldFreezeInsetsPosition(asyncRotationController, statusBar, true);
+ assertTrue(asyncRotationController.shouldFreezeInsetsPosition(statusBar));
assertTrue(app.getTask().inTransition());
player.start();
@@ -1222,6 +1222,7 @@
assertFalse(asyncRotationController.isTargetToken(navBar.mToken));
navBar.finishDrawing(null /* postDrawTransaction */, Integer.MAX_VALUE);
assertTrue(asyncRotationController.isTargetToken(navBar.mToken));
+ assertTrue(asyncRotationController.shouldFreezeInsetsPosition(navBar));
player.startTransition();
// Non-app windows should not be collected.