Snap for 8005451 from 80aa8da7e3 to sc-d2-release

Change-Id: Ib78a2894f88d110a6bf7e8dbc577ef1fa249816f
This commit is contained in:
Android Build Coastguard Worker 2021-12-16 00:08:12 +00:00
commit 22f8381298
8 changed files with 143 additions and 45 deletions

View File

@ -320,6 +320,11 @@ public abstract class BaseQuickstepLauncher extends Launcher
mOverviewCommandHelper = binder.getOverviewCommandHelper(); mOverviewCommandHelper = binder.getOverviewCommandHelper();
} }
@Override
public void runOnBindToTouchInteractionService(Runnable r) {
mTISBindHelper.runOnBindToTouchInteractionService(r);
}
private void initUnfoldTransitionProgressProvider() { private void initUnfoldTransitionProgressProvider() {
final UnfoldTransitionConfig config = UnfoldTransitionFactory.createConfig(this); final UnfoldTransitionConfig config = UnfoldTransitionFactory.createConfig(this);
if (config.isEnabled()) { if (config.isEnabled()) {

View File

@ -660,10 +660,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
AnimOpenProperties prop = new AnimOpenProperties(mLauncher.getResources(), mDeviceProfile, AnimOpenProperties prop = new AnimOpenProperties(mLauncher.getResources(), mDeviceProfile,
windowTargetBounds, launcherIconBounds, v, dragLayerBounds[0], dragLayerBounds[1], windowTargetBounds, launcherIconBounds, v, dragLayerBounds[0], dragLayerBounds[1],
hasSplashScreen, floatingView.isDifferentFromAppIcon()); hasSplashScreen, floatingView.isDifferentFromAppIcon());
int left = (int) (prop.cropCenterXStart - prop.cropWidthStart / 2); int left = prop.cropCenterXStart - prop.cropWidthStart / 2;
int top = (int) (prop.cropCenterYStart - prop.cropHeightStart / 2); int top = prop.cropCenterYStart - prop.cropHeightStart / 2;
int right = (int) (left + prop.cropWidthStart); int right = left + prop.cropWidthStart;
int bottom = (int) (top + prop.cropHeightStart); int bottom = top + prop.cropHeightStart;
// Set the crop here so we can calculate the corner radius below. // Set the crop here so we can calculate the corner radius below.
crop.set(left, top, right, bottom); crop.set(left, top, right, bottom);
@ -1329,6 +1329,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
mDeviceProfile); mDeviceProfile);
// Hook up floating views to the closing window animators. // Hook up floating views to the closing window animators.
final int rotationChange = getRotationChange(targets);
Rect windowTargetBounds = getWindowTargetBounds(targets, rotationChange);
if (floatingIconView != null) { if (floatingIconView != null) {
anim.addAnimatorListener(floatingIconView); anim.addAnimatorListener(floatingIconView);
floatingIconView.setOnTargetChangeListener(anim::onTargetPositionChanged); floatingIconView.setOnTargetChangeListener(anim::onTargetPositionChanged);
@ -1339,7 +1341,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
// FolderIconView can be seen morphing into the icon shape. // FolderIconView can be seen morphing into the icon shape.
final float windowAlphaThreshold = 1f - SHAPE_PROGRESS_DURATION; final float windowAlphaThreshold = 1f - SHAPE_PROGRESS_DURATION;
RectFSpringAnim.OnUpdateListener runner = new SpringAnimRunner(targets, targetRect) { RectFSpringAnim.OnUpdateListener runner = new SpringAnimRunner(targets, targetRect,
windowTargetBounds) {
@Override @Override
public void onUpdate(RectF currentRectF, float progress) { public void onUpdate(RectF currentRectF, float progress) {
finalFloatingIconView.update(1f, 255 /* fgAlpha */, currentRectF, progress, finalFloatingIconView.update(1f, 255 /* fgAlpha */, currentRectF, progress,
@ -1356,7 +1359,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
final float floatingWidgetAlpha = isTransluscent ? 0 : 1; final float floatingWidgetAlpha = isTransluscent ? 0 : 1;
FloatingWidgetView finalFloatingWidget = floatingWidget; FloatingWidgetView finalFloatingWidget = floatingWidget;
RectFSpringAnim.OnUpdateListener runner = new SpringAnimRunner(targets, targetRect) { RectFSpringAnim.OnUpdateListener runner = new SpringAnimRunner(targets, targetRect,
windowTargetBounds) {
@Override @Override
public void onUpdate(RectF currentRectF, float progress) { public void onUpdate(RectF currentRectF, float progress) {
final float fallbackBackgroundAlpha = final float fallbackBackgroundAlpha =
@ -1767,12 +1771,17 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
private final float mStartRadius; private final float mStartRadius;
private final float mEndRadius; private final float mEndRadius;
private final SurfaceTransactionApplier mSurfaceApplier; private final SurfaceTransactionApplier mSurfaceApplier;
private final Rect mWindowTargetBounds = new Rect();
SpringAnimRunner(RemoteAnimationTargetCompat[] appTargets, RectF targetRect) { private final Rect mTmpRect = new Rect();
SpringAnimRunner(RemoteAnimationTargetCompat[] appTargets, RectF targetRect,
Rect windowTargetBounds) {
mAppTargets = appTargets; mAppTargets = appTargets;
mStartRadius = QuickStepContract.getWindowCornerRadius(mLauncher); mStartRadius = QuickStepContract.getWindowCornerRadius(mLauncher);
mEndRadius = Math.max(1, targetRect.width()) / 2f; mEndRadius = Math.max(1, targetRect.width()) / 2f;
mSurfaceApplier = new SurfaceTransactionApplier(mDragLayer); mSurfaceApplier = new SurfaceTransactionApplier(mDragLayer);
mWindowTargetBounds.set(windowTargetBounds);
} }
public float getCornerRadius(float progress) { public float getCornerRadius(float progress) {
@ -1793,13 +1802,36 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
} }
if (target.mode == MODE_CLOSING) { if (target.mode == MODE_CLOSING) {
float alpha = getWindowAlpha(progress);
currentRectF.round(mCurrentRect); currentRectF.round(mCurrentRect);
// Scale the target window to match the currentRectF.
final float scale;
// We need to infer the crop (we crop the window to match the currentRectF).
if (mWindowTargetBounds.height() > mWindowTargetBounds.width()) {
scale = Math.min(1f, currentRectF.width() / mWindowTargetBounds.width());
int unscaledHeight = (int) (mCurrentRect.height() * (1f / scale));
int croppedHeight = mWindowTargetBounds.height() - unscaledHeight;
mTmpRect.set(0, 0, mWindowTargetBounds.width(),
mWindowTargetBounds.height() - croppedHeight);
} else {
scale = Math.min(1f, currentRectF.height() / mWindowTargetBounds.height());
int unscaledWidth = (int) (mCurrentRect.width() * (1f / scale));
int croppedWidth = mWindowTargetBounds.width() - unscaledWidth;
mTmpRect.set(0, 0, mWindowTargetBounds.width() - croppedWidth,
mWindowTargetBounds.height());
}
// Match size and position of currentRect.
mMatrix.setScale(scale, scale);
mMatrix.postTranslate(mCurrentRect.left, mCurrentRect.top);
builder.withMatrix(mMatrix) builder.withMatrix(mMatrix)
.withWindowCrop(mCurrentRect) .withWindowCrop(mTmpRect)
.withAlpha(alpha) .withAlpha(getWindowAlpha(progress))
.withCornerRadius(getCornerRadius(progress)); .withCornerRadius(getCornerRadius(progress) / scale);
} else if (target.mode == MODE_OPENING) { } else if (target.mode == MODE_OPENING) {
mMatrix.setTranslate(mTmpPos.x, mTmpPos.y); mMatrix.setTranslate(mTmpPos.x, mTmpPos.y);
builder.withMatrix(mMatrix) builder.withMatrix(mMatrix)

View File

@ -111,6 +111,11 @@ import java.util.function.Supplier;
onIconAlignmentRatioChangedForAppAndHomeTransition(); onIconAlignmentRatioChangedForAppAndHomeTransition();
mLauncher.getStateManager().addStateListener(mStateListener); mLauncher.getStateManager().addStateListener(mStateListener);
// Initialize to the current launcher state
updateStateForFlag(FLAG_RESUMED, launcher.hasBeenResumed());
mLauncherState = launcher.getStateManager().getState();
applyState(0);
} }
public void onDestroy() { public void onDestroy() {

View File

@ -171,9 +171,13 @@ public class TaskbarStashController {
boolean isManuallyStashedInApp = supportsManualStashing() boolean isManuallyStashedInApp = supportsManualStashing()
&& mPrefs.getBoolean(SHARED_PREFS_STASHED_KEY, DEFAULT_STASHED_PREF); && mPrefs.getBoolean(SHARED_PREFS_STASHED_KEY, DEFAULT_STASHED_PREF);
boolean isInSetup = !mActivity.isUserSetupComplete() || sharedState.setupUIVisible;
updateStateForFlag(FLAG_STASHED_IN_APP_MANUAL, isManuallyStashedInApp); updateStateForFlag(FLAG_STASHED_IN_APP_MANUAL, isManuallyStashedInApp);
updateStateForFlag(FLAG_STASHED_IN_APP_SETUP, updateStateForFlag(FLAG_STASHED_IN_APP_SETUP, isInSetup);
!mActivity.isUserSetupComplete() || sharedState.setupUIVisible); if (isInSetup) {
// Update the in-app state to ensure isStashed() reflects right state during SUW
updateStateForFlag(FLAG_IN_APP, true);
}
applyState(); applyState();
notifyStashChange(/* visible */ false, /* stashed */ isStashedInApp()); notifyStashChange(/* visible */ false, /* stashed */ isStashedInApp());

View File

@ -180,45 +180,51 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
getFlagForIndex(0, "STATE_LAUNCHER_PRESENT"); getFlagForIndex(0, "STATE_LAUNCHER_PRESENT");
protected static final int STATE_LAUNCHER_STARTED = protected static final int STATE_LAUNCHER_STARTED =
getFlagForIndex(1, "STATE_LAUNCHER_STARTED"); getFlagForIndex(1, "STATE_LAUNCHER_STARTED");
protected static final int STATE_LAUNCHER_DRAWN = getFlagForIndex(2, "STATE_LAUNCHER_DRAWN"); protected static final int STATE_LAUNCHER_DRAWN =
getFlagForIndex(2, "STATE_LAUNCHER_DRAWN");
// Called when the Launcher has connected to the touch interaction service (and the taskbar
// ui controller is initialized)
protected static final int STATE_LAUNCHER_BIND_TO_SERVICE =
getFlagForIndex(3, "STATE_LAUNCHER_BIND_TO_SERVICE");
// Internal initialization states // Internal initialization states
private static final int STATE_APP_CONTROLLER_RECEIVED = private static final int STATE_APP_CONTROLLER_RECEIVED =
getFlagForIndex(3, "STATE_APP_CONTROLLER_RECEIVED"); getFlagForIndex(4, "STATE_APP_CONTROLLER_RECEIVED");
// Interaction finish states // Interaction finish states
private static final int STATE_SCALED_CONTROLLER_HOME = private static final int STATE_SCALED_CONTROLLER_HOME =
getFlagForIndex(4, "STATE_SCALED_CONTROLLER_HOME"); getFlagForIndex(5, "STATE_SCALED_CONTROLLER_HOME");
private static final int STATE_SCALED_CONTROLLER_RECENTS = private static final int STATE_SCALED_CONTROLLER_RECENTS =
getFlagForIndex(5, "STATE_SCALED_CONTROLLER_RECENTS"); getFlagForIndex(6, "STATE_SCALED_CONTROLLER_RECENTS");
protected static final int STATE_HANDLER_INVALIDATED = protected static final int STATE_HANDLER_INVALIDATED =
getFlagForIndex(6, "STATE_HANDLER_INVALIDATED"); getFlagForIndex(7, "STATE_HANDLER_INVALIDATED");
private static final int STATE_GESTURE_STARTED = private static final int STATE_GESTURE_STARTED =
getFlagForIndex(7, "STATE_GESTURE_STARTED"); getFlagForIndex(8, "STATE_GESTURE_STARTED");
private static final int STATE_GESTURE_CANCELLED = private static final int STATE_GESTURE_CANCELLED =
getFlagForIndex(8, "STATE_GESTURE_CANCELLED"); getFlagForIndex(9, "STATE_GESTURE_CANCELLED");
private static final int STATE_GESTURE_COMPLETED = private static final int STATE_GESTURE_COMPLETED =
getFlagForIndex(9, "STATE_GESTURE_COMPLETED"); getFlagForIndex(10, "STATE_GESTURE_COMPLETED");
private static final int STATE_CAPTURE_SCREENSHOT = private static final int STATE_CAPTURE_SCREENSHOT =
getFlagForIndex(10, "STATE_CAPTURE_SCREENSHOT"); getFlagForIndex(11, "STATE_CAPTURE_SCREENSHOT");
protected static final int STATE_SCREENSHOT_CAPTURED = protected static final int STATE_SCREENSHOT_CAPTURED =
getFlagForIndex(11, "STATE_SCREENSHOT_CAPTURED"); getFlagForIndex(12, "STATE_SCREENSHOT_CAPTURED");
private static final int STATE_SCREENSHOT_VIEW_SHOWN = private static final int STATE_SCREENSHOT_VIEW_SHOWN =
getFlagForIndex(12, "STATE_SCREENSHOT_VIEW_SHOWN"); getFlagForIndex(13, "STATE_SCREENSHOT_VIEW_SHOWN");
private static final int STATE_RESUME_LAST_TASK = private static final int STATE_RESUME_LAST_TASK =
getFlagForIndex(13, "STATE_RESUME_LAST_TASK"); getFlagForIndex(14, "STATE_RESUME_LAST_TASK");
private static final int STATE_START_NEW_TASK = private static final int STATE_START_NEW_TASK =
getFlagForIndex(14, "STATE_START_NEW_TASK"); getFlagForIndex(15, "STATE_START_NEW_TASK");
private static final int STATE_CURRENT_TASK_FINISHED = private static final int STATE_CURRENT_TASK_FINISHED =
getFlagForIndex(15, "STATE_CURRENT_TASK_FINISHED"); getFlagForIndex(16, "STATE_CURRENT_TASK_FINISHED");
private static final int STATE_FINISH_WITH_NO_END = private static final int STATE_FINISH_WITH_NO_END =
getFlagForIndex(16, "STATE_FINISH_WITH_NO_END"); getFlagForIndex(17, "STATE_FINISH_WITH_NO_END");
private static final int LAUNCHER_UI_STATES = private static final int LAUNCHER_UI_STATES =
STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_LAUNCHER_STARTED; STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_LAUNCHER_STARTED |
STATE_LAUNCHER_BIND_TO_SERVICE;
public static final long MAX_SWIPE_DURATION = 350; public static final long MAX_SWIPE_DURATION = 350;
public static final long HOME_DURATION = StaggeredWorkspaceAnim.DURATION_MS; public static final long HOME_DURATION = StaggeredWorkspaceAnim.DURATION_MS;
@ -429,6 +435,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
setupRecentsViewUi(); setupRecentsViewUi();
linkRecentsViewScroll(); linkRecentsViewScroll();
activity.runOnBindToTouchInteractionService(this::onLauncherBindToService);
mActivity.registerActivityLifecycleCallbacks(mLifecycleCallbacks); mActivity.registerActivityLifecycleCallbacks(mLifecycleCallbacks);
return true; return true;
@ -510,6 +517,11 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
mStateCallback.setState(STATE_LAUNCHER_STARTED); mStateCallback.setState(STATE_LAUNCHER_STARTED);
} }
private void onLauncherBindToService() {
mStateCallback.setState(STATE_LAUNCHER_BIND_TO_SERVICE);
flushOnRecentsAnimationAndLauncherBound();
}
private void onLauncherPresentAndGestureStarted() { private void onLauncherPresentAndGestureStarted() {
// Re-setup the recents UI when gesture starts, as the state could have been changed during // Re-setup the recents UI when gesture starts, as the state could have been changed during
// that time by a previous window transition. // that time by a previous window transition.
@ -812,12 +824,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
} }
// Notify when the animation starts // Notify when the animation starts
if (!mRecentsAnimationStartCallbacks.isEmpty()) { flushOnRecentsAnimationAndLauncherBound();
for (Runnable action : new ArrayList<>(mRecentsAnimationStartCallbacks)) {
action.run();
}
mRecentsAnimationStartCallbacks.clear();
}
TaskViewUtils.setSplitAuxiliarySurfacesShown(mRecentsAnimationTargets.nonApps, false); TaskViewUtils.setSplitAuxiliarySurfacesShown(mRecentsAnimationTargets.nonApps, false);
@ -1195,7 +1202,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
@UiThread @UiThread
private void animateToProgress(float start, float end, long duration, Interpolator interpolator, private void animateToProgress(float start, float end, long duration, Interpolator interpolator,
GestureEndTarget target, PointF velocityPxPerMs) { GestureEndTarget target, PointF velocityPxPerMs) {
runOnRecentsAnimationStart(() -> animateToProgressInternal(start, end, duration, runOnRecentsAnimationAndLauncherBound(() -> animateToProgressInternal(start, end, duration,
interpolator, target, velocityPxPerMs)); interpolator, target, velocityPxPerMs));
} }
@ -1820,12 +1827,12 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
SurfaceTransactionApplier.create(mRecentsView, applier -> { SurfaceTransactionApplier.create(mRecentsView, applier -> {
runActionOnRemoteHandles(remoteTargetHandle -> remoteTargetHandle.getTransformParams() runActionOnRemoteHandles(remoteTargetHandle -> remoteTargetHandle.getTransformParams()
.setSyncTransactionApplier(applier)); .setSyncTransactionApplier(applier));
runOnRecentsAnimationStart(() -> runOnRecentsAnimationAndLauncherBound(() ->
mRecentsAnimationTargets.addReleaseCheck(applier)); mRecentsAnimationTargets.addReleaseCheck(applier));
}); });
mRecentsView.addOnScrollChangedListener(mOnRecentsScrollListener); mRecentsView.addOnScrollChangedListener(mOnRecentsScrollListener);
runOnRecentsAnimationStart(() -> runOnRecentsAnimationAndLauncherBound(() ->
mRecentsView.setRecentsAnimationTargets(mRecentsAnimationController, mRecentsView.setRecentsAnimationTargets(mRecentsAnimationController,
mRecentsAnimationTargets)); mRecentsAnimationTargets));
mRecentsViewScrollLinked = true; mRecentsViewScrollLinked = true;
@ -1871,14 +1878,26 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
} }
/** /**
* Runs the given {@param action} if the recents animation has already started, or queues it to * Runs the given {@param action} if the recents animation has already started and Launcher has
* be run when it is next started. * been created and bound to the TouchInteractionService, or queues it to be run when it this
* next happens.
*/ */
protected void runOnRecentsAnimationStart(Runnable action) { private void runOnRecentsAnimationAndLauncherBound(Runnable action) {
if (mRecentsAnimationTargets == null) { mRecentsAnimationStartCallbacks.add(action);
mRecentsAnimationStartCallbacks.add(action); flushOnRecentsAnimationAndLauncherBound();
} else { }
action.run();
private void flushOnRecentsAnimationAndLauncherBound() {
if (mRecentsAnimationTargets == null ||
!mStateCallback.hasStates(STATE_LAUNCHER_BIND_TO_SERVICE)) {
return;
}
if (!mRecentsAnimationStartCallbacks.isEmpty()) {
for (Runnable action : new ArrayList<>(mRecentsAnimationStartCallbacks)) {
action.run();
}
mRecentsAnimationStartCallbacks.clear();
} }
} }

View File

@ -141,6 +141,11 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
mTaskbarManager.setActivity(this); mTaskbarManager.setActivity(this);
} }
@Override
public void runOnBindToTouchInteractionService(Runnable r) {
mTISBindHelper.runOnBindToTouchInteractionService(r);
}
public void setTaskbarUIController(FallbackTaskbarUIController taskbarUIController) { public void setTaskbarUIController(FallbackTaskbarUIController taskbarUIController) {
mTaskbarUIController = taskbarUIController; mTaskbarUIController = taskbarUIController;
} }

View File

@ -26,6 +26,7 @@ import android.util.Log;
import com.android.quickstep.TouchInteractionService; import com.android.quickstep.TouchInteractionService;
import com.android.quickstep.TouchInteractionService.TISBinder; import com.android.quickstep.TouchInteractionService.TISBinder;
import java.util.ArrayList;
import java.util.function.Consumer; import java.util.function.Consumer;
/** /**
@ -44,9 +45,11 @@ public class TISBindHelper implements ServiceConnection {
private final Runnable mConnectionRunnable = this::internalBindToTIS; private final Runnable mConnectionRunnable = this::internalBindToTIS;
private final Context mContext; private final Context mContext;
private final Consumer<TISBinder> mConnectionCallback; private final Consumer<TISBinder> mConnectionCallback;
private final ArrayList<Runnable> mPendingConnectedCallbacks = new ArrayList<>();
private short mConnectionAttempts; private short mConnectionAttempts;
private boolean mTisServiceBound; private boolean mTisServiceBound;
private boolean mIsConnected;
public TISBindHelper(Context context, Consumer<TISBinder> connectionCallback) { public TISBindHelper(Context context, Consumer<TISBinder> connectionCallback) {
mContext = context; mContext = context;
@ -66,7 +69,13 @@ public class TISBindHelper implements ServiceConnection {
} }
Log.d(TAG, "TIS service connected"); Log.d(TAG, "TIS service connected");
mIsConnected = true;
mConnectionCallback.accept((TISBinder) iBinder); mConnectionCallback.accept((TISBinder) iBinder);
// Flush the pending callbacks
for (Runnable r : mPendingConnectedCallbacks) {
r.run();
}
mPendingConnectedCallbacks.clear();
resetServiceBindRetryState(); resetServiceBindRetryState();
} }
@ -79,6 +88,16 @@ public class TISBindHelper implements ServiceConnection {
internalBindToTIS(); internalBindToTIS();
} }
/**
* Runs the given {@param r} runnable when the service is connected.
*/
public void runOnBindToTouchInteractionService(Runnable r) {
if (mIsConnected) {
r.run();
} else {
mPendingConnectedCallbacks.add(r);
}
}
/** /**
* Binds to {@link TouchInteractionService}. If the binding fails, attempts to retry via * Binds to {@link TouchInteractionService}. If the binding fails, attempts to retry via
@ -120,5 +139,7 @@ public class TISBindHelper implements ServiceConnection {
public void onDestroy() { public void onDestroy() {
internalUnbindToTIS(); internalUnbindToTIS();
resetServiceBindRetryState(); resetServiceBindRetryState();
mIsConnected = false;
mPendingConnectedCallbacks.clear();
} }
} }

View File

@ -185,4 +185,11 @@ public abstract class StatefulActivity<STATE_TYPE extends BaseState<STATE_TYPE>>
@RequiresApi(api = Build.VERSION_CODES.R) @RequiresApi(api = Build.VERSION_CODES.R)
public void updateWindowInsets(WindowInsets.Builder updatedInsetsBuilder, public void updateWindowInsets(WindowInsets.Builder updatedInsetsBuilder,
WindowInsets oldInsets) { } WindowInsets oldInsets) { }
/**
* Runs the given {@param r} runnable when this activity binds to the touch interaction service.
*/
public void runOnBindToTouchInteractionService(Runnable r) {
r.run();
}
} }