Snap for 8005451 from 80aa8da7e3
to sc-d2-release
Change-Id: Ib78a2894f88d110a6bf7e8dbc577ef1fa249816f
This commit is contained in:
commit
22f8381298
|
@ -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()) {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue