diff options
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) { |