2D Recents: fix toggling behavior

am: a96a617a4e

Change-Id: I8978e8ae81e3566e83ca3d7819b95d54c5861b67
This commit is contained in:
Manu Cornet
2017-02-03 00:02:22 +00:00
committed by android-build-merger
3 changed files with 77 additions and 31 deletions

View File

@@ -50,6 +50,7 @@ import com.android.systemui.recents.events.activity.DockedTopTaskEvent;
import com.android.systemui.recents.events.activity.EnterRecentsWindowLastAnimationFrameEvent; import com.android.systemui.recents.events.activity.EnterRecentsWindowLastAnimationFrameEvent;
import com.android.systemui.recents.events.activity.HideRecentsEvent; import com.android.systemui.recents.events.activity.HideRecentsEvent;
import com.android.systemui.recents.events.activity.IterateRecentsEvent; import com.android.systemui.recents.events.activity.IterateRecentsEvent;
import com.android.systemui.recents.events.activity.LaunchMostRecentTaskRequestEvent;
import com.android.systemui.recents.events.activity.LaunchNextTaskRequestEvent; import com.android.systemui.recents.events.activity.LaunchNextTaskRequestEvent;
import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent; import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent;
import com.android.systemui.recents.events.activity.ToggleRecentsEvent; import com.android.systemui.recents.events.activity.ToggleRecentsEvent;
@@ -303,16 +304,24 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
RecentsConfiguration config = Recents.getConfiguration(); RecentsConfiguration config = Recents.getConfiguration();
RecentsActivityLaunchState launchState = config.getLaunchState(); RecentsActivityLaunchState launchState = config.getLaunchState();
if (!launchState.launchedWithAltTab) { if (!launchState.launchedWithAltTab) {
// If the user taps quickly // Has the user tapped quickly?
if (!debugFlags.isPagingEnabled() || boolean isQuickTap = ViewConfiguration.getDoubleTapMinTime() < elapsedTime &&
(ViewConfiguration.getDoubleTapMinTime() < elapsedTime && elapsedTime < ViewConfiguration.getDoubleTapTimeout();
elapsedTime < ViewConfiguration.getDoubleTapTimeout())) { if (Recents.getConfiguration().isGridEnabled) {
if (isQuickTap) {
EventBus.getDefault().post(new LaunchNextTaskRequestEvent());
} else {
EventBus.getDefault().post(new LaunchMostRecentTaskRequestEvent());
}
} else {
if (!debugFlags.isPagingEnabled() || isQuickTap) {
// Launch the next focused task // Launch the next focused task
EventBus.getDefault().post(new LaunchNextTaskRequestEvent()); EventBus.getDefault().post(new LaunchNextTaskRequestEvent());
} else { } else {
// Notify recents to move onto the next task // Notify recents to move onto the next task
EventBus.getDefault().post(new IterateRecentsEvent()); EventBus.getDefault().post(new IterateRecentsEvent());
} }
}
} else { } else {
// If the user has toggled it too quickly, then just eat up the event here (it's // If the user has toggled it too quickly, then just eat up the event here (it's
// better than showing a janky screenshot). // better than showing a janky screenshot).

View File

@@ -0,0 +1,26 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.recents.events.activity;
import com.android.systemui.recents.events.EventBus;
/**
* This event is sent to request that the most recent task is launched.
*/
public class LaunchMostRecentTaskRequestEvent extends EventBus.Event {
// Simple event
}

View File

@@ -64,6 +64,7 @@ import com.android.systemui.recents.events.activity.EnterRecentsWindowAnimationC
import com.android.systemui.recents.events.activity.HideRecentsEvent; import com.android.systemui.recents.events.activity.HideRecentsEvent;
import com.android.systemui.recents.events.activity.HideStackActionButtonEvent; import com.android.systemui.recents.events.activity.HideStackActionButtonEvent;
import com.android.systemui.recents.events.activity.IterateRecentsEvent; import com.android.systemui.recents.events.activity.IterateRecentsEvent;
import com.android.systemui.recents.events.activity.LaunchMostRecentTaskRequestEvent;
import com.android.systemui.recents.events.activity.LaunchNextTaskRequestEvent; import com.android.systemui.recents.events.activity.LaunchNextTaskRequestEvent;
import com.android.systemui.recents.events.activity.LaunchTaskEvent; import com.android.systemui.recents.events.activity.LaunchTaskEvent;
import com.android.systemui.recents.events.activity.LaunchTaskStartedEvent; import com.android.systemui.recents.events.activity.LaunchTaskStartedEvent;
@@ -1733,6 +1734,13 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
mUIDozeTrigger.stopDozing(); mUIDozeTrigger.stopDozing();
} }
public final void onBusEvent(LaunchMostRecentTaskRequestEvent event) {
if (mStack.getTaskCount() > 0) {
Task mostRecentTask = mStack.getStackFrontMostTask(true /* includeFreefromTasks */);
launchTask(mostRecentTask);
}
}
public final void onBusEvent(LaunchNextTaskRequestEvent event) { public final void onBusEvent(LaunchNextTaskRequestEvent event) {
if (mAwaitingFirstLayout) { if (mAwaitingFirstLayout) {
mLaunchNextAfterFirstMeasure = true; mLaunchNextAfterFirstMeasure = true;
@@ -1741,29 +1749,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
final Task launchTask = mStack.getNextLaunchTarget(); final Task launchTask = mStack.getNextLaunchTarget();
if (launchTask != null) { if (launchTask != null) {
// Stop all animations launchTask(launchTask);
cancelAllTaskViewAnimations();
float curScroll = mStackScroller.getStackScroll();
float targetScroll = mLayoutAlgorithm.getStackScrollForTaskAtInitialOffset(launchTask);
float absScrollDiff = Math.abs(targetScroll - curScroll);
if (getChildViewForTask(launchTask) == null || absScrollDiff > 0.35f) {
int duration = (int) (LAUNCH_NEXT_SCROLL_BASE_DURATION +
absScrollDiff * LAUNCH_NEXT_SCROLL_INCR_DURATION);
mStackScroller.animateScroll(targetScroll,
duration, new Runnable() {
@Override
public void run() {
EventBus.getDefault().send(new LaunchTaskEvent(
getChildViewForTask(launchTask), launchTask, null,
INVALID_STACK_ID, false /* screenPinningRequested */));
}
});
} else {
EventBus.getDefault().send(new LaunchTaskEvent(getChildViewForTask(launchTask),
launchTask, null, INVALID_STACK_ID, false /* screenPinningRequested */));
}
MetricsLogger.action(getContext(), MetricsEvent.OVERVIEW_LAUNCH_PREVIOUS_TASK, MetricsLogger.action(getContext(), MetricsEvent.OVERVIEW_LAUNCH_PREVIOUS_TASK,
launchTask.key.getComponent().toString()); launchTask.key.getComponent().toString());
} else if (mStack.getTaskCount() == 0) { } else if (mStack.getTaskCount() == 0) {
@@ -2215,6 +2201,31 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
return -1; return -1;
} }
private void launchTask(Task task) {
// Stop all animations
cancelAllTaskViewAnimations();
float curScroll = mStackScroller.getStackScroll();
float targetScroll = mLayoutAlgorithm.getStackScrollForTaskAtInitialOffset(task);
float absScrollDiff = Math.abs(targetScroll - curScroll);
if (getChildViewForTask(task) == null || absScrollDiff > 0.35f) {
int duration = (int) (LAUNCH_NEXT_SCROLL_BASE_DURATION +
absScrollDiff * LAUNCH_NEXT_SCROLL_INCR_DURATION);
mStackScroller.animateScroll(targetScroll,
duration, new Runnable() {
@Override
public void run() {
EventBus.getDefault().send(new LaunchTaskEvent(
getChildViewForTask(task), task, null,
INVALID_STACK_ID, false /* screenPinningRequested */));
}
});
} else {
EventBus.getDefault().send(new LaunchTaskEvent(getChildViewForTask(task),
task, null, INVALID_STACK_ID, false /* screenPinningRequested */));
}
}
/** /**
* Check whether we should use the grid layout. * Check whether we should use the grid layout.
*/ */