Removing extraneous calls.
- Removing calls to ensureCapacity, which was causing reallocations when
using a temporary set with multiple uses.
- Fixing issue with update callback not being called when immediately
updating a TaskView’s transform
- Adding utility methods in preparation for refactoring code
Change-Id: If62c3751ed6af15092a34435df08bb4d627536ea
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index fabc7b7..d28da41 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -135,7 +135,7 @@
private ObjectAnimator createTranslationAnimation(View v, float newPos) {
ObjectAnimator anim = ObjectAnimator.ofFloat(v,
- mSwipeDirection == X ? "translationX" : "translationY", newPos);
+ mSwipeDirection == X ? View.TRANSLATION_X : View.TRANSLATION_Y, newPos);
return anim;
}
@@ -401,9 +401,17 @@
mCallback.onChildSnappedBack(animView);
}
});
+ updateSnapBackAnimation(anim);
anim.start();
}
+ /**
+ * Called to update the snap back animation.
+ */
+ protected void updateSnapBackAnimation(Animator anim) {
+ // Do nothing
+ }
+
public boolean onTouchEvent(MotionEvent ev) {
if (mLongPressSent) {
return true;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java b/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java
index 33f116b..f3c4cc3 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java
@@ -21,10 +21,16 @@
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
+import android.util.ArraySet;
import android.util.IntProperty;
import android.util.Property;
import android.view.View;
import android.view.ViewParent;
+import com.android.systemui.recents.model.Task;
+import com.android.systemui.recents.views.TaskViewTransform;
+
+import java.util.Collections;
+import java.util.List;
/* Common code */
public class Utilities {
@@ -71,6 +77,28 @@
return null;
}
+ /**
+ * Initializes the {@param setOut} with the given object.
+ */
+ public static <T> ArraySet<T> objectToSet(T obj, ArraySet<T> setOut) {
+ setOut.clear();
+ if (obj != null) {
+ setOut.add(obj);
+ }
+ return setOut;
+ }
+
+ /**
+ * Replaces the contents of {@param setOut} with the contents of the {@param array}.
+ */
+ public static <T> ArraySet<T> arrayToSet(T[] array, ArraySet<T> setOut) {
+ setOut.clear();
+ if (array != null) {
+ Collections.addAll(setOut, array);
+ }
+ return setOut;
+ }
+
/** Scales a rect about its centroid */
public static void scaleRectAboutCenter(RectF r, float scale) {
if (scale != 1.0f) {
@@ -127,4 +155,22 @@
animator.cancel();
}
}
+
+ /**
+ * Updates {@param transforms} to be the same size as {@param tasks}.
+ */
+ public static void matchTaskListSize(List<Task> tasks, List<TaskViewTransform> transforms) {
+ // We can reuse the task transforms where possible to reduce object allocation
+ int taskTransformCount = transforms.size();
+ int taskCount = tasks.size();
+ if (taskTransformCount < taskCount) {
+ // If there are less transforms than tasks, then add as many transforms as necessary
+ for (int i = taskTransformCount; i < taskCount; i++) {
+ transforms.add(new TaskViewTransform());
+ }
+ } else if (taskTransformCount > taskCount) {
+ // If there are more transforms than tasks, then just subset the transform list
+ transforms.subList(taskCount, taskTransformCount).clear();
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/TaskGrouping.java b/packages/SystemUI/src/com/android/systemui/recents/model/TaskGrouping.java
index 15f6b0a..2109376 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/TaskGrouping.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/TaskGrouping.java
@@ -98,7 +98,6 @@
int taskCount = mTaskKeys.size();
mFrontMostTaskKey = mTaskKeys.get(mTaskKeys.size() - 1);
mTaskKeyIndices.clear();
- mTaskKeyIndices.ensureCapacity(taskCount);
for (int i = 0; i < taskCount; i++) {
Task.TaskKey k = mTaskKeys.get(i);
mTaskKeyIndices.put(k, i);
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 21d0bb6..327cdf8 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
@@ -193,7 +193,6 @@
private void updateFilteredTaskIndices() {
int taskCount = mFilteredTasks.size();
mTaskIndices.clear();
- mTaskIndices.ensureCapacity(taskCount);
for (int i = 0; i < taskCount; i++) {
Task t = mFilteredTasks.get(i);
mTaskIndices.put(t.key, i);
@@ -841,7 +840,6 @@
ArrayMap<Task.TaskKey, Task> tasksMap = new ArrayMap<>();
ArrayList<Task> tasks = mStackTaskList.getTasks();
int taskCount = tasks.size();
- tasksMap.ensureCapacity(taskCount);
for (int i = 0; i < taskCount; i++) {
Task t = tasks.get(i);
TaskGrouping group;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java b/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java
index b8bbf51..5a72897 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java
@@ -58,6 +58,7 @@
void setAlpha(float alpha) {
if (Float.compare(alpha, mAlpha) != 0) {
mAlpha = alpha;
+ // TODO, If both clip and alpha change in the same frame, only invalidate once
mSourceView.invalidateOutline();
}
}
@@ -79,6 +80,7 @@
mSourceView.getHeight() - Math.max(0, mClipRect.bottom));
if (!mLastClipBounds.equals(mClipBounds)) {
mSourceView.setClipBounds(mClipBounds);
+ // TODO, If both clip and alpha change in the same frame, only invalidate once
mSourceView.invalidateOutline();
mLastClipBounds.set(mClipBounds);
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/FreeformWorkspaceLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/FreeformWorkspaceLayoutAlgorithm.java
index d3a1e91..491c4c2 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/FreeformWorkspaceLayoutAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/FreeformWorkspaceLayoutAlgorithm.java
@@ -48,7 +48,6 @@
public void update(List<Task> freeformTasks, TaskStackLayoutAlgorithm stackLayout) {
Collections.reverse(freeformTasks);
mTaskRectMap.clear();
- mTaskRectMap.ensureCapacity(freeformTasks.size());
int numFreeformTasks = stackLayout.mNumFreeformTasks;
if (!freeformTasks.isEmpty()) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index 1a2f64e..e727652 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -59,6 +59,7 @@
import com.android.systemui.recents.events.ui.dragndrop.DragStartEvent;
import com.android.systemui.recents.misc.ReferenceCountedTrigger;
import com.android.systemui.recents.misc.SystemServicesProxy;
+import com.android.systemui.recents.misc.Utilities;
import com.android.systemui.recents.model.Task;
import com.android.systemui.recents.model.TaskStack;
import com.android.systemui.stackdivider.WindowManagerProxy;
@@ -66,7 +67,6 @@
import com.android.systemui.statusbar.phone.PhoneStatusBar;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
@@ -665,10 +665,8 @@
private void updateVisibleDockRegions(TaskStack.DockState[] newDockStates,
boolean isDefaultDockState, int overrideAlpha, boolean animateAlpha,
boolean animateBounds) {
- ArraySet<TaskStack.DockState> newDockStatesSet = new ArraySet<>();
- if (newDockStates != null) {
- Collections.addAll(newDockStatesSet, newDockStates);
- }
+ ArraySet<TaskStack.DockState> newDockStatesSet = Utilities.arrayToSet(newDockStates,
+ new ArraySet<TaskStack.DockState>());
ArrayList<TaskStack.DockState> visDockStates = mTouchHandler.getVisibleDockStates();
for (int i = visDockStates.size() - 1; i >= 0; i--) {
TaskStack.DockState dockState = visDockStates.get(i);
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 2fa99ce..68ff63c 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java
@@ -408,7 +408,6 @@
// Put each of the tasks in the progress map at a fixed index (does not need to actually
// map to a scroll position, just by index)
int taskCount = stackTasks.size();
- mTaskIndexMap.ensureCapacity(taskCount);
for (int i = 0; i < taskCount; i++) {
Task task = stackTasks.get(i);
mTaskIndexMap.put(task.key, i);
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 713cfc3..7583a19 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -357,15 +357,7 @@
int backMostVisibleIndex = -1;
// We can reuse the task transforms where possible to reduce object allocation
- if (taskTransformCount < taskCount) {
- // If there are less transforms than tasks, then add as many transforms as necessary
- for (int i = taskTransformCount; i < taskCount; i++) {
- taskTransforms.add(new TaskViewTransform());
- }
- } else if (taskTransformCount > taskCount) {
- // If there are more transforms than tasks, then just subset the transform list
- taskTransforms.subList(0, taskCount);
- }
+ Utilities.matchTaskListSize(tasks, taskTransforms);
// Update the stack transforms
TaskViewTransform frontTransform = null;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
index a0bb0ef..4813c19 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
@@ -16,11 +16,11 @@
package com.android.systemui.recents.views;
+import android.animation.Animator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Rect;
-import android.util.DisplayMetrics;
import android.util.Log;
import android.view.InputDevice;
import android.view.MotionEvent;
@@ -95,6 +95,11 @@
protected float getSize(View v) {
return mSv.getWidth();
}
+
+ @Override
+ protected void updateSnapBackAnimation(Animator anim) {
+ anim.setInterpolator(mSv.mFastOutSlowInInterpolator);
+ }
};
mSwipeHelper.setDisableHardwareLayers(true);
}
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 db4db63..9b72702 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
@@ -260,17 +260,23 @@
if (Float.compare(getTaskProgress(), toTransform.p) != 0) {
setTaskProgress(toTransform.p);
}
+ // Manually call back to the animator listener and update callback
if (toAnimation.listener != null) {
toAnimation.listener.onAnimationEnd(null);
}
+ if (updateCallback != null) {
+ updateCallback.onAnimationUpdate(null);
+ }
} else {
if (Float.compare(getTaskProgress(), toTransform.p) != 0) {
mTmpAnimators.add(ObjectAnimator.ofFloat(this, TASK_PROGRESS, getTaskProgress(),
toTransform.p));
}
- ValueAnimator updateCallbackAnim = ValueAnimator.ofInt(0, 1);
- updateCallbackAnim.addUpdateListener(updateCallback);
- mTmpAnimators.add(updateCallbackAnim);
+ if (updateCallback != null) {
+ ValueAnimator updateCallbackAnim = ValueAnimator.ofInt(0, 1);
+ updateCallbackAnim.addUpdateListener(updateCallback);
+ mTmpAnimators.add(updateCallbackAnim);
+ }
// Create the animator
mTransformAnimation = toAnimation.createAnimator(mTmpAnimators);