diff options
| author | 2016-01-20 12:43:35 -0800 | |
|---|---|---|
| committer | 2016-01-21 16:07:31 -0800 | |
| commit | 65c851e6e9e08656744b6f66d3da188e3283b17d (patch) | |
| tree | f15e875eca412addd0cdaaafc6a722fd6b01603f | |
| parent | 8aa9959413a06c3d2ff75e0c7be9e3cb7ac7cd2e (diff) | |
Fixing several regressions with affiliated tasks.
- Now that we are sorting tasks for freeform and history, ensure that
the affiliated tasks have a useful active time (based on the task
they are affiliated with) for sorting
- Fix issue with the initial stack and focus state not taking the
launch task into account due to the launchTask flag not being set
until the activity was started (now set in RecentsTaskLoadPlan)
- Fixing issue with affiliated tasks not being launched from the stack
due to the animation trigger not firing when the action button is
already hidden/visible
- Fixing issue with title text being occasionally hidden (something we
only need for freeform tasks)
- Tweaking the launch/enter animations for tasks occluded affiliated
tasks
Bug: 26685208
Change-Id: I0f6e9dbf8deec2e4fc15364e686367cc0f57b41f
14 files changed, 122 insertions, 97 deletions
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 810ca14fc15c..7a873147fdfb 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -147,6 +147,9 @@ <!-- The duration for animating the task decorations in after transitioning from an app. --> <integer name="recents_task_enter_from_app_duration">200</integer> + <!-- The duration for animating the task decorations in after transitioning from an app. --> + <integer name="recents_task_enter_from_affiliated_app_duration">125</integer> + <!-- The duration for animating the task decorations out before transitioning to an app. --> <integer name="recents_task_exit_to_app_duration">125</integer> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 47eb05a5fb5e..91ca289d1063 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -210,7 +210,7 @@ <dimen name="recents_task_view_highlight">1dp</dimen> <!-- The amount to offset when animating into an affiliate group. --> - <dimen name="recents_task_view_affiliate_group_enter_offset">64dp</dimen> + <dimen name="recents_task_view_affiliate_group_enter_offset">32dp</dimen> <!-- The height of a task view bar. --> <dimen name="recents_task_bar_height">56dp</dimen> diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index db55f286cf20..3a3b19dc3441 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -183,7 +183,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD RecentsConfiguration config = Recents.getConfiguration(); RecentsActivityLaunchState launchState = config.getLaunchState(); if (!plan.hasTasks()) { - loader.preloadTasks(plan, launchState.launchedFromHome); + loader.preloadTasks(plan, -1, launchState.launchedFromHome); } RecentsTaskLoadPlan.Options loadOpts = new RecentsTaskLoadPlan.Options(); loadOpts.runningTaskId = launchState.launchedToTaskId; @@ -192,24 +192,14 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD loader.loadTasks(this, plan, loadOpts); TaskStack stack = plan.getTaskStack(); - ArrayList<Task> tasks = stack.getStackTasks(); - int taskCount = stack.getTaskCount(); mRecentsView.setTaskStack(stack); - // Mark the task that is the launch target - int launchTaskIndexInStack = 0; - if (launchState.launchedToTaskId != -1) { - for (int j = 0; j < taskCount; j++) { - Task t = tasks.get(j); - if (t.key.id == launchState.launchedToTaskId) { - t.isLaunchTarget = true; - launchTaskIndexInStack = tasks.size() - j - 1; - break; - } - } - } - // Animate the SystemUI scrims into view + Task launchTarget = stack.getLaunchTarget(); + int taskCount = stack.getTaskCount(); + int launchTaskIndexInStack = launchTarget != null + ? stack.indexOfStackTask(launchTarget) + : 0; boolean hasStatusBarScrim = taskCount > 0; boolean animateStatusBarScrim = launchState.launchedFromHome; boolean hasNavBarScrim = (taskCount > 0) && !config.hasTransposedNavBar; @@ -527,7 +517,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD launchOpts.loadThumbnails = false; launchOpts.onlyLoadForCache = true; RecentsTaskLoadPlan loadPlan = loader.createLoadPlan(this); - loader.preloadTasks(loadPlan, false); + loader.preloadTasks(loadPlan, -1, false); loader.loadTasks(this, loadPlan, launchOpts); EventBus.getDefault().send(new TaskStackUpdatedEvent(loadPlan.getTaskStack())); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java index 3151fd7f3e6f..386696763605 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java @@ -37,6 +37,8 @@ public class RecentsDebugFlags implements TunerService.Tunable { public static final boolean EnableSearchBar = false; // This disables the bitmap and icon caches public static final boolean DisableBackgroundCache = false; + // Enables the task affiliations + public static final boolean EnableAffiliatedTaskGroups = true; // Enables the simulated task affiliations public static final boolean EnableSimulatedTaskGroups = false; // Defines the number of mock task affiliations per group diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index 7c25d24326a9..3eee08766c73 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -118,7 +118,7 @@ public class RecentsImpl extends IRecentsNonSystemUserCallbacks.Stub implements // Load the next task only if we aren't svelte RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext); - loader.preloadTasks(plan, true); + loader.preloadTasks(plan, -1, true /* isTopTaskHome */); RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options(); // This callback is made when a new activity is launched and the old one is paused // so ignore the current activity and try and preload the thumbnail for the @@ -198,7 +198,7 @@ public class RecentsImpl extends IRecentsNonSystemUserCallbacks.Stub implements // We can use a new plan since the caches will be the same. RecentsTaskLoader loader = Recents.getTaskLoader(); RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext); - loader.preloadTasks(plan, true /* isTopTaskHome */); + loader.preloadTasks(plan, -1, true /* isTopTaskHome */); RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options(); launchOpts.numVisibleTasks = loader.getIconCacheSize(); launchOpts.numVisibleTaskThumbnails = loader.getThumbnailCacheSize(); @@ -370,7 +370,7 @@ public class RecentsImpl extends IRecentsNonSystemUserCallbacks.Stub implements sInstanceLoadPlan = loader.createLoadPlan(mContext); if (topTask != null && !ssp.isRecentsTopMost(topTask, topTaskHome)) { sInstanceLoadPlan.preloadRawTasks(topTaskHome.value); - loader.preloadTasks(sInstanceLoadPlan, topTaskHome.value); + loader.preloadTasks(sInstanceLoadPlan, topTask.id, topTaskHome.value); TaskStack stack = sInstanceLoadPlan.getTaskStack(); if (stack.getTaskCount() > 0) { // We try and draw the thumbnail transition bitmap in parallel before @@ -399,7 +399,7 @@ public class RecentsImpl extends IRecentsNonSystemUserCallbacks.Stub implements SystemServicesProxy ssp = Recents.getSystemServices(); RecentsTaskLoader loader = Recents.getTaskLoader(); RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext); - loader.preloadTasks(plan, true /* isTopTaskHome */); + loader.preloadTasks(plan, -1, true /* isTopTaskHome */); TaskStack focusedStack = plan.getTaskStack(); // Return early if there are no tasks in the focused stack @@ -451,7 +451,7 @@ public class RecentsImpl extends IRecentsNonSystemUserCallbacks.Stub implements SystemServicesProxy ssp = Recents.getSystemServices(); RecentsTaskLoader loader = Recents.getTaskLoader(); RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext); - loader.preloadTasks(plan, true /* isTopTaskHome */); + loader.preloadTasks(plan, -1, true /* isTopTaskHome */); TaskStack focusedStack = plan.getTaskStack(); // Return early if there are no tasks in the focused stack @@ -756,29 +756,18 @@ public class RecentsImpl extends IRecentsNonSystemUserCallbacks.Stub implements private TaskViewTransform getThumbnailTransitionTransform(TaskStack stack, TaskStackView stackView, int runningTaskId, Task runningTaskOut) { // Find the running task in the TaskStack - Task task = null; - ArrayList<Task> tasks = stack.getStackTasks(); - if (runningTaskId != -1) { - // Otherwise, try and find the task with the - int taskCount = tasks.size(); - for (int i = taskCount - 1; i >= 0; i--) { - Task t = tasks.get(i); - if (t.key.id == runningTaskId) { - task = t; - runningTaskOut.copyFrom(t); - break; - } - } - } - if (task == null) { + Task launchTask = stack.getLaunchTarget(); + if (launchTask != null) { + runningTaskOut.copyFrom(launchTask); + } else { // If no task is specified or we can not find the task just use the front most one - task = tasks.get(tasks.size() - 1); - runningTaskOut.copyFrom(task); + launchTask = stack.getStackFrontMostTask(); + runningTaskOut.copyFrom(launchTask); } // Get the transform for the running task stackView.getScroller().setStackScrollToInitialState(); - mTmpTransform = stackView.getStackAlgorithm().getStackTransform(task, + mTmpTransform = stackView.getStackAlgorithm().getStackTransform(launchTask, stackView.getScroller().getStackScroll(), mTmpTransform, null); return mTmpTransform; } @@ -826,7 +815,7 @@ public class RecentsImpl extends IRecentsNonSystemUserCallbacks.Stub implements sInstanceLoadPlan = loader.createLoadPlan(mContext); } if (mReloadTasks || mTriggeredFromAltTab || !sInstanceLoadPlan.hasTasks()) { - loader.preloadTasks(sInstanceLoadPlan, isTopTaskHome); + loader.preloadTasks(sInstanceLoadPlan, topTask.id, isTopTaskHome); } TaskStack stack = sInstanceLoadPlan.getTaskStack(); diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java index 822ad77e71b8..4bc42ea82353 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java @@ -25,7 +25,8 @@ import android.graphics.drawable.Drawable; import android.os.UserHandle; import android.os.UserManager; import android.util.ArraySet; - +import android.util.SparseArray; +import android.util.SparseIntArray; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.recents.Recents; @@ -92,7 +93,7 @@ public class RecentsTaskLoadPlan { } /** - * An optimization to preload the raw list of tasks. The raw tasks are saved in least-recent + * An optimization to preload the raw list of tasks. The raw tasks are saved in least-recent * to most-recent order. */ public synchronized void preloadRawTasks(boolean isTopTaskHome) { @@ -107,7 +108,7 @@ public class RecentsTaskLoadPlan { } /** - * Preloads the list of recent tasks from the system. After this call, the TaskStack will + * Preloads the list of recent tasks from the system. After this call, the TaskStack will * have a list of all the recent tasks with their metadata, not including icons or * thumbnails which were not cached and have to be loaded. * @@ -115,13 +116,16 @@ public class RecentsTaskLoadPlan { * - least-recent to most-recent stack tasks * - least-recent to most-recent freeform tasks */ - public synchronized void preloadPlan(RecentsTaskLoader loader, boolean isTopTaskHome) { + public synchronized void preloadPlan(RecentsTaskLoader loader, int topTaskId, + boolean isTopTaskHome) { Resources res = mContext.getResources(); ArrayList<Task> allTasks = new ArrayList<>(); if (mRawTasks == null) { preloadRawTasks(isTopTaskHome); } + SparseArray<Task.TaskKey> affiliatedTasks = new SparseArray<>(); + SparseIntArray affiliatedTaskCounts = new SparseIntArray(); String dismissDescFormat = mContext.getString( R.string.accessibility_recents_item_will_be_dismissed); long lastStackActiveTime = Prefs.getLong(mContext, @@ -131,6 +135,17 @@ public class RecentsTaskLoadPlan { for (int i = 0; i < taskCount; i++) { ActivityManager.RecentTaskInfo t = mRawTasks.get(i); + // Affiliated tasks are returned in a specific order from ActivityManager but without a + // lastActiveTime since it hasn't yet been started. However, we later sort the task list + // by lastActiveTime, which rearranges the tasks. For now, we need to workaround this + // by updating the lastActiveTime of this task to the lastActiveTime of the task it is + // affiliated with, in the same order that we encounter it in the original list (just + // its index in the task group for the task it is affiliated with). + if (t.persistentId != t.affiliatedTaskId) { + t.lastActiveTime = affiliatedTasks.get(t.affiliatedTaskId).lastActiveTime + + affiliatedTaskCounts.get(t.affiliatedTaskId, 0) + 1; + } + // Compose the task key Task.TaskKey taskKey = new Task.TaskKey(t.persistentId, t.stackId, t.baseIntent, t.userId, t.firstActiveTime, t.lastActiveTime); @@ -140,6 +155,7 @@ public class RecentsTaskLoadPlan { boolean isFreeformTask = SystemServicesProxy.isFreeformStack(t.stackId); boolean isStackTask = isFreeformTask || (!isHistoricalTask(t) || (t.lastActiveTime >= lastStackActiveTime && i >= (taskCount - MIN_NUM_TASKS))); + boolean isLaunchTarget = taskKey.id == topTaskId; if (isStackTask && newLastStackActiveTime < 0) { newLastStackActiveTime = t.lastActiveTime; } @@ -157,9 +173,11 @@ public class RecentsTaskLoadPlan { // Add the task to the stack Task task = new Task(taskKey, t.affiliatedTaskId, t.affiliatedTaskColor, icon, thumbnail, title, contentDescription, dismissDescription, activityColor, - !isStackTask, t.bounds, t.taskDescription); + !isStackTask, isLaunchTarget, t.bounds, t.taskDescription); allTasks.add(task); + affiliatedTaskCounts.put(taskKey.id, affiliatedTaskCounts.get(taskKey.id, 0) + 1); + affiliatedTasks.put(taskKey.id, taskKey); } if (newLastStackActiveTime != -1) { Prefs.putLong(mContext, Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java index 28338d8330fa..8d8fec632ef9 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java @@ -314,8 +314,8 @@ public class RecentsTaskLoader { } /** Preloads recents tasks using the specified plan to store the output. */ - public void preloadTasks(RecentsTaskLoadPlan plan, boolean isTopTaskHome) { - plan.preloadPlan(this, isTopTaskHome); + public void preloadTasks(RecentsTaskLoadPlan plan, int topTaskId, boolean isTopTaskHome) { + plan.preloadPlan(this, topTaskId, isTopTaskHome); } /** Begins loading the heavy task data according to the specified options. */ diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/Task.java b/packages/SystemUI/src/com/android/systemui/recents/model/Task.java index 29e7077ccf76..193bd17b81e7 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/Task.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/Task.java @@ -154,7 +154,8 @@ public class Task { public Task(TaskKey key, int affiliationTaskId, int affiliationColor, Drawable icon, Bitmap thumbnail, String title, String contentDescription, String dismissDescription, int colorPrimary, boolean isHistorical, - Rect bounds, ActivityManager.TaskDescription taskDescription) { + boolean isLaunchTarget, Rect bounds, + ActivityManager.TaskDescription taskDescription) { boolean isInAffiliationGroup = (affiliationTaskId != key.id); boolean hasAffiliationGroupColor = isInAffiliationGroup && (affiliationColor != 0); this.key = key; @@ -170,6 +171,7 @@ public class Task { Color.WHITE) > 3f; this.bounds = bounds; this.taskDescription = taskDescription; + this.isLaunchTarget = isLaunchTarget; this.isHistorical = isHistorical; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java index ad723e23e671..c73273e6f258 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java @@ -848,12 +848,17 @@ public class TaskStack { for (int i = 0; i < taskCount; i++) { Task t = tasks.get(i); TaskGrouping group; - int affiliation = t.affiliationTaskId > 0 ? t.affiliationTaskId : - IndividualTaskIdOffset + t.key.id; - if (mAffinitiesGroups.containsKey(affiliation)) { - group = getGroupWithAffiliation(affiliation); + if (RecentsDebugFlags.Static.EnableAffiliatedTaskGroups) { + int affiliation = t.affiliationTaskId > 0 ? t.affiliationTaskId : + IndividualTaskIdOffset + t.key.id; + if (mAffinitiesGroups.containsKey(affiliation)) { + group = getGroupWithAffiliation(affiliation); + } else { + group = new TaskGrouping(affiliation); + addGroup(group); + } } else { - group = new TaskGrouping(affiliation); + group = new TaskGrouping(t.key.id); addGroup(group); } group.addTask(t); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java index 2930f4d5c08f..ccbb329bb151 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java @@ -130,6 +130,7 @@ public class TaskStackAnimationHelper { // Move the task view slightly lower so we can animate it in RectF bounds = new RectF(mTmpTransform.rect); bounds.offset(0, taskViewAffiliateGroupEnterOffset); + tv.setClipViewInStack(false); tv.setAlpha(0f); tv.setLeftTopRightBottom((int) bounds.left, (int) bounds.top, (int) bounds.right, (int) bounds.bottom); @@ -165,6 +166,8 @@ public class TaskStackAnimationHelper { int taskViewEnterFromAppDuration = res.getInteger( R.integer.recents_task_enter_from_app_duration); + int taskViewEnterFromAffiliatedAppDuration = res.getInteger( + R.integer.recents_task_enter_from_affiliated_app_duration); int taskViewEnterFromHomeDuration = res.getInteger( R.integer.recents_task_enter_from_home_duration); int taskViewEnterFromHomeStaggerDelay = res.getInteger( @@ -174,7 +177,7 @@ public class TaskStackAnimationHelper { List<TaskView> taskViews = mStackView.getTaskViews(); int taskViewCount = taskViews.size(); for (int i = taskViewCount - 1; i >= 0; i--) { - TaskView tv = taskViews.get(i); + final TaskView tv = taskViews.get(i); Task task = tv.getTask(); boolean currentTaskOccludesLaunchTarget = false; if (launchTargetTask != null) { @@ -195,8 +198,14 @@ public class TaskStackAnimationHelper { // Animate the task up if it was occluding the launch target if (currentTaskOccludesLaunchTarget) { TaskViewAnimation taskAnimation = new TaskViewAnimation( - taskViewEnterFromAppDuration, PhoneStatusBar.ALPHA_IN, - postAnimationTrigger.decrementOnAnimationEnd()); + taskViewEnterFromAffiliatedAppDuration, PhoneStatusBar.ALPHA_IN, + new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + postAnimationTrigger.decrement(); + tv.setClipViewInStack(false); + } + }); postAnimationTrigger.increment(); mStackView.updateTaskViewToTransform(tv, mTmpTransform, taskAnimation); } @@ -286,7 +295,7 @@ public class TaskStackAnimationHelper { } else if (currentTaskOccludesLaunchTarget) { // Animate this task out of view TaskViewAnimation taskAnimation = new TaskViewAnimation( - taskViewExitToAppDuration, mFastOutLinearInInterpolator, + taskViewExitToAppDuration, PhoneStatusBar.ALPHA_OUT, postAnimationTrigger.decrementOnAnimationEnd()); postAnimationTrigger.increment(); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java index 5bd5a8159803..e99509cb8365 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java @@ -434,19 +434,25 @@ public class TaskStackLayoutAlgorithm { mFreeformLayoutAlgorithm.update(freeformTasks, this); mInitialScrollP = mMaxScrollP; } else { + Task launchTask = stack.getLaunchTarget(); + int launchTaskIndex = launchTask != null + ? stack.indexOfStackTask(launchTask) + : mNumStackTasks - 1; if (!ssp.hasFreeformWorkspaceSupport() && mNumStackTasks == 1) { mInitialScrollP = mMinScrollP; } else if (getDefaultFocusState() > 0f) { RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState(); if (launchState.launchedFromHome) { - mInitialScrollP = Math.max(mMinScrollP, mNumStackTasks - 1); + mInitialScrollP = Math.max(mMinScrollP, Math.min(mMaxScrollP, launchTaskIndex)); } else { - mInitialScrollP = Math.max(mMinScrollP, mNumStackTasks - 2); + mInitialScrollP = Math.max(mMinScrollP, Math.min(mMaxScrollP, + launchTaskIndex - 1)); } } else { float offsetPct = (float) (mTaskRect.height() / 2) / mStackRect.height(); float normX = mUnfocusedCurveInterpolator.getX(offsetPct); - mInitialScrollP = (mNumStackTasks - 1) - mUnfocusedRange.getAbsoluteX(normX); + mInitialScrollP = Math.max(mMinScrollP, Math.min(mMaxScrollP, + launchTaskIndex - mUnfocusedRange.getAbsoluteX(normX))); } } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java index 3b78d71c3a5c..de472bcd59a6 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java @@ -1220,9 +1220,12 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // Set the task focused state without requesting view focus, and leave the focus animations // until after the enter-animation + Task launchTask = mStack.getLaunchTarget(); RecentsConfiguration config = Recents.getConfiguration(); RecentsActivityLaunchState launchState = config.getLaunchState(); - int focusedTaskIndex = launchState.getInitialFocusTaskIndex(mStack.getTaskCount()); + int focusedTaskIndex = launchTask != null + ? mStack.indexOfStackTask(launchTask) + : launchState.getInitialFocusTaskIndex(mStack.getTaskCount()); if (focusedTaskIndex != -1) { setFocusedTask(focusedTaskIndex, false /* scrollToTask */, false /* requestViewFocus */); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java index 9b727020404f..ba0fc8f01769 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java @@ -459,16 +459,14 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, public void showActionButton(boolean fadeIn, int fadeInDuration) { mActionButtonView.setVisibility(View.VISIBLE); - if (fadeIn) { - if (mActionButtonView.getAlpha() < 1f) { - mActionButtonView.animate() - .alpha(1f) - .scaleX(1f) - .scaleY(1f) - .setDuration(fadeInDuration) - .setInterpolator(PhoneStatusBar.ALPHA_IN) - .start(); - } + if (fadeIn && mActionButtonView.getAlpha() < 1f) { + mActionButtonView.animate() + .alpha(1f) + .scaleX(1f) + .scaleY(1f) + .setDuration(fadeInDuration) + .setInterpolator(PhoneStatusBar.ALPHA_IN) + .start(); } else { mActionButtonView.setScaleX(1f); mActionButtonView.setScaleY(1f); @@ -484,29 +482,27 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, */ public void hideActionButton(boolean fadeOut, int fadeOutDuration, boolean scaleDown, final Animator.AnimatorListener animListener) { - if (fadeOut) { - if (mActionButtonView.getAlpha() > 0f) { - if (scaleDown) { - float toScale = 0.9f; - mActionButtonView.animate() - .scaleX(toScale) - .scaleY(toScale); - } + if (fadeOut && mActionButtonView.getAlpha() > 0f) { + if (scaleDown) { + float toScale = 0.9f; mActionButtonView.animate() - .alpha(0f) - .setDuration(fadeOutDuration) - .setInterpolator(PhoneStatusBar.ALPHA_OUT) - .withEndAction(new Runnable() { - @Override - public void run() { - if (animListener != null) { - animListener.onAnimationEnd(null); - } - mActionButtonView.setVisibility(View.INVISIBLE); - } - }) - .start(); + .scaleX(toScale) + .scaleY(toScale); } + mActionButtonView.animate() + .alpha(0f) + .setDuration(fadeOutDuration) + .setInterpolator(PhoneStatusBar.ALPHA_OUT) + .withEndAction(new Runnable() { + @Override + public void run() { + if (animListener != null) { + animListener.onAnimationEnd(null); + } + mActionButtonView.setVisibility(View.INVISIBLE); + } + }) + .start(); } else { mActionButtonView.setAlpha(0f); mActionButtonView.setVisibility(View.INVISIBLE); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java index e7717ac1c871..15cb14a15c4b 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java @@ -228,6 +228,7 @@ public class TaskViewHeader extends FrameLayout mTaskViewRect.set(0, 0, width, height); boolean updateMoveTaskButton = mMoveTaskButton.getVisibility() != View.GONE; + boolean isFreeformTask = (mTask != null) && mTask.isFreeformTask(); int appIconWidth = mIconView.getMeasuredWidth(); int activityDescWidth = (mTask != null) ? (int) mTitleView.getPaint().measureText(mTask.title) @@ -239,19 +240,20 @@ public class TaskViewHeader extends FrameLayout // Priority-wise, we show the activity icon first, the dismiss icon if there is room, the // move-task icon if there is room, and then finally, the activity label if there is room - if (width < (appIconWidth + dismissIconWidth)) { + if (isFreeformTask && width < (appIconWidth + dismissIconWidth)) { mTitleView.setVisibility(View.INVISIBLE); if (updateMoveTaskButton) { mMoveTaskButton.setVisibility(View.INVISIBLE); } mDismissButton.setVisibility(View.INVISIBLE); - } else if (width < (appIconWidth + dismissIconWidth + moveTaskIconWidth)) { + } else if (isFreeformTask && width < (appIconWidth + dismissIconWidth + + moveTaskIconWidth)) { mTitleView.setVisibility(View.INVISIBLE); if (updateMoveTaskButton) { mMoveTaskButton.setVisibility(View.INVISIBLE); } mDismissButton.setVisibility(View.VISIBLE); - } else if (width < (appIconWidth + dismissIconWidth + moveTaskIconWidth + + } else if (isFreeformTask && width < (appIconWidth + dismissIconWidth + moveTaskIconWidth + activityDescWidth)) { mTitleView.setVisibility(View.INVISIBLE); if (updateMoveTaskButton) { |