mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-18 18:28:20 +00:00
Merge cherrypicks of [16685428, 16688543, 16684091] into sc-v2-release.
Change-Id: If86b1acade6ad30900ecf35f9dc7b9afa223723e
This commit is contained in:
@@ -367,7 +367,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
||||
if (launcherClosing) {
|
||||
// Delay animation by a frame to avoid jank.
|
||||
Pair<AnimatorSet, Runnable> launcherContentAnimator =
|
||||
getLauncherContentAnimator(true /* isAppOpening */, startDelay);
|
||||
getLauncherContentAnimator(true /* isAppOpening */, startDelay, false);
|
||||
anim.play(launcherContentAnimator.first);
|
||||
anim.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
@@ -464,9 +464,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
||||
* @param isAppOpening True when this is called when an app is opening.
|
||||
* False when this is called when an app is closing.
|
||||
* @param startDelay Start delay duration.
|
||||
* @param skipAllAppsScale True if we want to avoid scaling All Apps
|
||||
*/
|
||||
private Pair<AnimatorSet, Runnable> getLauncherContentAnimator(boolean isAppOpening,
|
||||
int startDelay) {
|
||||
int startDelay, boolean skipAllAppsScale) {
|
||||
AnimatorSet launcherAnimator = new AnimatorSet();
|
||||
Runnable endListener;
|
||||
|
||||
@@ -484,7 +485,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
||||
final float startAlpha = appsView.getAlpha();
|
||||
final float startScale = SCALE_PROPERTY.get(appsView);
|
||||
appsView.setAlpha(alphas[0]);
|
||||
SCALE_PROPERTY.set(appsView, scales[0]);
|
||||
|
||||
ObjectAnimator alpha = ObjectAnimator.ofFloat(appsView, View.ALPHA, alphas);
|
||||
alpha.setDuration(CONTENT_ALPHA_DURATION);
|
||||
@@ -496,12 +496,16 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
||||
appsView.setLayerType(View.LAYER_TYPE_NONE, null);
|
||||
}
|
||||
});
|
||||
ObjectAnimator scale = ObjectAnimator.ofFloat(appsView, SCALE_PROPERTY, scales);
|
||||
scale.setInterpolator(AGGRESSIVE_EASE);
|
||||
scale.setDuration(CONTENT_SCALE_DURATION);
|
||||
|
||||
if (!skipAllAppsScale) {
|
||||
SCALE_PROPERTY.set(appsView, scales[0]);
|
||||
ObjectAnimator scale = ObjectAnimator.ofFloat(appsView, SCALE_PROPERTY, scales);
|
||||
scale.setInterpolator(AGGRESSIVE_EASE);
|
||||
scale.setDuration(CONTENT_SCALE_DURATION);
|
||||
launcherAnimator.play(scale);
|
||||
}
|
||||
|
||||
launcherAnimator.play(alpha);
|
||||
launcherAnimator.play(scale);
|
||||
|
||||
endListener = () -> {
|
||||
appsView.setAlpha(startAlpha);
|
||||
@@ -1565,6 +1569,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
||||
|| mLauncher.getWorkspace().isOverlayShown();
|
||||
|
||||
boolean playWorkspaceReveal = true;
|
||||
boolean skipAllAppsScale = false;
|
||||
if (mFromUnlock) {
|
||||
anim.play(getUnlockWindowAnimator(appTargets, wallpaperTargets));
|
||||
} else if (ENABLE_BACK_SWIPE_HOME_ANIMATION.get()
|
||||
@@ -1579,6 +1584,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
||||
true /* animateOverviewScrim */, launcherView).getAnimators());
|
||||
// We play StaggeredWorkspaceAnim as a part of the closing window animation.
|
||||
playWorkspaceReveal = false;
|
||||
} else {
|
||||
// Skip scaling all apps, otherwise FloatingIconView will get wrong
|
||||
// layout bounds.
|
||||
skipAllAppsScale = true;
|
||||
}
|
||||
} else {
|
||||
anim.play(getFallbackClosingWindowAnimators(appTargets));
|
||||
@@ -1600,7 +1609,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
||||
|
||||
if (mLauncher.isInState(LauncherState.ALL_APPS)) {
|
||||
Pair<AnimatorSet, Runnable> contentAnimator =
|
||||
getLauncherContentAnimator(false, LAUNCHER_RESUME_START_DELAY);
|
||||
getLauncherContentAnimator(false, LAUNCHER_RESUME_START_DELAY,
|
||||
skipAllAppsScale);
|
||||
anim.play(contentAnimator.first);
|
||||
anim.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
|
||||
@@ -99,6 +99,8 @@ public interface InputConsumer {
|
||||
|
||||
default void onMotionEvent(MotionEvent ev) { }
|
||||
|
||||
default void onHoverEvent(MotionEvent ev) { }
|
||||
|
||||
default void onKeyEvent(KeyEvent ev) { }
|
||||
|
||||
default void onInputEvent(InputEvent ev) {
|
||||
|
||||
@@ -38,6 +38,7 @@ import com.android.quickstep.views.TaskView;
|
||||
import com.android.systemui.shared.recents.model.ThumbnailData;
|
||||
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
@@ -271,6 +272,14 @@ public class OverviewCommandHelper {
|
||||
scheduleNextTask(cmd);
|
||||
}
|
||||
|
||||
public void dump(PrintWriter pw) {
|
||||
pw.println("OverviewCommandHelper:");
|
||||
pw.println(" mPendingCommands=" + mPendingCommands.size());
|
||||
if (!mPendingCommands.isEmpty()) {
|
||||
pw.println(" pendingCommandType=" + mPendingCommands.get(0).type);
|
||||
}
|
||||
}
|
||||
|
||||
private static class CommandInfo {
|
||||
public final long createTime = SystemClock.elapsedRealtime();
|
||||
public final int type;
|
||||
|
||||
@@ -99,6 +99,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
|
||||
private Handler mUiHandler = new Handler(Looper.getMainLooper());
|
||||
|
||||
private static final long HOME_APPEAR_DURATION = 250;
|
||||
private static final long RECENTS_ANIMATION_TIMEOUT = 1000;
|
||||
|
||||
private RecentsDragLayer mDragLayer;
|
||||
private ScrimView mScrimView;
|
||||
@@ -115,6 +116,11 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
|
||||
// Strong refs to runners which are cleared when the activity is destroyed
|
||||
private RemoteAnimationFactory mActivityLaunchAnimationRunner;
|
||||
|
||||
// For handling degenerate cases where starting an activity doesn't actually trigger the remote
|
||||
// animation callback
|
||||
private final Handler mHandler = new Handler();
|
||||
private final Runnable mAnimationStartTimeoutRunnable = this::onAnimationStartTimeout;
|
||||
|
||||
/**
|
||||
* Init drag layer and overview panel views.
|
||||
*/
|
||||
@@ -219,6 +225,16 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
|
||||
// TODO(b/137318995) This should go home, but doing so removes freeform windows
|
||||
}
|
||||
|
||||
/**
|
||||
* Called if the remote animation callback from #getActivityLaunchOptions() hasn't called back
|
||||
* in a reasonable time due to a conflict with the recents animation.
|
||||
*/
|
||||
private void onAnimationStartTimeout() {
|
||||
if (mActivityLaunchAnimationRunner != null) {
|
||||
mActivityLaunchAnimationRunner.onAnimationCancelled();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActivityOptionsWrapper getActivityLaunchOptions(final View v, @Nullable ItemInfo item) {
|
||||
if (!(v instanceof TaskView)) {
|
||||
@@ -233,6 +249,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
|
||||
public void onCreateAnimation(int transit, RemoteAnimationTargetCompat[] appTargets,
|
||||
RemoteAnimationTargetCompat[] wallpaperTargets,
|
||||
RemoteAnimationTargetCompat[] nonAppTargets, AnimationResult result) {
|
||||
mHandler.removeCallbacks(mAnimationStartTimeoutRunnable);
|
||||
AnimatorSet anim = composeRecentsLaunchAnimator(taskView, appTargets,
|
||||
wallpaperTargets, nonAppTargets);
|
||||
anim.addListener(resetStateListener());
|
||||
@@ -242,6 +259,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
|
||||
|
||||
@Override
|
||||
public void onAnimationCancelled() {
|
||||
mHandler.removeCallbacks(mAnimationStartTimeoutRunnable);
|
||||
onEndCallback.executeAllAndDestroy();
|
||||
}
|
||||
};
|
||||
@@ -256,6 +274,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
|
||||
ActivityOptionsCompat.makeRemoteAnimation(adapterCompat),
|
||||
onEndCallback);
|
||||
activityOptions.options.setSplashscreenStyle(SplashScreen.SPLASH_SCREEN_STYLE_ICON);
|
||||
mHandler.postDelayed(mAnimationStartTimeoutRunnable, RECENTS_ANIMATION_TIMEOUT);
|
||||
return activityOptions;
|
||||
}
|
||||
|
||||
|
||||
@@ -967,6 +967,9 @@ public class TouchInteractionService extends Service
|
||||
if (mOverviewComponentObserver != null) {
|
||||
mOverviewComponentObserver.dump(pw);
|
||||
}
|
||||
if (mOverviewCommandHelper != null) {
|
||||
mOverviewCommandHelper.dump(pw);
|
||||
}
|
||||
if (mGestureState != null) {
|
||||
mGestureState.dump(pw);
|
||||
}
|
||||
|
||||
@@ -100,6 +100,13 @@ public class OverviewInputConsumer<S extends BaseState<S>, T extends StatefulAct
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onHoverEvent(MotionEvent ev) {
|
||||
if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
|
||||
mActivity.dispatchGenericMotionEvent(ev);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onKeyEvent(KeyEvent ev) {
|
||||
if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
|
||||
|
||||
@@ -71,7 +71,16 @@ public class InputConsumerProxy {
|
||||
|
||||
private boolean onInputConsumerEvent(InputEvent ev) {
|
||||
if (ev instanceof MotionEvent) {
|
||||
onInputConsumerMotionEvent((MotionEvent) ev);
|
||||
MotionEvent event = (MotionEvent) ev;
|
||||
int action = event.getActionMasked();
|
||||
boolean isHoverEvent = action == MotionEvent.ACTION_HOVER_ENTER
|
||||
|| action == MotionEvent.ACTION_HOVER_MOVE
|
||||
|| action == MotionEvent.ACTION_HOVER_EXIT;
|
||||
if (isHoverEvent) {
|
||||
onInputConsumerHoverEvent(event);
|
||||
} else {
|
||||
onInputConsumerMotionEvent(event);
|
||||
}
|
||||
} else if (ev instanceof KeyEvent) {
|
||||
initInputConsumerIfNeeded();
|
||||
mInputConsumer.onKeyEvent((KeyEvent) ev);
|
||||
@@ -113,6 +122,15 @@ public class InputConsumerProxy {
|
||||
return true;
|
||||
}
|
||||
|
||||
private void onInputConsumerHoverEvent(MotionEvent ev) {
|
||||
initInputConsumerIfNeeded();
|
||||
if (mInputConsumer != null) {
|
||||
SimpleOrientationTouchTransformer.INSTANCE.get(mContext).transform(ev,
|
||||
mRotationSupplier.get());
|
||||
mInputConsumer.onHoverEvent(ev);
|
||||
}
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
if (mTouchInProgress) {
|
||||
mDestroyPending = true;
|
||||
|
||||
Reference in New Issue
Block a user