Merge changes from topic "explicit-keyguard-occlude-flags" into udc-dev am: a4e114a890
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23517279 Change-Id: I2698170e17e00dd64f1ca382a350e4f00cc17ab2 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -435,11 +435,15 @@ public interface WindowManager extends ViewManager {
|
|||||||
int TRANSIT_KEYGUARD_GOING_AWAY = 7;
|
int TRANSIT_KEYGUARD_GOING_AWAY = 7;
|
||||||
/**
|
/**
|
||||||
* A window is appearing above a locked keyguard.
|
* A window is appearing above a locked keyguard.
|
||||||
|
* @deprecated use {@link #TRANSIT_TO_FRONT} + {@link #TRANSIT_FLAG_KEYGUARD_OCCLUDING} for
|
||||||
|
* keyguard occluding with Shell transition.
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
int TRANSIT_KEYGUARD_OCCLUDE = 8;
|
int TRANSIT_KEYGUARD_OCCLUDE = 8;
|
||||||
/**
|
/**
|
||||||
* A window is made invisible revealing a locked keyguard.
|
* A window is made invisible revealing a locked keyguard.
|
||||||
|
* @deprecated use {@link #TRANSIT_TO_BACK} + {@link #TRANSIT_FLAG_KEYGUARD_UNOCCLUDING} for
|
||||||
|
* keyguard occluding with Shell transition.
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
int TRANSIT_KEYGUARD_UNOCCLUDE = 9;
|
int TRANSIT_KEYGUARD_UNOCCLUDE = 9;
|
||||||
@@ -561,6 +565,25 @@ public interface WindowManager extends ViewManager {
|
|||||||
*/
|
*/
|
||||||
int TRANSIT_FLAG_INVISIBLE = (1 << 10); // 0x400
|
int TRANSIT_FLAG_INVISIBLE = (1 << 10); // 0x400
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transition flag: Indicates that keyguard will be showing (locked) with this transition,
|
||||||
|
* which is the opposite of {@link #TRANSIT_FLAG_KEYGUARD_GOING_AWAY}.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
int TRANSIT_FLAG_KEYGUARD_APPEARING = (1 << 11); // 0x800
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transition flag: Indicates that keyguard is becoming hidden by an app
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
int TRANSIT_FLAG_KEYGUARD_OCCLUDING = (1 << 12); // 0x1000
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transition flag: Indicates that keyguard is being revealed after an app was occluding it.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
int TRANSIT_FLAG_KEYGUARD_UNOCCLUDING = (1 << 13); // 0x2000
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
@@ -576,10 +599,27 @@ public interface WindowManager extends ViewManager {
|
|||||||
TRANSIT_FLAG_KEYGUARD_GOING_AWAY,
|
TRANSIT_FLAG_KEYGUARD_GOING_AWAY,
|
||||||
TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_LAUNCHER_CLEAR_SNAPSHOT,
|
TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_LAUNCHER_CLEAR_SNAPSHOT,
|
||||||
TRANSIT_FLAG_INVISIBLE,
|
TRANSIT_FLAG_INVISIBLE,
|
||||||
|
TRANSIT_FLAG_KEYGUARD_APPEARING,
|
||||||
|
TRANSIT_FLAG_KEYGUARD_OCCLUDING,
|
||||||
|
TRANSIT_FLAG_KEYGUARD_UNOCCLUDING
|
||||||
})
|
})
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@interface TransitionFlags {}
|
@interface TransitionFlags {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transit flags used to signal keyguard visibility is changing for animations.
|
||||||
|
*
|
||||||
|
* <p>These roughly correspond to CLOSE, OPEN, TO_BACK, and TO_FRONT on a hypothetical Keyguard
|
||||||
|
* container. Since Keyguard isn't a container we can't include it in changes and need to send
|
||||||
|
* this information in its own channel.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
int KEYGUARD_VISIBILITY_TRANSIT_FLAGS =
|
||||||
|
(TRANSIT_FLAG_KEYGUARD_GOING_AWAY
|
||||||
|
| TRANSIT_FLAG_KEYGUARD_APPEARING
|
||||||
|
| TRANSIT_FLAG_KEYGUARD_OCCLUDING
|
||||||
|
| TRANSIT_FLAG_KEYGUARD_UNOCCLUDING);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove content mode: Indicates remove content mode is currently not defined.
|
* Remove content mode: Indicates remove content mode is currently not defined.
|
||||||
* @hide
|
* @hide
|
||||||
|
|||||||
@@ -99,9 +99,6 @@ public final class TransitionInfo implements Parcelable {
|
|||||||
/** The container is the display. */
|
/** The container is the display. */
|
||||||
public static final int FLAG_IS_DISPLAY = 1 << 5;
|
public static final int FLAG_IS_DISPLAY = 1 << 5;
|
||||||
|
|
||||||
/** The container can show on top of lock screen. */
|
|
||||||
public static final int FLAG_OCCLUDES_KEYGUARD = 1 << 6;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Only for IS_DISPLAY containers. Is set if the display has system alert windows. This is
|
* Only for IS_DISPLAY containers. Is set if the display has system alert windows. This is
|
||||||
* used to prevent seamless rotation.
|
* used to prevent seamless rotation.
|
||||||
@@ -175,7 +172,6 @@ public final class TransitionInfo implements Parcelable {
|
|||||||
FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT,
|
FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT,
|
||||||
FLAG_IS_VOICE_INTERACTION,
|
FLAG_IS_VOICE_INTERACTION,
|
||||||
FLAG_IS_DISPLAY,
|
FLAG_IS_DISPLAY,
|
||||||
FLAG_OCCLUDES_KEYGUARD,
|
|
||||||
FLAG_DISPLAY_HAS_ALERT_WINDOWS,
|
FLAG_DISPLAY_HAS_ALERT_WINDOWS,
|
||||||
FLAG_IS_INPUT_METHOD,
|
FLAG_IS_INPUT_METHOD,
|
||||||
FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY,
|
FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY,
|
||||||
@@ -457,9 +453,6 @@ public final class TransitionInfo implements Parcelable {
|
|||||||
if ((flags & FLAG_IS_DISPLAY) != 0) {
|
if ((flags & FLAG_IS_DISPLAY) != 0) {
|
||||||
sb.append(sb.length() == 0 ? "" : "|").append("IS_DISPLAY");
|
sb.append(sb.length() == 0 ? "" : "|").append("IS_DISPLAY");
|
||||||
}
|
}
|
||||||
if ((flags & FLAG_OCCLUDES_KEYGUARD) != 0) {
|
|
||||||
sb.append(sb.length() == 0 ? "" : "|").append("OCCLUDES_KEYGUARD");
|
|
||||||
}
|
|
||||||
if ((flags & FLAG_DISPLAY_HAS_ALERT_WINDOWS) != 0) {
|
if ((flags & FLAG_DISPLAY_HAS_ALERT_WINDOWS) != 0) {
|
||||||
sb.append(sb.length() == 0 ? "" : "|").append("DISPLAY_HAS_ALERT_WINDOWS");
|
sb.append(sb.length() == 0 ? "" : "|").append("DISPLAY_HAS_ALERT_WINDOWS");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,31 +17,25 @@
|
|||||||
package com.android.wm.shell.keyguard;
|
package com.android.wm.shell.keyguard;
|
||||||
|
|
||||||
import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
|
import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
|
||||||
import static android.view.WindowManager.TRANSIT_CLOSE;
|
import static android.view.WindowManager.KEYGUARD_VISIBILITY_TRANSIT_FLAGS;
|
||||||
import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
|
|
||||||
import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
|
|
||||||
import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
|
|
||||||
import static android.view.WindowManager.TRANSIT_NONE;
|
|
||||||
import static android.view.WindowManager.TRANSIT_OPEN;
|
|
||||||
import static android.view.WindowManager.TRANSIT_SLEEP;
|
|
||||||
import static android.view.WindowManager.TRANSIT_TO_BACK;
|
|
||||||
import static android.view.WindowManager.TRANSIT_TO_FRONT;
|
|
||||||
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_LOCKED;
|
|
||||||
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
|
||||||
import static android.window.TransitionInfo.FLAG_OCCLUDES_KEYGUARD;
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_APPEARING;
|
||||||
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_OCCLUDING;
|
||||||
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_UNOCCLUDING;
|
||||||
|
import static android.view.WindowManager.TRANSIT_SLEEP;
|
||||||
|
|
||||||
import static com.android.wm.shell.util.TransitionUtil.isOpeningType;
|
import static com.android.wm.shell.util.TransitionUtil.isOpeningType;
|
||||||
import static com.android.wm.shell.util.TransitionUtil.isClosingType;
|
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.os.RemoteException;
|
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
|
import android.os.RemoteException;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.SurfaceControl;
|
import android.view.SurfaceControl;
|
||||||
|
import android.view.WindowManager;
|
||||||
import android.window.IRemoteTransition;
|
import android.window.IRemoteTransition;
|
||||||
import android.window.IRemoteTransitionFinishedCallback;
|
import android.window.IRemoteTransitionFinishedCallback;
|
||||||
import android.window.TransitionInfo;
|
import android.window.TransitionInfo;
|
||||||
@@ -56,8 +50,6 @@ import com.android.wm.shell.sysui.ShellInit;
|
|||||||
import com.android.wm.shell.transition.Transitions;
|
import com.android.wm.shell.transition.Transitions;
|
||||||
import com.android.wm.shell.transition.Transitions.TransitionFinishCallback;
|
import com.android.wm.shell.transition.Transitions.TransitionFinishCallback;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The handler for Keyguard enter/exit and occlude/unocclude animations.
|
* The handler for Keyguard enter/exit and occlude/unocclude animations.
|
||||||
*
|
*
|
||||||
@@ -70,7 +62,7 @@ public class KeyguardTransitionHandler implements Transitions.TransitionHandler
|
|||||||
private final Handler mMainHandler;
|
private final Handler mMainHandler;
|
||||||
private final ShellExecutor mMainExecutor;
|
private final ShellExecutor mMainExecutor;
|
||||||
|
|
||||||
private final Map<IBinder, IRemoteTransition> mStartedTransitions = new ArrayMap<>();
|
private final ArrayMap<IBinder, StartedTransition> mStartedTransitions = new ArrayMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Local IRemoteTransition implementations registered by the keyguard service.
|
* Local IRemoteTransition implementations registered by the keyguard service.
|
||||||
@@ -81,6 +73,18 @@ public class KeyguardTransitionHandler implements Transitions.TransitionHandler
|
|||||||
private IRemoteTransition mOccludeByDreamTransition = null;
|
private IRemoteTransition mOccludeByDreamTransition = null;
|
||||||
private IRemoteTransition mUnoccludeTransition = null;
|
private IRemoteTransition mUnoccludeTransition = null;
|
||||||
|
|
||||||
|
private final class StartedTransition {
|
||||||
|
final TransitionInfo mInfo;
|
||||||
|
final SurfaceControl.Transaction mFinishT;
|
||||||
|
final IRemoteTransition mPlayer;
|
||||||
|
|
||||||
|
public StartedTransition(TransitionInfo info,
|
||||||
|
SurfaceControl.Transaction finishT, IRemoteTransition player) {
|
||||||
|
mInfo = info;
|
||||||
|
mFinishT = finishT;
|
||||||
|
mPlayer = player;
|
||||||
|
}
|
||||||
|
}
|
||||||
public KeyguardTransitionHandler(
|
public KeyguardTransitionHandler(
|
||||||
@NonNull ShellInit shellInit,
|
@NonNull ShellInit shellInit,
|
||||||
@NonNull Transitions transitions,
|
@NonNull Transitions transitions,
|
||||||
@@ -105,10 +109,7 @@ public class KeyguardTransitionHandler implements Transitions.TransitionHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean handles(TransitionInfo info) {
|
public static boolean handles(TransitionInfo info) {
|
||||||
return (info.getFlags() & TRANSIT_FLAG_KEYGUARD_GOING_AWAY) != 0
|
return (info.getFlags() & KEYGUARD_VISIBILITY_TRANSIT_FLAGS) != 0;
|
||||||
|| (info.getFlags() & TRANSIT_FLAG_KEYGUARD_LOCKED) != 0
|
|
||||||
|| info.getType() == TRANSIT_KEYGUARD_OCCLUDE
|
|
||||||
|| info.getType() == TRANSIT_KEYGUARD_UNOCCLUDE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -120,39 +121,14 @@ public class KeyguardTransitionHandler implements Transitions.TransitionHandler
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean hasOpeningOcclude = false;
|
|
||||||
boolean hasClosingOcclude = false;
|
|
||||||
boolean hasOpeningDream = false;
|
|
||||||
boolean hasClosingApp = false;
|
|
||||||
|
|
||||||
// Check for occluding/dream/closing apps
|
|
||||||
for (int i = info.getChanges().size() - 1; i >= 0; i--) {
|
|
||||||
final TransitionInfo.Change change = info.getChanges().get(i);
|
|
||||||
if ((change.getFlags() & TransitionInfo.FLAG_IS_WALLPAPER) != 0) {
|
|
||||||
continue;
|
|
||||||
} else if (isOpeningType(change.getMode())) {
|
|
||||||
hasOpeningOcclude |= change.hasFlags(FLAG_OCCLUDES_KEYGUARD);
|
|
||||||
hasOpeningDream |= (change.getTaskInfo() != null
|
|
||||||
&& change.getTaskInfo().getActivityType() == ACTIVITY_TYPE_DREAM);
|
|
||||||
} else if (isClosingType(change.getMode())) {
|
|
||||||
hasClosingOcclude |= change.hasFlags(FLAG_OCCLUDES_KEYGUARD);
|
|
||||||
hasClosingApp = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Choose a transition applicable for the changes and keyguard state.
|
// Choose a transition applicable for the changes and keyguard state.
|
||||||
if ((info.getFlags() & TRANSIT_FLAG_KEYGUARD_GOING_AWAY) != 0) {
|
if ((info.getFlags() & TRANSIT_FLAG_KEYGUARD_GOING_AWAY) != 0) {
|
||||||
return startAnimation(mExitTransition,
|
return startAnimation(mExitTransition,
|
||||||
"going-away",
|
"going-away",
|
||||||
transition, info, startTransaction, finishTransaction, finishCallback);
|
transition, info, startTransaction, finishTransaction, finishCallback);
|
||||||
}
|
}
|
||||||
if (hasOpeningOcclude || info.getType() == TRANSIT_KEYGUARD_OCCLUDE) {
|
if ((info.getFlags() & TRANSIT_FLAG_KEYGUARD_OCCLUDING) != 0) {
|
||||||
if (hasClosingOcclude) {
|
if (hasOpeningDream(info)) {
|
||||||
// Transitions between apps on top of the keyguard can use the default handler.
|
|
||||||
// WM sends a final occlude status update after the transition is finished.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (hasOpeningDream) {
|
|
||||||
return startAnimation(mOccludeByDreamTransition,
|
return startAnimation(mOccludeByDreamTransition,
|
||||||
"occlude-by-dream",
|
"occlude-by-dream",
|
||||||
transition, info, startTransaction, finishTransaction, finishCallback);
|
transition, info, startTransaction, finishTransaction, finishCallback);
|
||||||
@@ -161,12 +137,12 @@ public class KeyguardTransitionHandler implements Transitions.TransitionHandler
|
|||||||
"occlude",
|
"occlude",
|
||||||
transition, info, startTransaction, finishTransaction, finishCallback);
|
transition, info, startTransaction, finishTransaction, finishCallback);
|
||||||
}
|
}
|
||||||
} else if (hasClosingApp || info.getType() == TRANSIT_KEYGUARD_UNOCCLUDE) {
|
} else if ((info.getFlags() & TRANSIT_FLAG_KEYGUARD_UNOCCLUDING) != 0) {
|
||||||
return startAnimation(mUnoccludeTransition,
|
return startAnimation(mUnoccludeTransition,
|
||||||
"unocclude",
|
"unocclude",
|
||||||
transition, info, startTransaction, finishTransaction, finishCallback);
|
transition, info, startTransaction, finishTransaction, finishCallback);
|
||||||
} else {
|
} else {
|
||||||
Log.w(TAG, "Failed to play: " + info);
|
Log.i(TAG, "Refused to play keyguard transition: " + info);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -194,7 +170,8 @@ public class KeyguardTransitionHandler implements Transitions.TransitionHandler
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mStartedTransitions.put(transition, remoteHandler);
|
mStartedTransitions.put(transition,
|
||||||
|
new StartedTransition(info, finishTransaction, remoteHandler));
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.wtf(TAG, "RemoteException thrown from local IRemoteTransition", e);
|
Log.wtf(TAG, "RemoteException thrown from local IRemoteTransition", e);
|
||||||
return false;
|
return false;
|
||||||
@@ -207,20 +184,35 @@ public class KeyguardTransitionHandler implements Transitions.TransitionHandler
|
|||||||
public void mergeAnimation(@NonNull IBinder nextTransition, @NonNull TransitionInfo nextInfo,
|
public void mergeAnimation(@NonNull IBinder nextTransition, @NonNull TransitionInfo nextInfo,
|
||||||
@NonNull SurfaceControl.Transaction nextT, @NonNull IBinder currentTransition,
|
@NonNull SurfaceControl.Transaction nextT, @NonNull IBinder currentTransition,
|
||||||
@NonNull TransitionFinishCallback nextFinishCallback) {
|
@NonNull TransitionFinishCallback nextFinishCallback) {
|
||||||
final IRemoteTransition playing = mStartedTransitions.get(currentTransition);
|
final StartedTransition playing = mStartedTransitions.get(currentTransition);
|
||||||
|
|
||||||
if (playing == null) {
|
if (playing == null) {
|
||||||
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_TRANSITIONS,
|
ProtoLog.e(ShellProtoLogGroup.WM_SHELL_TRANSITIONS,
|
||||||
"unknown keyguard transition %s", currentTransition);
|
"unknown keyguard transition %s", currentTransition);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if ((nextInfo.getFlags() & WindowManager.TRANSIT_FLAG_KEYGUARD_APPEARING) != 0
|
||||||
if (nextInfo.getType() == TRANSIT_SLEEP) {
|
&& (playing.mInfo.getFlags() & TRANSIT_FLAG_KEYGUARD_GOING_AWAY) != 0) {
|
||||||
|
// Keyguard unlocking has been canceled. Merge the unlock and re-lock transitions to
|
||||||
|
// avoid a flicker where we flash one frame with the screen fully unlocked.
|
||||||
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS,
|
||||||
|
"canceling keyguard exit transition %s", currentTransition);
|
||||||
|
playing.mFinishT.merge(nextT);
|
||||||
|
try {
|
||||||
|
playing.mPlayer.mergeAnimation(nextTransition, nextInfo, nextT, currentTransition,
|
||||||
|
new FakeFinishCallback());
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
// There is no good reason for this to happen because the player is a local object
|
||||||
|
// implementing an AIDL interface.
|
||||||
|
Log.wtf(TAG, "RemoteException thrown from KeyguardService transition", e);
|
||||||
|
}
|
||||||
|
nextFinishCallback.onTransitionFinished(null, null);
|
||||||
|
} else if (nextInfo.getType() == TRANSIT_SLEEP) {
|
||||||
// An empty SLEEP transition comes in as a signal to abort transitions whenever a sleep
|
// An empty SLEEP transition comes in as a signal to abort transitions whenever a sleep
|
||||||
// token is held. In cases where keyguard is showing, we are running the animation for
|
// token is held. In cases where keyguard is showing, we are running the animation for
|
||||||
// the device sleeping/waking, so it's best to ignore this and keep playing anyway.
|
// the device sleeping/waking, so it's best to ignore this and keep playing anyway.
|
||||||
return;
|
return;
|
||||||
} else {
|
} else if (handles(nextInfo)) {
|
||||||
|
// In all other cases, fast-forward to let the next queued transition start playing.
|
||||||
finishAnimationImmediately(currentTransition, playing);
|
finishAnimationImmediately(currentTransition, playing);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -228,7 +220,7 @@ public class KeyguardTransitionHandler implements Transitions.TransitionHandler
|
|||||||
@Override
|
@Override
|
||||||
public void onTransitionConsumed(IBinder transition, boolean aborted,
|
public void onTransitionConsumed(IBinder transition, boolean aborted,
|
||||||
SurfaceControl.Transaction finishTransaction) {
|
SurfaceControl.Transaction finishTransaction) {
|
||||||
final IRemoteTransition playing = mStartedTransitions.remove(transition);
|
final StartedTransition playing = mStartedTransitions.remove(transition);
|
||||||
if (playing != null) {
|
if (playing != null) {
|
||||||
finishAnimationImmediately(transition, playing);
|
finishAnimationImmediately(transition, playing);
|
||||||
}
|
}
|
||||||
@@ -241,13 +233,26 @@ public class KeyguardTransitionHandler implements Transitions.TransitionHandler
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void finishAnimationImmediately(IBinder transition, IRemoteTransition playing) {
|
private static boolean hasOpeningDream(@NonNull TransitionInfo info) {
|
||||||
|
for (int i = info.getChanges().size() - 1; i >= 0; i--) {
|
||||||
|
final TransitionInfo.Change change = info.getChanges().get(i);
|
||||||
|
if (isOpeningType(change.getMode())
|
||||||
|
&& change.getTaskInfo() != null
|
||||||
|
&& change.getTaskInfo().getActivityType() == ACTIVITY_TYPE_DREAM) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void finishAnimationImmediately(IBinder transition, StartedTransition playing) {
|
||||||
final IBinder fakeTransition = new Binder();
|
final IBinder fakeTransition = new Binder();
|
||||||
final TransitionInfo fakeInfo = new TransitionInfo(TRANSIT_SLEEP, 0x0);
|
final TransitionInfo fakeInfo = new TransitionInfo(TRANSIT_SLEEP, 0x0);
|
||||||
final SurfaceControl.Transaction fakeT = new SurfaceControl.Transaction();
|
final SurfaceControl.Transaction fakeT = new SurfaceControl.Transaction();
|
||||||
final FakeFinishCallback fakeFinishCb = new FakeFinishCallback();
|
final FakeFinishCallback fakeFinishCb = new FakeFinishCallback();
|
||||||
try {
|
try {
|
||||||
playing.mergeAnimation(fakeTransition, fakeInfo, fakeT, transition, fakeFinishCb);
|
playing.mPlayer.mergeAnimation(
|
||||||
|
fakeTransition, fakeInfo, fakeT, transition, fakeFinishCb);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
// There is no good reason for this to happen because the player is a local object
|
// There is no good reason for this to happen because the player is a local object
|
||||||
// implementing an AIDL interface.
|
// implementing an AIDL interface.
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import static com.android.wm.shell.util.TransitionUtil.isOpeningType;
|
|||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
|
import android.util.Log;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import android.view.SurfaceControl;
|
import android.view.SurfaceControl;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
@@ -566,11 +567,18 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
|
|||||||
@NonNull SurfaceControl.Transaction startTransaction,
|
@NonNull SurfaceControl.Transaction startTransaction,
|
||||||
@NonNull SurfaceControl.Transaction finishTransaction,
|
@NonNull SurfaceControl.Transaction finishTransaction,
|
||||||
@NonNull Transitions.TransitionFinishCallback finishCallback) {
|
@NonNull Transitions.TransitionFinishCallback finishCallback) {
|
||||||
boolean consumed = mKeyguardHandler.startAnimation(
|
final Transitions.TransitionFinishCallback finishCB = (wct, wctCB) -> {
|
||||||
mixed.mTransition, info, startTransaction, finishTransaction, finishCallback);
|
mixed.mInFlightSubAnimations--;
|
||||||
if (!consumed) {
|
if (mixed.mInFlightSubAnimations == 0) {
|
||||||
|
mActiveTransitions.remove(mixed);
|
||||||
|
finishCallback.onTransitionFinished(wct, wctCB);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (!mKeyguardHandler.startAnimation(
|
||||||
|
mixed.mTransition, info, startTransaction, finishTransaction, finishCB)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
mixed.mInFlightSubAnimations++;
|
||||||
// Sync pip state.
|
// Sync pip state.
|
||||||
if (mPipHandler != null) {
|
if (mPipHandler != null) {
|
||||||
// We don't know when to apply `startTransaction` so use a separate transaction here.
|
// We don't know when to apply `startTransaction` so use a separate transaction here.
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.android.systemui.keyguard;
|
|||||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||||
import static android.view.RemoteAnimationTarget.MODE_CLOSING;
|
import static android.view.RemoteAnimationTarget.MODE_CLOSING;
|
||||||
import static android.view.RemoteAnimationTarget.MODE_OPENING;
|
import static android.view.RemoteAnimationTarget.MODE_OPENING;
|
||||||
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_APPEARING;
|
||||||
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
|
||||||
import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
|
import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
|
||||||
import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
|
import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
|
||||||
@@ -182,8 +183,8 @@ public class KeyguardService extends Service {
|
|||||||
|
|
||||||
// Wrap Keyguard going away animation.
|
// Wrap Keyguard going away animation.
|
||||||
// Note: Also used for wrapping occlude by Dream animation. It works (with some redundancy).
|
// Note: Also used for wrapping occlude by Dream animation. It works (with some redundancy).
|
||||||
public static IRemoteTransition wrap(IRemoteAnimationRunner runner,
|
public static IRemoteTransition wrap(final KeyguardViewMediator keyguardViewMediator,
|
||||||
boolean lockscreenLiveWallpaperEnabled) {
|
final IRemoteAnimationRunner runner, final boolean lockscreenLiveWallpaperEnabled) {
|
||||||
return new IRemoteTransition.Stub() {
|
return new IRemoteTransition.Stub() {
|
||||||
|
|
||||||
private final ArrayMap<SurfaceControl, SurfaceControl> mLeashMap = new ArrayMap<>();
|
private final ArrayMap<SurfaceControl, SurfaceControl> mLeashMap = new ArrayMap<>();
|
||||||
@@ -239,6 +240,12 @@ public class KeyguardService extends Service {
|
|||||||
SurfaceControl.Transaction candidateT, IBinder currentTransition,
|
SurfaceControl.Transaction candidateT, IBinder currentTransition,
|
||||||
IRemoteTransitionFinishedCallback candidateFinishCallback)
|
IRemoteTransitionFinishedCallback candidateFinishCallback)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
|
if ((candidateInfo.getFlags() & TRANSIT_FLAG_KEYGUARD_APPEARING) != 0) {
|
||||||
|
keyguardViewMediator.setPendingLock(true);
|
||||||
|
keyguardViewMediator.cancelKeyguardExitAnimation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
synchronized (mLeashMap) {
|
synchronized (mLeashMap) {
|
||||||
runner.onAnimationCancelled();
|
runner.onAnimationCancelled();
|
||||||
|
|||||||
@@ -205,6 +205,12 @@ class KeyguardUnlockAnimationController @Inject constructor(
|
|||||||
*/
|
*/
|
||||||
var playingCannedUnlockAnimation = false
|
var playingCannedUnlockAnimation = false
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether we reached the swipe gesture threshold to dismiss keyguard, or restore it, once
|
||||||
|
* and should ignore any future changes to the dismiss amount before the animation finishes.
|
||||||
|
*/
|
||||||
|
var dismissAmountThresholdsReached = false
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remote callback provided by Launcher that allows us to control the Launcher's unlock
|
* Remote callback provided by Launcher that allows us to control the Launcher's unlock
|
||||||
* animation and smartspace.
|
* animation and smartspace.
|
||||||
@@ -649,6 +655,7 @@ class KeyguardUnlockAnimationController @Inject constructor(
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
fun unlockToLauncherWithInWindowAnimations() {
|
fun unlockToLauncherWithInWindowAnimations() {
|
||||||
|
surfaceBehindAlpha = 1f
|
||||||
setSurfaceBehindAppearAmount(1f, wallpapers = false)
|
setSurfaceBehindAppearAmount(1f, wallpapers = false)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -762,6 +769,10 @@ class KeyguardUnlockAnimationController @Inject constructor(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dismissAmountThresholdsReached) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if (!keyguardStateController.isShowing) {
|
if (!keyguardStateController.isShowing) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -793,6 +804,11 @@ class KeyguardUnlockAnimationController @Inject constructor(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// no-op if we alreaddy reached a threshold.
|
||||||
|
if (dismissAmountThresholdsReached) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// no-op if animation is not requested yet.
|
// no-op if animation is not requested yet.
|
||||||
if (!keyguardViewMediator.get().requestedShowSurfaceBehindKeyguard() ||
|
if (!keyguardViewMediator.get().requestedShowSurfaceBehindKeyguard() ||
|
||||||
!keyguardViewMediator.get().isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe) {
|
!keyguardViewMediator.get().isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe) {
|
||||||
@@ -807,6 +823,7 @@ class KeyguardUnlockAnimationController @Inject constructor(
|
|||||||
!keyguardStateController.isFlingingToDismissKeyguardDuringSwipeGesture &&
|
!keyguardStateController.isFlingingToDismissKeyguardDuringSwipeGesture &&
|
||||||
dismissAmount >= DISMISS_AMOUNT_EXIT_KEYGUARD_THRESHOLD)) {
|
dismissAmount >= DISMISS_AMOUNT_EXIT_KEYGUARD_THRESHOLD)) {
|
||||||
setSurfaceBehindAppearAmount(1f)
|
setSurfaceBehindAppearAmount(1f)
|
||||||
|
dismissAmountThresholdsReached = true
|
||||||
keyguardViewMediator.get().exitKeyguardAndFinishSurfaceBehindRemoteAnimation(
|
keyguardViewMediator.get().exitKeyguardAndFinishSurfaceBehindRemoteAnimation(
|
||||||
false /* cancelled */)
|
false /* cancelled */)
|
||||||
}
|
}
|
||||||
@@ -941,6 +958,7 @@ class KeyguardUnlockAnimationController @Inject constructor(
|
|||||||
wallpaperTargets = null
|
wallpaperTargets = null
|
||||||
|
|
||||||
playingCannedUnlockAnimation = false
|
playingCannedUnlockAnimation = false
|
||||||
|
dismissAmountThresholdsReached = false
|
||||||
willUnlockWithInWindowLauncherAnimations = false
|
willUnlockWithInWindowLauncherAnimations = false
|
||||||
willUnlockWithSmartspaceTransition = false
|
willUnlockWithSmartspaceTransition = false
|
||||||
|
|
||||||
|
|||||||
@@ -1352,12 +1352,12 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
|||||||
setShowingLocked(false /* showing */, true /* forceCallbacks */);
|
setShowingLocked(false /* showing */, true /* forceCallbacks */);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isLockscreenLwpEnabled = getWallpaperManager().isLockscreenLiveWallpaperEnabled();
|
boolean isLLwpEnabled = getWallpaperManager().isLockscreenLiveWallpaperEnabled();
|
||||||
mKeyguardTransitions.register(
|
mKeyguardTransitions.register(
|
||||||
KeyguardService.wrap(getExitAnimationRunner(), isLockscreenLwpEnabled),
|
KeyguardService.wrap(this, getExitAnimationRunner(), isLLwpEnabled),
|
||||||
KeyguardService.wrap(getOccludeAnimationRunner(), isLockscreenLwpEnabled),
|
KeyguardService.wrap(this, getOccludeAnimationRunner(), isLLwpEnabled),
|
||||||
KeyguardService.wrap(getOccludeByDreamAnimationRunner(), isLockscreenLwpEnabled),
|
KeyguardService.wrap(this, getOccludeByDreamAnimationRunner(), isLLwpEnabled),
|
||||||
KeyguardService.wrap(getUnoccludeAnimationRunner(), isLockscreenLwpEnabled));
|
KeyguardService.wrap(this, getUnoccludeAnimationRunner(), isLLwpEnabled));
|
||||||
|
|
||||||
final ContentResolver cr = mContext.getContentResolver();
|
final ContentResolver cr = mContext.getContentResolver();
|
||||||
|
|
||||||
@@ -2906,6 +2906,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
|||||||
// re-locking. We should just end the surface-behind animation without exiting the
|
// re-locking. We should just end the surface-behind animation without exiting the
|
||||||
// keyguard. The pending lock will be handled by onFinishedGoingToSleep().
|
// keyguard. The pending lock will be handled by onFinishedGoingToSleep().
|
||||||
finishSurfaceBehindRemoteAnimation(true);
|
finishSurfaceBehindRemoteAnimation(true);
|
||||||
|
maybeHandlePendingLock();
|
||||||
} else {
|
} else {
|
||||||
Log.d(TAG, "#handleCancelKeyguardExitAnimation: keyguard exit animation cancelled. "
|
Log.d(TAG, "#handleCancelKeyguardExitAnimation: keyguard exit animation cancelled. "
|
||||||
+ "No pending lock, we should end up unlocked with the app/launcher visible.");
|
+ "No pending lock, we should end up unlocked with the app/launcher visible.");
|
||||||
@@ -3261,8 +3262,6 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
|||||||
/**
|
/**
|
||||||
* Cancel the keyguard exit animation, usually because we were swiping to unlock but WM starts
|
* Cancel the keyguard exit animation, usually because we were swiping to unlock but WM starts
|
||||||
* a new remote animation before finishing the keyguard exit animation.
|
* a new remote animation before finishing the keyguard exit animation.
|
||||||
*
|
|
||||||
* This will dismiss the keyguard.
|
|
||||||
*/
|
*/
|
||||||
public void cancelKeyguardExitAnimation() {
|
public void cancelKeyguardExitAnimation() {
|
||||||
Trace.beginSection("KeyguardViewMediator#cancelKeyguardExitAnimation");
|
Trace.beginSection("KeyguardViewMediator#cancelKeyguardExitAnimation");
|
||||||
@@ -3435,7 +3434,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setPendingLock(boolean hasPendingLock) {
|
public void setPendingLock(boolean hasPendingLock) {
|
||||||
mPendingLock = hasPendingLock;
|
mPendingLock = hasPendingLock;
|
||||||
Trace.traceCounter(Trace.TRACE_TAG_APP, "pendingLock", mPendingLock ? 1 : 0);
|
Trace.traceCounter(Trace.TRACE_TAG_APP, "pendingLock", mPendingLock ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5602,17 +5602,14 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
|||||||
*/
|
*/
|
||||||
void requestTransitionAndLegacyPrepare(@WindowManager.TransitionType int transit,
|
void requestTransitionAndLegacyPrepare(@WindowManager.TransitionType int transit,
|
||||||
@WindowManager.TransitionFlags int flags) {
|
@WindowManager.TransitionFlags int flags) {
|
||||||
prepareAppTransition(transit, flags);
|
requestTransitionAndLegacyPrepare(transit, flags, null /* trigger */);
|
||||||
mTransitionController.requestTransitionIfNeeded(transit, flags,
|
|
||||||
null /* trigger */, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @see #requestTransitionAndLegacyPrepare(int, int) */
|
/** @see #requestTransitionAndLegacyPrepare(int, int) */
|
||||||
void requestTransitionAndLegacyPrepare(@WindowManager.TransitionType int transit,
|
void requestTransitionAndLegacyPrepare(@WindowManager.TransitionType int transit,
|
||||||
@Nullable WindowContainer trigger) {
|
@WindowManager.TransitionFlags int flags, @Nullable WindowContainer trigger) {
|
||||||
prepareAppTransition(transit);
|
prepareAppTransition(transit, flags);
|
||||||
mTransitionController.requestTransitionIfNeeded(transit, 0 /* flags */,
|
mTransitionController.requestTransitionIfNeeded(transit, flags, trigger, this);
|
||||||
trigger, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void executeAppTransition() {
|
void executeAppTransition() {
|
||||||
|
|||||||
@@ -19,17 +19,21 @@ package com.android.server.wm;
|
|||||||
import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
|
import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
|
||||||
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
|
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
|
||||||
import static android.view.Display.DEFAULT_DISPLAY;
|
import static android.view.Display.DEFAULT_DISPLAY;
|
||||||
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_APPEARING;
|
||||||
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
|
||||||
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
|
||||||
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION;
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION;
|
||||||
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_LAUNCHER_CLEAR_SNAPSHOT;
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_LAUNCHER_CLEAR_SNAPSHOT;
|
||||||
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
|
||||||
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
|
||||||
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_OCCLUDING;
|
||||||
|
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_UNOCCLUDING;
|
||||||
import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
|
import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
|
||||||
import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
|
import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
|
||||||
import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
|
import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
|
||||||
import static android.view.WindowManager.TRANSIT_OPEN;
|
import static android.view.WindowManager.TRANSIT_OPEN;
|
||||||
import static android.view.WindowManager.TRANSIT_TO_BACK;
|
import static android.view.WindowManager.TRANSIT_TO_BACK;
|
||||||
|
import static android.view.WindowManager.TRANSIT_TO_FRONT;
|
||||||
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS;
|
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS;
|
||||||
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_SUBTLE_WINDOW_ANIMATIONS;
|
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_SUBTLE_WINDOW_ANIMATIONS;
|
||||||
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_LAUNCHER_CLEAR_SNAPSHOT;
|
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_LAUNCHER_CLEAR_SNAPSHOT;
|
||||||
@@ -171,10 +175,11 @@ class KeyguardController {
|
|||||||
final KeyguardDisplayState state = getDisplayState(displayId);
|
final KeyguardDisplayState state = getDisplayState(displayId);
|
||||||
final boolean aodChanged = aodShowing != state.mAodShowing;
|
final boolean aodChanged = aodShowing != state.mAodShowing;
|
||||||
final boolean aodRemoved = state.mAodShowing && !aodShowing;
|
final boolean aodRemoved = state.mAodShowing && !aodShowing;
|
||||||
|
final boolean goingAwayRemoved = state.mKeyguardGoingAway && keyguardShowing;
|
||||||
// If keyguard is going away, but SystemUI aborted the transition, need to reset state.
|
// If keyguard is going away, but SystemUI aborted the transition, need to reset state.
|
||||||
// Do not reset keyguardChanged status when only AOD is removed.
|
// Do not reset keyguardChanged status when only AOD is removed.
|
||||||
final boolean keyguardChanged = (keyguardShowing != state.mKeyguardShowing)
|
final boolean keyguardChanged = (keyguardShowing != state.mKeyguardShowing)
|
||||||
|| (state.mKeyguardGoingAway && keyguardShowing && !aodRemoved);
|
|| (goingAwayRemoved && !aodRemoved);
|
||||||
if (aodRemoved) {
|
if (aodRemoved) {
|
||||||
updateDeferTransitionForAod(false /* waiting */);
|
updateDeferTransitionForAod(false /* waiting */);
|
||||||
}
|
}
|
||||||
@@ -214,6 +219,15 @@ class KeyguardController {
|
|||||||
if (keyguardShowing) {
|
if (keyguardShowing) {
|
||||||
state.mDismissalRequested = false;
|
state.mDismissalRequested = false;
|
||||||
}
|
}
|
||||||
|
if (goingAwayRemoved) {
|
||||||
|
// Keyguard dismiss is canceled. Send a transition to undo the changes and clean up
|
||||||
|
// before holding the sleep token again.
|
||||||
|
final DisplayContent dc = mRootWindowContainer.getDefaultDisplay();
|
||||||
|
dc.requestTransitionAndLegacyPrepare(
|
||||||
|
TRANSIT_TO_FRONT, TRANSIT_FLAG_KEYGUARD_APPEARING);
|
||||||
|
dc.mWallpaperController.showWallpaperInTransition(false /* showHome */);
|
||||||
|
mWindowManager.executeAppTransition();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the sleep token first such that ensureActivitiesVisible has correct sleep token
|
// Update the sleep token first such that ensureActivitiesVisible has correct sleep token
|
||||||
@@ -269,7 +283,7 @@ class KeyguardController {
|
|||||||
updateKeyguardSleepToken();
|
updateKeyguardSleepToken();
|
||||||
|
|
||||||
// Make the home wallpaper visible
|
// Make the home wallpaper visible
|
||||||
dc.mWallpaperController.showHomeWallpaperInTransition();
|
dc.mWallpaperController.showWallpaperInTransition(true /* showHome */);
|
||||||
// Some stack visibility might change (e.g. docked stack)
|
// Some stack visibility might change (e.g. docked stack)
|
||||||
mRootWindowContainer.resumeFocusedTasksTopActivities();
|
mRootWindowContainer.resumeFocusedTasksTopActivities();
|
||||||
mRootWindowContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
|
mRootWindowContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
|
||||||
@@ -413,10 +427,12 @@ class KeyguardController {
|
|||||||
if (isDisplayOccluded(DEFAULT_DISPLAY)) {
|
if (isDisplayOccluded(DEFAULT_DISPLAY)) {
|
||||||
mRootWindowContainer.getDefaultDisplay().requestTransitionAndLegacyPrepare(
|
mRootWindowContainer.getDefaultDisplay().requestTransitionAndLegacyPrepare(
|
||||||
TRANSIT_KEYGUARD_OCCLUDE,
|
TRANSIT_KEYGUARD_OCCLUDE,
|
||||||
|
TRANSIT_FLAG_KEYGUARD_OCCLUDING,
|
||||||
topActivity != null ? topActivity.getRootTask() : null);
|
topActivity != null ? topActivity.getRootTask() : null);
|
||||||
} else {
|
} else {
|
||||||
mRootWindowContainer.getDefaultDisplay().requestTransitionAndLegacyPrepare(
|
mRootWindowContainer.getDefaultDisplay().requestTransitionAndLegacyPrepare(
|
||||||
TRANSIT_KEYGUARD_UNOCCLUDE, 0 /* flags */);
|
TRANSIT_KEYGUARD_UNOCCLUDE,
|
||||||
|
TRANSIT_FLAG_KEYGUARD_UNOCCLUDING);
|
||||||
}
|
}
|
||||||
updateKeyguardSleepToken(DEFAULT_DISPLAY);
|
updateKeyguardSleepToken(DEFAULT_DISPLAY);
|
||||||
mWindowManager.executeAppTransition();
|
mWindowManager.executeAppTransition();
|
||||||
|
|||||||
@@ -52,7 +52,6 @@ import static android.window.TransitionInfo.FLAG_IS_VOICE_INTERACTION;
|
|||||||
import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
|
import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
|
||||||
import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP;
|
import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP;
|
||||||
import static android.window.TransitionInfo.FLAG_NO_ANIMATION;
|
import static android.window.TransitionInfo.FLAG_NO_ANIMATION;
|
||||||
import static android.window.TransitionInfo.FLAG_OCCLUDES_KEYGUARD;
|
|
||||||
import static android.window.TransitionInfo.FLAG_SHOW_WALLPAPER;
|
import static android.window.TransitionInfo.FLAG_SHOW_WALLPAPER;
|
||||||
import static android.window.TransitionInfo.FLAG_TASK_LAUNCHING_BEHIND;
|
import static android.window.TransitionInfo.FLAG_TASK_LAUNCHING_BEHIND;
|
||||||
import static android.window.TransitionInfo.FLAG_TRANSLUCENT;
|
import static android.window.TransitionInfo.FLAG_TRANSLUCENT;
|
||||||
@@ -2820,9 +2819,6 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (occludesKeyguard(wc)) {
|
|
||||||
flags |= FLAG_OCCLUDES_KEYGUARD;
|
|
||||||
}
|
|
||||||
if ((mFlags & FLAG_CHANGE_NO_ANIMATION) != 0
|
if ((mFlags & FLAG_CHANGE_NO_ANIMATION) != 0
|
||||||
&& (mFlags & FLAG_CHANGE_YES_ANIMATION) == 0) {
|
&& (mFlags & FLAG_CHANGE_YES_ANIMATION) == 0) {
|
||||||
flags |= FLAG_NO_ANIMATION;
|
flags |= FLAG_NO_ANIMATION;
|
||||||
|
|||||||
@@ -16,10 +16,10 @@
|
|||||||
|
|
||||||
package com.android.server.wm;
|
package com.android.server.wm;
|
||||||
|
|
||||||
|
import static android.view.WindowManager.KEYGUARD_VISIBILITY_TRANSIT_FLAGS;
|
||||||
import static android.view.WindowManager.TRANSIT_CHANGE;
|
import static android.view.WindowManager.TRANSIT_CHANGE;
|
||||||
import static android.view.WindowManager.TRANSIT_CLOSE;
|
import static android.view.WindowManager.TRANSIT_CLOSE;
|
||||||
import static android.view.WindowManager.TRANSIT_FLAG_IS_RECENTS;
|
import static android.view.WindowManager.TRANSIT_FLAG_IS_RECENTS;
|
||||||
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
|
|
||||||
import static android.view.WindowManager.TRANSIT_NONE;
|
import static android.view.WindowManager.TRANSIT_NONE;
|
||||||
import static android.view.WindowManager.TRANSIT_OPEN;
|
import static android.view.WindowManager.TRANSIT_OPEN;
|
||||||
|
|
||||||
@@ -619,9 +619,9 @@ class TransitionController {
|
|||||||
}
|
}
|
||||||
// Make the collecting transition wait until this request is ready.
|
// Make the collecting transition wait until this request is ready.
|
||||||
mCollectingTransition.setReady(readyGroupRef, false);
|
mCollectingTransition.setReady(readyGroupRef, false);
|
||||||
if ((flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY) != 0) {
|
if ((flags & KEYGUARD_VISIBILITY_TRANSIT_FLAGS) != 0) {
|
||||||
// Add keyguard flag to dismiss keyguard
|
// Add keyguard flags to affect keyguard visibility
|
||||||
mCollectingTransition.addFlag(flags);
|
mCollectingTransition.addFlag(flags & KEYGUARD_VISIBILITY_TRANSIT_FLAGS);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
newTransition = requestStartTransition(createTransition(type, flags),
|
newTransition = requestStartTransition(createTransition(type, flags),
|
||||||
|
|||||||
@@ -339,12 +339,12 @@ class WallpaperController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change the visibility if wallpaper is home screen only.
|
* Make one wallpaper visible, according to {@attr showHome}.
|
||||||
* This is called during the keyguard unlocking transition
|
* This is called during the keyguard unlocking transition
|
||||||
* (see {@link KeyguardController#keyguardGoingAway(int, int)}) and thus assumes that if the
|
* (see {@link KeyguardController#keyguardGoingAway(int, int)}),
|
||||||
* system wallpaper is shared with lock, then it needs no animation.
|
* or when a keyguard unlock is cancelled (see {@link KeyguardController})
|
||||||
*/
|
*/
|
||||||
public void showHomeWallpaperInTransition() {
|
public void showWallpaperInTransition(boolean showHome) {
|
||||||
updateWallpaperWindowsTarget(mFindResults);
|
updateWallpaperWindowsTarget(mFindResults);
|
||||||
|
|
||||||
if (!mFindResults.hasTopShowWhenLockedWallpaper()) {
|
if (!mFindResults.hasTopShowWhenLockedWallpaper()) {
|
||||||
@@ -357,9 +357,9 @@ class WallpaperController {
|
|||||||
// Shared wallpaper, ensure its visibility
|
// Shared wallpaper, ensure its visibility
|
||||||
showWhenLocked.mToken.asWallpaperToken().updateWallpaperWindows(true);
|
showWhenLocked.mToken.asWallpaperToken().updateWallpaperWindows(true);
|
||||||
} else {
|
} else {
|
||||||
// Separate lock and home wallpapers: show home wallpaper and hide lock
|
// Separate lock and home wallpapers: show the correct wallpaper in transition
|
||||||
hideWhenLocked.mToken.asWallpaperToken().updateWallpaperWindowsInTransition(true);
|
hideWhenLocked.mToken.asWallpaperToken().updateWallpaperWindowsInTransition(showHome);
|
||||||
showWhenLocked.mToken.asWallpaperToken().updateWallpaperWindowsInTransition(false);
|
showWhenLocked.mToken.asWallpaperToken().updateWallpaperWindowsInTransition(!showHome);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user