Fallback 1 for Recents timeout behaviour

- Removing initial timeout
- Adding double tap to switch tasks

Change-Id: Ice6a508b842377809bf0dcea0997522164d0ccdf
This commit is contained in:
Winson
2016-02-04 14:37:18 -08:00
parent 3e85f9e48c
commit b61e654b9a
7 changed files with 81 additions and 46 deletions

View File

@@ -45,7 +45,6 @@ import com.android.systemui.recents.events.activity.AppWidgetProviderChangedEven
import com.android.systemui.recents.events.activity.CancelEnterRecentsWindowAnimationEvent;
import com.android.systemui.recents.events.activity.DebugFlagsChangedEvent;
import com.android.systemui.recents.events.activity.DismissRecentsToHomeAnimationStarted;
import com.android.systemui.recents.events.activity.EnterRecentsTaskStackAnimationCompletedEvent;
import com.android.systemui.recents.events.activity.EnterRecentsWindowAnimationCompletedEvent;
import com.android.systemui.recents.events.activity.EnterRecentsWindowLastAnimationFrameEvent;
import com.android.systemui.recents.events.activity.ExitRecentsWindowFirstAnimationFrameEvent;
@@ -438,11 +437,8 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD
protected void onPause() {
super.onPause();
RecentsDebugFlags flags = Recents.getDebugFlags();
if (flags.isFastToggleRecentsEnabled()) {
// Stop the fast-toggle dozer
mIterateTrigger.stopDozing();
}
// Stop the fast-toggle dozer
mIterateTrigger.stopDozing();
}
@Override
@@ -649,6 +645,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD
}
public final void onBusEvent(UserInteractionEvent event) {
// Stop the fast-toggle dozer
mIterateTrigger.stopDozing();
}
@@ -695,21 +692,6 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD
}
}
public final void onBusEvent(EnterRecentsTaskStackAnimationCompletedEvent event) {
RecentsDebugFlags debugFlags = Recents.getDebugFlags();
RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState();
if (!launchState.launchedWithAltTab && debugFlags.isFastToggleRecentsEnabled() &&
RecentsDebugFlags.Static.EnableFastToggleTimeoutOnEnter) {
mIterateTrigger.setDozeDuration(
getResources().getInteger(R.integer.recents_auto_advance_duration));
if (!mIterateTrigger.isDozing()) {
mIterateTrigger.startDozing();
} else {
mIterateTrigger.poke();
}
}
}
public final void onBusEvent(EnterRecentsWindowLastAnimationFrameEvent event) {
EventBus.getDefault().send(new UpdateFreeformTaskViewVisibilityEvent(true));
mRecentsView.getViewTreeObserver().addOnPreDrawListener(this);

View File

@@ -52,10 +52,23 @@ public class RecentsActivityLaunchState {
* Returns the task to focus given the current launch state.
*/
public int getInitialFocusTaskIndex(int numTasks) {
RecentsDebugFlags debugFlags = Recents.getDebugFlags();
if (launchedFromAppWithThumbnail) {
if (debugFlags.isFastToggleRecentsEnabled()) {
// If fast toggling, focus the front most task so that the next tap will focus the
// N-1 task
return numTasks - 1;
}
// If coming from another app, focus the next task
return numTasks - 2;
} else {
if (debugFlags.isFastToggleRecentsEnabled()) {
// If fast toggling, defer focusing until the next tap (which will automatically
// focus the front most task)
return -1;
}
// If coming from home, focus the first task
return numTasks - 1;
}

View File

@@ -39,8 +39,6 @@ public class RecentsDebugFlags implements TunerService.Tunable {
public static final boolean EnableAffiliatedTaskGroups = true;
// Overrides the Tuner flags and enables the fast toggle and timeout
public static final boolean EnableFastToggleTimeoutOverride = true;
// Enables toggling the fast-toggle timeout immediately after entering Recents
public static final boolean EnableFastToggleTimeoutOnEnter = true;
// Enables us to create mock recents tasks
public static final boolean EnableMockTasks = false;
@@ -90,9 +88,6 @@ public class RecentsDebugFlags implements TunerService.Tunable {
* @return whether the initial stack state is paging.
*/
public boolean isInitialStatePaging() {
if (Static.EnableFastToggleTimeoutOnEnter) {
return true;
}
return mInitialStatePaging;
}

View File

@@ -38,6 +38,7 @@ import android.util.MutableBoolean;
import android.view.AppTransitionAnimationSpec;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewConfiguration;
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.Prefs;
@@ -48,6 +49,7 @@ import com.android.systemui.recents.events.activity.DockingTopTaskEvent;
import com.android.systemui.recents.events.activity.EnterRecentsWindowLastAnimationFrameEvent;
import com.android.systemui.recents.events.activity.HideRecentsEvent;
import com.android.systemui.recents.events.activity.IterateRecentsEvent;
import com.android.systemui.recents.events.activity.LaunchNextTaskRequestEvent;
import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent;
import com.android.systemui.recents.events.activity.ToggleRecentsEvent;
import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent;
@@ -81,8 +83,10 @@ import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID;
public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener {
private final static String TAG = "RecentsImpl";
// The minimum amount of time between each recents button press that we will handle
private final static int MIN_TOGGLE_DELAY_MS = 350;
// The duration within which the user releasing the alt tab (from when they pressed alt tab)
// that the fast alt-tab animation will run. If the user's alt-tab takes longer than this
// duration, then we will toggle recents after this duration.
@@ -337,21 +341,31 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
mTriggeredFromAltTab = false;
try {
ViewConfiguration viewConfig = ViewConfiguration.get(mContext);
SystemServicesProxy ssp = Recents.getSystemServices();
ActivityManager.RunningTaskInfo topTask = ssp.getTopMostTask();
MutableBoolean isTopTaskHome = new MutableBoolean(true);
long elapsedTime = SystemClock.elapsedRealtime() - mLastToggleTime;
if (topTask != null && ssp.isRecentsTopMost(topTask, isTopTaskHome)) {
RecentsConfiguration config = Recents.getConfiguration();
RecentsActivityLaunchState launchState = config.getLaunchState();
if (!launchState.launchedWithAltTab) {
// Notify recents to move onto the next task
EventBus.getDefault().post(new IterateRecentsEvent());
// If the user taps quickly
if (ViewConfiguration.getDoubleTapMinTime() < elapsedTime &&
elapsedTime < ViewConfiguration.getDoubleTapTimeout()) {
// Launch the next focused task
EventBus.getDefault().post(new LaunchNextTaskRequestEvent());
} else {
// Notify recents to move onto the next task
EventBus.getDefault().post(new IterateRecentsEvent());
}
} else {
// If the user has toggled it too quickly, then just eat up the event here (it's
// better than showing a janky screenshot).
// NOTE: Ideally, the screenshot mechanism would take the window transform into
// account
if ((SystemClock.elapsedRealtime() - mLastToggleTime) < MIN_TOGGLE_DELAY_MS) {
if (elapsedTime < MIN_TOGGLE_DELAY_MS) {
return;
}
@@ -364,7 +378,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
// better than showing a janky screenshot).
// NOTE: Ideally, the screenshot mechanism would take the window transform into
// account
if ((SystemClock.elapsedRealtime() - mLastToggleTime) < MIN_TOGGLE_DELAY_MS) {
if (elapsedTime < MIN_TOGGLE_DELAY_MS) {
return;
}

View File

@@ -0,0 +1,27 @@
/*
* Copyright (C) 2016 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 next task is launched after a double-tap on the Recents
* button.
*/
public class LaunchNextTaskRequestEvent extends EventBus.Event {
// Simple event
}

View File

@@ -383,6 +383,7 @@ public class TaskStackLayoutAlgorithm {
*/
void update(TaskStack stack, ArraySet<Task.TaskKey> ignoreTasksSet) {
SystemServicesProxy ssp = Recents.getSystemServices();
RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState();
// Clear the progress map
mTaskIndexMap.clear();
@@ -449,7 +450,6 @@ public class TaskStackLayoutAlgorithm {
if (!ssp.hasFreeformWorkspaceSupport() && mNumStackTasks == 1) {
mInitialScrollP = mMinScrollP;
} else if (getDefaultFocusState() > 0f) {
RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState();
if (launchState.launchedFromHome) {
mInitialScrollP = Math.max(mMinScrollP, Math.min(mMaxScrollP, launchTaskIndex));
} else {

View File

@@ -58,6 +58,7 @@ import com.android.systemui.recents.events.activity.EnterRecentsWindowAnimationC
import com.android.systemui.recents.events.activity.HideHistoryButtonEvent;
import com.android.systemui.recents.events.activity.HideHistoryEvent;
import com.android.systemui.recents.events.activity.IterateRecentsEvent;
import com.android.systemui.recents.events.activity.LaunchNextTaskRequestEvent;
import com.android.systemui.recents.events.activity.LaunchTaskEvent;
import com.android.systemui.recents.events.activity.LaunchTaskStartedEvent;
import com.android.systemui.recents.events.activity.PackagesChangedEvent;
@@ -1544,6 +1545,24 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
mUIDozeTrigger.stopDozing();
}
public final void onBusEvent(LaunchNextTaskRequestEvent event) {
int launchTaskIndex = mStack.indexOfStackTask(mStack.getLaunchTarget());
if (launchTaskIndex != -1) {
launchTaskIndex = Math.max(0, launchTaskIndex - 1);
} else {
launchTaskIndex = mStack.getTaskCount() - 1;
}
if (launchTaskIndex != -1) {
// Stop all animations
mUIDozeTrigger.stopDozing();
cancelAllTaskViewAnimations();
Task launchTask = mStack.getStackTasks().get(launchTaskIndex);
EventBus.getDefault().send(new LaunchTaskEvent(getChildViewForTask(launchTask),
launchTask, null, INVALID_STACK_ID, false /* screenPinningRequested */));
}
}
public final void onBusEvent(LaunchTaskStartedEvent event) {
mAnimationHelper.startLaunchTaskAnimation(event.taskView, event.screenPinningRequested,
event.getAnimationTrigger());
@@ -1762,21 +1781,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
}
}
public final void onBusEvent(EnterRecentsTaskStackAnimationCompletedEvent event) {
RecentsDebugFlags debugFlags = Recents.getDebugFlags();
RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState();
if (!launchState.launchedWithAltTab && debugFlags.isFastToggleRecentsEnabled() &&
RecentsDebugFlags.Static.EnableFastToggleTimeoutOnEnter) {
if (mFocusedTask != null) {
int timerIndicatorDuration = getResources().getInteger(
R.integer.recents_auto_advance_duration);
int focusedTaskIndex = mStack.indexOfStackTask(mFocusedTask);
setFocusedTask(focusedTaskIndex, false /* scrollToTask */,
false /* requestViewFocus */, timerIndicatorDuration);
}
}
}
public final void onBusEvent(UpdateFreeformTaskViewVisibilityEvent event) {
List<TaskView> taskViews = getTaskViews();
int taskViewCount = taskViews.size();