Merge "Reduce synchronization in KeyguardService.wrap" into udc-dev

This commit is contained in:
Robin Lee
2023-06-14 10:58:39 +00:00
committed by Android (Google) Code Review

View File

@@ -187,10 +187,10 @@ public class KeyguardService extends Service {
final IRemoteAnimationRunner runner, final boolean lockscreenLiveWallpaperEnabled) { final IRemoteAnimationRunner runner, final boolean lockscreenLiveWallpaperEnabled) {
return new IRemoteTransition.Stub() { return new IRemoteTransition.Stub() {
@GuardedBy("mLeashMap")
private final ArrayMap<SurfaceControl, SurfaceControl> mLeashMap = new ArrayMap<>(); private final ArrayMap<SurfaceControl, SurfaceControl> mLeashMap = new ArrayMap<>();
private final CounterRotator mCounterRotator = new CounterRotator(); private final CounterRotator mCounterRotator = new CounterRotator();
@GuardedBy("mLeashMap") @GuardedBy("mLeashMap")
private IRemoteTransitionFinishedCallback mFinishCallback = null; private IRemoteTransitionFinishedCallback mFinishCallback = null;
@@ -200,12 +200,14 @@ public class KeyguardService extends Service {
throws RemoteException { throws RemoteException {
Slog.d(TAG, "Starts IRemoteAnimationRunner: info=" + info); Slog.d(TAG, "Starts IRemoteAnimationRunner: info=" + info);
synchronized (mLeashMap) { final RemoteAnimationTarget[] apps;
final RemoteAnimationTarget[] apps = final RemoteAnimationTarget[] wallpapers;
wrap(info, false /* wallpapers */, t, mLeashMap, mCounterRotator);
final RemoteAnimationTarget[] wallpapers =
wrap(info, true /* wallpapers */, t, mLeashMap, mCounterRotator);
final RemoteAnimationTarget[] nonApps = new RemoteAnimationTarget[0]; final RemoteAnimationTarget[] nonApps = new RemoteAnimationTarget[0];
synchronized (mLeashMap) {
apps = wrap(info, false /* wallpapers */, t, mLeashMap, mCounterRotator);
wallpapers = wrap(info, true /* wallpapers */, t, mLeashMap, mCounterRotator);
mFinishCallback = finishCallback;
}
// Set alpha back to 1 for the independent changes because we will be animating // Set alpha back to 1 for the independent changes because we will be animating
// children instead. // children instead.
@@ -219,21 +221,17 @@ public class KeyguardService extends Service {
initAlphaForAnimationTargets(t, wallpapers); initAlphaForAnimationTargets(t, wallpapers);
} }
t.apply(); t.apply();
mFinishCallback = finishCallback;
runner.onAnimationStart( runner.onAnimationStart(
getTransitionOldType(info.getType(), info.getFlags(), apps), getTransitionOldType(info.getType(), info.getFlags(), apps),
apps, wallpapers, nonApps, apps, wallpapers, nonApps,
new IRemoteAnimationFinishedCallback.Stub() { new IRemoteAnimationFinishedCallback.Stub() {
@Override @Override
public void onAnimationFinished() throws RemoteException { public void onAnimationFinished() throws RemoteException {
synchronized (mLeashMap) {
Slog.d(TAG, "Finish IRemoteAnimationRunner."); Slog.d(TAG, "Finish IRemoteAnimationRunner.");
finish(); finish();
} }
} });
}
);
}
} }
public void mergeAnimation(IBinder candidateTransition, TransitionInfo candidateInfo, public void mergeAnimation(IBinder candidateTransition, TransitionInfo candidateInfo,
@@ -247,10 +245,8 @@ public class KeyguardService extends Service {
} }
try { try {
synchronized (mLeashMap) {
runner.onAnimationCancelled(); runner.onAnimationCancelled();
finish(); finish();
}
} catch (RemoteException e) { } catch (RemoteException e) {
// nothing, we'll just let it finish on its own I guess. // nothing, we'll just let it finish on its own I guess.
} }
@@ -264,18 +260,22 @@ public class KeyguardService extends Service {
} }
} }
@GuardedBy("mLeashMap")
private void finish() throws RemoteException { private void finish() throws RemoteException {
IRemoteTransitionFinishedCallback finishCallback = null;
SurfaceControl.Transaction finishTransaction = null; SurfaceControl.Transaction finishTransaction = null;
synchronized (mLeashMap) {
if (mCounterRotator.getSurface() != null if (mCounterRotator.getSurface() != null
&& mCounterRotator.getSurface().isValid()) { && mCounterRotator.getSurface().isValid()) {
finishTransaction = new SurfaceControl.Transaction(); finishTransaction = new SurfaceControl.Transaction();
mCounterRotator.cleanUp(finishTransaction); mCounterRotator.cleanUp(finishTransaction);
} }
mLeashMap.clear(); mLeashMap.clear();
final IRemoteTransitionFinishedCallback finishCallback = mFinishCallback; finishCallback = mFinishCallback;
if (finishCallback != null) {
mFinishCallback = null; mFinishCallback = null;
}
if (finishCallback != null) {
finishCallback.onTransitionFinished(null /* wct */, finishTransaction); finishCallback.onTransitionFinished(null /* wct */, finishTransaction);
} else if (finishTransaction != null) { } else if (finishTransaction != null) {
finishTransaction.apply(); finishTransaction.apply();