From bcb4d3cf638599da7749c0e96195130313848a6f Mon Sep 17 00:00:00 2001
From: Daniel Chapin
Date: Tue, 2 Feb 2021 18:57:19 +0000
Subject: [PATCH 001/176] Revert "Make keyguard exit animation to remote
animation."
Revert "Make keyguard exit animation to remote animation."
Revert submission 13354553-KeyguardRemoteAnimation
Reason for revert: Bug: 179122467
Reverted Changes:
I7a70add76:Make keyguard exit animation to remote animation.
I1cd6a86c2:Make keyguard exit animation to remote animation.
I1cd6a86c2:Make keyguard exit animation to remote animation.
Change-Id: I3009b203c46fbf7f7d46fd66570680f266e3c064
(cherry picked from commit 7321b45093e1f8eee9ca799df185af6fe0dcbbb5)
---
.../android/view/IRemoteAnimationRunner.aidl | 6 +-
.../system/RemoteAnimationAdapterCompat.java | 20 +--
.../system/RemoteAnimationRunnerCompat.java | 7 +-
.../systemui/keyguard/KeyguardService.java | 92 -------------
.../keyguard/KeyguardViewMediator.java | 128 +-----------------
.../notification/ActivityLaunchAnimator.java | 5 +-
.../server/policy/PhoneWindowManager.java | 6 +-
.../server/policy/WindowManagerPolicy.java | 2 +-
.../keyguard/KeyguardServiceDelegate.java | 3 +-
.../com/android/server/wm/AppTransition.java | 9 +-
.../server/wm/AppTransitionController.java | 11 +-
.../server/wm/RemoteAnimationController.java | 12 +-
.../android/server/wm/TaskDisplayArea.java | 8 --
.../com/android/server/wm/Transition.java | 2 +
.../server/wm/WindowManagerInternal.java | 25 ----
.../server/wm/WindowManagerService.java | 25 +---
.../server/wm/ActivityRecordTests.java | 4 +-
.../server/wm/AppChangeTransitionTests.java | 5 +-
.../android/server/wm/AppTransitionTests.java | 4 +-
.../wm/RemoteAnimationControllerTest.java | 57 +++-----
.../server/wm/WindowContainerTests.java | 5 +-
21 files changed, 49 insertions(+), 387 deletions(-)
diff --git a/core/java/android/view/IRemoteAnimationRunner.aidl b/core/java/android/view/IRemoteAnimationRunner.aidl
index 1f64fb8ca2ec4..423e23d2bc081 100644
--- a/core/java/android/view/IRemoteAnimationRunner.aidl
+++ b/core/java/android/view/IRemoteAnimationRunner.aidl
@@ -30,15 +30,11 @@ oneway interface IRemoteAnimationRunner {
/**
* Called when the process needs to start the remote animation.
*
- * @param transition The old transition type. Must be one of WindowManager.TRANSIT_OLD_* values.
* @param apps The list of apps to animate.
- * @param wallpapers The list of wallpapers to animate.
- * @param nonApps The list of non-app windows such as Bubbles to animate.
* @param finishedCallback The callback to invoke when the animation is finished.
*/
@UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
- void onAnimationStart(int transit, in RemoteAnimationTarget[] apps,
- in RemoteAnimationTarget[] wallpapers, in RemoteAnimationTarget[] nonApps,
+ void onAnimationStart(in RemoteAnimationTarget[] apps, in RemoteAnimationTarget[] wallpapers,
in IRemoteAnimationFinishedCallback finishedCallback);
/**
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java
index e6477f158c277..a56c6a1f084e5 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java
@@ -18,11 +18,9 @@ package com.android.systemui.shared.system;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.view.WindowManager.TRANSIT_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_NONE;
import static android.view.WindowManager.TRANSIT_OPEN;
import static android.view.WindowManager.TRANSIT_TO_BACK;
import static android.view.WindowManager.TRANSIT_TO_FRONT;
-import static android.view.WindowManager.TransitionOldType;
import android.os.RemoteException;
import android.util.Log;
@@ -67,17 +65,13 @@ public class RemoteAnimationAdapterCompat {
final RemoteAnimationRunnerCompat remoteAnimationAdapter) {
return new IRemoteAnimationRunner.Stub() {
@Override
- public void onAnimationStart(@TransitionOldType int transit,
- RemoteAnimationTarget[] apps,
+ public void onAnimationStart(RemoteAnimationTarget[] apps,
RemoteAnimationTarget[] wallpapers,
- RemoteAnimationTarget[] nonApps,
final IRemoteAnimationFinishedCallback finishedCallback) {
final RemoteAnimationTargetCompat[] appsCompat =
RemoteAnimationTargetCompat.wrap(apps);
final RemoteAnimationTargetCompat[] wallpapersCompat =
RemoteAnimationTargetCompat.wrap(wallpapers);
- final RemoteAnimationTargetCompat[] nonAppsCompat =
- RemoteAnimationTargetCompat.wrap(nonApps);
final Runnable animationFinishedCallback = new Runnable() {
@Override
public void run() {
@@ -89,8 +83,8 @@ public class RemoteAnimationAdapterCompat {
}
}
};
- remoteAnimationAdapter.onAnimationStart(transit, appsCompat, wallpapersCompat,
- nonAppsCompat, animationFinishedCallback);
+ remoteAnimationAdapter.onAnimationStart(appsCompat, wallpapersCompat,
+ animationFinishedCallback);
}
@Override
@@ -110,9 +104,6 @@ public class RemoteAnimationAdapterCompat {
RemoteAnimationTargetCompat.wrap(info, false /* wallpapers */);
final RemoteAnimationTargetCompat[] wallpapersCompat =
RemoteAnimationTargetCompat.wrap(info, true /* wallpapers */);
- // TODO(bc-unlock): Build wrapped object for non-apps target.
- final RemoteAnimationTargetCompat[] nonAppsCompat =
- new RemoteAnimationTargetCompat[0];
final Runnable animationFinishedCallback = new Runnable() {
@Override
public void run() {
@@ -156,10 +147,7 @@ public class RemoteAnimationAdapterCompat {
}
}
t.apply();
- // TODO(bc-unlcok): Pass correct transit type.
- remoteAnimationAdapter.onAnimationStart(
- TRANSIT_OLD_NONE,
- appsCompat, wallpapersCompat, nonAppsCompat,
+ remoteAnimationAdapter.onAnimationStart(appsCompat, wallpapersCompat,
animationFinishedCallback);
}
};
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationRunnerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationRunnerCompat.java
index 007629254c7ca..33372f6bd0b91 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationRunnerCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationRunnerCompat.java
@@ -16,11 +16,8 @@
package com.android.systemui.shared.system;
-import android.view.WindowManager;
-
public interface RemoteAnimationRunnerCompat {
- void onAnimationStart(@WindowManager.TransitionOldType int transit,
- RemoteAnimationTargetCompat[] apps, RemoteAnimationTargetCompat[] wallpapers,
- RemoteAnimationTargetCompat[] nonApps, Runnable finishedCallback);
+ void onAnimationStart(RemoteAnimationTargetCompat[] apps,
+ RemoteAnimationTargetCompat[] wallpapers, Runnable finishedCallback);
void onAnimationCancelled();
}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
index 17f7ccf0d9672..1b033e91b76b7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
@@ -17,13 +17,7 @@
package com.android.systemui.keyguard;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static android.view.Display.DEFAULT_DISPLAY;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_OCCLUDE;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_UNOCCLUDE;
-import android.app.ActivityTaskManager;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
@@ -32,17 +26,8 @@ import android.os.Debug;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.Process;
-import android.os.RemoteException;
-import android.os.SystemProperties;
import android.os.Trace;
import android.util.Log;
-import android.util.Slog;
-import android.view.IRemoteAnimationFinishedCallback;
-import android.view.IRemoteAnimationRunner;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationDefinition;
-import android.view.RemoteAnimationTarget;
-import android.view.WindowManager;
import android.view.WindowManagerPolicyConstants;
import com.android.internal.policy.IKeyguardDismissCallback;
@@ -58,21 +43,6 @@ public class KeyguardService extends Service {
static final String TAG = "KeyguardService";
static final String PERMISSION = android.Manifest.permission.CONTROL_KEYGUARD;
- /**
- * Run Keyguard animation as remote animation in System UI instead of local animation in
- * the server process.
- *
- * Note: Must be consistent with WindowManagerService.
- */
- private static final String ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY =
- "persist.wm.enable_remote_keyguard_animation";
-
- /**
- * @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
- */
- private static boolean sEnableRemoteKeyguardAnimation =
- SystemProperties.getBoolean(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, false);
-
private final KeyguardViewMediator mKeyguardViewMediator;
private final KeyguardLifecyclesDispatcher mKeyguardLifecyclesDispatcher;
@@ -82,21 +52,6 @@ public class KeyguardService extends Service {
super();
mKeyguardViewMediator = keyguardViewMediator;
mKeyguardLifecyclesDispatcher = keyguardLifecyclesDispatcher;
-
- if (sEnableRemoteKeyguardAnimation) {
- RemoteAnimationDefinition definition = new RemoteAnimationDefinition();
- final RemoteAnimationAdapter exitAnimationAdapter =
- new RemoteAnimationAdapter(mExitAnimationRunner, 0, 0);
- definition.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_GOING_AWAY, exitAnimationAdapter);
- definition.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER,
- exitAnimationAdapter);
- final RemoteAnimationAdapter occludeAnimationAdapter =
- new RemoteAnimationAdapter(mOccludeAnimationRunner, 0, 0);
- definition.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_OCCLUDE, occludeAnimationAdapter);
- definition.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_UNOCCLUDE, occludeAnimationAdapter);
- ActivityTaskManager.getInstance().registerRemoteAnimationsForDisplay(
- DEFAULT_DISPLAY, definition);
- }
}
@Override
@@ -121,48 +76,6 @@ public class KeyguardService extends Service {
}
}
- private final IRemoteAnimationRunner.Stub mExitAnimationRunner =
- new IRemoteAnimationRunner.Stub() {
- @Override // Binder interface
- public void onAnimationStart(@WindowManager.TransitionOldType int transit,
- RemoteAnimationTarget[] apps,
- RemoteAnimationTarget[] wallpapers,
- RemoteAnimationTarget[] nonApps,
- IRemoteAnimationFinishedCallback finishedCallback) {
- Trace.beginSection("KeyguardService.mBinder#startKeyguardExitAnimation");
- checkPermission();
- mKeyguardViewMediator.startKeyguardExitAnimation(transit, apps, wallpapers,
- null /* nonApps */, finishedCallback);
- Trace.endSection();
- }
-
- @Override // Binder interface
- public void onAnimationCancelled() {
- }
- };
-
- private final IRemoteAnimationRunner.Stub mOccludeAnimationRunner =
- new IRemoteAnimationRunner.Stub() {
- @Override // Binder interface
- public void onAnimationStart(@WindowManager.TransitionOldType int transit,
- RemoteAnimationTarget[] apps,
- RemoteAnimationTarget[] wallpapers,
- RemoteAnimationTarget[] nonApps,
- IRemoteAnimationFinishedCallback finishedCallback) {
- // TODO(bc-unlock): Calls KeyguardViewMediator#setOccluded to update the state and
- // run animation.
- try {
- finishedCallback.onAnimationFinished();
- } catch (RemoteException e) {
- Slog.e(TAG, "RemoteException");
- }
- }
-
- @Override // Binder interface
- public void onAnimationCancelled() {
- }
- };
-
private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub() {
@Override // Binder interface
@@ -312,11 +225,6 @@ public class KeyguardService extends Service {
mKeyguardViewMediator.onBootCompleted();
}
- /**
- * @deprecated When remote animation is enabled, this won't be called anymore. Use
- * {@code IRemoteAnimationRunner#onAnimationStart} instead.
- */
- @Deprecated
@Override
public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) {
Trace.beginSection("KeyguardService.mBinder#startKeyguardExitAnimation");
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 5a918d4808d66..e7326698e43ea 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -27,9 +27,6 @@ import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STR
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_FOR_UNATTENDED_UPDATE;
import static com.android.systemui.DejankUtils.whitelistIpcs;
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
import android.app.ActivityManager;
import android.app.ActivityTaskManager;
import android.app.AlarmManager;
@@ -68,13 +65,8 @@ import android.util.EventLog;
import android.util.Log;
import android.util.Slog;
import android.util.SparseIntArray;
-import android.view.IRemoteAnimationFinishedCallback;
-import android.view.RemoteAnimationTarget;
-import android.view.SyncRtSurfaceTransactionApplier;
-import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams;
import android.view.View;
import android.view.ViewGroup;
-import android.view.WindowManager;
import android.view.WindowManagerPolicyConstants;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
@@ -93,7 +85,6 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.KeyguardViewController;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.Dumpable;
-import com.android.systemui.Interpolators;
import com.android.systemui.SystemUI;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.classifier.FalsingCollector;
@@ -1327,7 +1318,6 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
if (mHiding && isOccluded) {
// We're in the process of going away but WindowManager wants to show a
// SHOW_WHEN_LOCKED activity instead.
- // TODO(bc-unlock): Migrate to remote animation.
startKeyguardExitAnimation(0, 0);
}
@@ -1713,9 +1703,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
Trace.beginSection(
"KeyguardViewMediator#handleMessage START_KEYGUARD_EXIT_ANIM");
StartKeyguardExitAnimParams params = (StartKeyguardExitAnimParams) msg.obj;
- handleStartKeyguardExitAnimation(params.startTime, params.fadeoutDuration,
- params.mApps, params.mWallpapers, params.mNonApps,
- params.mFinishedCallback);
+ handleStartKeyguardExitAnimation(params.startTime, params.fadeoutDuration);
mFalsingCollector.onSuccessfulUnlock();
Trace.endSection();
break;
@@ -2002,19 +1990,15 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
if (mShowing && !mOccluded) {
mKeyguardGoingAwayRunnable.run();
} else {
- // TODO(bc-unlock): Fill parameters
handleStartKeyguardExitAnimation(
SystemClock.uptimeMillis() + mHideAnimation.getStartOffset(),
- mHideAnimation.getDuration(), null /* apps */, null /* wallpapers */,
- null /* nonApps */, null /* finishedCallback */);
+ mHideAnimation.getDuration());
}
}
Trace.endSection();
}
- private void handleStartKeyguardExitAnimation(long startTime, long fadeoutDuration,
- RemoteAnimationTarget[] apps, RemoteAnimationTarget[] wallpapers,
- RemoteAnimationTarget[] nonApps, IRemoteAnimationFinishedCallback finishedCallback) {
+ private void handleStartKeyguardExitAnimation(long startTime, long fadeoutDuration) {
Trace.beginSection("KeyguardViewMediator#handleStartKeyguardExitAnimation");
if (DEBUG) Log.d(TAG, "handleStartKeyguardExitAnimation startTime=" + startTime
+ " fadeoutDuration=" + fadeoutDuration);
@@ -2047,49 +2031,6 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
mWakeAndUnlocking = false;
mDismissCallbackRegistry.notifyDismissSucceeded();
mKeyguardViewControllerLazy.get().hide(startTime, fadeoutDuration);
-
- // TODO(bc-animation): When remote animation is enabled for keyguard exit animation,
- // apps, wallpapers and finishedCallback are set to non-null. nonApps is not yet
- // supported, so it's always null.
- mContext.getMainExecutor().execute(() -> {
- if (finishedCallback == null) {
- return;
- }
-
- // TODO(bc-unlock): Sample animation, just to apply alpha animation on the app.
- final SyncRtSurfaceTransactionApplier applier = new SyncRtSurfaceTransactionApplier(
- mKeyguardViewControllerLazy.get().getViewRootImpl().getView());
- final RemoteAnimationTarget primary = apps[0];
- ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
- anim.setDuration(400 /* duration */);
- anim.setInterpolator(Interpolators.LINEAR);
- anim.addUpdateListener((ValueAnimator animation) -> {
- SurfaceParams params = new SurfaceParams.Builder(primary.leash)
- .withAlpha(animation.getAnimatedFraction())
- .build();
- applier.scheduleApply(params);
- });
- anim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- try {
- finishedCallback.onAnimationFinished();
- } catch (RemoteException e) {
- Slog.e(TAG, "RemoteException");
- }
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {
- try {
- finishedCallback.onAnimationFinished();
- } catch (RemoteException e) {
- Slog.e(TAG, "RemoteException");
- }
- }
- });
- anim.start();
- });
resetKeyguardDonePendingLocked();
mHideAnimationRun = false;
adjustStatusBarLocked();
@@ -2282,55 +2223,10 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
return mKeyguardViewControllerLazy.get();
}
- /**
- * Notifies to System UI that the activity behind has now been drawn and it's safe to remove
- * the wallpaper and keyguard flag, and WindowManager has started running keyguard exit
- * animation.
- *
- * @param startTime the start time of the animation in uptime milliseconds. Deprecated.
- * @param fadeoutDuration the duration of the exit animation, in milliseconds Deprecated.
- * @deprecated Will be migrate to remote animation soon.
- */
- @Deprecated
public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) {
- startKeyguardExitAnimation(0, startTime, fadeoutDuration, null, null, null, null);
- }
-
- /**
- * Notifies to System UI that the activity behind has now been drawn and it's safe to remove
- * the wallpaper and keyguard flag, and System UI should start running keyguard exit animation.
- *
- * @param apps The list of apps to animate.
- * @param wallpapers The list of wallpapers to animate.
- * @param nonApps The list of non-app windows such as Bubbles to animate.
- * @param finishedCallback The callback to invoke when the animation is finished.
- */
- public void startKeyguardExitAnimation(@WindowManager.TransitionOldType int transit,
- RemoteAnimationTarget[] apps,
- RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps,
- IRemoteAnimationFinishedCallback finishedCallback) {
- startKeyguardExitAnimation(transit, 0, 0, apps, wallpapers, nonApps, finishedCallback);
- }
-
- /**
- * Notifies to System UI that the activity behind has now been drawn and it's safe to remove
- * the wallpaper and keyguard flag, and start running keyguard exit animation.
- *
- * @param startTime the start time of the animation in uptime milliseconds. Deprecated.
- * @param fadeoutDuration the duration of the exit animation, in milliseconds Deprecated.
- * @param apps The list of apps to animate.
- * @param wallpapers The list of wallpapers to animate.
- * @param nonApps The list of non-app windows such as Bubbles to animate.
- * @param finishedCallback The callback to invoke when the animation is finished.
- */
- private void startKeyguardExitAnimation(@WindowManager.TransitionOldType int transit,
- long startTime, long fadeoutDuration,
- RemoteAnimationTarget[] apps, RemoteAnimationTarget[] wallpapers,
- RemoteAnimationTarget[] nonApps, IRemoteAnimationFinishedCallback finishedCallback) {
Trace.beginSection("KeyguardViewMediator#startKeyguardExitAnimation");
Message msg = mHandler.obtainMessage(START_KEYGUARD_EXIT_ANIM,
- new StartKeyguardExitAnimParams(transit, startTime, fadeoutDuration, apps,
- wallpapers, nonApps, finishedCallback));
+ new StartKeyguardExitAnimParams(startTime, fadeoutDuration));
mHandler.sendMessage(msg);
Trace.endSection();
}
@@ -2404,26 +2300,12 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
private static class StartKeyguardExitAnimParams {
- @WindowManager.TransitionOldType int mTransit;
long startTime;
long fadeoutDuration;
- RemoteAnimationTarget[] mApps;
- RemoteAnimationTarget[] mWallpapers;
- RemoteAnimationTarget[] mNonApps;
- IRemoteAnimationFinishedCallback mFinishedCallback;
- private StartKeyguardExitAnimParams(@WindowManager.TransitionOldType int transit,
- long startTime, long fadeoutDuration,
- RemoteAnimationTarget[] apps, RemoteAnimationTarget[] wallpapers,
- RemoteAnimationTarget[] nonApps,
- IRemoteAnimationFinishedCallback finishedCallback) {
- this.mTransit = transit;
+ private StartKeyguardExitAnimParams(long startTime, long fadeoutDuration) {
this.startTime = startTime;
this.fadeoutDuration = fadeoutDuration;
- this.mApps = apps;
- this.mWallpapers = wallpapers;
- this.mNonApps = nonApps;
- this.mFinishedCallback = finishedCallback;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java
index d08f9736adf68..88b9c6cbddfde 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java
@@ -33,7 +33,6 @@ import android.view.RemoteAnimationTarget;
import android.view.SyncRtSurfaceTransactionApplier;
import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams;
import android.view.View;
-import android.view.WindowManager;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.policy.ScreenDecorationsUtils;
@@ -160,10 +159,8 @@ public class ActivityLaunchAnimator {
}
@Override
- public void onAnimationStart(@WindowManager.TransitionOldType int transit,
- RemoteAnimationTarget[] remoteAnimationTargets,
+ public void onAnimationStart(RemoteAnimationTarget[] remoteAnimationTargets,
RemoteAnimationTarget[] remoteAnimationWallpaperTargets,
- RemoteAnimationTarget[] remoteAnimationNonAppTargets,
IRemoteAnimationFinishedCallback iRemoteAnimationFinishedCallback)
throws RemoteException {
mMainExecutor.execute(() -> {
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 68b5da64c8c40..a407e8e1b7df2 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -222,7 +222,6 @@ import com.android.server.wm.DisplayPolicy;
import com.android.server.wm.DisplayRotation;
import com.android.server.wm.WindowManagerInternal;
import com.android.server.wm.WindowManagerInternal.AppTransitionListener;
-import com.android.server.wm.WindowManagerService;
import java.io.File;
import java.io.FileNotFoundException;
@@ -242,7 +241,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
static final String TAG = "WindowManager";
static final boolean localLOGV = false;
static final boolean DEBUG_INPUT = false;
- static final boolean DEBUG_KEYGUARD = true;
+ static final boolean DEBUG_KEYGUARD = false;
static final boolean DEBUG_SPLASH_SCREEN = false;
static final boolean DEBUG_WAKEUP = false;
static final boolean SHOW_SPLASH_SCREENS = true;
@@ -1914,7 +1913,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
handleStartTransitionForKeyguardLw(keyguardGoingAway, 0 /* duration */);
}
});
-
mKeyguardDelegate = new KeyguardServiceDelegate(mContext,
new StateCallback() {
@Override
@@ -3138,7 +3136,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private int handleStartTransitionForKeyguardLw(boolean keyguardGoingAway, long duration) {
final int res = applyKeyguardOcclusionChange();
if (res != 0) return res;
- if (!WindowManagerService.sEnableRemoteKeyguardAnimation && keyguardGoingAway) {
+ if (keyguardGoingAway) {
if (DEBUG_KEYGUARD) Slog.d(TAG, "Starting keyguard exit animation");
startKeyguardExitAnimation(SystemClock.uptimeMillis(), duration);
}
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index c77e266ee11ae..e9d64406432ab 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -1158,7 +1158,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
* @param startTime the start time of the animation in uptime milliseconds
* @param fadeoutDuration the duration of the exit animation, in milliseconds
*/
- void startKeyguardExitAnimation(long startTime, long fadeoutDuration);
+ public void startKeyguardExitAnimation(long startTime, long fadeoutDuration);
/**
* Called when System UI has been started.
diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
index a95628f633ad1..c2a1c7930b890 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
@@ -29,7 +29,6 @@ import com.android.internal.policy.IKeyguardExitCallback;
import com.android.internal.policy.IKeyguardService;
import com.android.server.UiThread;
import com.android.server.policy.WindowManagerPolicy.OnKeyguardExitResult;
-import com.android.server.wm.WindowManagerService;
import java.io.PrintWriter;
@@ -399,7 +398,7 @@ public class KeyguardServiceDelegate {
}
public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) {
- if (!WindowManagerService.sEnableRemoteKeyguardAnimation && mKeyguardService != null) {
+ if (mKeyguardService != null) {
mKeyguardService.startKeyguardExitAnimation(startTime, fadeoutDuration);
}
}
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 7262433c64455..90070c8f50686 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -90,7 +90,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerInternal.AppTransitionListener;
-import static com.android.server.wm.WindowManagerInternal.KeyguardExitAnimationStartListener;
import static com.android.server.wm.WindowStateAnimator.ROOT_TASK_CLIP_AFTER_ANIM;
import static com.android.server.wm.WindowStateAnimator.ROOT_TASK_CLIP_NONE;
@@ -258,7 +257,6 @@ public class AppTransition implements Dump {
private long mLastClipRevealTransitionDuration = DEFAULT_APP_TRANSITION_DURATION;
private final ArrayList mListeners = new ArrayList<>();
- private KeyguardExitAnimationStartListener mKeyguardExitAnimationStartListener;
private final ExecutorService mDefaultExecutor = Executors.newSingleThreadExecutor();
private int mLastClipRevealMaxTranslation;
@@ -447,7 +445,7 @@ public class AppTransition implements Dump {
AnimationAdapter.STATUS_BAR_TRANSITION_DURATION);
if (mRemoteAnimationController != null) {
- mRemoteAnimationController.goodToGo(transit);
+ mRemoteAnimationController.goodToGo();
}
return redoLayout;
}
@@ -510,11 +508,6 @@ public class AppTransition implements Dump {
mListeners.remove(listener);
}
- void registerKeygaurdExitAnimationStartListener(
- KeyguardExitAnimationStartListener listener) {
- mKeyguardExitAnimationStartListener = listener;
- }
-
public void notifyAppTransitionFinishedLocked(IBinder token) {
for (int i = 0; i < mListeners.size(); i++) {
mListeners.get(i).onAppTransitionFinishedLocked(token);
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
index 7ea49af30e4b5..582aeb36b00ba 100644
--- a/services/core/java/com/android/server/wm/AppTransitionController.java
+++ b/services/core/java/com/android/server/wm/AppTransitionController.java
@@ -102,7 +102,6 @@ public class AppTransitionController {
private final DisplayContent mDisplayContent;
private final WallpaperController mWallpaperControllerLocked;
private RemoteAnimationDefinition mRemoteAnimationDefinition = null;
- private static final int KEYGUARD_GOING_AWAY_ANIMATION_DURATION = 400;
private final ArrayMap mTempTransitionReasons = new ArrayMap<>();
@@ -438,14 +437,10 @@ public class AppTransitionController {
return adapter;
}
}
- if (mRemoteAnimationDefinition != null) {
- final RemoteAnimationAdapter adapter = mRemoteAnimationDefinition.getAdapter(
- transit, activityTypes);
- if (adapter != null) {
- return adapter;
- }
+ if (mRemoteAnimationDefinition == null) {
+ return null;
}
- return null;
+ return mRemoteAnimationDefinition.getAdapter(transit, activityTypes);
}
/**
diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java
index dc8899a56775c..a1d2072c0de78 100644
--- a/services/core/java/com/android/server/wm/RemoteAnimationController.java
+++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java
@@ -36,7 +36,6 @@ import android.view.RemoteAnimationAdapter;
import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
-import android.view.WindowManager;
import com.android.internal.protolog.ProtoLogImpl;
import com.android.internal.protolog.common.ProtoLog;
@@ -99,7 +98,7 @@ class RemoteAnimationController implements DeathRecipient {
/**
* Called when the transition is ready to be started, and all leashes have been set up.
*/
- void goodToGo(@WindowManager.TransitionOldType int transit) {
+ void goodToGo() {
ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "goodToGo()");
if (mPendingAnimations.isEmpty() || mCanceled) {
ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS,
@@ -124,15 +123,11 @@ class RemoteAnimationController implements DeathRecipient {
// Create the remote wallpaper animation targets (if any)
final RemoteAnimationTarget[] wallpaperTargets = createWallpaperAnimations();
-
- // TODO(bc-unlock): Create the remote non app animation targets (if any)
- final RemoteAnimationTarget[] nonAppTargets = null;
-
mService.mAnimator.addAfterPrepareSurfacesRunnable(() -> {
try {
linkToDeathOfRunner();
- mRemoteAnimationAdapter.getRunner().onAnimationStart(transit, appTargets,
- wallpaperTargets, nonAppTargets, mFinishedCallback);
+ mRemoteAnimationAdapter.getRunner().onAnimationStart(appTargets, wallpaperTargets,
+ mFinishedCallback);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to start remote animation", e);
onAnimationFinished();
@@ -279,7 +274,6 @@ class RemoteAnimationController implements DeathRecipient {
private void setRunningRemoteAnimation(boolean running) {
final int pid = mRemoteAnimationAdapter.getCallingPid();
final int uid = mRemoteAnimationAdapter.getCallingUid();
-
if (pid == 0) {
throw new RuntimeException("Calling pid of remote animation was null");
}
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index 63732d8d4bdc7..41854072985c2 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -47,7 +47,6 @@ import android.content.Intent;
import android.os.UserHandle;
import android.util.IntArray;
import android.util.Slog;
-import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.window.WindowContainerTransaction;
@@ -906,13 +905,6 @@ final class TaskDisplayArea extends DisplayArea {
}
}
- @Override
- RemoteAnimationTarget createRemoteAnimationTarget(
- RemoteAnimationController.RemoteAnimationRecord record) {
- final ActivityRecord activity = getTopMostActivity();
- return activity != null ? activity.createRemoteAnimationTarget(record) : null;
- }
-
SurfaceControl getSplitScreenDividerAnchor() {
return mSplitScreenDividerAnchor;
}
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 98eb11f8a9704..46aea23beaf61 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -372,6 +372,8 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
dc.mWallpaperController.startWallpaperAnimation(anim);
}
}
+ }
+ if (transit == TRANSIT_KEYGUARD_GOING_AWAY) {
dc.startKeyguardExitOnNonAppWindows(
(flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER) != 0,
(flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0,
diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java
index eed3299cc93da..a3a9eb773abff 100644
--- a/services/core/java/com/android/server/wm/WindowManagerInternal.java
+++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java
@@ -26,11 +26,9 @@ import android.hardware.display.DisplayManagerInternal;
import android.os.IBinder;
import android.view.Display;
import android.view.IInputFilter;
-import android.view.IRemoteAnimationFinishedCallback;
import android.view.IWindow;
import android.view.InputChannel;
import android.view.MagnificationSpec;
-import android.view.RemoteAnimationTarget;
import android.view.WindowInfo;
import android.view.WindowManager.DisplayImePolicy;
@@ -155,21 +153,6 @@ public abstract class WindowManagerInternal {
public void onAppTransitionFinishedLocked(IBinder token) {}
}
- /**
- * An interface to be notified when keyguard exit animation should start.
- */
- public interface KeyguardExitAnimationStartListener {
- /**
- * Called when keyguard exit animation should start.
- * @param apps The list of apps to animate.
- * @param wallpapers The list of wallpapers to animate.
- * @param finishedCallback The callback to invoke when the animation is finished.
- */
- void onAnimationStart(RemoteAnimationTarget[] apps,
- RemoteAnimationTarget[] wallpapers,
- IRemoteAnimationFinishedCallback finishedCallback);
- }
-
/**
* An interface to be notified about hardware keyboard status.
*/
@@ -388,14 +371,6 @@ public abstract class WindowManagerInternal {
*/
public abstract void registerAppTransitionListener(AppTransitionListener listener);
- /**
- * Registers a listener to be notified to start the keyguard exit animation.
- *
- * @param listener The listener to register.
- */
- public abstract void registerKeyguardExitAnimationStartListener(
- KeyguardExitAnimationStartListener listener);
-
/**
* Reports that the password for the given user has changed.
*/
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index dcefd30cffcf0..931f52933e2af 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -404,8 +404,6 @@ public class WindowManagerService extends IWindowManager.Stub
// trying to apply a new one.
private static final boolean ALWAYS_KEEP_CURRENT = true;
- static final int LOGTAG_INPUT_FOCUS = 62001;
-
/**
* Restrict ability of activities overriding transition animation in a way such that
* an activity can do it only when the transition happens within a same task.
@@ -414,6 +412,7 @@ public class WindowManagerService extends IWindowManager.Stub
*/
private static final String DISABLE_CUSTOM_TASK_ANIMATION_PROPERTY =
"persist.wm.disable_custom_task_animation";
+ static final int LOGTAG_INPUT_FOCUS = 62001;
/**
* @see #DISABLE_CUSTOM_TASK_ANIMATION_PROPERTY
@@ -421,19 +420,6 @@ public class WindowManagerService extends IWindowManager.Stub
static boolean sDisableCustomTaskAnimationProperty =
SystemProperties.getBoolean(DISABLE_CUSTOM_TASK_ANIMATION_PROPERTY, true);
- /**
- * Run Keyguard animation as remote animation in System UI instead of local animation in
- * the server process.
- */
- private static final String ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY =
- "persist.wm.enable_remote_keyguard_animation";
-
- /**
- * @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
- */
- public static boolean sEnableRemoteKeyguardAnimation =
- SystemProperties.getBoolean(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, false);
-
private static final String DISABLE_TRIPLE_BUFFERING_PROPERTY =
"ro.sf.disable_triple_buffer";
@@ -7717,15 +7703,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- @Override
- public void registerKeyguardExitAnimationStartListener(
- KeyguardExitAnimationStartListener listener) {
- synchronized (mGlobalLock) {
- getDefaultDisplayContentLocked().mAppTransition
- .registerKeygaurdExitAnimationStartListener(listener);
- }
- }
-
@Override
public void reportPasswordChanged(int userId) {
mKeyguardDisableHandler.updateKeyguardEnabled(userId);
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index f97a10f034210..de2cc761c2c56 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -679,10 +679,8 @@ public class ActivityRecordTests extends WindowTestsBase {
new RemoteAnimationAdapter(new Stub() {
@Override
- public void onAnimationStart(@WindowManager.TransitionOldType int transit,
- RemoteAnimationTarget[] apps,
+ public void onAnimationStart(RemoteAnimationTarget[] apps,
RemoteAnimationTarget[] wallpapers,
- RemoteAnimationTarget[] nonApps,
IRemoteAnimationFinishedCallback finishedCallback) {
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java
index 71f19148d6165..91b9449eddb05 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java
@@ -36,7 +36,6 @@ import android.view.IRemoteAnimationRunner;
import android.view.RemoteAnimationAdapter;
import android.view.RemoteAnimationDefinition;
import android.view.RemoteAnimationTarget;
-import android.view.WindowManager;
import androidx.test.filters.SmallTest;
@@ -71,10 +70,8 @@ public class AppChangeTransitionTests extends WindowTestsBase {
class TestRemoteAnimationRunner implements IRemoteAnimationRunner {
@Override
- public void onAnimationStart(@WindowManager.TransitionOldType int transit,
- RemoteAnimationTarget[] apps,
+ public void onAnimationStart(RemoteAnimationTarget[] apps,
RemoteAnimationTarget[] wallpapers,
- RemoteAnimationTarget[] nonApps,
IRemoteAnimationFinishedCallback finishedCallback) {
for (RemoteAnimationTarget target : apps) {
assertNotNull(target.startBounds);
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
index 83aca5e2d4829..f1e36098d84e0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
@@ -265,10 +265,8 @@ public class AppTransitionTests extends WindowTestsBase {
private class TestRemoteAnimationRunner implements IRemoteAnimationRunner {
boolean mCancelled = false;
@Override
- public void onAnimationStart(@WindowManager.TransitionOldType int transit,
- RemoteAnimationTarget[] apps,
+ public void onAnimationStart(RemoteAnimationTarget[] apps,
RemoteAnimationTarget[] wallpapers,
- RemoteAnimationTarget[] nonApps,
IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException {
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
index 15e045c85c29f..2efd4b53efccb 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
@@ -17,9 +17,6 @@
package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
-import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_NONE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.atLeast;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
@@ -103,18 +100,15 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
new Point(50, 100), null, new Rect(50, 100, 150, 150), null).mAdapter;
adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
mFinishedCallback);
- mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
+ mController.goodToGo();
mWm.mAnimator.executeAfterPrepareSurfacesRunnables();
final ArgumentCaptor appsCaptor =
ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
final ArgumentCaptor wallpapersCaptor =
ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
- final ArgumentCaptor nonApsCaptor =
- ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
final ArgumentCaptor finishedCaptor =
ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
- verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_ACTIVITY_OPEN),
- appsCaptor.capture(), wallpapersCaptor.capture(), nonApsCaptor.capture(),
+ verify(mMockRunner).onAnimationStart(appsCaptor.capture(), wallpapersCaptor.capture(),
finishedCaptor.capture());
assertEquals(1, appsCaptor.getValue().length);
final RemoteAnimationTarget app = appsCaptor.getValue()[0];
@@ -142,7 +136,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
new Point(50, 100), null, new Rect(50, 100, 150, 150), null).mAdapter;
adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
mFinishedCallback);
- mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
+ mController.goodToGo();
adapter.onAnimationCancelled(mMockLeash);
verify(mMockRunner).onAnimationCancelled();
@@ -155,7 +149,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
new Point(50, 100), null, new Rect(50, 100, 150, 150), null).mAdapter;
adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
mFinishedCallback);
- mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
+ mController.goodToGo();
mClock.fastForward(2500);
mHandler.timeAdvance();
@@ -176,7 +170,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
null).mAdapter;
adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
mFinishedCallback);
- mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
+ mController.goodToGo();
mClock.fastForward(2500);
mHandler.timeAdvance();
@@ -196,7 +190,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
@Test
public void testZeroAnimations() {
- mController.goodToGo(TRANSIT_OLD_NONE);
+ mController.goodToGo();
verifyNoMoreInteractionsExceptAsBinder(mMockRunner);
}
@@ -205,7 +199,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
mController.createRemoteAnimationRecord(win.mActivityRecord,
new Point(50, 100), null, new Rect(50, 100, 150, 150), null);
- mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
+ mController.goodToGo();
verifyNoMoreInteractionsExceptAsBinder(mMockRunner);
}
@@ -219,18 +213,15 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
new Point(50, 100), null, new Rect(50, 100, 150, 150), null).mAdapter;
adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
mFinishedCallback);
- mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
+ mController.goodToGo();
mWm.mAnimator.executeAfterPrepareSurfacesRunnables();
final ArgumentCaptor appsCaptor =
ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
final ArgumentCaptor wallpapersCaptor =
ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
- final ArgumentCaptor nonAppsCaptor =
- ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
final ArgumentCaptor finishedCaptor =
ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
- verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_ACTIVITY_OPEN),
- appsCaptor.capture(), wallpapersCaptor.capture(), nonAppsCaptor.capture(),
+ verify(mMockRunner).onAnimationStart(appsCaptor.capture(), wallpapersCaptor.capture(),
finishedCaptor.capture());
assertEquals(1, appsCaptor.getValue().length);
assertEquals(mMockLeash, appsCaptor.getValue()[0].leash);
@@ -244,7 +235,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
mFinishedCallback);
win.mActivityRecord.removeImmediately();
- mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
+ mController.goodToGo();
verifyNoMoreInteractionsExceptAsBinder(mMockRunner);
verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION),
eq(adapter));
@@ -264,18 +255,15 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
mFinishedCallback);
((AnimationAdapter) record.mThumbnailAdapter).startAnimation(mMockThumbnailLeash,
mMockTransaction, ANIMATION_TYPE_WINDOW_ANIMATION, mThumbnailFinishedCallback);
- mController.goodToGo(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE);
+ mController.goodToGo();
mWm.mAnimator.executeAfterPrepareSurfacesRunnables();
final ArgumentCaptor appsCaptor =
ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
final ArgumentCaptor wallpapersCaptor =
ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
- final ArgumentCaptor nonAppsCaptor =
- ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
final ArgumentCaptor finishedCaptor =
ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
- verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE),
- appsCaptor.capture(), wallpapersCaptor.capture(), nonAppsCaptor.capture(),
+ verify(mMockRunner).onAnimationStart(appsCaptor.capture(), wallpapersCaptor.capture(),
finishedCaptor.capture());
assertEquals(1, appsCaptor.getValue().length);
final RemoteAnimationTarget app = appsCaptor.getValue()[0];
@@ -317,18 +305,15 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
mFinishedCallback);
((AnimationAdapter) record.mThumbnailAdapter).startAnimation(mMockThumbnailLeash,
mMockTransaction, ANIMATION_TYPE_WINDOW_ANIMATION, mThumbnailFinishedCallback);
- mController.goodToGo(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE);
+ mController.goodToGo();
mWm.mAnimator.executeAfterPrepareSurfacesRunnables();
final ArgumentCaptor appsCaptor =
ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
final ArgumentCaptor wallpapersCaptor =
ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
- final ArgumentCaptor nonAppsCaptor =
- ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
final ArgumentCaptor finishedCaptor =
ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
- verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE),
- appsCaptor.capture(), wallpapersCaptor.capture(), nonAppsCaptor.capture(),
+ verify(mMockRunner).onAnimationStart(appsCaptor.capture(), wallpapersCaptor.capture(),
finishedCaptor.capture());
assertEquals(1, appsCaptor.getValue().length);
final RemoteAnimationTarget app = appsCaptor.getValue()[0];
@@ -369,18 +354,15 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
new Point(50, 100), null, new Rect(50, 100, 150, 150), null).mAdapter;
adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
mFinishedCallback);
- mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
+ mController.goodToGo();
mWm.mAnimator.executeAfterPrepareSurfacesRunnables();
final ArgumentCaptor appsCaptor =
ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
final ArgumentCaptor wallpapersCaptor =
ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
- final ArgumentCaptor nonAppsCaptor =
- ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
final ArgumentCaptor finishedCaptor =
ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
- verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_ACTIVITY_OPEN),
- appsCaptor.capture(), wallpapersCaptor.capture(), nonAppsCaptor.capture(),
+ verify(mMockRunner).onAnimationStart(appsCaptor.capture(), wallpapersCaptor.capture(),
finishedCaptor.capture());
assertEquals(1, wallpapersCaptor.getValue().length);
} finally {
@@ -401,18 +383,15 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
new Point(50, 100), null, new Rect(50, 100, 150, 150), null).mAdapter;
adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
mFinishedCallback);
- mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
+ mController.goodToGo();
mWm.mAnimator.executeAfterPrepareSurfacesRunnables();
final ArgumentCaptor appsCaptor =
ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
final ArgumentCaptor wallpapersCaptor =
ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
- final ArgumentCaptor nonAPpsCaptor =
- ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
final ArgumentCaptor finishedCaptor =
ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
- verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_ACTIVITY_OPEN),
- appsCaptor.capture(), wallpapersCaptor.capture(), nonAPpsCaptor.capture(),
+ verify(mMockRunner).onAnimationStart(appsCaptor.capture(), wallpapersCaptor.capture(),
finishedCaptor.capture());
assertEquals(1, wallpapersCaptor.getValue().length);
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
index 99c96bd0de1bd..df5b48a038f31 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -66,7 +66,6 @@ import android.view.RemoteAnimationAdapter;
import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
-import android.view.WindowManager;
import androidx.test.filters.SmallTest;
@@ -906,10 +905,8 @@ public class WindowContainerTests extends WindowTestsBase {
final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter(
new IRemoteAnimationRunner.Stub() {
@Override
- public void onAnimationStart(@WindowManager.TransitionOldType int transit,
- RemoteAnimationTarget[] apps,
+ public void onAnimationStart(RemoteAnimationTarget[] apps,
RemoteAnimationTarget[] wallpapers,
- RemoteAnimationTarget[] nonApps,
IRemoteAnimationFinishedCallback finishedCallback) {
try {
finishedCallback.onAnimationFinished();
From d00fd92dc885074889273107fa05cbd524841afc Mon Sep 17 00:00:00 2001
From: Matt Pietal
Date: Wed, 3 Feb 2021 09:51:04 -0500
Subject: [PATCH 002/176] Keyguard SIM PIN: Fix height
Some views within the KeyguardSecurityViewFlipper limit their height,
while others do not. When a view is marked as GONE, as when the
ViewFlipper changes the focused child, disregard those views from the
custom max height measurement as not to interfere with normal measurement.
Fixes: 178412096
Test: use password or pattern bouncer, go back to aod/ls, reinsert
locked SIM
Change-Id: I06047bcd8fb7c11eb0bac272f28147e08b18988d
(cherry picked from commit 28217d1c010a6f195d5900e6e81150630bcf1933)
---
.../src/com/android/keyguard/KeyguardSecurityViewFlipper.java | 2 ++
1 file changed, 2 insertions(+)
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java
index 7773fe9fab755..75ef4b32dfdaa 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java
@@ -128,6 +128,8 @@ public class KeyguardSecurityViewFlipper extends ViewFlipper {
final int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
+ if (child.getVisibility() != View.VISIBLE) continue;
+
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
if (lp.maxWidth > 0 && lp.maxWidth < maxWidth) {
From 0dbc01969842d8542ac8efe72d90d57b895d0739 Mon Sep 17 00:00:00 2001
From: Winson Chung
Date: Thu, 4 Feb 2021 21:57:57 +0000
Subject: [PATCH 003/176] Revert "Sandbox letterbox and size compat apps"
This reverts commit 4d3f1c5681c4db99ffb4be881cee134b750542eb.
Reason for revert: b/179308296
Change-Id: Idccf97038d5aa92268a13bacc512215878e8aefa
(cherry picked from commit 0ba6185639c20ee8a55cf697aad00716b14d22e9)
---
core/java/android/view/Display.java | 80 +--
core/java/android/view/DisplayInfo.java | 19 -
.../src/android/view/DisplayTests.java | 527 ------------------
data/etc/services.core.protolog.json | 18 +-
.../com/android/server/wm/ActivityRecord.java | 31 --
.../core/java/com/android/server/wm/Task.java | 12 -
.../android/server/wm/SizeCompatTests.java | 209 ++-----
.../android/server/wm/TestDisplayContent.java | 5 -
8 files changed, 67 insertions(+), 834 deletions(-)
delete mode 100644 core/tests/mockingcoretests/src/android/view/DisplayTests.java
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 41680647ad576..0ba1dfee16f39 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -25,8 +25,8 @@ import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.TestApi;
import android.app.KeyguardManager;
-import android.app.WindowConfiguration;
import android.compat.annotation.UnsupportedAppUsage;
+import android.content.Context;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -59,8 +59,12 @@ import java.util.List;
* an application window, excluding the system decorations. The application display area may
* be smaller than the real display area because the system subtracts the space needed
* for decor elements such as the status bar. Use {@link WindowMetrics#getBounds()} to query the
- * application window bounds. Generally, use {@link WindowManager#getCurrentWindowMetrics()} to
- * query the metrics and perform UI-related actions.
+ * application window bounds.
+ * The real display area specifies the part of the display that contains content
+ * including the system decorations. Even so, the real display area may be smaller than the
+ * physical size of the display if the window manager is emulating a smaller display
+ * using (adb shell wm size). Use the following methods to query the
+ * real display area: {@link #getRealSize}, {@link #getRealMetrics}.
*
*
* A logical display does not necessarily represent a particular physical display device
@@ -673,9 +677,9 @@ public final class Display {
@UnsupportedAppUsage
public DisplayAdjustments getDisplayAdjustments() {
if (mResources != null) {
- final DisplayAdjustments currentAdjustments = mResources.getDisplayAdjustments();
- if (!mDisplayAdjustments.equals(currentAdjustments)) {
- mDisplayAdjustments = new DisplayAdjustments(currentAdjustments);
+ final DisplayAdjustments currentAdjustements = mResources.getDisplayAdjustments();
+ if (!mDisplayAdjustments.equals(currentAdjustements)) {
+ mDisplayAdjustments = new DisplayAdjustments(currentAdjustements);
}
}
@@ -1213,34 +1217,30 @@ public final class Display {
}
/**
- * Provides the largest {@link Point outSize} an app may expect in the current system state,
- * without subtracting any window decor.
+ * Gets the real size of the display without subtracting any window decor or
+ * applying any compatibility scale factors.
*
- * The size describes the largest potential area the window might occupy. The size is adjusted
- * based on the current rotation of the display.
+ * The size is adjusted based on the current rotation of the display.
*
* The real size may be smaller than the physical size of the screen when the
* window manager is emulating a smaller display (using adb shell wm size).
- *
+ *
+ * In general, {@link #getRealSize(Point)} and {@link WindowManager#getMaximumWindowMetrics()}
+ * report the same bounds except that certain areas of the display may not be available to
+ * windows created in the {@link WindowManager}'s {@link Context}.
+ *
+ * For example, imagine a device which has a multi-task mode that limits windows to half of the
+ * screen. In this case, {@link WindowManager#getMaximumWindowMetrics()} reports the
+ * bounds of the screen half where the window is located, while {@link #getRealSize(Point)}
+ * still reports the bounds of the whole display.
*
* @param outSize Set to the real size of the display.
+ *
+ * @see WindowManager#getMaximumWindowMetrics()
*/
public void getRealSize(Point outSize) {
synchronized (this) {
updateDisplayInfoLocked();
- if (shouldReportMaxBounds()) {
- final Rect bounds = mResources.getConfiguration()
- .windowConfiguration.getMaxBounds();
- outSize.x = bounds.width();
- outSize.y = bounds.height();
- if (DEBUG) {
- Log.d(TAG, "getRealSize determined from max bounds: " + outSize
- + " for uid " + Process.myUid());
- }
- // Skip adjusting by fixed rotation, since if it is necessary, the configuration
- // should already reflect the expected rotation.
- return;
- }
outSize.x = mDisplayInfo.logicalWidth;
outSize.y = mDisplayInfo.logicalHeight;
if (mMayAdjustByFixedRotation) {
@@ -1250,11 +1250,9 @@ public final class Display {
}
/**
- * Provides the largest {@link DisplayMetrics outMetrics} an app may expect in the current
- * system state, without subtracting any window decor.
+ * Gets display metrics based on the real size of this display.
*
- * The size describes the largest potential area the window might occupy. The size is adjusted
- * based on the current rotation of the display.
+ * The size is adjusted based on the current rotation of the display.
*
* The real size may be smaller than the physical size of the screen when the
* window manager is emulating a smaller display (using adb shell wm size).
@@ -1265,18 +1263,6 @@ public final class Display {
public void getRealMetrics(DisplayMetrics outMetrics) {
synchronized (this) {
updateDisplayInfoLocked();
- if (shouldReportMaxBounds()) {
- mDisplayInfo.getMaxBoundsMetrics(outMetrics,
- CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO,
- mResources.getConfiguration());
- if (DEBUG) {
- Log.d(TAG, "getRealMetrics determined from max bounds: " + outMetrics
- + " for uid " + Process.myUid());
- }
- // Skip adjusting by fixed rotation, since if it is necessary, the configuration
- // should already reflect the expected rotation.
- return;
- }
mDisplayInfo.getLogicalMetrics(outMetrics,
CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null);
if (mMayAdjustByFixedRotation) {
@@ -1285,20 +1271,6 @@ public final class Display {
}
}
- /**
- * Determines if {@link WindowConfiguration#getMaxBounds()} should be reported as the
- * display dimensions. The max bounds field may be smaller than the logical dimensions
- * when apps need to be sandboxed.
- * @return {@code true} when max bounds should be applied.
- */
- private boolean shouldReportMaxBounds() {
- if (mResources == null) {
- return false;
- }
- final Configuration config = mResources.getConfiguration();
- return config != null && !config.windowConfiguration.getMaxBounds().isEmpty();
- }
-
/**
* Gets the state of the display, such as whether it is on or off.
*
diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java
index 8a445041a1f2d..2a00b5a2e5135 100644
--- a/core/java/android/view/DisplayInfo.java
+++ b/core/java/android/view/DisplayInfo.java
@@ -24,7 +24,6 @@ import static android.view.DisplayInfoProto.LOGICAL_WIDTH;
import static android.view.DisplayInfoProto.NAME;
import android.annotation.Nullable;
-import android.app.WindowConfiguration;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
@@ -616,29 +615,11 @@ public final class DisplayInfo implements Parcelable {
getMetricsWithSize(outMetrics, ci, configuration, appWidth, appHeight);
}
- /**
- * Populates {@code outMetrics} with details of the logical display. Bounds are limited
- * by the logical size of the display.
- *
- * @param outMetrics the {@link DisplayMetrics} to be populated
- * @param compatInfo the {@link CompatibilityInfo} to be applied
- * @param configuration the {@link Configuration}
- */
public void getLogicalMetrics(DisplayMetrics outMetrics, CompatibilityInfo compatInfo,
Configuration configuration) {
getMetricsWithSize(outMetrics, compatInfo, configuration, logicalWidth, logicalHeight);
}
- /**
- * Similar to {@link #getLogicalMetrics}, but the limiting bounds are determined from
- * {@link WindowConfiguration#getMaxBounds()}
- */
- public void getMaxBoundsMetrics(DisplayMetrics outMetrics, CompatibilityInfo compatInfo,
- Configuration configuration) {
- Rect bounds = configuration.windowConfiguration.getMaxBounds();
- getMetricsWithSize(outMetrics, compatInfo, configuration, bounds.width(), bounds.height());
- }
-
public int getNaturalWidth() {
return rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180 ?
logicalWidth : logicalHeight;
diff --git a/core/tests/mockingcoretests/src/android/view/DisplayTests.java b/core/tests/mockingcoretests/src/android/view/DisplayTests.java
deleted file mode 100644
index 5a3ea35b1194f..0000000000000
--- a/core/tests/mockingcoretests/src/android/view/DisplayTests.java
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view;
-
-import static android.view.Display.DEFAULT_DISPLAY;
-import static android.view.Surface.ROTATION_0;
-import static android.view.Surface.ROTATION_90;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.hardware.display.DisplayManagerGlobal;
-import android.util.DisplayMetrics;
-import android.view.DisplayAdjustments.FixedRotationAdjustments;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.dx.mockito.inline.extended.StaticMockitoSession;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mockito;
-import org.mockito.quality.Strictness;
-
-import java.util.function.Consumer;
-
-/**
- * Tests for {@link Display}.
- *
- *
Build/Install/Run:
- *
- * atest FrameworksMockingCoreTests:android.view.DisplayTests
- */
-@RunWith(AndroidJUnit4.class)
-public class DisplayTests {
-
- private static final int APP_WIDTH = 272;
- private static final int APP_HEIGHT = 700;
- // Tablet size device, ROTATION_0 corresponds to portrait.
- private static final int LOGICAL_WIDTH = 700;
- private static final int LOGICAL_HEIGHT = 1800;
-
- // Bounds of the app when the device is in portrait mode.
- private static Rect sAppBoundsPortrait = buildAppBounds(LOGICAL_WIDTH, LOGICAL_HEIGHT);
- private static Rect sAppBoundsLandscape = buildAppBounds(LOGICAL_HEIGHT, LOGICAL_WIDTH);
-
- private StaticMockitoSession mMockitoSession;
-
- private DisplayManagerGlobal mDisplayManagerGlobal;
- private Context mApplicationContext;
- private DisplayInfo mDisplayInfo = new DisplayInfo();
-
- @Before
- public void setupTests() {
- mMockitoSession = mockitoSession()
- .mockStatic(DisplayManagerGlobal.class)
- .strictness(Strictness.LENIENT)
- .startMocking();
-
- // Ensure no adjustments are set before each test.
- mApplicationContext = ApplicationProvider.getApplicationContext();
- DisplayAdjustments displayAdjustments =
- mApplicationContext.getResources().getDisplayAdjustments();
- displayAdjustments.setFixedRotationAdjustments(null);
- mApplicationContext.getResources().overrideDisplayAdjustments(null);
- mApplicationContext.getResources().getConfiguration().windowConfiguration.setAppBounds(
- null);
- mApplicationContext.getResources().getConfiguration().windowConfiguration.setMaxBounds(
- null);
- mDisplayInfo.rotation = ROTATION_0;
-
- mDisplayManagerGlobal = mock(DisplayManagerGlobal.class);
- doReturn(mDisplayInfo).when(mDisplayManagerGlobal).getDisplayInfo(anyInt());
- }
-
- @After
- public void teardownTests() {
- if (mMockitoSession != null) {
- mMockitoSession.finishMocking();
- }
- Mockito.framework().clearInlineMocks();
- }
-
- @Test
- public void testConstructor_defaultDisplayAdjustments_matchesDisplayInfo() {
- setDisplayInfoPortrait(mDisplayInfo);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS);
- assertThat(display.getDisplayAdjustments()).isEqualTo(
- DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS);
- DisplayInfo actualDisplayInfo = new DisplayInfo();
- display.getDisplayInfo(actualDisplayInfo);
- verifyDisplayInfo(actualDisplayInfo, mDisplayInfo);
- }
-
- @Test
- public void testConstructor_defaultResources_matchesDisplayInfo() {
- setDisplayInfoPortrait(mDisplayInfo);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- assertThat(display.getDisplayAdjustments()).isEqualTo(
- mApplicationContext.getResources().getDisplayAdjustments());
- DisplayInfo actualDisplayInfo = new DisplayInfo();
- display.getDisplayInfo(actualDisplayInfo);
- verifyDisplayInfo(actualDisplayInfo, mDisplayInfo);
- }
-
- @Test
- public void testGetRotation_defaultDisplayAdjustments_rotationNotAdjusted() {
- setDisplayInfoPortrait(mDisplayInfo);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS);
- assertThat(display.getRotation()).isEqualTo(ROTATION_0);
- }
-
- @Test
- public void testGetRotation_displayAdjustmentsWithoutOverride_rotationNotAdjusted() {
- // GIVEN display is not rotated.
- setDisplayInfoPortrait(mDisplayInfo);
- // GIVEN fixed rotation adjustments are rotated, but no override is set.
- DisplayAdjustments displayAdjustments = DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
- final FixedRotationAdjustments fixedRotationAdjustments =
- new FixedRotationAdjustments(ROTATION_90, APP_WIDTH, APP_HEIGHT,
- DisplayCutout.NO_CUTOUT);
- displayAdjustments.setFixedRotationAdjustments(fixedRotationAdjustments);
- // GIVEN display is constructed with display adjustments.
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- displayAdjustments);
- // THEN rotation is not adjusted since no override was set.
- assertThat(display.getRotation()).isEqualTo(ROTATION_0);
- }
-
- @Test
- public void testGetRotation_resourcesWithoutOverride_rotationNotAdjusted() {
- // GIVEN display is not rotated.
- setDisplayInfoPortrait(mDisplayInfo);
- // GIVEN fixed rotation adjustments are rotated, but no override is set.
- setFixedRotationAdjustments(mApplicationContext.getResources(), ROTATION_90);
- // GIVEN display is constructed with default resources.
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN rotation is not adjusted since no override is set.
- assertThat(display.getRotation()).isEqualTo(ROTATION_0);
- }
-
- @Test
- public void testGetRotation_resourcesWithOverrideDisplayAdjustments_rotationAdjusted() {
- // GIVEN display is not rotated.
- setDisplayInfoPortrait(mDisplayInfo);
- // GIVEN fixed rotation adjustments are rotated, and an override is set.
- setOverrideFixedRotationAdjustments(mApplicationContext.getResources(), ROTATION_90);
- // GIVEN display is constructed with default resources.
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN rotation is adjusted since an override is set.
- assertThat(display.getRotation()).isEqualTo(ROTATION_90);
- }
-
- @Test
- public void testGetRealSize_defaultResourcesPortrait_matchesLogicalSize() {
- // GIVEN display is not rotated.
- setDisplayInfoPortrait(mDisplayInfo);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real size matches display orientation.
- verifyRealSizeIsPortrait(display);
- }
-
- @Test
- public void testGetRealSize_defaultResourcesLandscape_matchesRotatedLogicalSize() {
- // GIVEN display is rotated.
- setDisplayInfoLandscape(mDisplayInfo);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real size matches display orientation.
- verifyRealSizeIsLandscape(display);
- }
-
- @Test
- public void testGetRealSize_defaultDisplayAdjustmentsPortrait_matchesLogicalSize() {
- // GIVEN display is not rotated.
- setDisplayInfoPortrait(mDisplayInfo);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS);
- // THEN real size matches display orientation.
- verifyRealSizeIsPortrait(display);
- }
-
- @Test
- public void testGetRealSize_defaultDisplayAdjustmentsLandscape_matchesLogicalSize() {
- // GIVEN display is rotated.
- setDisplayInfoLandscape(mDisplayInfo);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS);
- // THEN real size matches display orientation.
- verifyRealSizeIsLandscape(display);
- }
-
- @Test
- public void testGetRealSize_resourcesPortraitWithFixedRotation_notRotatedLogicalSize() {
- // GIVEN display is rotated.
- setDisplayInfoLandscape(mDisplayInfo);
- // GIVEN fixed rotation adjustments are rotated.
- setFixedRotationAdjustments(mApplicationContext.getResources(), ROTATION_0);
- // GIVEN display is constructed with default resources.
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real size matches display orientation.
- verifyRealSizeIsLandscape(display);
- }
-
- @Test
- public void testGetRealSize_resourcesWithLandscapeFixedRotation_notRotatedLogicalSize() {
- // GIVEN display is not rotated.
- setDisplayInfoPortrait(mDisplayInfo);
- // GIVEN fixed rotation adjustments are rotated.
- setFixedRotationAdjustments(mApplicationContext.getResources(), ROTATION_90);
- // GIVEN display is constructed with default resources.
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real size matches display orientation.
- verifyRealSizeIsPortrait(display);
- }
-
- @Test
- public void testGetRealSize_resourcesWithPortraitOverrideRotation_rotatedLogicalSize() {
- // GIVEN display is rotated.
- setDisplayInfoLandscape(mDisplayInfo);
- // GIVEN fixed rotation adjustments are rotated, and an override is set.
- setOverrideFixedRotationAdjustments(mApplicationContext.getResources(), ROTATION_0);
- // GIVEN display is constructed with default resources.
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real size matches app orientation.
- verifyRealSizeIsPortrait(display);
- }
-
- @Test
- public void testGetRealSize_resourcesWithLandscapeOverrideRotation_rotatedLogicalSize() {
- // GIVEN display is not rotated.
- setDisplayInfoPortrait(mDisplayInfo);
- // GIVEN fixed rotation adjustments are rotated, and an override is set.
- setOverrideFixedRotationAdjustments(mApplicationContext.getResources(), ROTATION_90);
- // GIVEN display is constructed with default resources.
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real size matches app orientation.
- verifyRealSizeIsLandscape(display);
- }
-
- @Test
- public void testGetRealSize_resourcesPortraitSandboxed_matchesSandboxBounds() {
- // GIVEN display is not rotated.
- setDisplayInfoPortrait(mDisplayInfo);
- // GIVEN app is letterboxed.
- setMaxBoundsSandboxedToMatchAppBounds(mApplicationContext.getResources(),
- sAppBoundsPortrait);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real size matches app bounds.
- verifyRealSizeMatchesApp(display, sAppBoundsPortrait);
- }
-
- @Test
- public void testGetRealSize_resourcesLandscapeSandboxed_matchesSandboxBounds() {
- // GIVEN display is rotated.
- setDisplayInfoLandscape(mDisplayInfo);
- // GIVEN app is letterboxed.
- setMaxBoundsSandboxedToMatchAppBounds(mApplicationContext.getResources(),
- sAppBoundsLandscape);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real size matches app bounds.
- verifyRealSizeMatchesApp(display, sAppBoundsLandscape);
- }
-
- @Test
- public void testGetRealMetrics_defaultResourcesPortrait_matchesLogicalSize() {
- // GIVEN display is not rotated.
- setDisplayInfoPortrait(mDisplayInfo);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real metrics matches display orientation.
- verifyRealMetricsIsPortrait(display);
- }
-
- @Test
- public void testGetRealMetrics_defaultResourcesLandscape_matchesRotatedLogicalSize() {
- // GIVEN display is rotated.
- setDisplayInfoLandscape(mDisplayInfo);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real metrics matches display orientation.
- verifyRealMetricsIsLandscape(display);
- }
-
- @Test
- public void testGetRealMetrics_defaultDisplayAdjustmentsPortrait_matchesLogicalSize() {
- // GIVEN display is not rotated.
- setDisplayInfoPortrait(mDisplayInfo);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS);
- // THEN real metrics matches display orientation.
- verifyRealMetricsIsPortrait(display);
- }
-
- @Test
- public void testGetRealMetrics_defaultDisplayAdjustmentsLandscape_matchesLogicalSize() {
- // GIVEN display is rotated.
- setDisplayInfoLandscape(mDisplayInfo);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS);
- // THEN real metrics matches display orientation.
- verifyRealMetricsIsLandscape(display);
- }
-
- @Test
- public void testGetRealMetrics_resourcesPortraitWithFixedRotation_notRotatedLogicalSize() {
- // GIVEN display is rotated.
- setDisplayInfoLandscape(mDisplayInfo);
- // GIVEN fixed rotation adjustments are rotated.
- setFixedRotationAdjustments(mApplicationContext.getResources(), ROTATION_0);
- // GIVEN display is constructed with default resources.
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real metrics matches display orientation.
- verifyRealMetricsIsLandscape(display);
- }
-
- @Test
- public void testGetRealMetrics_resourcesWithLandscapeFixedRotation_notRotatedLogicalSize() {
- // GIVEN display is not rotated.
- setDisplayInfoPortrait(mDisplayInfo);
- // GIVEN fixed rotation adjustments are rotated.
- setFixedRotationAdjustments(mApplicationContext.getResources(), ROTATION_90);
- // GIVEN display is constructed with default resources.
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real metrics matches display orientation.
- verifyRealMetricsIsPortrait(display);
- }
-
- @Test
- public void testGetRealMetrics_resourcesWithPortraitOverrideRotation_rotatedLogicalSize() {
- // GIVEN display is rotated.
- setDisplayInfoLandscape(mDisplayInfo);
- // GIVEN fixed rotation adjustments are rotated with an override.
- setOverrideFixedRotationAdjustments(mApplicationContext.getResources(), ROTATION_0);
- // GIVEN display is constructed with default resources.
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real metrics matches app orientation.
- verifyRealMetricsIsPortrait(display);
- }
-
- @Test
- public void testGetRealMetrics_resourcesWithLandscapeOverrideRotation_rotatedLogicalSize() {
- // GIVEN display is not rotated.
- setDisplayInfoPortrait(mDisplayInfo);
- // GIVEN fixed rotation adjustments are rotated.
- setOverrideFixedRotationAdjustments(mApplicationContext.getResources(), ROTATION_90);
- // GIVEN display is constructed with default resources.
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real metrics matches app orientation.
- verifyRealMetricsIsLandscape(display);
- }
-
- @Test
- public void testGetRealMetrics_resourcesPortraitSandboxed_matchesSandboxBounds() {
- // GIVEN display is not rotated.
- setDisplayInfoPortrait(mDisplayInfo);
- // GIVEN app is letterboxed.
- setMaxBoundsSandboxedToMatchAppBounds(mApplicationContext.getResources(),
- sAppBoundsPortrait);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real metrics matches app bounds.
- verifyRealMetricsMatchesApp(display, sAppBoundsPortrait);
- }
-
- @Test
- public void testGetRealMetrics_resourcesLandscapeSandboxed_matchesSandboxBounds() {
- // GIVEN display is rotated.
- setDisplayInfoLandscape(mDisplayInfo);
- // GIVEN app is letterboxed.
- setMaxBoundsSandboxedToMatchAppBounds(mApplicationContext.getResources(),
- sAppBoundsLandscape);
- final Display display = new Display(mDisplayManagerGlobal, DEFAULT_DISPLAY, mDisplayInfo,
- mApplicationContext.getResources());
- // THEN real metrics matches app bounds.
- verifyRealMetricsMatchesApp(display, sAppBoundsLandscape);
- }
-
- // Given rotated display dimensions, calculate the letterboxed app bounds.
- private static Rect buildAppBounds(int displayWidth, int displayHeight) {
- final int midWidth = displayWidth / 2;
- final int left = midWidth - (APP_WIDTH / 2);
- final int right = midWidth + (APP_WIDTH / 2);
- final int midHeight = displayHeight / 2;
- // Coordinate system starts at top left.
- final int top = midHeight - (APP_HEIGHT / 2);
- final int bottom = midHeight + (APP_HEIGHT / 2);
- return new Rect(left, top, right, bottom);
- }
-
- private static void setDisplayInfoLandscape(DisplayInfo displayInfo) {
- displayInfo.rotation = ROTATION_90;
- // Flip width & height assignment since the device is rotated.
- displayInfo.logicalWidth = LOGICAL_HEIGHT;
- displayInfo.logicalHeight = LOGICAL_WIDTH;
- }
-
- private static void setDisplayInfoPortrait(DisplayInfo displayInfo) {
- displayInfo.rotation = ROTATION_0;
- displayInfo.logicalWidth = LOGICAL_WIDTH;
- displayInfo.logicalHeight = LOGICAL_HEIGHT;
- }
-
- /**
- * Set max bounds to be sandboxed to the app bounds, indicating the app is in
- * size compat mode or letterbox.
- */
- private static void setMaxBoundsSandboxedToMatchAppBounds(Resources resources, Rect appBounds) {
- resources.getConfiguration().windowConfiguration.setMaxBounds(appBounds);
- }
-
- /**
- * Do not compare entire display info, since it is updated to match display the test is run on.
- */
- private static void verifyDisplayInfo(DisplayInfo actual, DisplayInfo expected) {
- assertThat(actual.displayId).isEqualTo(expected.displayId);
- assertThat(actual.rotation).isEqualTo(expected.rotation);
- assertThat(actual.logicalWidth).isEqualTo(LOGICAL_WIDTH);
- assertThat(actual.logicalHeight).isEqualTo(LOGICAL_HEIGHT);
- }
-
- private static void verifyRealSizeIsLandscape(Display display) {
- Point size = new Point();
- display.getRealSize(size);
- // Flip the width and height check since the device is rotated.
- assertThat(size).isEqualTo(new Point(LOGICAL_HEIGHT, LOGICAL_WIDTH));
- }
-
- private static void verifyRealMetricsIsLandscape(Display display) {
- DisplayMetrics metrics = new DisplayMetrics();
- display.getRealMetrics(metrics);
- // Flip the width and height check since the device is rotated.
- assertThat(metrics.widthPixels).isEqualTo(LOGICAL_HEIGHT);
- assertThat(metrics.heightPixels).isEqualTo(LOGICAL_WIDTH);
- }
-
- private static void verifyRealSizeIsPortrait(Display display) {
- Point size = new Point();
- display.getRealSize(size);
- assertThat(size).isEqualTo(new Point(LOGICAL_WIDTH, LOGICAL_HEIGHT));
- }
-
- private static void verifyRealMetricsIsPortrait(Display display) {
- DisplayMetrics metrics = new DisplayMetrics();
- display.getRealMetrics(metrics);
- assertThat(metrics.widthPixels).isEqualTo(LOGICAL_WIDTH);
- assertThat(metrics.heightPixels).isEqualTo(LOGICAL_HEIGHT);
- }
-
- private static void verifyRealSizeMatchesApp(Display display, Rect appBounds) {
- Point size = new Point();
- display.getRealSize(size);
- assertThat(size).isEqualTo(new Point(appBounds.width(), appBounds.height()));
- }
-
- private static void verifyRealMetricsMatchesApp(Display display, Rect appBounds) {
- DisplayMetrics metrics = new DisplayMetrics();
- display.getRealMetrics(metrics);
- assertThat(metrics.widthPixels).isEqualTo(appBounds.width());
- assertThat(metrics.heightPixels).isEqualTo(appBounds.height());
- }
-
- private static FixedRotationAdjustments setOverrideFixedRotationAdjustments(
- Resources resources, @Surface.Rotation int rotation) {
- FixedRotationAdjustments fixedRotationAdjustments =
- setFixedRotationAdjustments(resources, rotation);
- resources.overrideDisplayAdjustments(
- buildOverrideRotationAdjustments(fixedRotationAdjustments));
- return fixedRotationAdjustments;
- }
-
- private static FixedRotationAdjustments setFixedRotationAdjustments(Resources resources,
- @Surface.Rotation int rotation) {
- final FixedRotationAdjustments fixedRotationAdjustments =
- new FixedRotationAdjustments(rotation, APP_WIDTH, APP_HEIGHT,
- DisplayCutout.NO_CUTOUT);
- resources.getDisplayAdjustments().setFixedRotationAdjustments(fixedRotationAdjustments);
- return fixedRotationAdjustments;
- }
-
- private static Consumer buildOverrideRotationAdjustments(
- FixedRotationAdjustments fixedRotationAdjustments) {
- return consumedDisplayAdjustments
- -> consumedDisplayAdjustments.setFixedRotationAdjustments(fixedRotationAdjustments);
- }
-}
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json
index ac8a296123c6a..222c9bdf2cb42 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -1903,6 +1903,12 @@
"group": "WM_DEBUG_FOCUS_LIGHT",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
+ "123161180": {
+ "message": "SEVER CHILDREN",
+ "level": "INFO",
+ "group": "WM_SHOW_TRANSACTIONS",
+ "at": "com\/android\/server\/wm\/WindowSurfaceController.java"
+ },
"140319294": {
"message": "IME target changed within ActivityRecord",
"level": "DEBUG",
@@ -2137,12 +2143,6 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
- "332390227": {
- "message": "Sandbox max bounds for uid %s to bounds %s due to letterboxing? %s mismatch with parent bounds? %s size compat mode %s",
- "level": "DEBUG",
- "group": "WM_DEBUG_CONFIGURATION",
- "at": "com\/android\/server\/wm\/ActivityRecord.java"
- },
"342460966": {
"message": "DRAG %s: pos=(%d,%d)",
"level": "INFO",
@@ -2623,12 +2623,6 @@
"group": "WM_DEBUG_WINDOW_ORGANIZER",
"at": "com\/android\/server\/wm\/WindowOrganizerController.java"
},
- "910200295": {
- "message": "Sandbox max bounds due to mismatched orientation with parent, to %s vs DisplayArea %s",
- "level": "DEBUG",
- "group": "WM_DEBUG_CONFIGURATION",
- "at": "com\/android\/server\/wm\/Task.java"
- },
"913494177": {
"message": "removeAllWindowsIfPossible: removing win=%s",
"level": "WARN",
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 36c503703b9c8..3419883d8bb62 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -16,7 +16,6 @@
package com.android.server.wm;
-import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
import static android.app.ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
import static android.app.ActivityOptions.ANIM_CLIP_REVEAL;
@@ -82,7 +81,6 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.content.pm.ActivityInfo.isFixedOrientationLandscape;
import static android.content.pm.ActivityInfo.isFixedOrientationPortrait;
-import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.content.res.Configuration.EMPTY;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
@@ -203,7 +201,6 @@ import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowContainerChildProto.ACTIVITY;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_CONFIGURATION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW_VERBOSE;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
@@ -273,7 +270,6 @@ import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.os.storage.StorageManager;
-import android.permission.PermissionManager;
import android.service.dreams.DreamActivity;
import android.service.dreams.DreamManagerInternal;
import android.service.voice.IVoiceInteractionSession;
@@ -6775,20 +6771,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// layout traversals.
mConfigurationSeq = Math.max(++mConfigurationSeq, 1);
getResolvedOverrideConfiguration().seq = mConfigurationSeq;
-
- // Sandbox max bounds by setting it to the app bounds, if activity is letterboxed or in
- // size compat mode.
- if (providesMaxBounds()) {
- if (DEBUG_CONFIGURATION) {
- ProtoLog.d(WM_DEBUG_CONFIGURATION, "Sandbox max bounds for uid %s to bounds %s "
- + "due to letterboxing? %s mismatch with parent bounds? %s size compat "
- + "mode %s", getUid(),
- resolvedConfig.windowConfiguration.getBounds(), mLetterbox != null,
- !matchParentBounds(), inSizeCompatMode());
- }
- resolvedConfig.windowConfiguration
- .setMaxBounds(resolvedConfig.windowConfiguration.getBounds());
- }
}
/**
@@ -6972,19 +6954,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return super.getBounds();
}
- @Override
- public boolean providesMaxBounds() {
- // System and SystemUI should always be able to access the physical display bounds,
- // so do not provide it with the overridden maximum bounds.
- // TODO(b/179179513) check WindowState#mOwnerCanAddInternalSystemWindow instead
- if (getUid() == SYSTEM_UID || PermissionManager.checkPermission(INTERNAL_SYSTEM_WINDOW,
- getPid(), info.applicationInfo.uid) == PERMISSION_GRANTED) {
- return false;
- }
- // Max bounds should be sandboxed when this is letterboxed or in size compat mode.
- return mLetterbox != null || !matchParentBounds() || inSizeCompatMode();
- }
-
@VisibleForTesting
@Override
Rect getAnimationBounds(int appRootTaskClipMode) {
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 57ba915d46511..d0e2e048ae824 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -77,7 +77,6 @@ import static android.view.WindowManager.TRANSIT_TO_FRONT;
import static com.android.internal.policy.DecorView.DECOR_SHADOW_FOCUSED_HEIGHT_IN_DIP;
import static com.android.internal.policy.DecorView.DECOR_SHADOW_UNFOCUSED_HEIGHT_IN_DIP;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_LOCKTASK;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_RECENTS_ANIMATIONS;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STATES;
@@ -145,7 +144,6 @@ import static com.android.server.wm.TaskProto.WINDOW_CONTAINER;
import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowContainerChildProto.TASK;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_CONFIGURATION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ROOT_TASK;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
@@ -2882,16 +2880,6 @@ class Task extends WindowContainer {
// In FULLSCREEN mode, always start with empty bounds to indicate "fill parent".
outBounds.setEmpty();
computeLetterboxBounds(outBounds, newParentConfig);
- // Since the task is letterboxed due to mismatched orientation against its parent,
- // sandbox max bounds to the app bounds.
- if (!outBounds.isEmpty()) {
- if (DEBUG_CONFIGURATION) {
- ProtoLog.d(WM_DEBUG_CONFIGURATION, "Sandbox max bounds due to mismatched "
- + "orientation with parent, to %s vs DisplayArea %s", outBounds,
- getDisplayArea() != null ? getDisplayArea().getBounds() : "null");
- }
- getResolvedOverrideConfiguration().windowConfiguration.setMaxBounds(outBounds);
- }
}
/** Computes bounds for {@link WindowConfiguration#WINDOWING_MODE_FREEFORM}. */
diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
index 6f775cf301b51..cc4d4eaa9e8b6 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -39,8 +39,6 @@ import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
import static com.android.server.wm.Task.ActivityState.STOPPED;
import static com.android.server.wm.WindowContainer.POSITION_TOP;
-import static com.google.common.truth.Truth.assertThat;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
@@ -119,13 +117,13 @@ public class SizeCompatTests extends WindowTestsBase {
@Test
public void testKeepBoundsWhenChangingFromFreeformToFullscreen() {
removeGlobalMinSizeRestriction();
- // Create landscape freeform display and a freeform app.
+ // create freeform display and a freeform app
DisplayContent display = new TestDisplayContent.Builder(mAtm, 2000, 1000)
.setCanRotate(false)
.setWindowingMode(WindowConfiguration.WINDOWING_MODE_FREEFORM).build();
setUpApp(display);
- // Put app window into portrait freeform and then make it a compat app.
+ // Put app window into freeform and then make it a compat app.
final Rect bounds = new Rect(100, 100, 400, 600);
mTask.setBounds(bounds);
prepareUnresizable(mActivity, -1.f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT);
@@ -138,7 +136,7 @@ public class SizeCompatTests extends WindowTestsBase {
final int density = mActivity.getConfiguration().densityDpi;
- // Change display configuration to fullscreen.
+ // change display configuration to fullscreen
Configuration c = new Configuration(display.getRequestedOverrideConfiguration());
c.windowConfiguration.setWindowingMode(WindowConfiguration.WINDOWING_MODE_FULLSCREEN);
display.onRequestedOverrideConfigurationChanged(c);
@@ -148,8 +146,6 @@ public class SizeCompatTests extends WindowTestsBase {
assertEquals(bounds.width(), mActivity.getBounds().width());
assertEquals(bounds.height(), mActivity.getBounds().height());
assertEquals(density, mActivity.getConfiguration().densityDpi);
- // Size compat mode is sandboxed at the activity level.
- assertActivityMaxBoundsSandboxedForSizeCompat();
}
@Test
@@ -175,12 +171,6 @@ public class SizeCompatTests extends WindowTestsBase {
assertEquals(appBounds.height(), appBounds.width() * aspectRatio, 0.5f /* delta */);
// The decor height should be a part of the effective bounds.
assertEquals(mActivity.getBounds().height(), appBounds.height() + notchHeight);
- // Activity max bounds should be sandboxed; activity is letterboxed due to aspect ratio.
- assertActivityMaxBoundsSandboxedForLetterbox();
- // Activity max bounds ignore notch, since an app can be shown past the notch (although app
- // is currently limited by the notch).
- assertThat(mActivity.getWindowConfiguration().getMaxBounds().height())
- .isEqualTo(displayBounds.height());
mActivity.setRequestedOrientation(SCREEN_ORIENTATION_LANDSCAPE);
assertFitted();
@@ -190,17 +180,9 @@ public class SizeCompatTests extends WindowTestsBase {
assertEquals(appBounds.width(), appBounds.height() * aspectRatio, 0.5f /* delta */);
// The notch is no longer on top.
assertEquals(appBounds, mActivity.getBounds());
- // Activity max bounds are sandboxed.
- assertActivityMaxBoundsSandboxedForLetterbox();
mActivity.setRequestedOrientation(SCREEN_ORIENTATION_PORTRAIT);
assertFitted();
- // Activity max bounds should be sandboxed; activity is letterboxed due to aspect ratio.
- assertActivityMaxBoundsSandboxedForLetterbox();
- // Activity max bounds ignore notch, since an app can be shown past the notch (although app
- // is currently limited by the notch).
- assertThat(mActivity.getWindowConfiguration().getMaxBounds().height())
- .isEqualTo(displayBounds.height());
}
@Test
@@ -228,9 +210,6 @@ public class SizeCompatTests extends WindowTestsBase {
assertEquals(originalBounds.width(), mActivity.getBounds().width());
assertEquals(originalBounds.height(), mActivity.getBounds().height());
assertEquals(originalDpi, mActivity.getConfiguration().densityDpi);
- // Activity is sandboxed; it is in size compat mode since it is not resizable and has a
- // max aspect ratio.
- assertActivityMaxBoundsSandboxedForSizeCompat();
assertScaled();
}
@@ -238,13 +217,11 @@ public class SizeCompatTests extends WindowTestsBase {
public void testFixedScreenBoundsWhenDisplaySizeChanged() {
setUpDisplaySizeWithApp(1000, 2500);
prepareUnresizable(mActivity, -1f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT);
- final DisplayContent display = mActivity.mDisplayContent;
assertFitted();
- // Activity and task inherit bounds from TaskDisplayArea, since not sandboxed.
- assertMaxBoundsInheritDisplayAreaBounds();
final Rect origBounds = new Rect(mActivity.getBounds());
final Rect currentBounds = mActivity.getWindowConfiguration().getBounds();
+ final DisplayContent display = mActivity.mDisplayContent;
// Change the size of current display.
resizeDisplay(display, 1000, 2000);
@@ -261,8 +238,6 @@ public class SizeCompatTests extends WindowTestsBase {
// The position of configuration bounds should be the same as compat bounds.
assertEquals(mActivity.getBounds().left, currentBounds.left);
assertEquals(mActivity.getBounds().top, currentBounds.top);
- // Activity is sandboxed to the offset size compat bounds.
- assertActivityMaxBoundsSandboxedForSizeCompat();
// Change display size to a different orientation
resizeDisplay(display, 2000, 1000);
@@ -271,8 +246,6 @@ public class SizeCompatTests extends WindowTestsBase {
assertEquals(origBounds.height(), currentBounds.height());
assertEquals(ORIENTATION_LANDSCAPE, display.getConfiguration().orientation);
assertEquals(Configuration.ORIENTATION_PORTRAIT, mActivity.getConfiguration().orientation);
- // Activity is sandboxed to the offset size compat bounds.
- assertActivityMaxBoundsSandboxedForSizeCompat();
// The previous resize operation doesn't consider the rotation change after size changed.
// These setups apply the requested orientation to rotation as real case that the top fixed
@@ -292,8 +265,6 @@ public class SizeCompatTests extends WindowTestsBase {
assertEquals(origBounds.height(), currentBounds.height());
assertEquals(offsetX, currentBounds.left);
assertScaled();
- // Activity is sandboxed due to size compat mode.
- assertActivityMaxBoundsSandboxedForSizeCompat();
}
@Test
@@ -309,8 +280,6 @@ public class SizeCompatTests extends WindowTestsBase {
assertEquals(bounds.width(), bounds.height() * maxAspect, 0.0001f /* delta */);
// The position should be horizontal centered.
assertEquals((displayWidth - bounds.width()) / 2, bounds.left);
- // Activity max bounds should be sandboxed since it is letterboxed.
- assertActivityMaxBoundsSandboxedForLetterbox();
mActivity.mDisplayContent.setImeLayeringTarget(addWindowToActivity(mActivity));
// Make sure IME cannot attach to the app, otherwise IME window will also be shifted.
@@ -322,8 +291,6 @@ public class SizeCompatTests extends WindowTestsBase {
// It should keep non-attachable because the resolved bounds will be computed according to
// the aspect ratio that won't match its parent bounds.
assertFalse(mActivity.mDisplayContent.isImeAttachedToApp());
- // Activity max bounds should be sandboxed since it is letterboxed.
- assertActivityMaxBoundsSandboxedForLetterbox();
}
@Test
@@ -349,13 +316,14 @@ public class SizeCompatTests extends WindowTestsBase {
}
@Test
- public void testMoveToDifferentOrientationDisplay() {
+ public void testMoveToDifferentOrientDisplay() {
setUpDisplaySizeWithApp(1000, 2500);
prepareUnresizable(mActivity, -1.f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT);
assertFitted();
- final Rect currentBounds = mActivity.getWindowConfiguration().getBounds();
- final Rect originalBounds = new Rect(mActivity.getWindowConfiguration().getBounds());
+ final Rect configBounds = mActivity.getWindowConfiguration().getBounds();
+ final int origWidth = configBounds.width();
+ final int origHeight = configBounds.height();
final int notchHeight = 100;
final DisplayContent newDisplay = new TestDisplayContent.Builder(mAtm, 2000, 1000)
@@ -364,44 +332,37 @@ public class SizeCompatTests extends WindowTestsBase {
// Move the non-resizable activity to the new display.
mTask.reparent(newDisplay.getDefaultTaskDisplayArea(), true /* onTop */);
// The configuration bounds [820, 0 - 1820, 2500] should keep the same.
- assertEquals(originalBounds.width(), currentBounds.width());
- assertEquals(originalBounds.height(), currentBounds.height());
+ assertEquals(origWidth, configBounds.width());
+ assertEquals(origHeight, configBounds.height());
assertScaled();
- // Activity max bounds are sandboxed due to size compat mode on the new display.
- assertActivityMaxBoundsSandboxedForSizeCompat();
final Rect newDisplayBounds = newDisplay.getWindowConfiguration().getBounds();
// The scaled bounds should exclude notch area (1000 - 100 == 360 * 2500 / 1000 = 900).
assertEquals(newDisplayBounds.height() - notchHeight,
- (int) ((float) mActivity.getBounds().width() * originalBounds.height()
- / originalBounds.width()));
+ (int) ((float) mActivity.getBounds().width() * origHeight / origWidth));
// Recompute the natural configuration in the new display.
mActivity.clearSizeCompatMode();
mActivity.ensureActivityConfiguration(0 /* globalChanges */, false /* preserveWindow */);
// Because the display cannot rotate, the portrait activity will fit the short side of
// display with keeping portrait bounds [200, 0 - 700, 1000] in center.
- assertEquals(newDisplayBounds.height(), currentBounds.height());
- assertEquals(currentBounds.height() * newDisplayBounds.height() / newDisplayBounds.width(),
- currentBounds.width());
+ assertEquals(newDisplayBounds.height(), configBounds.height());
+ assertEquals(configBounds.height() * newDisplayBounds.height() / newDisplayBounds.width(),
+ configBounds.width());
assertFitted();
// The appBounds should be [200, 100 - 700, 1000].
final Rect appBounds = mActivity.getWindowConfiguration().getAppBounds();
- assertEquals(currentBounds.width(), appBounds.width());
- assertEquals(currentBounds.height() - notchHeight, appBounds.height());
- // Task max bounds are sandboxed due to letterboxing from orientation mismatch with display.
- assertTaskMaxBoundsSandboxed();
+ assertEquals(configBounds.width(), appBounds.width());
+ assertEquals(configBounds.height() - notchHeight, appBounds.height());
}
@Test
- public void testFixedOrientationRotateCutoutDisplay() {
+ public void testFixedOrientRotateCutoutDisplay() {
// Create a display with a notch/cutout
final int notchHeight = 60;
- final int width = 1000;
- setUpApp(new TestDisplayContent.Builder(mAtm, width, 2500)
+ setUpApp(new TestDisplayContent.Builder(mAtm, 1000, 2500)
.setNotch(notchHeight).build());
- // Bounds=[0, 0 - 1000, 1400], AppBounds=[0, 60 - 1000, 1460].
- final float maxAspect = 1.4f;
+ // Bounds=[0, 0 - 1000, 1460], AppBounds=[0, 60 - 1000, 1460].
prepareUnresizable(mActivity, 1.4f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT);
final Rect currentBounds = mActivity.getWindowConfiguration().getBounds();
@@ -409,11 +370,6 @@ public class SizeCompatTests extends WindowTestsBase {
final Rect origBounds = new Rect(currentBounds);
final Rect origAppBounds = new Rect(appBounds);
- // Activity is sandboxed, and bounds include the area consumed by the notch.
- assertActivityMaxBoundsSandboxedForLetterbox();
- assertThat(mActivity.getConfiguration().windowConfiguration.getMaxBounds().height())
- .isEqualTo(Math.round(width * maxAspect) + notchHeight);
-
// Although the activity is fixed orientation, force rotate the display.
rotateDisplay(mActivity.mDisplayContent, ROTATION_270);
assertEquals(ROTATION_270, mTask.getWindowConfiguration().getRotation());
@@ -429,13 +385,10 @@ public class SizeCompatTests extends WindowTestsBase {
// The position in configuration should be global coordinates.
assertEquals(mActivity.getBounds().left, currentBounds.left);
assertEquals(mActivity.getBounds().top, currentBounds.top);
-
- // Activity max bounds are sandboxed due to size compat mode.
- assertActivityMaxBoundsSandboxedForSizeCompat();
}
@Test
- public void testFixedAspectRatioOrientationChangeOrientation() {
+ public void testFixedAspOrientChangeOrient() {
setUpDisplaySizeWithApp(1000, 2500);
final float maxAspect = 1.4f;
@@ -447,8 +400,6 @@ public class SizeCompatTests extends WindowTestsBase {
final Rect originalAppBounds = new Rect(mActivity.getWindowConfiguration().getAppBounds());
assertEquals((int) (originalBounds.width() * maxAspect), originalBounds.height());
- // Activity is sandboxed due to fixed aspect ratio.
- assertActivityMaxBoundsSandboxedForLetterbox();
// Change the fixed orientation.
mActivity.setRequestedOrientation(SCREEN_ORIENTATION_LANDSCAPE);
@@ -460,8 +411,6 @@ public class SizeCompatTests extends WindowTestsBase {
mActivity.getWindowConfiguration().getAppBounds().height());
assertEquals(originalAppBounds.height(),
mActivity.getWindowConfiguration().getAppBounds().width());
- // Activity is sandboxed due to fixed aspect ratio.
- assertActivityMaxBoundsSandboxedForLetterbox();
}
@Test
@@ -510,8 +459,6 @@ public class SizeCompatTests extends WindowTestsBase {
// restarted and the override configuration won't be cleared.
verify(mActivity, never()).restartProcessIfVisible();
assertScaled();
- // Activity max bounds are sandboxed due to size compat mode, even if is not visible.
- assertActivityMaxBoundsSandboxedForSizeCompat();
// Change display density
display.mBaseDisplayDensity = (int) (0.7f * display.mBaseDisplayDensity);
@@ -586,16 +533,12 @@ public class SizeCompatTests extends WindowTestsBase {
// in multi-window mode.
mTask.setWindowingMode(WindowConfiguration.WINDOWING_MODE_FREEFORM);
assertFalse(activity.shouldUseSizeCompatMode());
- // Activity and task should not be sandboxed.
- assertMaxBoundsInheritDisplayAreaBounds();
// The non-resizable activity should not be size compat because the display support
// changing windowing mode from fullscreen to freeform.
mTask.mDisplayContent.setDisplayWindowingMode(WindowConfiguration.WINDOWING_MODE_FREEFORM);
mTask.setWindowingMode(WindowConfiguration.WINDOWING_MODE_FULLSCREEN);
assertFalse(activity.shouldUseSizeCompatMode());
- // Activity and task should not be sandboxed.
- assertMaxBoundsInheritDisplayAreaBounds();
}
@Test
@@ -659,9 +602,6 @@ public class SizeCompatTests extends WindowTestsBase {
// be transparent.
assertFalse(displayPolicy.isFullyTransparentAllowed(w, TYPE_STATUS_BAR));
- // Activity is sandboxed.
- assertActivityMaxBoundsSandboxedForLetterbox();
-
// Make the activity fill the display.
prepareUnresizable(mActivity, 10 /* maxAspect */, SCREEN_ORIENTATION_LANDSCAPE);
w.mWinAnimator.mDrawState = WindowStateAnimator.HAS_DRAWN;
@@ -671,7 +611,6 @@ public class SizeCompatTests extends WindowTestsBase {
// The letterbox should only cover the notch area, so status bar can be transparent.
assertEquals(new Rect(notchHeight, 0, 0, 0), mActivity.getLetterboxInsets());
assertTrue(displayPolicy.isFullyTransparentAllowed(w, TYPE_STATUS_BAR));
- assertActivityMaxBoundsSandboxedForLetterbox();
}
@Test
@@ -696,8 +635,6 @@ public class SizeCompatTests extends WindowTestsBase {
assertTrue(mTask.isTaskLetterboxed());
assertFalse(mActivity.inSizeCompatMode());
assertEquals(taskBounds, activityBounds);
- // Activity inherits max bounds from task, since sandboxing applied to task.
- assertTaskMaxBoundsSandboxed();
// Task bounds should be 700x1400 with the ratio as the display.
assertEquals(displayBounds.height(), taskBounds.height());
@@ -728,8 +665,6 @@ public class SizeCompatTests extends WindowTestsBase {
assertScaled();
assertEquals(activityBounds.width(), newActivityBounds.width());
assertEquals(activityBounds.height(), newActivityBounds.height());
- // Activity max bounds are sandboxed due to size compat mode.
- assertActivityMaxBoundsSandboxedForSizeCompat();
}
@Test
@@ -741,30 +676,29 @@ public class SizeCompatTests extends WindowTestsBase {
// Portrait fixed app without max aspect.
prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT);
+ Rect displayBounds = new Rect(mActivity.mDisplayContent.getBounds());
+ Rect activityBounds = new Rect(mActivity.getBounds());
+
// App should launch in fullscreen.
assertFalse(mTask.isTaskLetterboxed());
assertFalse(mActivity.inSizeCompatMode());
- // Activity and task inherit max bounds from TaskDisplayArea.
- assertMaxBoundsInheritDisplayAreaBounds();
+ assertEquals(displayBounds, activityBounds);
// Rotate display to landscape.
rotateDisplay(mActivity.mDisplayContent, ROTATION_90);
- final Rect rotatedDisplayBounds = new Rect(mActivity.mDisplayContent.getBounds());
- final Rect rotatedActivityBounds = new Rect(mActivity.getBounds());
- assertTrue(rotatedDisplayBounds.width() > rotatedDisplayBounds.height());
+ displayBounds = new Rect(mActivity.mDisplayContent.getBounds());
+ activityBounds = new Rect(mActivity.getBounds());
+ assertTrue(displayBounds.width() > displayBounds.height());
// App should be in size compat.
assertFalse(mTask.isTaskLetterboxed());
assertScaled();
- assertThat(mActivity.inSizeCompatMode()).isTrue();
- // Activity max bounds are sandboxed due to size compat mode.
- assertActivityMaxBoundsSandboxedForSizeCompat();
// App bounds should be 700x1400 with the ratio as the display.
- assertEquals(rotatedDisplayBounds.height(), rotatedActivityBounds.height());
- assertEquals(rotatedDisplayBounds.height() * rotatedDisplayBounds.height()
- / rotatedDisplayBounds.width(), rotatedActivityBounds.width());
+ assertEquals(displayBounds.height(), activityBounds.height());
+ assertEquals(displayBounds.height() * displayBounds.height() / displayBounds.width(),
+ activityBounds.width());
}
@Test
@@ -797,17 +731,14 @@ public class SizeCompatTests extends WindowTestsBase {
final Rect displayBounds = new Rect(display.getBounds());
final Rect taskBounds = new Rect(mTask.getBounds());
final Rect newActivityBounds = new Rect(newActivity.getBounds());
- final float displayAspectRatio = (float) displayBounds.height() / displayBounds.width();
// Task and app bounds should be 700x1400 with the ratio as the display.
assertTrue(mTask.isTaskLetterboxed());
assertFalse(newActivity.inSizeCompatMode());
assertEquals(taskBounds, newActivityBounds);
assertEquals(displayBounds.height(), taskBounds.height());
- assertThat(taskBounds.width())
- .isEqualTo(Math.round(displayBounds.height() * displayAspectRatio));
- // Task max bounds are sandboxed due to letterbox, with the ratio of the display.
- assertTaskMaxBoundsSandboxed();
+ assertEquals(displayBounds.height() * displayBounds.height() / displayBounds.width(),
+ taskBounds.width());
}
@Test
@@ -847,14 +778,6 @@ public class SizeCompatTests extends WindowTestsBase {
assertEquals(displayBounds.height(), taskBounds.height());
assertEquals((long) Math.rint(taskBounds.height() / newActivity.info.maxAspectRatio),
taskBounds.width());
- // New activity max bounds are sandboxed due to letterbox.
- assertThat(newActivity.getConfiguration().windowConfiguration.getMaxBounds())
- .isEqualTo(taskBounds);
- // Task max bounds are sandboxed due to letterbox, with the ratio of the display.
- assertThat(mTask.getConfiguration().windowConfiguration.getMaxBounds().height())
- .isEqualTo(displayBounds.height());
- assertThat(mTask.getConfiguration().windowConfiguration.getMaxBounds().width())
- .isEqualTo(Math.round(displayBounds.height() / newActivity.info.maxAspectRatio));
// App bounds should be fullscreen in Task bounds.
assertFalse(newActivity.inSizeCompatMode());
@@ -883,9 +806,6 @@ public class SizeCompatTests extends WindowTestsBase {
assertFalse(mTask.isTaskLetterboxed());
assertScaled();
assertEquals(mTask.getLastTaskBoundsComputeActivity(), mActivity);
- assertThat(mActivity.inSizeCompatMode()).isTrue();
- // Activity max bounds are sandboxed due to size compat mode.
- assertActivityMaxBoundsSandboxedForSizeCompat();
final Rect activityBounds = new Rect(mActivity.getBounds());
mTask.resumeTopActivityUncheckedLocked(null /* prev */, null /* options */);
@@ -896,8 +816,6 @@ public class SizeCompatTests extends WindowTestsBase {
assertScaled();
assertEquals(mTask.getLastTaskBoundsComputeActivity(), mActivity);
assertEquals(activityBounds, mActivity.getBounds());
- // Activity max bounds are sandboxed due to size compat.
- assertActivityMaxBoundsSandboxedForSizeCompat();
}
@Test
@@ -913,7 +831,6 @@ public class SizeCompatTests extends WindowTestsBase {
// In Task letterbox
assertTrue(mTask.isTaskLetterboxed());
assertFalse(mActivity.inSizeCompatMode());
- assertTaskMaxBoundsSandboxed();
// Rotate display to portrait.
rotateDisplay(display, ROTATION_90);
@@ -921,7 +838,6 @@ public class SizeCompatTests extends WindowTestsBase {
// App should be in size compat.
assertFalse(mTask.isTaskLetterboxed());
assertScaled();
- assertActivityMaxBoundsSandboxedForSizeCompat();
// Rotate display to landscape.
rotateDisplay(display, ROTATION_180);
@@ -929,7 +845,6 @@ public class SizeCompatTests extends WindowTestsBase {
// In Task letterbox
assertTrue(mTask.isTaskLetterboxed());
assertFalse(mActivity.inSizeCompatMode());
- assertTaskMaxBoundsSandboxed();
}
@Test
@@ -947,26 +862,20 @@ public class SizeCompatTests extends WindowTestsBase {
// In Task letterbox
assertTrue(mTask.isTaskLetterboxed());
assertFalse(mActivity.inSizeCompatMode());
- // Task is letterboxed due to mismatched orientation request.
- assertTaskMaxBoundsSandboxed();
- // Rotate display to landscape.
+ // Rotate display to portrait.
rotateDisplay(display, ROTATION_90);
// App should be in size compat.
assertFalse(mTask.isTaskLetterboxed());
assertScaled();
- // Activity max bounds are sandboxed due to unresizable app.
- assertActivityMaxBoundsSandboxedForSizeCompat();
- // Rotate display to portrait.
+ // Rotate display to landscape.
rotateDisplay(display, ROTATION_180);
// In Task letterbox
assertTrue(mTask.isTaskLetterboxed());
assertFalse(mActivity.inSizeCompatMode());
- // Task is letterboxed, as in first case.
- assertTaskMaxBoundsSandboxed();
}
@Test
@@ -983,18 +892,12 @@ public class SizeCompatTests extends WindowTestsBase {
assertEquals(ORIENTATION_LANDSCAPE, display.getConfiguration().orientation);
assertEquals(2800, displayBounds.width());
assertEquals(1400, displayBounds.height());
- Rect displayAreaBounds = new Rect(0, 0, 2400, 1000);
- taskDisplayArea.setBounds(displayAreaBounds);
+ taskDisplayArea.setBounds(0, 0, 2400, 1000);
final Rect activityBounds = new Rect(mActivity.getBounds());
assertFalse(mActivity.inSizeCompatMode());
assertEquals(2400, activityBounds.width());
assertEquals(1000, activityBounds.height());
- // Task and activity maximum bounds inherit from TaskDisplayArea bounds.
- assertThat(mActivity.getConfiguration().windowConfiguration.getMaxBounds())
- .isEqualTo(displayAreaBounds);
- assertThat(mTask.getConfiguration().windowConfiguration.getMaxBounds())
- .isEqualTo(displayAreaBounds);
}
@Test
@@ -1142,48 +1045,6 @@ public class SizeCompatTests extends WindowTestsBase {
assertFalse(mActivity.hasSizeCompatBounds());
}
- /** Asserts both the activity and task max bounds inherit from the TaskDisplayArea. */
- private void assertMaxBoundsInheritDisplayAreaBounds() {
- final Rect taskDisplayAreaBounds = mTask.getDisplayArea().getBounds();
- assertThat(mActivity.getConfiguration().windowConfiguration.getMaxBounds())
- .isEqualTo(taskDisplayAreaBounds);
- assertThat(mTask.getConfiguration().windowConfiguration.getMaxBounds())
- .isEqualTo(taskDisplayAreaBounds);
- }
-
- /**
- * Asserts task-level letterboxing, so both activity and task max bounds
- * are sandboxed to the letterbox bounds.
- */
- private void assertTaskMaxBoundsSandboxed() {
- // Activity inherits max bounds from task, since sandboxing applied to task.
- assertThat(mActivity.getConfiguration().windowConfiguration.getMaxBounds())
- .isEqualTo(mTask.getBounds());
- // Task max bounds are sandboxed due to letterbox.
- assertThat(mTask.getConfiguration().windowConfiguration.getMaxBounds())
- .isEqualTo(mTask.getBounds());
- }
-
- /** Asserts activity-level size compat mode, so only activity max bounds are sandboxed. */
- private void assertActivityMaxBoundsSandboxedForSizeCompat() {
- // Activity max bounds are sandboxed due to size compat mode.
- assertThat(mActivity.getConfiguration().windowConfiguration.getMaxBounds())
- .isEqualTo(mActivity.getWindowConfiguration().getBounds());
- // Task inherits max bounds from display.
- assertThat(mTask.getConfiguration().windowConfiguration.getMaxBounds())
- .isEqualTo(mTask.getDisplayContent().getBounds());
- }
-
- /** Asserts activity-level letterboxing, so only activity max bounds are sandboxed. */
- private void assertActivityMaxBoundsSandboxedForLetterbox() {
- // Activity is sandboxed due to fixed aspect ratio.
- assertThat(mActivity.getConfiguration().windowConfiguration.getMaxBounds())
- .isEqualTo(mActivity.getBounds());
- // Task inherits bounds from display.
- assertThat(mTask.getConfiguration().windowConfiguration.getMaxBounds())
- .isEqualTo(mTask.getDisplayContent().getBounds());
- }
-
static Configuration rotateDisplay(DisplayContent display, int rotation) {
final Configuration c = new Configuration();
display.getDisplayRotation().setRotation(rotation);
diff --git a/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java b/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java
index d71993df86020..ae85ceb729587 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java
@@ -136,11 +136,6 @@ class TestDisplayContent extends DisplayContent {
final Display display = new Display(DisplayManagerGlobal.getInstance(), displayId,
mInfo, DEFAULT_DISPLAY_ADJUSTMENTS);
final TestDisplayContent newDisplay = createInternal(display);
- // Ensure letterbox aspect ratio is not overridden on any device target.
- // {@link com.android.internal.R.dimen.config_taskLetterboxAspectRatio}, provided by
- // the below method, is set on some device form factors.
- mService.mWindowManager.setTaskLetterboxAspectRatio(0);
-
// disable the normal system decorations
final DisplayPolicy displayPolicy = newDisplay.getDisplayPolicy();
spyOn(displayPolicy);
From 7f7de4e443ede3bf65b39552adb525b8dde51761 Mon Sep 17 00:00:00 2001
From: Alex Kershaw
Date: Fri, 5 Feb 2021 16:24:10 +0000
Subject: [PATCH 004/176] Revert "Dispatch TaskOrg events before finishing
surface placement"
This reverts commit 805cfed0584941386e731b4c63f8fff8f3088824.
Reason for revert: Seems to break https://b/179460794 and http://b/179457563 (PackageInstaller)
Change-Id: Ibb9ffb8074717401ce8a836d2832acb7dfa0b624
(cherry picked from commit 53fc5edc099473ce75e702233df15c20c22aa267)
---
.../core/java/com/android/server/wm/RootWindowContainer.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 61fec0d0ead98..96e0e284afe99 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -847,8 +847,6 @@ class RootWindowContainer extends WindowContainer
Slog.i(TAG,
">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces");
}
- // Send any pending task-info changes that were queued-up during a layout deferment
- mWmService.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "applySurfaceChanges");
mWmService.openSurfaceTransaction();
try {
@@ -865,6 +863,8 @@ class RootWindowContainer extends WindowContainer
}
}
+ // Send any pending task-info changes that were queued-up during a layout deferment
+ mWmService.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
mWmService.mAnimator.executeAfterPrepareSurfacesRunnables();
checkAppTransitionReady(surfacePlacer);
From 7d108366a3aa3d7dac41b9e1e9aa07c41e5025dc Mon Sep 17 00:00:00 2001
From: Alex Kershaw
Date: Mon, 8 Feb 2021 10:15:55 +0000
Subject: [PATCH 005/176] Revert "Enfore cross user permission to
getPackagesForUid"
This reverts commit 1dafc3859ae45671d666aa591bdb74a1e45518b3.
Reason for revert: Causes bugs https://b.corp.google.com/issues/179465628 and https://b.corp.google.com/issues/179506602
Fixes: 179506602
Fixes: 179465628
Fixes: 179460585
Change-Id: I0596e45484638e33baccec834a8adf2dfa9f4a4d
(cherry picked from commit d5bc510fc88704cea72fa9291d7756e8227c7b7b)
---
.../core/java/com/android/server/pm/PackageManagerService.java | 2 --
1 file changed, 2 deletions(-)
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 7e5a00ac2e3c4..cdc33f006be06 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -3616,8 +3616,6 @@ public class PackageManagerService extends IPackageManager.Stub
final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null;
final int userId = UserHandle.getUserId(uid);
final int appId = UserHandle.getAppId(uid);
- enforceCrossUserPermission(callingUid, userId,
- /* requireFullPermission */ false, /* checkShell */ false, "getPackagesForUid");
return getPackagesForUidInternalBody(callingUid, userId, appId, isCallerInstantApp);
}
From 8606d28d27655d61cfd017310b9f6c590344d218 Mon Sep 17 00:00:00 2001
From: Daniel Chapin
Date: Mon, 8 Feb 2021 18:50:05 +0000
Subject: [PATCH 006/176] Revert "Revert "Revert "Turn on the feature flag for
Android S S..."
Revert submission 13479025-multiuser_test
Reason for revert: Bug: 179457252
Reverted Changes:
I9e3d23f93:Fix the broken test
Id05757c49:Revert "Revert "Turn on the feature flag for Andro...
Change-Id: I4f77afda470b226007bfffda7f536df3b1d4d28a
(cherry picked from commit 0ded361ef4a92652d70fb95857c3dd899c0f2bb8)
---
core/java/android/util/FeatureFlagUtils.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index 790773fd83c59..b22921233f055 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -65,7 +65,7 @@ public class FeatureFlagUtils {
DEFAULT_FLAGS.put(SETTINGS_DO_NOT_RESTORE_PRESERVED, "true");
DEFAULT_FLAGS.put("settings_tether_all_in_one", "false");
- DEFAULT_FLAGS.put("settings_silky_home", "true");
+ DEFAULT_FLAGS.put("settings_silky_home", "false");
DEFAULT_FLAGS.put("settings_contextual_home", "false");
DEFAULT_FLAGS.put(SETTINGS_PROVIDER_MODEL, "false");
}
From f2bdedde905122c31704f4983182440bf38484e4 Mon Sep 17 00:00:00 2001
From: Josh Tsuji
Date: Fri, 12 Feb 2021 02:46:22 +0000
Subject: [PATCH 007/176] Revert "Use new GX overlay for new AOD/lockscreen
transitions."
Revert "Use new GX overlay for new AOD/lockscreen transitions."
Revert submission 13519645-aod-lockscreen-animation-flag
Reason for revert: b/179947580
Reverted Changes:
I343400700:Use new GX overlay for new AOD/lockscreen transiti...
I326ad5294:Use new GX overlay for new AOD/lockscreen transiti...
Change-Id: I8705764f0a0505d1851cf3d9c988fff0f3ec3cdd
(cherry picked from commit 67a2a1c80d3b7463ac648bd17190e4022d7c30ef)
---
packages/SystemUI/res/values/flags.xml | 3 ---
.../android/systemui/statusbar/FeatureFlags.java | 4 ----
.../android/systemui/statusbar/LightRevealScrim.kt | 4 ++++
.../systemui/statusbar/phone/DozeParameters.java | 9 +++------
.../android/systemui/statusbar/phone/StatusBar.java | 13 ++++---------
.../phone/dagger/StatusBarPhoneModule.java | 7 ++-----
.../statusbar/phone/DozeParametersTest.java | 5 +----
.../systemui/statusbar/phone/StatusBarTest.java | 5 +----
8 files changed, 15 insertions(+), 35 deletions(-)
diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml
index f83965eb73788..3a9fec8c8748d 100644
--- a/packages/SystemUI/res/values/flags.xml
+++ b/packages/SystemUI/res/values/flags.xml
@@ -35,9 +35,6 @@
false
-
- false
-
false
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java
index 862c27907e0fe..7aa41e43be3cc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java
@@ -67,10 +67,6 @@ public class FeatureFlags {
return mFlagReader.isEnabled(R.bool.flag_brightness_slider);
}
- public boolean useNewLockscreenAnimations() {
- return mFlagReader.isEnabled(R.bool.flag_lockscreen_animations);
- }
-
public boolean isPeopleTileEnabled() {
return mFlagReader.isEnabled(R.bool.flag_conversations);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt
index c1feacaba440f..2f0f90d318eb0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt
@@ -11,10 +11,14 @@ import android.graphics.PorterDuffColorFilter
import android.graphics.PorterDuffXfermode
import android.graphics.RadialGradient
import android.graphics.Shader
+import android.os.SystemProperties
import android.util.AttributeSet
import android.view.View
import com.android.systemui.Interpolators
+val enableLightReveal =
+ SystemProperties.getBoolean("persist.sysui.show_new_screen_on_transitions", false)
+
/**
* Provides methods to modify the various properties of a [LightRevealScrim] to reveal between 0% to
* 100% of the view(s) underneath the scrim.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
index 85d8df8e60575..8c2fa3349e4a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
@@ -29,7 +29,6 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.doze.AlwaysOnDisplayPolicy;
import com.android.systemui.doze.DozeScreenState;
-import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.tuner.TunerService;
@@ -55,7 +54,6 @@ public class DozeParameters implements TunerService.Tunable,
private final AlwaysOnDisplayPolicy mAlwaysOnPolicy;
private final Resources mResources;
private final BatteryController mBatteryController;
- private final FeatureFlags mFeatureFlags;
private boolean mDozeAlwaysOn;
private boolean mControlScreenOffAnimation;
@@ -67,8 +65,7 @@ public class DozeParameters implements TunerService.Tunable,
AlwaysOnDisplayPolicy alwaysOnDisplayPolicy,
PowerManager powerManager,
BatteryController batteryController,
- TunerService tunerService,
- FeatureFlags featureFlags) {
+ TunerService tunerService) {
mResources = resources;
mAmbientDisplayConfiguration = ambientDisplayConfiguration;
mAlwaysOnPolicy = alwaysOnDisplayPolicy;
@@ -77,7 +74,6 @@ public class DozeParameters implements TunerService.Tunable,
mControlScreenOffAnimation = !getDisplayNeedsBlanking();
mPowerManager = powerManager;
mPowerManager.setDozeAfterScreenOff(!mControlScreenOffAnimation);
- mFeatureFlags = featureFlags;
tunerService.addTunable(
this,
@@ -204,7 +200,8 @@ public class DozeParameters implements TunerService.Tunable,
* then abruptly showing AOD.
*/
public boolean shouldControlUnlockedScreenOff() {
- return getAlwaysOn() && mFeatureFlags.useNewLockscreenAnimations();
+ return getAlwaysOn() && SystemProperties.getBoolean(
+ "persist.sysui.show_new_screen_on_transitions", false);
}
private boolean getBoolean(String propName, int resId) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 041a97e1d4045..e63902f26a78f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -35,6 +35,7 @@ import static com.android.systemui.charging.WirelessChargingLayout.UNKNOWN_BATTE
import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_ASLEEP;
import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_AWAKE;
import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_WAKING;
+import static com.android.systemui.statusbar.LightRevealScrimKt.getEnableLightReveal;
import static com.android.systemui.statusbar.NotificationLockscreenUserManager.PERMISSION_SELF;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT;
@@ -179,7 +180,6 @@ import com.android.systemui.statusbar.AutoHideUiElement;
import com.android.systemui.statusbar.BackDropView;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CrossFadeHelper;
-import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.GestureRecorder;
import com.android.systemui.statusbar.KeyboardShortcuts;
import com.android.systemui.statusbar.KeyguardIndicationController;
@@ -440,7 +440,6 @@ public class StatusBar extends SystemUI implements DemoMode,
private final KeyguardViewMediator mKeyguardViewMediator;
protected final NotificationInterruptStateProvider mNotificationInterruptStateProvider;
private final BrightnessSlider.Factory mBrightnessSliderFactory;
- private final FeatureFlags mFeatureFlags;
private final List mExpansionChangedListeners;
@@ -763,8 +762,7 @@ public class StatusBar extends SystemUI implements DemoMode,
Lazy notificationShadeDepthControllerLazy,
StatusBarTouchableRegionManager statusBarTouchableRegionManager,
NotificationIconAreaController notificationIconAreaController,
- BrightnessSlider.Factory brightnessSliderFactory,
- FeatureFlags featureFlags) {
+ BrightnessSlider.Factory brightnessSliderFactory) {
super(context);
mNotificationsController = notificationsController;
mLightBarController = lightBarController;
@@ -842,7 +840,6 @@ public class StatusBar extends SystemUI implements DemoMode,
mDemoModeController = demoModeController;
mNotificationIconAreaController = notificationIconAreaController;
mBrightnessSliderFactory = brightnessSliderFactory;
- mFeatureFlags = featureFlags;
mExpansionChangedListeners = new ArrayList<>();
@@ -1184,11 +1181,9 @@ public class StatusBar extends SystemUI implements DemoMode,
mLightRevealScrim = mNotificationShadeWindowView.findViewById(R.id.light_reveal_scrim);
- if (mFeatureFlags.useNewLockscreenAnimations() && mDozeParameters.getAlwaysOn()) {
+ if (getEnableLightReveal()) {
mLightRevealScrim.setVisibility(View.VISIBLE);
mLightRevealScrim.setRevealEffect(LiftReveal.INSTANCE);
- } else {
- mLightRevealScrim.setVisibility(View.GONE);
}
mNotificationPanelViewController.initDependencies(
@@ -3619,7 +3614,7 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public void onDozeAmountChanged(float linear, float eased) {
- if (mFeatureFlags.useNewLockscreenAnimations()) {
+ if (getEnableLightReveal()) {
mLightRevealScrim.setRevealAmount(1f - linear);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
index b572c57590ae5..9e9533d0e1991 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
@@ -47,7 +47,6 @@ import com.android.systemui.recents.ScreenPinningRequest;
import com.android.systemui.settings.brightness.BrightnessSlider;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationMediaManager;
@@ -201,8 +200,7 @@ public interface StatusBarPhoneModule {
DismissCallbackRegistry dismissCallbackRegistry,
StatusBarTouchableRegionManager statusBarTouchableRegionManager,
NotificationIconAreaController notificationIconAreaController,
- BrightnessSlider.Factory brightnessSliderFactory,
- FeatureFlags featureFlags) {
+ BrightnessSlider.Factory brightnessSliderFactory) {
return new StatusBar(
context,
notificationsController,
@@ -281,7 +279,6 @@ public interface StatusBarPhoneModule {
notificationShadeDepthController,
statusBarTouchableRegionManager,
notificationIconAreaController,
- brightnessSliderFactory,
- featureFlags);
+ brightnessSliderFactory);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
index b9fd75ef5fda7..fa253e62ef0a8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
@@ -35,7 +35,6 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.doze.AlwaysOnDisplayPolicy;
import com.android.systemui.doze.DozeScreenState;
-import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.tuner.TunerService;
@@ -58,7 +57,6 @@ public class DozeParametersTest extends SysuiTestCase {
@Mock private PowerManager mPowerManager;
@Mock private TunerService mTunerService;
@Mock private BatteryController mBatteryController;
- @Mock private FeatureFlags mFeatureFlags;
@Before
public void setup() {
@@ -69,8 +67,7 @@ public class DozeParametersTest extends SysuiTestCase {
mAlwaysOnDisplayPolicy,
mPowerManager,
mBatteryController,
- mTunerService,
- mFeatureFlags
+ mTunerService
);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index 253460db0d075..cae488a561a20 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -97,7 +97,6 @@ import com.android.systemui.recents.ScreenPinningRequest;
import com.android.systemui.settings.brightness.BrightnessSlider;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
@@ -259,7 +258,6 @@ public class StatusBarTest extends SysuiTestCase {
@Mock private DemoModeController mDemoModeController;
@Mock private Lazy mNotificationShadeDepthControllerLazy;
@Mock private BrightnessSlider.Factory mBrightnessSliderFactory;
- @Mock private FeatureFlags mFeatureFlags;
private ShadeController mShadeController;
private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
private InitController mInitController = new InitController();
@@ -420,8 +418,7 @@ public class StatusBarTest extends SysuiTestCase {
mNotificationShadeDepthControllerLazy,
mStatusBarTouchableRegionManager,
mNotificationIconAreaController,
- mBrightnessSliderFactory,
- mFeatureFlags);
+ mBrightnessSliderFactory);
when(mNotificationShadeWindowView.findViewById(R.id.lock_icon_container)).thenReturn(
mLockIconContainer);
From f01a31756f28d3485ea7df7e7ec46fa7b28146fb Mon Sep 17 00:00:00 2001
From: Alex Johnston
Date: Thu, 18 Feb 2021 17:16:57 +0000
Subject: [PATCH 008/176] Handle isUsbDataSignalingEnabledForUser PO case
If there is no DO or COPE PO, then
usb data signaling is enabled.
Bug: 180547881
Test: Manual testing
atest com.android.server.devicepolicy.DevicePolicyManagerTest
Change-Id: I32a1f73ca403b6c1c38b7c6fa70cc2f0f0830324
(cherry picked from commit 46149e42b8d5cb57c0ac80cb411d03b6d5815e33)
---
.../android/server/devicepolicy/DevicePolicyManagerService.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 28df40e8c4b20..7d63e60669639 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -16755,7 +16755,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
synchronized (getLockObject()) {
final ActiveAdmin admin = getDeviceOwnerOrProfileOwnerOfOrganizationOwnedDeviceLocked(
UserHandle.USER_SYSTEM);
- return admin != null && admin.mUsbDataSignalingEnabled;
+ return admin == null || admin.mUsbDataSignalingEnabled;
}
}
From 0cf2ba1ddc17f755dea6bee4d57ecd4f1fec0377 Mon Sep 17 00:00:00 2001
From: Albert Wang
Date: Thu, 18 Feb 2021 22:38:50 +0800
Subject: [PATCH 009/176] Fix USB HAL interface binder
Bug: 180538375
Test: USB HAL loaded normally
Signed-off-by: Albert Wang
Change-Id: Ie7081523441b60628076928aad8a1ddec820bc1e
(cherry picked from commit 8a5a512ede216b3ab3984284fc147a081bd0d7c8)
---
services/usb/java/com/android/server/usb/UsbPortManager.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java
index 6bf67154efd59..c53c95cc982e0 100644
--- a/services/usb/java/com/android/server/usb/UsbPortManager.java
+++ b/services/usb/java/com/android/server/usb/UsbPortManager.java
@@ -42,13 +42,13 @@ import android.hardware.usb.ParcelableUsbPort;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbPort;
import android.hardware.usb.UsbPortStatus;
+import android.hardware.usb.V1_0.IUsb;
import android.hardware.usb.V1_0.PortRole;
import android.hardware.usb.V1_0.PortRoleType;
import android.hardware.usb.V1_0.Status;
import android.hardware.usb.V1_1.PortStatus_1_1;
import android.hardware.usb.V1_2.IUsbCallback;
import android.hardware.usb.V1_2.PortStatus;
-import android.hardware.usb.V1_3.IUsb;
import android.hidl.manager.V1_0.IServiceManager;
import android.hidl.manager.V1_0.IServiceNotification;
import android.os.Bundle;
From ca5fa812b324b3cd19ffdebbd6a5260fde8dcefd Mon Sep 17 00:00:00 2001
From: Alex Johnston
Date: Thu, 18 Feb 2021 17:16:57 +0000
Subject: [PATCH 010/176] Handle isUsbDataSignalingEnabledForUser PO case
If there is no DO or COPE PO, then
usb data signaling is enabled.
Bug: 180547881
Test: Manual testing
atest com.android.server.devicepolicy.DevicePolicyManagerTest
Change-Id: I32a1f73ca403b6c1c38b7c6fa70cc2f0f0830324
(cherry picked from commit 46149e42b8d5cb57c0ac80cb411d03b6d5815e33)
---
.../android/server/devicepolicy/DevicePolicyManagerService.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 28828faae4113..8f804c5e6f31f 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -16792,7 +16792,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
synchronized (getLockObject()) {
final ActiveAdmin admin = getDeviceOwnerOrProfileOwnerOfOrganizationOwnedDeviceLocked(
UserHandle.USER_SYSTEM);
- return admin != null && admin.mUsbDataSignalingEnabled;
+ return admin == null || admin.mUsbDataSignalingEnabled;
}
}
From 047b7b104992d5c4a42f33b767bcb974feb2996d Mon Sep 17 00:00:00 2001
From: Albert Wang
Date: Thu, 18 Feb 2021 22:38:50 +0800
Subject: [PATCH 011/176] Fix USB HAL interface binder
Bug: 180538375
Test: USB HAL loaded normally
Signed-off-by: Albert Wang
Change-Id: Ie7081523441b60628076928aad8a1ddec820bc1e
(cherry picked from commit 8a5a512ede216b3ab3984284fc147a081bd0d7c8)
---
services/usb/java/com/android/server/usb/UsbPortManager.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java
index 6bf67154efd59..c53c95cc982e0 100644
--- a/services/usb/java/com/android/server/usb/UsbPortManager.java
+++ b/services/usb/java/com/android/server/usb/UsbPortManager.java
@@ -42,13 +42,13 @@ import android.hardware.usb.ParcelableUsbPort;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbPort;
import android.hardware.usb.UsbPortStatus;
+import android.hardware.usb.V1_0.IUsb;
import android.hardware.usb.V1_0.PortRole;
import android.hardware.usb.V1_0.PortRoleType;
import android.hardware.usb.V1_0.Status;
import android.hardware.usb.V1_1.PortStatus_1_1;
import android.hardware.usb.V1_2.IUsbCallback;
import android.hardware.usb.V1_2.PortStatus;
-import android.hardware.usb.V1_3.IUsb;
import android.hidl.manager.V1_0.IServiceManager;
import android.hidl.manager.V1_0.IServiceNotification;
import android.os.Bundle;
From 2c65eb8f024d4181ca81f7b18016122792ef1d3c Mon Sep 17 00:00:00 2001
From: Josh Gao
Date: Thu, 18 Feb 2021 14:09:37 -0800
Subject: [PATCH 012/176] NativeTombstoneManager: catch ProtoParseException.
If we can't parse the proto for some reason, don't nuke system_server.
Bug: http://b/159164105
Test: `adb shell crasher` on sc-vf-dev
Change-Id: Id8af5f41177d68dacfd9da69eddea4d88d62f420
(cherry picked from commit 2b67941ffe592d9a3f1eb9f87bfce58ebb47d570)
---
.../java/com/android/server/os/NativeTombstoneManager.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/services/core/java/com/android/server/os/NativeTombstoneManager.java b/services/core/java/com/android/server/os/NativeTombstoneManager.java
index 9984bfae30fd3..d95a7254efe14 100644
--- a/services/core/java/com/android/server/os/NativeTombstoneManager.java
+++ b/services/core/java/com/android/server/os/NativeTombstoneManager.java
@@ -42,6 +42,7 @@ import android.system.StructStat;
import android.util.Slog;
import android.util.SparseArray;
import android.util.proto.ProtoInputStream;
+import android.util.proto.ProtoParseException;
import com.android.internal.annotations.GuardedBy;
import com.android.server.BootReceiver;
@@ -434,7 +435,7 @@ public final class NativeTombstoneManager {
break;
}
}
- } catch (IOException ex) {
+ } catch (IOException | ProtoParseException ex) {
Slog.e(TAG, "Failed to parse tombstone", ex);
return Optional.empty();
}
From be5d151dbd3bdfbe29f04cb606254f5a764eb746 Mon Sep 17 00:00:00 2001
From: Daniel Chapin
Date: Fri, 19 Feb 2021 19:10:04 +0000
Subject: [PATCH 013/176] Revert "Try to ensure tests run sequentially"
Revert submission 13593269
Reason for revert: Bug: 180689674
Reverted Changes:
I59f6e607f:Update RemovalClient to support new biometric AIDL...
I3fdb3fe0b:Try to ensure tests run sequentially
Change-Id: Ia9c02759db7238536e21dd05f8e247a91e9ac5aa
(cherry picked from commit c0dd229fc6afb78c18b6688f7b5034f6229b222d)
---
.../hardware/biometrics/BiometricManager.java | 3 +-
.../biometrics/BiometricTestSession.java | 75 +++----------------
.../hardware/biometrics/IAuthService.aidl | 3 +-
.../biometrics/IBiometricAuthenticator.aidl | 3 +-
.../biometrics/IBiometricService.aidl | 3 +-
.../hardware/biometrics/ITestSession.aidl | 2 +-
.../biometrics/ITestSessionCallback.aidl | 25 -------
.../android/hardware/face/IFaceService.aidl | 3 +-
.../fingerprint/FingerprintManager.java | 3 +-
.../fingerprint/IFingerprintService.aidl | 3 +-
.../server/biometrics/AuthService.java | 8 +-
.../server/biometrics/BiometricService.java | 7 +-
.../sensors/face/FaceAuthenticator.java | 6 +-
.../biometrics/sensors/face/FaceService.java | 6 +-
.../sensors/face/ServiceProvider.java | 8 +-
.../face/aidl/BiometricTestSessionImpl.java | 27 +------
.../sensors/face/aidl/FaceProvider.java | 14 ++--
.../biometrics/sensors/face/aidl/Sensor.java | 6 +-
.../face/hidl/BiometricTestSessionImpl.java | 29 +------
.../biometrics/sensors/face/hidl/Face10.java | 21 ++----
.../fingerprint/FingerprintAuthenticator.java | 6 +-
.../fingerprint/FingerprintService.java | 6 +-
.../sensors/fingerprint/ServiceProvider.java | 8 +-
.../aidl/BiometricTestSessionImpl.java | 29 +------
.../fingerprint/aidl/FingerprintProvider.java | 14 ++--
.../sensors/fingerprint/aidl/Sensor.java | 6 +-
.../hidl/BiometricTestSessionImpl.java | 27 +------
.../fingerprint/hidl/Fingerprint21.java | 20 ++---
.../sensors/iris/IrisAuthenticator.java | 4 +-
29 files changed, 72 insertions(+), 303 deletions(-)
delete mode 100644 core/java/android/hardware/biometrics/ITestSessionCallback.aidl
diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java
index 5b28e0035b09f..4ca31050bd529 100644
--- a/core/java/android/hardware/biometrics/BiometricManager.java
+++ b/core/java/android/hardware/biometrics/BiometricManager.java
@@ -237,8 +237,7 @@ public class BiometricManager {
public BiometricTestSession createTestSession(int sensorId) {
try {
return new BiometricTestSession(mContext, sensorId,
- (context, sensorId1, callback) -> mService
- .createTestSession(sensorId1, callback, context.getOpPackageName()));
+ mService.createTestSession(sensorId, mContext.getOpPackageName()));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/hardware/biometrics/BiometricTestSession.java b/core/java/android/hardware/biometrics/BiometricTestSession.java
index ff1a17e07c113..1c3560882f1bc 100644
--- a/core/java/android/hardware/biometrics/BiometricTestSession.java
+++ b/core/java/android/hardware/biometrics/BiometricTestSession.java
@@ -19,7 +19,6 @@ package android.hardware.biometrics;
import static android.Manifest.permission.TEST_BIOMETRIC;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.TestApi;
import android.content.Context;
@@ -28,9 +27,6 @@ import android.os.RemoteException;
import android.util.ArraySet;
import android.util.Log;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
/**
* Common set of interfaces to test biometric-related APIs, including {@link BiometricPrompt} and
* {@link android.hardware.fingerprint.FingerprintManager}.
@@ -40,58 +36,22 @@ import java.util.concurrent.TimeUnit;
public class BiometricTestSession implements AutoCloseable {
private static final String TAG = "BiometricTestSession";
- /**
- * @hide
- */
- public interface TestSessionProvider {
- @NonNull
- ITestSession createTestSession(@NonNull Context context, int sensorId,
- @NonNull ITestSessionCallback callback) throws RemoteException;
- }
-
private final Context mContext;
private final int mSensorId;
private final ITestSession mTestSession;
// Keep track of users that were tested, which need to be cleaned up when finishing.
- @NonNull private final ArraySet mTestedUsers;
-
- // Track the users currently cleaning up, and provide a latch that gets notified when all
- // users have finished cleaning up. This is an imperfect system, as there can technically be
- // multiple cleanups per user. Theoretically we should track the cleanup's BaseClientMonitor's
- // unique ID, but it's complicated to plumb it through. This should be fine for now.
- @Nullable private CountDownLatch mCloseLatch;
- @NonNull private final ArraySet mUsersCleaningUp;
-
- private final ITestSessionCallback mCallback = new ITestSessionCallback.Stub() {
- @Override
- public void onCleanupStarted(int userId) {
- Log.d(TAG, "onCleanupStarted, sensor: " + mSensorId + ", userId: " + userId);
- }
-
- @Override
- public void onCleanupFinished(int userId) {
- Log.d(TAG, "onCleanupFinished, sensor: " + mSensorId
- + ", userId: " + userId
- + ", remaining users: " + mUsersCleaningUp.size());
- mUsersCleaningUp.remove(userId);
-
- if (mUsersCleaningUp.isEmpty() && mCloseLatch != null) {
- mCloseLatch.countDown();
- }
- }
- };
+ private final ArraySet mTestedUsers;
/**
* @hide
*/
public BiometricTestSession(@NonNull Context context, int sensorId,
- @NonNull TestSessionProvider testSessionProvider) throws RemoteException {
+ @NonNull ITestSession testSession) {
mContext = context;
mSensorId = sensorId;
- mTestSession = testSessionProvider.createTestSession(context, sensorId, mCallback);
+ mTestSession = testSession;
mTestedUsers = new ArraySet<>();
- mUsersCleaningUp = new ArraySet<>();
setTestHalEnabled(true);
}
@@ -216,11 +176,6 @@ public class BiometricTestSession implements AutoCloseable {
@RequiresPermission(TEST_BIOMETRIC)
public void cleanupInternalState(int userId) {
try {
- if (mUsersCleaningUp.contains(userId)) {
- Log.w(TAG, "Cleanup already in progress for user: " + userId);
- }
-
- mUsersCleaningUp.add(userId);
mTestSession.cleanupInternalState(userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -230,24 +185,12 @@ public class BiometricTestSession implements AutoCloseable {
@Override
@RequiresPermission(TEST_BIOMETRIC)
public void close() {
- // Cleanup can be performed using the test HAL, since it always responds to enumerate with
- // zero enrollments.
- if (!mTestedUsers.isEmpty()) {
- mCloseLatch = new CountDownLatch(1);
- for (int user : mTestedUsers) {
- cleanupInternalState(user);
- }
-
- try {
- Log.d(TAG, "Awaiting latch...");
- mCloseLatch.await(10, TimeUnit.SECONDS);
- Log.d(TAG, "Finished awaiting");
- } catch (InterruptedException e) {
- Log.e(TAG, "Latch interrupted", e);
- }
- }
-
- // Disable the test HAL after the sensor becomes idle.
+ // Disable the test HAL first, so that enumerate is run on the real HAL, which should have
+ // no enrollments. Test-only framework enrollments will be deleted.
setTestHalEnabled(false);
+
+ for (int user : mTestedUsers) {
+ cleanupInternalState(user);
+ }
}
}
diff --git a/core/java/android/hardware/biometrics/IAuthService.aidl b/core/java/android/hardware/biometrics/IAuthService.aidl
index d8c9dbc849a9b..0dfd5dbf300e9 100644
--- a/core/java/android/hardware/biometrics/IAuthService.aidl
+++ b/core/java/android/hardware/biometrics/IAuthService.aidl
@@ -20,7 +20,6 @@ import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
import android.hardware.biometrics.IBiometricServiceReceiver;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.PromptInfo;
import android.hardware.biometrics.SensorPropertiesInternal;
@@ -33,7 +32,7 @@ import android.hardware.biometrics.SensorPropertiesInternal;
*/
interface IAuthService {
// Creates a test session with the specified sensorId
- ITestSession createTestSession(int sensorId, ITestSessionCallback callback, String opPackageName);
+ ITestSession createTestSession(int sensorId, String opPackageName);
// Retrieve static sensor properties for all biometric sensors
List getSensorProperties(String opPackageName);
diff --git a/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl b/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl
index 7639c5dd4d16b..c854ac9847d8c 100644
--- a/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl
+++ b/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl
@@ -20,7 +20,6 @@ import android.hardware.biometrics.IBiometricSensorReceiver;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.SensorPropertiesInternal;
import android.hardware.face.IFaceServiceReceiver;
import android.hardware.face.Face;
@@ -33,7 +32,7 @@ import android.hardware.face.Face;
interface IBiometricAuthenticator {
// Creates a test session
- ITestSession createTestSession(ITestSessionCallback callback, String opPackageName);
+ ITestSession createTestSession(String opPackageName);
// Retrieve static sensor properties
SensorPropertiesInternal getSensorProperties(String opPackageName);
diff --git a/core/java/android/hardware/biometrics/IBiometricService.aidl b/core/java/android/hardware/biometrics/IBiometricService.aidl
index 24331863a05fc..a14a910a9e504 100644
--- a/core/java/android/hardware/biometrics/IBiometricService.aidl
+++ b/core/java/android/hardware/biometrics/IBiometricService.aidl
@@ -21,7 +21,6 @@ import android.hardware.biometrics.IBiometricServiceReceiver;
import android.hardware.biometrics.IBiometricAuthenticator;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.PromptInfo;
import android.hardware.biometrics.SensorPropertiesInternal;
@@ -31,7 +30,7 @@ import android.hardware.biometrics.SensorPropertiesInternal;
*/
interface IBiometricService {
// Creates a test session with the specified sensorId
- ITestSession createTestSession(int sensorId, ITestSessionCallback callback, String opPackageName);
+ ITestSession createTestSession(int sensorId, String opPackageName);
// Retrieve static sensor properties for all biometric sensors
List getSensorProperties(String opPackageName);
diff --git a/core/java/android/hardware/biometrics/ITestSession.aidl b/core/java/android/hardware/biometrics/ITestSession.aidl
index f8395a119c0b4..fa7a62c53531e 100644
--- a/core/java/android/hardware/biometrics/ITestSession.aidl
+++ b/core/java/android/hardware/biometrics/ITestSession.aidl
@@ -18,7 +18,7 @@ package android.hardware.biometrics;
import android.hardware.biometrics.SensorPropertiesInternal;
/**
- * A test service for FingerprintManager and BiometricManager.
+ * A test service for FingerprintManager and BiometricPrompt.
* @hide
*/
interface ITestSession {
diff --git a/core/java/android/hardware/biometrics/ITestSessionCallback.aidl b/core/java/android/hardware/biometrics/ITestSessionCallback.aidl
deleted file mode 100644
index 3d9517f29548f..0000000000000
--- a/core/java/android/hardware/biometrics/ITestSessionCallback.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.hardware.biometrics;
-
-/**
- * ITestSession callback for FingerprintManager and BiometricManager.
- * @hide
- */
-interface ITestSessionCallback {
- void onCleanupStarted(int userId);
- void onCleanupFinished(int userId);
-}
diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl
index 6e7c701ef5ff8..a2e0b3b1cb411 100644
--- a/core/java/android/hardware/face/IFaceService.aidl
+++ b/core/java/android/hardware/face/IFaceService.aidl
@@ -19,7 +19,6 @@ import android.hardware.biometrics.IBiometricSensorReceiver;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.face.IFaceServiceReceiver;
import android.hardware.face.Face;
import android.hardware.face.FaceSensorPropertiesInternal;
@@ -33,7 +32,7 @@ import android.view.Surface;
interface IFaceService {
// Creates a test session with the specified sensorId
- ITestSession createTestSession(int sensorId, ITestSessionCallback callback, String opPackageName);
+ ITestSession createTestSession(int sensorId, String opPackageName);
// Requests a proto dump of the specified sensor
byte[] dumpSensorServiceStateProto(int sensorId, boolean clearSchedulerBuffer);
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index 9d086cf203e29..6df2764d3f8bf 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -154,8 +154,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
public BiometricTestSession createTestSession(int sensorId) {
try {
return new BiometricTestSession(mContext, sensorId,
- (context, sensorId1, callback) -> mService
- .createTestSession(sensorId1, callback, context.getOpPackageName()));
+ mService.createTestSession(sensorId, mContext.getOpPackageName()));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index 054c0d0f65132..1694fef0f71bf 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -19,7 +19,6 @@ import android.hardware.biometrics.IBiometricSensorReceiver;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.hardware.fingerprint.IUdfpsOverlayController;
@@ -34,7 +33,7 @@ import java.util.List;
interface IFingerprintService {
// Creates a test session with the specified sensorId
- ITestSession createTestSession(int sensorId, ITestSessionCallback callback, String opPackageName);
+ ITestSession createTestSession(int sensorId, String opPackageName);
// Requests a proto dump of the specified sensor
byte[] dumpSensorServiceStateProto(int sensorId, boolean clearSchedulerBuffer);
diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java
index e19745e5c5780..b15a8869b22a4 100644
--- a/services/core/java/com/android/server/biometrics/AuthService.java
+++ b/services/core/java/com/android/server/biometrics/AuthService.java
@@ -40,7 +40,6 @@ import android.hardware.biometrics.IBiometricService;
import android.hardware.biometrics.IBiometricServiceReceiver;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.PromptInfo;
import android.hardware.biometrics.SensorPropertiesInternal;
import android.hardware.face.IFaceService;
@@ -145,14 +144,13 @@ public class AuthService extends SystemService {
private final class AuthServiceImpl extends IAuthService.Stub {
@Override
- public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
- @NonNull String opPackageName) throws RemoteException {
+ public ITestSession createTestSession(int sensorId, @NonNull String opPackageName)
+ throws RemoteException {
Utils.checkPermission(getContext(), TEST_BIOMETRIC);
final long identity = Binder.clearCallingIdentity();
try {
- return mInjector.getBiometricService()
- .createTestSession(sensorId, callback, opPackageName);
+ return mInjector.getBiometricService().createTestSession(sensorId, opPackageName);
} finally {
Binder.restoreCallingIdentity(identity);
}
diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java
index 00a4e43f347dc..614c5f1b65bfb 100644
--- a/services/core/java/com/android/server/biometrics/BiometricService.java
+++ b/services/core/java/com/android/server/biometrics/BiometricService.java
@@ -44,7 +44,6 @@ import android.hardware.biometrics.IBiometricServiceReceiver;
import android.hardware.biometrics.IBiometricSysuiReceiver;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.PromptInfo;
import android.hardware.biometrics.SensorPropertiesInternal;
import android.hardware.fingerprint.FingerprintManager;
@@ -571,13 +570,13 @@ public class BiometricService extends SystemService {
*/
private final class BiometricServiceWrapper extends IBiometricService.Stub {
@Override // Binder call
- public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
- @NonNull String opPackageName) throws RemoteException {
+ public ITestSession createTestSession(int sensorId, @NonNull String opPackageName)
+ throws RemoteException {
checkInternalPermission();
for (BiometricSensor sensor : mSensors) {
if (sensor.id == sensorId) {
- return sensor.impl.createTestSession(callback, opPackageName);
+ return sensor.impl.createTestSession(opPackageName);
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java
index 06b049be4501d..f37cf18a13207 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java
@@ -21,7 +21,6 @@ import android.hardware.biometrics.IBiometricAuthenticator;
import android.hardware.biometrics.IBiometricSensorReceiver;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.SensorPropertiesInternal;
import android.hardware.face.IFaceService;
import android.os.IBinder;
@@ -42,9 +41,8 @@ public final class FaceAuthenticator extends IBiometricAuthenticator.Stub {
}
@Override
- public ITestSession createTestSession(@NonNull ITestSessionCallback callback,
- @NonNull String opPackageName) throws RemoteException {
- return mFaceService.createTestSession(mSensorId, callback, opPackageName);
+ public ITestSession createTestSession(@NonNull String opPackageName) throws RemoteException {
+ return mFaceService.createTestSession(mSensorId, opPackageName);
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
index 6dbd590df8515..b0433d67ff32f 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
@@ -31,7 +31,6 @@ import android.hardware.biometrics.IBiometricService;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.face.IFace;
import android.hardware.biometrics.face.SensorProps;
import android.hardware.face.Face;
@@ -134,8 +133,7 @@ public class FaceService extends SystemService implements BiometricServiceCallba
*/
private final class FaceServiceWrapper extends IFaceService.Stub {
@Override
- public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
- @NonNull String opPackageName) {
+ public ITestSession createTestSession(int sensorId, @NonNull String opPackageName) {
Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
final ServiceProvider provider = getProviderForSensor(sensorId);
@@ -145,7 +143,7 @@ public class FaceService extends SystemService implements BiometricServiceCallba
return null;
}
- return provider.createTestSession(sensorId, callback, opPackageName);
+ return provider.createTestSession(sensorId, opPackageName);
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java
index 88edfbf12df11..0b522efb5bac4 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java
@@ -20,7 +20,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.face.Face;
import android.hardware.face.FaceManager;
import android.hardware.face.FaceSensorPropertiesInternal;
@@ -29,7 +28,6 @@ import android.os.IBinder;
import android.os.NativeHandle;
import android.util.proto.ProtoOutputStream;
-import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.LockoutTracker;
@@ -125,8 +123,7 @@ public interface ServiceProvider {
void startPreparedClient(int sensorId, int cookie);
- void scheduleInternalCleanup(int sensorId, int userId,
- @Nullable BaseClientMonitor.Callback callback);
+ void scheduleInternalCleanup(int sensorId, int userId);
void dumpProtoState(int sensorId, @NonNull ProtoOutputStream proto,
boolean clearSchedulerBuffer);
@@ -136,8 +133,7 @@ public interface ServiceProvider {
void dumpInternal(int sensorId, @NonNull PrintWriter pw);
@NonNull
- ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
- @NonNull String opPackageName);
+ ITestSession createTestSession(int sensorId, @NonNull String opPackageName);
void dumpHal(int sensorId, @NonNull FileDescriptor fd, @NonNull String[] args);
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java
index a5e6ddb816699..897ebd719da42 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java
@@ -21,7 +21,6 @@ import static android.Manifest.permission.TEST_BIOMETRIC;
import android.annotation.NonNull;
import android.content.Context;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.face.AuthenticationFrame;
import android.hardware.biometrics.face.BaseFrame;
import android.hardware.face.Face;
@@ -29,12 +28,10 @@ import android.hardware.face.FaceAuthenticationFrame;
import android.hardware.face.FaceEnrollFrame;
import android.hardware.face.IFaceServiceReceiver;
import android.os.Binder;
-import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.HardwareAuthTokenUtils;
import com.android.server.biometrics.Utils;
-import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.face.FaceUtils;
import java.util.HashSet;
@@ -52,7 +49,6 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
@NonNull private final Context mContext;
private final int mSensorId;
- @NonNull private final ITestSessionCallback mCallback;
@NonNull private final FaceProvider mProvider;
@NonNull private final Sensor mSensor;
@NonNull private final Set mEnrollmentIds;
@@ -136,11 +132,9 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
};
BiometricTestSessionImpl(@NonNull Context context, int sensorId,
- @NonNull ITestSessionCallback callback,
@NonNull FaceProvider provider, @NonNull Sensor sensor) {
mContext = context;
mSensorId = sensorId;
- mCallback = callback;
mProvider = provider;
mSensor = sensor;
mEnrollmentIds = new HashSet<>();
@@ -230,25 +224,6 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
public void cleanupInternalState(int userId) {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
- mProvider.scheduleInternalCleanup(mSensorId, userId, new BaseClientMonitor.Callback() {
- @Override
- public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
- try {
- mCallback.onCleanupStarted(clientMonitor.getTargetUserId());
- } catch (RemoteException e) {
- Slog.e(TAG, "Remote exception", e);
- }
- }
-
- @Override
- public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
- boolean success) {
- try {
- mCallback.onCleanupFinished(clientMonitor.getTargetUserId());
- } catch (RemoteException e) {
- Slog.e(TAG, "Remote exception", e);
- }
- }
- });
+ mProvider.scheduleInternalCleanup(mSensorId, userId);
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
index 1d8f210b394e6..e7f9aa597b13e 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
@@ -25,7 +25,6 @@ import android.content.Context;
import android.content.pm.UserInfo;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.face.IFace;
import android.hardware.biometrics.face.SensorProps;
import android.hardware.face.Face;
@@ -178,8 +177,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
for (int i = 0; i < mSensors.size(); i++) {
final int sensorId = mSensors.keyAt(i);
scheduleLoadAuthenticatorIds(sensorId);
- scheduleInternalCleanup(sensorId, ActivityManager.getCurrentUser(),
- null /* callback */);
+ scheduleInternalCleanup(sensorId, ActivityManager.getCurrentUser());
}
return mDaemon;
@@ -564,8 +562,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
}
@Override
- public void scheduleInternalCleanup(int sensorId, int userId,
- @Nullable BaseClientMonitor.Callback callback) {
+ public void scheduleInternalCleanup(int sensorId, int userId) {
mHandler.post(() -> {
final IFace daemon = getHalInstance();
if (daemon == null) {
@@ -586,7 +583,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
FaceUtils.getInstance(sensorId),
mSensors.get(sensorId).getAuthenticatorIds());
- mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client, callback);
+ mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client);
} catch (RemoteException e) {
Slog.e(getTag(), "Remote exception when scheduling internal cleanup", e);
}
@@ -649,9 +646,8 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
@NonNull
@Override
- public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
- @NonNull String opPackageName) {
- return mSensors.get(sensorId).createTestSession(callback);
+ public ITestSession createTestSession(int sensorId, @NonNull String opPackageName) {
+ return mSensors.get(sensorId).createTestSession();
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
index 3434acbf73cc2..4925ce0bb2b15 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
@@ -22,7 +22,6 @@ import android.content.Context;
import android.content.pm.UserInfo;
import android.hardware.biometrics.BiometricsProtoEnums;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.face.AuthenticationFrame;
import android.hardware.biometrics.face.EnrollmentFrame;
import android.hardware.biometrics.face.Error;
@@ -460,9 +459,8 @@ public class Sensor {
}
}
- @NonNull ITestSession createTestSession(@NonNull ITestSessionCallback callback) {
- return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback,
- mProvider, this);
+ @NonNull ITestSession createTestSession() {
+ return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, mProvider, this);
}
void createNewSession(@NonNull IFace daemon, int sensorId, int userId)
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java
index e8668ed1b6c57..d519d60881c0a 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java
@@ -21,17 +21,14 @@ import static android.Manifest.permission.TEST_BIOMETRIC;
import android.annotation.NonNull;
import android.content.Context;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.face.Face;
import android.hardware.face.FaceAuthenticationFrame;
import android.hardware.face.FaceEnrollFrame;
import android.hardware.face.IFaceServiceReceiver;
import android.os.Binder;
-import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.Utils;
-import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.face.FaceUtils;
import java.util.ArrayList;
@@ -46,7 +43,6 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
@NonNull private final Context mContext;
private final int mSensorId;
- @NonNull private final ITestSessionCallback mCallback;
@NonNull private final Face10 mFace10;
@NonNull private final Face10.HalResultController mHalResultController;
@NonNull private final Set mEnrollmentIds;
@@ -124,12 +120,10 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
}
};
- BiometricTestSessionImpl(@NonNull Context context, int sensorId,
- @NonNull ITestSessionCallback callback, @NonNull Face10 face10,
+ BiometricTestSessionImpl(@NonNull Context context, int sensorId, @NonNull Face10 face10,
@NonNull Face10.HalResultController halResultController) {
mContext = context;
mSensorId = sensorId;
- mCallback = callback;
mFace10 = face10;
mHalResultController = halResultController;
mEnrollmentIds = new HashSet<>();
@@ -207,25 +201,6 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
public void cleanupInternalState(int userId) {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
- mFace10.scheduleInternalCleanup(mSensorId, userId, new BaseClientMonitor.Callback() {
- @Override
- public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
- try {
- mCallback.onCleanupStarted(clientMonitor.getTargetUserId());
- } catch (RemoteException e) {
- Slog.e(TAG, "Remote exception", e);
- }
- }
-
- @Override
- public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
- boolean success) {
- try {
- mCallback.onCleanupFinished(clientMonitor.getTargetUserId());
- } catch (RemoteException e) {
- Slog.e(TAG, "Remote exception", e);
- }
- }
- });
+ mFace10.scheduleInternalCleanup(mSensorId, userId);
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
index ee8823e041bc7..298950fa325a8 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
@@ -29,7 +29,6 @@ import android.hardware.biometrics.BiometricFaceConstants;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricsProtoEnums;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
import android.hardware.biometrics.face.V1_0.IBiometricsFaceClientCallback;
import android.hardware.face.Face;
@@ -124,7 +123,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
private final UserSwitchObserver mUserSwitchObserver = new SynchronousUserSwitchObserver() {
@Override
public void onUserSwitching(int newUserId) {
- scheduleInternalCleanup(newUserId, null /* callback */);
+ scheduleInternalCleanup(newUserId);
scheduleGetFeature(mSensorId, new Binder(), newUserId,
BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION,
null, mContext.getOpPackageName());
@@ -438,7 +437,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
Slog.d(TAG, "Face HAL ready, HAL ID: " + halId);
if (halId != 0) {
scheduleLoadAuthenticatorIds();
- scheduleInternalCleanup(ActivityManager.getCurrentUser(), null /* callback */);
+ scheduleInternalCleanup(ActivityManager.getCurrentUser());
scheduleGetFeature(mSensorId, new Binder(),
ActivityManager.getCurrentUser(),
BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION, null,
@@ -757,8 +756,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
});
}
- private void scheduleInternalCleanup(int userId,
- @Nullable BaseClientMonitor.Callback callback) {
+ private void scheduleInternalCleanup(int userId) {
mHandler.post(() -> {
scheduleUpdateActiveUserWithoutHandler(userId);
@@ -766,14 +764,13 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
final FaceInternalCleanupClient client = new FaceInternalCleanupClient(mContext,
mLazyDaemon, userId, mContext.getOpPackageName(), mSensorId, enrolledList,
FaceUtils.getLegacyInstance(mSensorId), mAuthenticatorIds);
- mScheduler.scheduleClientMonitor(client, callback);
+ mScheduler.scheduleClientMonitor(client);
});
}
@Override
- public void scheduleInternalCleanup(int sensorId, int userId,
- @Nullable BaseClientMonitor.Callback callback) {
- scheduleInternalCleanup(userId, callback);
+ public void scheduleInternalCleanup(int sensorId, int userId) {
+ scheduleInternalCleanup(userId);
}
@Override
@@ -947,9 +944,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
@NonNull
@Override
- public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
- @NonNull String opPackageName) {
- return new BiometricTestSessionImpl(mContext, mSensorId, callback, this,
- mHalResultController);
+ public ITestSession createTestSession(int sensorId, @NonNull String opPackageName) {
+ return new BiometricTestSessionImpl(mContext, mSensorId, this, mHalResultController);
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java
index 32e9409de4b2d..34a909908b5ab 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java
@@ -21,7 +21,6 @@ import android.hardware.biometrics.IBiometricAuthenticator;
import android.hardware.biometrics.IBiometricSensorReceiver;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.SensorPropertiesInternal;
import android.hardware.fingerprint.IFingerprintService;
import android.os.IBinder;
@@ -43,9 +42,8 @@ public final class FingerprintAuthenticator extends IBiometricAuthenticator.Stub
}
@Override
- public ITestSession createTestSession(@NonNull ITestSessionCallback callback,
- @NonNull String opPackageName) throws RemoteException {
- return mFingerprintService.createTestSession(mSensorId, callback, opPackageName);
+ public ITestSession createTestSession(@NonNull String opPackageName) throws RemoteException {
+ return mFingerprintService.createTestSession(mSensorId, opPackageName);
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
index 396dd5f42d4d8..b302931b99615 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
@@ -43,7 +43,6 @@ import android.hardware.biometrics.IBiometricService;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.fingerprint.IFingerprint;
import android.hardware.biometrics.fingerprint.SensorProps;
import android.hardware.fingerprint.Fingerprint;
@@ -110,8 +109,7 @@ public class FingerprintService extends SystemService implements BiometricServic
*/
private final class FingerprintServiceWrapper extends IFingerprintService.Stub {
@Override
- public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
- @NonNull String opPackageName) {
+ public ITestSession createTestSession(int sensorId, @NonNull String opPackageName) {
Utils.checkPermission(getContext(), TEST_BIOMETRIC);
final ServiceProvider provider = getProviderForSensor(sensorId);
@@ -121,7 +119,7 @@ public class FingerprintService extends SystemService implements BiometricServic
return null;
}
- return provider.createTestSession(sensorId, callback, opPackageName);
+ return provider.createTestSession(sensorId, opPackageName);
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
index dfec2e3e308f7..8785070f0afad 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
@@ -20,7 +20,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
@@ -29,7 +28,6 @@ import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.IBinder;
import android.util.proto.ProtoOutputStream;
-import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.LockoutTracker;
@@ -104,8 +102,7 @@ public interface ServiceProvider {
@NonNull IFingerprintServiceReceiver receiver, int userId,
@NonNull String opPackageName);
- void scheduleInternalCleanup(int sensorId, int userId,
- @Nullable BaseClientMonitor.Callback callback);
+ void scheduleInternalCleanup(int sensorId, int userId);
boolean isHardwareDetected(int sensorId);
@@ -140,6 +137,5 @@ public interface ServiceProvider {
void dumpInternal(int sensorId, @NonNull PrintWriter pw);
@NonNull
- ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
- @NonNull String opPackageName);
+ ITestSession createTestSession(int sensorId, @NonNull String opPackageName);
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java
index 20b32543f7a03..ea9c709ec79f5 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java
@@ -21,17 +21,14 @@ import static android.Manifest.permission.TEST_BIOMETRIC;
import android.annotation.NonNull;
import android.content.Context;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.os.Binder;
-import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.HardwareAuthTokenUtils;
import com.android.server.biometrics.Utils;
-import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
import java.util.HashSet;
@@ -49,7 +46,6 @@ class BiometricTestSessionImpl extends ITestSession.Stub {
@NonNull private final Context mContext;
private final int mSensorId;
- @NonNull private final ITestSessionCallback mCallback;
@NonNull private final FingerprintProvider mProvider;
@NonNull private final Sensor mSensor;
@NonNull private final Set mEnrollmentIds;
@@ -114,11 +110,9 @@ class BiometricTestSessionImpl extends ITestSession.Stub {
};
BiometricTestSessionImpl(@NonNull Context context, int sensorId,
- @NonNull ITestSessionCallback callback, @NonNull FingerprintProvider provider,
- @NonNull Sensor sensor) {
+ @NonNull FingerprintProvider provider, @NonNull Sensor sensor) {
mContext = context;
mSensorId = sensorId;
- mCallback = callback;
mProvider = provider;
mSensor = sensor;
mEnrollmentIds = new HashSet<>();
@@ -198,25 +192,6 @@ class BiometricTestSessionImpl extends ITestSession.Stub {
public void cleanupInternalState(int userId) {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
- mProvider.scheduleInternalCleanup(mSensorId, userId, new BaseClientMonitor.Callback() {
- @Override
- public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
- try {
- mCallback.onCleanupStarted(clientMonitor.getTargetUserId());
- } catch (RemoteException e) {
- Slog.e(TAG, "Remote exception", e);
- }
- }
-
- @Override
- public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
- boolean success) {
- try {
- mCallback.onCleanupFinished(clientMonitor.getTargetUserId());
- } catch (RemoteException e) {
- Slog.e(TAG, "Remote exception", e);
- }
- }
- });
+ mProvider.scheduleInternalCleanup(mSensorId, userId);
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
index 598cc8992c2db..e3502cb1038f3 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
@@ -25,7 +25,6 @@ import android.content.Context;
import android.content.pm.UserInfo;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.fingerprint.IFingerprint;
import android.hardware.biometrics.fingerprint.SensorProps;
import android.hardware.fingerprint.Fingerprint;
@@ -186,8 +185,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
for (int i = 0; i < mSensors.size(); i++) {
final int sensorId = mSensors.keyAt(i);
scheduleLoadAuthenticatorIds(sensorId);
- scheduleInternalCleanup(sensorId, ActivityManager.getCurrentUser(),
- null /* callback */);
+ scheduleInternalCleanup(sensorId, ActivityManager.getCurrentUser());
}
return mDaemon;
@@ -541,8 +539,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
}
@Override
- public void scheduleInternalCleanup(int sensorId, int userId,
- @Nullable BaseClientMonitor.Callback callback) {
+ public void scheduleInternalCleanup(int sensorId, int userId) {
mHandler.post(() -> {
final IFingerprint daemon = getHalInstance();
if (daemon == null) {
@@ -562,7 +559,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
mContext.getOpPackageName(), sensorId, enrolledList,
FingerprintUtils.getInstance(sensorId),
mSensors.get(sensorId).getAuthenticatorIds());
- mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client, callback);
+ mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client);
} catch (RemoteException e) {
Slog.e(getTag(), "Remote exception when scheduling internal cleanup", e);
}
@@ -707,9 +704,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
@NonNull
@Override
- public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
- @NonNull String opPackageName) {
- return mSensors.get(sensorId).createTestSession(callback);
+ public ITestSession createTestSession(int sensorId, @NonNull String opPackageName) {
+ return mSensors.get(sensorId).createTestSession();
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
index a98e7db43f790..c83c0fba01335 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
@@ -22,7 +22,6 @@ import android.content.Context;
import android.content.pm.UserInfo;
import android.hardware.biometrics.BiometricsProtoEnums;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.fingerprint.Error;
import android.hardware.biometrics.fingerprint.IFingerprint;
import android.hardware.biometrics.fingerprint.ISession;
@@ -440,9 +439,8 @@ class Sensor {
}
}
- @NonNull ITestSession createTestSession(@NonNull ITestSessionCallback callback) {
- return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback,
- mProvider, this);
+ @NonNull ITestSession createTestSession() {
+ return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, mProvider, this);
}
void createNewSession(@NonNull IFingerprint daemon, int sensorId, int userId)
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java
index 766a8829e9682..312ee0a267ac3 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java
@@ -21,16 +21,13 @@ import static android.Manifest.permission.TEST_BIOMETRIC;
import android.annotation.NonNull;
import android.content.Context;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.os.Binder;
-import android.os.RemoteException;
import android.util.Slog;
import com.android.server.biometrics.Utils;
-import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
import java.util.ArrayList;
@@ -50,7 +47,6 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
@NonNull private final Context mContext;
private final int mSensorId;
- @NonNull private final ITestSessionCallback mCallback;
@NonNull private final Fingerprint21 mFingerprint21;
@NonNull private final Fingerprint21.HalResultController mHalResultController;
@NonNull private final Set mEnrollmentIds;
@@ -115,12 +111,10 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
};
BiometricTestSessionImpl(@NonNull Context context, int sensorId,
- @NonNull ITestSessionCallback callback,
@NonNull Fingerprint21 fingerprint21,
@NonNull Fingerprint21.HalResultController halResultController) {
mContext = context;
mSensorId = sensorId;
- mCallback = callback;
mFingerprint21 = fingerprint21;
mHalResultController = halResultController;
mEnrollmentIds = new HashSet<>();
@@ -197,25 +191,6 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
public void cleanupInternalState(int userId) {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
- mFingerprint21.scheduleInternalCleanup(mSensorId, userId, new BaseClientMonitor.Callback() {
- @Override
- public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
- try {
- mCallback.onCleanupStarted(clientMonitor.getTargetUserId());
- } catch (RemoteException e) {
- Slog.e(TAG, "Remote exception", e);
- }
- }
-
- @Override
- public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
- boolean success) {
- try {
- mCallback.onCleanupFinished(clientMonitor.getTargetUserId());
- } catch (RemoteException e) {
- Slog.e(TAG, "Remote exception", e);
- }
- }
- });
+ mFingerprint21.scheduleInternalCleanup(mSensorId, userId);
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
index 6e22a797b435b..bedd66465a1a4 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
@@ -30,7 +30,6 @@ import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricsProtoEnums;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
import android.hardware.biometrics.fingerprint.V2_2.IBiometricsFingerprintClientCallback;
import android.hardware.fingerprint.Fingerprint;
@@ -159,7 +158,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
private final UserSwitchObserver mUserSwitchObserver = new SynchronousUserSwitchObserver() {
@Override
public void onUserSwitching(int newUserId) {
- scheduleInternalCleanup(newUserId, null /* callback */);
+ scheduleInternalCleanup(newUserId);
}
};
@@ -438,7 +437,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
Slog.d(TAG, "Fingerprint HAL ready, HAL ID: " + halId);
if (halId != 0) {
scheduleLoadAuthenticatorIds();
- scheduleInternalCleanup(ActivityManager.getCurrentUser(), null /* callback */);
+ scheduleInternalCleanup(ActivityManager.getCurrentUser());
} else {
Slog.e(TAG, "Unable to set callback");
mDaemon = null;
@@ -662,8 +661,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
});
}
- private void scheduleInternalCleanup(int userId,
- @Nullable BaseClientMonitor.Callback callback) {
+ private void scheduleInternalCleanup(int userId) {
mHandler.post(() -> {
scheduleUpdateActiveUserWithoutHandler(userId);
@@ -673,14 +671,13 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
mContext, mLazyDaemon, userId, mContext.getOpPackageName(),
mSensorProperties.sensorId, enrolledList,
FingerprintUtils.getLegacyInstance(mSensorId), mAuthenticatorIds);
- mScheduler.scheduleClientMonitor(client, callback);
+ mScheduler.scheduleClientMonitor(client);
});
}
@Override
- public void scheduleInternalCleanup(int sensorId, int userId,
- @Nullable BaseClientMonitor.Callback callback) {
- scheduleInternalCleanup(userId, callback);
+ public void scheduleInternalCleanup(int sensorId, int userId) {
+ scheduleInternalCleanup(userId);
}
@Override
@@ -860,9 +857,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@NonNull
@Override
- public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
- @NonNull String opPackageName) {
- return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback, this,
+ public ITestSession createTestSession(int sensorId, @NonNull String opPackageName) {
+ return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, this,
mHalResultController);
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java
index f44e0691bb9d0..8e84613b2d645 100644
--- a/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java
+++ b/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java
@@ -21,7 +21,6 @@ import android.hardware.biometrics.IBiometricAuthenticator;
import android.hardware.biometrics.IBiometricSensorReceiver;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
-import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.SensorPropertiesInternal;
import android.hardware.iris.IIrisService;
import android.os.IBinder;
@@ -40,8 +39,7 @@ public final class IrisAuthenticator extends IBiometricAuthenticator.Stub {
}
@Override
- public ITestSession createTestSession(@NonNull ITestSessionCallback callback,
- @NonNull String opPackageName) throws RemoteException {
+ public ITestSession createTestSession(@NonNull String opPackageName) throws RemoteException {
return null;
}
From bc56632da95b52d5f58bc8c771779a0ee8cefc49 Mon Sep 17 00:00:00 2001
From: Daniel Chapin
Date: Fri, 19 Feb 2021 19:10:04 +0000
Subject: [PATCH 014/176] Revert "Update RemovalClient to support new biometric
AIDL"
Revert submission 13593269
Reason for revert: Bug: 180689674
Reverted Changes:
I59f6e607f:Update RemovalClient to support new biometric AIDL...
I3fdb3fe0b:Try to ensure tests run sequentially
Change-Id: I939172f2961f3f2c9f8eddd59261f75552eeb31f
(cherry picked from commit 62e2c705c50c3def86a401804c2a5d07bffbf290)
---
.../android/hardware/face/FaceManager.java | 23 +++++--------------
.../android/hardware/face/IFaceService.aidl | 5 +---
.../fingerprint/FingerprintManager.java | 21 ++++-------------
.../fingerprint/IFingerprintService.aidl | 3 ---
.../biometrics/sensors/RemovalClient.java | 7 +++---
.../biometrics/sensors/face/FaceService.java | 17 +-------------
.../sensors/face/ServiceProvider.java | 3 ---
.../face/aidl/FaceInternalCleanupClient.java | 4 ++--
.../sensors/face/aidl/FaceProvider.java | 21 +----------------
.../sensors/face/aidl/FaceRemovalClient.java | 13 ++++-------
.../biometrics/sensors/face/hidl/Face10.java | 14 -----------
.../sensors/face/hidl/FaceRemovalClient.java | 5 +---
.../fingerprint/FingerprintService.java | 16 +------------
.../sensors/fingerprint/ServiceProvider.java | 4 ----
.../FingerprintInternalCleanupClient.java | 4 ++--
.../fingerprint/aidl/FingerprintProvider.java | 23 +------------------
.../aidl/FingerprintRemovalClient.java | 10 ++++----
.../fingerprint/hidl/Fingerprint21.java | 17 --------------
.../hidl/FingerprintRemovalClient.java | 5 +---
.../locksettings/LockSettingsService.java | 23 ++++++++++++-------
.../LockSettingsServiceTests.java | 8 +++----
21 files changed, 54 insertions(+), 192 deletions(-)
diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java
index a9bcdeff7e477..886a8c1fdae57 100644
--- a/core/java/android/hardware/face/FaceManager.java
+++ b/core/java/android/hardware/face/FaceManager.java
@@ -574,23 +574,12 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan
mService.remove(mToken, face.getBiometricId(), userId, mServiceReceiver,
mContext.getOpPackageName());
} catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
- }
-
- /**
- * Removes all face templates for the given user.
- * @hide
- */
- @RequiresPermission(MANAGE_BIOMETRIC)
- public void removeAll(int userId, @NonNull RemovalCallback callback) {
- if (mService != null) {
- try {
- mRemovalCallback = callback;
- mService.removeAll(mToken, userId, mServiceReceiver, mContext.getOpPackageName());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ Slog.w(TAG, "Remote exception in remove: ", e);
+ if (callback != null) {
+ callback.onRemovalError(face, FACE_ERROR_HW_UNAVAILABLE,
+ getErrorString(mContext, FACE_ERROR_HW_UNAVAILABLE,
+ 0 /* vendorCode */));
+ }
}
}
}
diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl
index a2e0b3b1cb411..a3e7e2d2c5cbc 100644
--- a/core/java/android/hardware/face/IFaceService.aidl
+++ b/core/java/android/hardware/face/IFaceService.aidl
@@ -83,13 +83,10 @@ interface IFaceService {
// Cancel enrollment in progress
void cancelEnrollment(IBinder token);
- // Removes the specified face enrollment for the specified userId.
+ // Any errors resulting from this call will be returned to the listener
void remove(IBinder token, int faceId, int userId, IFaceServiceReceiver receiver,
String opPackageName);
- // Removes all face enrollments for the specified userId.
- void removeAll(IBinder token, int userId, IFaceServiceReceiver receiver, String opPackageName);
-
// Get the enrolled face for user.
List getEnrolledFaces(int sensorId, int userId, String opPackageName);
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index 6df2764d3f8bf..a614ebfe1793a 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -739,22 +739,11 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
mService.remove(mToken, fp.getBiometricId(), userId, mServiceReceiver,
mContext.getOpPackageName());
} catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Removes all face templates for the given user.
- * @hide
- */
- @RequiresPermission(MANAGE_FINGERPRINT)
- public void removeAll(int userId, @NonNull RemovalCallback callback) {
- if (mService != null) {
- try {
- mRemovalCallback = callback;
- mService.removeAll(mToken, userId, mServiceReceiver, mContext.getOpPackageName());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ Slog.w(TAG, "Remote exception in remove: ", e);
+ if (callback != null) {
+ callback.onRemovalError(fp, FINGERPRINT_ERROR_HW_UNAVAILABLE,
+ getErrorString(mContext, FINGERPRINT_ERROR_HW_UNAVAILABLE,
+ 0 /* vendorCode */));
}
}
}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index 1694fef0f71bf..8888247e2823f 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -87,9 +87,6 @@ interface IFingerprintService {
void remove(IBinder token, int fingerId, int userId, IFingerprintServiceReceiver receiver,
String opPackageName);
- // Removes all face enrollments for the specified userId.
- void removeAll(IBinder token, int userId, IFingerprintServiceReceiver receiver, String opPackageName);
-
// Rename the fingerprint specified by fingerId and userId to the given name
void rename(int fingerId, int userId, String name);
diff --git a/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java b/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java
index 16f82af938560..e0626952fac3c 100644
--- a/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java
@@ -37,16 +37,18 @@ public abstract class RemovalClient mBiometricUtils;
private final Map mAuthenticatorIds;
public RemovalClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon,
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
- int userId, @NonNull String owner, @NonNull BiometricUtils utils, int sensorId,
- @NonNull Map authenticatorIds, int statsModality) {
+ int biometricId, int userId, @NonNull String owner, @NonNull BiometricUtils utils,
+ int sensorId, @NonNull Map authenticatorIds, int statsModality) {
super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
statsModality, BiometricsProtoEnums.ACTION_REMOVE,
BiometricsProtoEnums.CLIENT_UNKNOWN);
+ mBiometricId = biometricId;
mBiometricUtils = utils;
mAuthenticatorIds = authenticatorIds;
}
@@ -66,7 +68,6 @@ public abstract class RemovalClient provider = getSingleProvider();
- if (provider == null) {
- Slog.w(TAG, "Null provider for removeAll");
- return;
- }
-
- provider.second.scheduleRemoveAll(provider.first, token, userId, receiver,
- opPackageName);
- }
-
- @Override // Binder call
+ @Override
public void addLockoutResetCallback(final IBiometricServiceLockoutResetCallback callback,
final String opPackageName) {
Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java
index 0b522efb5bac4..cc24b8960e756 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java
@@ -109,9 +109,6 @@ public interface ServiceProvider {
void scheduleRemove(int sensorId, @NonNull IBinder token, int faceId, int userId,
@NonNull IFaceServiceReceiver receiver, @NonNull String opPackageName);
- void scheduleRemoveAll(int sensorId, @NonNull IBinder token, int userId,
- @NonNull IFaceServiceReceiver receiver, @NonNull String opPackageName);
-
void scheduleResetLockout(int sensorId, int userId, @NonNull byte[] hardwareAuthToken);
void scheduleSetFeature(int sensorId, @NonNull IBinder token, int userId, int feature,
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInternalCleanupClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInternalCleanupClient.java
index c6696aed6520d..9680e4e1841e7 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInternalCleanupClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceInternalCleanupClient.java
@@ -61,7 +61,7 @@ class FaceInternalCleanupClient extends InternalCleanupClient {
// Internal remove does not need to send results to anyone. Cleanup (enumerate + remove)
// is all done internally.
return new FaceRemovalClient(context, lazyDaemon, token,
- null /* ClientMonitorCallbackConverter */, new int[] {biometricId}, userId, owner,
- utils, sensorId, authenticatorIds);
+ null /* ClientMonitorCallbackConverter */, biometricId, userId, owner, utils,
+ sensorId, authenticatorIds);
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
index e7f9aa597b13e..1b6b9d70d5ac8 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
@@ -468,25 +468,6 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
@Override
public void scheduleRemove(int sensorId, @NonNull IBinder token, int faceId, int userId,
@NonNull IFaceServiceReceiver receiver, @NonNull String opPackageName) {
- scheduleRemoveSpecifiedIds(sensorId, token, new int[] {faceId}, userId, receiver,
- opPackageName);
- }
-
- @Override
- public void scheduleRemoveAll(int sensorId, @NonNull IBinder token, int userId,
- @NonNull IFaceServiceReceiver receiver, @NonNull String opPackageName) {
- final List faces = FaceUtils.getInstance(sensorId)
- .getBiometricsForUser(mContext, userId);
- final int[] faceIds = new int[faces.size()];
- for (int i = 0; i < faces.size(); i++) {
- faceIds[i] = faces.get(i).getBiometricId();
- }
-
- scheduleRemoveSpecifiedIds(sensorId, token, faceIds, userId, receiver, opPackageName);
- }
-
- private void scheduleRemoveSpecifiedIds(int sensorId, @NonNull IBinder token, int[] faceIds,
- int userId, @NonNull IFaceServiceReceiver receiver, @NonNull String opPackageName) {
mHandler.post(() -> {
final IFace daemon = getHalInstance();
if (daemon == null) {
@@ -504,7 +485,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
final FaceRemovalClient client = new FaceRemovalClient(mContext,
mSensors.get(sensorId).getLazySession(), token,
- new ClientMonitorCallbackConverter(receiver), faceIds, userId,
+ new ClientMonitorCallbackConverter(receiver), faceId, userId,
opPackageName, FaceUtils.getInstance(sensorId), sensorId,
mSensors.get(sensorId).getAuthenticatorIds());
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceRemovalClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceRemovalClient.java
index 48796c173dd8d..1cb5031374ec2 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceRemovalClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceRemovalClient.java
@@ -38,22 +38,19 @@ import java.util.Map;
class FaceRemovalClient extends RemovalClient {
private static final String TAG = "FaceRemovalClient";
- final int[] mBiometricIds;
-
FaceRemovalClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon,
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
- int[] biometricIds, int userId, @NonNull String owner,
- @NonNull BiometricUtils utils, int sensorId,
- @NonNull Map authenticatorIds) {
- super(context, lazyDaemon, token, listener, userId, owner, utils, sensorId,
+ int biometricId, int userId, @NonNull String owner, @NonNull BiometricUtils utils,
+ int sensorId, @NonNull Map authenticatorIds) {
+ super(context, lazyDaemon, token, listener, biometricId, userId, owner, utils, sensorId,
authenticatorIds, BiometricsProtoEnums.MODALITY_FACE);
- mBiometricIds = biometricIds;
}
@Override
protected void startHalOperation() {
try {
- getFreshDaemon().removeEnrollments(mSequentialId, mBiometricIds);
+ final int[] ids = new int[]{mBiometricId};
+ getFreshDaemon().removeEnrollments(mSequentialId, ids);
} catch (RemoteException e) {
Slog.e(TAG, "Remote exception when requesting remove", e);
mCallback.onClientFinished(this, false /* success */);
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
index 298950fa325a8..e46661a5e985f 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
@@ -671,20 +671,6 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
});
}
- @Override
- public void scheduleRemoveAll(int sensorId, @NonNull IBinder token, int userId,
- @NonNull IFaceServiceReceiver receiver, @NonNull String opPackageName) {
- mHandler.post(() -> {
- scheduleUpdateActiveUserWithoutHandler(userId);
-
- // For IBiometricsFace@1.0, remove(0) means remove all enrollments
- final FaceRemovalClient client = new FaceRemovalClient(mContext, mLazyDaemon, token,
- new ClientMonitorCallbackConverter(receiver), 0 /* faceId */, userId,
- opPackageName,
- FaceUtils.getLegacyInstance(mSensorId), mSensorId, mAuthenticatorIds);
- mScheduler.scheduleClientMonitor(client);
- });
- }
@Override
public void scheduleResetLockout(int sensorId, int userId, @NonNull byte[] hardwareAuthToken) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceRemovalClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceRemovalClient.java
index 3ae201134debb..d63791c99dd45 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceRemovalClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceRemovalClient.java
@@ -38,15 +38,12 @@ import java.util.Map;
class FaceRemovalClient extends RemovalClient {
private static final String TAG = "FaceRemovalClient";
- private final int mBiometricId;
-
FaceRemovalClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon,
@NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
int biometricId, int userId, @NonNull String owner, @NonNull BiometricUtils utils,
int sensorId, @NonNull Map authenticatorIds) {
- super(context, lazyDaemon, token, listener, userId, owner, utils, sensorId,
+ super(context, lazyDaemon, token, listener, biometricId, userId, owner, utils, sensorId,
authenticatorIds, BiometricsProtoEnums.MODALITY_FACE);
- mBiometricId = biometricId;
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
index b302931b99615..b0e42cd137eb5 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
@@ -499,21 +499,7 @@ public class FingerprintService extends SystemService implements BiometricServic
opPackageName);
}
- @Override // Binder call
- public void removeAll(final IBinder token, final int userId,
- final IFingerprintServiceReceiver receiver, final String opPackageName) {
- Utils.checkPermission(getContext(), MANAGE_FINGERPRINT);
-
- final Pair provider = getSingleProvider();
- if (provider == null) {
- Slog.w(TAG, "Null provider for removeAll");
- return;
- }
- provider.second.scheduleRemoveAll(provider.first, token, receiver, userId,
- opPackageName);
- }
-
- @Override // Binder call
+ @Override
public void addLockoutResetCallback(final IBiometricServiceLockoutResetCallback callback,
final String opPackageName) {
Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
index 8785070f0afad..f672ae56e0206 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
@@ -98,10 +98,6 @@ public interface ServiceProvider {
@NonNull IFingerprintServiceReceiver receiver, int fingerId, int userId,
@NonNull String opPackageName);
- void scheduleRemoveAll(int sensorId, @NonNull IBinder token,
- @NonNull IFingerprintServiceReceiver receiver, int userId,
- @NonNull String opPackageName);
-
void scheduleInternalCleanup(int sensorId, int userId);
boolean isHardwareDetected(int sensorId);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalCleanupClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalCleanupClient.java
index 0de3f4f8cce23..2a0e984e59334 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalCleanupClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInternalCleanupClient.java
@@ -60,7 +60,7 @@ class FingerprintInternalCleanupClient extends InternalCleanupClient utils, int sensorId,
Map authenticatorIds) {
return new FingerprintRemovalClient(context, lazyDaemon, token,
- null /* ClientMonitorCallbackConverter */, new int[] {biometricId}, userId, owner,
- utils, sensorId, authenticatorIds);
+ null /* ClientMonitorCallbackConverter */, biometricId, userId, owner, utils,
+ sensorId, authenticatorIds);
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
index e3502cb1038f3..0bd2f241ed8d2 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
@@ -490,27 +490,6 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
public void scheduleRemove(int sensorId, @NonNull IBinder token,
@NonNull IFingerprintServiceReceiver receiver, int fingerId, int userId,
@NonNull String opPackageName) {
- scheduleRemoveSpecifiedIds(sensorId, token, new int[] {fingerId}, userId, receiver,
- opPackageName);
- }
-
- @Override
- public void scheduleRemoveAll(int sensorId, @NonNull IBinder token,
- @NonNull IFingerprintServiceReceiver receiver, int userId,
- @NonNull String opPackageName) {
- final List fingers = FingerprintUtils.getInstance(sensorId)
- .getBiometricsForUser(mContext, userId);
- final int[] fingerIds = new int[fingers.size()];
- for (int i = 0; i < fingers.size(); i++) {
- fingerIds[i] = fingers.get(i).getBiometricId();
- }
-
- scheduleRemoveSpecifiedIds(sensorId, token, fingerIds, userId, receiver, opPackageName);
- }
-
- private void scheduleRemoveSpecifiedIds(int sensorId, @NonNull IBinder token,
- int[] fingerprintIds, int userId, @NonNull IFingerprintServiceReceiver receiver,
- @NonNull String opPackageName) {
mHandler.post(() -> {
final IFingerprint daemon = getHalInstance();
if (daemon == null) {
@@ -528,7 +507,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
final FingerprintRemovalClient client = new FingerprintRemovalClient(mContext,
mSensors.get(sensorId).getLazySession(), token,
- new ClientMonitorCallbackConverter(receiver), fingerprintIds, userId,
+ new ClientMonitorCallbackConverter(receiver), fingerId, userId,
opPackageName, FingerprintUtils.getInstance(sensorId), sensorId,
mSensors.get(sensorId).getAuthenticatorIds());
mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRemovalClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRemovalClient.java
index c622208262e01..4a99a7b29638b 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRemovalClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRemovalClient.java
@@ -39,22 +39,20 @@ import java.util.Map;
class FingerprintRemovalClient extends RemovalClient {
private static final String TAG = "FingerprintRemovalClient";
- private final int[] mBiometricIds;
-
FingerprintRemovalClient(@NonNull Context context,
@NonNull LazyDaemon lazyDaemon, @NonNull IBinder token,
- @Nullable ClientMonitorCallbackConverter listener, int[] biometricIds, int userId,
+ @Nullable ClientMonitorCallbackConverter listener, int biometricId, int userId,
@NonNull String owner, @NonNull BiometricUtils utils, int sensorId,
@NonNull Map authenticatorIds) {
- super(context, lazyDaemon, token, listener, userId, owner, utils, sensorId,
+ super(context, lazyDaemon, token, listener, biometricId, userId, owner, utils, sensorId,
authenticatorIds, BiometricsProtoEnums.MODALITY_FINGERPRINT);
- mBiometricIds = biometricIds;
}
@Override
protected void startHalOperation() {
try {
- getFreshDaemon().removeEnrollments(mSequentialId, mBiometricIds);
+ final int[] ids = new int[] {mBiometricId};
+ getFreshDaemon().removeEnrollments(mSequentialId, ids);
} catch (RemoteException e) {
Slog.e(TAG, "Remote exception when requesting remove", e);
mCallback.onClientFinished(this, false /* success */);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
index bedd66465a1a4..554e3d45a3ca3 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
@@ -644,23 +644,6 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
});
}
- @Override
- public void scheduleRemoveAll(int sensorId, @NonNull IBinder token,
- @NonNull IFingerprintServiceReceiver receiver, int userId,
- @NonNull String opPackageName) {
- mHandler.post(() -> {
- scheduleUpdateActiveUserWithoutHandler(userId);
-
- // For IBiometricsFingerprint@2.1, remove(0) means remove all enrollments
- final FingerprintRemovalClient client = new FingerprintRemovalClient(mContext,
- mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver),
- 0 /* fingerprintId */, userId, opPackageName,
- FingerprintUtils.getLegacyInstance(mSensorId),
- mSensorProperties.sensorId, mAuthenticatorIds);
- mScheduler.scheduleClientMonitor(client);
- });
- }
-
private void scheduleInternalCleanup(int userId) {
mHandler.post(() -> {
scheduleUpdateActiveUserWithoutHandler(userId);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintRemovalClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintRemovalClient.java
index 2f360f31a325f..f6a22f581f1a7 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintRemovalClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintRemovalClient.java
@@ -39,16 +39,13 @@ import java.util.Map;
class FingerprintRemovalClient extends RemovalClient {
private static final String TAG = "FingerprintRemovalClient";
- private final int mBiometricId;
-
FingerprintRemovalClient(@NonNull Context context,
@NonNull LazyDaemon lazyDaemon, @NonNull IBinder token,
@NonNull ClientMonitorCallbackConverter listener, int biometricId, int userId,
@NonNull String owner, @NonNull BiometricUtils utils, int sensorId,
@NonNull Map authenticatorIds) {
- super(context, lazyDaemon, token, listener, userId, owner, utils, sensorId,
+ super(context, lazyDaemon, token, listener, biometricId, userId, owner, utils, sensorId,
authenticatorIds, BiometricsProtoEnums.MODALITY_FINGERPRINT);
- mBiometricId = biometricId;
}
@Override
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 8da2d67d6691f..685e9e6ad4205 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -2902,8 +2902,11 @@ public class LockSettingsService extends ILockSettings.Stub {
FingerprintManager mFingerprintManager = mInjector.getFingerprintManager();
if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()) {
if (mFingerprintManager.hasEnrolledFingerprints(userId)) {
- final CountDownLatch latch = new CountDownLatch(1);
- mFingerprintManager.removeAll(userId, fingerprintManagerRemovalCallback(latch));
+ CountDownLatch latch = new CountDownLatch(1);
+ // For the purposes of M and N, groupId is the same as userId.
+ Fingerprint finger = new Fingerprint(null, userId, 0, 0);
+ mFingerprintManager.remove(finger, userId,
+ fingerprintManagerRemovalCallback(latch));
try {
latch.await(10000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
@@ -2917,8 +2920,9 @@ public class LockSettingsService extends ILockSettings.Stub {
FaceManager mFaceManager = mInjector.getFaceManager();
if (mFaceManager != null && mFaceManager.isHardwareDetected()) {
if (mFaceManager.hasEnrolledTemplates(userId)) {
- final CountDownLatch latch = new CountDownLatch(1);
- mFaceManager.removeAll(userId, faceManagerRemovalCallback(latch));
+ CountDownLatch latch = new CountDownLatch(1);
+ Face face = new Face(null, 0, 0);
+ mFaceManager.remove(face, userId, faceManagerRemovalCallback(latch));
try {
latch.await(10000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
@@ -2932,8 +2936,10 @@ public class LockSettingsService extends ILockSettings.Stub {
CountDownLatch latch) {
return new FingerprintManager.RemovalCallback() {
@Override
- public void onRemovalError(@Nullable Fingerprint fp, int errMsgId, CharSequence err) {
- Slog.e(TAG, "Unable to remove fingerprint, error: " + err);
+ public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence err) {
+ Slog.e(TAG, String.format(
+ "Can't remove fingerprint %d in group %d. Reason: %s",
+ fp.getBiometricId(), fp.getGroupId(), err));
latch.countDown();
}
@@ -2949,8 +2955,9 @@ public class LockSettingsService extends ILockSettings.Stub {
private FaceManager.RemovalCallback faceManagerRemovalCallback(CountDownLatch latch) {
return new FaceManager.RemovalCallback() {
@Override
- public void onRemovalError(@Nullable Face face, int errMsgId, CharSequence err) {
- Slog.e(TAG, "Unable to remove face, error: " + err);
+ public void onRemovalError(Face face, int errMsgId, CharSequence err) {
+ Slog.e(TAG, String.format("Can't remove face %d. Reason: %s",
+ face.getBiometricId(), err));
latch.countDown();
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
index 67d69292b476c..1f66c7c02658b 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
@@ -339,11 +339,11 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
mService.setLockCredential(nonePassword(), newPattern("123654"), PRIMARY_USER_ID);
// Verify fingerprint is removed
- verify(mFingerprintManager).removeAll(eq(PRIMARY_USER_ID), any());
- verify(mFaceManager).removeAll(eq(PRIMARY_USER_ID), any());
+ verify(mFingerprintManager).remove(any(), eq(PRIMARY_USER_ID), any());
+ verify(mFaceManager).remove(any(), eq(PRIMARY_USER_ID), any());
- verify(mFingerprintManager).removeAll(eq(MANAGED_PROFILE_USER_ID), any());
- verify(mFaceManager).removeAll(eq(MANAGED_PROFILE_USER_ID), any());
+ verify(mFingerprintManager).remove(any(), eq(MANAGED_PROFILE_USER_ID), any());
+ verify(mFaceManager).remove(any(), eq(MANAGED_PROFILE_USER_ID), any());
}
@Test
From e36b7b10492969c7092ad6f835f26c9bbf84b65e Mon Sep 17 00:00:00 2001
From: Jamie Garside
Date: Tue, 23 Feb 2021 16:28:23 +0000
Subject: [PATCH 015/176] Revert "Update the bouncer to be able to move to
either side of a wide screen."
This reverts commit 868e770b824b5d776d64fd9364f24a6aa1ed5ab5.
Reason for revert: Breaks password entry - b/180993584
Change-Id: I9a1771b795c90b1cfe6c2457d390ac53235c6c94
(cherry picked from commit f713b2d857ecbc0ca58d841212bdcf3ae103b7eb)
---
core/java/android/provider/Settings.java | 23 --
core/res/res/values/symbols.xml | 2 -
.../validators/GlobalSettingsValidators.java | 5 -
.../android/provider/SettingsBackupTest.java | 1 -
.../res-keyguard/layout/keyguard_bouncer.xml | 2 +-
.../layout/keyguard_host_view.xml | 5 +-
.../values-sw600dp-land/bools.xml | 20 --
.../SystemUI/res-keyguard/values/config.xml | 1 -
.../keyguard/KeyguardSecurityContainer.java | 223 +-----------------
.../KeyguardSecurityContainerController.java | 1 -
.../keyguard/KeyguardSecurityModel.java | 9 -
.../KeyguardSecurityContainerTest.java | 96 +-------
12 files changed, 14 insertions(+), 374 deletions(-)
delete mode 100644 packages/SystemUI/res-keyguard/values-sw600dp-land/bools.xml
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index e022d4f62af22..7ec80eda4dd90 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -14623,29 +14623,6 @@ public final class Settings {
public static final String POWER_BUTTON_VERY_LONG_PRESS =
"power_button_very_long_press";
-
- /**
- * Keyguard should be on the left hand side of the screen, for wide screen layouts.
- *
- * @hide
- */
- public static final int ONE_HANDED_KEYGUARD_SIDE_LEFT = 0;
-
- /**
- * Keyguard should be on the right hand side of the screen, for wide screen layouts.
- *
- * @hide
- */
- public static final int ONE_HANDED_KEYGUARD_SIDE_RIGHT = 1;
- /**
- * In one handed mode, which side the keyguard should be on. Allowable values are one of
- * the ONE_HANDED_KEYGUARD_SIDE_* constants.
- *
- * @hide
- */
- @Readable
- public static final String ONE_HANDED_KEYGUARD_SIDE = "one_handed_keyguard_side";
-
/**
* Keys we no longer back up under the current schema, but want to continue to
* process when restoring historical backup datasets.
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index e73d6e3af3cbe..b5af5240b8438 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -4203,6 +4203,4 @@
-
-
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
index ad6a5312f1562..66165b6d1ff2e 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
@@ -147,10 +147,5 @@ public class GlobalSettingsValidators {
VALIDATORS.put(Global.DEVELOPMENT_SETTINGS_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.NOTIFICATION_FEEDBACK_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.RESTRICTED_NETWORKING_MODE, BOOLEAN_VALIDATOR);
- VALIDATORS.put(
- Global.ONE_HANDED_KEYGUARD_SIDE,
- new InclusiveIntegerRangeValidator(
- /* first= */Global.ONE_HANDED_KEYGUARD_SIDE_LEFT,
- /* last= */Global.ONE_HANDED_KEYGUARD_SIDE_RIGHT));
}
}
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index efcc86905cd2a..27c91eadad3bf 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -283,7 +283,6 @@ public class SettingsBackupTest {
Settings.Global.EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS,
Settings.Global.EUICC_SWITCH_SLOT_TIMEOUT_MILLIS,
Settings.Global.FANCY_IME_ANIMATIONS,
- Settings.Global.ONE_HANDED_KEYGUARD_SIDE,
Settings.Global.FORCE_ALLOW_ON_EXTERNAL,
Settings.Global.FORCED_APP_STANDBY_ENABLED,
Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED,
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_bouncer.xml b/packages/SystemUI/res-keyguard/layout/keyguard_bouncer.xml
index 71cdaf5c7091b..79868093fb127 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_bouncer.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_bouncer.xml
@@ -24,7 +24,7 @@
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml
index c75ee51517d1d..04e645bd0a321 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml
@@ -41,14 +41,13 @@
android:layout_gravity="center">
diff --git a/packages/SystemUI/res-keyguard/values-sw600dp-land/bools.xml b/packages/SystemUI/res-keyguard/values-sw600dp-land/bools.xml
deleted file mode 100644
index e09bf7e37ed0c..0000000000000
--- a/packages/SystemUI/res-keyguard/values-sw600dp-land/bools.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
- true
-
diff --git a/packages/SystemUI/res-keyguard/values/config.xml b/packages/SystemUI/res-keyguard/values/config.xml
index 6176f7c1dd0ac..8d9d6ee68c67d 100644
--- a/packages/SystemUI/res-keyguard/values/config.xml
+++ b/packages/SystemUI/res-keyguard/values/config.xml
@@ -22,5 +22,4 @@
false
- false
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index f511ed1c69c49..5f6fd30ffa1b3 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -29,17 +29,12 @@ import android.app.AlertDialog;
import android.content.Context;
import android.graphics.Insets;
import android.graphics.Rect;
-import android.provider.Settings;
import android.util.AttributeSet;
import android.util.MathUtils;
import android.util.TypedValue;
-import android.view.Gravity;
import android.view.MotionEvent;
-import android.view.OrientationEventListener;
import android.view.VelocityTracker;
-import android.view.View;
import android.view.ViewConfiguration;
-import android.view.ViewPropertyAnimator;
import android.view.WindowInsets;
import android.view.WindowInsetsAnimation;
import android.view.WindowInsetsAnimationControlListener;
@@ -60,7 +55,6 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
-import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import java.util.List;
@@ -105,12 +99,6 @@ public class KeyguardSecurityContainer extends FrameLayout {
private boolean mDisappearAnimRunning;
private SwipeListener mSwipeListener;
- private boolean mIsSecurityViewLeftAligned = true;
- private boolean mOneHandedMode = false;
- private SecurityMode mSecurityMode = SecurityMode.Invalid;
- private ViewPropertyAnimator mRunningOneHandedAnimator;
- private final OrientationEventListener mOrientationEventListener;
-
private final WindowInsetsAnimation.Callback mWindowInsetsAnimationCallback =
new WindowInsetsAnimation.Callback(DISPATCH_MODE_STOP) {
@@ -169,20 +157,16 @@ public class KeyguardSecurityContainer extends FrameLayout {
// Used to notify the container when something interesting happens.
public interface SecurityCallback {
boolean dismiss(boolean authenticated, int targetUserId, boolean bypassSecondaryLockScreen);
-
void userActivity();
-
void onSecurityModeChanged(SecurityMode securityMode, boolean needsInput);
/**
- * @param strongAuth wheher the user has authenticated with strong authentication like
- * pattern, password or PIN but not by trust agents or fingerprint
+ * @param strongAuth wheher the user has authenticated with strong authentication like
+ * pattern, password or PIN but not by trust agents or fingerprint
* @param targetUserId a user that needs to be the foreground user at the finish completion.
*/
void finish(boolean strongAuth, int targetUserId);
-
void reset();
-
void onCancelClicked();
}
@@ -240,136 +224,12 @@ public class KeyguardSecurityContainer extends FrameLayout {
super(context, attrs, defStyle);
mSpringAnimation = new SpringAnimation(this, DynamicAnimation.Y);
mViewConfiguration = ViewConfiguration.get(context);
-
- mOrientationEventListener = new OrientationEventListener(context) {
- @Override
- public void onOrientationChanged(int orientation) {
- updateLayoutForSecurityMode(mSecurityMode);
- }
- };
}
void onResume(SecurityMode securityMode, boolean faceAuthEnabled) {
- mSecurityMode = securityMode;
mSecurityViewFlipper.setWindowInsetsAnimationCallback(mWindowInsetsAnimationCallback);
updateBiometricRetry(securityMode, faceAuthEnabled);
- updateLayoutForSecurityMode(securityMode);
- mOrientationEventListener.enable();
- }
-
- void updateLayoutForSecurityMode(SecurityMode securityMode) {
- mSecurityMode = securityMode;
- mOneHandedMode = canUseOneHandedBouncer();
-
- if (mOneHandedMode) {
- mIsSecurityViewLeftAligned = isOneHandedKeyguardLeftAligned(mContext);
- }
-
- updateSecurityViewGravity();
- updateSecurityViewLocation(false);
- }
-
- /** Return whether the one-handed keyguard should be enabled. */
- private boolean canUseOneHandedBouncer() {
- // Is it enabled?
- if (!getResources().getBoolean(
- com.android.internal.R.bool.config_enableOneHandedKeyguard)) {
- return false;
- }
-
- if (!KeyguardSecurityModel.isSecurityViewOneHanded(mSecurityMode)) {
- return false;
- }
-
- return getResources().getBoolean(R.bool.can_use_one_handed_bouncer);
- }
-
- /** Read whether the one-handed keyguard should be on the left/right from settings. */
- private boolean isOneHandedKeyguardLeftAligned(Context context) {
- try {
- return Settings.Global.getInt(context.getContentResolver(),
- Settings.Global.ONE_HANDED_KEYGUARD_SIDE)
- == Settings.Global.ONE_HANDED_KEYGUARD_SIDE_LEFT;
- } catch (Settings.SettingNotFoundException ex) {
- return true;
- }
- }
-
- private void updateSecurityViewGravity() {
- View securityView = findKeyguardSecurityView();
-
- if (securityView == null) {
- return;
- }
-
- FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) securityView.getLayoutParams();
-
- if (mOneHandedMode) {
- lp.gravity = Gravity.LEFT | Gravity.BOTTOM;
- } else {
- lp.gravity = Gravity.CENTER_HORIZONTAL;
- }
-
- securityView.setLayoutParams(lp);
- }
-
- /**
- * Moves the inner security view to the correct location (in one handed mode) with animation.
- * This is triggered when the user taps on the side of the screen that is not currently occupied
- * by the security view .
- */
- private void updateSecurityViewLocation(boolean animate) {
- View securityView = findKeyguardSecurityView();
-
- if (securityView == null) {
- return;
- }
-
- if (!mOneHandedMode) {
- securityView.setTranslationX(0);
- return;
- }
-
- if (mRunningOneHandedAnimator != null) {
- mRunningOneHandedAnimator.cancel();
- mRunningOneHandedAnimator = null;
- }
-
- int targetTranslation = mIsSecurityViewLeftAligned ? 0 : (int) (getMeasuredWidth() / 2f);
-
- if (animate) {
- mRunningOneHandedAnimator = securityView.animate().translationX(targetTranslation);
- mRunningOneHandedAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
- mRunningOneHandedAnimator.setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mRunningOneHandedAnimator = null;
- }
- });
-
- mRunningOneHandedAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
- mRunningOneHandedAnimator.start();
- } else {
- securityView.setTranslationX(targetTranslation);
- }
- }
-
- @Nullable
- private KeyguardSecurityViewFlipper findKeyguardSecurityView() {
- for (int i = 0; i < getChildCount(); i++) {
- View child = getChildAt(i);
-
- if (isKeyguardSecurityView(child)) {
- return (KeyguardSecurityViewFlipper) child;
- }
- }
-
- return null;
- }
-
- private boolean isKeyguardSecurityView(View view) {
- return view instanceof KeyguardSecurityViewFlipper;
}
public void onPause() {
@@ -378,7 +238,6 @@ public class KeyguardSecurityContainer extends FrameLayout {
mAlertDialog = null;
}
mSecurityViewFlipper.setWindowInsetsAnimationCallback(null);
- mOrientationEventListener.disable();
}
@Override
@@ -460,44 +319,19 @@ public class KeyguardSecurityContainer extends FrameLayout {
if (mSwipeListener != null) {
mSwipeListener.onSwipeUp();
}
- } else {
- if (!mIsDragging) {
- handleTap(event);
- }
}
}
return true;
}
- private void handleTap(MotionEvent event) {
- // If we're using a fullscreen security mode, skip
- if (!mOneHandedMode) {
- return;
- }
-
- // Did the tap hit the "other" side of the bouncer?
- if ((mIsSecurityViewLeftAligned && (event.getX() > getWidth() / 2f))
- || (!mIsSecurityViewLeftAligned && (event.getX() < getWidth() / 2f))) {
- mIsSecurityViewLeftAligned = !mIsSecurityViewLeftAligned;
-
- Settings.Global.putInt(
- mContext.getContentResolver(),
- Settings.Global.ONE_HANDED_KEYGUARD_SIDE,
- mIsSecurityViewLeftAligned ? Settings.Global.ONE_HANDED_KEYGUARD_SIDE_LEFT
- : Settings.Global.ONE_HANDED_KEYGUARD_SIDE_RIGHT);
-
- updateSecurityViewLocation(true);
- }
- }
-
void setSwipeListener(SwipeListener swipeListener) {
mSwipeListener = swipeListener;
}
private void startSpringAnimation(float startVelocity) {
mSpringAnimation
- .setStartVelocity(startVelocity)
- .animateToFinalPosition(0);
+ .setStartVelocity(startVelocity)
+ .animateToFinalPosition(0);
}
public void startDisappearAnimation(SecurityMode securitySelection) {
@@ -607,17 +441,18 @@ public class KeyguardSecurityContainer extends FrameLayout {
return insets.inset(0, 0, 0, inset);
}
+
private void showDialog(String title, String message) {
if (mAlertDialog != null) {
mAlertDialog.dismiss();
}
mAlertDialog = new AlertDialog.Builder(mContext)
- .setTitle(title)
- .setMessage(message)
- .setCancelable(false)
- .setNeutralButton(R.string.ok, null)
- .create();
+ .setTitle(title)
+ .setMessage(message)
+ .setCancelable(false)
+ .setNeutralButton(R.string.ok, null)
+ .create();
if (!(mContext instanceof Activity)) {
mAlertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
}
@@ -655,44 +490,6 @@ public class KeyguardSecurityContainer extends FrameLayout {
}
}
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int maxHeight = 0;
- int maxWidth = 0;
- int childState = 0;
-
- int halfWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
- MeasureSpec.getSize(widthMeasureSpec) / 2,
- MeasureSpec.getMode(widthMeasureSpec));
-
- for (int i = 0; i < getChildCount(); i++) {
- final View view = getChildAt(i);
- if (view.getVisibility() != GONE) {
- if (mOneHandedMode && isKeyguardSecurityView(view)) {
- measureChildWithMargins(view, halfWidthMeasureSpec, 0,
- heightMeasureSpec, 0);
- } else {
- measureChildWithMargins(view, widthMeasureSpec, 0,
- heightMeasureSpec, 0);
- }
- final LayoutParams lp = (LayoutParams) view.getLayoutParams();
- maxWidth = Math.max(maxWidth,
- view.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
- maxHeight = Math.max(maxHeight,
- view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
- childState = combineMeasuredStates(childState, view.getMeasuredState());
- }
- }
-
- // Check against our minimum height and width
- maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
- maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
-
- setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
- resolveSizeAndState(maxHeight, heightMeasureSpec,
- childState << MEASURED_HEIGHT_STATE_SHIFT));
- }
-
void showAlmostAtWipeDialog(int attempts, int remaining, int userType) {
String message = null;
switch (userType) {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
index fdab8db67431f..1a8d420fb3945 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
@@ -404,7 +404,6 @@ public class KeyguardSecurityContainerController extends ViewController
Date: Tue, 23 Feb 2021 16:28:23 +0000
Subject: [PATCH 016/176] Revert "Update the bouncer to be able to move to
either side of a wide screen."
This reverts commit 868e770b824b5d776d64fd9364f24a6aa1ed5ab5.
Reason for revert: Breaks password entry - b/180993584
Change-Id: I9a1771b795c90b1cfe6c2457d390ac53235c6c94
(cherry picked from commit 0f53fd20d5f5a986f6140de89d7d5623466d847b)
---
core/java/android/provider/Settings.java | 23 --
core/res/res/values/symbols.xml | 2 -
.../validators/GlobalSettingsValidators.java | 5 -
.../android/provider/SettingsBackupTest.java | 1 -
.../res-keyguard/layout/keyguard_bouncer.xml | 2 +-
.../layout/keyguard_host_view.xml | 5 +-
.../values-sw600dp-land/bools.xml | 20 --
.../SystemUI/res-keyguard/values/config.xml | 1 -
.../keyguard/KeyguardSecurityContainer.java | 223 +-----------------
.../KeyguardSecurityContainerController.java | 1 -
.../keyguard/KeyguardSecurityModel.java | 9 -
.../KeyguardSecurityContainerTest.java | 96 +-------
12 files changed, 14 insertions(+), 374 deletions(-)
delete mode 100644 packages/SystemUI/res-keyguard/values-sw600dp-land/bools.xml
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 7a3dd62f86d76..a1bbc9f5d1968 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -14615,29 +14615,6 @@ public final class Settings {
public static final String POWER_BUTTON_VERY_LONG_PRESS =
"power_button_very_long_press";
-
- /**
- * Keyguard should be on the left hand side of the screen, for wide screen layouts.
- *
- * @hide
- */
- public static final int ONE_HANDED_KEYGUARD_SIDE_LEFT = 0;
-
- /**
- * Keyguard should be on the right hand side of the screen, for wide screen layouts.
- *
- * @hide
- */
- public static final int ONE_HANDED_KEYGUARD_SIDE_RIGHT = 1;
- /**
- * In one handed mode, which side the keyguard should be on. Allowable values are one of
- * the ONE_HANDED_KEYGUARD_SIDE_* constants.
- *
- * @hide
- */
- @Readable
- public static final String ONE_HANDED_KEYGUARD_SIDE = "one_handed_keyguard_side";
-
/**
* Keys we no longer back up under the current schema, but want to continue to
* process when restoring historical backup datasets.
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index e73d6e3af3cbe..b5af5240b8438 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -4203,6 +4203,4 @@
-
-
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
index ad6a5312f1562..66165b6d1ff2e 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
@@ -147,10 +147,5 @@ public class GlobalSettingsValidators {
VALIDATORS.put(Global.DEVELOPMENT_SETTINGS_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.NOTIFICATION_FEEDBACK_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.RESTRICTED_NETWORKING_MODE, BOOLEAN_VALIDATOR);
- VALIDATORS.put(
- Global.ONE_HANDED_KEYGUARD_SIDE,
- new InclusiveIntegerRangeValidator(
- /* first= */Global.ONE_HANDED_KEYGUARD_SIDE_LEFT,
- /* last= */Global.ONE_HANDED_KEYGUARD_SIDE_RIGHT));
}
}
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index 5f56a3dd2dedc..ce1424aa8fb3d 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -283,7 +283,6 @@ public class SettingsBackupTest {
Settings.Global.EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS,
Settings.Global.EUICC_SWITCH_SLOT_TIMEOUT_MILLIS,
Settings.Global.FANCY_IME_ANIMATIONS,
- Settings.Global.ONE_HANDED_KEYGUARD_SIDE,
Settings.Global.FORCE_ALLOW_ON_EXTERNAL,
Settings.Global.FORCED_APP_STANDBY_ENABLED,
Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED,
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_bouncer.xml b/packages/SystemUI/res-keyguard/layout/keyguard_bouncer.xml
index 71cdaf5c7091b..79868093fb127 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_bouncer.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_bouncer.xml
@@ -24,7 +24,7 @@
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml
index c75ee51517d1d..04e645bd0a321 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml
@@ -41,14 +41,13 @@
android:layout_gravity="center">
diff --git a/packages/SystemUI/res-keyguard/values-sw600dp-land/bools.xml b/packages/SystemUI/res-keyguard/values-sw600dp-land/bools.xml
deleted file mode 100644
index e09bf7e37ed0c..0000000000000
--- a/packages/SystemUI/res-keyguard/values-sw600dp-land/bools.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
- true
-
diff --git a/packages/SystemUI/res-keyguard/values/config.xml b/packages/SystemUI/res-keyguard/values/config.xml
index 6176f7c1dd0ac..8d9d6ee68c67d 100644
--- a/packages/SystemUI/res-keyguard/values/config.xml
+++ b/packages/SystemUI/res-keyguard/values/config.xml
@@ -22,5 +22,4 @@
false
- false
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index f511ed1c69c49..5f6fd30ffa1b3 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -29,17 +29,12 @@ import android.app.AlertDialog;
import android.content.Context;
import android.graphics.Insets;
import android.graphics.Rect;
-import android.provider.Settings;
import android.util.AttributeSet;
import android.util.MathUtils;
import android.util.TypedValue;
-import android.view.Gravity;
import android.view.MotionEvent;
-import android.view.OrientationEventListener;
import android.view.VelocityTracker;
-import android.view.View;
import android.view.ViewConfiguration;
-import android.view.ViewPropertyAnimator;
import android.view.WindowInsets;
import android.view.WindowInsetsAnimation;
import android.view.WindowInsetsAnimationControlListener;
@@ -60,7 +55,6 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
-import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import java.util.List;
@@ -105,12 +99,6 @@ public class KeyguardSecurityContainer extends FrameLayout {
private boolean mDisappearAnimRunning;
private SwipeListener mSwipeListener;
- private boolean mIsSecurityViewLeftAligned = true;
- private boolean mOneHandedMode = false;
- private SecurityMode mSecurityMode = SecurityMode.Invalid;
- private ViewPropertyAnimator mRunningOneHandedAnimator;
- private final OrientationEventListener mOrientationEventListener;
-
private final WindowInsetsAnimation.Callback mWindowInsetsAnimationCallback =
new WindowInsetsAnimation.Callback(DISPATCH_MODE_STOP) {
@@ -169,20 +157,16 @@ public class KeyguardSecurityContainer extends FrameLayout {
// Used to notify the container when something interesting happens.
public interface SecurityCallback {
boolean dismiss(boolean authenticated, int targetUserId, boolean bypassSecondaryLockScreen);
-
void userActivity();
-
void onSecurityModeChanged(SecurityMode securityMode, boolean needsInput);
/**
- * @param strongAuth wheher the user has authenticated with strong authentication like
- * pattern, password or PIN but not by trust agents or fingerprint
+ * @param strongAuth wheher the user has authenticated with strong authentication like
+ * pattern, password or PIN but not by trust agents or fingerprint
* @param targetUserId a user that needs to be the foreground user at the finish completion.
*/
void finish(boolean strongAuth, int targetUserId);
-
void reset();
-
void onCancelClicked();
}
@@ -240,136 +224,12 @@ public class KeyguardSecurityContainer extends FrameLayout {
super(context, attrs, defStyle);
mSpringAnimation = new SpringAnimation(this, DynamicAnimation.Y);
mViewConfiguration = ViewConfiguration.get(context);
-
- mOrientationEventListener = new OrientationEventListener(context) {
- @Override
- public void onOrientationChanged(int orientation) {
- updateLayoutForSecurityMode(mSecurityMode);
- }
- };
}
void onResume(SecurityMode securityMode, boolean faceAuthEnabled) {
- mSecurityMode = securityMode;
mSecurityViewFlipper.setWindowInsetsAnimationCallback(mWindowInsetsAnimationCallback);
updateBiometricRetry(securityMode, faceAuthEnabled);
- updateLayoutForSecurityMode(securityMode);
- mOrientationEventListener.enable();
- }
-
- void updateLayoutForSecurityMode(SecurityMode securityMode) {
- mSecurityMode = securityMode;
- mOneHandedMode = canUseOneHandedBouncer();
-
- if (mOneHandedMode) {
- mIsSecurityViewLeftAligned = isOneHandedKeyguardLeftAligned(mContext);
- }
-
- updateSecurityViewGravity();
- updateSecurityViewLocation(false);
- }
-
- /** Return whether the one-handed keyguard should be enabled. */
- private boolean canUseOneHandedBouncer() {
- // Is it enabled?
- if (!getResources().getBoolean(
- com.android.internal.R.bool.config_enableOneHandedKeyguard)) {
- return false;
- }
-
- if (!KeyguardSecurityModel.isSecurityViewOneHanded(mSecurityMode)) {
- return false;
- }
-
- return getResources().getBoolean(R.bool.can_use_one_handed_bouncer);
- }
-
- /** Read whether the one-handed keyguard should be on the left/right from settings. */
- private boolean isOneHandedKeyguardLeftAligned(Context context) {
- try {
- return Settings.Global.getInt(context.getContentResolver(),
- Settings.Global.ONE_HANDED_KEYGUARD_SIDE)
- == Settings.Global.ONE_HANDED_KEYGUARD_SIDE_LEFT;
- } catch (Settings.SettingNotFoundException ex) {
- return true;
- }
- }
-
- private void updateSecurityViewGravity() {
- View securityView = findKeyguardSecurityView();
-
- if (securityView == null) {
- return;
- }
-
- FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) securityView.getLayoutParams();
-
- if (mOneHandedMode) {
- lp.gravity = Gravity.LEFT | Gravity.BOTTOM;
- } else {
- lp.gravity = Gravity.CENTER_HORIZONTAL;
- }
-
- securityView.setLayoutParams(lp);
- }
-
- /**
- * Moves the inner security view to the correct location (in one handed mode) with animation.
- * This is triggered when the user taps on the side of the screen that is not currently occupied
- * by the security view .
- */
- private void updateSecurityViewLocation(boolean animate) {
- View securityView = findKeyguardSecurityView();
-
- if (securityView == null) {
- return;
- }
-
- if (!mOneHandedMode) {
- securityView.setTranslationX(0);
- return;
- }
-
- if (mRunningOneHandedAnimator != null) {
- mRunningOneHandedAnimator.cancel();
- mRunningOneHandedAnimator = null;
- }
-
- int targetTranslation = mIsSecurityViewLeftAligned ? 0 : (int) (getMeasuredWidth() / 2f);
-
- if (animate) {
- mRunningOneHandedAnimator = securityView.animate().translationX(targetTranslation);
- mRunningOneHandedAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
- mRunningOneHandedAnimator.setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mRunningOneHandedAnimator = null;
- }
- });
-
- mRunningOneHandedAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
- mRunningOneHandedAnimator.start();
- } else {
- securityView.setTranslationX(targetTranslation);
- }
- }
-
- @Nullable
- private KeyguardSecurityViewFlipper findKeyguardSecurityView() {
- for (int i = 0; i < getChildCount(); i++) {
- View child = getChildAt(i);
-
- if (isKeyguardSecurityView(child)) {
- return (KeyguardSecurityViewFlipper) child;
- }
- }
-
- return null;
- }
-
- private boolean isKeyguardSecurityView(View view) {
- return view instanceof KeyguardSecurityViewFlipper;
}
public void onPause() {
@@ -378,7 +238,6 @@ public class KeyguardSecurityContainer extends FrameLayout {
mAlertDialog = null;
}
mSecurityViewFlipper.setWindowInsetsAnimationCallback(null);
- mOrientationEventListener.disable();
}
@Override
@@ -460,44 +319,19 @@ public class KeyguardSecurityContainer extends FrameLayout {
if (mSwipeListener != null) {
mSwipeListener.onSwipeUp();
}
- } else {
- if (!mIsDragging) {
- handleTap(event);
- }
}
}
return true;
}
- private void handleTap(MotionEvent event) {
- // If we're using a fullscreen security mode, skip
- if (!mOneHandedMode) {
- return;
- }
-
- // Did the tap hit the "other" side of the bouncer?
- if ((mIsSecurityViewLeftAligned && (event.getX() > getWidth() / 2f))
- || (!mIsSecurityViewLeftAligned && (event.getX() < getWidth() / 2f))) {
- mIsSecurityViewLeftAligned = !mIsSecurityViewLeftAligned;
-
- Settings.Global.putInt(
- mContext.getContentResolver(),
- Settings.Global.ONE_HANDED_KEYGUARD_SIDE,
- mIsSecurityViewLeftAligned ? Settings.Global.ONE_HANDED_KEYGUARD_SIDE_LEFT
- : Settings.Global.ONE_HANDED_KEYGUARD_SIDE_RIGHT);
-
- updateSecurityViewLocation(true);
- }
- }
-
void setSwipeListener(SwipeListener swipeListener) {
mSwipeListener = swipeListener;
}
private void startSpringAnimation(float startVelocity) {
mSpringAnimation
- .setStartVelocity(startVelocity)
- .animateToFinalPosition(0);
+ .setStartVelocity(startVelocity)
+ .animateToFinalPosition(0);
}
public void startDisappearAnimation(SecurityMode securitySelection) {
@@ -607,17 +441,18 @@ public class KeyguardSecurityContainer extends FrameLayout {
return insets.inset(0, 0, 0, inset);
}
+
private void showDialog(String title, String message) {
if (mAlertDialog != null) {
mAlertDialog.dismiss();
}
mAlertDialog = new AlertDialog.Builder(mContext)
- .setTitle(title)
- .setMessage(message)
- .setCancelable(false)
- .setNeutralButton(R.string.ok, null)
- .create();
+ .setTitle(title)
+ .setMessage(message)
+ .setCancelable(false)
+ .setNeutralButton(R.string.ok, null)
+ .create();
if (!(mContext instanceof Activity)) {
mAlertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
}
@@ -655,44 +490,6 @@ public class KeyguardSecurityContainer extends FrameLayout {
}
}
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int maxHeight = 0;
- int maxWidth = 0;
- int childState = 0;
-
- int halfWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
- MeasureSpec.getSize(widthMeasureSpec) / 2,
- MeasureSpec.getMode(widthMeasureSpec));
-
- for (int i = 0; i < getChildCount(); i++) {
- final View view = getChildAt(i);
- if (view.getVisibility() != GONE) {
- if (mOneHandedMode && isKeyguardSecurityView(view)) {
- measureChildWithMargins(view, halfWidthMeasureSpec, 0,
- heightMeasureSpec, 0);
- } else {
- measureChildWithMargins(view, widthMeasureSpec, 0,
- heightMeasureSpec, 0);
- }
- final LayoutParams lp = (LayoutParams) view.getLayoutParams();
- maxWidth = Math.max(maxWidth,
- view.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
- maxHeight = Math.max(maxHeight,
- view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
- childState = combineMeasuredStates(childState, view.getMeasuredState());
- }
- }
-
- // Check against our minimum height and width
- maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
- maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
-
- setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
- resolveSizeAndState(maxHeight, heightMeasureSpec,
- childState << MEASURED_HEIGHT_STATE_SHIFT));
- }
-
void showAlmostAtWipeDialog(int attempts, int remaining, int userType) {
String message = null;
switch (userType) {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
index fdab8db67431f..1a8d420fb3945 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
@@ -404,7 +404,6 @@ public class KeyguardSecurityContainerController extends ViewController
Date: Mon, 15 Mar 2021 09:30:13 -0700
Subject: [PATCH 017/176] Check if the sc is valid when finishing seamless
rotation
If the window is removed, the finish seamless rotation can be
triggered from the blast sync timeout.
Bug: 182738086
Test: repro steps in bug does not repro anymore
Change-Id: I87bef0dbddeb5640e356afb2d2e57334b8690c28
(cherry picked from commit ba40611dce746824aa6eeb376807886110026b9c)
---
services/core/java/com/android/server/wm/SeamlessRotator.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/services/core/java/com/android/server/wm/SeamlessRotator.java b/services/core/java/com/android/server/wm/SeamlessRotator.java
index 1e8b8a5bb576a..4cc369f0a187b 100644
--- a/services/core/java/com/android/server/wm/SeamlessRotator.java
+++ b/services/core/java/com/android/server/wm/SeamlessRotator.java
@@ -102,6 +102,10 @@ public class SeamlessRotator {
* window in the new orientation.
*/
void finish(Transaction t, WindowContainer win) {
+ if (win.mSurfaceControl == null || !win.mSurfaceControl.isValid()) {
+ return;
+ }
+
mTransform.reset();
t.setMatrix(win.mSurfaceControl, mTransform, mFloat9);
t.setPosition(win.mSurfaceControl, win.mLastSurfacePosition.x, win.mLastSurfacePosition.y);
From 0ceb46cbf9036fe1ef0d3fb7e1f0941c679cbb13 Mon Sep 17 00:00:00 2001
From: Dave Mankoff
Date: Mon, 15 Mar 2021 13:26:04 -0400
Subject: [PATCH 018/176] Avoid falsing when the phone is unlocked.
With this change, we completely avoid recording motion events when the
phone is off the lock screen. We also also return false when asked if
the last gesture was a false.
Fixes: 182713255
Test: atest SystemUITests && manual
Change-Id: I2e16aecb218dd3c862ffefc8c82f67523925ac5e
(cherry picked from commit 8a5e237677cdc77b063b80d14a9094e350ea36ee)
---
.../classifier/BrightLineFalsingManager.java | 22 +++++++++++++++-
.../classifier/FalsingCollectorImpl.java | 11 ++++++--
.../classifier/BrightLineClassifierTest.java | 25 ++++++++++++++++---
.../classifier/FalsingCollectorImplTest.java | 22 +++++++++++++++-
4 files changed, 73 insertions(+), 7 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
index efb799294004c..45cefcc564bfc 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
@@ -31,6 +31,7 @@ import com.android.systemui.classifier.FalsingDataProvider.SessionListener;
import com.android.systemui.dagger.qualifiers.TestHarness;
import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.sensors.ThresholdSensor;
import java.io.FileDescriptor;
@@ -67,6 +68,7 @@ public class BrightLineFalsingManager implements FalsingManager {
private final SingleTapClassifier mSingleTapClassifier;
private final DoubleTapClassifier mDoubleTapClassifier;
private final HistoryTracker mHistoryTracker;
+ private final KeyguardStateController mKeyguardStateController;
private final boolean mTestHarness;
private final MetricsLogger mMetricsLogger;
private int mIsFalseTouchCalls;
@@ -113,7 +115,8 @@ public class BrightLineFalsingManager implements FalsingManager {
DockManager dockManager, MetricsLogger metricsLogger,
@Named(BRIGHT_LINE_GESTURE_CLASSIFERS) Set classifiers,
SingleTapClassifier singleTapClassifier, DoubleTapClassifier doubleTapClassifier,
- HistoryTracker historyTracker, @TestHarness boolean testHarness) {
+ HistoryTracker historyTracker, KeyguardStateController keyguardStateController,
+ @TestHarness boolean testHarness) {
mDataProvider = falsingDataProvider;
mDockManager = dockManager;
mMetricsLogger = metricsLogger;
@@ -121,6 +124,7 @@ public class BrightLineFalsingManager implements FalsingManager {
mSingleTapClassifier = singleTapClassifier;
mDoubleTapClassifier = doubleTapClassifier;
mHistoryTracker = historyTracker;
+ mKeyguardStateController = keyguardStateController;
mTestHarness = testHarness;
mDataProvider.addSessionListener(mSessionListener);
@@ -134,6 +138,10 @@ public class BrightLineFalsingManager implements FalsingManager {
@Override
public boolean isFalseTouch(@Classifier.InteractionType int interactionType) {
+ if (skipFalsing()) {
+ return false;
+ }
+
boolean result;
mDataProvider.setInteractionType(interactionType);
@@ -195,6 +203,10 @@ public class BrightLineFalsingManager implements FalsingManager {
@Override
public boolean isFalseTap(boolean robustCheck, double falsePenalty) {
+ if (skipFalsing()) {
+ return false;
+ }
+
FalsingClassifier.Result singleTapResult =
mSingleTapClassifier.isTap(mDataProvider.getRecentMotionEvents());
mPriorResults = Collections.singleton(singleTapResult);
@@ -233,6 +245,10 @@ public class BrightLineFalsingManager implements FalsingManager {
@Override
public boolean isFalseDoubleTap() {
+ if (skipFalsing()) {
+ return false;
+ }
+
FalsingClassifier.Result result = mDoubleTapClassifier.classifyGesture();
mPriorResults = Collections.singleton(result);
if (result.isFalse()) {
@@ -246,6 +262,10 @@ public class BrightLineFalsingManager implements FalsingManager {
return result.isFalse();
}
+ private boolean skipFalsing() {
+ return !mKeyguardStateController.isShowing();
+ }
+
@Override
public void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) {
// TODO: some of these classifiers might allow us to abort early, meaning we don't have to
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
index e090006cca4fd..b359860a0fd7f 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
@@ -27,6 +27,7 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.sensors.ProximitySensor;
import com.android.systemui.util.sensors.ThresholdSensor;
import com.android.systemui.util.time.SystemClock;
@@ -48,6 +49,7 @@ class FalsingCollectorImpl implements FalsingCollector {
private final HistoryTracker mHistoryTracker;
private final ProximitySensor mProximitySensor;
private final StatusBarStateController mStatusBarStateController;
+ private final KeyguardStateController mKeyguardStateController;
private final SystemClock mSystemClock;
private int mState;
@@ -87,13 +89,14 @@ class FalsingCollectorImpl implements FalsingCollector {
FalsingCollectorImpl(FalsingDataProvider falsingDataProvider, FalsingManager falsingManager,
KeyguardUpdateMonitor keyguardUpdateMonitor, HistoryTracker historyTracker,
ProximitySensor proximitySensor, StatusBarStateController statusBarStateController,
- SystemClock systemClock) {
+ KeyguardStateController keyguardStateController, SystemClock systemClock) {
mFalsingDataProvider = falsingDataProvider;
mFalsingManager = falsingManager;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mHistoryTracker = historyTracker;
mProximitySensor = proximitySensor;
mStatusBarStateController = statusBarStateController;
+ mKeyguardStateController = keyguardStateController;
mSystemClock = systemClock;
@@ -255,6 +258,10 @@ class FalsingCollectorImpl implements FalsingCollector {
@Override
public void onTouchEvent(MotionEvent ev) {
+ if (!mKeyguardStateController.isShowing()) {
+ avoidGesture();
+ return;
+ }
// We delay processing down events to see if another component wants to process them.
// If #avoidGesture is called after a MotionEvent.ACTION_DOWN, all following motion events
// will be ignored by the collector until another MotionEvent.ACTION_DOWN is passed in.
@@ -276,8 +283,8 @@ class FalsingCollectorImpl implements FalsingCollector {
@Override
public void avoidGesture() {
+ mAvoidGesture = true;
if (mPendingDownEvent != null) {
- mAvoidGesture = true;
mPendingDownEvent.recycle();
mPendingDownEvent = null;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java
index b2328504272a7..d015f51055b5a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java
@@ -35,6 +35,7 @@ import com.android.internal.logging.testing.FakeMetricsLogger;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.classifier.FalsingDataProvider.GestureCompleteListener;
import com.android.systemui.dock.DockManagerFake;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
@@ -71,7 +72,10 @@ public class BrightLineClassifierTest extends SysuiTestCase {
private FalsingClassifier mClassifierB;
private final List mMotionEventList = new ArrayList<>();
@Mock
- private HistoryTracker mHistoryTracker;;
+ private HistoryTracker mHistoryTracker;
+ @Mock
+ private KeyguardStateController mKeyguardStateController;
+
private final FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
private final FalsingClassifier.Result mFalsedResult = FalsingClassifier.Result.falsed(1, "");
@@ -88,9 +92,10 @@ public class BrightLineClassifierTest extends SysuiTestCase {
mClassifiers.add(mClassifierA);
mClassifiers.add(mClassifierB);
when(mFalsingDataProvider.getRecentMotionEvents()).thenReturn(mMotionEventList);
+ when(mKeyguardStateController.isShowing()).thenReturn(true);
mBrightLineFalsingManager = new BrightLineFalsingManager(mFalsingDataProvider, mDockManager,
mMetricsLogger, mClassifiers, mSingleTapClassfier, mDoubleTapClassifier,
- mHistoryTracker, false);
+ mHistoryTracker, mKeyguardStateController, false);
ArgumentCaptor gestureCompleteListenerCaptor =
@@ -120,7 +125,7 @@ public class BrightLineClassifierTest extends SysuiTestCase {
}
@Test
- public void testIsFalseTouch_ClassffiersPass() {
+ public void testIsFalseTouch_ClassifiersPass() {
assertThat(mBrightLineFalsingManager.isFalseTouch(0)).isFalse();
}
@@ -233,4 +238,18 @@ public class BrightLineClassifierTest extends SysuiTestCase {
assertThat(mFakeExecutor.numPending()).isEqualTo(0);
}
+
+ @Test
+ public void testNoFalsingUnlocked() {
+ when(mKeyguardStateController.isShowing()).thenReturn(false);
+
+ when(mClassifierA.classifyGesture(anyDouble(), anyDouble())).thenReturn(mFalsedResult);
+ assertThat(mBrightLineFalsingManager.isFalseTouch(0)).isFalse();
+
+ when(mSingleTapClassfier.isTap(mMotionEventList)).thenReturn(mFalsedResult);
+ assertThat(mBrightLineFalsingManager.isFalseTap(false, 0)).isFalse();
+
+ when(mDoubleTapClassifier.classifyGesture()).thenReturn(mFalsedResult);
+ assertThat(mBrightLineFalsingManager.isFalseDoubleTap()).isFalse();
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
index dc79b88818919..e6aeee7a9184b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
@@ -34,6 +34,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.sensors.ProximitySensor;
import com.android.systemui.util.sensors.ThresholdSensor;
import com.android.systemui.util.time.FakeSystemClock;
@@ -62,16 +63,19 @@ public class FalsingCollectorImplTest extends SysuiTestCase {
private ProximitySensor mProximitySensor;
@Mock
private SysuiStatusBarStateController mStatusBarStateController;
+ @Mock
+ private KeyguardStateController mKeyguardStateController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD);
+ when(mKeyguardStateController.isShowing()).thenReturn(true);
mFalsingCollector = new FalsingCollectorImpl(mFalsingDataProvider, mFalsingManager,
mKeyguardUpdateMonitor, mHistoryTracker, mProximitySensor,
- mStatusBarStateController, new FakeSystemClock());
+ mStatusBarStateController, mKeyguardStateController, new FakeSystemClock());
}
@Test
@@ -159,4 +163,20 @@ public class FalsingCollectorImplTest extends SysuiTestCase {
mFalsingCollector.onTouchEvent(up);
verify(mFalsingDataProvider, never()).onMotionEvent(any(MotionEvent.class));
}
+
+ @Test
+ public void testAvoidUnlocked() {
+ MotionEvent down = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
+ MotionEvent up = MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, 0, 0, 0);
+
+ when(mKeyguardStateController.isShowing()).thenReturn(false);
+
+ // Nothing passed initially
+ mFalsingCollector.onTouchEvent(down);
+ verify(mFalsingDataProvider, never()).onMotionEvent(any(MotionEvent.class));
+
+ // Up event would normally flush the up event.
+ mFalsingCollector.onTouchEvent(up);
+ verify(mFalsingDataProvider, never()).onMotionEvent(any(MotionEvent.class));
+ }
}
From 30073c91955dec135f18ab7e7059158acc9385f5 Mon Sep 17 00:00:00 2001
From: Nate Myren
Date: Mon, 15 Mar 2021 17:53:55 +0000
Subject: [PATCH 019/176] Revert "Make window stable while resizing"
This reverts commit 5a9a38128f727ac425f1147c0a663328896e5238.
Reason for revert: fixes b/182729646
Change-Id: Idfa7fb9187a4707f4627a41b92f45313fbdc3ca8
(cherry picked from commit 253de9a9ce59ff72f7c15c810eaa979b8fec16d8)
---
.../server/wm/InsetsSourceProvider.java | 42 ++++++++++++-------
.../com/android/server/wm/WindowFrames.java | 9 +---
.../server/wm/WindowManagerService.java | 5 +++
.../com/android/server/wm/WindowState.java | 24 ++++-------
4 files changed, 41 insertions(+), 39 deletions(-)
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index 35e54912b33e1..45c4233b40aaa 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -30,6 +30,7 @@ import static com.android.server.wm.InsetsSourceProviderProto.CONTROLLABLE;
import static com.android.server.wm.InsetsSourceProviderProto.CONTROL_TARGET;
import static com.android.server.wm.InsetsSourceProviderProto.FAKE_CONTROL;
import static com.android.server.wm.InsetsSourceProviderProto.FAKE_CONTROL_TARGET;
+import static com.android.server.wm.InsetsSourceProviderProto.FINISH_SEAMLESS_ROTATE_FRAME_NUMBER;
import static com.android.server.wm.InsetsSourceProviderProto.FRAME;
import static com.android.server.wm.InsetsSourceProviderProto.IME_OVERRIDDEN_FRAME;
import static com.android.server.wm.InsetsSourceProviderProto.IS_LEASH_READY_FOR_DISPATCHING;
@@ -58,7 +59,6 @@ import com.android.server.wm.SurfaceAnimator.AnimationType;
import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
import java.io.PrintWriter;
-import java.util.function.Consumer;
/**
* Controller for a specific inset source on the server. It's called provider as it provides the
@@ -84,16 +84,6 @@ class InsetsSourceProvider {
private final Rect mImeOverrideFrame = new Rect();
private boolean mIsLeashReadyForDispatching;
- private final Consumer mSetLeashPositionConsumer = t -> {
- if (mControl != null) {
- final SurfaceControl leash = mControl.getLeash();
- if (leash != null) {
- final Point position = mControl.getSurfacePosition();
- t.setPosition(leash, position.x, position.y);
- }
- }
- };
-
/** The visibility override from the current controlling window. */
private boolean mClientVisible;
@@ -159,6 +149,7 @@ class InsetsSourceProvider {
// TODO: Ideally, we should wait for the animation to finish so previous window can
// animate-out as new one animates-in.
mWin.cancelAnimation();
+ mWin.mPendingPositionChanged = null;
mWin.mProvidedInsetsSources.remove(mSource.getType());
}
ProtoLog.d(WM_DEBUG_IME, "InsetsSource setWin %s", win);
@@ -257,16 +248,31 @@ class InsetsSourceProvider {
if (mControl != null) {
final Point position = getWindowFrameSurfacePosition();
if (mControl.setSurfacePosition(position.x, position.y) && mControlTarget != null) {
- if (mWin.getWindowFrames().didFrameSizeChange()) {
- mWin.applyWithNextDraw(mSetLeashPositionConsumer);
+ if (!mWin.getWindowFrames().didFrameSizeChange()) {
+ updateLeashPosition(-1 /* frameNumber */);
+ } else if (mWin.mInRelayout) {
+ updateLeashPosition(mWin.getFrameNumber());
} else {
- mSetLeashPositionConsumer.accept(mWin.getPendingTransaction());
+ mWin.mPendingPositionChanged = this;
}
mStateController.notifyControlChanged(mControlTarget);
}
}
}
+ void updateLeashPosition(long frameNumber) {
+ if (mControl == null) {
+ return;
+ }
+ final SurfaceControl leash = mControl.getLeash();
+ if (leash != null) {
+ final Transaction t = mDisplayContent.getPendingTransaction();
+ final Point position = mControl.getSurfacePosition();
+ t.setPosition(leash, position.x, position.y);
+ deferTransactionUntil(t, leash, frameNumber);
+ }
+ }
+
private Point getWindowFrameSurfacePosition() {
final Rect frame = mWin.getFrame();
final Point position = new Point();
@@ -274,6 +280,14 @@ class InsetsSourceProvider {
return position;
}
+ private void deferTransactionUntil(Transaction t, SurfaceControl leash, long frameNumber) {
+ if (frameNumber >= 0) {
+ final SurfaceControl barrier = mWin.getClientViewRootSurface();
+ t.deferTransactionUntil(mWin.getSurfaceControl(), barrier, frameNumber);
+ t.deferTransactionUntil(leash, barrier, frameNumber);
+ }
+ }
+
/**
* @see InsetsStateController#onControlFakeTargetChanged(int, InsetsControlTarget)
*/
diff --git a/services/core/java/com/android/server/wm/WindowFrames.java b/services/core/java/com/android/server/wm/WindowFrames.java
index ffd6d21c1026b..9245f8c3efe5e 100644
--- a/services/core/java/com/android/server/wm/WindowFrames.java
+++ b/services/core/java/com/android/server/wm/WindowFrames.java
@@ -113,7 +113,7 @@ public class WindowFrames {
}
/**
- * @return true if the width or height has changed since last updating resizing window.
+ * @return true if the width or height has changed since last reported to the client.
*/
boolean didFrameSizeChange() {
return (mLastFrame.width() != mFrame.width()) || (mLastFrame.height() != mFrame.height());
@@ -134,13 +134,6 @@ public class WindowFrames {
return mLastForceReportingResized || mFrameSizeChanged;
}
- /**
- * @return true if the width or height has changed since last reported to the client.
- */
- boolean isFrameSizeChangeReported() {
- return mFrameSizeChanged || didFrameSizeChange();
- }
-
/**
* Resets the size changed flags so they're all set to false again. This should be called
* after the frames are reported to client.
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index b95674e511d50..e70ad6f1bdf3f 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2234,6 +2234,11 @@ public class WindowManagerService extends IWindowManager.Stub
final DisplayContent dc = win.getDisplayContent();
+ if (win.mPendingPositionChanged != null) {
+ win.mPendingPositionChanged.updateLeashPosition(frameNumber);
+ win.mPendingPositionChanged = null;
+ }
+
if (mUseBLASTSync && win.useBLASTSync() && viewVisibility != View.GONE) {
win.prepareDrawHandlers();
result |= RELAYOUT_RES_BLAST_SYNC;
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 7ebc1cc6d5c1f..2eadcd5814175 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -726,6 +726,8 @@ class WindowState extends WindowContainer implements WindowManagerP
*/
private InsetsState mFrozenInsetsState;
+ @Nullable InsetsSourceProvider mPendingPositionChanged;
+
private static final float DEFAULT_DIM_AMOUNT_DEAD_WINDOW = 0.5f;
private KeyInterceptionInfo mKeyInterceptionInfo;
@@ -772,12 +774,6 @@ class WindowState extends WindowContainer implements WindowManagerP
updateSurfacePosition(t);
};
- private final Consumer mSetSurfacePositionConsumer = t -> {
- if (mSurfaceControl != null && mSurfaceControl.isValid()) {
- t.setPosition(mSurfaceControl, mSurfacePosition.x, mSurfacePosition.y);
- }
- };
-
/**
* @see #setSurfaceTranslationY(int)
*/
@@ -2133,8 +2129,6 @@ class WindowState extends WindowContainer implements WindowManagerP
: getTask().getWindowConfiguration().hasMovementAnimations();
if (mToken.okToAnimate()
&& (mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0
- && !mWindowFrames.didFrameSizeChange()
- && !surfaceInsetsChanging()
&& !isDragResizing()
&& hasMovementAnimation
&& !mWinAnimator.mLastHidden
@@ -5324,17 +5318,13 @@ class WindowState extends WindowContainer implements WindowManagerP
// prior to the rotation.
if (!mSurfaceAnimator.hasLeash() && mPendingSeamlessRotate == null
&& !mLastSurfacePosition.equals(mSurfacePosition)) {
- final boolean frameSizeChanged = mWindowFrames.isFrameSizeChangeReported();
- final boolean surfaceInsetsChanged = surfaceInsetsChanging();
- final boolean surfaceSizeChanged = frameSizeChanged || surfaceInsetsChanged;
+ t.setPosition(mSurfaceControl, mSurfacePosition.x, mSurfacePosition.y);
mLastSurfacePosition.set(mSurfacePosition.x, mSurfacePosition.y);
- if (surfaceInsetsChanged) {
+ if (surfaceInsetsChanging() && mWinAnimator.hasSurface()) {
mLastSurfaceInsets.set(mAttrs.surfaceInsets);
- }
- if (surfaceSizeChanged) {
- applyWithNextDraw(mSetSurfacePositionConsumer);
- } else {
- mSetSurfacePositionConsumer.accept(t);
+ t.deferTransactionUntil(mSurfaceControl,
+ mWinAnimator.mSurfaceController.mSurfaceControl,
+ getFrameNumber());
}
}
}
From 7c1ab4bff89190fd8cbe67216587111096d12f35 Mon Sep 17 00:00:00 2001
From: Nate Myren
Date: Mon, 15 Mar 2021 17:53:55 +0000
Subject: [PATCH 020/176] Revert "Make window stable while resizing"
This reverts commit 5a9a38128f727ac425f1147c0a663328896e5238.
Reason for revert: fixes b/182729646
Fixes: 182729646
Change-Id: Idfa7fb9187a4707f4627a41b92f45313fbdc3ca8
(cherry picked from commit 90850f7b483cc659d5ba92e94e583e86b9971d24)
---
.../server/wm/InsetsSourceProvider.java | 42 ++++++++++++-------
.../com/android/server/wm/WindowFrames.java | 9 +---
.../server/wm/WindowManagerService.java | 5 +++
.../com/android/server/wm/WindowState.java | 24 ++++-------
4 files changed, 41 insertions(+), 39 deletions(-)
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index 35e54912b33e1..45c4233b40aaa 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -30,6 +30,7 @@ import static com.android.server.wm.InsetsSourceProviderProto.CONTROLLABLE;
import static com.android.server.wm.InsetsSourceProviderProto.CONTROL_TARGET;
import static com.android.server.wm.InsetsSourceProviderProto.FAKE_CONTROL;
import static com.android.server.wm.InsetsSourceProviderProto.FAKE_CONTROL_TARGET;
+import static com.android.server.wm.InsetsSourceProviderProto.FINISH_SEAMLESS_ROTATE_FRAME_NUMBER;
import static com.android.server.wm.InsetsSourceProviderProto.FRAME;
import static com.android.server.wm.InsetsSourceProviderProto.IME_OVERRIDDEN_FRAME;
import static com.android.server.wm.InsetsSourceProviderProto.IS_LEASH_READY_FOR_DISPATCHING;
@@ -58,7 +59,6 @@ import com.android.server.wm.SurfaceAnimator.AnimationType;
import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
import java.io.PrintWriter;
-import java.util.function.Consumer;
/**
* Controller for a specific inset source on the server. It's called provider as it provides the
@@ -84,16 +84,6 @@ class InsetsSourceProvider {
private final Rect mImeOverrideFrame = new Rect();
private boolean mIsLeashReadyForDispatching;
- private final Consumer mSetLeashPositionConsumer = t -> {
- if (mControl != null) {
- final SurfaceControl leash = mControl.getLeash();
- if (leash != null) {
- final Point position = mControl.getSurfacePosition();
- t.setPosition(leash, position.x, position.y);
- }
- }
- };
-
/** The visibility override from the current controlling window. */
private boolean mClientVisible;
@@ -159,6 +149,7 @@ class InsetsSourceProvider {
// TODO: Ideally, we should wait for the animation to finish so previous window can
// animate-out as new one animates-in.
mWin.cancelAnimation();
+ mWin.mPendingPositionChanged = null;
mWin.mProvidedInsetsSources.remove(mSource.getType());
}
ProtoLog.d(WM_DEBUG_IME, "InsetsSource setWin %s", win);
@@ -257,16 +248,31 @@ class InsetsSourceProvider {
if (mControl != null) {
final Point position = getWindowFrameSurfacePosition();
if (mControl.setSurfacePosition(position.x, position.y) && mControlTarget != null) {
- if (mWin.getWindowFrames().didFrameSizeChange()) {
- mWin.applyWithNextDraw(mSetLeashPositionConsumer);
+ if (!mWin.getWindowFrames().didFrameSizeChange()) {
+ updateLeashPosition(-1 /* frameNumber */);
+ } else if (mWin.mInRelayout) {
+ updateLeashPosition(mWin.getFrameNumber());
} else {
- mSetLeashPositionConsumer.accept(mWin.getPendingTransaction());
+ mWin.mPendingPositionChanged = this;
}
mStateController.notifyControlChanged(mControlTarget);
}
}
}
+ void updateLeashPosition(long frameNumber) {
+ if (mControl == null) {
+ return;
+ }
+ final SurfaceControl leash = mControl.getLeash();
+ if (leash != null) {
+ final Transaction t = mDisplayContent.getPendingTransaction();
+ final Point position = mControl.getSurfacePosition();
+ t.setPosition(leash, position.x, position.y);
+ deferTransactionUntil(t, leash, frameNumber);
+ }
+ }
+
private Point getWindowFrameSurfacePosition() {
final Rect frame = mWin.getFrame();
final Point position = new Point();
@@ -274,6 +280,14 @@ class InsetsSourceProvider {
return position;
}
+ private void deferTransactionUntil(Transaction t, SurfaceControl leash, long frameNumber) {
+ if (frameNumber >= 0) {
+ final SurfaceControl barrier = mWin.getClientViewRootSurface();
+ t.deferTransactionUntil(mWin.getSurfaceControl(), barrier, frameNumber);
+ t.deferTransactionUntil(leash, barrier, frameNumber);
+ }
+ }
+
/**
* @see InsetsStateController#onControlFakeTargetChanged(int, InsetsControlTarget)
*/
diff --git a/services/core/java/com/android/server/wm/WindowFrames.java b/services/core/java/com/android/server/wm/WindowFrames.java
index ffd6d21c1026b..9245f8c3efe5e 100644
--- a/services/core/java/com/android/server/wm/WindowFrames.java
+++ b/services/core/java/com/android/server/wm/WindowFrames.java
@@ -113,7 +113,7 @@ public class WindowFrames {
}
/**
- * @return true if the width or height has changed since last updating resizing window.
+ * @return true if the width or height has changed since last reported to the client.
*/
boolean didFrameSizeChange() {
return (mLastFrame.width() != mFrame.width()) || (mLastFrame.height() != mFrame.height());
@@ -134,13 +134,6 @@ public class WindowFrames {
return mLastForceReportingResized || mFrameSizeChanged;
}
- /**
- * @return true if the width or height has changed since last reported to the client.
- */
- boolean isFrameSizeChangeReported() {
- return mFrameSizeChanged || didFrameSizeChange();
- }
-
/**
* Resets the size changed flags so they're all set to false again. This should be called
* after the frames are reported to client.
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index f0dc7fe08c665..ec012fc36c896 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2232,6 +2232,11 @@ public class WindowManagerService extends IWindowManager.Stub
final DisplayContent dc = win.getDisplayContent();
+ if (win.mPendingPositionChanged != null) {
+ win.mPendingPositionChanged.updateLeashPosition(frameNumber);
+ win.mPendingPositionChanged = null;
+ }
+
if (mUseBLASTSync && win.useBLASTSync() && viewVisibility != View.GONE) {
win.prepareDrawHandlers();
result |= RELAYOUT_RES_BLAST_SYNC;
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 7ebc1cc6d5c1f..2eadcd5814175 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -726,6 +726,8 @@ class WindowState extends WindowContainer implements WindowManagerP
*/
private InsetsState mFrozenInsetsState;
+ @Nullable InsetsSourceProvider mPendingPositionChanged;
+
private static final float DEFAULT_DIM_AMOUNT_DEAD_WINDOW = 0.5f;
private KeyInterceptionInfo mKeyInterceptionInfo;
@@ -772,12 +774,6 @@ class WindowState extends WindowContainer implements WindowManagerP
updateSurfacePosition(t);
};
- private final Consumer mSetSurfacePositionConsumer = t -> {
- if (mSurfaceControl != null && mSurfaceControl.isValid()) {
- t.setPosition(mSurfaceControl, mSurfacePosition.x, mSurfacePosition.y);
- }
- };
-
/**
* @see #setSurfaceTranslationY(int)
*/
@@ -2133,8 +2129,6 @@ class WindowState extends WindowContainer implements WindowManagerP
: getTask().getWindowConfiguration().hasMovementAnimations();
if (mToken.okToAnimate()
&& (mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0
- && !mWindowFrames.didFrameSizeChange()
- && !surfaceInsetsChanging()
&& !isDragResizing()
&& hasMovementAnimation
&& !mWinAnimator.mLastHidden
@@ -5324,17 +5318,13 @@ class WindowState extends WindowContainer implements WindowManagerP
// prior to the rotation.
if (!mSurfaceAnimator.hasLeash() && mPendingSeamlessRotate == null
&& !mLastSurfacePosition.equals(mSurfacePosition)) {
- final boolean frameSizeChanged = mWindowFrames.isFrameSizeChangeReported();
- final boolean surfaceInsetsChanged = surfaceInsetsChanging();
- final boolean surfaceSizeChanged = frameSizeChanged || surfaceInsetsChanged;
+ t.setPosition(mSurfaceControl, mSurfacePosition.x, mSurfacePosition.y);
mLastSurfacePosition.set(mSurfacePosition.x, mSurfacePosition.y);
- if (surfaceInsetsChanged) {
+ if (surfaceInsetsChanging() && mWinAnimator.hasSurface()) {
mLastSurfaceInsets.set(mAttrs.surfaceInsets);
- }
- if (surfaceSizeChanged) {
- applyWithNextDraw(mSetSurfacePositionConsumer);
- } else {
- mSetSurfacePositionConsumer.accept(t);
+ t.deferTransactionUntil(mSurfaceControl,
+ mWinAnimator.mSurfaceController.mSurfaceControl,
+ getFrameNumber());
}
}
}
From 87405e723e7d5b0c954dccc298eeef02e0d341a5 Mon Sep 17 00:00:00 2001
From: Dave Mankoff
Date: Mon, 15 Mar 2021 13:26:04 -0400
Subject: [PATCH 021/176] Avoid falsing when the phone is unlocked.
With this change, we completely avoid recording motion events when the
phone is off the lock screen. We also also return false when asked if
the last gesture was a false.
Fixes: 182713255
Test: atest SystemUITests && manual
Change-Id: I2e16aecb218dd3c862ffefc8c82f67523925ac5e
(cherry picked from commit 8a5e237677cdc77b063b80d14a9094e350ea36ee)
---
.../classifier/BrightLineFalsingManager.java | 22 +++++++++++++++-
.../classifier/FalsingCollectorImpl.java | 11 ++++++--
.../classifier/BrightLineClassifierTest.java | 25 ++++++++++++++++---
.../classifier/FalsingCollectorImplTest.java | 22 +++++++++++++++-
4 files changed, 73 insertions(+), 7 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
index efb799294004c..45cefcc564bfc 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
@@ -31,6 +31,7 @@ import com.android.systemui.classifier.FalsingDataProvider.SessionListener;
import com.android.systemui.dagger.qualifiers.TestHarness;
import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.sensors.ThresholdSensor;
import java.io.FileDescriptor;
@@ -67,6 +68,7 @@ public class BrightLineFalsingManager implements FalsingManager {
private final SingleTapClassifier mSingleTapClassifier;
private final DoubleTapClassifier mDoubleTapClassifier;
private final HistoryTracker mHistoryTracker;
+ private final KeyguardStateController mKeyguardStateController;
private final boolean mTestHarness;
private final MetricsLogger mMetricsLogger;
private int mIsFalseTouchCalls;
@@ -113,7 +115,8 @@ public class BrightLineFalsingManager implements FalsingManager {
DockManager dockManager, MetricsLogger metricsLogger,
@Named(BRIGHT_LINE_GESTURE_CLASSIFERS) Set classifiers,
SingleTapClassifier singleTapClassifier, DoubleTapClassifier doubleTapClassifier,
- HistoryTracker historyTracker, @TestHarness boolean testHarness) {
+ HistoryTracker historyTracker, KeyguardStateController keyguardStateController,
+ @TestHarness boolean testHarness) {
mDataProvider = falsingDataProvider;
mDockManager = dockManager;
mMetricsLogger = metricsLogger;
@@ -121,6 +124,7 @@ public class BrightLineFalsingManager implements FalsingManager {
mSingleTapClassifier = singleTapClassifier;
mDoubleTapClassifier = doubleTapClassifier;
mHistoryTracker = historyTracker;
+ mKeyguardStateController = keyguardStateController;
mTestHarness = testHarness;
mDataProvider.addSessionListener(mSessionListener);
@@ -134,6 +138,10 @@ public class BrightLineFalsingManager implements FalsingManager {
@Override
public boolean isFalseTouch(@Classifier.InteractionType int interactionType) {
+ if (skipFalsing()) {
+ return false;
+ }
+
boolean result;
mDataProvider.setInteractionType(interactionType);
@@ -195,6 +203,10 @@ public class BrightLineFalsingManager implements FalsingManager {
@Override
public boolean isFalseTap(boolean robustCheck, double falsePenalty) {
+ if (skipFalsing()) {
+ return false;
+ }
+
FalsingClassifier.Result singleTapResult =
mSingleTapClassifier.isTap(mDataProvider.getRecentMotionEvents());
mPriorResults = Collections.singleton(singleTapResult);
@@ -233,6 +245,10 @@ public class BrightLineFalsingManager implements FalsingManager {
@Override
public boolean isFalseDoubleTap() {
+ if (skipFalsing()) {
+ return false;
+ }
+
FalsingClassifier.Result result = mDoubleTapClassifier.classifyGesture();
mPriorResults = Collections.singleton(result);
if (result.isFalse()) {
@@ -246,6 +262,10 @@ public class BrightLineFalsingManager implements FalsingManager {
return result.isFalse();
}
+ private boolean skipFalsing() {
+ return !mKeyguardStateController.isShowing();
+ }
+
@Override
public void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) {
// TODO: some of these classifiers might allow us to abort early, meaning we don't have to
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
index e090006cca4fd..b359860a0fd7f 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
@@ -27,6 +27,7 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.sensors.ProximitySensor;
import com.android.systemui.util.sensors.ThresholdSensor;
import com.android.systemui.util.time.SystemClock;
@@ -48,6 +49,7 @@ class FalsingCollectorImpl implements FalsingCollector {
private final HistoryTracker mHistoryTracker;
private final ProximitySensor mProximitySensor;
private final StatusBarStateController mStatusBarStateController;
+ private final KeyguardStateController mKeyguardStateController;
private final SystemClock mSystemClock;
private int mState;
@@ -87,13 +89,14 @@ class FalsingCollectorImpl implements FalsingCollector {
FalsingCollectorImpl(FalsingDataProvider falsingDataProvider, FalsingManager falsingManager,
KeyguardUpdateMonitor keyguardUpdateMonitor, HistoryTracker historyTracker,
ProximitySensor proximitySensor, StatusBarStateController statusBarStateController,
- SystemClock systemClock) {
+ KeyguardStateController keyguardStateController, SystemClock systemClock) {
mFalsingDataProvider = falsingDataProvider;
mFalsingManager = falsingManager;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mHistoryTracker = historyTracker;
mProximitySensor = proximitySensor;
mStatusBarStateController = statusBarStateController;
+ mKeyguardStateController = keyguardStateController;
mSystemClock = systemClock;
@@ -255,6 +258,10 @@ class FalsingCollectorImpl implements FalsingCollector {
@Override
public void onTouchEvent(MotionEvent ev) {
+ if (!mKeyguardStateController.isShowing()) {
+ avoidGesture();
+ return;
+ }
// We delay processing down events to see if another component wants to process them.
// If #avoidGesture is called after a MotionEvent.ACTION_DOWN, all following motion events
// will be ignored by the collector until another MotionEvent.ACTION_DOWN is passed in.
@@ -276,8 +283,8 @@ class FalsingCollectorImpl implements FalsingCollector {
@Override
public void avoidGesture() {
+ mAvoidGesture = true;
if (mPendingDownEvent != null) {
- mAvoidGesture = true;
mPendingDownEvent.recycle();
mPendingDownEvent = null;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java
index b2328504272a7..d015f51055b5a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java
@@ -35,6 +35,7 @@ import com.android.internal.logging.testing.FakeMetricsLogger;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.classifier.FalsingDataProvider.GestureCompleteListener;
import com.android.systemui.dock.DockManagerFake;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
@@ -71,7 +72,10 @@ public class BrightLineClassifierTest extends SysuiTestCase {
private FalsingClassifier mClassifierB;
private final List mMotionEventList = new ArrayList<>();
@Mock
- private HistoryTracker mHistoryTracker;;
+ private HistoryTracker mHistoryTracker;
+ @Mock
+ private KeyguardStateController mKeyguardStateController;
+
private final FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
private final FalsingClassifier.Result mFalsedResult = FalsingClassifier.Result.falsed(1, "");
@@ -88,9 +92,10 @@ public class BrightLineClassifierTest extends SysuiTestCase {
mClassifiers.add(mClassifierA);
mClassifiers.add(mClassifierB);
when(mFalsingDataProvider.getRecentMotionEvents()).thenReturn(mMotionEventList);
+ when(mKeyguardStateController.isShowing()).thenReturn(true);
mBrightLineFalsingManager = new BrightLineFalsingManager(mFalsingDataProvider, mDockManager,
mMetricsLogger, mClassifiers, mSingleTapClassfier, mDoubleTapClassifier,
- mHistoryTracker, false);
+ mHistoryTracker, mKeyguardStateController, false);
ArgumentCaptor gestureCompleteListenerCaptor =
@@ -120,7 +125,7 @@ public class BrightLineClassifierTest extends SysuiTestCase {
}
@Test
- public void testIsFalseTouch_ClassffiersPass() {
+ public void testIsFalseTouch_ClassifiersPass() {
assertThat(mBrightLineFalsingManager.isFalseTouch(0)).isFalse();
}
@@ -233,4 +238,18 @@ public class BrightLineClassifierTest extends SysuiTestCase {
assertThat(mFakeExecutor.numPending()).isEqualTo(0);
}
+
+ @Test
+ public void testNoFalsingUnlocked() {
+ when(mKeyguardStateController.isShowing()).thenReturn(false);
+
+ when(mClassifierA.classifyGesture(anyDouble(), anyDouble())).thenReturn(mFalsedResult);
+ assertThat(mBrightLineFalsingManager.isFalseTouch(0)).isFalse();
+
+ when(mSingleTapClassfier.isTap(mMotionEventList)).thenReturn(mFalsedResult);
+ assertThat(mBrightLineFalsingManager.isFalseTap(false, 0)).isFalse();
+
+ when(mDoubleTapClassifier.classifyGesture()).thenReturn(mFalsedResult);
+ assertThat(mBrightLineFalsingManager.isFalseDoubleTap()).isFalse();
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
index dc79b88818919..e6aeee7a9184b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
@@ -34,6 +34,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.sensors.ProximitySensor;
import com.android.systemui.util.sensors.ThresholdSensor;
import com.android.systemui.util.time.FakeSystemClock;
@@ -62,16 +63,19 @@ public class FalsingCollectorImplTest extends SysuiTestCase {
private ProximitySensor mProximitySensor;
@Mock
private SysuiStatusBarStateController mStatusBarStateController;
+ @Mock
+ private KeyguardStateController mKeyguardStateController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD);
+ when(mKeyguardStateController.isShowing()).thenReturn(true);
mFalsingCollector = new FalsingCollectorImpl(mFalsingDataProvider, mFalsingManager,
mKeyguardUpdateMonitor, mHistoryTracker, mProximitySensor,
- mStatusBarStateController, new FakeSystemClock());
+ mStatusBarStateController, mKeyguardStateController, new FakeSystemClock());
}
@Test
@@ -159,4 +163,20 @@ public class FalsingCollectorImplTest extends SysuiTestCase {
mFalsingCollector.onTouchEvent(up);
verify(mFalsingDataProvider, never()).onMotionEvent(any(MotionEvent.class));
}
+
+ @Test
+ public void testAvoidUnlocked() {
+ MotionEvent down = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
+ MotionEvent up = MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, 0, 0, 0);
+
+ when(mKeyguardStateController.isShowing()).thenReturn(false);
+
+ // Nothing passed initially
+ mFalsingCollector.onTouchEvent(down);
+ verify(mFalsingDataProvider, never()).onMotionEvent(any(MotionEvent.class));
+
+ // Up event would normally flush the up event.
+ mFalsingCollector.onTouchEvent(up);
+ verify(mFalsingDataProvider, never()).onMotionEvent(any(MotionEvent.class));
+ }
}
From 49275707a61e1a7d041faa2ec5428b30e17cd238 Mon Sep 17 00:00:00 2001
From: Wei Sheng Shih
Date: Wed, 17 Mar 2021 03:12:25 +0000
Subject: [PATCH 022/176] Revert "Enable remote animation for keygaurd."
This reverts commit edcdd961d9f76709caf479cc3daf9f3c53683f6e.
Reason for revert: suspect of b/182929692
Change-Id: I8c32a10b6e1728c76635b04345fb282e89520355
(cherry picked from commit 7cfddd02541e9ec7c9c4cea7f0874a2283cd116f)
---
.../src/com/android/systemui/keyguard/KeyguardService.java | 2 +-
.../core/java/com/android/server/wm/WindowManagerService.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
index 5cc0e65b2a615..97803c1cf2fd5 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
@@ -71,7 +71,7 @@ public class KeyguardService extends Service {
* @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
*/
private static boolean sEnableRemoteKeyguardAnimation =
- SystemProperties.getBoolean(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, true);
+ SystemProperties.getBoolean(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, false);
private final KeyguardViewMediator mKeyguardViewMediator;
private final KeyguardLifecyclesDispatcher mKeyguardLifecyclesDispatcher;
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 083026920e911..d2c9e29f9d374 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -431,7 +431,7 @@ public class WindowManagerService extends IWindowManager.Stub
* @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
*/
public static boolean sEnableRemoteKeyguardAnimation =
- SystemProperties.getBoolean(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, true);
+ SystemProperties.getBoolean(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, false);
private static final String DISABLE_TRIPLE_BUFFERING_PROPERTY =
"ro.sf.disable_triple_buffer";
From fad1e20e27312e8e0343a7b71b325949cb19e29e Mon Sep 17 00:00:00 2001
From: Beverly
Date: Wed, 17 Mar 2021 12:56:53 -0400
Subject: [PATCH 023/176] Don't show an app icon for uninitalized user
System apps running can post toasts before the app packages have been
initialized by ApplicationsState. If this happens, don't check for the
appEntry, instead automatically hide its icon from the toast.
Test: manual
Fixes: 182605816
Change-Id: I7e764341d049095da19f391ba9c944871584b921
(cherry picked from commit d581430ab8070baff5e41fb649af349d1953e18a)
---
.../settingslib/applications/ApplicationsState.java | 7 +++++++
.../src/com/android/systemui/toast/SystemUIToast.java | 9 +++++++--
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
index 2528ac1767f83..f180776bbe935 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
@@ -1496,6 +1496,13 @@ public class ApplicationsState {
}
}
+ /**
+ * Whether the packages for the user have been initialized.
+ */
+ public boolean isUserAdded(int userId) {
+ return mEntriesMap.contains(userId);
+ }
+
public interface Callbacks {
void onRunningStateChanged(boolean running);
diff --git a/packages/SystemUI/src/com/android/systemui/toast/SystemUIToast.java b/packages/SystemUI/src/com/android/systemui/toast/SystemUIToast.java
index fd19528e6d55e..3892f310e6697 100644
--- a/packages/SystemUI/src/com/android/systemui/toast/SystemUIToast.java
+++ b/packages/SystemUI/src/com/android/systemui/toast/SystemUIToast.java
@@ -26,6 +26,7 @@ import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.UserHandle;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
@@ -43,6 +44,7 @@ import com.android.systemui.plugins.ToastPlugin;
* directly. Instead, use {@link ToastFactory#createToast}.
*/
public class SystemUIToast implements ToastPlugin.Toast {
+ static final String TAG = "SystemUIToast";
final Context mContext;
final CharSequence mText;
final ToastPlugin.Toast mPluginToast;
@@ -225,8 +227,12 @@ public class SystemUIToast implements ToastPlugin.Toast {
int userId) {
final ApplicationsState appState =
ApplicationsState.getInstance((Application) context.getApplicationContext());
+ if (!appState.isUserAdded(userId)) {
+ Log.d(TAG, "user hasn't been fully initialized, not showing an app icon for "
+ + "packageName=" + packageName);
+ return null;
+ }
final AppEntry appEntry = appState.getEntry(packageName, userId);
-
if (!ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER.filterApp(appEntry)) {
return null;
}
@@ -237,6 +243,5 @@ public class SystemUIToast implements ToastPlugin.Toast {
Bitmap iconBmp = iconFactory.createBadgedIconBitmap(
appInfo.loadUnbadgedIcon(context.getPackageManager()), user, true).icon;
return new BitmapDrawable(context.getResources(), iconBmp);
-
}
}
From abdccfec5620acaff95d0cf1bb1b670ab40acfab Mon Sep 17 00:00:00 2001
From: Tianjie
Date: Tue, 23 Mar 2021 11:40:08 -0700
Subject: [PATCH 024/176] Clear caller id when reading device config
Reading the DeviceConfig with the gmscore call id will result in a
security exception.
Also clear the caller identity when before calling into locksettings
to armRebootEscrow. This is inline with the other usage for RoR
preparation.
Bug: 183475757
Test: trigger RoR from gmscore
Change-Id: Ifc65625fc7aba05d016c127cf6672922a5ffb000
(cherry picked from commit 18fb750cc54c26de452b40414ffe8199e20b47c5)
---
.../recoverysystem/RecoverySystemService.java | 23 ++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
index 0a6772bd8f6a8..fe21201f5cb7f 100644
--- a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
+++ b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
@@ -734,7 +734,15 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo
return REBOOT_ERROR_SLOT_MISMATCH;
}
- if (!mInjector.getLockSettingsService().armRebootEscrow()) {
+ final long origId = Binder.clearCallingIdentity();
+ boolean result;
+ try {
+ result = mInjector.getLockSettingsService().armRebootEscrow();
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+
+ if (!result) {
Slog.w(TAG, "Failure to escrow key for reboot");
return REBOOT_ERROR_ARM_REBOOT_ESCROW_FAILURE;
}
@@ -742,11 +750,20 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo
return REBOOT_ERROR_NONE;
}
+ private boolean useServerBasedRoR() {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_OTA,
+ "server_based_ror_enabled", false);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
private void reportMetricsOnRebootWithLskf(String packageName, boolean slotSwitch,
@ResumeOnRebootRebootErrorCode int errorCode) {
int uid = mInjector.getUidFromPackageName(packageName);
- boolean serverBased = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_OTA,
- "server_based_ror_enabled", false);
+ boolean serverBased = useServerBasedRoR();
int preparedClientCount;
synchronized (this) {
preparedClientCount = mCallerPreparedForReboot.size();
From 7708dd74fa7a8cc5aa9f6dd84a3b4ddd9d42883e Mon Sep 17 00:00:00 2001
From: Cassie Wang
Date: Tue, 2 Feb 2021 15:21:37 -0800
Subject: [PATCH 025/176] Handle user stopping in AppSearch.
When a user stops, we can close its AppSearchImpl instance to release
resources. We'll also remove it from our cache of unlocked users so
future API calls won't execute on a locked user.
Bug: 179407490
Test: atest -m -c --rebuild-module-info CtsAppSearchTestCases
FrameworksCoreTests: android.app.appsearch
FrameworksServicesTests: com.android.server.appsearch
Change-Id: I9a19d3044ed4f0b0f1269a9d15d8ae85e90d2b02
(cherry picked from commit 12539e04e927f9160d584ee6d478abbd16e8d984)
---
.../server/appsearch/AppSearchManagerService.java | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
index 28069743d957b..309e70d8393e3 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
@@ -86,6 +86,21 @@ public class AppSearchManagerService extends SystemService {
}
}
+ @Override
+ public void onUserStopping(@NonNull TargetUser user) {
+ synchronized (mUnlockedUserIdsLocked) {
+ mUnlockedUserIdsLocked.remove(user.getUserIdentifier());
+ try {
+ AppSearchImpl impl =
+ mImplInstanceManager.getAppSearchImpl(
+ getContext(), user.getUserIdentifier());
+ impl.close();
+ } catch (Throwable t) {
+ Log.e(TAG, "Error handling user stopping.", t);
+ }
+ }
+ }
+
private class Stub extends IAppSearchManager.Stub {
@Override
public void setSchema(
From 90144a6c4941671435685a2cd60688ef488c4c97 Mon Sep 17 00:00:00 2001
From: Jeff Sharkey
Date: Mon, 29 Mar 2021 18:52:29 -0600
Subject: [PATCH 026/176] Temporary stop-gap for Chrome target SDK issue.
The Chrome team was planning to provide a new prebuilt SDK last week
which returned to targeting the official R SDK level, but other
challenges prevented them from doing so.
They still intend to land an updated prebuilt which targets R, but
to unblock testing this change makes that change on their behalf;
when we see a very specific Chrome version code we force the target
SDK back to R. This code will safely become a no-op during their
next prebuilt, which should have a different version code.
Bug: 183905675
Test: manual
Change-Id: Ib8bc10c111003b6a496147c5c60dcebf960ed081
(cherry picked from commit f3c0343fe5a09831e415b2eb2bd1097e1bbe57de)
---
.../android/content/pm/parsing/ParsingPackageUtils.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index 4e7bd7046fc22..97710680bac26 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -2800,6 +2800,12 @@ public class ParsingPackageUtils {
}
private void convertSplitPermissions(ParsingPackage pkg) {
+ // STOPSHIP(b/183905675): REMOVE THIS TERRIBLE, HORRIBLE, NO GOOD, VERY BAD HACK
+ if ("com.android.chrome".equals(pkg.getPackageName())
+ && 445500383 == pkg.getVersionCode()) {
+ pkg.setTargetSdkVersion(Build.VERSION_CODES.R);
+ }
+
final int listSize = mSplitPermissionInfos.size();
for (int is = 0; is < listSize; is++) {
final PermissionManager.SplitPermissionInfo spi = mSplitPermissionInfos.get(is);
From 774b989dffcd3360fa7eca6eec92e841117bfb64 Mon Sep 17 00:00:00 2001
From: Jeff Sharkey
Date: Mon, 29 Mar 2021 18:52:29 -0600
Subject: [PATCH 027/176] Temporary stop-gap for Chrome target SDK issue.
The Chrome team was planning to provide a new prebuilt SDK last week
which returned to targeting the official R SDK level, but other
challenges prevented them from doing so.
They still intend to land an updated prebuilt which targets R, but
to unblock testing this change makes that change on their behalf;
when we see a very specific Chrome version code we force the target
SDK back to R. This code will safely become a no-op during their
next prebuilt, which should have a different version code.
Bug: 183905675
Test: manual
Change-Id: Ib8bc10c111003b6a496147c5c60dcebf960ed081
(cherry picked from commit f3c0343fe5a09831e415b2eb2bd1097e1bbe57de)
---
.../android/content/pm/parsing/ParsingPackageUtils.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index 4e7bd7046fc22..97710680bac26 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -2800,6 +2800,12 @@ public class ParsingPackageUtils {
}
private void convertSplitPermissions(ParsingPackage pkg) {
+ // STOPSHIP(b/183905675): REMOVE THIS TERRIBLE, HORRIBLE, NO GOOD, VERY BAD HACK
+ if ("com.android.chrome".equals(pkg.getPackageName())
+ && 445500383 == pkg.getVersionCode()) {
+ pkg.setTargetSdkVersion(Build.VERSION_CODES.R);
+ }
+
final int listSize = mSplitPermissionInfos.size();
for (int is = 0; is < listSize; is++) {
final PermissionManager.SplitPermissionInfo spi = mSplitPermissionInfos.get(is);
From f3de6f5dd329dd2d6026866a3a38ac2282a006f1 Mon Sep 17 00:00:00 2001
From: Jeff Sharkey
Date: Mon, 29 Mar 2021 18:52:29 -0600
Subject: [PATCH 028/176] Temporary stop-gap for Chrome target SDK issue.
The Chrome team was planning to provide a new prebuilt SDK last week
which returned to targeting the official R SDK level, but other
challenges prevented them from doing so.
They still intend to land an updated prebuilt which targets R, but
to unblock testing this change makes that change on their behalf;
when we see a very specific Chrome version code we force the target
SDK back to R. This code will safely become a no-op during their
next prebuilt, which should have a different version code.
Bug: 183905675
Test: manual
Change-Id: Ib8bc10c111003b6a496147c5c60dcebf960ed081
(cherry picked from commit f3c0343fe5a09831e415b2eb2bd1097e1bbe57de)
---
.../android/content/pm/parsing/ParsingPackageUtils.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index 4e7bd7046fc22..97710680bac26 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -2800,6 +2800,12 @@ public class ParsingPackageUtils {
}
private void convertSplitPermissions(ParsingPackage pkg) {
+ // STOPSHIP(b/183905675): REMOVE THIS TERRIBLE, HORRIBLE, NO GOOD, VERY BAD HACK
+ if ("com.android.chrome".equals(pkg.getPackageName())
+ && 445500383 == pkg.getVersionCode()) {
+ pkg.setTargetSdkVersion(Build.VERSION_CODES.R);
+ }
+
final int listSize = mSplitPermissionInfos.size();
for (int is = 0; is < listSize; is++) {
final PermissionManager.SplitPermissionInfo spi = mSplitPermissionInfos.get(is);
From 261eafb2232661f91a0bc71c3ac0fa718a82ec0f Mon Sep 17 00:00:00 2001
From: Jeff Sharkey
Date: Mon, 29 Mar 2021 18:52:29 -0600
Subject: [PATCH 029/176] Temporary stop-gap for Chrome target SDK issue.
The Chrome team was planning to provide a new prebuilt SDK last week
which returned to targeting the official R SDK level, but other
challenges prevented them from doing so.
They still intend to land an updated prebuilt which targets R, but
to unblock testing this change makes that change on their behalf;
when we see a very specific Chrome version code we force the target
SDK back to R. This code will safely become a no-op during their
next prebuilt, which should have a different version code.
Bug: 183905675
Test: manual
Change-Id: Ib8bc10c111003b6a496147c5c60dcebf960ed081
(cherry picked from commit f3c0343fe5a09831e415b2eb2bd1097e1bbe57de)
---
.../android/content/pm/parsing/ParsingPackageUtils.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index 4e7bd7046fc22..97710680bac26 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -2800,6 +2800,12 @@ public class ParsingPackageUtils {
}
private void convertSplitPermissions(ParsingPackage pkg) {
+ // STOPSHIP(b/183905675): REMOVE THIS TERRIBLE, HORRIBLE, NO GOOD, VERY BAD HACK
+ if ("com.android.chrome".equals(pkg.getPackageName())
+ && 445500383 == pkg.getVersionCode()) {
+ pkg.setTargetSdkVersion(Build.VERSION_CODES.R);
+ }
+
final int listSize = mSplitPermissionInfos.size();
for (int is = 0; is < listSize; is++) {
final PermissionManager.SplitPermissionInfo spi = mSplitPermissionInfos.get(is);
From c3bc0711a272f70952383d0f6a86e23e0875d166 Mon Sep 17 00:00:00 2001
From: Jeff Sharkey
Date: Mon, 29 Mar 2021 18:52:29 -0600
Subject: [PATCH 030/176] Temporary stop-gap for Chrome target SDK issue.
The Chrome team was planning to provide a new prebuilt SDK last week
which returned to targeting the official R SDK level, but other
challenges prevented them from doing so.
They still intend to land an updated prebuilt which targets R, but
to unblock testing this change makes that change on their behalf;
when we see a very specific Chrome version code we force the target
SDK back to R. This code will safely become a no-op during their
next prebuilt, which should have a different version code.
Bug: 183905675
Test: manual
Change-Id: Ib8bc10c111003b6a496147c5c60dcebf960ed081
(cherry picked from commit f3c0343fe5a09831e415b2eb2bd1097e1bbe57de)
---
.../android/content/pm/parsing/ParsingPackageUtils.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index 4e7bd7046fc22..97710680bac26 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -2800,6 +2800,12 @@ public class ParsingPackageUtils {
}
private void convertSplitPermissions(ParsingPackage pkg) {
+ // STOPSHIP(b/183905675): REMOVE THIS TERRIBLE, HORRIBLE, NO GOOD, VERY BAD HACK
+ if ("com.android.chrome".equals(pkg.getPackageName())
+ && 445500383 == pkg.getVersionCode()) {
+ pkg.setTargetSdkVersion(Build.VERSION_CODES.R);
+ }
+
final int listSize = mSplitPermissionInfos.size();
for (int is = 0; is < listSize; is++) {
final PermissionManager.SplitPermissionInfo spi = mSplitPermissionInfos.get(is);
From 1c3f62116f62f23dec1fbd6b4410e2411f158a6e Mon Sep 17 00:00:00 2001
From: Svet Ganov
Date: Wed, 7 Apr 2021 01:46:31 +0000
Subject: [PATCH 031/176] Add fallback for datasource without
UPDATE_APP_OP_STATS
If the datasource is not in a trusted platform component then in would not
have UPDATE_APP_OPS_STATS. The problem is that an app is exposing runtime
permission protected data but cannot blame others in a trusted way which
would not properly show in permission usage UIs. As a fallback we are
adding a proxy op handling blaming the datasource and the caller.
bug: 183960997
Test: Assustant on auto projection works
Change-Id: I8a341a6c46c75eff86bac7a79c4219ebb7991071
(cherry picked from commit 773862fda5d38d997f458c309856ed145cd5c893)
---
.../android/content/PermissionChecker.java | 46 +++++++++++++++----
1 file changed, 37 insertions(+), 9 deletions(-)
diff --git a/core/java/android/content/PermissionChecker.java b/core/java/android/content/PermissionChecker.java
index 049bfe7f23fb2..5089f30585b49 100644
--- a/core/java/android/content/PermissionChecker.java
+++ b/core/java/android/content/PermissionChecker.java
@@ -1066,11 +1066,25 @@ public final class PermissionChecker {
return AppOpsManager.MODE_ERRORED;
}
if (selfAccess) {
- return appOpsManager.startOpNoThrow(op, resolvedAttributionSource.getUid(),
- resolvedAttributionSource.getPackageName(),
- /*startIfModeDefault*/ false,
- resolvedAttributionSource.getAttributionTag(),
- message);
+ // If the datasource is not in a trusted platform component then in would not
+ // have UPDATE_APP_OPS_STATS and the call below would fail. The problem is that
+ // an app is exposing runtime permission protected data but cannot blame others
+ // in a trusted way which would not properly show in permission usage UIs.
+ // As a fallback we note a proxy op that blames the app and the datasource.
+ try {
+ return appOpsManager.startOpNoThrow(op, resolvedAttributionSource.getUid(),
+ resolvedAttributionSource.getPackageName(),
+ /*startIfModeDefault*/ false,
+ resolvedAttributionSource.getAttributionTag(),
+ message);
+ } catch (SecurityException e) {
+ Slog.w(LOG_TAG, "Datasource " + attributionSource + " protecting data with"
+ + " platform defined runtime permission "
+ + AppOpsManager.opToPermission(op) + " while not having "
+ + Manifest.permission.UPDATE_APP_OPS_STATS);
+ return appOpsManager.startProxyOpNoThrow(op, attributionSource, message,
+ skipProxyOperation);
+ }
} else {
return appOpsManager.startProxyOpNoThrow(op, resolvedAttributionSource, message,
skipProxyOperation);
@@ -1082,10 +1096,24 @@ public final class PermissionChecker {
return AppOpsManager.MODE_ERRORED;
}
if (selfAccess) {
- return appOpsManager.noteOpNoThrow(op, resolvedAttributionSource.getUid(),
- resolvedAttributionSource.getPackageName(),
- resolvedAttributionSource.getAttributionTag(),
- message);
+ // If the datasource is not in a trusted platform component then in would not
+ // have UPDATE_APP_OPS_STATS and the call below would fail. The problem is that
+ // an app is exposing runtime permission protected data but cannot blame others
+ // in a trusted way which would not properly show in permission usage UIs.
+ // As a fallback we note a proxy op that blames the app and the datasource.
+ try {
+ return appOpsManager.noteOpNoThrow(op, resolvedAttributionSource.getUid(),
+ resolvedAttributionSource.getPackageName(),
+ resolvedAttributionSource.getAttributionTag(),
+ message);
+ } catch (SecurityException e) {
+ Slog.w(LOG_TAG, "Datasource " + attributionSource + " protecting data with"
+ + " platform defined runtime permission "
+ + AppOpsManager.opToPermission(op) + " while not having "
+ + Manifest.permission.UPDATE_APP_OPS_STATS);
+ return appOpsManager.noteProxyOpNoThrow(op, attributionSource, message,
+ skipProxyOperation);
+ }
} else {
return appOpsManager.noteProxyOpNoThrow(op, resolvedAttributionSource, message,
skipProxyOperation);
From a512213e6ff81033f499f411e0c2b54339beb609 Mon Sep 17 00:00:00 2001
From: Jeff Sharkey
Date: Mon, 29 Mar 2021 18:52:29 -0600
Subject: [PATCH 032/176] Temporary stop-gap for Chrome target SDK issue.
The Chrome team was planning to provide a new prebuilt SDK last week
which returned to targeting the official R SDK level, but other
challenges prevented them from doing so.
They still intend to land an updated prebuilt which targets R, but
to unblock testing this change makes that change on their behalf;
when we see a very specific Chrome version code we force the target
SDK back to R. This code will safely become a no-op during their
next prebuilt, which should have a different version code.
Bug: 183905675
Test: manual
Change-Id: Ib8bc10c111003b6a496147c5c60dcebf960ed081
(cherry picked from commit f3c0343fe5a09831e415b2eb2bd1097e1bbe57de)
---
.../android/content/pm/parsing/ParsingPackageUtils.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index 4e7bd7046fc22..97710680bac26 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -2800,6 +2800,12 @@ public class ParsingPackageUtils {
}
private void convertSplitPermissions(ParsingPackage pkg) {
+ // STOPSHIP(b/183905675): REMOVE THIS TERRIBLE, HORRIBLE, NO GOOD, VERY BAD HACK
+ if ("com.android.chrome".equals(pkg.getPackageName())
+ && 445500383 == pkg.getVersionCode()) {
+ pkg.setTargetSdkVersion(Build.VERSION_CODES.R);
+ }
+
final int listSize = mSplitPermissionInfos.size();
for (int is = 0; is < listSize; is++) {
final PermissionManager.SplitPermissionInfo spi = mSplitPermissionInfos.get(is);
From fc21b7262e479b8123aff037029f890b175d49c7 Mon Sep 17 00:00:00 2001
From: Orion Hodson
Date: Thu, 8 Apr 2021 12:30:21 +0000
Subject: [PATCH 033/176] Revert "Remove setFrame from surface_control
setGeometry"
Revert "Remove setFrame from BufferStateLayer"
Revert "Update tests to reflect the new behavior for setGeometry"
Revert submission 13843937-sc_remove_set_frame
Reason for revert: Candidate CL for b/184807094
Reverted Changes:
Iffbd955a3:Remove setFrame
I27f17bc61:Update tests to reflect the new behavior for setGe...
I5720276c1:Remove setFrame from surface_control setGeometry
I32ee0e3e4:Remove setFrame from BufferStateLayer
Bug: 184807094
Change-Id: I7f6f0d7799e6e2858af2ce2e8acb5c67db8714f8
(cherry picked from commit 98aa7d4c88834987d5102f0137d206e921583ace)
---
native/android/surface_control.cpp | 29 +++++++----------------------
1 file changed, 7 insertions(+), 22 deletions(-)
diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp
index 7433cf9705668..e0f637959cfb3 100644
--- a/native/android/surface_control.cpp
+++ b/native/android/surface_control.cpp
@@ -432,27 +432,14 @@ void ASurfaceTransaction_setGeometry(ASurfaceTransaction* aSurfaceTransaction,
const ARect& destination, int32_t transform) {
CHECK_NOT_NULL(aSurfaceTransaction);
CHECK_NOT_NULL(aSurfaceControl);
+ CHECK_VALID_RECT(source);
CHECK_VALID_RECT(destination);
- Rect sourceRect = static_cast(source);
- // Adjust the source so its top and left are not negative
- sourceRect.left = std::max(sourceRect.left, 0);
- sourceRect.top = std::max(sourceRect.top, 0);
- LOG_ALWAYS_FATAL_IF(sourceRect.isEmpty(), "invalid arg passed as source argument");
-
sp surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
- transaction->setCrop(surfaceControl, sourceRect);
-
- float dsdx = (destination.right - destination.left) /
- static_cast(sourceRect.right - sourceRect.left);
- float dsdy = (destination.bottom - destination.top) /
- static_cast(sourceRect.bottom - sourceRect.top);
-
- transaction->setPosition(surfaceControl, destination.left - (sourceRect.left * dsdx),
- destination.top - (sourceRect.top * dsdy));
- transaction->setMatrix(surfaceControl, dsdx, 0, 0, dsdy);
+ transaction->setCrop(surfaceControl, static_cast(source));
+ transaction->setFrame(surfaceControl, static_cast(destination));
transaction->setTransform(surfaceControl, transform);
bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
@@ -471,18 +458,16 @@ void ASurfaceTransaction_setSourceRect(ASurfaceTransaction* aSurfaceTransaction,
transaction->setCrop(surfaceControl, static_cast(source));
}
-void ASurfaceTransaction_setPosition(ASurfaceTransaction* /* aSurfaceTransaction */,
- ASurfaceControl* /* aSurfaceControl */,
- const ARect& /* destination */) {
- // TODO: Fix this function
- /* CHECK_NOT_NULL(aSurfaceTransaction);
+void ASurfaceTransaction_setPosition(ASurfaceTransaction* aSurfaceTransaction,
+ ASurfaceControl* aSurfaceControl, const ARect& destination) {
+ CHECK_NOT_NULL(aSurfaceTransaction);
CHECK_NOT_NULL(aSurfaceControl);
CHECK_VALID_RECT(destination);
sp surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
- transaction->setFrame(surfaceControl, static_cast(destination));*/
+ transaction->setFrame(surfaceControl, static_cast(destination));
}
void ASurfaceTransaction_setTransform(ASurfaceTransaction* aSurfaceTransaction,
From 93bdfca03d527ca8ee40443baea100a84adaea27 Mon Sep 17 00:00:00 2001
From: Orion Hodson
Date: Thu, 8 Apr 2021 12:30:21 +0000
Subject: [PATCH 034/176] Revert "Remove setFrame from surface_control
setGeometry"
Revert "Remove setFrame from BufferStateLayer"
Revert "Update tests to reflect the new behavior for setGeometry"
Revert submission 13843937-sc_remove_set_frame
Reason for revert: Candidate CL for b/184807094
Reverted Changes:
Iffbd955a3:Remove setFrame
I27f17bc61:Update tests to reflect the new behavior for setGe...
I5720276c1:Remove setFrame from surface_control setGeometry
I32ee0e3e4:Remove setFrame from BufferStateLayer
Bug: 184807094
Change-Id: I7f6f0d7799e6e2858af2ce2e8acb5c67db8714f8
(cherry picked from commit 98aa7d4c88834987d5102f0137d206e921583ace)
---
native/android/surface_control.cpp | 29 +++++++----------------------
1 file changed, 7 insertions(+), 22 deletions(-)
diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp
index 7433cf9705668..e0f637959cfb3 100644
--- a/native/android/surface_control.cpp
+++ b/native/android/surface_control.cpp
@@ -432,27 +432,14 @@ void ASurfaceTransaction_setGeometry(ASurfaceTransaction* aSurfaceTransaction,
const ARect& destination, int32_t transform) {
CHECK_NOT_NULL(aSurfaceTransaction);
CHECK_NOT_NULL(aSurfaceControl);
+ CHECK_VALID_RECT(source);
CHECK_VALID_RECT(destination);
- Rect sourceRect = static_cast(source);
- // Adjust the source so its top and left are not negative
- sourceRect.left = std::max(sourceRect.left, 0);
- sourceRect.top = std::max(sourceRect.top, 0);
- LOG_ALWAYS_FATAL_IF(sourceRect.isEmpty(), "invalid arg passed as source argument");
-
sp surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
- transaction->setCrop(surfaceControl, sourceRect);
-
- float dsdx = (destination.right - destination.left) /
- static_cast(sourceRect.right - sourceRect.left);
- float dsdy = (destination.bottom - destination.top) /
- static_cast(sourceRect.bottom - sourceRect.top);
-
- transaction->setPosition(surfaceControl, destination.left - (sourceRect.left * dsdx),
- destination.top - (sourceRect.top * dsdy));
- transaction->setMatrix(surfaceControl, dsdx, 0, 0, dsdy);
+ transaction->setCrop(surfaceControl, static_cast(source));
+ transaction->setFrame(surfaceControl, static_cast(destination));
transaction->setTransform(surfaceControl, transform);
bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
@@ -471,18 +458,16 @@ void ASurfaceTransaction_setSourceRect(ASurfaceTransaction* aSurfaceTransaction,
transaction->setCrop(surfaceControl, static_cast(source));
}
-void ASurfaceTransaction_setPosition(ASurfaceTransaction* /* aSurfaceTransaction */,
- ASurfaceControl* /* aSurfaceControl */,
- const ARect& /* destination */) {
- // TODO: Fix this function
- /* CHECK_NOT_NULL(aSurfaceTransaction);
+void ASurfaceTransaction_setPosition(ASurfaceTransaction* aSurfaceTransaction,
+ ASurfaceControl* aSurfaceControl, const ARect& destination) {
+ CHECK_NOT_NULL(aSurfaceTransaction);
CHECK_NOT_NULL(aSurfaceControl);
CHECK_VALID_RECT(destination);
sp surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
- transaction->setFrame(surfaceControl, static_cast(destination));*/
+ transaction->setFrame(surfaceControl, static_cast(destination));
}
void ASurfaceTransaction_setTransform(ASurfaceTransaction* aSurfaceTransaction,
From 0b63ce0f181cc64fe2ea200280c46c4cfb7694e0 Mon Sep 17 00:00:00 2001
From: Matt Pietal
Date: Thu, 8 Apr 2021 11:51:29 +0000
Subject: [PATCH 035/176] Revert^3 "Enable smartspace"
3b67a00d95e6d19824030cd1169e213c2231ce71
Change-Id: I4711f24b1ed3535dbf40ffd6ab893e6cd661fe49
(cherry picked from commit 20744ed3b4623b379821af2945ef0cb77fe40648)
---
packages/SystemUI/AndroidManifest.xml | 2 -
.../plugins/BcSmartspaceDataPlugin.java | 18 ----
packages/SystemUI/res/values/flags.xml | 2 -
.../KeyguardClockSwitchController.java | 100 +-----------------
.../com/android/systemui/SystemUIFactory.java | 12 +--
.../systemui/statusbar/FeatureFlags.java | 4 -
.../KeyguardClockSwitchControllerTest.java | 70 +-----------
7 files changed, 6 insertions(+), 202 deletions(-)
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 88d7710e56c6e..85ecb1c7345da 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -275,8 +275,6 @@
-
-
diff --git a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
index 35423a979cbcd..f8a9a04596731 100644
--- a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
+++ b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
@@ -16,9 +16,7 @@
package com.android.systemui.plugins;
-import android.app.smartspace.SmartspaceTarget;
import android.os.Parcelable;
-import android.view.ViewGroup;
import com.android.systemui.plugins.annotations.ProvidesInterface;
@@ -38,25 +36,9 @@ public interface BcSmartspaceDataPlugin extends Plugin {
/** Unregister a listener. */
void unregisterListener(SmartspaceTargetListener listener);
- /**
- * Create a view to be shown within the parent. Do not add the view, as the parent
- * will be responsible for correctly setting the LayoutParams
- */
- default SmartspaceView getView(ViewGroup parent) {
- return null;
- }
-
- /** Updates Smartspace data and propagates it to any listeners. */
- void onTargetsAvailable(List targets);
-
/** Provides Smartspace data to registered listeners. */
interface SmartspaceTargetListener {
/** Each Parcelable is a SmartspaceTarget that represents a card. */
void onSmartspaceTargetsUpdated(List extends Parcelable> targets);
}
-
- /** View to which this plugin can be registered, in order to get updates. */
- interface SmartspaceView {
- void registerDataProvider(BcSmartspaceDataPlugin plugin);
- }
}
diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml
index bbf204844e29a..834b482a449e9 100644
--- a/packages/SystemUI/res/values/flags.xml
+++ b/packages/SystemUI/res/values/flags.xml
@@ -50,6 +50,4 @@
false
true
-
- false
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
index 24b7cd118ed67..0675200f81e26 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
@@ -16,15 +16,8 @@
package com.android.keyguard;
-import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
-
import android.app.WallpaperManager;
-import android.app.smartspace.SmartspaceConfig;
-import android.app.smartspace.SmartspaceManager;
-import android.app.smartspace.SmartspaceSession;
import android.content.ContentResolver;
-import android.content.Context;
import android.content.res.Resources;
import android.provider.Settings;
import android.text.TextUtils;
@@ -32,7 +25,6 @@ import android.text.format.DateFormat;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
-import android.widget.RelativeLayout;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.keyguard.clock.ClockManager;
@@ -40,12 +32,8 @@ import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.plugins.ClockPlugin;
-import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.shared.plugins.PluginManager;
-import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.PropertyAnimator;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
@@ -55,7 +43,6 @@ import com.android.systemui.util.ViewController;
import java.util.Locale;
import java.util.TimeZone;
-import java.util.concurrent.Executor;
import javax.inject.Inject;
@@ -81,13 +68,6 @@ public class KeyguardClockSwitchController extends ViewController() {
-
- @Override
- public void onPluginConnected(BcSmartspaceDataPlugin plugin, Context pluginContext) {
- if (!mIsSmartspaceEnabled) return;
-
- View ksa = mView.findViewById(R.id.keyguard_status_area);
- int ksaIndex = mView.indexOfChild(ksa);
- ksa.setVisibility(View.GONE);
-
- mSmartspaceView = plugin.getView(mView);
- mSmartspaceView.registerDataProvider(plugin);
-
- RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
- MATCH_PARENT, WRAP_CONTENT);
- lp.addRule(RelativeLayout.BELOW, R.id.new_lockscreen_clock_view);
- mView.addView((View) mSmartspaceView, ksaIndex, lp);
-
- View nic = mView.findViewById(
- com.android.systemui.R.id.left_aligned_notification_icon_container);
- lp = (RelativeLayout.LayoutParams) nic.getLayoutParams();
- lp.addRule(RelativeLayout.BELOW, ((View) mSmartspaceView).getId());
- nic.setLayoutParams(lp);
-
- createSmartspaceSession(plugin);
- }
-
- @Override
- public void onPluginDisconnected(BcSmartspaceDataPlugin plugin) {
- if (!mIsSmartspaceEnabled) return;
-
- mView.removeView((View) mSmartspaceView);
- mView.findViewById(R.id.keyguard_status_area).setVisibility(View.VISIBLE);
-
- View nic = mView.findViewById(
- com.android.systemui.R.id.left_aligned_notification_icon_container);
- RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)
- nic.getLayoutParams();
- lp.addRule(RelativeLayout.BELOW, R.id.keyguard_status_area);
- nic.setLayoutParams(lp);
-
- mSmartspaceView = null;
- }
-
- private void createSmartspaceSession(BcSmartspaceDataPlugin plugin) {
- mSmartspaceSession = getContext().getSystemService(SmartspaceManager.class)
- .createSmartspaceSession(
- new SmartspaceConfig.Builder(getContext(), "lockscreen").build());
- mSmartspaceCallback = targets -> plugin.onTargetsAvailable(targets);
- mSmartspaceSession.registerSmartspaceUpdates(mUiExecutor, mSmartspaceCallback);
- mSmartspaceSession.requestSmartspaceUpdate();
- }
- };
- mPluginManager.addPluginListener(mPluginListener, BcSmartspaceDataPlugin.class, false);
}
@Override
@@ -233,13 +147,6 @@ public class KeyguardClockSwitchController extends ViewController T getInstance() {
return (T) mFactory;
@@ -89,13 +88,13 @@ public class SystemUIFactory {
public void init(Context context, boolean fromTest)
throws ExecutionException, InterruptedException {
// Only initialize components for the main system ui process running as the primary user
- mInitializeComponents = !fromTest
+ final boolean initializeComponents = !fromTest
&& android.os.Process.myUserHandle().isSystem()
&& ActivityThread.currentProcessName().equals(ActivityThread.currentPackageName());
mRootComponent = buildGlobalRootComponent(context);
// Stand up WMComponent
mWMComponent = mRootComponent.getWMComponentBuilder().build();
- if (mInitializeComponents) {
+ if (initializeComponents) {
// Only initialize when not starting from tests since this currently initializes some
// components that shouldn't be run in the test environment
mWMComponent.init();
@@ -103,7 +102,7 @@ public class SystemUIFactory {
// And finally, retrieve whatever SysUI needs from WMShell and build SysUI.
SysUIComponent.Builder builder = mRootComponent.getSysUIComponent();
- if (mInitializeComponents) {
+ if (initializeComponents) {
// Only initialize when not starting from tests since this currently initializes some
// components that shouldn't be run in the test environment
builder = prepareSysUIComponentBuilder(builder, mWMComponent)
@@ -135,7 +134,7 @@ public class SystemUIFactory {
.setStartingSurface(Optional.ofNullable(null));
}
mSysUIComponent = builder.build();
- if (mInitializeComponents) {
+ if (initializeComponents) {
mSysUIComponent.init();
}
@@ -161,9 +160,6 @@ public class SystemUIFactory {
.build();
}
- protected boolean shouldInitializeComponents() {
- return mInitializeComponents;
- }
public GlobalRootComponent getRootComponent() {
return mRootComponent;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java
index ec3a857dbc840..f51fbedebad25 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java
@@ -97,8 +97,4 @@ public class FeatureFlags {
public boolean isOngoingCallStatusBarChipEnabled() {
return mFlagReader.isEnabled(R.bool.flag_ongoing_call_status_bar_chip);
}
-
- public boolean isSmartspaceEnabled() {
- return mFlagReader.isEnabled(R.bool.flag_smartspace);
- }
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
index 0fcd79b357c3a..70a7b7a5acbcf 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
@@ -18,34 +18,26 @@ package com.android.keyguard;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.ContentResolver;
-import android.content.Context;
import android.content.res.Resources;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
-import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
-import android.widget.RelativeLayout;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.keyguard.clock.ClockManager;
-import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
-import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.shared.plugins.PluginManager;
-import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.NotificationIconContainer;
@@ -58,8 +50,6 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.verification.VerificationMode;
-import java.util.concurrent.Executor;
-
@SmallTest
@RunWith(AndroidTestingRunner.class)
public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
@@ -88,12 +78,6 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
ContentResolver mContentResolver;
@Mock
BroadcastDispatcher mBroadcastDispatcher;
- @Mock
- private PluginManager mPluginManager;
- @Mock
- private FeatureFlags mFeatureFlags;
- @Mock
- private Executor mExecutor;
private KeyguardClockSwitchController mController;
@@ -103,8 +87,6 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
when(mView.findViewById(com.android.systemui.R.id.left_aligned_notification_icon_container))
.thenReturn(mNotificationIcons);
- when(mView.getContext()).thenReturn(getContext());
- when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true);
when(mView.isAttachedToWindow()).thenReturn(true);
when(mResources.getString(anyInt())).thenReturn("h:mm");
mController = new KeyguardClockSwitchController(
@@ -116,10 +98,7 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
mKeyguardSliceViewController,
mNotificationIconAreaController,
mContentResolver,
- mBroadcastDispatcher,
- mPluginManager,
- mFeatureFlags,
- mExecutor);
+ mBroadcastDispatcher);
when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
when(mColorExtractor.getColors(anyInt())).thenReturn(mGradientColors);
@@ -203,45 +182,6 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
verify(mView).setClockPlugin(mClockPlugin, StatusBarState.SHADE);
}
- @Test
- public void testSmartspacePluginConnectedRemovesKeyguardStatusArea() {
- mController.init();
-
- View statusArea = mock(View.class);
- when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(statusArea);
-
- View nic = mock(View.class);
- when(mView.findViewById(R.id.left_aligned_notification_icon_container)).thenReturn(nic);
- when(nic.getLayoutParams()).thenReturn(mock(RelativeLayout.LayoutParams.class));
-
- BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class);
- TestView view = mock(TestView.class);
- when(plugin.getView(any())).thenReturn(view);
-
- mController.mPluginListener.onPluginConnected(plugin, mContext);
- verify(statusArea).setVisibility(View.GONE);
- }
-
- @Test
- public void testSmartspacePluginDisconnectedShowsKeyguardStatusArea() {
- mController.init();
-
- View statusArea = mock(View.class);
- when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(statusArea);
-
- View nic = mock(View.class);
- when(mView.findViewById(R.id.left_aligned_notification_icon_container)).thenReturn(nic);
- when(nic.getLayoutParams()).thenReturn(mock(RelativeLayout.LayoutParams.class));
-
- BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class);
- TestView view = mock(TestView.class);
- when(plugin.getView(any())).thenReturn(view);
-
- mController.mPluginListener.onPluginConnected(plugin, mContext);
- mController.mPluginListener.onPluginDisconnected(plugin);
- verify(statusArea).setVisibility(View.VISIBLE);
- }
-
private void verifyAttachment(VerificationMode times) {
verify(mClockManager, times).addOnClockChangedListener(
any(ClockManager.ClockChangedListener.class));
@@ -251,12 +191,4 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
any(ColorExtractor.OnColorsChangedListener.class));
verify(mView, times).updateColors(mGradientColors);
}
-
- private static class TestView extends View implements BcSmartspaceDataPlugin.SmartspaceView {
- TestView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public void registerDataProvider(BcSmartspaceDataPlugin plugin) { }
- }
}
From 17f6811f593c6a795460359731f6d5653ae91a10 Mon Sep 17 00:00:00 2001
From: Songchun Fan
Date: Mon, 12 Apr 2021 16:39:20 +0000
Subject: [PATCH 036/176] Revert "[SettingsProvider] remove in-lock calls to
PackageManager.getPackageUid()"
This reverts commit 25728b15e487b01963f11d425d38d2e2f8e63b06.
Reason for revert: b/185085629
Change-Id: I2af49e3cb79af5bd80a0f69a2c09be5bbb45aeee
(cherry picked from commit 7a659fca89413816376f748191fb9f5d00b93e6f)
---
.../providers/settings/SettingsProvider.java | 142 +++++++------
.../providers/settings/SettingsState.java | 188 ++++++++++--------
2 files changed, 177 insertions(+), 153 deletions(-)
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 6440d2a53f848..91667c4e88c74 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -16,6 +16,7 @@
package com.android.providers.settings;
+import static android.os.Process.INVALID_UID;
import static android.os.Process.ROOT_UID;
import static android.os.Process.SHELL_UID;
import static android.os.Process.SYSTEM_UID;
@@ -363,11 +364,6 @@ public class SettingsProvider extends ContentProvider {
mHandler = new Handler(mHandlerThread.getLooper());
mSettingsRegistry = new SettingsRegistry();
}
- SettingsState.cacheSystemPackageNamesAndSystemSignature(getContext());
- synchronized (mLock) {
- mSettingsRegistry.migrateAllLegacySettingsIfNeededLocked();
- mSettingsRegistry.syncSsaidTableOnStartLocked();
- }
mHandler.post(() -> {
registerBroadcastReceivers();
startWatchingUserRestrictionChanges();
@@ -2503,6 +2499,8 @@ public class SettingsProvider extends ContentProvider {
mHandler = new MyHandler(getContext().getMainLooper());
mGenerationRegistry = new GenerationRegistry(mLock);
mBackupManager = new BackupManager(getContext());
+ migrateAllLegacySettingsIfNeeded();
+ syncSsaidTableOnStart();
}
private void generateUserKeyLocked(int userId) {
@@ -2589,36 +2587,38 @@ public class SettingsProvider extends ContentProvider {
return getSettingLocked(SETTINGS_TYPE_SSAID, userId, uid);
}
- private void syncSsaidTableOnStartLocked() {
- // Verify that each user's packages and ssaid's are in sync.
- for (UserInfo user : mUserManager.getAliveUsers()) {
- // Get all uids for the user's packages.
- final List packages;
- try {
- packages = mPackageManager.getInstalledPackages(
+ public void syncSsaidTableOnStart() {
+ synchronized (mLock) {
+ // Verify that each user's packages and ssaid's are in sync.
+ for (UserInfo user : mUserManager.getAliveUsers()) {
+ // Get all uids for the user's packages.
+ final List packages;
+ try {
+ packages = mPackageManager.getInstalledPackages(
PackageManager.MATCH_UNINSTALLED_PACKAGES,
user.id).getList();
- } catch (RemoteException e) {
- throw new IllegalStateException("Package manager not available");
- }
- final Set appUids = new HashSet<>();
- for (PackageInfo info : packages) {
- appUids.add(Integer.toString(info.applicationInfo.uid));
- }
+ } catch (RemoteException e) {
+ throw new IllegalStateException("Package manager not available");
+ }
+ final Set appUids = new HashSet<>();
+ for (PackageInfo info : packages) {
+ appUids.add(Integer.toString(info.applicationInfo.uid));
+ }
- // Get all uids currently stored in the user's ssaid table.
- final Set ssaidUids = new HashSet<>(
- getSettingsNamesLocked(SETTINGS_TYPE_SSAID, user.id));
- ssaidUids.remove(SSAID_USER_KEY);
+ // Get all uids currently stored in the user's ssaid table.
+ final Set ssaidUids = new HashSet<>(
+ getSettingsNamesLocked(SETTINGS_TYPE_SSAID, user.id));
+ ssaidUids.remove(SSAID_USER_KEY);
- // Perform a set difference for the appUids and ssaidUids.
- ssaidUids.removeAll(appUids);
+ // Perform a set difference for the appUids and ssaidUids.
+ ssaidUids.removeAll(appUids);
- // If there are ssaidUids left over they need to be removed from the table.
- final SettingsState ssaidSettings = getSettingsLocked(SETTINGS_TYPE_SSAID,
- user.id);
- for (String uid : ssaidUids) {
- ssaidSettings.deleteSettingLocked(uid);
+ // If there are ssaidUids left over they need to be removed from the table.
+ final SettingsState ssaidSettings = getSettingsLocked(SETTINGS_TYPE_SSAID,
+ user.id);
+ for (String uid : ssaidUids) {
+ ssaidSettings.deleteSettingLocked(uid);
+ }
}
}
}
@@ -2911,7 +2911,7 @@ public class SettingsProvider extends ContentProvider {
boolean someSettingChanged = false;
Setting setting = settingsState.getSettingLocked(name);
if (!SettingsState.isSystemPackage(getContext(),
- setting.getPackageName())) {
+ setting.getPackageName(), INVALID_UID, userId)) {
if (prefix != null && !setting.getName().startsWith(prefix)) {
continue;
}
@@ -2931,7 +2931,7 @@ public class SettingsProvider extends ContentProvider {
boolean someSettingChanged = false;
Setting setting = settingsState.getSettingLocked(name);
if (!SettingsState.isSystemPackage(getContext(),
- setting.getPackageName())) {
+ setting.getPackageName(), INVALID_UID, userId)) {
if (prefix != null && !setting.getName().startsWith(prefix)) {
continue;
}
@@ -3009,38 +3009,40 @@ public class SettingsProvider extends ContentProvider {
return mSettingsStates.get(key);
}
- private void migrateAllLegacySettingsIfNeededLocked() {
- final int key = makeKey(SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM);
- File globalFile = getSettingsFile(key);
- if (SettingsState.stateFileExists(globalFile)) {
- return;
- }
-
- mSettingsCreationBuildId = Build.ID;
-
- final long identity = Binder.clearCallingIdentity();
- try {
- List users = mUserManager.getAliveUsers();
-
- final int userCount = users.size();
- for (int i = 0; i < userCount; i++) {
- final int userId = users.get(i).id;
-
- DatabaseHelper dbHelper = new DatabaseHelper(getContext(), userId);
- SQLiteDatabase database = dbHelper.getWritableDatabase();
- migrateLegacySettingsForUserLocked(dbHelper, database, userId);
-
- // Upgrade to the latest version.
- UpgradeController upgrader = new UpgradeController(userId);
- upgrader.upgradeIfNeededLocked();
-
- // Drop from memory if not a running user.
- if (!mUserManager.isUserRunning(new UserHandle(userId))) {
- removeUserStateLocked(userId, false);
- }
+ private void migrateAllLegacySettingsIfNeeded() {
+ synchronized (mLock) {
+ final int key = makeKey(SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM);
+ File globalFile = getSettingsFile(key);
+ if (SettingsState.stateFileExists(globalFile)) {
+ return;
+ }
+
+ mSettingsCreationBuildId = Build.ID;
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ List users = mUserManager.getAliveUsers();
+
+ final int userCount = users.size();
+ for (int i = 0; i < userCount; i++) {
+ final int userId = users.get(i).id;
+
+ DatabaseHelper dbHelper = new DatabaseHelper(getContext(), userId);
+ SQLiteDatabase database = dbHelper.getWritableDatabase();
+ migrateLegacySettingsForUserLocked(dbHelper, database, userId);
+
+ // Upgrade to the latest version.
+ UpgradeController upgrader = new UpgradeController(userId);
+ upgrader.upgradeIfNeededLocked();
+
+ // Drop from memory if not a running user.
+ if (!mUserManager.isUserRunning(new UserHandle(userId))) {
+ removeUserStateLocked(userId, false);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
- } finally {
- Binder.restoreCallingIdentity(identity);
}
}
@@ -5034,9 +5036,19 @@ public class SettingsProvider extends ContentProvider {
// In the upgrade case we pretend the call is made from the app
// that made the last change to the setting to properly determine
// whether the call has been made by a system component.
+ int callingUid = -1;
try {
- final boolean systemSet = SettingsState.isSystemPackage(
- getContext(), setting.getPackageName());
+ callingUid = mPackageManager.getPackageUid(setting.getPackageName(), 0, userId);
+ } catch (RemoteException e) {
+ /* ignore - handled below */
+ }
+ if (callingUid < 0) {
+ Slog.e(LOG_TAG, "Unknown package: " + setting.getPackageName());
+ continue;
+ }
+ try {
+ final boolean systemSet = SettingsState.isSystemPackage(getContext(),
+ setting.getPackageName(), callingUid, userId);
if (systemSet) {
settings.insertSettingOverrideableByRestoreLocked(name, setting.getValue(),
setting.getTag(), true, setting.getPackageName());
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
index 911ff9916d6c6..53d868ac00501 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
@@ -17,13 +17,14 @@
package com.android.providers.settings;
import static android.os.Process.FIRST_APPLICATION_UID;
+import static android.os.Process.INVALID_UID;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.content.pm.Signature;
import android.os.Binder;
import android.os.Build;
import android.os.FileUtils;
@@ -36,10 +37,10 @@ import android.provider.Settings;
import android.providers.settings.SettingsOperationProto;
import android.text.TextUtils;
import android.util.ArrayMap;
-import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.Base64;
import android.util.Slog;
+import android.util.SparseIntArray;
import android.util.TimeUtils;
import android.util.TypedXmlPullParser;
import android.util.TypedXmlSerializer;
@@ -148,7 +149,13 @@ final class SettingsState {
private static final String NULL_VALUE = "null";
- private static final ArraySet sSystemPackages = new ArraySet<>();
+ private static final Object sLock = new Object();
+
+ @GuardedBy("sLock")
+ private static final SparseIntArray sSystemUids = new SparseIntArray();
+
+ @GuardedBy("sLock")
+ private static Signature sSystemSignature;
private final Object mWriteLock = new Object();
@@ -634,7 +641,7 @@ final class SettingsState {
/**
* Dump historical operations as a proto buf.
*
- * @param proto The proto buf stream to dump to
+ * @param proto The proto buf stream to dump to
* @param fieldId The repeated field ID to use to save an operation to.
*/
void dumpHistoricalOperations(@NonNull ProtoOutputStream proto, long fieldId) {
@@ -1041,7 +1048,6 @@ final class SettingsState {
/**
* Uses AtomicFile to check if the file or its backup exists.
- *
* @param file The file to check for existence
* @return whether the original or backup exist
*/
@@ -1301,9 +1307,9 @@ final class SettingsState {
if (NULL_VALUE.equals(value)) {
value = null;
}
+
final boolean callerSystem = !forceNonSystemPackage &&
- !isNull() && (isCalledFromSystem(packageName)
- || isSystemPackage(mContext, packageName));
+ !isNull() && isSystemPackage(mContext, packageName);
// Settings set by the system are always defaults.
if (callerSystem) {
setDefault = true;
@@ -1428,92 +1434,98 @@ final class SettingsState {
return sb.toString();
}
- // Cache the list of names of system packages. This is only called once on system boot.
- public static void cacheSystemPackageNamesAndSystemSignature(@NonNull Context context) {
- final PackageManager packageManager = context.getPackageManager();
- final long identity = Binder.clearCallingIdentity();
- try {
- sSystemPackages.add(SYSTEM_PACKAGE_NAME);
- // Cache SetupWizard package name.
- final String setupWizPackageName = packageManager.getSetupWizardPackageName();
- if (setupWizPackageName != null) {
- sSystemPackages.add(setupWizPackageName);
+ // Check if a specific package belonging to the caller is part of the system package.
+ public static boolean isSystemPackage(Context context, String packageName) {
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ return isSystemPackage(context, packageName, callingUid, callingUserId);
+ }
+
+ // Check if a specific package, uid, and user ID are part of the system package.
+ public static boolean isSystemPackage(Context context, String packageName, int uid,
+ int userId) {
+ synchronized (sLock) {
+ if (SYSTEM_PACKAGE_NAME.equals(packageName)) {
+ return true;
}
- final List packageInfos = packageManager.getInstalledPackages(0);
- final int installedPackagesCount = packageInfos.size();
- for (int i = 0; i < installedPackagesCount; i++) {
- if (shouldAddToSystemPackages(packageInfos.get(i))) {
- sSystemPackages.add(packageInfos.get(i).packageName);
+
+ // Shell and Root are not considered a part of the system
+ if (SHELL_PACKAGE_NAME.equals(packageName)
+ || ROOT_PACKAGE_NAME.equals(packageName)) {
+ return false;
+ }
+
+ if (uid != INVALID_UID) {
+ // Native services running as a special UID get a pass
+ final int callingAppId = UserHandle.getAppId(uid);
+ if (callingAppId < FIRST_APPLICATION_UID) {
+ sSystemUids.put(callingAppId, callingAppId);
+ return true;
}
}
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
- private static boolean shouldAddToSystemPackages(@NonNull PackageInfo packageInfo) {
- // Shell and Root are not considered a part of the system
- if (isShellOrRoot(packageInfo.packageName)) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ try {
+ uid = context.getPackageManager().getPackageUidAsUser(packageName, 0, userId);
+ } catch (PackageManager.NameNotFoundException e) {
+ return false;
+ }
+
+ // If the system or a special system UID (like telephony), done.
+ if (UserHandle.getAppId(uid) < FIRST_APPLICATION_UID) {
+ sSystemUids.put(uid, uid);
+ return true;
+ }
+
+ // If already known system component, done.
+ if (sSystemUids.indexOfKey(uid) >= 0) {
+ return true;
+ }
+
+ // If SetupWizard, done.
+ String setupWizPackage = context.getPackageManager().getSetupWizardPackageName();
+ if (packageName.equals(setupWizPackage)) {
+ sSystemUids.put(uid, uid);
+ return true;
+ }
+
+ // If a persistent system app, done.
+ PackageInfo packageInfo;
+ try {
+ packageInfo = context.getPackageManager().getPackageInfoAsUser(
+ packageName, PackageManager.GET_SIGNATURES, userId);
+ if ((packageInfo.applicationInfo.flags
+ & ApplicationInfo.FLAG_PERSISTENT) != 0
+ && (packageInfo.applicationInfo.flags
+ & ApplicationInfo.FLAG_SYSTEM) != 0) {
+ sSystemUids.put(uid, uid);
+ return true;
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ return false;
+ }
+
+ // Last check if system signed.
+ if (sSystemSignature == null) {
+ try {
+ sSystemSignature = context.getPackageManager().getPackageInfoAsUser(
+ SYSTEM_PACKAGE_NAME, PackageManager.GET_SIGNATURES,
+ UserHandle.USER_SYSTEM).signatures[0];
+ } catch (PackageManager.NameNotFoundException e) {
+ /* impossible */
+ return false;
+ }
+ }
+ if (sSystemSignature.equals(packageInfo.signatures[0])) {
+ sSystemUids.put(uid, uid);
+ return true;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+
return false;
}
- // Already added
- if (sSystemPackages.contains(packageInfo.packageName)) {
- return false;
- }
- return isSystemPackage(packageInfo.applicationInfo);
- }
-
- private static boolean isShellOrRoot(@NonNull String packageName) {
- return (SHELL_PACKAGE_NAME.equals(packageName)
- || ROOT_PACKAGE_NAME.equals(packageName));
- }
-
- private static boolean isCalledFromSystem(@NonNull String packageName) {
- // Shell and Root are not considered a part of the system
- if (isShellOrRoot(packageName)) {
- return false;
- }
- final int callingUid = Binder.getCallingUid();
- // Native services running as a special UID get a pass
- final int callingAppId = UserHandle.getAppId(callingUid);
- return (callingAppId < FIRST_APPLICATION_UID);
- }
-
- public static boolean isSystemPackage(@NonNull Context context, @NonNull String packageName) {
- // Check shell or root before trying to retrieve ApplicationInfo to fail fast
- if (isShellOrRoot(packageName)) {
- return false;
- }
- // If it's a known system package or known to be platform signed
- if (sSystemPackages.contains(packageName)) {
- return true;
- }
- ApplicationInfo aInfo = null;
- try {
- // Notice that this makes a call to package manager inside the lock
- aInfo = context.getPackageManager().getApplicationInfo(packageName, 0);
- } catch (PackageManager.NameNotFoundException ignored) {
- }
- return isSystemPackage(aInfo);
- }
-
- private static boolean isSystemPackage(@Nullable ApplicationInfo aInfo) {
- if (aInfo == null) {
- return false;
- }
- // If the system or a special system UID (like telephony), done.
- if (aInfo.uid < FIRST_APPLICATION_UID) {
- return true;
- }
- // If a persistent system app, done.
- if ((aInfo.flags & ApplicationInfo.FLAG_PERSISTENT) != 0
- && (aInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
- return true;
- }
- // Platform signed packages are considered to be from the system
- if (aInfo.isSignedWithPlatformKey()) {
- return true;
- }
- return false;
}
}
From 98b3c58991df6bb6cdb224f84e1b86a356be8dbd Mon Sep 17 00:00:00 2001
From: Dmitri Plotnikov
Date: Tue, 13 Apr 2021 22:08:45 -0700
Subject: [PATCH 037/176] Fix NullPointerException in BatteryUsageStats
Bug: 185287730
Test: Build and launch Settings on a crosshatch
Change-Id: Iccdd8a0f3839b98dbb5c09599f35ac15985daa4c
(cherry picked from commit 153f2acfee7c9a51a231cae6120b01be15bc20dc)
---
core/java/android/os/BatteryUsageStats.java | 8 +++-----
core/java/com/android/internal/os/BatteryStatsImpl.java | 4 ++--
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java
index 48f4ca4035ce2..8ea59ce370183 100644
--- a/core/java/android/os/BatteryUsageStats.java
+++ b/core/java/android/os/BatteryUsageStats.java
@@ -24,7 +24,6 @@ import com.android.internal.os.BatteryStatsHistory;
import com.android.internal.os.BatteryStatsHistoryIterator;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
/**
@@ -233,8 +232,6 @@ public final class BatteryUsageStats implements Parcelable {
mHistoryBuffer = null;
mHistoryTagPool = null;
}
- System.out.println("From Parcel = " + Arrays.toString(
- mCustomPowerComponentNames));
}
@Override
@@ -293,6 +290,7 @@ public final class BatteryUsageStats implements Parcelable {
* Builder for BatteryUsageStats.
*/
public static final class Builder {
+ @NonNull
private final String[] mCustomPowerComponentNames;
private final int mCustomTimeComponentCount;
private final boolean mIncludePowerModels;
@@ -311,11 +309,11 @@ public final class BatteryUsageStats implements Parcelable {
private Parcel mHistoryBuffer;
private List mHistoryTagPool;
- public Builder(String[] customPowerComponentNames, int customTimeComponentCount) {
+ public Builder(@NonNull String[] customPowerComponentNames, int customTimeComponentCount) {
this(customPowerComponentNames, customTimeComponentCount, false);
}
- public Builder(String[] customPowerComponentNames, int customTimeComponentCount,
+ public Builder(@NonNull String[] customPowerComponentNames, int customTimeComponentCount,
boolean includePowerModels) {
mCustomPowerComponentNames = customPowerComponentNames;
mCustomTimeComponentCount = customTimeComponentCount;
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index e83f365738da0..cb1900f300c02 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -6951,9 +6951,9 @@ public class BatteryStatsImpl extends BatteryStats {
/**
* Returns the names of custom power components.
*/
- public @Nullable String[] getCustomPowerComponentNames() {
+ public @NonNull String[] getCustomPowerComponentNames() {
if (mGlobalMeasuredEnergyStats == null) {
- return null;
+ return new String[0];
}
final String[] names = mGlobalMeasuredEnergyStats.getCustomBucketNames();
for (int i = 0; i < names.length; i++) {
From 6f06021e0142116e46415a549f0dc3d381e99e3f Mon Sep 17 00:00:00 2001
From: Jeff Sharkey
Date: Mon, 29 Mar 2021 18:52:29 -0600
Subject: [PATCH 038/176] Temporary stop-gap for Chrome target SDK issue.
The Chrome team was planning to provide a new prebuilt SDK last week
which returned to targeting the official R SDK level, but other
challenges prevented them from doing so.
They still intend to land an updated prebuilt which targets R, but
to unblock testing this change makes that change on their behalf;
when we see a very specific Chrome version code we force the target
SDK back to R. This code will safely become a no-op during their
next prebuilt, which should have a different version code.
Bug: 183905675
Test: manual
Change-Id: I42d00d33f49ee708148233d608164459a9ca5929
(cherry picked from commit 8f5096b6d64b242f3e17d74e1292e7a5849afc70)
---
.../android/content/pm/parsing/ParsingPackageUtils.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index f3c71ce216cd9..18e323c213275 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -2800,6 +2800,12 @@ public class ParsingPackageUtils {
}
private void convertSplitPermissions(ParsingPackage pkg) {
+ // STOPSHIP(b/183905675): REMOVE THIS TERRIBLE, HORRIBLE, NO GOOD, VERY BAD HACK
+ if ("com.android.chrome".equals(pkg.getPackageName())
+ && (445500383 == pkg.getVersionCode() || 438500084 == pkg.getVersionCode())) {
+ pkg.setTargetSdkVersion(Build.VERSION_CODES.R);
+ }
+
final int listSize = mSplitPermissionInfos.size();
for (int is = 0; is < listSize; is++) {
final PermissionManager.SplitPermissionInfo spi = mSplitPermissionInfos.get(is);
From 40941e03636561e543cd3815270b61be7cb477c7 Mon Sep 17 00:00:00 2001
From: Edgar Wang
Date: Wed, 14 Apr 2021 16:10:10 +0800
Subject: [PATCH 039/176] Rename SettingsPreferenceTheme to
PreferenceTheme.SettingsBase
Bug: 185206291
Test: rebuild
Change-Id: I89862583caec3db43716b55c8bc43c3f6580c919
(cherry picked from commit e0c507d5a8a7baa45160471b53dc96a240d24017)
---
.../SettingsTheme/res/values/styles_preference.xml | 4 ++--
packages/SettingsLib/SettingsTheme/res/values/themes.xml | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/SettingsLib/SettingsTheme/res/values/styles_preference.xml b/packages/SettingsLib/SettingsTheme/res/values/styles_preference.xml
index dcbdc07d1335b..cec8b3294418b 100644
--- a/packages/SettingsLib/SettingsTheme/res/values/styles_preference.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values/styles_preference.xml
@@ -15,7 +15,7 @@
limitations under the License.
-->
-
+
-
From 5dfec1a0611de93931ad4c99287efd9fc108a205 Mon Sep 17 00:00:00 2001
From: Jeff Sharkey
Date: Mon, 29 Mar 2021 18:52:29 -0600
Subject: [PATCH 040/176] Temporary stop-gap for Chrome target SDK issue.
The Chrome team was planning to provide a new prebuilt SDK last week
which returned to targeting the official R SDK level, but other
challenges prevented them from doing so.
They still intend to land an updated prebuilt which targets R, but
to unblock testing this change makes that change on their behalf;
when we see a very specific Chrome version code we force the target
SDK back to R. This code will safely become a no-op during their
next prebuilt, which should have a different version code.
Bug: 183905675
Test: manual
Change-Id: I42d00d33f49ee708148233d608164459a9ca5929
(cherry picked from commit 8f5096b6d64b242f3e17d74e1292e7a5849afc70)
---
.../android/content/pm/parsing/ParsingPackageUtils.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index f3c71ce216cd9..18e323c213275 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -2800,6 +2800,12 @@ public class ParsingPackageUtils {
}
private void convertSplitPermissions(ParsingPackage pkg) {
+ // STOPSHIP(b/183905675): REMOVE THIS TERRIBLE, HORRIBLE, NO GOOD, VERY BAD HACK
+ if ("com.android.chrome".equals(pkg.getPackageName())
+ && (445500383 == pkg.getVersionCode() || 438500084 == pkg.getVersionCode())) {
+ pkg.setTargetSdkVersion(Build.VERSION_CODES.R);
+ }
+
final int listSize = mSplitPermissionInfos.size();
for (int is = 0; is < listSize; is++) {
final PermissionManager.SplitPermissionInfo spi = mSplitPermissionInfos.get(is);
From 6d87fdf788ab627d02c082ffd62d20059161dc47 Mon Sep 17 00:00:00 2001
From: Edgar Wang
Date: Wed, 14 Apr 2021 16:10:10 +0800
Subject: [PATCH 041/176] Rename SettingsPreferenceTheme to
PreferenceTheme.SettingsBase
Bug: 185206291
Test: rebuild
Change-Id: I89862583caec3db43716b55c8bc43c3f6580c919
(cherry picked from commit e0c507d5a8a7baa45160471b53dc96a240d24017)
---
.../SettingsTheme/res/values/styles_preference.xml | 4 ++--
packages/SettingsLib/SettingsTheme/res/values/themes.xml | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/SettingsLib/SettingsTheme/res/values/styles_preference.xml b/packages/SettingsLib/SettingsTheme/res/values/styles_preference.xml
index dcbdc07d1335b..cec8b3294418b 100644
--- a/packages/SettingsLib/SettingsTheme/res/values/styles_preference.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values/styles_preference.xml
@@ -15,7 +15,7 @@
limitations under the License.
-->
-
+
-
From 1260b5cabb34a81e87ab72b5d05c2abfcf742624 Mon Sep 17 00:00:00 2001
From: Daniel Chapin
Date: Mon, 19 Apr 2021 18:39:17 +0000
Subject: [PATCH 042/176] Revert "Add icon for "Extra dim" used in
accessibility shortcut"
This reverts commit e9f44933ac3558b39eb2e7f88bee579ba8c03a7a.
Reason for revert: Bug: 185737105
Change-Id: I7978fb859451a47182bf7a2147a50254731bfc2d
(cherry picked from commit 56a7a55e651dbae3b370888063b325478e0f42b4)
---
.../dialog/AccessibilityTargetHelper.java | 3 +-
.../ic_accessibility_reduce_bright_colors.xml | 63 -------------------
core/res/res/values/colors.xml | 3 +-
core/res/res/values/dimens.xml | 6 --
core/res/res/values/symbols.xml | 1 -
5 files changed, 3 insertions(+), 73 deletions(-)
delete mode 100644 core/res/res/drawable/ic_accessibility_reduce_bright_colors.xml
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
index 0854955a92d5b..9d06bb92b2056 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
@@ -230,6 +230,7 @@ public final class AccessibilityTargetHelper {
context.getDrawable(R.drawable.ic_accessibility_color_inversion),
Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED);
+ // TODO: Update with shortcut icon
final ToggleAllowListingFeatureTarget reduceBrightColors =
new ToggleAllowListingFeatureTarget(context,
shortcutType,
@@ -237,7 +238,7 @@ public final class AccessibilityTargetHelper {
REDUCE_BRIGHT_COLORS_COMPONENT_NAME.flattenToString()),
REDUCE_BRIGHT_COLORS_COMPONENT_NAME.flattenToString(),
context.getString(R.string.reduce_bright_colors_feature_name),
- context.getDrawable(R.drawable.ic_accessibility_reduce_bright_colors),
+ null,
Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED);
targets.add(magnification);
diff --git a/core/res/res/drawable/ic_accessibility_reduce_bright_colors.xml b/core/res/res/drawable/ic_accessibility_reduce_bright_colors.xml
deleted file mode 100644
index 1e840d26ca133..0000000000000
--- a/core/res/res/drawable/ic_accessibility_reduce_bright_colors.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index 3ad20c6031157..0213c60e9f60c 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -231,8 +231,7 @@
@color/loading_gradient_background_color_light
@color/loading_gradient_highlight_color_light
- #5F6368
- #3C4043
+ #ff3C4043
#ffC4C6C6
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 062b0809c2478..0e436e36b4742 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -570,12 +570,6 @@
4dp
-
- 32dp
-
-
- 18dp
-
8dp
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 512f2764a74f8..7bf047cbdab34 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -3389,7 +3389,6 @@
-
From 70154c60f62b486ada63f4b3da437de838758157 Mon Sep 17 00:00:00 2001
From: Evan Severson
Date: Tue, 20 Apr 2021 09:04:31 -0700
Subject: [PATCH 043/176] Fix typo in sensor privacy init
Should be getting the value at index i, not using int i as a key. Also
when iterating over the state we should be holding the lock.
Test: Push sensor_privacy.xml file and reboot
Fixes: 185881144
Change-Id: I09823d888b05b674b32254d39ab030ce0e6c2acf
(cherry picked from commit 30a3a67dad3ae348c47f33976d36bdd28e322efe)
---
.../android/server/SensorPrivacyService.java | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java
index 3ba4c34fb1a7b..e8bc812e5ea88 100644
--- a/services/core/java/com/android/server/SensorPrivacyService.java
+++ b/services/core/java/com/android/server/SensorPrivacyService.java
@@ -197,16 +197,16 @@ public final class SensorPrivacyService extends SystemService {
if (readPersistedSensorPrivacyStateLocked()) {
persistSensorPrivacyStateLocked();
}
- }
- for (int i = 0; i < mIndividualEnabled.size(); i++) {
- int userId = mIndividualEnabled.keyAt(i);
- SparseBooleanArray userIndividualEnabled =
- mIndividualEnabled.get(i);
- for (int j = 0; j < userIndividualEnabled.size(); j++) {
- int sensor = userIndividualEnabled.keyAt(i);
- boolean enabled = userIndividualEnabled.valueAt(j);
- setUserRestriction(userId, sensor, enabled);
+ for (int i = 0; i < mIndividualEnabled.size(); i++) {
+ int userId = mIndividualEnabled.keyAt(i);
+ SparseBooleanArray userIndividualEnabled =
+ mIndividualEnabled.valueAt(i);
+ for (int j = 0; j < userIndividualEnabled.size(); j++) {
+ int sensor = userIndividualEnabled.keyAt(i);
+ boolean enabled = userIndividualEnabled.valueAt(j);
+ setUserRestriction(userId, sensor, enabled);
+ }
}
}
From e8d4391b5d52cf9233bd8f41b9cb40f12b13c3c5 Mon Sep 17 00:00:00 2001
From: Daniel Chapin
Date: Wed, 28 Apr 2021 22:32:20 +0000
Subject: [PATCH 044/176] Revert "Support FLAG_ACTIVITY_LAUNCH_ADJACENT for
launch root with adjacent"
This reverts commit d8abe76ba18e9baf6dcef68a65a03b6651c7e5ef.
Reason for revert: Bug: 186614428
Change-Id: Id7d1f57a11f0698f9377b00008994f9a6c3038d3
(cherry picked from commit 48f90b317b9845ee241b0175cd73a7f55d5b1dd9)
---
.../window/WindowContainerTransaction.java | 39 ---------
.../shell/splitscreen/StageCoordinator.java | 3 -
.../android/server/wm/ActivityStarter.java | 4 +-
.../server/wm/RootWindowContainer.java | 24 +++--
.../core/java/com/android/server/wm/Task.java | 28 +-----
.../android/server/wm/TaskDisplayArea.java | 87 ++++---------------
.../server/wm/TaskLaunchParamsModifier.java | 3 +-
.../server/wm/WindowOrganizerController.java | 21 -----
.../server/wm/ActivityStarterTests.java | 8 +-
.../server/wm/RootWindowContainerTests.java | 3 +-
.../server/wm/TaskDisplayAreaTests.java | 60 ++-----------
11 files changed, 40 insertions(+), 240 deletions(-)
diff --git a/core/java/android/window/WindowContainerTransaction.java b/core/java/android/window/WindowContainerTransaction.java
index c0af57214e5e5..f93e413961529 100644
--- a/core/java/android/window/WindowContainerTransaction.java
+++ b/core/java/android/window/WindowContainerTransaction.java
@@ -338,33 +338,6 @@ public final class WindowContainerTransaction implements Parcelable {
return this;
}
- /**
- * Sets the container as launch adjacent flag root. Task starting with
- * {@link FLAG_ACTIVITY_LAUNCH_ADJACENT} will be launching to.
- *
- * @hide
- */
- @NonNull
- public WindowContainerTransaction setLaunchAdjacentFlagRoot(
- @NonNull WindowContainerToken container) {
- mHierarchyOps.add(HierarchyOp.createForSetLaunchAdjacentFlagRoot(container.asBinder(),
- false /* clearRoot */));
- return this;
- }
-
- /**
- * Clears launch adjacent flag root for the display area of passing container.
- *
- * @hide
- */
- @NonNull
- public WindowContainerTransaction clearLaunchAdjacentFlagRoot(
- @NonNull WindowContainerToken container) {
- mHierarchyOps.add(HierarchyOp.createForSetLaunchAdjacentFlagRoot(container.asBinder(),
- true /* clearRoot */));
- return this;
- }
-
/**
* Starts a task by id. The task is expected to already exist (eg. as a recent task).
* @param taskId Id of task to start.
@@ -704,7 +677,6 @@ public final class WindowContainerTransaction implements Parcelable {
public static final int HIERARCHY_OP_TYPE_SET_LAUNCH_ROOT = 3;
public static final int HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS = 4;
public static final int HIERARCHY_OP_TYPE_LAUNCH_TASK = 5;
- public static final int HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT = 6;
// The following key(s) are for use with mLaunchOptions:
// When launching a task (eg. from recents), this is the taskId to be launched.
@@ -762,14 +734,6 @@ public final class WindowContainerTransaction implements Parcelable {
fullOptions);
}
- /** Create a hierarchy op for setting launch adjacent flag root. */
- public static HierarchyOp createForSetLaunchAdjacentFlagRoot(IBinder container,
- boolean clearRoot) {
- return new HierarchyOp(HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT, container, null,
- null, null, clearRoot, null);
- }
-
-
private HierarchyOp(int type, @Nullable IBinder container, @Nullable IBinder reparent,
int[] windowingModes, int[] activityTypes, boolean toTop,
@Nullable Bundle launchOptions) {
@@ -865,9 +829,6 @@ public final class WindowContainerTransaction implements Parcelable {
+ " adjacentRoot=" + mReparent + "}";
case HIERARCHY_OP_TYPE_LAUNCH_TASK:
return "{LaunchTask: " + mLaunchOptions + "}";
- case HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT:
- return "{SetAdjacentFlagRoot: container=" + mContainer + " clearRoot=" + mToTop
- + "}";
default:
return "{mType=" + mType + " container=" + mContainer + " reparent=" + mReparent
+ " mToTop=" + mToTop + " mWindowingMode=" + mWindowingModes
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
index efaa2696cbebd..c91a92ad32427 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
@@ -337,7 +337,6 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener,
final WindowContainerTransaction wct = new WindowContainerTransaction();
// Make the stages adjacent to each other so they occlude what's behind them.
wct.setAdjacentRoots(mMainStage.mRootTaskInfo.token, mSideStage.mRootTaskInfo.token);
- wct.setLaunchAdjacentFlagRoot(mSideStage.mRootTaskInfo.token);
mTaskOrganizer.applyTransaction(wct);
}
}
@@ -347,7 +346,6 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener,
final WindowContainerTransaction wct = new WindowContainerTransaction();
// Deactivate the main stage if it no longer has a root task.
mMainStage.deactivate(wct);
- wct.clearLaunchAdjacentFlagRoot(mSideStage.mRootTaskInfo.token);
mTaskOrganizer.applyTransaction(wct);
}
}
@@ -451,7 +449,6 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener,
final WindowContainerTransaction wct = new WindowContainerTransaction();
// Make sure the main stage is active.
mMainStage.activate(getMainStageBounds(), wct);
- mSideStage.setBounds(getSideStageBounds(), wct);
mTaskOrganizer.applyTransaction(wct);
}
}
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 08a9f0928b8b3..9be973be87fc3 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -2761,8 +2761,8 @@ class ActivityStarter {
final boolean onTop =
(aOptions == null || !aOptions.getAvoidMoveToFront()) && !mLaunchTaskBehind;
- return mRootWindowContainer.getLaunchRootTask(r, aOptions, task, mSourceRootTask, onTop,
- mLaunchParams, launchFlags, mRequest.realCallingPid, mRequest.realCallingUid);
+ return mRootWindowContainer.getLaunchRootTask(r, aOptions, task, onTop, mLaunchParams,
+ mRequest.realCallingPid, mRequest.realCallingUid);
}
private boolean isLaunchModeOneOf(int mode1, int mode2) {
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index d9c5fa43d9e40..c81f31eb9f77d 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -2810,11 +2810,10 @@ class RootWindowContainer extends WindowContainer
return false;
}
- Task getLaunchRootTask(@Nullable ActivityRecord r, @Nullable ActivityOptions options,
- @Nullable Task candidateTask, boolean onTop) {
- return getLaunchRootTask(r, options, candidateTask, null /* sourceTask */, onTop,
- null /* launchParams */, 0 /* launchFlags */, -1 /* no realCallingPid */,
- -1 /* no realCallingUid */);
+ Task getLaunchRootTask(@Nullable ActivityRecord r,
+ @Nullable ActivityOptions options, @Nullable Task candidateTask, boolean onTop) {
+ return getLaunchRootTask(r, options, candidateTask, onTop, null /* launchParams */,
+ -1 /* no realCallingPid */, -1 /* no realCallingUid */);
}
/**
@@ -2823,18 +2822,15 @@ class RootWindowContainer extends WindowContainer
* @param r The activity we are trying to launch. Can be null.
* @param options The activity options used to the launch. Can be null.
* @param candidateTask The possible task the activity might be launched in. Can be null.
- * @param sourceTask The task requesting to start activity. Can be null.
* @param launchParams The resolved launch params to use.
- * @param launchFlags The launch flags for this launch.
* @param realCallingPid The pid from {@link ActivityStarter#setRealCallingPid}
* @param realCallingUid The uid from {@link ActivityStarter#setRealCallingUid}
* @return The root task to use for the launch or INVALID_TASK_ID.
*/
Task getLaunchRootTask(@Nullable ActivityRecord r,
- @Nullable ActivityOptions options, @Nullable Task candidateTask,
- @Nullable Task sourceTask, boolean onTop,
- @Nullable LaunchParamsController.LaunchParams launchParams, int launchFlags,
- int realCallingPid, int realCallingUid) {
+ @Nullable ActivityOptions options, @Nullable Task candidateTask, boolean onTop,
+ @Nullable LaunchParamsController.LaunchParams launchParams, int realCallingPid,
+ int realCallingUid) {
int taskId = INVALID_TASK_ID;
int displayId = INVALID_DISPLAY;
TaskDisplayArea taskDisplayArea = null;
@@ -2898,7 +2894,7 @@ class RootWindowContainer extends WindowContainer
// Falling back to default task container
taskDisplayArea = taskDisplayArea.mDisplayContent.getDefaultTaskDisplayArea();
rootTask = taskDisplayArea.getOrCreateRootTask(r, options, candidateTask,
- sourceTask, launchParams, launchFlags, activityType, onTop);
+ launchParams, activityType, onTop);
if (rootTask != null) {
return rootTask;
}
@@ -2953,8 +2949,8 @@ class RootWindowContainer extends WindowContainer
}
}
- return container.getOrCreateRootTask(r, options, candidateTask, sourceTask, launchParams,
- launchFlags, activityType, onTop);
+ return container.getOrCreateRootTask(
+ r, options, candidateTask, launchParams, activityType, onTop);
}
/** @return true if activity record is null or can be launched on provided display. */
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 2a0041afd9d0d..d4707d6f5f5ae 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -7952,17 +7952,6 @@ class Task extends WindowContainer {
private boolean mHasBeenVisible;
private boolean mRemoveWithTaskOrganizer;
- /**
- * Records the source task that requesting to build a new task, used to determine which of
- * the adjacent roots should be launch root of the new task.
- */
- private Task mSourceTask;
-
- /**
- * Records launch flags to apply when launching new task.
- */
- private int mLaunchFlags;
-
Builder(ActivityTaskManagerService atm) {
mAtmService = atm;
}
@@ -7972,16 +7961,6 @@ class Task extends WindowContainer {
return this;
}
- Builder setSourceTask(Task sourceTask) {
- mSourceTask = sourceTask;
- return this;
- }
-
- Builder setLaunchFlags(int launchFlags) {
- mLaunchFlags = launchFlags;
- return this;
- }
-
Builder setTaskId(int taskId) {
mTaskId = taskId;
return this;
@@ -8236,14 +8215,9 @@ class Task extends WindowContainer {
tda.getRootPinnedTask().dismissPip();
}
- if (mIntent != null) {
- mLaunchFlags |= mIntent.getFlags();
- }
-
// Task created by organizer are added as root.
final Task launchRootTask = mCreatedByOrganizer
- ? null : tda.getLaunchRootTask(mWindowingMode, mActivityType, mActivityOptions,
- mSourceTask, mLaunchFlags);
+ ? null : tda.getLaunchRootTask(mWindowingMode, mActivityType, mActivityOptions);
if (launchRootTask != null) {
// Since this task will be put into a root task, its windowingMode will be
// inherited.
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index cda8c4b78b0cd..4d85e7bda9000 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -27,7 +27,6 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
-import static android.content.Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@@ -44,6 +43,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import android.annotation.Nullable;
import android.app.ActivityOptions;
import android.app.WindowConfiguration;
+import android.content.Intent;
import android.os.UserHandle;
import android.util.IntArray;
import android.util.Slog;
@@ -132,11 +132,6 @@ final class TaskDisplayArea extends DisplayArea {
}
private final ArrayList mLaunchRootTasks = new ArrayList<>();
- /**
- * A launch root task for activity launching with {@link FLAG_ACTIVITY_LAUNCH_ADJACENT} flag.
- */
- private Task mLaunchAdjacentFlagRootTask;
-
/**
* A focusable root task that is purposely to be positioned at the top. Although the root
* task may not have the topmost index, it is used as a preferred candidate to prevent being
@@ -1018,9 +1013,6 @@ final class TaskDisplayArea extends DisplayArea {
if (mPreferredTopFocusableRootTask == rootTask) {
mPreferredTopFocusableRootTask = null;
}
- if (mLaunchAdjacentFlagRootTask == rootTask) {
- mLaunchAdjacentFlagRootTask = null;
- }
mDisplayContent.releaseSelfIfNeeded();
onRootTaskOrderChanged(rootTask);
}
@@ -1055,11 +1047,11 @@ final class TaskDisplayArea extends DisplayArea {
* Returns an existing root task compatible with the windowing mode and activity type or
* creates one if a compatible root task doesn't exist.
*
- * @see #getOrCreateRootTask(int, int, boolean, Task, Task, ActivityOptions, int)
+ * @see #getOrCreateRootTask(int, int, boolean, Intent, Task, ActivityOptions)
*/
Task getOrCreateRootTask(int windowingMode, int activityType, boolean onTop) {
- return getOrCreateRootTask(windowingMode, activityType, onTop, null /* candidateTask */,
- null /* sourceTask */, null /* options */, 0 /* intent */);
+ return getOrCreateRootTask(windowingMode, activityType, onTop, null /* intent */,
+ null /* candidateTask */, null /* options */);
}
/**
@@ -1068,21 +1060,11 @@ final class TaskDisplayArea extends DisplayArea {
* For one level task, the candidate task would be reused to also be the root task or create
* a new root task if no candidate task.
*
- * @param windowingMode The windowing mode the root task should be created in.
- * @param activityType The activityType the root task should be created in.
- * @param onTop If true the root task will be created at the top of the display,
- * else at the bottom.
- * @param candidateTask The possible task the activity might be launched in. Can be null.
- * @param sourceTask The task requesting to start activity. Used to determine which of the
- * adjacent roots should be launch root of the new task. Can be null.
- * @param options The activity options used to the launch. Can be null.
- * @param launchFlags The launch flags for this launch.
- * @return The root task to use for the launch.
* @see #getRootTask(int, int)
+ * @see #createRootTask(int, int, boolean)
*/
Task getOrCreateRootTask(int windowingMode, int activityType, boolean onTop,
- @Nullable Task candidateTask, @Nullable Task sourceTask,
- @Nullable ActivityOptions options, int launchFlags) {
+ Intent intent, Task candidateTask, ActivityOptions options) {
// Need to pass in a determined windowing mode to see if a new root task should be created,
// so use its parent's windowing mode if it is undefined.
if (!alwaysCreateRootTask(
@@ -1095,8 +1077,7 @@ final class TaskDisplayArea extends DisplayArea {
} else if (candidateTask != null) {
final Task rootTask = candidateTask;
final int position = onTop ? POSITION_TOP : POSITION_BOTTOM;
- final Task launchRootTask = getLaunchRootTask(windowingMode, activityType, options,
- sourceTask, launchFlags);
+ final Task launchRootTask = getLaunchRootTask(windowingMode, activityType, options);
if (launchRootTask != null) {
if (rootTask.getParent() == null) {
@@ -1122,9 +1103,8 @@ final class TaskDisplayArea extends DisplayArea {
.setActivityType(activityType)
.setOnTop(onTop)
.setParent(this)
- .setSourceTask(sourceTask)
+ .setIntent(intent)
.setActivityOptions(options)
- .setLaunchFlags(launchFlags)
.build();
}
@@ -1134,9 +1114,9 @@ final class TaskDisplayArea extends DisplayArea {
*
* @see #getOrCreateRootTask(int, int, boolean)
*/
- Task getOrCreateRootTask(@Nullable ActivityRecord r, @Nullable ActivityOptions options,
- @Nullable Task candidateTask, @Nullable Task sourceTask,
- @Nullable LaunchParams launchParams, int launchFlags, int activityType, boolean onTop) {
+ Task getOrCreateRootTask(@Nullable ActivityRecord r,
+ @Nullable ActivityOptions options, @Nullable Task candidateTask,
+ @Nullable LaunchParams launchParams, int activityType, boolean onTop) {
int windowingMode = WINDOWING_MODE_UNDEFINED;
if (launchParams != null) {
// If launchParams isn't null, windowing mode is already resolved.
@@ -1150,8 +1130,8 @@ final class TaskDisplayArea extends DisplayArea {
// UNDEFINED windowing mode is a valid result and means that the new root task will inherit
// it's display's windowing mode.
windowingMode = validateWindowingMode(windowingMode, r, candidateTask, activityType);
- return getOrCreateRootTask(windowingMode, activityType, onTop, candidateTask, sourceTask,
- options, launchFlags);
+ return getOrCreateRootTask(windowingMode, activityType, onTop, null /* intent */,
+ candidateTask, options);
}
@VisibleForTesting
@@ -1219,24 +1199,6 @@ final class TaskDisplayArea extends DisplayArea {
}
}
- void setLaunchAdjacentFlagRootTask(@Nullable Task adjacentFlagRootTask) {
- if (adjacentFlagRootTask != null) {
- if (!adjacentFlagRootTask.mCreatedByOrganizer) {
- throw new IllegalArgumentException(
- "Can't set not mCreatedByOrganizer as launch adjacent flag root tr="
- + adjacentFlagRootTask);
- }
-
- if (adjacentFlagRootTask.mAdjacentTask == null) {
- throw new UnsupportedOperationException(
- "Can't set non-adjacent root as launch adjacent flag root tr="
- + adjacentFlagRootTask);
- }
- }
-
- mLaunchAdjacentFlagRootTask = adjacentFlagRootTask;
- }
-
private @Nullable LaunchRootTaskDef getLaunchRootTaskDef(Task rootTask) {
LaunchRootTaskDef def = null;
for (int i = mLaunchRootTasks.size() - 1; i >= 0; --i) {
@@ -1247,9 +1209,7 @@ final class TaskDisplayArea extends DisplayArea {
return def;
}
- @Nullable
- Task getLaunchRootTask(int windowingMode, int activityType, @Nullable ActivityOptions options,
- @Nullable Task sourceTask, int launchFlags) {
+ Task getLaunchRootTask(int windowingMode, int activityType, ActivityOptions options) {
// Try to use the launch root task in options if available.
if (options != null) {
final Task launchRootTask = Task.fromWindowContainerToken(options.getLaunchRootTask());
@@ -1259,19 +1219,6 @@ final class TaskDisplayArea extends DisplayArea {
}
}
- // Use launch-adjacent-flag-root if launching with launch-adjacent flag.
- if ((launchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0
- && mLaunchAdjacentFlagRootTask != null) {
- // If the adjacent launch is coming from the same root, launch to adjacent root instead.
- if (sourceTask != null
- && sourceTask.getRootTask().mTaskId == mLaunchAdjacentFlagRootTask.mTaskId
- && mLaunchAdjacentFlagRootTask.mAdjacentTask != null) {
- return mLaunchAdjacentFlagRootTask.mAdjacentTask;
- } else {
- return mLaunchAdjacentFlagRootTask;
- }
- }
-
for (int i = mLaunchRootTasks.size() - 1; i >= 0; --i) {
if (mLaunchRootTasks.get(i).contains(windowingMode, activityType)) {
return mLaunchRootTasks.get(i).task;
@@ -2016,11 +1963,7 @@ final class TaskDisplayArea extends DisplayArea {
// Reparent task to corresponding launch root or display area.
final WindowContainer launchRoot = task.supportsSplitScreenWindowingMode()
? toDisplayArea.getLaunchRootTask(
- task.getWindowingMode(),
- task.getActivityType(),
- null /* options */,
- null /* sourceTask */,
- 0 /* launchFlags */)
+ task.getWindowingMode(), task.getActivityType(), null /* options */)
: null;
task.reparent(launchRoot == null ? toDisplayArea : launchRoot, POSITION_TOP);
diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
index 29677b22ea816..625cff3409124 100644
--- a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
+++ b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
@@ -292,8 +292,7 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier {
mSupervisor.mRootWindowContainer.resolveActivityType(root, options, task);
display.forAllTaskDisplayAreas(displayArea -> {
final Task launchRoot = displayArea.getLaunchRootTask(
- resolvedMode, activityType, null /* ActivityOptions */,
- null /* sourceTask*/, 0 /* launchFlags */);
+ resolvedMode, activityType, null /* ActivityOptions */);
if (launchRoot == null) {
return false;
}
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index c29211f3bb656..12a6a54764d50 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -22,7 +22,6 @@ import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REORDER;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REPARENT;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS;
-import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_LAUNCH_ROOT;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER;
@@ -321,26 +320,6 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
}
break;
}
- case HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT: {
- final WindowContainer wc = WindowContainer.fromBinder(
- hop.getContainer());
- final Task task = wc != null ? wc.asTask() : null;
- if (task == null) {
- throw new IllegalArgumentException("Cannot set "
- + "non-task as launch root: " + wc);
- } else if (!task.mCreatedByOrganizer) {
- throw new UnsupportedOperationException("Cannot set "
- + "non-organized task as adjacent flag root: " + wc);
- } else if (task.mAdjacentTask == null) {
- throw new UnsupportedOperationException("Cannot set "
- + "non-adjacent task as adjacent flag root: " + wc);
- }
-
- final boolean clearRoot = hop.getToTop();
- task.getDisplayArea()
- .setLaunchAdjacentFlagRootTask(clearRoot ? null : task);
- break;
- }
case HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT:
effects |= reparentChildrenTasksHierarchyOp(hop, transition, syncId);
break;
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
index e6ac52d2bf6f0..98260318ea9d7 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
@@ -339,8 +339,8 @@ public class ActivityStarterTests extends WindowTestsBase {
// Direct starter to use spy stack.
doReturn(stack).when(mRootWindowContainer)
.getLaunchRootTask(any(), any(), any(), anyBoolean());
- doReturn(stack).when(mRootWindowContainer).getLaunchRootTask(any(), any(), any(), any(),
- anyBoolean(), any(), anyInt(), anyInt(), anyInt());
+ doReturn(stack).when(mRootWindowContainer).getLaunchRootTask(any(), any(), any(),
+ anyBoolean(), any(), anyInt(), anyInt());
}
// Set up mock package manager internal and make sure no unmocked methods are called
@@ -1119,8 +1119,8 @@ public class ActivityStarterTests extends WindowTestsBase {
stack.addChild(targetRecord);
- doReturn(stack).when(mRootWindowContainer).getLaunchRootTask(any(), any(), any(), any(),
- anyBoolean(), any(), anyInt(), anyInt(), anyInt());
+ doReturn(stack).when(mRootWindowContainer)
+ .getLaunchRootTask(any(), any(), any(), anyBoolean(), any(), anyInt(), anyInt());
starter.mStartActivity = new ActivityBuilder(mAtm).build();
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index 4f5511b55d3a0..0bf237dc6545c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -980,8 +980,7 @@ public class RootWindowContainerTests extends WindowTestsBase {
doReturn(true).when(mSupervisor).canPlaceEntityOnDisplay(secondaryDisplay.mDisplayId,
300 /* test realCallerPid */, 300 /* test realCallerUid */, r.info);
final Task result = mRootWindowContainer.getLaunchRootTask(r, options,
- null /* task */, null /* sourceTask */, true /* onTop */, null /* launchParams */,
- 0 /* launchFlags */, 300 /* test realCallerPid */,
+ null /* task */, true /* onTop */, null, 300 /* test realCallerPid */,
300 /* test realCallerUid */);
// Assert that the root task is returned as expected.
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
index 9289ce41cd1e4..92d4edec85f49 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
@@ -28,7 +28,6 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
-import static android.content.Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT;
import static android.content.pm.ActivityInfo.FLAG_ALWAYS_FOCUSABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
@@ -75,52 +74,6 @@ import org.junit.runner.RunWith;
@RunWith(WindowTestRunner.class)
public class TaskDisplayAreaTests extends WindowTestsBase {
- @Test
- public void getLaunchRootTask_checksLaunchAdjacentFlagRoot() {
- final Task rootTask = createTask(
- mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
- rootTask.mCreatedByOrganizer = true;
- final Task adjacentRootTask = createTask(
- mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
- adjacentRootTask.mCreatedByOrganizer = true;
- final TaskDisplayArea taskDisplayArea = rootTask.getDisplayArea();
- adjacentRootTask.mAdjacentTask = rootTask;
- rootTask.mAdjacentTask = adjacentRootTask;
-
- taskDisplayArea.setLaunchAdjacentFlagRootTask(adjacentRootTask);
- Task actualRootTask = taskDisplayArea.getLaunchRootTask(
- WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, null /* options */,
- null /* sourceTask */, FLAG_ACTIVITY_LAUNCH_ADJACENT);
- assertSame(adjacentRootTask, actualRootTask.getRootTask());
-
- taskDisplayArea.setLaunchAdjacentFlagRootTask(null);
- actualRootTask = taskDisplayArea.getLaunchRootTask(WINDOWING_MODE_UNDEFINED,
- ACTIVITY_TYPE_STANDARD, null /* options */, null /* sourceTask */,
- FLAG_ACTIVITY_LAUNCH_ADJACENT);
- assertNull(actualRootTask);
- }
-
- @Test
- public void getLaunchRootTask_fromLaunchAdjacentFlagRoot_checksAdjacentRoot() {
- final ActivityRecord activity = createNonAttachedActivityRecord(mDisplayContent);
- final Task rootTask = createTask(
- mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
- rootTask.mCreatedByOrganizer = true;
- final Task adjacentRootTask = createTask(
- mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
- adjacentRootTask.mCreatedByOrganizer = true;
- final TaskDisplayArea taskDisplayArea = rootTask.getDisplayArea();
- adjacentRootTask.mAdjacentTask = rootTask;
- rootTask.mAdjacentTask = adjacentRootTask;
-
- taskDisplayArea.setLaunchAdjacentFlagRootTask(adjacentRootTask);
- final Task actualRootTask = taskDisplayArea.getLaunchRootTask(
- WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, null /* options */,
- adjacentRootTask /* sourceTask */, FLAG_ACTIVITY_LAUNCH_ADJACENT);
-
- assertSame(rootTask, actualRootTask.getRootTask());
- }
-
@Test
public void getOrCreateLaunchRootRespectsResolvedWindowingMode() {
final Task rootTask = createTask(
@@ -137,8 +90,8 @@ public class TaskDisplayAreaTests extends WindowTestsBase {
launchParams.mWindowingMode = WINDOWING_MODE_FREEFORM;
final Task actualRootTask = taskDisplayArea.getOrCreateRootTask(
- activity, null /* options */, candidateRootTask, null /* sourceTask */,
- launchParams, 0 /* launchFlags */, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ activity, null /* options */, candidateRootTask,
+ launchParams, ACTIVITY_TYPE_STANDARD, true /* onTop */);
assertSame(rootTask, actualRootTask.getRootTask());
}
@@ -158,9 +111,8 @@ public class TaskDisplayAreaTests extends WindowTestsBase {
options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
final Task actualRootTask = taskDisplayArea.getOrCreateRootTask(
- activity, options, candidateRootTask, null /* sourceTask */,
- null /* launchParams */, 0 /* launchFlags */, ACTIVITY_TYPE_STANDARD,
- true /* onTop */);
+ activity, options, candidateRootTask,
+ null /* launchParams */, ACTIVITY_TYPE_STANDARD, true /* onTop */);
assertSame(rootTask, actualRootTask.getRootTask());
}
@@ -506,8 +458,8 @@ public class TaskDisplayAreaTests extends WindowTestsBase {
boolean reuseCandidate) {
final TaskDisplayArea taskDisplayArea = candidateTask.getDisplayArea();
final Task rootTask = taskDisplayArea.getOrCreateRootTask(windowingMode, activityType,
- false /* onTop */, candidateTask /* candidateTask */, null /* sourceTask */,
- null /* activityOptions */, 0 /* launchFlags */);
+ false /* onTop */, null /* intent */, candidateTask /* candidateTask */,
+ null /* activityOptions */);
assertEquals(reuseCandidate, rootTask == candidateTask);
}
From 5d32c60217be91fe1053a6d53aad09963df083a0 Mon Sep 17 00:00:00 2001
From: Daniel Chapin
Date: Wed, 28 Apr 2021 22:32:20 +0000
Subject: [PATCH 045/176] Revert "Support FLAG_ACTIVITY_LAUNCH_ADJACENT for
launch root with adjacent"
This reverts commit d8abe76ba18e9baf6dcef68a65a03b6651c7e5ef.
Reason for revert: Bug: 186614428
Change-Id: Id7d1f57a11f0698f9377b00008994f9a6c3038d3
(cherry picked from commit 48f90b317b9845ee241b0175cd73a7f55d5b1dd9)
---
.../window/WindowContainerTransaction.java | 39 ---------
.../shell/splitscreen/StageCoordinator.java | 3 -
.../android/server/wm/ActivityStarter.java | 4 +-
.../server/wm/RootWindowContainer.java | 24 +++--
.../core/java/com/android/server/wm/Task.java | 28 +-----
.../android/server/wm/TaskDisplayArea.java | 87 ++++---------------
.../server/wm/TaskLaunchParamsModifier.java | 3 +-
.../server/wm/WindowOrganizerController.java | 21 -----
.../server/wm/ActivityStarterTests.java | 8 +-
.../server/wm/RootWindowContainerTests.java | 3 +-
.../server/wm/TaskDisplayAreaTests.java | 60 ++-----------
11 files changed, 40 insertions(+), 240 deletions(-)
diff --git a/core/java/android/window/WindowContainerTransaction.java b/core/java/android/window/WindowContainerTransaction.java
index c0af57214e5e5..f93e413961529 100644
--- a/core/java/android/window/WindowContainerTransaction.java
+++ b/core/java/android/window/WindowContainerTransaction.java
@@ -338,33 +338,6 @@ public final class WindowContainerTransaction implements Parcelable {
return this;
}
- /**
- * Sets the container as launch adjacent flag root. Task starting with
- * {@link FLAG_ACTIVITY_LAUNCH_ADJACENT} will be launching to.
- *
- * @hide
- */
- @NonNull
- public WindowContainerTransaction setLaunchAdjacentFlagRoot(
- @NonNull WindowContainerToken container) {
- mHierarchyOps.add(HierarchyOp.createForSetLaunchAdjacentFlagRoot(container.asBinder(),
- false /* clearRoot */));
- return this;
- }
-
- /**
- * Clears launch adjacent flag root for the display area of passing container.
- *
- * @hide
- */
- @NonNull
- public WindowContainerTransaction clearLaunchAdjacentFlagRoot(
- @NonNull WindowContainerToken container) {
- mHierarchyOps.add(HierarchyOp.createForSetLaunchAdjacentFlagRoot(container.asBinder(),
- true /* clearRoot */));
- return this;
- }
-
/**
* Starts a task by id. The task is expected to already exist (eg. as a recent task).
* @param taskId Id of task to start.
@@ -704,7 +677,6 @@ public final class WindowContainerTransaction implements Parcelable {
public static final int HIERARCHY_OP_TYPE_SET_LAUNCH_ROOT = 3;
public static final int HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS = 4;
public static final int HIERARCHY_OP_TYPE_LAUNCH_TASK = 5;
- public static final int HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT = 6;
// The following key(s) are for use with mLaunchOptions:
// When launching a task (eg. from recents), this is the taskId to be launched.
@@ -762,14 +734,6 @@ public final class WindowContainerTransaction implements Parcelable {
fullOptions);
}
- /** Create a hierarchy op for setting launch adjacent flag root. */
- public static HierarchyOp createForSetLaunchAdjacentFlagRoot(IBinder container,
- boolean clearRoot) {
- return new HierarchyOp(HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT, container, null,
- null, null, clearRoot, null);
- }
-
-
private HierarchyOp(int type, @Nullable IBinder container, @Nullable IBinder reparent,
int[] windowingModes, int[] activityTypes, boolean toTop,
@Nullable Bundle launchOptions) {
@@ -865,9 +829,6 @@ public final class WindowContainerTransaction implements Parcelable {
+ " adjacentRoot=" + mReparent + "}";
case HIERARCHY_OP_TYPE_LAUNCH_TASK:
return "{LaunchTask: " + mLaunchOptions + "}";
- case HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT:
- return "{SetAdjacentFlagRoot: container=" + mContainer + " clearRoot=" + mToTop
- + "}";
default:
return "{mType=" + mType + " container=" + mContainer + " reparent=" + mReparent
+ " mToTop=" + mToTop + " mWindowingMode=" + mWindowingModes
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
index efaa2696cbebd..c91a92ad32427 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
@@ -337,7 +337,6 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener,
final WindowContainerTransaction wct = new WindowContainerTransaction();
// Make the stages adjacent to each other so they occlude what's behind them.
wct.setAdjacentRoots(mMainStage.mRootTaskInfo.token, mSideStage.mRootTaskInfo.token);
- wct.setLaunchAdjacentFlagRoot(mSideStage.mRootTaskInfo.token);
mTaskOrganizer.applyTransaction(wct);
}
}
@@ -347,7 +346,6 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener,
final WindowContainerTransaction wct = new WindowContainerTransaction();
// Deactivate the main stage if it no longer has a root task.
mMainStage.deactivate(wct);
- wct.clearLaunchAdjacentFlagRoot(mSideStage.mRootTaskInfo.token);
mTaskOrganizer.applyTransaction(wct);
}
}
@@ -451,7 +449,6 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener,
final WindowContainerTransaction wct = new WindowContainerTransaction();
// Make sure the main stage is active.
mMainStage.activate(getMainStageBounds(), wct);
- mSideStage.setBounds(getSideStageBounds(), wct);
mTaskOrganizer.applyTransaction(wct);
}
}
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 08a9f0928b8b3..9be973be87fc3 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -2761,8 +2761,8 @@ class ActivityStarter {
final boolean onTop =
(aOptions == null || !aOptions.getAvoidMoveToFront()) && !mLaunchTaskBehind;
- return mRootWindowContainer.getLaunchRootTask(r, aOptions, task, mSourceRootTask, onTop,
- mLaunchParams, launchFlags, mRequest.realCallingPid, mRequest.realCallingUid);
+ return mRootWindowContainer.getLaunchRootTask(r, aOptions, task, onTop, mLaunchParams,
+ mRequest.realCallingPid, mRequest.realCallingUid);
}
private boolean isLaunchModeOneOf(int mode1, int mode2) {
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index d9c5fa43d9e40..c81f31eb9f77d 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -2810,11 +2810,10 @@ class RootWindowContainer extends WindowContainer
return false;
}
- Task getLaunchRootTask(@Nullable ActivityRecord r, @Nullable ActivityOptions options,
- @Nullable Task candidateTask, boolean onTop) {
- return getLaunchRootTask(r, options, candidateTask, null /* sourceTask */, onTop,
- null /* launchParams */, 0 /* launchFlags */, -1 /* no realCallingPid */,
- -1 /* no realCallingUid */);
+ Task getLaunchRootTask(@Nullable ActivityRecord r,
+ @Nullable ActivityOptions options, @Nullable Task candidateTask, boolean onTop) {
+ return getLaunchRootTask(r, options, candidateTask, onTop, null /* launchParams */,
+ -1 /* no realCallingPid */, -1 /* no realCallingUid */);
}
/**
@@ -2823,18 +2822,15 @@ class RootWindowContainer extends WindowContainer
* @param r The activity we are trying to launch. Can be null.
* @param options The activity options used to the launch. Can be null.
* @param candidateTask The possible task the activity might be launched in. Can be null.
- * @param sourceTask The task requesting to start activity. Can be null.
* @param launchParams The resolved launch params to use.
- * @param launchFlags The launch flags for this launch.
* @param realCallingPid The pid from {@link ActivityStarter#setRealCallingPid}
* @param realCallingUid The uid from {@link ActivityStarter#setRealCallingUid}
* @return The root task to use for the launch or INVALID_TASK_ID.
*/
Task getLaunchRootTask(@Nullable ActivityRecord r,
- @Nullable ActivityOptions options, @Nullable Task candidateTask,
- @Nullable Task sourceTask, boolean onTop,
- @Nullable LaunchParamsController.LaunchParams launchParams, int launchFlags,
- int realCallingPid, int realCallingUid) {
+ @Nullable ActivityOptions options, @Nullable Task candidateTask, boolean onTop,
+ @Nullable LaunchParamsController.LaunchParams launchParams, int realCallingPid,
+ int realCallingUid) {
int taskId = INVALID_TASK_ID;
int displayId = INVALID_DISPLAY;
TaskDisplayArea taskDisplayArea = null;
@@ -2898,7 +2894,7 @@ class RootWindowContainer extends WindowContainer
// Falling back to default task container
taskDisplayArea = taskDisplayArea.mDisplayContent.getDefaultTaskDisplayArea();
rootTask = taskDisplayArea.getOrCreateRootTask(r, options, candidateTask,
- sourceTask, launchParams, launchFlags, activityType, onTop);
+ launchParams, activityType, onTop);
if (rootTask != null) {
return rootTask;
}
@@ -2953,8 +2949,8 @@ class RootWindowContainer extends WindowContainer
}
}
- return container.getOrCreateRootTask(r, options, candidateTask, sourceTask, launchParams,
- launchFlags, activityType, onTop);
+ return container.getOrCreateRootTask(
+ r, options, candidateTask, launchParams, activityType, onTop);
}
/** @return true if activity record is null or can be launched on provided display. */
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 2a0041afd9d0d..d4707d6f5f5ae 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -7952,17 +7952,6 @@ class Task extends WindowContainer {
private boolean mHasBeenVisible;
private boolean mRemoveWithTaskOrganizer;
- /**
- * Records the source task that requesting to build a new task, used to determine which of
- * the adjacent roots should be launch root of the new task.
- */
- private Task mSourceTask;
-
- /**
- * Records launch flags to apply when launching new task.
- */
- private int mLaunchFlags;
-
Builder(ActivityTaskManagerService atm) {
mAtmService = atm;
}
@@ -7972,16 +7961,6 @@ class Task extends WindowContainer {
return this;
}
- Builder setSourceTask(Task sourceTask) {
- mSourceTask = sourceTask;
- return this;
- }
-
- Builder setLaunchFlags(int launchFlags) {
- mLaunchFlags = launchFlags;
- return this;
- }
-
Builder setTaskId(int taskId) {
mTaskId = taskId;
return this;
@@ -8236,14 +8215,9 @@ class Task extends WindowContainer {
tda.getRootPinnedTask().dismissPip();
}
- if (mIntent != null) {
- mLaunchFlags |= mIntent.getFlags();
- }
-
// Task created by organizer are added as root.
final Task launchRootTask = mCreatedByOrganizer
- ? null : tda.getLaunchRootTask(mWindowingMode, mActivityType, mActivityOptions,
- mSourceTask, mLaunchFlags);
+ ? null : tda.getLaunchRootTask(mWindowingMode, mActivityType, mActivityOptions);
if (launchRootTask != null) {
// Since this task will be put into a root task, its windowingMode will be
// inherited.
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index cda8c4b78b0cd..4d85e7bda9000 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -27,7 +27,6 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
-import static android.content.Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@@ -44,6 +43,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import android.annotation.Nullable;
import android.app.ActivityOptions;
import android.app.WindowConfiguration;
+import android.content.Intent;
import android.os.UserHandle;
import android.util.IntArray;
import android.util.Slog;
@@ -132,11 +132,6 @@ final class TaskDisplayArea extends DisplayArea {
}
private final ArrayList mLaunchRootTasks = new ArrayList<>();
- /**
- * A launch root task for activity launching with {@link FLAG_ACTIVITY_LAUNCH_ADJACENT} flag.
- */
- private Task mLaunchAdjacentFlagRootTask;
-
/**
* A focusable root task that is purposely to be positioned at the top. Although the root
* task may not have the topmost index, it is used as a preferred candidate to prevent being
@@ -1018,9 +1013,6 @@ final class TaskDisplayArea extends DisplayArea {
if (mPreferredTopFocusableRootTask == rootTask) {
mPreferredTopFocusableRootTask = null;
}
- if (mLaunchAdjacentFlagRootTask == rootTask) {
- mLaunchAdjacentFlagRootTask = null;
- }
mDisplayContent.releaseSelfIfNeeded();
onRootTaskOrderChanged(rootTask);
}
@@ -1055,11 +1047,11 @@ final class TaskDisplayArea extends DisplayArea {
* Returns an existing root task compatible with the windowing mode and activity type or
* creates one if a compatible root task doesn't exist.
*
- * @see #getOrCreateRootTask(int, int, boolean, Task, Task, ActivityOptions, int)
+ * @see #getOrCreateRootTask(int, int, boolean, Intent, Task, ActivityOptions)
*/
Task getOrCreateRootTask(int windowingMode, int activityType, boolean onTop) {
- return getOrCreateRootTask(windowingMode, activityType, onTop, null /* candidateTask */,
- null /* sourceTask */, null /* options */, 0 /* intent */);
+ return getOrCreateRootTask(windowingMode, activityType, onTop, null /* intent */,
+ null /* candidateTask */, null /* options */);
}
/**
@@ -1068,21 +1060,11 @@ final class TaskDisplayArea extends DisplayArea {
* For one level task, the candidate task would be reused to also be the root task or create
* a new root task if no candidate task.
*
- * @param windowingMode The windowing mode the root task should be created in.
- * @param activityType The activityType the root task should be created in.
- * @param onTop If true the root task will be created at the top of the display,
- * else at the bottom.
- * @param candidateTask The possible task the activity might be launched in. Can be null.
- * @param sourceTask The task requesting to start activity. Used to determine which of the
- * adjacent roots should be launch root of the new task. Can be null.
- * @param options The activity options used to the launch. Can be null.
- * @param launchFlags The launch flags for this launch.
- * @return The root task to use for the launch.
* @see #getRootTask(int, int)
+ * @see #createRootTask(int, int, boolean)
*/
Task getOrCreateRootTask(int windowingMode, int activityType, boolean onTop,
- @Nullable Task candidateTask, @Nullable Task sourceTask,
- @Nullable ActivityOptions options, int launchFlags) {
+ Intent intent, Task candidateTask, ActivityOptions options) {
// Need to pass in a determined windowing mode to see if a new root task should be created,
// so use its parent's windowing mode if it is undefined.
if (!alwaysCreateRootTask(
@@ -1095,8 +1077,7 @@ final class TaskDisplayArea extends DisplayArea {
} else if (candidateTask != null) {
final Task rootTask = candidateTask;
final int position = onTop ? POSITION_TOP : POSITION_BOTTOM;
- final Task launchRootTask = getLaunchRootTask(windowingMode, activityType, options,
- sourceTask, launchFlags);
+ final Task launchRootTask = getLaunchRootTask(windowingMode, activityType, options);
if (launchRootTask != null) {
if (rootTask.getParent() == null) {
@@ -1122,9 +1103,8 @@ final class TaskDisplayArea extends DisplayArea {
.setActivityType(activityType)
.setOnTop(onTop)
.setParent(this)
- .setSourceTask(sourceTask)
+ .setIntent(intent)
.setActivityOptions(options)
- .setLaunchFlags(launchFlags)
.build();
}
@@ -1134,9 +1114,9 @@ final class TaskDisplayArea extends DisplayArea {
*
* @see #getOrCreateRootTask(int, int, boolean)
*/
- Task getOrCreateRootTask(@Nullable ActivityRecord r, @Nullable ActivityOptions options,
- @Nullable Task candidateTask, @Nullable Task sourceTask,
- @Nullable LaunchParams launchParams, int launchFlags, int activityType, boolean onTop) {
+ Task getOrCreateRootTask(@Nullable ActivityRecord r,
+ @Nullable ActivityOptions options, @Nullable Task candidateTask,
+ @Nullable LaunchParams launchParams, int activityType, boolean onTop) {
int windowingMode = WINDOWING_MODE_UNDEFINED;
if (launchParams != null) {
// If launchParams isn't null, windowing mode is already resolved.
@@ -1150,8 +1130,8 @@ final class TaskDisplayArea extends DisplayArea {
// UNDEFINED windowing mode is a valid result and means that the new root task will inherit
// it's display's windowing mode.
windowingMode = validateWindowingMode(windowingMode, r, candidateTask, activityType);
- return getOrCreateRootTask(windowingMode, activityType, onTop, candidateTask, sourceTask,
- options, launchFlags);
+ return getOrCreateRootTask(windowingMode, activityType, onTop, null /* intent */,
+ candidateTask, options);
}
@VisibleForTesting
@@ -1219,24 +1199,6 @@ final class TaskDisplayArea extends DisplayArea {
}
}
- void setLaunchAdjacentFlagRootTask(@Nullable Task adjacentFlagRootTask) {
- if (adjacentFlagRootTask != null) {
- if (!adjacentFlagRootTask.mCreatedByOrganizer) {
- throw new IllegalArgumentException(
- "Can't set not mCreatedByOrganizer as launch adjacent flag root tr="
- + adjacentFlagRootTask);
- }
-
- if (adjacentFlagRootTask.mAdjacentTask == null) {
- throw new UnsupportedOperationException(
- "Can't set non-adjacent root as launch adjacent flag root tr="
- + adjacentFlagRootTask);
- }
- }
-
- mLaunchAdjacentFlagRootTask = adjacentFlagRootTask;
- }
-
private @Nullable LaunchRootTaskDef getLaunchRootTaskDef(Task rootTask) {
LaunchRootTaskDef def = null;
for (int i = mLaunchRootTasks.size() - 1; i >= 0; --i) {
@@ -1247,9 +1209,7 @@ final class TaskDisplayArea extends DisplayArea {
return def;
}
- @Nullable
- Task getLaunchRootTask(int windowingMode, int activityType, @Nullable ActivityOptions options,
- @Nullable Task sourceTask, int launchFlags) {
+ Task getLaunchRootTask(int windowingMode, int activityType, ActivityOptions options) {
// Try to use the launch root task in options if available.
if (options != null) {
final Task launchRootTask = Task.fromWindowContainerToken(options.getLaunchRootTask());
@@ -1259,19 +1219,6 @@ final class TaskDisplayArea extends DisplayArea {
}
}
- // Use launch-adjacent-flag-root if launching with launch-adjacent flag.
- if ((launchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0
- && mLaunchAdjacentFlagRootTask != null) {
- // If the adjacent launch is coming from the same root, launch to adjacent root instead.
- if (sourceTask != null
- && sourceTask.getRootTask().mTaskId == mLaunchAdjacentFlagRootTask.mTaskId
- && mLaunchAdjacentFlagRootTask.mAdjacentTask != null) {
- return mLaunchAdjacentFlagRootTask.mAdjacentTask;
- } else {
- return mLaunchAdjacentFlagRootTask;
- }
- }
-
for (int i = mLaunchRootTasks.size() - 1; i >= 0; --i) {
if (mLaunchRootTasks.get(i).contains(windowingMode, activityType)) {
return mLaunchRootTasks.get(i).task;
@@ -2016,11 +1963,7 @@ final class TaskDisplayArea extends DisplayArea {
// Reparent task to corresponding launch root or display area.
final WindowContainer launchRoot = task.supportsSplitScreenWindowingMode()
? toDisplayArea.getLaunchRootTask(
- task.getWindowingMode(),
- task.getActivityType(),
- null /* options */,
- null /* sourceTask */,
- 0 /* launchFlags */)
+ task.getWindowingMode(), task.getActivityType(), null /* options */)
: null;
task.reparent(launchRoot == null ? toDisplayArea : launchRoot, POSITION_TOP);
diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
index 29677b22ea816..625cff3409124 100644
--- a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
+++ b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
@@ -292,8 +292,7 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier {
mSupervisor.mRootWindowContainer.resolveActivityType(root, options, task);
display.forAllTaskDisplayAreas(displayArea -> {
final Task launchRoot = displayArea.getLaunchRootTask(
- resolvedMode, activityType, null /* ActivityOptions */,
- null /* sourceTask*/, 0 /* launchFlags */);
+ resolvedMode, activityType, null /* ActivityOptions */);
if (launchRoot == null) {
return false;
}
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index c29211f3bb656..12a6a54764d50 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -22,7 +22,6 @@ import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REORDER;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REPARENT;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS;
-import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_LAUNCH_ROOT;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER;
@@ -321,26 +320,6 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
}
break;
}
- case HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT: {
- final WindowContainer wc = WindowContainer.fromBinder(
- hop.getContainer());
- final Task task = wc != null ? wc.asTask() : null;
- if (task == null) {
- throw new IllegalArgumentException("Cannot set "
- + "non-task as launch root: " + wc);
- } else if (!task.mCreatedByOrganizer) {
- throw new UnsupportedOperationException("Cannot set "
- + "non-organized task as adjacent flag root: " + wc);
- } else if (task.mAdjacentTask == null) {
- throw new UnsupportedOperationException("Cannot set "
- + "non-adjacent task as adjacent flag root: " + wc);
- }
-
- final boolean clearRoot = hop.getToTop();
- task.getDisplayArea()
- .setLaunchAdjacentFlagRootTask(clearRoot ? null : task);
- break;
- }
case HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT:
effects |= reparentChildrenTasksHierarchyOp(hop, transition, syncId);
break;
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
index e6ac52d2bf6f0..98260318ea9d7 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
@@ -339,8 +339,8 @@ public class ActivityStarterTests extends WindowTestsBase {
// Direct starter to use spy stack.
doReturn(stack).when(mRootWindowContainer)
.getLaunchRootTask(any(), any(), any(), anyBoolean());
- doReturn(stack).when(mRootWindowContainer).getLaunchRootTask(any(), any(), any(), any(),
- anyBoolean(), any(), anyInt(), anyInt(), anyInt());
+ doReturn(stack).when(mRootWindowContainer).getLaunchRootTask(any(), any(), any(),
+ anyBoolean(), any(), anyInt(), anyInt());
}
// Set up mock package manager internal and make sure no unmocked methods are called
@@ -1119,8 +1119,8 @@ public class ActivityStarterTests extends WindowTestsBase {
stack.addChild(targetRecord);
- doReturn(stack).when(mRootWindowContainer).getLaunchRootTask(any(), any(), any(), any(),
- anyBoolean(), any(), anyInt(), anyInt(), anyInt());
+ doReturn(stack).when(mRootWindowContainer)
+ .getLaunchRootTask(any(), any(), any(), anyBoolean(), any(), anyInt(), anyInt());
starter.mStartActivity = new ActivityBuilder(mAtm).build();
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index 4f5511b55d3a0..0bf237dc6545c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -980,8 +980,7 @@ public class RootWindowContainerTests extends WindowTestsBase {
doReturn(true).when(mSupervisor).canPlaceEntityOnDisplay(secondaryDisplay.mDisplayId,
300 /* test realCallerPid */, 300 /* test realCallerUid */, r.info);
final Task result = mRootWindowContainer.getLaunchRootTask(r, options,
- null /* task */, null /* sourceTask */, true /* onTop */, null /* launchParams */,
- 0 /* launchFlags */, 300 /* test realCallerPid */,
+ null /* task */, true /* onTop */, null, 300 /* test realCallerPid */,
300 /* test realCallerUid */);
// Assert that the root task is returned as expected.
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
index 9289ce41cd1e4..92d4edec85f49 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
@@ -28,7 +28,6 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
-import static android.content.Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT;
import static android.content.pm.ActivityInfo.FLAG_ALWAYS_FOCUSABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
@@ -75,52 +74,6 @@ import org.junit.runner.RunWith;
@RunWith(WindowTestRunner.class)
public class TaskDisplayAreaTests extends WindowTestsBase {
- @Test
- public void getLaunchRootTask_checksLaunchAdjacentFlagRoot() {
- final Task rootTask = createTask(
- mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
- rootTask.mCreatedByOrganizer = true;
- final Task adjacentRootTask = createTask(
- mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
- adjacentRootTask.mCreatedByOrganizer = true;
- final TaskDisplayArea taskDisplayArea = rootTask.getDisplayArea();
- adjacentRootTask.mAdjacentTask = rootTask;
- rootTask.mAdjacentTask = adjacentRootTask;
-
- taskDisplayArea.setLaunchAdjacentFlagRootTask(adjacentRootTask);
- Task actualRootTask = taskDisplayArea.getLaunchRootTask(
- WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, null /* options */,
- null /* sourceTask */, FLAG_ACTIVITY_LAUNCH_ADJACENT);
- assertSame(adjacentRootTask, actualRootTask.getRootTask());
-
- taskDisplayArea.setLaunchAdjacentFlagRootTask(null);
- actualRootTask = taskDisplayArea.getLaunchRootTask(WINDOWING_MODE_UNDEFINED,
- ACTIVITY_TYPE_STANDARD, null /* options */, null /* sourceTask */,
- FLAG_ACTIVITY_LAUNCH_ADJACENT);
- assertNull(actualRootTask);
- }
-
- @Test
- public void getLaunchRootTask_fromLaunchAdjacentFlagRoot_checksAdjacentRoot() {
- final ActivityRecord activity = createNonAttachedActivityRecord(mDisplayContent);
- final Task rootTask = createTask(
- mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
- rootTask.mCreatedByOrganizer = true;
- final Task adjacentRootTask = createTask(
- mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
- adjacentRootTask.mCreatedByOrganizer = true;
- final TaskDisplayArea taskDisplayArea = rootTask.getDisplayArea();
- adjacentRootTask.mAdjacentTask = rootTask;
- rootTask.mAdjacentTask = adjacentRootTask;
-
- taskDisplayArea.setLaunchAdjacentFlagRootTask(adjacentRootTask);
- final Task actualRootTask = taskDisplayArea.getLaunchRootTask(
- WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, null /* options */,
- adjacentRootTask /* sourceTask */, FLAG_ACTIVITY_LAUNCH_ADJACENT);
-
- assertSame(rootTask, actualRootTask.getRootTask());
- }
-
@Test
public void getOrCreateLaunchRootRespectsResolvedWindowingMode() {
final Task rootTask = createTask(
@@ -137,8 +90,8 @@ public class TaskDisplayAreaTests extends WindowTestsBase {
launchParams.mWindowingMode = WINDOWING_MODE_FREEFORM;
final Task actualRootTask = taskDisplayArea.getOrCreateRootTask(
- activity, null /* options */, candidateRootTask, null /* sourceTask */,
- launchParams, 0 /* launchFlags */, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ activity, null /* options */, candidateRootTask,
+ launchParams, ACTIVITY_TYPE_STANDARD, true /* onTop */);
assertSame(rootTask, actualRootTask.getRootTask());
}
@@ -158,9 +111,8 @@ public class TaskDisplayAreaTests extends WindowTestsBase {
options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
final Task actualRootTask = taskDisplayArea.getOrCreateRootTask(
- activity, options, candidateRootTask, null /* sourceTask */,
- null /* launchParams */, 0 /* launchFlags */, ACTIVITY_TYPE_STANDARD,
- true /* onTop */);
+ activity, options, candidateRootTask,
+ null /* launchParams */, ACTIVITY_TYPE_STANDARD, true /* onTop */);
assertSame(rootTask, actualRootTask.getRootTask());
}
@@ -506,8 +458,8 @@ public class TaskDisplayAreaTests extends WindowTestsBase {
boolean reuseCandidate) {
final TaskDisplayArea taskDisplayArea = candidateTask.getDisplayArea();
final Task rootTask = taskDisplayArea.getOrCreateRootTask(windowingMode, activityType,
- false /* onTop */, candidateTask /* candidateTask */, null /* sourceTask */,
- null /* activityOptions */, 0 /* launchFlags */);
+ false /* onTop */, null /* intent */, candidateTask /* candidateTask */,
+ null /* activityOptions */);
assertEquals(reuseCandidate, rootTask == candidateTask);
}
From cb9c2b77d3a7bc2d2920c93732782a6217666ba5 Mon Sep 17 00:00:00 2001
From: Jerry Chang
Date: Sat, 1 May 2021 01:10:37 +0800
Subject: [PATCH 046/176] Make sure to reorder side stage above main stage to
prevent flicker
Always reorder side stage to the top whenever there's a child task
appeared in side stage. This is needed to prevent main stage occludes
newly launched task in side stage and causing itself flipping between
fullscreen and multi-window windowing mode.
Fix: 186614428
Bug: 169271875
Test: enter staged split by launching task with adjacent flag, screen
won't flicker
Change-Id: I9176a97439d687bbc7b0bf2dd9ddfdaecacfa455
(cherry picked from commit 57b13e327fe1d98981c29f6a2a32b07417283849)
---
.../com/android/wm/shell/splitscreen/StageCoordinator.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
index efaa2696cbebd..f7160e55012c3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
@@ -452,6 +452,10 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener,
// Make sure the main stage is active.
mMainStage.activate(getMainStageBounds(), wct);
mSideStage.setBounds(getSideStageBounds(), wct);
+ // Reorder side stage to the top whenever there's a new child task appeared in side
+ // stage. This is needed to prevent main stage occludes side stage and makes main stage
+ // flipping between fullscreen and multi-window windowing mode.
+ wct.reorder(mSideStage.mRootTaskInfo.token, true);
mTaskOrganizer.applyTransaction(wct);
}
}
From e837ade575042950d38fd7b8181a685f7c7430fd Mon Sep 17 00:00:00 2001
From: Collin Fijalkovich
Date: Fri, 30 Apr 2021 16:33:02 +0000
Subject: [PATCH 047/176] Revert "Enable remote animation for keygaurd going
away."
This reverts commit d0ba2859dd8cc851475b0e481adde30cb0eae795.
Reason for revert: Checking for cause of test breakage
Change-Id: I32f434f2e0c9b7d20bcd0ba51c0b770df8dfa575
(cherry picked from commit 124c7e37e446e928d8ff91c45851520579883d01)
---
.../systemui/keyguard/KeyguardService.java | 28 ++++---------------
.../KeyguardUnlockAnimationController.kt | 2 +-
.../keyguard/KeyguardViewMediator.java | 2 +-
.../server/policy/PhoneWindowManager.java | 2 +-
.../keyguard/KeyguardServiceDelegate.java | 6 ++--
.../server/wm/WindowManagerService.java | 27 ++----------------
6 files changed, 13 insertions(+), 54 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
index f1431f5cd40be..666afed41c351 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
@@ -51,7 +51,6 @@ import com.android.internal.policy.IKeyguardExitCallback;
import com.android.internal.policy.IKeyguardService;
import com.android.internal.policy.IKeyguardStateCallback;
import com.android.systemui.SystemUIApplication;
-import com.android.wm.shell.transition.Transitions;
import javax.inject.Inject;
@@ -63,29 +62,16 @@ public class KeyguardService extends Service {
* Run Keyguard animation as remote animation in System UI instead of local animation in
* the server process.
*
- * 0: Runs all keyguard animation as local animation
- * 1: Only runs keyguard going away animation as remote animation
- * 2: Runs all keyguard animation as remote animation
- *
* Note: Must be consistent with WindowManagerService.
*/
private static final String ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY =
"persist.wm.enable_remote_keyguard_animation";
- private static final int sEnableRemoteKeyguardAnimation =
- SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 1);
-
/**
* @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
*/
- public static boolean sEnableRemoteKeyguardGoingAwayAnimation =
- !Transitions.ENABLE_SHELL_TRANSITIONS && sEnableRemoteKeyguardAnimation >= 1;
-
- /**
- * @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
- */
- public static boolean sEnableRemoteKeyguardOccludeAnimation =
- !Transitions.ENABLE_SHELL_TRANSITIONS && sEnableRemoteKeyguardAnimation >= 2;
+ static boolean sEnableRemoteKeyguardAnimation =
+ SystemProperties.getBoolean(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, false);
private final KeyguardViewMediator mKeyguardViewMediator;
private final KeyguardLifecyclesDispatcher mKeyguardLifecyclesDispatcher;
@@ -97,22 +83,20 @@ public class KeyguardService extends Service {
mKeyguardViewMediator = keyguardViewMediator;
mKeyguardLifecyclesDispatcher = keyguardLifecyclesDispatcher;
- RemoteAnimationDefinition definition = new RemoteAnimationDefinition();
- if (sEnableRemoteKeyguardGoingAwayAnimation) {
+ if (sEnableRemoteKeyguardAnimation) {
+ RemoteAnimationDefinition definition = new RemoteAnimationDefinition();
final RemoteAnimationAdapter exitAnimationAdapter =
new RemoteAnimationAdapter(mExitAnimationRunner, 0, 0);
definition.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_GOING_AWAY, exitAnimationAdapter);
definition.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER,
exitAnimationAdapter);
- }
- if (sEnableRemoteKeyguardOccludeAnimation) {
final RemoteAnimationAdapter occludeAnimationAdapter =
new RemoteAnimationAdapter(mOccludeAnimationRunner, 0, 0);
definition.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_OCCLUDE, occludeAnimationAdapter);
definition.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_UNOCCLUDE, occludeAnimationAdapter);
+ ActivityTaskManager.getInstance().registerRemoteAnimationsForDisplay(
+ DEFAULT_DISPLAY, definition);
}
- ActivityTaskManager.getInstance().registerRemoteAnimationsForDisplay(
- DEFAULT_DISPLAY, definition);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
index 85ee0dca88059..411c328cd3101 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
@@ -280,7 +280,7 @@ class KeyguardUnlockAnimationController @Inject constructor(
}
override fun onKeyguardDismissAmountChanged() {
- if (!KeyguardService.sEnableRemoteKeyguardGoingAwayAnimation) {
+ if (!KeyguardService.sEnableRemoteKeyguardAnimation) {
return
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index b7da7addf027a..48f9a58d7d1ac 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -2100,7 +2100,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
playSounds(false);
}
- if (KeyguardService.sEnableRemoteKeyguardGoingAwayAnimation) {
+ if (KeyguardService.sEnableRemoteKeyguardAnimation) {
mSurfaceBehindRemoteAnimationFinishedCallback = finishedCallback;
mSurfaceBehindRemoteAnimationRunning = true;
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 7f325f1590ec8..27f5350661f0b 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -3014,7 +3014,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private int handleStartTransitionForKeyguardLw(boolean keyguardGoingAway, long duration) {
final int res = applyKeyguardOcclusionChange();
if (res != 0) return res;
- if (!WindowManagerService.sEnableRemoteKeyguardGoingAwayAnimation && keyguardGoingAway) {
+ if (!WindowManagerService.sEnableRemoteKeyguardAnimation && keyguardGoingAway) {
if (DEBUG_KEYGUARD) Slog.d(TAG, "Starting keyguard exit animation");
startKeyguardExitAnimation(SystemClock.uptimeMillis(), duration);
}
diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
index 6e478ee7bf1b5..44f14b4d5b0df 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
@@ -263,8 +263,7 @@ public class KeyguardServiceDelegate {
*/
@Deprecated
public void setOccluded(boolean isOccluded, boolean animate) {
- if (!WindowManagerService.sEnableRemoteKeyguardOccludeAnimation
- && mKeyguardService != null) {
+ if (!WindowManagerService.sEnableRemoteKeyguardAnimation && mKeyguardService != null) {
if (DEBUG) Log.v(TAG, "setOccluded(" + isOccluded + ") animate=" + animate);
mKeyguardService.setOccluded(isOccluded, animate);
}
@@ -404,8 +403,7 @@ public class KeyguardServiceDelegate {
}
public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) {
- if (!WindowManagerService.sEnableRemoteKeyguardGoingAwayAnimation
- && mKeyguardService != null) {
+ if (!WindowManagerService.sEnableRemoteKeyguardAnimation && mKeyguardService != null) {
mKeyguardService.startKeyguardExitAnimation(startTime, fadeoutDuration);
}
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index fbeb968eb90ff..1657a136d61d3 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -420,42 +420,19 @@ public class WindowManagerService extends IWindowManager.Stub
static boolean sDisableCustomTaskAnimationProperty =
SystemProperties.getBoolean(DISABLE_CUSTOM_TASK_ANIMATION_PROPERTY, true);
- /**
- * Use WMShell for app transition.
- */
- public static final String ENABLE_SHELL_TRANSITIONS = "persist.debug.shell_transit";
-
- /**
- * @see #ENABLE_SHELL_TRANSITIONS
- */
- public static final boolean sEnableShellTransitions =
- SystemProperties.getBoolean(ENABLE_SHELL_TRANSITIONS, false);
-
/**
* Run Keyguard animation as remote animation in System UI instead of local animation in
* the server process.
- *
- * 0: Runs all keyguard animation as local animation
- * 1: Only runs keyguard going away animation as remote animation
- * 2: Runs all keyguard animation as remote animation
*/
private static final String ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY =
"persist.wm.enable_remote_keyguard_animation";
- private static final int sEnableRemoteKeyguardAnimation =
- SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 1);
-
/**
* @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
*/
- public static final boolean sEnableRemoteKeyguardGoingAwayAnimation = !sEnableShellTransitions
- && sEnableRemoteKeyguardAnimation >= 1;
+ public static boolean sEnableRemoteKeyguardAnimation =
+ SystemProperties.getBoolean(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, false);
- /**
- * @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
- */
- public static final boolean sEnableRemoteKeyguardOccludeAnimation = !sEnableShellTransitions
- && sEnableRemoteKeyguardAnimation >= 2;
/**
* Allows a fullscreen windowing mode activity to launch in its desired orientation directly
From 47fd3f63435477aa019b7e90fc707ad8bacd7335 Mon Sep 17 00:00:00 2001
From: Josh Tsuji
Date: Fri, 30 Apr 2021 15:09:41 -0400
Subject: [PATCH 048/176] Call StatusBar#finishKeyguardFadingAway after the
fling animation.
This isn't currently isn't being called with the new keyguard unlock animation if bypassing the keyguard due to biometric unlock. This results in ScrimController#expansionAffectsAlpha remaining false after an unlock, which in turn results in a transparent shade scrim even when unlocked+expanded.
Filed b/186873982 to track a permanent fix (for a safer fix-forward, I am checking if the new unlock animation is running before calling #finishKeyguardFadingAway, but that's likely not necessary).
Bug: 186760125
Test: manual
Change-Id: I79a70034a02af45d69dc0e80554141c65f6b5ed8
(cherry picked from commit 261120400fe146ef5c342e4bafb3ec460fbd25a9)
---
.../statusbar/phone/StatusBarKeyguardViewManager.java | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index f403cc94d831d..1ef8470180f34 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -591,6 +591,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
if (mStatusBar.isInLaunchTransition()
|| mKeyguardStateController.isFlingingToDismissKeyguard()) {
+ final boolean wasFlingingToDismissKeyguard =
+ mKeyguardStateController.isFlingingToDismissKeyguard();
mStatusBar.fadeKeyguardAfterLaunchTransition(new Runnable() {
@Override
public void run() {
@@ -604,6 +606,11 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
public void run() {
mStatusBar.hideKeyguard();
mNotificationShadeWindowController.setKeyguardFadingAway(false);
+
+ if (wasFlingingToDismissKeyguard) {
+ mStatusBar.finishKeyguardFadingAway();
+ }
+
mViewMediatorCallback.keyguardGone();
executeAfterKeyguardGoneAction();
}
From 4c5c16462604798acec9b8dcb9d8b18b40b48a8d Mon Sep 17 00:00:00 2001
From: Daniel Chapin
Date: Mon, 3 May 2021 19:55:48 +0000
Subject: [PATCH 049/176] Revert "Fix VIP conversations alerting incorrectly."
This reverts commit 64c85ac6f5f20d031a7e192366b8335fab0253c2.
Reason for revert: DF blocking Bug: 187009701
Change-Id: I04dfdf20ad5c7df3c6dddf0cc12540b179162f0b
(cherry picked from commit 25c273584ad92f566c41c635a886be9375f50d39)
---
.../statusbar/NotificationListener.java | 3 +-
.../NotificationGroupManagerLegacy.java | 438 ++----------------
.../NotificationGroupAlertTransferHelper.java | 365 ++++-----------
3 files changed, 118 insertions(+), 688 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
index 5437ce63475ec..7f31fddbfb6c3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar;
import static com.android.systemui.statusbar.RemoteInputController.processForRemoteInput;
import static com.android.systemui.statusbar.notification.NotificationEntryManager.UNDEFINED_DISMISS_REASON;
+import static com.android.systemui.statusbar.phone.StatusBar.DEBUG;
import android.annotation.NonNull;
import android.annotation.SuppressLint;
@@ -34,7 +35,6 @@ import android.util.Log;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.statusbar.dagger.StatusBarModule;
import com.android.systemui.statusbar.phone.NotificationListenerWithPlugins;
-import com.android.systemui.statusbar.phone.StatusBar;
import java.util.ArrayList;
import java.util.List;
@@ -46,7 +46,6 @@ import java.util.List;
@SuppressLint("OverrideAbstract")
public class NotificationListener extends NotificationListenerWithPlugins {
private static final String TAG = "NotificationListener";
- private static final boolean DEBUG = StatusBar.DEBUG;
private final Context mContext;
private final NotificationManager mNotificationManager;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java
index d95c265c14608..d6356de5ea51b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java
@@ -16,9 +16,7 @@
package com.android.systemui.statusbar.notification.collection.legacy;
-import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.app.Notification;
import android.service.notification.StatusBarNotification;
import android.util.ArraySet;
import android.util.Log;
@@ -33,7 +31,6 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier;
-import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.wm.shell.bubbles.Bubbles;
@@ -42,12 +39,10 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
-import java.util.TreeSet;
import javax.inject.Inject;
@@ -63,21 +58,13 @@ import dagger.Lazy;
public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener, StateListener,
GroupMembershipManager, GroupExpansionManager, Dumpable {
- private static final String TAG = "NotifGroupManager";
- private static final boolean DEBUG = StatusBar.DEBUG;
- private static final boolean SPEW = StatusBar.SPEW;
- /**
- * The maximum amount of time (in ms) between the posting of notifications that can be
- * considered part of the same update batch.
- */
- private static final long POST_BATCH_MAX_AGE = 5000;
+ private static final String TAG = "NotificationGroupManager";
private final HashMap mGroupMap = new HashMap<>();
private final ArraySet mExpansionChangeListeners =
new ArraySet<>();
private final ArraySet mGroupChangeListeners = new ArraySet<>();
private final Lazy mPeopleNotificationIdentifier;
private final Optional mBubblesOptional;
- private final EventBuffer mEventBuffer = new EventBuffer();
private int mBarState = -1;
private HashMap mIsolatedEntries = new HashMap<>();
private HeadsUpManager mHeadsUpManager;
@@ -147,14 +134,8 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
* When we want to remove an entry from being tracked for grouping
*/
public void onEntryRemoved(NotificationEntry removed) {
- if (SPEW) {
- Log.d(TAG, "onEntryRemoved: entry=" + removed);
- }
onEntryRemovedInternal(removed, removed.getSbn());
- StatusBarNotification oldSbn = mIsolatedEntries.remove(removed.getKey());
- if (oldSbn != null) {
- updateSuppression(mGroupMap.get(oldSbn.getGroupKey()));
- }
+ mIsolatedEntries.remove(removed.getKey());
}
/**
@@ -181,9 +162,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
// the close future. See b/23676310 for reference.
return;
}
- if (SPEW) {
- Log.d(TAG, "onEntryRemovedInternal: entry=" + removed + " group=" + group.groupKey);
- }
if (isGroupChild(removed.getKey(), isGroup, isGroupSummary)) {
group.children.remove(removed.getKey());
} else {
@@ -204,9 +182,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
* Notify the group manager that a new entry was added
*/
public void onEntryAdded(final NotificationEntry added) {
- if (SPEW) {
- Log.d(TAG, "onEntryAdded: entry=" + added);
- }
updateIsolation(added);
onEntryAddedInternal(added);
}
@@ -220,16 +195,13 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
String groupKey = getGroupKey(sbn);
NotificationGroup group = mGroupMap.get(groupKey);
if (group == null) {
- group = new NotificationGroup(groupKey);
+ group = new NotificationGroup();
mGroupMap.put(groupKey, group);
for (OnGroupChangeListener listener : mGroupChangeListeners) {
listener.onGroupCreated(group, groupKey);
}
}
- if (SPEW) {
- Log.d(TAG, "onEntryAddedInternal: entry=" + added + " group=" + group.groupKey);
- }
if (isGroupChild) {
NotificationEntry existing = group.children.get(added.getKey());
if (existing != null && existing != added) {
@@ -241,11 +213,9 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
+ " added removed" + added.isRowRemoved(), new Throwable());
}
group.children.put(added.getKey(), added);
- addToPostBatchHistory(group, added);
updateSuppression(group);
} else {
group.summary = added;
- addToPostBatchHistory(group, added);
group.expanded = added.areChildrenExpanded();
updateSuppression(group);
if (!group.children.isEmpty()) {
@@ -261,27 +231,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
}
}
- private void addToPostBatchHistory(NotificationGroup group, @Nullable NotificationEntry entry) {
- if (entry == null) {
- return;
- }
- boolean didAdd = group.postBatchHistory.add(new PostRecord(entry));
- if (didAdd) {
- trimPostBatchHistory(group.postBatchHistory);
- }
- }
-
- /** remove all history that's too old to be in the batch. */
- private void trimPostBatchHistory(@NonNull TreeSet postBatchHistory) {
- if (postBatchHistory.size() <= 1) {
- return;
- }
- long batchStartTime = postBatchHistory.last().postTime - POST_BATCH_MAX_AGE;
- while (!postBatchHistory.isEmpty() && postBatchHistory.first().postTime < batchStartTime) {
- postBatchHistory.pollFirst();
- }
- }
-
private void onEntryBecomingChild(NotificationEntry entry) {
updateIsolation(entry);
}
@@ -290,9 +239,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
if (group == null) {
return;
}
- NotificationEntry prevAlertOverride = group.alertOverride;
- group.alertOverride = getPriorityConversationAlertOverride(group);
-
int childCount = 0;
boolean hasBubbles = false;
for (NotificationEntry entry : group.children.values()) {
@@ -309,148 +255,18 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
group.suppressed = group.summary != null && !group.expanded
&& (childCount == 1
|| (childCount == 0
- && group.summary.getSbn().getNotification().isGroupSummary()
- && (hasIsolatedChildren(group) || hasBubbles)));
-
- boolean alertOverrideChanged = prevAlertOverride != group.alertOverride;
- boolean suppressionChanged = prevSuppressed != group.suppressed;
- if (alertOverrideChanged || suppressionChanged) {
- if (DEBUG && alertOverrideChanged) {
- Log.d(TAG, group + " alertOverride was=" + prevAlertOverride + " now="
- + group.alertOverride);
- }
- if (DEBUG && suppressionChanged) {
- Log.d(TAG, group + " suppressed changed to " + group.suppressed);
- }
- if (!mIsUpdatingUnchangedGroup) {
- if (alertOverrideChanged) {
- mEventBuffer.notifyAlertOverrideChanged(group, prevAlertOverride);
- }
- if (suppressionChanged) {
- for (OnGroupChangeListener listener : mGroupChangeListeners) {
- listener.onGroupSuppressionChanged(group, group.suppressed);
- }
- }
- mEventBuffer.notifyGroupsChanged();
- } else {
- if (DEBUG) {
- Log.d(TAG, group + " did not notify listeners of above change(s)");
+ && group.summary.getSbn().getNotification().isGroupSummary()
+ && (hasIsolatedChildren(group) || hasBubbles)));
+ if (prevSuppressed != group.suppressed) {
+ for (OnGroupChangeListener listener : mGroupChangeListeners) {
+ if (!mIsUpdatingUnchangedGroup) {
+ listener.onGroupSuppressionChanged(group, group.suppressed);
+ listener.onGroupsChanged();
}
}
}
}
- /**
- * Finds the isolated logical child of this group which is should be alerted instead.
- *
- * Notifications from priority conversations are isolated from their groups to make them more
- * prominent, however apps may post these with a GroupAlertBehavior that has the group receiving
- * the alert. This would lead to the group alerting even though the conversation that was
- * updated was not actually a part of that group. This method finds the best priority
- * conversation in this situation, if there is one, so they can be set as the alertOverride of
- * the group.
- *
- * @param group the group to check
- * @return the entry which should receive the alert instead of the group, if any.
- */
- @Nullable
- private NotificationEntry getPriorityConversationAlertOverride(NotificationGroup group) {
- // GOAL: if there is a priority child which wouldn't alert based on its groupAlertBehavior,
- // but which should be alerting (because priority conversations are isolated), find it.
- if (group == null || group.summary == null) {
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: null group or summary");
- }
- return null;
- }
- if (isIsolated(group.summary.getKey())) {
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: isolated group");
- }
- return null;
- }
-
- // Precondiions:
- // * Only necessary when all notifications in the group use GROUP_ALERT_SUMMARY
- // * Only necessary when at least one notification in the group is on a priority channel
- if (group.summary.getSbn().getNotification().getGroupAlertBehavior()
- != Notification.GROUP_ALERT_SUMMARY) {
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: summary != GROUP_ALERT_SUMMARY");
- }
- return null;
- }
-
- // Get the important children first, copy the keys for the final importance check,
- // then add the non-isolated children to the map for unified lookup.
- HashMap children = getImportantConversations(group);
- if (children == null || children.isEmpty()) {
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: no important conversations");
- }
- return null;
- }
- HashSet importantChildKeys = new HashSet<>(children.keySet());
- children.putAll(group.children);
-
- // Ensure all children have GROUP_ALERT_SUMMARY
- for (NotificationEntry child : children.values()) {
- if (child.getSbn().getNotification().getGroupAlertBehavior()
- != Notification.GROUP_ALERT_SUMMARY) {
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: "
- + "child != GROUP_ALERT_SUMMARY");
- }
- return null;
- }
- }
-
- // Create a merged post history from all the children
- TreeSet combinedHistory = new TreeSet<>(group.postBatchHistory);
- for (String importantChildKey : importantChildKeys) {
- NotificationGroup importantChildGroup = mGroupMap.get(importantChildKey);
- combinedHistory.addAll(importantChildGroup.postBatchHistory);
- }
- trimPostBatchHistory(combinedHistory);
-
- // This is a streamlined implementation of the following idea:
- // * From the subset of notifications in the latest 'batch' of updates. A batch is:
- // * Notifs posted less than POST_BATCH_MAX_AGE before the most recently posted.
- // * Only including notifs newer than the second-to-last post of any notification.
- // * Find the newest child in the batch -- the with the largest 'when' value.
- // * If the newest child is a priority conversation, set that as the override.
- HashSet batchKeys = new HashSet<>();
- long newestChildWhen = -1;
- NotificationEntry newestChild = null;
- // Iterate backwards through the post history, tracking the child with the smallest sort key
- for (PostRecord record : combinedHistory.descendingSet()) {
- if (batchKeys.contains(record.key)) {
- // Once you see a notification again, the batch has ended
- break;
- }
- batchKeys.add(record.key);
- NotificationEntry child = children.get(record.key);
- if (child != null) {
- long childWhen = child.getSbn().getNotification().when;
- if (newestChild == null || childWhen > newestChildWhen) {
- newestChildWhen = childWhen;
- newestChild = child;
- }
- }
- }
- if (newestChild != null && importantChildKeys.contains(newestChild.getKey())) {
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: result=" + newestChild);
- }
- return newestChild;
- }
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: result=null, newestChild="
- + newestChild);
- }
- return null;
- }
-
private boolean hasIsolatedChildren(NotificationGroup group) {
return getNumberOfIsolatedChildren(group.summary.getSbn().getGroupKey()) != 0;
}
@@ -465,33 +281,12 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
return count;
}
- @Nullable
- private HashMap getImportantConversations(NotificationGroup group) {
- String groupKey = group.summary.getSbn().getGroupKey();
- HashMap result = null;
- for (StatusBarNotification sbn : mIsolatedEntries.values()) {
- if (sbn.getGroupKey().equals(groupKey)) {
- NotificationEntry entry = mGroupMap.get(sbn.getKey()).summary;
- if (isImportantConversation(entry)) {
- if (result == null) {
- result = new HashMap<>();
- }
- result.put(sbn.getKey(), entry);
- }
- }
- }
- return result;
- }
-
/**
* Update an entry's group information
* @param entry notification entry to update
* @param oldNotification previous notification info before this update
*/
public void onEntryUpdated(NotificationEntry entry, StatusBarNotification oldNotification) {
- if (SPEW) {
- Log.d(TAG, "onEntryUpdated: entry=" + entry);
- }
onEntryUpdated(entry, oldNotification.getGroupKey(), oldNotification.isGroup(),
oldNotification.getNotification().isGroupSummary());
}
@@ -530,17 +325,7 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
* Whether the given notification is the summary of a group that is being suppressed
*/
public boolean isSummaryOfSuppressedGroup(StatusBarNotification sbn) {
- return sbn.getNotification().isGroupSummary() && isGroupSuppressed(getGroupKey(sbn));
- }
-
- /**
- * If the given notification is a summary, get the group for it.
- */
- public NotificationGroup getGroupForSummary(StatusBarNotification sbn) {
- if (sbn.getNotification().isGroupSummary()) {
- return mGroupMap.get(getGroupKey(sbn));
- }
- return null;
+ return isGroupSuppressed(getGroupKey(sbn)) && sbn.getNotification().isGroupSummary();
}
private boolean isOnlyChild(StatusBarNotification sbn) {
@@ -760,7 +545,9 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
if (!sbn.isGroup() || sbn.getNotification().isGroupSummary()) {
return false;
}
- if (isImportantConversation(entry)) {
+ int peopleNotificationType =
+ mPeopleNotificationIdentifier.get().getPeopleNotificationType(entry);
+ if (peopleNotificationType == PeopleNotificationIdentifier.TYPE_IMPORTANT_PERSON) {
return true;
}
if (mHeadsUpManager != null && !mHeadsUpManager.isAlerting(entry.getKey())) {
@@ -773,25 +560,18 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
|| isGroupNotFullyVisible(notificationGroup));
}
- private boolean isImportantConversation(NotificationEntry entry) {
- int peopleNotificationType =
- mPeopleNotificationIdentifier.get().getPeopleNotificationType(entry);
- return peopleNotificationType == PeopleNotificationIdentifier.TYPE_IMPORTANT_PERSON;
- }
-
/**
* Isolate a notification from its group so that it visually shows as its own group.
*
* @param entry the notification to isolate
*/
private void isolateNotification(NotificationEntry entry) {
- if (SPEW) {
- Log.d(TAG, "isolateNotification: entry=" + entry);
- }
+ StatusBarNotification sbn = entry.getSbn();
+
// We will be isolated now, so lets update the groups
onEntryRemovedInternal(entry, entry.getSbn());
- mIsolatedEntries.put(entry.getKey(), entry.getSbn());
+ mIsolatedEntries.put(sbn.getKey(), sbn);
onEntryAddedInternal(entry);
// We also need to update the suppression of the old group, because this call comes
@@ -808,14 +588,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
* Update the isolation of an entry, splitting it from the group.
*/
public void updateIsolation(NotificationEntry entry) {
- // We need to buffer a few events because we do isolation changes in 3 steps:
- // removeInternal, update mIsolatedEntries, addInternal. This means that often the
- // alertOverride will update on the removal, however processing the event in that case can
- // cause problems because the mIsolatedEntries map is not in its final state, so the event
- // listener may be unable to correctly determine the true state of the group. By delaying
- // the alertOverride change until after the add phase, we can ensure that listeners only
- // have to handle a consistent state.
- mEventBuffer.startBuffering();
boolean isIsolated = isIsolated(entry.getSbn().getKey());
if (shouldIsolate(entry)) {
if (!isIsolated) {
@@ -824,7 +596,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
} else if (isIsolated) {
stopIsolatingNotification(entry);
}
- mEventBuffer.flushAndStopBuffering();
}
/**
@@ -833,15 +604,15 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
* @param entry the notification to un-isolate
*/
private void stopIsolatingNotification(NotificationEntry entry) {
- if (SPEW) {
- Log.d(TAG, "stopIsolatingNotification: entry=" + entry);
- }
- // not isolated anymore, we need to update the groups
- onEntryRemovedInternal(entry, entry.getSbn());
- mIsolatedEntries.remove(entry.getKey());
- onEntryAddedInternal(entry);
- for (OnGroupChangeListener listener : mGroupChangeListeners) {
- listener.onGroupsChanged();
+ StatusBarNotification sbn = entry.getSbn();
+ if (isIsolated(sbn.getKey())) {
+ // not isolated anymore, we need to update the groups
+ onEntryRemovedInternal(entry, entry.getSbn());
+ mIsolatedEntries.remove(sbn.getKey());
+ onEntryAddedInternal(entry);
+ for (OnGroupChangeListener listener : mGroupChangeListeners) {
+ listener.onGroupsChanged();
+ }
}
}
@@ -876,155 +647,34 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
setStatusBarState(newState);
}
- /**
- * A record of a notification being posted, containing the time of the post and the key of the
- * notification entry. These are stored in a TreeSet by the NotificationGroup and used to
- * calculate a batch of notifications.
- */
- public static class PostRecord implements Comparable {
- public final long postTime;
- public final String key;
-
- /** constructs a record containing the post time and key from the notification entry */
- public PostRecord(@NonNull NotificationEntry entry) {
- this.postTime = entry.getSbn().getPostTime();
- this.key = entry.getKey();
- }
-
- @Override
- public int compareTo(PostRecord o) {
- int postTimeComparison = Long.compare(this.postTime, o.postTime);
- return postTimeComparison == 0
- ? String.CASE_INSENSITIVE_ORDER.compare(this.key, o.key)
- : postTimeComparison;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- PostRecord that = (PostRecord) o;
- return postTime == that.postTime && key.equals(that.key);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(postTime, key);
- }
- }
-
/**
* Represents a notification group in the notification shade.
*/
public static class NotificationGroup {
- public final String groupKey;
public final HashMap children = new HashMap<>();
- public final TreeSet postBatchHistory = new TreeSet<>();
public NotificationEntry summary;
public boolean expanded;
/**
* Is this notification group suppressed, i.e its summary is hidden
*/
public boolean suppressed;
- /**
- * The child (which is isolated from this group) to which the alert should be transferred,
- * due to priority conversations.
- */
- public NotificationEntry alertOverride;
-
- NotificationGroup(String groupKey) {
- this.groupKey = groupKey;
- }
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append(" groupKey: ").append(groupKey);
- sb.append("\n summary:");
- appendEntry(sb, summary);
- sb.append("\n children size: ").append(children.size());
+ String result = " summary:\n "
+ + (summary != null ? summary.getSbn() : "null")
+ + (summary != null && summary.getDebugThrowable() != null
+ ? Log.getStackTraceString(summary.getDebugThrowable())
+ : "");
+ result += "\n children size: " + children.size();
for (NotificationEntry child : children.values()) {
- appendEntry(sb, child);
- }
- sb.append("\n alertOverride:");
- appendEntry(sb, alertOverride);
- sb.append("\n summary suppressed: ").append(suppressed);
- return sb.toString();
- }
-
- private void appendEntry(StringBuilder sb, NotificationEntry entry) {
- sb.append("\n ").append(entry != null ? entry.getSbn() : "null");
- if (entry != null && entry.getDebugThrowable() != null) {
- sb.append(Log.getStackTraceString(entry.getDebugThrowable()));
- }
- }
- }
-
- /**
- * This class is a toggleable buffer for a subset of events of {@link OnGroupChangeListener}.
- * When buffering, instead of notifying the listeners it will set internal state that will allow
- * it to notify listeners of those events later
- */
- private class EventBuffer {
- private final HashMap mOldAlertOverrideByGroup = new HashMap<>();
- private boolean mIsBuffering = false;
- private boolean mDidGroupsChange = false;
-
- void notifyAlertOverrideChanged(NotificationGroup group,
- NotificationEntry oldAlertOverride) {
- if (mIsBuffering) {
- // The value in this map is the override before the event. If there is an entry
- // already in the map, then we are effectively coalescing two events, which means
- // we need to preserve the original initial value.
- mOldAlertOverrideByGroup.putIfAbsent(group.groupKey, oldAlertOverride);
- } else {
- for (OnGroupChangeListener listener : mGroupChangeListeners) {
- listener.onGroupAlertOverrideChanged(group, oldAlertOverride,
- group.alertOverride);
- }
- }
- }
-
- void notifyGroupsChanged() {
- if (mIsBuffering) {
- mDidGroupsChange = true;
- } else {
- for (OnGroupChangeListener listener : mGroupChangeListeners) {
- listener.onGroupsChanged();
- }
- }
- }
-
- void startBuffering() {
- mIsBuffering = true;
- }
-
- void flushAndStopBuffering() {
- // stop buffering so that we can call our own helpers
- mIsBuffering = false;
- // alert all group alert override changes for groups that were not removed
- for (Map.Entry entry : mOldAlertOverrideByGroup.entrySet()) {
- NotificationGroup group = mGroupMap.get(entry.getKey());
- if (group == null) {
- // The group can be null if this alertOverride changed before the group was
- // permanently removed, meaning that there's no guarantee that listeners will
- // that field clear.
- continue;
- }
- NotificationEntry oldAlertOverride = entry.getValue();
- if (group.alertOverride == oldAlertOverride) {
- // If the final alertOverride equals the initial, it means we coalesced two
- // events which undid the change, so we can drop it entirely.
- continue;
- }
- notifyAlertOverrideChanged(group, oldAlertOverride);
- }
- mOldAlertOverrideByGroup.clear();
- // alert that groups changed
- if (mDidGroupsChange) {
- notifyGroupsChanged();
- mDidGroupsChange = false;
+ result += "\n " + child.getSbn()
+ + (child.getDebugThrowable() != null
+ ? Log.getStackTraceString(child.getDebugThrowable())
+ : "");
}
+ result += "\n summary suppressed: " + suppressed;
+ return result;
}
}
@@ -1063,18 +713,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
NotificationGroup group,
boolean suppressed) {}
- /**
- * The alert override of a group has changed.
- *
- * @param group the group that has changed
- * @param oldAlertOverride the previous notification to which the group's alerts were sent
- * @param newAlertOverride the notification to which the group's alerts should now be sent
- */
- default void onGroupAlertOverrideChanged(
- NotificationGroup group,
- @Nullable NotificationEntry oldAlertOverride,
- @Nullable NotificationEntry newAlertOverride) {}
-
/**
* A group of children just received a summary notification and should therefore become
* children of it.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
index 9787a9446019c..3181f520dca22 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
@@ -22,12 +22,12 @@ import android.app.Notification;
import android.os.SystemClock;
import android.service.notification.StatusBarNotification;
import android.util.ArrayMap;
-import android.util.Log;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dependency;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
+import com.android.systemui.statusbar.AlertingNotificationManager;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -41,21 +41,17 @@ import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import java.util.ArrayList;
-import java.util.List;
import java.util.Objects;
/**
* A helper class dealing with the alert interactions between {@link NotificationGroupManagerLegacy}
* and {@link HeadsUpManager}. In particular, this class deals with keeping
- * the correct notification in a group alerting based off the group suppression and alertOverride.
+ * the correct notification in a group alerting based off the group suppression.
*/
public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedListener,
StateListener {
private static final long ALERT_TRANSFER_TIMEOUT = 300;
- private static final String TAG = "NotifGroupAlertTransfer";
- private static final boolean DEBUG = StatusBar.DEBUG;
- private static final boolean SPEW = StatusBar.SPEW;
/**
* The list of entries containing group alert metadata for each group. Keyed by group key.
@@ -146,98 +142,41 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
@Override
public void onGroupSuppressionChanged(NotificationGroup group, boolean suppressed) {
- if (DEBUG) {
- Log.d(TAG, "!! onGroupSuppressionChanged: group.summary=" + group.summary
- + " suppressed=" + suppressed);
+ if (suppressed) {
+ if (mHeadsUpManager.isAlerting(group.summary.getKey())) {
+ handleSuppressedSummaryAlerted(group.summary, mHeadsUpManager);
+ }
+ } else {
+ // Group summary can be null if we are no longer suppressed because the summary was
+ // removed. In that case, we don't need to alert the summary.
+ if (group.summary == null) {
+ return;
+ }
+ GroupAlertEntry groupAlertEntry = mGroupAlertEntries.get(mGroupManager.getGroupKey(
+ group.summary.getSbn()));
+ // Group is no longer suppressed. We should check if we need to transfer the alert
+ // back to the summary now that it's no longer suppressed.
+ if (groupAlertEntry.mAlertSummaryOnNextAddition) {
+ if (!mHeadsUpManager.isAlerting(group.summary.getKey())) {
+ alertNotificationWhenPossible(group.summary, mHeadsUpManager);
+ }
+ groupAlertEntry.mAlertSummaryOnNextAddition = false;
+ } else {
+ checkShouldTransferBack(groupAlertEntry);
+ }
}
- NotificationEntry oldAlertOverride = group.alertOverride;
- onGroupChanged(group, oldAlertOverride);
- }
-
- @Override
- public void onGroupAlertOverrideChanged(NotificationGroup group,
- @Nullable NotificationEntry oldAlertOverride,
- @Nullable NotificationEntry newAlertOverride) {
- if (DEBUG) {
- Log.d(TAG, "!! onGroupAlertOverrideChanged: group.summary=" + group.summary
- + " oldAlertOverride=" + oldAlertOverride
- + " newAlertOverride=" + newAlertOverride);
- }
- onGroupChanged(group, oldAlertOverride);
}
};
- /**
- * Called when either the suppressed or alertOverride fields of the group changed
- *
- * @param group the group which changed
- * @param oldAlertOverride the previous value of group.alertOverride
- */
- private void onGroupChanged(NotificationGroup group,
- NotificationEntry oldAlertOverride) {
- // Group summary can be null if we are no longer suppressed because the summary was
- // removed. In that case, we don't need to alert the summary.
- if (group.summary == null) {
- if (DEBUG) {
- Log.d(TAG, "onGroupChanged: summary is null");
- }
- return;
- }
- if (group.suppressed || group.alertOverride != null) {
- checkForForwardAlertTransfer(group.summary, oldAlertOverride);
- } else {
- if (DEBUG) {
- Log.d(TAG, "onGroupChanged: maybe transfer back");
- }
- GroupAlertEntry groupAlertEntry = mGroupAlertEntries.get(mGroupManager.getGroupKey(
- group.summary.getSbn()));
- // Group is no longer suppressed or overridden.
- // We should check if we need to transfer the alert back to the summary.
- if (groupAlertEntry.mAlertSummaryOnNextAddition) {
- if (!mHeadsUpManager.isAlerting(group.summary.getKey())) {
- alertNotificationWhenPossible(group.summary);
- }
- groupAlertEntry.mAlertSummaryOnNextAddition = false;
- } else {
- checkShouldTransferBack(groupAlertEntry);
- }
- }
- }
-
@Override
public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) {
- if (DEBUG) {
- Log.d(TAG, "!! onHeadsUpStateChanged: entry=" + entry + " isHeadsUp=" + isHeadsUp);
- }
- if (isHeadsUp && entry.getSbn().getNotification().isGroupSummary()) {
- // a group summary is alerting; trigger the forward transfer checks
- checkForForwardAlertTransfer(entry, /* oldAlertOverride */ null);
- }
+ onAlertStateChanged(entry, isHeadsUp, mHeadsUpManager);
}
- /**
- * Handles changes in a group's suppression or alertOverride, but where at least one of those
- * conditions is still true (either the group is suppressed, the group has an alertOverride,
- * or both). The method determined which kind of child needs to receive the alert, finds the
- * entry currently alerting, and makes the transfer.
- *
- * Internally, this is handled with two main cases: the override needs the alert, or there is
- * no override but the summary is suppressed (so an isolated child needs the alert).
- *
- * @param summary the notification entry of the summary of the logical group.
- * @param oldAlertOverride the former value of group.alertOverride, before whatever event
- * required us to check for for a transfer condition.
- */
- private void checkForForwardAlertTransfer(NotificationEntry summary,
- NotificationEntry oldAlertOverride) {
- if (DEBUG) {
- Log.d(TAG, "checkForForwardAlertTransfer: enter");
- }
- NotificationGroup group = mGroupManager.getGroupForSummary(summary.getSbn());
- if (group != null && group.alertOverride != null) {
- handleOverriddenSummaryAlerted(summary);
- } else if (mGroupManager.isSummaryOfSuppressedGroup(summary.getSbn())) {
- handleSuppressedSummaryAlerted(summary, oldAlertOverride);
+ private void onAlertStateChanged(NotificationEntry entry, boolean isAlerting,
+ AlertingNotificationManager alertManager) {
+ if (isAlerting && mGroupManager.isSummaryOfSuppressedGroup(entry.getSbn())) {
+ handleSuppressedSummaryAlerted(entry, alertManager);
}
}
@@ -247,16 +186,9 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
// see as early as we can if we need to abort a transfer.
@Override
public void onPendingEntryAdded(NotificationEntry entry) {
- if (DEBUG) {
- Log.d(TAG, "!! onPendingEntryAdded: entry=" + entry);
- }
String groupKey = mGroupManager.getGroupKey(entry.getSbn());
GroupAlertEntry groupAlertEntry = mGroupAlertEntries.get(groupKey);
- if (groupAlertEntry != null && groupAlertEntry.mGroup.alertOverride == null) {
- // new pending group entries require us to transfer back from the child to the
- // group, but alertOverrides are only present in very limited circumstances, so
- // while it's possible the group should ALSO alert, the previous detection which set
- // this alertOverride won't be invalidated by this notification added to this group.
+ if (groupAlertEntry != null) {
checkShouldTransferBack(groupAlertEntry);
}
}
@@ -330,128 +262,43 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
}
/**
- * Handles the scenario where a summary that has been suppressed is itself, or has a former
- * alertOverride (in the form of an isolated logical child) which was alerted. A suppressed
+ * Handles the scenario where a summary that has been suppressed is alerted. A suppressed
* summary should for all intents and purposes be invisible to the user and as a result should
* not alert. When this is the case, it is our responsibility to pass the alert to the
* appropriate child which will be the representative notification alerting for the group.
*
- * @param summary the summary that is suppressed and (potentially) alerting
- * @param oldAlertOverride the alertOverride before whatever event triggered this method. If
- * the alert override was removed, this will be the entry that should
- * be transferred back from.
+ * @param summary the summary that is suppressed and alerting
+ * @param alertManager the alert manager that manages the alerting summary
*/
private void handleSuppressedSummaryAlerted(@NonNull NotificationEntry summary,
- NotificationEntry oldAlertOverride) {
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: summary=" + summary);
- }
+ @NonNull AlertingNotificationManager alertManager) {
+ StatusBarNotification sbn = summary.getSbn();
GroupAlertEntry groupAlertEntry =
- mGroupAlertEntries.get(mGroupManager.getGroupKey(summary.getSbn()));
-
+ mGroupAlertEntries.get(mGroupManager.getGroupKey(sbn));
if (!mGroupManager.isSummaryOfSuppressedGroup(summary.getSbn())
+ || !alertManager.isAlerting(sbn.getKey())
|| groupAlertEntry == null) {
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: invalid state");
- }
- return;
- }
- boolean summaryIsAlerting = mHeadsUpManager.isAlerting(summary.getKey());
- boolean priorityIsAlerting = oldAlertOverride != null
- && mHeadsUpManager.isAlerting(oldAlertOverride.getKey());
- if (!summaryIsAlerting && !priorityIsAlerting) {
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: no summary or override alerting");
- }
return;
}
if (pendingInflationsWillAddChildren(groupAlertEntry.mGroup)) {
// New children will actually be added to this group, let's not transfer the alert.
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: pending inflations");
- }
return;
}
NotificationEntry child =
mGroupManager.getLogicalChildren(summary.getSbn()).iterator().next();
- if (summaryIsAlerting) {
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: transfer summary -> child");
+ if (child != null) {
+ if (child.getRow().keepInParent()
+ || child.isRowRemoved()
+ || child.isRowDismissed()) {
+ // The notification is actually already removed. No need to alert it.
+ return;
}
- tryTransferAlertState(summary, /*from*/ summary, /*to*/ child, groupAlertEntry);
- return;
- }
- // Summary didn't have the alert, so we're in "transfer back" territory. First, make sure
- // it's not too late to transfer back, then transfer the alert from the oldAlertOverride to
- // the isolated child which should receive the alert.
- if (!canStillTransferBack(groupAlertEntry)) {
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: transfer from override: too late");
- }
- return;
- }
-
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: transfer override -> child");
- }
- tryTransferAlertState(summary, /*from*/ oldAlertOverride, /*to*/ child, groupAlertEntry);
- }
-
- /**
- * Checks for and handles the scenario where the given entry is the summary of a group which
- * has an alertOverride, and either the summary itself or one of its logical isolated children
- * is currently alerting (which happens if the summary is suppressed).
- */
- private void handleOverriddenSummaryAlerted(NotificationEntry summary) {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: summary=" + summary);
- }
- GroupAlertEntry groupAlertEntry =
- mGroupAlertEntries.get(mGroupManager.getGroupKey(summary.getSbn()));
- NotificationGroup group = mGroupManager.getGroupForSummary(summary.getSbn());
- if (group == null || group.alertOverride == null || groupAlertEntry == null) {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: invalid state");
- }
- return;
- }
- boolean summaryIsAlerting = mHeadsUpManager.isAlerting(summary.getKey());
- if (summaryIsAlerting) {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: transfer summary -> override");
- }
- tryTransferAlertState(summary, /*from*/ summary, group.alertOverride, groupAlertEntry);
- return;
- }
- // Summary didn't have the alert, so we're in "transfer back" territory. First, make sure
- // it's not too late to transfer back, then remove the alert from any of the logical
- // children, and if one of them was alerting, we can alert the override.
- if (!canStillTransferBack(groupAlertEntry)) {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: transfer from child: too late");
- }
- return;
- }
- List children = mGroupManager.getLogicalChildren(summary.getSbn());
- if (children == null) {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: no children");
- }
- return;
- }
- children.remove(group.alertOverride); // do not release the alert on our desired destination
- boolean releasedChild = releaseChildAlerts(children);
- if (releasedChild) {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: transfer child -> override");
- }
- tryTransferAlertState(summary, /*from*/ null, group.alertOverride, groupAlertEntry);
- } else {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: no child alert released");
+ if (!alertManager.isAlerting(child.getKey()) && onlySummaryAlerts(summary)) {
+ groupAlertEntry.mLastAlertTransferTime = SystemClock.elapsedRealtime();
}
+ transferAlertState(summary, child, alertManager);
}
}
@@ -460,37 +307,14 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
* immediately to have the incorrect one up as short as possible. The second should alert
* when possible.
*
- * @param summary entry of the summary
* @param fromEntry entry to transfer alert from
* @param toEntry entry to transfer to
+ * @param alertManager alert manager for the alert type
*/
- private void tryTransferAlertState(
- NotificationEntry summary,
- NotificationEntry fromEntry,
- NotificationEntry toEntry,
- GroupAlertEntry groupAlertEntry) {
- if (toEntry != null) {
- if (toEntry.getRow().keepInParent()
- || toEntry.isRowRemoved()
- || toEntry.isRowDismissed()) {
- // The notification is actually already removed. No need to alert it.
- return;
- }
- if (!mHeadsUpManager.isAlerting(toEntry.getKey()) && onlySummaryAlerts(summary)) {
- groupAlertEntry.mLastAlertTransferTime = SystemClock.elapsedRealtime();
- }
- if (DEBUG) {
- Log.d(TAG, "transferAlertState: fromEntry=" + fromEntry + " toEntry=" + toEntry);
- }
- transferAlertState(fromEntry, toEntry);
- }
- }
- private void transferAlertState(@Nullable NotificationEntry fromEntry,
- @NonNull NotificationEntry toEntry) {
- if (fromEntry != null) {
- mHeadsUpManager.removeNotification(fromEntry.getKey(), true /* releaseImmediately */);
- }
- alertNotificationWhenPossible(toEntry);
+ private void transferAlertState(@NonNull NotificationEntry fromEntry, @NonNull NotificationEntry toEntry,
+ @NonNull AlertingNotificationManager alertManager) {
+ alertManager.removeNotification(fromEntry.getKey(), true /* releaseImmediately */);
+ alertNotificationWhenPossible(toEntry, alertManager);
}
/**
@@ -502,13 +326,11 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
* more children are coming. Thus, if a child is added within a certain timeframe after we
* transfer, we back out and alert the summary again.
*
- * An alert can only transfer back within a small window of time after a transfer away from the
- * summary to a child happened.
- *
* @param groupAlertEntry group alert entry to check
*/
private void checkShouldTransferBack(@NonNull GroupAlertEntry groupAlertEntry) {
- if (canStillTransferBack(groupAlertEntry)) {
+ if (SystemClock.elapsedRealtime() - groupAlertEntry.mLastAlertTransferTime
+ < ALERT_TRANSFER_TIMEOUT) {
NotificationEntry summary = groupAlertEntry.mGroup.summary;
if (!onlySummaryAlerts(summary)) {
@@ -516,17 +338,30 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
}
ArrayList children = mGroupManager.getLogicalChildren(
summary.getSbn());
- int numActiveChildren = children.size();
+ int numChildren = children.size();
int numPendingChildren = getPendingChildrenNotAlerting(groupAlertEntry.mGroup);
- int numChildren = numActiveChildren + numPendingChildren;
+ numChildren += numPendingChildren;
if (numChildren <= 1) {
return;
}
- boolean releasedChild = releaseChildAlerts(children);
+ boolean releasedChild = false;
+ for (int i = 0; i < children.size(); i++) {
+ NotificationEntry entry = children.get(i);
+ if (onlySummaryAlerts(entry) && mHeadsUpManager.isAlerting(entry.getKey())) {
+ releasedChild = true;
+ mHeadsUpManager.removeNotification(
+ entry.getKey(), true /* releaseImmediately */);
+ }
+ if (mPendingAlerts.containsKey(entry.getKey())) {
+ // This is the child that would've been removed if it was inflated.
+ releasedChild = true;
+ mPendingAlerts.get(entry.getKey()).mAbortOnInflation = true;
+ }
+ }
if (releasedChild && !mHeadsUpManager.isAlerting(summary.getKey())) {
- boolean notifyImmediately = numActiveChildren > 1;
+ boolean notifyImmediately = (numChildren - numPendingChildren) > 1;
if (notifyImmediately) {
- alertNotificationWhenPossible(summary);
+ alertNotificationWhenPossible(summary, mHeadsUpManager);
} else {
// Should wait until the pending child inflates before alerting.
groupAlertEntry.mAlertSummaryOnNextAddition = true;
@@ -536,61 +371,25 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
}
}
- private boolean canStillTransferBack(@NonNull GroupAlertEntry groupAlertEntry) {
- return SystemClock.elapsedRealtime() - groupAlertEntry.mLastAlertTransferTime
- < ALERT_TRANSFER_TIMEOUT;
- }
-
- private boolean releaseChildAlerts(List children) {
- boolean releasedChild = false;
- if (SPEW) {
- Log.d(TAG, "releaseChildAlerts: numChildren=" + children.size());
- }
- for (int i = 0; i < children.size(); i++) {
- NotificationEntry entry = children.get(i);
- if (SPEW) {
- Log.d(TAG, "releaseChildAlerts: checking i=" + i + " entry=" + entry
- + " onlySummaryAlerts=" + onlySummaryAlerts(entry)
- + " isAlerting=" + mHeadsUpManager.isAlerting(entry.getKey())
- + " isPendingAlert=" + mPendingAlerts.containsKey(entry.getKey()));
- }
- if (onlySummaryAlerts(entry) && mHeadsUpManager.isAlerting(entry.getKey())) {
- releasedChild = true;
- mHeadsUpManager.removeNotification(
- entry.getKey(), true /* releaseImmediately */);
- }
- if (mPendingAlerts.containsKey(entry.getKey())) {
- // This is the child that would've been removed if it was inflated.
- releasedChild = true;
- mPendingAlerts.get(entry.getKey()).mAbortOnInflation = true;
- }
- }
- if (SPEW) {
- Log.d(TAG, "releaseChildAlerts: didRelease=" + releasedChild);
- }
- return releasedChild;
- }
-
/**
* Tries to alert the notification. If its content view is not inflated, we inflate and continue
* when the entry finishes inflating the view.
*
* @param entry entry to show
+ * @param alertManager alert manager for the alert type
*/
- private void alertNotificationWhenPossible(@NonNull NotificationEntry entry) {
- @InflationFlag int contentFlag = mHeadsUpManager.getContentFlag();
+ private void alertNotificationWhenPossible(@NonNull NotificationEntry entry,
+ @NonNull AlertingNotificationManager alertManager) {
+ @InflationFlag int contentFlag = alertManager.getContentFlag();
final RowContentBindParams params = mRowContentBindStage.getStageParams(entry);
if ((params.getContentViews() & contentFlag) == 0) {
- if (DEBUG) {
- Log.d(TAG, "alertNotificationWhenPossible: async requestRebind entry=" + entry);
- }
mPendingAlerts.put(entry.getKey(), new PendingAlertInfo(entry));
params.requireContentViews(contentFlag);
mRowContentBindStage.requestRebind(entry, en -> {
PendingAlertInfo alertInfo = mPendingAlerts.remove(entry.getKey());
if (alertInfo != null) {
if (alertInfo.isStillValid()) {
- alertNotificationWhenPossible(entry);
+ alertNotificationWhenPossible(entry, mHeadsUpManager);
} else {
// The transfer is no longer valid. Free the content.
mRowContentBindStage.getStageParams(entry).markContentViewsFreeable(
@@ -601,16 +400,10 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
});
return;
}
- if (mHeadsUpManager.isAlerting(entry.getKey())) {
- if (DEBUG) {
- Log.d(TAG, "alertNotificationWhenPossible: continue alerting entry=" + entry);
- }
- mHeadsUpManager.updateNotification(entry.getKey(), true /* alert */);
+ if (alertManager.isAlerting(entry.getKey())) {
+ alertManager.updateNotification(entry.getKey(), true /* alert */);
} else {
- if (DEBUG) {
- Log.d(TAG, "alertNotificationWhenPossible: start alerting entry=" + entry);
- }
- mHeadsUpManager.showNotification(entry);
+ alertManager.showNotification(entry);
}
}
From c90d868b6eb5757cf776371bac70e0889c922855 Mon Sep 17 00:00:00 2001
From: Daniel Chapin
Date: Mon, 3 May 2021 19:55:48 +0000
Subject: [PATCH 050/176] Revert "Fix VIP conversations alerting incorrectly."
This reverts commit 64c85ac6f5f20d031a7e192366b8335fab0253c2.
Reason for revert: DF blocking Bug: 187009701
Change-Id: I04dfdf20ad5c7df3c6dddf0cc12540b179162f0b
(cherry picked from commit 25c273584ad92f566c41c635a886be9375f50d39)
---
.../statusbar/NotificationListener.java | 3 +-
.../NotificationGroupManagerLegacy.java | 438 ++----------------
.../NotificationGroupAlertTransferHelper.java | 365 ++++-----------
3 files changed, 118 insertions(+), 688 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
index 5437ce63475ec..7f31fddbfb6c3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar;
import static com.android.systemui.statusbar.RemoteInputController.processForRemoteInput;
import static com.android.systemui.statusbar.notification.NotificationEntryManager.UNDEFINED_DISMISS_REASON;
+import static com.android.systemui.statusbar.phone.StatusBar.DEBUG;
import android.annotation.NonNull;
import android.annotation.SuppressLint;
@@ -34,7 +35,6 @@ import android.util.Log;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.statusbar.dagger.StatusBarModule;
import com.android.systemui.statusbar.phone.NotificationListenerWithPlugins;
-import com.android.systemui.statusbar.phone.StatusBar;
import java.util.ArrayList;
import java.util.List;
@@ -46,7 +46,6 @@ import java.util.List;
@SuppressLint("OverrideAbstract")
public class NotificationListener extends NotificationListenerWithPlugins {
private static final String TAG = "NotificationListener";
- private static final boolean DEBUG = StatusBar.DEBUG;
private final Context mContext;
private final NotificationManager mNotificationManager;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java
index d95c265c14608..d6356de5ea51b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java
@@ -16,9 +16,7 @@
package com.android.systemui.statusbar.notification.collection.legacy;
-import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.app.Notification;
import android.service.notification.StatusBarNotification;
import android.util.ArraySet;
import android.util.Log;
@@ -33,7 +31,6 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier;
-import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.wm.shell.bubbles.Bubbles;
@@ -42,12 +39,10 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
-import java.util.TreeSet;
import javax.inject.Inject;
@@ -63,21 +58,13 @@ import dagger.Lazy;
public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener, StateListener,
GroupMembershipManager, GroupExpansionManager, Dumpable {
- private static final String TAG = "NotifGroupManager";
- private static final boolean DEBUG = StatusBar.DEBUG;
- private static final boolean SPEW = StatusBar.SPEW;
- /**
- * The maximum amount of time (in ms) between the posting of notifications that can be
- * considered part of the same update batch.
- */
- private static final long POST_BATCH_MAX_AGE = 5000;
+ private static final String TAG = "NotificationGroupManager";
private final HashMap mGroupMap = new HashMap<>();
private final ArraySet mExpansionChangeListeners =
new ArraySet<>();
private final ArraySet mGroupChangeListeners = new ArraySet<>();
private final Lazy mPeopleNotificationIdentifier;
private final Optional mBubblesOptional;
- private final EventBuffer mEventBuffer = new EventBuffer();
private int mBarState = -1;
private HashMap mIsolatedEntries = new HashMap<>();
private HeadsUpManager mHeadsUpManager;
@@ -147,14 +134,8 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
* When we want to remove an entry from being tracked for grouping
*/
public void onEntryRemoved(NotificationEntry removed) {
- if (SPEW) {
- Log.d(TAG, "onEntryRemoved: entry=" + removed);
- }
onEntryRemovedInternal(removed, removed.getSbn());
- StatusBarNotification oldSbn = mIsolatedEntries.remove(removed.getKey());
- if (oldSbn != null) {
- updateSuppression(mGroupMap.get(oldSbn.getGroupKey()));
- }
+ mIsolatedEntries.remove(removed.getKey());
}
/**
@@ -181,9 +162,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
// the close future. See b/23676310 for reference.
return;
}
- if (SPEW) {
- Log.d(TAG, "onEntryRemovedInternal: entry=" + removed + " group=" + group.groupKey);
- }
if (isGroupChild(removed.getKey(), isGroup, isGroupSummary)) {
group.children.remove(removed.getKey());
} else {
@@ -204,9 +182,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
* Notify the group manager that a new entry was added
*/
public void onEntryAdded(final NotificationEntry added) {
- if (SPEW) {
- Log.d(TAG, "onEntryAdded: entry=" + added);
- }
updateIsolation(added);
onEntryAddedInternal(added);
}
@@ -220,16 +195,13 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
String groupKey = getGroupKey(sbn);
NotificationGroup group = mGroupMap.get(groupKey);
if (group == null) {
- group = new NotificationGroup(groupKey);
+ group = new NotificationGroup();
mGroupMap.put(groupKey, group);
for (OnGroupChangeListener listener : mGroupChangeListeners) {
listener.onGroupCreated(group, groupKey);
}
}
- if (SPEW) {
- Log.d(TAG, "onEntryAddedInternal: entry=" + added + " group=" + group.groupKey);
- }
if (isGroupChild) {
NotificationEntry existing = group.children.get(added.getKey());
if (existing != null && existing != added) {
@@ -241,11 +213,9 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
+ " added removed" + added.isRowRemoved(), new Throwable());
}
group.children.put(added.getKey(), added);
- addToPostBatchHistory(group, added);
updateSuppression(group);
} else {
group.summary = added;
- addToPostBatchHistory(group, added);
group.expanded = added.areChildrenExpanded();
updateSuppression(group);
if (!group.children.isEmpty()) {
@@ -261,27 +231,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
}
}
- private void addToPostBatchHistory(NotificationGroup group, @Nullable NotificationEntry entry) {
- if (entry == null) {
- return;
- }
- boolean didAdd = group.postBatchHistory.add(new PostRecord(entry));
- if (didAdd) {
- trimPostBatchHistory(group.postBatchHistory);
- }
- }
-
- /** remove all history that's too old to be in the batch. */
- private void trimPostBatchHistory(@NonNull TreeSet postBatchHistory) {
- if (postBatchHistory.size() <= 1) {
- return;
- }
- long batchStartTime = postBatchHistory.last().postTime - POST_BATCH_MAX_AGE;
- while (!postBatchHistory.isEmpty() && postBatchHistory.first().postTime < batchStartTime) {
- postBatchHistory.pollFirst();
- }
- }
-
private void onEntryBecomingChild(NotificationEntry entry) {
updateIsolation(entry);
}
@@ -290,9 +239,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
if (group == null) {
return;
}
- NotificationEntry prevAlertOverride = group.alertOverride;
- group.alertOverride = getPriorityConversationAlertOverride(group);
-
int childCount = 0;
boolean hasBubbles = false;
for (NotificationEntry entry : group.children.values()) {
@@ -309,148 +255,18 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
group.suppressed = group.summary != null && !group.expanded
&& (childCount == 1
|| (childCount == 0
- && group.summary.getSbn().getNotification().isGroupSummary()
- && (hasIsolatedChildren(group) || hasBubbles)));
-
- boolean alertOverrideChanged = prevAlertOverride != group.alertOverride;
- boolean suppressionChanged = prevSuppressed != group.suppressed;
- if (alertOverrideChanged || suppressionChanged) {
- if (DEBUG && alertOverrideChanged) {
- Log.d(TAG, group + " alertOverride was=" + prevAlertOverride + " now="
- + group.alertOverride);
- }
- if (DEBUG && suppressionChanged) {
- Log.d(TAG, group + " suppressed changed to " + group.suppressed);
- }
- if (!mIsUpdatingUnchangedGroup) {
- if (alertOverrideChanged) {
- mEventBuffer.notifyAlertOverrideChanged(group, prevAlertOverride);
- }
- if (suppressionChanged) {
- for (OnGroupChangeListener listener : mGroupChangeListeners) {
- listener.onGroupSuppressionChanged(group, group.suppressed);
- }
- }
- mEventBuffer.notifyGroupsChanged();
- } else {
- if (DEBUG) {
- Log.d(TAG, group + " did not notify listeners of above change(s)");
+ && group.summary.getSbn().getNotification().isGroupSummary()
+ && (hasIsolatedChildren(group) || hasBubbles)));
+ if (prevSuppressed != group.suppressed) {
+ for (OnGroupChangeListener listener : mGroupChangeListeners) {
+ if (!mIsUpdatingUnchangedGroup) {
+ listener.onGroupSuppressionChanged(group, group.suppressed);
+ listener.onGroupsChanged();
}
}
}
}
- /**
- * Finds the isolated logical child of this group which is should be alerted instead.
- *
- * Notifications from priority conversations are isolated from their groups to make them more
- * prominent, however apps may post these with a GroupAlertBehavior that has the group receiving
- * the alert. This would lead to the group alerting even though the conversation that was
- * updated was not actually a part of that group. This method finds the best priority
- * conversation in this situation, if there is one, so they can be set as the alertOverride of
- * the group.
- *
- * @param group the group to check
- * @return the entry which should receive the alert instead of the group, if any.
- */
- @Nullable
- private NotificationEntry getPriorityConversationAlertOverride(NotificationGroup group) {
- // GOAL: if there is a priority child which wouldn't alert based on its groupAlertBehavior,
- // but which should be alerting (because priority conversations are isolated), find it.
- if (group == null || group.summary == null) {
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: null group or summary");
- }
- return null;
- }
- if (isIsolated(group.summary.getKey())) {
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: isolated group");
- }
- return null;
- }
-
- // Precondiions:
- // * Only necessary when all notifications in the group use GROUP_ALERT_SUMMARY
- // * Only necessary when at least one notification in the group is on a priority channel
- if (group.summary.getSbn().getNotification().getGroupAlertBehavior()
- != Notification.GROUP_ALERT_SUMMARY) {
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: summary != GROUP_ALERT_SUMMARY");
- }
- return null;
- }
-
- // Get the important children first, copy the keys for the final importance check,
- // then add the non-isolated children to the map for unified lookup.
- HashMap children = getImportantConversations(group);
- if (children == null || children.isEmpty()) {
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: no important conversations");
- }
- return null;
- }
- HashSet importantChildKeys = new HashSet<>(children.keySet());
- children.putAll(group.children);
-
- // Ensure all children have GROUP_ALERT_SUMMARY
- for (NotificationEntry child : children.values()) {
- if (child.getSbn().getNotification().getGroupAlertBehavior()
- != Notification.GROUP_ALERT_SUMMARY) {
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: "
- + "child != GROUP_ALERT_SUMMARY");
- }
- return null;
- }
- }
-
- // Create a merged post history from all the children
- TreeSet combinedHistory = new TreeSet<>(group.postBatchHistory);
- for (String importantChildKey : importantChildKeys) {
- NotificationGroup importantChildGroup = mGroupMap.get(importantChildKey);
- combinedHistory.addAll(importantChildGroup.postBatchHistory);
- }
- trimPostBatchHistory(combinedHistory);
-
- // This is a streamlined implementation of the following idea:
- // * From the subset of notifications in the latest 'batch' of updates. A batch is:
- // * Notifs posted less than POST_BATCH_MAX_AGE before the most recently posted.
- // * Only including notifs newer than the second-to-last post of any notification.
- // * Find the newest child in the batch -- the with the largest 'when' value.
- // * If the newest child is a priority conversation, set that as the override.
- HashSet batchKeys = new HashSet<>();
- long newestChildWhen = -1;
- NotificationEntry newestChild = null;
- // Iterate backwards through the post history, tracking the child with the smallest sort key
- for (PostRecord record : combinedHistory.descendingSet()) {
- if (batchKeys.contains(record.key)) {
- // Once you see a notification again, the batch has ended
- break;
- }
- batchKeys.add(record.key);
- NotificationEntry child = children.get(record.key);
- if (child != null) {
- long childWhen = child.getSbn().getNotification().when;
- if (newestChild == null || childWhen > newestChildWhen) {
- newestChildWhen = childWhen;
- newestChild = child;
- }
- }
- }
- if (newestChild != null && importantChildKeys.contains(newestChild.getKey())) {
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: result=" + newestChild);
- }
- return newestChild;
- }
- if (SPEW) {
- Log.d(TAG, "getPriorityConversationAlertOverride: result=null, newestChild="
- + newestChild);
- }
- return null;
- }
-
private boolean hasIsolatedChildren(NotificationGroup group) {
return getNumberOfIsolatedChildren(group.summary.getSbn().getGroupKey()) != 0;
}
@@ -465,33 +281,12 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
return count;
}
- @Nullable
- private HashMap getImportantConversations(NotificationGroup group) {
- String groupKey = group.summary.getSbn().getGroupKey();
- HashMap result = null;
- for (StatusBarNotification sbn : mIsolatedEntries.values()) {
- if (sbn.getGroupKey().equals(groupKey)) {
- NotificationEntry entry = mGroupMap.get(sbn.getKey()).summary;
- if (isImportantConversation(entry)) {
- if (result == null) {
- result = new HashMap<>();
- }
- result.put(sbn.getKey(), entry);
- }
- }
- }
- return result;
- }
-
/**
* Update an entry's group information
* @param entry notification entry to update
* @param oldNotification previous notification info before this update
*/
public void onEntryUpdated(NotificationEntry entry, StatusBarNotification oldNotification) {
- if (SPEW) {
- Log.d(TAG, "onEntryUpdated: entry=" + entry);
- }
onEntryUpdated(entry, oldNotification.getGroupKey(), oldNotification.isGroup(),
oldNotification.getNotification().isGroupSummary());
}
@@ -530,17 +325,7 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
* Whether the given notification is the summary of a group that is being suppressed
*/
public boolean isSummaryOfSuppressedGroup(StatusBarNotification sbn) {
- return sbn.getNotification().isGroupSummary() && isGroupSuppressed(getGroupKey(sbn));
- }
-
- /**
- * If the given notification is a summary, get the group for it.
- */
- public NotificationGroup getGroupForSummary(StatusBarNotification sbn) {
- if (sbn.getNotification().isGroupSummary()) {
- return mGroupMap.get(getGroupKey(sbn));
- }
- return null;
+ return isGroupSuppressed(getGroupKey(sbn)) && sbn.getNotification().isGroupSummary();
}
private boolean isOnlyChild(StatusBarNotification sbn) {
@@ -760,7 +545,9 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
if (!sbn.isGroup() || sbn.getNotification().isGroupSummary()) {
return false;
}
- if (isImportantConversation(entry)) {
+ int peopleNotificationType =
+ mPeopleNotificationIdentifier.get().getPeopleNotificationType(entry);
+ if (peopleNotificationType == PeopleNotificationIdentifier.TYPE_IMPORTANT_PERSON) {
return true;
}
if (mHeadsUpManager != null && !mHeadsUpManager.isAlerting(entry.getKey())) {
@@ -773,25 +560,18 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
|| isGroupNotFullyVisible(notificationGroup));
}
- private boolean isImportantConversation(NotificationEntry entry) {
- int peopleNotificationType =
- mPeopleNotificationIdentifier.get().getPeopleNotificationType(entry);
- return peopleNotificationType == PeopleNotificationIdentifier.TYPE_IMPORTANT_PERSON;
- }
-
/**
* Isolate a notification from its group so that it visually shows as its own group.
*
* @param entry the notification to isolate
*/
private void isolateNotification(NotificationEntry entry) {
- if (SPEW) {
- Log.d(TAG, "isolateNotification: entry=" + entry);
- }
+ StatusBarNotification sbn = entry.getSbn();
+
// We will be isolated now, so lets update the groups
onEntryRemovedInternal(entry, entry.getSbn());
- mIsolatedEntries.put(entry.getKey(), entry.getSbn());
+ mIsolatedEntries.put(sbn.getKey(), sbn);
onEntryAddedInternal(entry);
// We also need to update the suppression of the old group, because this call comes
@@ -808,14 +588,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
* Update the isolation of an entry, splitting it from the group.
*/
public void updateIsolation(NotificationEntry entry) {
- // We need to buffer a few events because we do isolation changes in 3 steps:
- // removeInternal, update mIsolatedEntries, addInternal. This means that often the
- // alertOverride will update on the removal, however processing the event in that case can
- // cause problems because the mIsolatedEntries map is not in its final state, so the event
- // listener may be unable to correctly determine the true state of the group. By delaying
- // the alertOverride change until after the add phase, we can ensure that listeners only
- // have to handle a consistent state.
- mEventBuffer.startBuffering();
boolean isIsolated = isIsolated(entry.getSbn().getKey());
if (shouldIsolate(entry)) {
if (!isIsolated) {
@@ -824,7 +596,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
} else if (isIsolated) {
stopIsolatingNotification(entry);
}
- mEventBuffer.flushAndStopBuffering();
}
/**
@@ -833,15 +604,15 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
* @param entry the notification to un-isolate
*/
private void stopIsolatingNotification(NotificationEntry entry) {
- if (SPEW) {
- Log.d(TAG, "stopIsolatingNotification: entry=" + entry);
- }
- // not isolated anymore, we need to update the groups
- onEntryRemovedInternal(entry, entry.getSbn());
- mIsolatedEntries.remove(entry.getKey());
- onEntryAddedInternal(entry);
- for (OnGroupChangeListener listener : mGroupChangeListeners) {
- listener.onGroupsChanged();
+ StatusBarNotification sbn = entry.getSbn();
+ if (isIsolated(sbn.getKey())) {
+ // not isolated anymore, we need to update the groups
+ onEntryRemovedInternal(entry, entry.getSbn());
+ mIsolatedEntries.remove(sbn.getKey());
+ onEntryAddedInternal(entry);
+ for (OnGroupChangeListener listener : mGroupChangeListeners) {
+ listener.onGroupsChanged();
+ }
}
}
@@ -876,155 +647,34 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
setStatusBarState(newState);
}
- /**
- * A record of a notification being posted, containing the time of the post and the key of the
- * notification entry. These are stored in a TreeSet by the NotificationGroup and used to
- * calculate a batch of notifications.
- */
- public static class PostRecord implements Comparable {
- public final long postTime;
- public final String key;
-
- /** constructs a record containing the post time and key from the notification entry */
- public PostRecord(@NonNull NotificationEntry entry) {
- this.postTime = entry.getSbn().getPostTime();
- this.key = entry.getKey();
- }
-
- @Override
- public int compareTo(PostRecord o) {
- int postTimeComparison = Long.compare(this.postTime, o.postTime);
- return postTimeComparison == 0
- ? String.CASE_INSENSITIVE_ORDER.compare(this.key, o.key)
- : postTimeComparison;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- PostRecord that = (PostRecord) o;
- return postTime == that.postTime && key.equals(that.key);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(postTime, key);
- }
- }
-
/**
* Represents a notification group in the notification shade.
*/
public static class NotificationGroup {
- public final String groupKey;
public final HashMap children = new HashMap<>();
- public final TreeSet postBatchHistory = new TreeSet<>();
public NotificationEntry summary;
public boolean expanded;
/**
* Is this notification group suppressed, i.e its summary is hidden
*/
public boolean suppressed;
- /**
- * The child (which is isolated from this group) to which the alert should be transferred,
- * due to priority conversations.
- */
- public NotificationEntry alertOverride;
-
- NotificationGroup(String groupKey) {
- this.groupKey = groupKey;
- }
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append(" groupKey: ").append(groupKey);
- sb.append("\n summary:");
- appendEntry(sb, summary);
- sb.append("\n children size: ").append(children.size());
+ String result = " summary:\n "
+ + (summary != null ? summary.getSbn() : "null")
+ + (summary != null && summary.getDebugThrowable() != null
+ ? Log.getStackTraceString(summary.getDebugThrowable())
+ : "");
+ result += "\n children size: " + children.size();
for (NotificationEntry child : children.values()) {
- appendEntry(sb, child);
- }
- sb.append("\n alertOverride:");
- appendEntry(sb, alertOverride);
- sb.append("\n summary suppressed: ").append(suppressed);
- return sb.toString();
- }
-
- private void appendEntry(StringBuilder sb, NotificationEntry entry) {
- sb.append("\n ").append(entry != null ? entry.getSbn() : "null");
- if (entry != null && entry.getDebugThrowable() != null) {
- sb.append(Log.getStackTraceString(entry.getDebugThrowable()));
- }
- }
- }
-
- /**
- * This class is a toggleable buffer for a subset of events of {@link OnGroupChangeListener}.
- * When buffering, instead of notifying the listeners it will set internal state that will allow
- * it to notify listeners of those events later
- */
- private class EventBuffer {
- private final HashMap mOldAlertOverrideByGroup = new HashMap<>();
- private boolean mIsBuffering = false;
- private boolean mDidGroupsChange = false;
-
- void notifyAlertOverrideChanged(NotificationGroup group,
- NotificationEntry oldAlertOverride) {
- if (mIsBuffering) {
- // The value in this map is the override before the event. If there is an entry
- // already in the map, then we are effectively coalescing two events, which means
- // we need to preserve the original initial value.
- mOldAlertOverrideByGroup.putIfAbsent(group.groupKey, oldAlertOverride);
- } else {
- for (OnGroupChangeListener listener : mGroupChangeListeners) {
- listener.onGroupAlertOverrideChanged(group, oldAlertOverride,
- group.alertOverride);
- }
- }
- }
-
- void notifyGroupsChanged() {
- if (mIsBuffering) {
- mDidGroupsChange = true;
- } else {
- for (OnGroupChangeListener listener : mGroupChangeListeners) {
- listener.onGroupsChanged();
- }
- }
- }
-
- void startBuffering() {
- mIsBuffering = true;
- }
-
- void flushAndStopBuffering() {
- // stop buffering so that we can call our own helpers
- mIsBuffering = false;
- // alert all group alert override changes for groups that were not removed
- for (Map.Entry entry : mOldAlertOverrideByGroup.entrySet()) {
- NotificationGroup group = mGroupMap.get(entry.getKey());
- if (group == null) {
- // The group can be null if this alertOverride changed before the group was
- // permanently removed, meaning that there's no guarantee that listeners will
- // that field clear.
- continue;
- }
- NotificationEntry oldAlertOverride = entry.getValue();
- if (group.alertOverride == oldAlertOverride) {
- // If the final alertOverride equals the initial, it means we coalesced two
- // events which undid the change, so we can drop it entirely.
- continue;
- }
- notifyAlertOverrideChanged(group, oldAlertOverride);
- }
- mOldAlertOverrideByGroup.clear();
- // alert that groups changed
- if (mDidGroupsChange) {
- notifyGroupsChanged();
- mDidGroupsChange = false;
+ result += "\n " + child.getSbn()
+ + (child.getDebugThrowable() != null
+ ? Log.getStackTraceString(child.getDebugThrowable())
+ : "");
}
+ result += "\n summary suppressed: " + suppressed;
+ return result;
}
}
@@ -1063,18 +713,6 @@ public class NotificationGroupManagerLegacy implements OnHeadsUpChangedListener,
NotificationGroup group,
boolean suppressed) {}
- /**
- * The alert override of a group has changed.
- *
- * @param group the group that has changed
- * @param oldAlertOverride the previous notification to which the group's alerts were sent
- * @param newAlertOverride the notification to which the group's alerts should now be sent
- */
- default void onGroupAlertOverrideChanged(
- NotificationGroup group,
- @Nullable NotificationEntry oldAlertOverride,
- @Nullable NotificationEntry newAlertOverride) {}
-
/**
* A group of children just received a summary notification and should therefore become
* children of it.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
index 9787a9446019c..3181f520dca22 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
@@ -22,12 +22,12 @@ import android.app.Notification;
import android.os.SystemClock;
import android.service.notification.StatusBarNotification;
import android.util.ArrayMap;
-import android.util.Log;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dependency;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
+import com.android.systemui.statusbar.AlertingNotificationManager;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -41,21 +41,17 @@ import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import java.util.ArrayList;
-import java.util.List;
import java.util.Objects;
/**
* A helper class dealing with the alert interactions between {@link NotificationGroupManagerLegacy}
* and {@link HeadsUpManager}. In particular, this class deals with keeping
- * the correct notification in a group alerting based off the group suppression and alertOverride.
+ * the correct notification in a group alerting based off the group suppression.
*/
public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedListener,
StateListener {
private static final long ALERT_TRANSFER_TIMEOUT = 300;
- private static final String TAG = "NotifGroupAlertTransfer";
- private static final boolean DEBUG = StatusBar.DEBUG;
- private static final boolean SPEW = StatusBar.SPEW;
/**
* The list of entries containing group alert metadata for each group. Keyed by group key.
@@ -146,98 +142,41 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
@Override
public void onGroupSuppressionChanged(NotificationGroup group, boolean suppressed) {
- if (DEBUG) {
- Log.d(TAG, "!! onGroupSuppressionChanged: group.summary=" + group.summary
- + " suppressed=" + suppressed);
+ if (suppressed) {
+ if (mHeadsUpManager.isAlerting(group.summary.getKey())) {
+ handleSuppressedSummaryAlerted(group.summary, mHeadsUpManager);
+ }
+ } else {
+ // Group summary can be null if we are no longer suppressed because the summary was
+ // removed. In that case, we don't need to alert the summary.
+ if (group.summary == null) {
+ return;
+ }
+ GroupAlertEntry groupAlertEntry = mGroupAlertEntries.get(mGroupManager.getGroupKey(
+ group.summary.getSbn()));
+ // Group is no longer suppressed. We should check if we need to transfer the alert
+ // back to the summary now that it's no longer suppressed.
+ if (groupAlertEntry.mAlertSummaryOnNextAddition) {
+ if (!mHeadsUpManager.isAlerting(group.summary.getKey())) {
+ alertNotificationWhenPossible(group.summary, mHeadsUpManager);
+ }
+ groupAlertEntry.mAlertSummaryOnNextAddition = false;
+ } else {
+ checkShouldTransferBack(groupAlertEntry);
+ }
}
- NotificationEntry oldAlertOverride = group.alertOverride;
- onGroupChanged(group, oldAlertOverride);
- }
-
- @Override
- public void onGroupAlertOverrideChanged(NotificationGroup group,
- @Nullable NotificationEntry oldAlertOverride,
- @Nullable NotificationEntry newAlertOverride) {
- if (DEBUG) {
- Log.d(TAG, "!! onGroupAlertOverrideChanged: group.summary=" + group.summary
- + " oldAlertOverride=" + oldAlertOverride
- + " newAlertOverride=" + newAlertOverride);
- }
- onGroupChanged(group, oldAlertOverride);
}
};
- /**
- * Called when either the suppressed or alertOverride fields of the group changed
- *
- * @param group the group which changed
- * @param oldAlertOverride the previous value of group.alertOverride
- */
- private void onGroupChanged(NotificationGroup group,
- NotificationEntry oldAlertOverride) {
- // Group summary can be null if we are no longer suppressed because the summary was
- // removed. In that case, we don't need to alert the summary.
- if (group.summary == null) {
- if (DEBUG) {
- Log.d(TAG, "onGroupChanged: summary is null");
- }
- return;
- }
- if (group.suppressed || group.alertOverride != null) {
- checkForForwardAlertTransfer(group.summary, oldAlertOverride);
- } else {
- if (DEBUG) {
- Log.d(TAG, "onGroupChanged: maybe transfer back");
- }
- GroupAlertEntry groupAlertEntry = mGroupAlertEntries.get(mGroupManager.getGroupKey(
- group.summary.getSbn()));
- // Group is no longer suppressed or overridden.
- // We should check if we need to transfer the alert back to the summary.
- if (groupAlertEntry.mAlertSummaryOnNextAddition) {
- if (!mHeadsUpManager.isAlerting(group.summary.getKey())) {
- alertNotificationWhenPossible(group.summary);
- }
- groupAlertEntry.mAlertSummaryOnNextAddition = false;
- } else {
- checkShouldTransferBack(groupAlertEntry);
- }
- }
- }
-
@Override
public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) {
- if (DEBUG) {
- Log.d(TAG, "!! onHeadsUpStateChanged: entry=" + entry + " isHeadsUp=" + isHeadsUp);
- }
- if (isHeadsUp && entry.getSbn().getNotification().isGroupSummary()) {
- // a group summary is alerting; trigger the forward transfer checks
- checkForForwardAlertTransfer(entry, /* oldAlertOverride */ null);
- }
+ onAlertStateChanged(entry, isHeadsUp, mHeadsUpManager);
}
- /**
- * Handles changes in a group's suppression or alertOverride, but where at least one of those
- * conditions is still true (either the group is suppressed, the group has an alertOverride,
- * or both). The method determined which kind of child needs to receive the alert, finds the
- * entry currently alerting, and makes the transfer.
- *
- * Internally, this is handled with two main cases: the override needs the alert, or there is
- * no override but the summary is suppressed (so an isolated child needs the alert).
- *
- * @param summary the notification entry of the summary of the logical group.
- * @param oldAlertOverride the former value of group.alertOverride, before whatever event
- * required us to check for for a transfer condition.
- */
- private void checkForForwardAlertTransfer(NotificationEntry summary,
- NotificationEntry oldAlertOverride) {
- if (DEBUG) {
- Log.d(TAG, "checkForForwardAlertTransfer: enter");
- }
- NotificationGroup group = mGroupManager.getGroupForSummary(summary.getSbn());
- if (group != null && group.alertOverride != null) {
- handleOverriddenSummaryAlerted(summary);
- } else if (mGroupManager.isSummaryOfSuppressedGroup(summary.getSbn())) {
- handleSuppressedSummaryAlerted(summary, oldAlertOverride);
+ private void onAlertStateChanged(NotificationEntry entry, boolean isAlerting,
+ AlertingNotificationManager alertManager) {
+ if (isAlerting && mGroupManager.isSummaryOfSuppressedGroup(entry.getSbn())) {
+ handleSuppressedSummaryAlerted(entry, alertManager);
}
}
@@ -247,16 +186,9 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
// see as early as we can if we need to abort a transfer.
@Override
public void onPendingEntryAdded(NotificationEntry entry) {
- if (DEBUG) {
- Log.d(TAG, "!! onPendingEntryAdded: entry=" + entry);
- }
String groupKey = mGroupManager.getGroupKey(entry.getSbn());
GroupAlertEntry groupAlertEntry = mGroupAlertEntries.get(groupKey);
- if (groupAlertEntry != null && groupAlertEntry.mGroup.alertOverride == null) {
- // new pending group entries require us to transfer back from the child to the
- // group, but alertOverrides are only present in very limited circumstances, so
- // while it's possible the group should ALSO alert, the previous detection which set
- // this alertOverride won't be invalidated by this notification added to this group.
+ if (groupAlertEntry != null) {
checkShouldTransferBack(groupAlertEntry);
}
}
@@ -330,128 +262,43 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
}
/**
- * Handles the scenario where a summary that has been suppressed is itself, or has a former
- * alertOverride (in the form of an isolated logical child) which was alerted. A suppressed
+ * Handles the scenario where a summary that has been suppressed is alerted. A suppressed
* summary should for all intents and purposes be invisible to the user and as a result should
* not alert. When this is the case, it is our responsibility to pass the alert to the
* appropriate child which will be the representative notification alerting for the group.
*
- * @param summary the summary that is suppressed and (potentially) alerting
- * @param oldAlertOverride the alertOverride before whatever event triggered this method. If
- * the alert override was removed, this will be the entry that should
- * be transferred back from.
+ * @param summary the summary that is suppressed and alerting
+ * @param alertManager the alert manager that manages the alerting summary
*/
private void handleSuppressedSummaryAlerted(@NonNull NotificationEntry summary,
- NotificationEntry oldAlertOverride) {
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: summary=" + summary);
- }
+ @NonNull AlertingNotificationManager alertManager) {
+ StatusBarNotification sbn = summary.getSbn();
GroupAlertEntry groupAlertEntry =
- mGroupAlertEntries.get(mGroupManager.getGroupKey(summary.getSbn()));
-
+ mGroupAlertEntries.get(mGroupManager.getGroupKey(sbn));
if (!mGroupManager.isSummaryOfSuppressedGroup(summary.getSbn())
+ || !alertManager.isAlerting(sbn.getKey())
|| groupAlertEntry == null) {
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: invalid state");
- }
- return;
- }
- boolean summaryIsAlerting = mHeadsUpManager.isAlerting(summary.getKey());
- boolean priorityIsAlerting = oldAlertOverride != null
- && mHeadsUpManager.isAlerting(oldAlertOverride.getKey());
- if (!summaryIsAlerting && !priorityIsAlerting) {
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: no summary or override alerting");
- }
return;
}
if (pendingInflationsWillAddChildren(groupAlertEntry.mGroup)) {
// New children will actually be added to this group, let's not transfer the alert.
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: pending inflations");
- }
return;
}
NotificationEntry child =
mGroupManager.getLogicalChildren(summary.getSbn()).iterator().next();
- if (summaryIsAlerting) {
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: transfer summary -> child");
+ if (child != null) {
+ if (child.getRow().keepInParent()
+ || child.isRowRemoved()
+ || child.isRowDismissed()) {
+ // The notification is actually already removed. No need to alert it.
+ return;
}
- tryTransferAlertState(summary, /*from*/ summary, /*to*/ child, groupAlertEntry);
- return;
- }
- // Summary didn't have the alert, so we're in "transfer back" territory. First, make sure
- // it's not too late to transfer back, then transfer the alert from the oldAlertOverride to
- // the isolated child which should receive the alert.
- if (!canStillTransferBack(groupAlertEntry)) {
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: transfer from override: too late");
- }
- return;
- }
-
- if (DEBUG) {
- Log.d(TAG, "handleSuppressedSummaryAlerted: transfer override -> child");
- }
- tryTransferAlertState(summary, /*from*/ oldAlertOverride, /*to*/ child, groupAlertEntry);
- }
-
- /**
- * Checks for and handles the scenario where the given entry is the summary of a group which
- * has an alertOverride, and either the summary itself or one of its logical isolated children
- * is currently alerting (which happens if the summary is suppressed).
- */
- private void handleOverriddenSummaryAlerted(NotificationEntry summary) {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: summary=" + summary);
- }
- GroupAlertEntry groupAlertEntry =
- mGroupAlertEntries.get(mGroupManager.getGroupKey(summary.getSbn()));
- NotificationGroup group = mGroupManager.getGroupForSummary(summary.getSbn());
- if (group == null || group.alertOverride == null || groupAlertEntry == null) {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: invalid state");
- }
- return;
- }
- boolean summaryIsAlerting = mHeadsUpManager.isAlerting(summary.getKey());
- if (summaryIsAlerting) {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: transfer summary -> override");
- }
- tryTransferAlertState(summary, /*from*/ summary, group.alertOverride, groupAlertEntry);
- return;
- }
- // Summary didn't have the alert, so we're in "transfer back" territory. First, make sure
- // it's not too late to transfer back, then remove the alert from any of the logical
- // children, and if one of them was alerting, we can alert the override.
- if (!canStillTransferBack(groupAlertEntry)) {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: transfer from child: too late");
- }
- return;
- }
- List children = mGroupManager.getLogicalChildren(summary.getSbn());
- if (children == null) {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: no children");
- }
- return;
- }
- children.remove(group.alertOverride); // do not release the alert on our desired destination
- boolean releasedChild = releaseChildAlerts(children);
- if (releasedChild) {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: transfer child -> override");
- }
- tryTransferAlertState(summary, /*from*/ null, group.alertOverride, groupAlertEntry);
- } else {
- if (DEBUG) {
- Log.d(TAG, "handleOverriddenSummaryAlerted: no child alert released");
+ if (!alertManager.isAlerting(child.getKey()) && onlySummaryAlerts(summary)) {
+ groupAlertEntry.mLastAlertTransferTime = SystemClock.elapsedRealtime();
}
+ transferAlertState(summary, child, alertManager);
}
}
@@ -460,37 +307,14 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
* immediately to have the incorrect one up as short as possible. The second should alert
* when possible.
*
- * @param summary entry of the summary
* @param fromEntry entry to transfer alert from
* @param toEntry entry to transfer to
+ * @param alertManager alert manager for the alert type
*/
- private void tryTransferAlertState(
- NotificationEntry summary,
- NotificationEntry fromEntry,
- NotificationEntry toEntry,
- GroupAlertEntry groupAlertEntry) {
- if (toEntry != null) {
- if (toEntry.getRow().keepInParent()
- || toEntry.isRowRemoved()
- || toEntry.isRowDismissed()) {
- // The notification is actually already removed. No need to alert it.
- return;
- }
- if (!mHeadsUpManager.isAlerting(toEntry.getKey()) && onlySummaryAlerts(summary)) {
- groupAlertEntry.mLastAlertTransferTime = SystemClock.elapsedRealtime();
- }
- if (DEBUG) {
- Log.d(TAG, "transferAlertState: fromEntry=" + fromEntry + " toEntry=" + toEntry);
- }
- transferAlertState(fromEntry, toEntry);
- }
- }
- private void transferAlertState(@Nullable NotificationEntry fromEntry,
- @NonNull NotificationEntry toEntry) {
- if (fromEntry != null) {
- mHeadsUpManager.removeNotification(fromEntry.getKey(), true /* releaseImmediately */);
- }
- alertNotificationWhenPossible(toEntry);
+ private void transferAlertState(@NonNull NotificationEntry fromEntry, @NonNull NotificationEntry toEntry,
+ @NonNull AlertingNotificationManager alertManager) {
+ alertManager.removeNotification(fromEntry.getKey(), true /* releaseImmediately */);
+ alertNotificationWhenPossible(toEntry, alertManager);
}
/**
@@ -502,13 +326,11 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
* more children are coming. Thus, if a child is added within a certain timeframe after we
* transfer, we back out and alert the summary again.
*
- * An alert can only transfer back within a small window of time after a transfer away from the
- * summary to a child happened.
- *
* @param groupAlertEntry group alert entry to check
*/
private void checkShouldTransferBack(@NonNull GroupAlertEntry groupAlertEntry) {
- if (canStillTransferBack(groupAlertEntry)) {
+ if (SystemClock.elapsedRealtime() - groupAlertEntry.mLastAlertTransferTime
+ < ALERT_TRANSFER_TIMEOUT) {
NotificationEntry summary = groupAlertEntry.mGroup.summary;
if (!onlySummaryAlerts(summary)) {
@@ -516,17 +338,30 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
}
ArrayList children = mGroupManager.getLogicalChildren(
summary.getSbn());
- int numActiveChildren = children.size();
+ int numChildren = children.size();
int numPendingChildren = getPendingChildrenNotAlerting(groupAlertEntry.mGroup);
- int numChildren = numActiveChildren + numPendingChildren;
+ numChildren += numPendingChildren;
if (numChildren <= 1) {
return;
}
- boolean releasedChild = releaseChildAlerts(children);
+ boolean releasedChild = false;
+ for (int i = 0; i < children.size(); i++) {
+ NotificationEntry entry = children.get(i);
+ if (onlySummaryAlerts(entry) && mHeadsUpManager.isAlerting(entry.getKey())) {
+ releasedChild = true;
+ mHeadsUpManager.removeNotification(
+ entry.getKey(), true /* releaseImmediately */);
+ }
+ if (mPendingAlerts.containsKey(entry.getKey())) {
+ // This is the child that would've been removed if it was inflated.
+ releasedChild = true;
+ mPendingAlerts.get(entry.getKey()).mAbortOnInflation = true;
+ }
+ }
if (releasedChild && !mHeadsUpManager.isAlerting(summary.getKey())) {
- boolean notifyImmediately = numActiveChildren > 1;
+ boolean notifyImmediately = (numChildren - numPendingChildren) > 1;
if (notifyImmediately) {
- alertNotificationWhenPossible(summary);
+ alertNotificationWhenPossible(summary, mHeadsUpManager);
} else {
// Should wait until the pending child inflates before alerting.
groupAlertEntry.mAlertSummaryOnNextAddition = true;
@@ -536,61 +371,25 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
}
}
- private boolean canStillTransferBack(@NonNull GroupAlertEntry groupAlertEntry) {
- return SystemClock.elapsedRealtime() - groupAlertEntry.mLastAlertTransferTime
- < ALERT_TRANSFER_TIMEOUT;
- }
-
- private boolean releaseChildAlerts(List children) {
- boolean releasedChild = false;
- if (SPEW) {
- Log.d(TAG, "releaseChildAlerts: numChildren=" + children.size());
- }
- for (int i = 0; i < children.size(); i++) {
- NotificationEntry entry = children.get(i);
- if (SPEW) {
- Log.d(TAG, "releaseChildAlerts: checking i=" + i + " entry=" + entry
- + " onlySummaryAlerts=" + onlySummaryAlerts(entry)
- + " isAlerting=" + mHeadsUpManager.isAlerting(entry.getKey())
- + " isPendingAlert=" + mPendingAlerts.containsKey(entry.getKey()));
- }
- if (onlySummaryAlerts(entry) && mHeadsUpManager.isAlerting(entry.getKey())) {
- releasedChild = true;
- mHeadsUpManager.removeNotification(
- entry.getKey(), true /* releaseImmediately */);
- }
- if (mPendingAlerts.containsKey(entry.getKey())) {
- // This is the child that would've been removed if it was inflated.
- releasedChild = true;
- mPendingAlerts.get(entry.getKey()).mAbortOnInflation = true;
- }
- }
- if (SPEW) {
- Log.d(TAG, "releaseChildAlerts: didRelease=" + releasedChild);
- }
- return releasedChild;
- }
-
/**
* Tries to alert the notification. If its content view is not inflated, we inflate and continue
* when the entry finishes inflating the view.
*
* @param entry entry to show
+ * @param alertManager alert manager for the alert type
*/
- private void alertNotificationWhenPossible(@NonNull NotificationEntry entry) {
- @InflationFlag int contentFlag = mHeadsUpManager.getContentFlag();
+ private void alertNotificationWhenPossible(@NonNull NotificationEntry entry,
+ @NonNull AlertingNotificationManager alertManager) {
+ @InflationFlag int contentFlag = alertManager.getContentFlag();
final RowContentBindParams params = mRowContentBindStage.getStageParams(entry);
if ((params.getContentViews() & contentFlag) == 0) {
- if (DEBUG) {
- Log.d(TAG, "alertNotificationWhenPossible: async requestRebind entry=" + entry);
- }
mPendingAlerts.put(entry.getKey(), new PendingAlertInfo(entry));
params.requireContentViews(contentFlag);
mRowContentBindStage.requestRebind(entry, en -> {
PendingAlertInfo alertInfo = mPendingAlerts.remove(entry.getKey());
if (alertInfo != null) {
if (alertInfo.isStillValid()) {
- alertNotificationWhenPossible(entry);
+ alertNotificationWhenPossible(entry, mHeadsUpManager);
} else {
// The transfer is no longer valid. Free the content.
mRowContentBindStage.getStageParams(entry).markContentViewsFreeable(
@@ -601,16 +400,10 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
});
return;
}
- if (mHeadsUpManager.isAlerting(entry.getKey())) {
- if (DEBUG) {
- Log.d(TAG, "alertNotificationWhenPossible: continue alerting entry=" + entry);
- }
- mHeadsUpManager.updateNotification(entry.getKey(), true /* alert */);
+ if (alertManager.isAlerting(entry.getKey())) {
+ alertManager.updateNotification(entry.getKey(), true /* alert */);
} else {
- if (DEBUG) {
- Log.d(TAG, "alertNotificationWhenPossible: start alerting entry=" + entry);
- }
- mHeadsUpManager.showNotification(entry);
+ alertManager.showNotification(entry);
}
}
From 699f52e08491b1f38b23081bb94a41df2b358a83 Mon Sep 17 00:00:00 2001
From: Songchun Fan
Date: Wed, 5 May 2021 11:25:10 -0700
Subject: [PATCH 051/176] [SettingProvider] add checks for null applicationInfo
BUG: 187301322
Test: builds
Change-Id: I20d68f5dd11d0e34acc35d6a985fee0991157741
(cherry picked from commit d7baae817045f5ce4f756fd0787b6344c11fc444)
---
.../providers/settings/SettingsProvider.java | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 941f47f525510..0a57390964879 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -1873,6 +1873,9 @@ public class SettingsProvider extends ContentProvider {
// The calling package is already verified.
PackageInfo packageInfo = getCallingPackageInfoOrThrow(userId);
+ if (packageInfo.applicationInfo == null) {
+ return;
+ }
// Privileged apps can do whatever they want.
if ((packageInfo.applicationInfo.privateFlags
& ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0) {
@@ -1893,6 +1896,10 @@ public class SettingsProvider extends ContentProvider {
// The calling package is already verified.
PackageInfo packageInfo = getCallingPackageInfoOrThrow(userId);
+ if (packageInfo.applicationInfo == null) {
+ return;
+ }
+
// Privileged apps can do whatever they want.
if ((packageInfo.applicationInfo.privateFlags &
ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0) {
@@ -2577,6 +2584,9 @@ public class SettingsProvider extends ContentProvider {
final String ssaid = HexEncoding.encodeToString(m.doFinal(), false /* upperCase */)
.substring(0, 16);
+ if (callingPkg.applicationInfo == null) {
+ throw new IllegalStateException("Application info not accessible");
+ }
// Save the ssaid in the ssaid table.
final String uid = Integer.toString(callingPkg.applicationInfo.uid);
final SettingsState ssaidSettings = getSettingsLocked(SETTINGS_TYPE_SSAID, userId);
@@ -2604,6 +2614,9 @@ public class SettingsProvider extends ContentProvider {
}
final Set appUids = new HashSet<>();
for (PackageInfo info : packages) {
+ if (info == null || info.applicationInfo == null) {
+ continue;
+ }
appUids.add(Integer.toString(info.applicationInfo.uid));
}
@@ -3804,6 +3817,9 @@ public class SettingsProvider extends ContentProvider {
final SettingsState ssaidSettings = getSsaidSettingsLocked(userId);
for (PackageInfo info : packages) {
+ if (info == null || info.applicationInfo == null) {
+ continue;
+ }
// Check if the UID already has an entry in the table.
final String uid = Integer.toString(info.applicationInfo.uid);
final Setting ssaid = ssaidSettings.getSettingLocked(uid);
From 7a153718b48147c552b19872e8a31451243eb8c0 Mon Sep 17 00:00:00 2001
From: Todd Kennedy
Date: Wed, 5 May 2021 20:46:25 +0000
Subject: [PATCH 052/176] Revert "Migrate the usage of
sCompatibilityModeEnabled"
This reverts commit 0a98d27b04f225d5b87efa206ef289ba08ee5ad9.
Reason for revert: b/187301322
Change-Id: Iae9acc88841f214a5e3a14f83c3d5ee8b9ffd422
Bug: 187301322
(cherry picked from commit a02ce471bea5f0715108ee34372c0772f00eeb48)
---
.../pm/parsing/ParsingPackageUtils.java | 7 -----
.../server/pm/PackageManagerService.java | 28 +++++--------------
.../server/pm/parsing/PackageInfoUtils.java | 2 +-
3 files changed, 8 insertions(+), 29 deletions(-)
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index 7cc59524c93d4..3b972a4fbb118 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -3067,13 +3067,6 @@ public class ParsingPackageUtils {
}
}
- /**
- * @hide
- */
- public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) {
- sCompatibilityModeEnabled = compatibilityModeEnabled;
- }
-
/**
* @hide
*/
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 47046bd71e2ae..ca8af4199a214 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -134,7 +134,6 @@ import static com.android.server.pm.PackageManagerServiceUtils.getLastModifiedTi
import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo;
import static com.android.server.pm.PackageManagerServiceUtils.makeDirRecursive;
import static com.android.server.pm.PackageManagerServiceUtils.verifySignatures;
-import static com.android.server.pm.parsing.PackageInfoUtils.checkUseInstalledOrHidden;
import android.Manifest;
import android.annotation.AppIdInt;
@@ -2517,8 +2516,8 @@ public class PackageManagerService extends IPackageManager.Stub
if (DEBUG_PACKAGE_INFO) Log.v(TAG, "getActivityInfo " + component + ": " + a);
AndroidPackage pkg = a == null ? null : mPackages.get(a.getPackageName());
- PackageSetting ps = a == null ? null : mSettings.getPackageLPr(a.getPackageName());
if (pkg != null && mSettings.isEnabledAndMatchLPr(pkg, a, flags, userId)) {
+ PackageSetting ps = mSettings.getPackageLPr(component.getPackageName());
if (ps == null) return null;
if (shouldFilterApplicationLocked(
ps, filterCallingUid, component, TYPE_ACTIVITY, userId)) {
@@ -2528,8 +2527,8 @@ public class PackageManagerService extends IPackageManager.Stub
a, flags, ps.readUserState(userId), userId, ps);
}
if (resolveComponentName().equals(component)) {
- return generateDelegateActivityInfo(pkg, ps, new PackageUserState(),
- mResolveActivity, flags, userId);
+ return PackageParser.generateActivityInfo(
+ mResolveActivity, flags, new PackageUserState(), userId);
}
return null;
}
@@ -3175,8 +3174,8 @@ public class PackageManagerService extends IPackageManager.Stub
return result;
}
final ResolveInfo ephemeralInstaller = new ResolveInfo(mInstantAppInstallerInfo);
- ephemeralInstaller.activityInfo = generateDelegateActivityInfo(ps.getPkg(), ps,
- ps.readUserState(userId), instantAppInstallerActivity(), 0 /*flags*/, userId);
+ ephemeralInstaller.activityInfo = PackageParser.generateActivityInfo(
+ instantAppInstallerActivity(), 0, ps.readUserState(userId), userId);
ephemeralInstaller.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART
| IntentFilter.MATCH_ADJUSTMENT_NORMAL;
// add a non-generic filter
@@ -3260,7 +3259,7 @@ public class PackageManagerService extends IPackageManager.Stub
ai.flags = ps.pkgFlags;
ai.privateFlags = ps.pkgPrivateFlags;
pi.applicationInfo =
- PackageInfoUtils.generateApplicationInfo(p, flags, state, userId, ps);
+ PackageParser.generateApplicationInfo(ai, flags, state, userId);
if (DEBUG_PACKAGE_INFO) Log.v(TAG, "ps.pkg is n/a for ["
+ ps.name + "]. Provides a minimum info.");
@@ -3376,19 +3375,6 @@ public class PackageManagerService extends IPackageManager.Stub
return getInstalledPackagesBody(flags, userId, callingUid);
}
- private static ActivityInfo generateDelegateActivityInfo(@Nullable AndroidPackage pkg,
- @Nullable PackageSetting ps, @NonNull PackageUserState state,
- @Nullable ActivityInfo activity, int flags, int userId) {
- if (activity == null || pkg == null
- || !checkUseInstalledOrHidden(pkg, ps, state, flags)) {
- return null;
- }
- final ActivityInfo info = new ActivityInfo(activity);
- info.applicationInfo =
- PackageInfoUtils.generateApplicationInfo(pkg, flags, state, userId, ps);
- return info;
- }
-
public ParceledListSlice getInstalledPackagesBody(int flags, int userId,
int callingUid) {
// writer
@@ -23652,7 +23638,7 @@ public class PackageManagerService extends IPackageManager.Stub
boolean compatibilityModeEnabled = android.provider.Settings.Global.getInt(
mContext.getContentResolver(),
android.provider.Settings.Global.COMPATIBILITY_MODE, 1) == 1;
- ParsingPackageUtils.setCompatibilityModeEnabled(compatibilityModeEnabled);
+ PackageParser.setCompatibilityModeEnabled(compatibilityModeEnabled);
if (DEBUG_SETTINGS) {
Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled);
diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
index b89dbdc863e0c..61f51e36202cf 100644
--- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
+++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
@@ -417,7 +417,7 @@ public class PackageInfoUtils {
* Returns true if the package is installed and not hidden, or if the caller
* explicitly wanted all uninstalled and hidden packages as well.
*/
- public static boolean checkUseInstalledOrHidden(AndroidPackage pkg,
+ private static boolean checkUseInstalledOrHidden(AndroidPackage pkg,
PackageSetting pkgSetting, PackageUserState state,
@PackageManager.PackageInfoFlags int flags) {
// Returns false if the package is hidden system app until installed.
From 0c85b16003198451369b2dc9ae2798ddf2c411ea Mon Sep 17 00:00:00 2001
From: Todd Kennedy
Date: Wed, 5 May 2021 20:46:25 +0000
Subject: [PATCH 053/176] Revert "Migrate the usage of
sCompatibilityModeEnabled"
This reverts commit 0a98d27b04f225d5b87efa206ef289ba08ee5ad9.
Reason for revert: b/187301322
Change-Id: Iae9acc88841f214a5e3a14f83c3d5ee8b9ffd422
Bug: 187301322
(cherry picked from commit a02ce471bea5f0715108ee34372c0772f00eeb48)
---
.../pm/parsing/ParsingPackageUtils.java | 7 -----
.../server/pm/PackageManagerService.java | 28 +++++--------------
.../server/pm/parsing/PackageInfoUtils.java | 2 +-
3 files changed, 8 insertions(+), 29 deletions(-)
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index 7cc59524c93d4..3b972a4fbb118 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -3067,13 +3067,6 @@ public class ParsingPackageUtils {
}
}
- /**
- * @hide
- */
- public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) {
- sCompatibilityModeEnabled = compatibilityModeEnabled;
- }
-
/**
* @hide
*/
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 47046bd71e2ae..ca8af4199a214 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -134,7 +134,6 @@ import static com.android.server.pm.PackageManagerServiceUtils.getLastModifiedTi
import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo;
import static com.android.server.pm.PackageManagerServiceUtils.makeDirRecursive;
import static com.android.server.pm.PackageManagerServiceUtils.verifySignatures;
-import static com.android.server.pm.parsing.PackageInfoUtils.checkUseInstalledOrHidden;
import android.Manifest;
import android.annotation.AppIdInt;
@@ -2517,8 +2516,8 @@ public class PackageManagerService extends IPackageManager.Stub
if (DEBUG_PACKAGE_INFO) Log.v(TAG, "getActivityInfo " + component + ": " + a);
AndroidPackage pkg = a == null ? null : mPackages.get(a.getPackageName());
- PackageSetting ps = a == null ? null : mSettings.getPackageLPr(a.getPackageName());
if (pkg != null && mSettings.isEnabledAndMatchLPr(pkg, a, flags, userId)) {
+ PackageSetting ps = mSettings.getPackageLPr(component.getPackageName());
if (ps == null) return null;
if (shouldFilterApplicationLocked(
ps, filterCallingUid, component, TYPE_ACTIVITY, userId)) {
@@ -2528,8 +2527,8 @@ public class PackageManagerService extends IPackageManager.Stub
a, flags, ps.readUserState(userId), userId, ps);
}
if (resolveComponentName().equals(component)) {
- return generateDelegateActivityInfo(pkg, ps, new PackageUserState(),
- mResolveActivity, flags, userId);
+ return PackageParser.generateActivityInfo(
+ mResolveActivity, flags, new PackageUserState(), userId);
}
return null;
}
@@ -3175,8 +3174,8 @@ public class PackageManagerService extends IPackageManager.Stub
return result;
}
final ResolveInfo ephemeralInstaller = new ResolveInfo(mInstantAppInstallerInfo);
- ephemeralInstaller.activityInfo = generateDelegateActivityInfo(ps.getPkg(), ps,
- ps.readUserState(userId), instantAppInstallerActivity(), 0 /*flags*/, userId);
+ ephemeralInstaller.activityInfo = PackageParser.generateActivityInfo(
+ instantAppInstallerActivity(), 0, ps.readUserState(userId), userId);
ephemeralInstaller.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART
| IntentFilter.MATCH_ADJUSTMENT_NORMAL;
// add a non-generic filter
@@ -3260,7 +3259,7 @@ public class PackageManagerService extends IPackageManager.Stub
ai.flags = ps.pkgFlags;
ai.privateFlags = ps.pkgPrivateFlags;
pi.applicationInfo =
- PackageInfoUtils.generateApplicationInfo(p, flags, state, userId, ps);
+ PackageParser.generateApplicationInfo(ai, flags, state, userId);
if (DEBUG_PACKAGE_INFO) Log.v(TAG, "ps.pkg is n/a for ["
+ ps.name + "]. Provides a minimum info.");
@@ -3376,19 +3375,6 @@ public class PackageManagerService extends IPackageManager.Stub
return getInstalledPackagesBody(flags, userId, callingUid);
}
- private static ActivityInfo generateDelegateActivityInfo(@Nullable AndroidPackage pkg,
- @Nullable PackageSetting ps, @NonNull PackageUserState state,
- @Nullable ActivityInfo activity, int flags, int userId) {
- if (activity == null || pkg == null
- || !checkUseInstalledOrHidden(pkg, ps, state, flags)) {
- return null;
- }
- final ActivityInfo info = new ActivityInfo(activity);
- info.applicationInfo =
- PackageInfoUtils.generateApplicationInfo(pkg, flags, state, userId, ps);
- return info;
- }
-
public ParceledListSlice getInstalledPackagesBody(int flags, int userId,
int callingUid) {
// writer
@@ -23652,7 +23638,7 @@ public class PackageManagerService extends IPackageManager.Stub
boolean compatibilityModeEnabled = android.provider.Settings.Global.getInt(
mContext.getContentResolver(),
android.provider.Settings.Global.COMPATIBILITY_MODE, 1) == 1;
- ParsingPackageUtils.setCompatibilityModeEnabled(compatibilityModeEnabled);
+ PackageParser.setCompatibilityModeEnabled(compatibilityModeEnabled);
if (DEBUG_SETTINGS) {
Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled);
diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
index b89dbdc863e0c..61f51e36202cf 100644
--- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
+++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
@@ -417,7 +417,7 @@ public class PackageInfoUtils {
* Returns true if the package is installed and not hidden, or if the caller
* explicitly wanted all uninstalled and hidden packages as well.
*/
- public static boolean checkUseInstalledOrHidden(AndroidPackage pkg,
+ private static boolean checkUseInstalledOrHidden(AndroidPackage pkg,
PackageSetting pkgSetting, PackageUserState state,
@PackageManager.PackageInfoFlags int flags) {
// Returns false if the package is hidden system app until installed.
From 5ff6dc00ae0f6e26d5190ad85fb9c26af6fdab5c Mon Sep 17 00:00:00 2001
From: Makoto Onuki
Date: Thu, 6 May 2021 17:48:29 +0000
Subject: [PATCH 054/176] Revert "Don't defer FGS notification if it's already
shown"
Revert "Verify behavior when FGS uses existing notification"
Revert submission 14414063-fgs-defer-fixes
Reason for revert: b/187373264
Reverted Changes:
I081a3cc88:Don't defer FGS notification if it's already shown...
I083583550:Verify behavior when FGS uses existing notificatio...
Bug: 187373264
Change-Id: I82edba69c583791ec603107b3407ce7a5efe83a0
(cherry picked from commit 94badc521453fa4be8c906fd94cea812889f0a58)
---
.../java/com/android/server/am/ActiveServices.java | 12 ------------
.../notification/NotificationManagerInternal.java | 3 ---
.../notification/NotificationManagerService.java | 7 -------
3 files changed, 22 deletions(-)
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index b261231794110..5700bb367b041 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -155,7 +155,6 @@ import com.android.server.AppStateTracker;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.am.ActivityManagerService.ItemMatcher;
-import com.android.server.notification.NotificationManagerInternal;
import com.android.server.uri.NeededUriGrants;
import com.android.server.wm.ActivityServiceConnectionsHolder;
@@ -1977,17 +1976,6 @@ public final class ActiveServices {
// DeviceConfig element has been set
showNow = isLegacyApp && mAm.mConstants.mFlagFgsNotificationDeferralApiGated;
}
- if (!showNow) {
- // did we already show it?
- showNow = r.mFgsNotificationShown;
- }
- if (!showNow) {
- // Is the notification already showing for any reason?
- final NotificationManagerInternal nmi =
- LocalServices.getService(NotificationManagerInternal.class);
- showNow = nmi.isNotificationShown(r.appInfo.packageName, null,
- r.foregroundId, UserHandle.getUserId(uid));
- }
if (!showNow) {
// has the app forced deferral?
if (!r.foregroundNoti.isForegroundDisplayForceDeferred()) {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerInternal.java b/services/core/java/com/android/server/notification/NotificationManagerInternal.java
index 0528b95d1a6e6..dc9839c6da0ef 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerInternal.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerInternal.java
@@ -30,9 +30,6 @@ public interface NotificationManagerInternal {
void cancelNotification(String pkg, String basePkg, int callingUid, int callingPid,
String tag, int id, int userId);
- /** is the given notification currently showing? */
- boolean isNotificationShown(String pkg, String tag, int notificationId, int userId);
-
void removeForegroundServiceFlagFromNotification(String pkg, int notificationId, int userId);
void onConversationRemoved(String pkg, int uid, Set shortcuts);
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index f382c787ed47c..40b9929e214a1 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -6049,13 +6049,6 @@ public class NotificationManagerService extends SystemService {
cancelNotificationInternal(pkg, opPkg, callingUid, callingPid, tag, id, userId);
}
- @Override
- public boolean isNotificationShown(String pkg, String tag, int notificationId, int userId) {
- synchronized (mNotificationLock) {
- return findNotificationLocked(pkg, tag, notificationId, userId) != null;
- }
- }
-
@Override
public void removeForegroundServiceFlagFromNotification(String pkg, int notificationId,
int userId) {
From 82672f737119871d13df1242cd37a5aa276f3b1a Mon Sep 17 00:00:00 2001
From: Aurimas Liutikas
Date: Wed, 12 May 2021 21:56:31 +0000
Subject: [PATCH 055/176] Revert "Fix incompatibilities with Kotlin 1.5.0"
This reverts commit b8ca1157ab6d463a19f6a7bbfeb25d1f9f1be911.
Reason for revert: b/187908823
Change-Id: I9606c5730f4e8697a9319939acda0a9b7a74634d
(cherry picked from commit c5b4071877530ba3eb6ce5f55fc8c101ea1f35e4)
---
.../android/systemui/controls/ui/ControlsUiControllerImpl.kt | 2 +-
.../src/com/android/systemui/privacy/PrivacyChipBuilder.kt | 2 +-
tools/codegen/src/com/android/codegen/Utils.kt | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
index a904cefc48a06..26be98743eed9 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
@@ -120,7 +120,7 @@ class ControlsUiControllerImpl @Inject constructor (
private val onSeedingComplete = Consumer {
accepted ->
if (accepted) {
- selectedStructure = controlsController.get().getFavorites().maxByOrNull {
+ selectedStructure = controlsController.get().getFavorites().maxBy {
it.controls.size
} ?: EMPTY_STRUCTURE
updatePreferences(selectedStructure)
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyChipBuilder.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyChipBuilder.kt
index eec69f98b9be7..1d2e74703b42b 100644
--- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyChipBuilder.kt
+++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyChipBuilder.kt
@@ -28,7 +28,7 @@ class PrivacyChipBuilder(private val context: Context, itemsList: List Unit) {
* cccc dd
*/
fun Iterable>.columnize(separator: String = " | "): String {
- val col1w = map { (a, _) -> a.length }.maxOrNull()!!
- val col2w = map { (_, b) -> b.length }.maxOrNull()!!
+ val col1w = map { (a, _) -> a.length }.max()!!
+ val col2w = map { (_, b) -> b.length }.max()!!
return map { it.first.padEnd(col1w) + separator + it.second.padEnd(col2w) }.joinToString("\n")
}
From 3b294863e663bda599b833b66580d81bc537c9c5 Mon Sep 17 00:00:00 2001
From: Silin Huang
Date: Thu, 20 May 2021 15:59:05 -0700
Subject: [PATCH 056/176] Recreate QuickAccessWallet for Wallet Tile and
Lockscreen Icon when the default payment app has changed.
Also to avoid a wallet client that doesn't have ServiceInfo is living
too long, don't make it final and re-create the wallet client if it has a null service info.
Fix: 187972400
Test: manual, see demo- the default payment app is GPay, check Tile and
Lockscreen Icon, then change the default payment app and check again.
https://drive.google.com/file/d/10-I339VPuxJRGXJT-XmwmnZs4MHaH3gm/view?usp=sharing&resourcekey=0-wDtRXNNr_Tg9ptxk1Tpxsw
Change-Id: Ie9a05795bff447424b299132fa60ae2efb2092be
(cherry picked from commit e3474a76cdfcddd1c2e04425fc368c2441e874a6)
---
.../qs/tiles/QuickAccessWalletTile.java | 66 +++++++++++++++++--
.../phone/KeyguardBottomAreaView.java | 35 ++++++++--
.../NotificationPanelViewController.java | 6 +-
.../systemui/wallet/ui/WalletActivity.java | 16 +++--
.../qs/tiles/QuickAccessWalletTileTest.java | 12 +++-
.../phone/NotificationPanelViewTest.java | 4 --
6 files changed, 112 insertions(+), 27 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
index e467925551013..611f0e366859f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
@@ -20,9 +20,11 @@ import static android.provider.Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.database.ContentObserver;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
+import android.provider.Settings;
import android.service.quickaccesswallet.GetWalletCardsError;
import android.service.quickaccesswallet.GetWalletCardsRequest;
import android.service.quickaccesswallet.GetWalletCardsResponse;
@@ -66,16 +68,16 @@ public class QuickAccessWalletTile extends QSTileImpl {
private final CharSequence mLabel = mContext.getString(R.string.wallet_title);
private final WalletCardRetriever mCardRetriever = new WalletCardRetriever();
- // TODO(b/180959290): Re-create the QAW Client when the default NFC payment app changes.
- private final QuickAccessWalletClient mQuickAccessWalletClient;
private final KeyguardStateController mKeyguardStateController;
private final PackageManager mPackageManager;
private final SecureSettings mSecureSettings;
private final Executor mExecutor;
private final FeatureFlags mFeatureFlags;
- @VisibleForTesting Drawable mCardViewDrawable;
+ private QuickAccessWalletClient mQuickAccessWalletClient;
+ private ContentObserver mDefaultPaymentAppObserver;
private WalletCard mSelectedCard;
+ @VisibleForTesting Drawable mCardViewDrawable;
@Inject
public QuickAccessWalletTile(
@@ -87,15 +89,14 @@ public class QuickAccessWalletTile extends QSTileImpl {
StatusBarStateController statusBarStateController,
ActivityStarter activityStarter,
QSLogger qsLogger,
- QuickAccessWalletClient quickAccessWalletClient,
KeyguardStateController keyguardStateController,
PackageManager packageManager,
SecureSettings secureSettings,
- @Background Executor executor,
+ @Main Executor executor,
FeatureFlags featureFlags) {
super(host, backgroundLooper, mainHandler, falsingManager, metricsLogger,
statusBarStateController, activityStarter, qsLogger);
- mQuickAccessWalletClient = quickAccessWalletClient;
+ mQuickAccessWalletClient = QuickAccessWalletClient.create(mContext);
mKeyguardStateController = keyguardStateController;
mPackageManager = packageManager;
mSecureSettings = secureSettings;
@@ -115,6 +116,12 @@ public class QuickAccessWalletTile extends QSTileImpl {
protected void handleSetListening(boolean listening) {
super.handleSetListening(listening);
if (listening) {
+ setupDefaultPaymentAppObserver();
+ // Re-create wallet client to avoid a client that doesn't have service info is living
+ // too long.
+ if (!mQuickAccessWalletClient.isWalletServiceAvailable()) {
+ reCreateWalletClient();
+ }
queryWalletCards();
}
}
@@ -174,6 +181,7 @@ public class QuickAccessWalletTile extends QSTileImpl {
state.stateDescription = state.secondaryLabel;
} else {
state.state = Tile.STATE_UNAVAILABLE;
+ state.secondaryLabel = null;
}
state.sideViewCustomDrawable = isDeviceLocked ? null : mCardViewDrawable;
}
@@ -202,7 +210,30 @@ public class QuickAccessWalletTile extends QSTileImpl {
return label == null ? mLabel : label;
}
+ @Override
+ protected void handleDestroy() {
+ super.handleDestroy();
+ if (mDefaultPaymentAppObserver != null) {
+ mSecureSettings.unregisterContentObserver(mDefaultPaymentAppObserver);
+ }
+ mQuickAccessWalletClient = null;
+ }
+
+ @VisibleForTesting
+ void overrideQuickAccessWalletClientForTest(QuickAccessWalletClient quickAccessWalletClient) {
+ mQuickAccessWalletClient = quickAccessWalletClient;
+ }
+
+ @VisibleForTesting
+ QuickAccessWalletClient getQuickAccessWalletClient() {
+ return mQuickAccessWalletClient;
+ }
+
private void queryWalletCards() {
+ if (!mQuickAccessWalletClient.isWalletFeatureAvailable()) {
+ Log.w(TAG, "QAW feature not unavailable, unable to query wallet cards,");
+ return;
+ }
int cardWidth =
mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_width);
int cardHeight =
@@ -213,6 +244,29 @@ public class QuickAccessWalletTile extends QSTileImpl