Merge "Removing RemoteTransitionCompat and related wrappers" into tm-qpr-dev
This commit is contained in:
@@ -24,7 +24,6 @@ import android.os.UserHandle;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
import com.android.systemui.shared.recents.model.Task;
|
||||
import com.android.systemui.shared.system.RemoteTransitionCompat;
|
||||
|
||||
/**
|
||||
* Temporary callbacks into SystemUI.
|
||||
|
||||
@@ -1,258 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2018 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 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 static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.IApplicationThread;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.Log;
|
||||
import android.view.IRemoteAnimationFinishedCallback;
|
||||
import android.view.IRemoteAnimationRunner;
|
||||
import android.view.RemoteAnimationAdapter;
|
||||
import android.view.RemoteAnimationTarget;
|
||||
import android.view.SurfaceControl;
|
||||
import android.window.IRemoteTransition;
|
||||
import android.window.IRemoteTransitionFinishedCallback;
|
||||
import android.window.RemoteTransition;
|
||||
import android.window.TransitionInfo;
|
||||
|
||||
import com.android.wm.shell.util.CounterRotator;
|
||||
|
||||
/**
|
||||
* @see RemoteAnimationAdapter
|
||||
*/
|
||||
public class RemoteAnimationAdapterCompat {
|
||||
|
||||
private final RemoteAnimationAdapter mWrapped;
|
||||
private final RemoteTransitionCompat mRemoteTransition;
|
||||
|
||||
public RemoteAnimationAdapterCompat(RemoteAnimationRunnerCompat runner, long duration,
|
||||
long statusBarTransitionDelay, IApplicationThread appThread) {
|
||||
mWrapped = new RemoteAnimationAdapter(wrapRemoteAnimationRunner(runner), duration,
|
||||
statusBarTransitionDelay);
|
||||
mRemoteTransition = buildRemoteTransition(runner, appThread);
|
||||
}
|
||||
|
||||
public RemoteAnimationAdapter getWrapped() {
|
||||
return mWrapped;
|
||||
}
|
||||
|
||||
/** Helper to just build a remote transition. Use this if the legacy adapter isn't needed. */
|
||||
public static RemoteTransitionCompat buildRemoteTransition(RemoteAnimationRunnerCompat runner,
|
||||
IApplicationThread appThread) {
|
||||
return new RemoteTransitionCompat(
|
||||
new RemoteTransition(wrapRemoteTransition(runner), appThread));
|
||||
}
|
||||
|
||||
public RemoteTransitionCompat getRemoteTransition() {
|
||||
return mRemoteTransition;
|
||||
}
|
||||
|
||||
/** Wraps a RemoteAnimationRunnerCompat in an IRemoteAnimationRunner. */
|
||||
public static IRemoteAnimationRunner.Stub wrapRemoteAnimationRunner(
|
||||
final RemoteAnimationRunnerCompat remoteAnimationAdapter) {
|
||||
return new IRemoteAnimationRunner.Stub() {
|
||||
@Override
|
||||
public void onAnimationStart(@TransitionOldType int transit,
|
||||
RemoteAnimationTarget[] apps,
|
||||
RemoteAnimationTarget[] wallpapers,
|
||||
RemoteAnimationTarget[] nonApps,
|
||||
final IRemoteAnimationFinishedCallback finishedCallback) {
|
||||
final Runnable animationFinishedCallback = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
finishedCallback.onAnimationFinished();
|
||||
} catch (RemoteException e) {
|
||||
Log.e("ActivityOptionsCompat", "Failed to call app controlled animation"
|
||||
+ " finished callback", e);
|
||||
}
|
||||
}
|
||||
};
|
||||
remoteAnimationAdapter.onAnimationStart(transit, apps, wallpapers,
|
||||
nonApps, animationFinishedCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationCancelled(boolean isKeyguardOccluded) {
|
||||
remoteAnimationAdapter.onAnimationCancelled();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private static IRemoteTransition.Stub wrapRemoteTransition(
|
||||
final RemoteAnimationRunnerCompat remoteAnimationAdapter) {
|
||||
return new IRemoteTransition.Stub() {
|
||||
final ArrayMap<IBinder, Runnable> mFinishRunnables = new ArrayMap<>();
|
||||
|
||||
@Override
|
||||
public void startAnimation(IBinder token, TransitionInfo info,
|
||||
SurfaceControl.Transaction t,
|
||||
IRemoteTransitionFinishedCallback finishCallback) {
|
||||
final ArrayMap<SurfaceControl, SurfaceControl> leashMap = new ArrayMap<>();
|
||||
final RemoteAnimationTarget[] apps =
|
||||
RemoteAnimationTargetCompat.wrapApps(info, t, leashMap);
|
||||
final RemoteAnimationTarget[] wallpapers =
|
||||
RemoteAnimationTargetCompat.wrapNonApps(
|
||||
info, true /* wallpapers */, t, leashMap);
|
||||
final RemoteAnimationTarget[] nonApps =
|
||||
RemoteAnimationTargetCompat.wrapNonApps(
|
||||
info, false /* wallpapers */, t, leashMap);
|
||||
|
||||
// TODO(b/177438007): Move this set-up logic into launcher's animation impl.
|
||||
boolean isReturnToHome = false;
|
||||
TransitionInfo.Change launcherTask = null;
|
||||
TransitionInfo.Change wallpaper = null;
|
||||
int launcherLayer = 0;
|
||||
int rotateDelta = 0;
|
||||
float displayW = 0;
|
||||
float displayH = 0;
|
||||
for (int i = info.getChanges().size() - 1; i >= 0; --i) {
|
||||
final TransitionInfo.Change change = info.getChanges().get(i);
|
||||
// skip changes that we didn't wrap
|
||||
if (!leashMap.containsKey(change.getLeash())) continue;
|
||||
if (change.getTaskInfo() != null
|
||||
&& change.getTaskInfo().getActivityType() == ACTIVITY_TYPE_HOME) {
|
||||
isReturnToHome = change.getMode() == TRANSIT_OPEN
|
||||
|| change.getMode() == TRANSIT_TO_FRONT;
|
||||
launcherTask = change;
|
||||
launcherLayer = info.getChanges().size() - i;
|
||||
} else if ((change.getFlags() & FLAG_IS_WALLPAPER) != 0) {
|
||||
wallpaper = change;
|
||||
}
|
||||
if (change.getParent() == null && change.getEndRotation() >= 0
|
||||
&& change.getEndRotation() != change.getStartRotation()) {
|
||||
rotateDelta = change.getEndRotation() - change.getStartRotation();
|
||||
displayW = change.getEndAbsBounds().width();
|
||||
displayH = change.getEndAbsBounds().height();
|
||||
}
|
||||
}
|
||||
|
||||
// Prepare for rotation if there is one
|
||||
final CounterRotator counterLauncher = new CounterRotator();
|
||||
final CounterRotator counterWallpaper = new CounterRotator();
|
||||
if (launcherTask != null && rotateDelta != 0 && launcherTask.getParent() != null) {
|
||||
counterLauncher.setup(t, info.getChange(launcherTask.getParent()).getLeash(),
|
||||
rotateDelta, displayW, displayH);
|
||||
if (counterLauncher.getSurface() != null) {
|
||||
t.setLayer(counterLauncher.getSurface(), launcherLayer);
|
||||
}
|
||||
}
|
||||
|
||||
if (isReturnToHome) {
|
||||
if (counterLauncher.getSurface() != null) {
|
||||
t.setLayer(counterLauncher.getSurface(), info.getChanges().size() * 3);
|
||||
}
|
||||
// Need to "boost" the closing things since that's what launcher expects.
|
||||
for (int i = info.getChanges().size() - 1; i >= 0; --i) {
|
||||
final TransitionInfo.Change change = info.getChanges().get(i);
|
||||
final SurfaceControl leash = leashMap.get(change.getLeash());
|
||||
// skip changes that we didn't wrap
|
||||
if (leash == null) continue;
|
||||
final int mode = info.getChanges().get(i).getMode();
|
||||
// Only deal with independent layers
|
||||
if (!TransitionInfo.isIndependent(change, info)) continue;
|
||||
if (mode == TRANSIT_CLOSE || mode == TRANSIT_TO_BACK) {
|
||||
t.setLayer(leash, info.getChanges().size() * 3 - i);
|
||||
counterLauncher.addChild(t, leash);
|
||||
}
|
||||
}
|
||||
// Make wallpaper visible immediately since launcher apparently won't do this.
|
||||
for (int i = wallpapers.length - 1; i >= 0; --i) {
|
||||
t.show(wallpapers[i].leash);
|
||||
t.setAlpha(wallpapers[i].leash, 1.f);
|
||||
}
|
||||
} else {
|
||||
if (launcherTask != null) {
|
||||
counterLauncher.addChild(t, leashMap.get(launcherTask.getLeash()));
|
||||
}
|
||||
if (wallpaper != null && rotateDelta != 0 && wallpaper.getParent() != null) {
|
||||
counterWallpaper.setup(t, info.getChange(wallpaper.getParent()).getLeash(),
|
||||
rotateDelta, displayW, displayH);
|
||||
if (counterWallpaper.getSurface() != null) {
|
||||
t.setLayer(counterWallpaper.getSurface(), -1);
|
||||
counterWallpaper.addChild(t, leashMap.get(wallpaper.getLeash()));
|
||||
}
|
||||
}
|
||||
}
|
||||
t.apply();
|
||||
|
||||
final Runnable animationFinishedCallback = new Runnable() {
|
||||
@Override
|
||||
@SuppressLint("NewApi")
|
||||
public void run() {
|
||||
final SurfaceControl.Transaction finishTransaction =
|
||||
new SurfaceControl.Transaction();
|
||||
counterLauncher.cleanUp(finishTransaction);
|
||||
counterWallpaper.cleanUp(finishTransaction);
|
||||
// Release surface references now. This is apparently to free GPU memory
|
||||
// while doing quick operations (eg. during CTS).
|
||||
for (int i = info.getChanges().size() - 1; i >= 0; --i) {
|
||||
info.getChanges().get(i).getLeash().release();
|
||||
}
|
||||
// Don't release here since launcher might still be using them. Instead
|
||||
// let launcher release them (eg. via RemoteAnimationTargets)
|
||||
leashMap.clear();
|
||||
try {
|
||||
finishCallback.onTransitionFinished(null /* wct */, finishTransaction);
|
||||
} catch (RemoteException e) {
|
||||
Log.e("ActivityOptionsCompat", "Failed to call app controlled animation"
|
||||
+ " finished callback", e);
|
||||
}
|
||||
}
|
||||
};
|
||||
synchronized (mFinishRunnables) {
|
||||
mFinishRunnables.put(token, animationFinishedCallback);
|
||||
}
|
||||
// TODO(bc-unlcok): Pass correct transit type.
|
||||
remoteAnimationAdapter.onAnimationStart(TRANSIT_OLD_NONE,
|
||||
apps, wallpapers, nonApps, () -> {
|
||||
synchronized (mFinishRunnables) {
|
||||
if (mFinishRunnables.remove(token) == null) return;
|
||||
}
|
||||
animationFinishedCallback.run();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mergeAnimation(IBinder token, TransitionInfo info,
|
||||
SurfaceControl.Transaction t, IBinder mergeTarget,
|
||||
IRemoteTransitionFinishedCallback finishCallback) {
|
||||
// TODO: hook up merge to recents onTaskAppeared if applicable. Until then, adapt
|
||||
// to legacy cancel.
|
||||
final Runnable finishRunnable;
|
||||
synchronized (mFinishRunnables) {
|
||||
finishRunnable = mFinishRunnables.remove(mergeTarget);
|
||||
}
|
||||
if (finishRunnable == null) return;
|
||||
remoteAnimationAdapter.onAnimationCancelled();
|
||||
finishRunnable.run();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2018 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 com.android.systemui.shared.system;
|
||||
|
||||
import android.view.RemoteAnimationDefinition;
|
||||
|
||||
/**
|
||||
* @see RemoteAnimationDefinition
|
||||
*/
|
||||
public class RemoteAnimationDefinitionCompat {
|
||||
|
||||
private final RemoteAnimationDefinition mWrapped = new RemoteAnimationDefinition();
|
||||
|
||||
public void addRemoteAnimation(int transition, RemoteAnimationAdapterCompat adapter) {
|
||||
mWrapped.addRemoteAnimation(transition, adapter.getWrapped());
|
||||
}
|
||||
|
||||
public void addRemoteAnimation(int transition, int activityTypeFilter,
|
||||
RemoteAnimationAdapterCompat adapter) {
|
||||
mWrapped.addRemoteAnimation(transition, activityTypeFilter, adapter.getWrapped());
|
||||
}
|
||||
|
||||
public RemoteAnimationDefinition getWrapped() {
|
||||
return mWrapped;
|
||||
}
|
||||
}
|
||||
@@ -16,12 +16,197 @@
|
||||
|
||||
package com.android.systemui.shared.system;
|
||||
|
||||
import android.view.RemoteAnimationTarget;
|
||||
import android.view.WindowManager;
|
||||
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.window.TransitionInfo.FLAG_IS_WALLPAPER;
|
||||
|
||||
public interface RemoteAnimationRunnerCompat {
|
||||
void onAnimationStart(@WindowManager.TransitionOldType int transit,
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.Log;
|
||||
import android.view.IRemoteAnimationFinishedCallback;
|
||||
import android.view.IRemoteAnimationRunner;
|
||||
import android.view.RemoteAnimationTarget;
|
||||
import android.view.SurfaceControl;
|
||||
import android.view.WindowManager;
|
||||
import android.view.WindowManager.TransitionOldType;
|
||||
import android.window.IRemoteTransition;
|
||||
import android.window.IRemoteTransitionFinishedCallback;
|
||||
import android.window.TransitionInfo;
|
||||
|
||||
import com.android.wm.shell.util.CounterRotator;
|
||||
|
||||
public abstract class RemoteAnimationRunnerCompat extends IRemoteAnimationRunner.Stub {
|
||||
|
||||
public abstract void onAnimationStart(@WindowManager.TransitionOldType int transit,
|
||||
RemoteAnimationTarget[] apps, RemoteAnimationTarget[] wallpapers,
|
||||
RemoteAnimationTarget[] nonApps, Runnable finishedCallback);
|
||||
void onAnimationCancelled();
|
||||
|
||||
@Override
|
||||
public final void onAnimationStart(@TransitionOldType int transit,
|
||||
RemoteAnimationTarget[] apps,
|
||||
RemoteAnimationTarget[] wallpapers,
|
||||
RemoteAnimationTarget[] nonApps,
|
||||
final IRemoteAnimationFinishedCallback finishedCallback) {
|
||||
|
||||
onAnimationStart(transit, apps, wallpapers,
|
||||
nonApps, () -> {
|
||||
try {
|
||||
finishedCallback.onAnimationFinished();
|
||||
} catch (RemoteException e) {
|
||||
Log.e("ActivityOptionsCompat", "Failed to call app controlled animation"
|
||||
+ " finished callback", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public IRemoteTransition toRemoteTransition() {
|
||||
return new IRemoteTransition.Stub() {
|
||||
final ArrayMap<IBinder, Runnable> mFinishRunnables = new ArrayMap<>();
|
||||
|
||||
@Override
|
||||
public void startAnimation(IBinder token, TransitionInfo info,
|
||||
SurfaceControl.Transaction t,
|
||||
IRemoteTransitionFinishedCallback finishCallback) {
|
||||
final ArrayMap<SurfaceControl, SurfaceControl> leashMap = new ArrayMap<>();
|
||||
final RemoteAnimationTarget[] apps =
|
||||
RemoteAnimationTargetCompat.wrapApps(info, t, leashMap);
|
||||
final RemoteAnimationTarget[] wallpapers =
|
||||
RemoteAnimationTargetCompat.wrapNonApps(
|
||||
info, true /* wallpapers */, t, leashMap);
|
||||
final RemoteAnimationTarget[] nonApps =
|
||||
RemoteAnimationTargetCompat.wrapNonApps(
|
||||
info, false /* wallpapers */, t, leashMap);
|
||||
|
||||
// TODO(b/177438007): Move this set-up logic into launcher's animation impl.
|
||||
boolean isReturnToHome = false;
|
||||
TransitionInfo.Change launcherTask = null;
|
||||
TransitionInfo.Change wallpaper = null;
|
||||
int launcherLayer = 0;
|
||||
int rotateDelta = 0;
|
||||
float displayW = 0;
|
||||
float displayH = 0;
|
||||
for (int i = info.getChanges().size() - 1; i >= 0; --i) {
|
||||
final TransitionInfo.Change change = info.getChanges().get(i);
|
||||
// skip changes that we didn't wrap
|
||||
if (!leashMap.containsKey(change.getLeash())) continue;
|
||||
if (change.getTaskInfo() != null
|
||||
&& change.getTaskInfo().getActivityType() == ACTIVITY_TYPE_HOME) {
|
||||
isReturnToHome = change.getMode() == TRANSIT_OPEN
|
||||
|| change.getMode() == TRANSIT_TO_FRONT;
|
||||
launcherTask = change;
|
||||
launcherLayer = info.getChanges().size() - i;
|
||||
} else if ((change.getFlags() & FLAG_IS_WALLPAPER) != 0) {
|
||||
wallpaper = change;
|
||||
}
|
||||
if (change.getParent() == null && change.getEndRotation() >= 0
|
||||
&& change.getEndRotation() != change.getStartRotation()) {
|
||||
rotateDelta = change.getEndRotation() - change.getStartRotation();
|
||||
displayW = change.getEndAbsBounds().width();
|
||||
displayH = change.getEndAbsBounds().height();
|
||||
}
|
||||
}
|
||||
|
||||
// Prepare for rotation if there is one
|
||||
final CounterRotator counterLauncher = new CounterRotator();
|
||||
final CounterRotator counterWallpaper = new CounterRotator();
|
||||
if (launcherTask != null && rotateDelta != 0 && launcherTask.getParent() != null) {
|
||||
counterLauncher.setup(t, info.getChange(launcherTask.getParent()).getLeash(),
|
||||
rotateDelta, displayW, displayH);
|
||||
if (counterLauncher.getSurface() != null) {
|
||||
t.setLayer(counterLauncher.getSurface(), launcherLayer);
|
||||
}
|
||||
}
|
||||
|
||||
if (isReturnToHome) {
|
||||
if (counterLauncher.getSurface() != null) {
|
||||
t.setLayer(counterLauncher.getSurface(), info.getChanges().size() * 3);
|
||||
}
|
||||
// Need to "boost" the closing things since that's what launcher expects.
|
||||
for (int i = info.getChanges().size() - 1; i >= 0; --i) {
|
||||
final TransitionInfo.Change change = info.getChanges().get(i);
|
||||
final SurfaceControl leash = leashMap.get(change.getLeash());
|
||||
// skip changes that we didn't wrap
|
||||
if (leash == null) continue;
|
||||
final int mode = info.getChanges().get(i).getMode();
|
||||
// Only deal with independent layers
|
||||
if (!TransitionInfo.isIndependent(change, info)) continue;
|
||||
if (mode == TRANSIT_CLOSE || mode == TRANSIT_TO_BACK) {
|
||||
t.setLayer(leash, info.getChanges().size() * 3 - i);
|
||||
counterLauncher.addChild(t, leash);
|
||||
}
|
||||
}
|
||||
// Make wallpaper visible immediately since launcher apparently won't do this.
|
||||
for (int i = wallpapers.length - 1; i >= 0; --i) {
|
||||
t.show(wallpapers[i].leash);
|
||||
t.setAlpha(wallpapers[i].leash, 1.f);
|
||||
}
|
||||
} else {
|
||||
if (launcherTask != null) {
|
||||
counterLauncher.addChild(t, leashMap.get(launcherTask.getLeash()));
|
||||
}
|
||||
if (wallpaper != null && rotateDelta != 0 && wallpaper.getParent() != null) {
|
||||
counterWallpaper.setup(t, info.getChange(wallpaper.getParent()).getLeash(),
|
||||
rotateDelta, displayW, displayH);
|
||||
if (counterWallpaper.getSurface() != null) {
|
||||
t.setLayer(counterWallpaper.getSurface(), -1);
|
||||
counterWallpaper.addChild(t, leashMap.get(wallpaper.getLeash()));
|
||||
}
|
||||
}
|
||||
}
|
||||
t.apply();
|
||||
|
||||
final Runnable animationFinishedCallback = () -> {
|
||||
final SurfaceControl.Transaction finishTransaction =
|
||||
new SurfaceControl.Transaction();
|
||||
counterLauncher.cleanUp(finishTransaction);
|
||||
counterWallpaper.cleanUp(finishTransaction);
|
||||
// Release surface references now. This is apparently to free GPU memory
|
||||
// while doing quick operations (eg. during CTS).
|
||||
for (int i = info.getChanges().size() - 1; i >= 0; --i) {
|
||||
info.getChanges().get(i).getLeash().release();
|
||||
}
|
||||
// Don't release here since launcher might still be using them. Instead
|
||||
// let launcher release them (eg. via RemoteAnimationTargets)
|
||||
leashMap.clear();
|
||||
try {
|
||||
finishCallback.onTransitionFinished(null /* wct */, finishTransaction);
|
||||
} catch (RemoteException e) {
|
||||
Log.e("ActivityOptionsCompat", "Failed to call app controlled animation"
|
||||
+ " finished callback", e);
|
||||
}
|
||||
};
|
||||
synchronized (mFinishRunnables) {
|
||||
mFinishRunnables.put(token, animationFinishedCallback);
|
||||
}
|
||||
// TODO(bc-unlcok): Pass correct transit type.
|
||||
onAnimationStart(TRANSIT_OLD_NONE,
|
||||
apps, wallpapers, nonApps, () -> {
|
||||
synchronized (mFinishRunnables) {
|
||||
if (mFinishRunnables.remove(token) == null) return;
|
||||
}
|
||||
animationFinishedCallback.run();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mergeAnimation(IBinder token, TransitionInfo info,
|
||||
SurfaceControl.Transaction t, IBinder mergeTarget,
|
||||
IRemoteTransitionFinishedCallback finishCallback) throws RemoteException {
|
||||
// TODO: hook up merge to recents onTaskAppeared if applicable. Until then, adapt
|
||||
// to legacy cancel.
|
||||
final Runnable finishRunnable;
|
||||
synchronized (mFinishRunnables) {
|
||||
finishRunnable = mFinishRunnables.remove(mergeTarget);
|
||||
}
|
||||
if (finishRunnable == null) return;
|
||||
onAnimationCancelled(false /* isKeyguardOccluded */);
|
||||
finishRunnable.run();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -1,19 +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 com.android.systemui.shared.system;
|
||||
|
||||
parcelable RemoteTransitionCompat;
|
||||
@@ -18,29 +18,22 @@ package com.android.systemui.shared.system;
|
||||
|
||||
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
|
||||
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
|
||||
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
|
||||
import static android.view.RemoteAnimationTarget.MODE_CLOSING;
|
||||
import static android.view.WindowManager.TRANSIT_CHANGE;
|
||||
import static android.view.WindowManager.TRANSIT_CLOSE;
|
||||
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
|
||||
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_LOCKED;
|
||||
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.window.TransitionFilter.CONTAINER_ORDER_TOP;
|
||||
|
||||
import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.newTarget;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityTaskManager;
|
||||
import android.app.IApplicationThread;
|
||||
import android.content.ComponentName;
|
||||
import android.graphics.Rect;
|
||||
import android.os.IBinder;
|
||||
import android.os.Parcelable;
|
||||
import android.os.RemoteException;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.Log;
|
||||
@@ -53,72 +46,23 @@ import android.window.IRemoteTransitionFinishedCallback;
|
||||
import android.window.PictureInPictureSurfaceTransaction;
|
||||
import android.window.RemoteTransition;
|
||||
import android.window.TaskSnapshot;
|
||||
import android.window.TransitionFilter;
|
||||
import android.window.TransitionInfo;
|
||||
import android.window.WindowContainerToken;
|
||||
import android.window.WindowContainerTransaction;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.util.DataClass;
|
||||
import com.android.systemui.shared.recents.model.ThumbnailData;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
/**
|
||||
* Wrapper to expose RemoteTransition (shell transitions) to Launcher.
|
||||
*
|
||||
* @see IRemoteTransition
|
||||
* @see TransitionFilter
|
||||
* Helper class to build {@link RemoteTransition} objects
|
||||
*/
|
||||
@DataClass
|
||||
public class RemoteTransitionCompat implements Parcelable {
|
||||
public class RemoteTransitionCompat {
|
||||
private static final String TAG = "RemoteTransitionCompat";
|
||||
|
||||
@NonNull final RemoteTransition mTransition;
|
||||
@Nullable TransitionFilter mFilter = null;
|
||||
|
||||
RemoteTransitionCompat(RemoteTransition transition) {
|
||||
mTransition = transition;
|
||||
}
|
||||
|
||||
public RemoteTransitionCompat(@NonNull RemoteTransitionRunner runner,
|
||||
@NonNull Executor executor, @Nullable IApplicationThread appThread) {
|
||||
IRemoteTransition remote = new IRemoteTransition.Stub() {
|
||||
@Override
|
||||
public void startAnimation(IBinder transition, TransitionInfo info,
|
||||
SurfaceControl.Transaction t,
|
||||
IRemoteTransitionFinishedCallback finishedCallback) {
|
||||
final Runnable finishAdapter = () -> {
|
||||
try {
|
||||
finishedCallback.onTransitionFinished(null /* wct */, null /* sct */);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Failed to call transition finished callback", e);
|
||||
}
|
||||
};
|
||||
executor.execute(() -> runner.startAnimation(transition, info, t, finishAdapter));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mergeAnimation(IBinder transition, TransitionInfo info,
|
||||
SurfaceControl.Transaction t, IBinder mergeTarget,
|
||||
IRemoteTransitionFinishedCallback finishedCallback) {
|
||||
final Runnable finishAdapter = () -> {
|
||||
try {
|
||||
finishedCallback.onTransitionFinished(null /* wct */, null /* sct */);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Failed to call transition finished callback", e);
|
||||
}
|
||||
};
|
||||
executor.execute(() -> runner.mergeAnimation(transition, info, t, mergeTarget,
|
||||
finishAdapter));
|
||||
}
|
||||
};
|
||||
mTransition = new RemoteTransition(remote, appThread);
|
||||
}
|
||||
|
||||
/** Constructor specifically for recents animation */
|
||||
public RemoteTransitionCompat(RecentsAnimationListener recents,
|
||||
public static RemoteTransition newRemoteTransition(RecentsAnimationListener recents,
|
||||
RecentsAnimationControllerCompat controller, IApplicationThread appThread) {
|
||||
IRemoteTransition remote = new IRemoteTransition.Stub() {
|
||||
final RecentsControllerWrap mRecentsSession = new RecentsControllerWrap();
|
||||
@@ -193,25 +137,7 @@ public class RemoteTransitionCompat implements Parcelable {
|
||||
mRecentsSession.commitTasksAppearedIfNeeded(recents);
|
||||
}
|
||||
};
|
||||
mTransition = new RemoteTransition(remote, appThread);
|
||||
}
|
||||
|
||||
/** Adds a filter check that restricts this remote transition to home open transitions. */
|
||||
public void addHomeOpenCheck(ComponentName homeActivity) {
|
||||
if (mFilter == null) {
|
||||
mFilter = new TransitionFilter();
|
||||
}
|
||||
// No need to handle the transition that also dismisses keyguard.
|
||||
mFilter.mNotFlags = TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
|
||||
mFilter.mRequirements =
|
||||
new TransitionFilter.Requirement[]{new TransitionFilter.Requirement(),
|
||||
new TransitionFilter.Requirement()};
|
||||
mFilter.mRequirements[0].mActivityType = ACTIVITY_TYPE_HOME;
|
||||
mFilter.mRequirements[0].mTopActivity = homeActivity;
|
||||
mFilter.mRequirements[0].mModes = new int[]{TRANSIT_OPEN, TRANSIT_TO_FRONT};
|
||||
mFilter.mRequirements[0].mOrder = CONTAINER_ORDER_TOP;
|
||||
mFilter.mRequirements[1].mActivityType = ACTIVITY_TYPE_STANDARD;
|
||||
mFilter.mRequirements[1].mModes = new int[]{TRANSIT_CLOSE, TRANSIT_TO_BACK};
|
||||
return new RemoteTransition(remote, appThread);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -505,161 +431,4 @@ public class RemoteTransitionCompat implements Parcelable {
|
||||
@Override public void animateNavigationBarToApp(long duration) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Code below generated by codegen v1.0.23.
|
||||
//
|
||||
// DO NOT MODIFY!
|
||||
// CHECKSTYLE:OFF Generated code
|
||||
//
|
||||
// To regenerate run:
|
||||
// $ codegen $ANDROID_BUILD_TOP/frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
|
||||
//
|
||||
// To exclude the generated code from IntelliJ auto-formatting enable (one-time):
|
||||
// Settings > Editor > Code Style > Formatter Control
|
||||
//@formatter:off
|
||||
|
||||
|
||||
@DataClass.Generated.Member
|
||||
/* package-private */ RemoteTransitionCompat(
|
||||
@NonNull RemoteTransition transition,
|
||||
@Nullable TransitionFilter filter) {
|
||||
this.mTransition = transition;
|
||||
com.android.internal.util.AnnotationValidations.validate(
|
||||
NonNull.class, null, mTransition);
|
||||
this.mFilter = filter;
|
||||
|
||||
// onConstructed(); // You can define this method to get a callback
|
||||
}
|
||||
|
||||
@DataClass.Generated.Member
|
||||
public @NonNull RemoteTransition getTransition() {
|
||||
return mTransition;
|
||||
}
|
||||
|
||||
@DataClass.Generated.Member
|
||||
public @Nullable TransitionFilter getFilter() {
|
||||
return mFilter;
|
||||
}
|
||||
|
||||
@Override
|
||||
@DataClass.Generated.Member
|
||||
public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
|
||||
// You can override field parcelling by defining methods like:
|
||||
// void parcelFieldName(Parcel dest, int flags) { ... }
|
||||
|
||||
byte flg = 0;
|
||||
if (mFilter != null) flg |= 0x2;
|
||||
dest.writeByte(flg);
|
||||
dest.writeTypedObject(mTransition, flags);
|
||||
if (mFilter != null) dest.writeTypedObject(mFilter, flags);
|
||||
}
|
||||
|
||||
@Override
|
||||
@DataClass.Generated.Member
|
||||
public int describeContents() { return 0; }
|
||||
|
||||
/** @hide */
|
||||
@SuppressWarnings({"unchecked", "RedundantCast"})
|
||||
@DataClass.Generated.Member
|
||||
protected RemoteTransitionCompat(@NonNull android.os.Parcel in) {
|
||||
// You can override field unparcelling by defining methods like:
|
||||
// static FieldType unparcelFieldName(Parcel in) { ... }
|
||||
|
||||
byte flg = in.readByte();
|
||||
RemoteTransition transition = (RemoteTransition) in.readTypedObject(RemoteTransition.CREATOR);
|
||||
TransitionFilter filter = (flg & 0x2) == 0 ? null : (TransitionFilter) in.readTypedObject(TransitionFilter.CREATOR);
|
||||
|
||||
this.mTransition = transition;
|
||||
com.android.internal.util.AnnotationValidations.validate(
|
||||
NonNull.class, null, mTransition);
|
||||
this.mFilter = filter;
|
||||
|
||||
// onConstructed(); // You can define this method to get a callback
|
||||
}
|
||||
|
||||
@DataClass.Generated.Member
|
||||
public static final @NonNull Parcelable.Creator<RemoteTransitionCompat> CREATOR
|
||||
= new Parcelable.Creator<RemoteTransitionCompat>() {
|
||||
@Override
|
||||
public RemoteTransitionCompat[] newArray(int size) {
|
||||
return new RemoteTransitionCompat[size];
|
||||
}
|
||||
|
||||
@Override
|
||||
public RemoteTransitionCompat createFromParcel(@NonNull android.os.Parcel in) {
|
||||
return new RemoteTransitionCompat(in);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* A builder for {@link RemoteTransitionCompat}
|
||||
*/
|
||||
@SuppressWarnings("WeakerAccess")
|
||||
@DataClass.Generated.Member
|
||||
public static class Builder {
|
||||
|
||||
private @NonNull RemoteTransition mTransition;
|
||||
private @Nullable TransitionFilter mFilter;
|
||||
|
||||
private long mBuilderFieldsSet = 0L;
|
||||
|
||||
public Builder(
|
||||
@NonNull RemoteTransition transition) {
|
||||
mTransition = transition;
|
||||
com.android.internal.util.AnnotationValidations.validate(
|
||||
NonNull.class, null, mTransition);
|
||||
}
|
||||
|
||||
@DataClass.Generated.Member
|
||||
public @NonNull Builder setTransition(@NonNull RemoteTransition value) {
|
||||
checkNotUsed();
|
||||
mBuilderFieldsSet |= 0x1;
|
||||
mTransition = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
@DataClass.Generated.Member
|
||||
public @NonNull Builder setFilter(@NonNull TransitionFilter value) {
|
||||
checkNotUsed();
|
||||
mBuilderFieldsSet |= 0x2;
|
||||
mFilter = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/** Builds the instance. This builder should not be touched after calling this! */
|
||||
public @NonNull RemoteTransitionCompat build() {
|
||||
checkNotUsed();
|
||||
mBuilderFieldsSet |= 0x4; // Mark builder used
|
||||
|
||||
if ((mBuilderFieldsSet & 0x2) == 0) {
|
||||
mFilter = null;
|
||||
}
|
||||
RemoteTransitionCompat o = new RemoteTransitionCompat(
|
||||
mTransition,
|
||||
mFilter);
|
||||
return o;
|
||||
}
|
||||
|
||||
private void checkNotUsed() {
|
||||
if ((mBuilderFieldsSet & 0x4) != 0) {
|
||||
throw new IllegalStateException(
|
||||
"This Builder should not be reused. Use a new Builder instance instead");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@DataClass.Generated(
|
||||
time = 1629321609807L,
|
||||
codegenVersion = "1.0.23",
|
||||
sourceFile = "frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java",
|
||||
inputSignatures = "private static final java.lang.String TAG\nfinal @android.annotation.NonNull android.window.RemoteTransition mTransition\n @android.annotation.Nullable android.window.TransitionFilter mFilter\npublic void addHomeOpenCheck(android.content.ComponentName)\nclass RemoteTransitionCompat extends java.lang.Object implements [android.os.Parcelable]\nprivate com.android.systemui.shared.system.RecentsAnimationControllerCompat mWrapped\nprivate android.window.IRemoteTransitionFinishedCallback mFinishCB\nprivate android.window.WindowContainerToken mPausingTask\nprivate android.window.WindowContainerToken mPipTask\nprivate android.window.TransitionInfo mInfo\nprivate android.view.SurfaceControl mOpeningLeash\nprivate android.util.ArrayMap<android.view.SurfaceControl,android.view.SurfaceControl> mLeashMap\nprivate android.window.PictureInPictureSurfaceTransaction mPipTransaction\nprivate android.os.IBinder mTransition\n void setup(com.android.systemui.shared.system.RecentsAnimationControllerCompat,android.window.TransitionInfo,android.window.IRemoteTransitionFinishedCallback,android.window.WindowContainerToken,android.window.WindowContainerToken,android.util.ArrayMap<android.view.SurfaceControl,android.view.SurfaceControl>,android.os.IBinder)\n @android.annotation.SuppressLint boolean merge(android.window.TransitionInfo,android.view.SurfaceControl.Transaction,com.android.systemui.shared.system.RecentsAnimationListener)\npublic @java.lang.Override com.android.systemui.shared.recents.model.ThumbnailData screenshotTask(int)\npublic @java.lang.Override void setInputConsumerEnabled(boolean)\npublic @java.lang.Override void setAnimationTargetsBehindSystemBars(boolean)\npublic @java.lang.Override void hideCurrentInputMethod()\npublic @java.lang.Override void setFinishTaskTransaction(int,android.window.PictureInPictureSurfaceTransaction,android.view.SurfaceControl)\npublic @java.lang.Override @android.annotation.SuppressLint void finish(boolean,boolean)\npublic @java.lang.Override void setDeferCancelUntilNextTransition(boolean,boolean)\npublic @java.lang.Override void cleanupScreenshot()\npublic @java.lang.Override void setWillFinishToHome(boolean)\npublic @java.lang.Override boolean removeTask(int)\npublic @java.lang.Override void detachNavigationBarFromApp(boolean)\npublic @java.lang.Override void animateNavigationBarToApp(long)\nclass RecentsControllerWrap extends com.android.systemui.shared.system.RecentsAnimationControllerCompat implements []\n@com.android.internal.util.DataClass")
|
||||
@Deprecated
|
||||
private void __metadata() {}
|
||||
|
||||
|
||||
//@formatter:on
|
||||
// End of generated code
|
||||
|
||||
}
|
||||
|
||||
@@ -1,42 +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 com.android.systemui.shared.system;
|
||||
|
||||
import android.os.IBinder;
|
||||
import android.view.SurfaceControl;
|
||||
import android.window.TransitionInfo;
|
||||
|
||||
/** Interface for something that runs a remote transition animation. */
|
||||
public interface RemoteTransitionRunner {
|
||||
/**
|
||||
* Starts a transition animation. Once complete, the implementation should call
|
||||
* `finishCallback`.
|
||||
*/
|
||||
void startAnimation(IBinder transition, TransitionInfo info, SurfaceControl.Transaction t,
|
||||
Runnable finishCallback);
|
||||
|
||||
/**
|
||||
* Attempts to merge a transition into the currently-running animation. If merge is not
|
||||
* possible/supported, this should do nothing. Otherwise, the implementation should call
|
||||
* `finishCallback` immediately to indicate that it merged the transition.
|
||||
*
|
||||
* @param transition The transition that wants to be merged into the running animation.
|
||||
* @param mergeTarget The transition to merge into (that this runner is currently animating).
|
||||
*/
|
||||
default void mergeAnimation(IBinder transition, TransitionInfo info,
|
||||
SurfaceControl.Transaction t, IBinder mergeTarget, Runnable finishCallback) { }
|
||||
}
|
||||
Reference in New Issue
Block a user