Remove unnecessary framework allocations
These allocations were frequently triggered by the home screen. This change
removes dozens of allocations during page scrolls on home.
Change-Id: I7289efa28ecf5bd62459042b10062aa9cf0432dd
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index d1d036c..0837cf4 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -9187,7 +9187,7 @@
}
public final boolean getLocalVisibleRect(Rect r) {
- Point offset = new Point();
+ final Point offset = mAttachInfo != null ? mAttachInfo.mPoint : new Point();
if (getGlobalVisibleRect(r, offset)) {
r.offset(-offset.x, -offset.y); // make r local
return true;
@@ -17007,6 +17007,11 @@
final boolean mDebugLayout = SystemProperties.getBoolean(DEBUG_LAYOUT_PROPERTY, false);
/**
+ * Point used to compute visible regions.
+ */
+ final Point mPoint = new Point();
+
+ /**
* Creates a new set of attachment information with the specified
* events handler and thread.
*
diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java
index eb8d0ac..f3f18d5 100644
--- a/core/java/android/widget/ProgressBar.java
+++ b/core/java/android/widget/ProgressBar.java
@@ -211,6 +211,7 @@
private boolean mOnlyIndeterminate;
private Transformation mTransformation;
private AlphaAnimation mAnimation;
+ private boolean mHasAnimation;
private Drawable mIndeterminateDrawable;
private Drawable mProgressDrawable;
private Drawable mCurrentDrawable;
@@ -670,18 +671,14 @@
if (mUiThreadId == Thread.currentThread().getId()) {
doRefreshProgress(id, progress, fromUser, true);
} else {
- RefreshProgressRunnable r;
- if (mRefreshProgressRunnable != null) {
- // Use cached RefreshProgressRunnable if available
- r = mRefreshProgressRunnable;
- } else {
- // Make a new one
- r = new RefreshProgressRunnable();
+ if (mRefreshProgressRunnable == null) {
+ mRefreshProgressRunnable = new RefreshProgressRunnable();
}
+
final RefreshData rd = RefreshData.obtain(id, progress, fromUser);
mRefreshData.add(rd);
if (mAttached && !mRefreshIsPosted) {
- post(r);
+ post(mRefreshProgressRunnable);
mRefreshIsPosted = true;
}
}
@@ -860,14 +857,26 @@
if (mIndeterminateDrawable instanceof Animatable) {
mShouldStartAnimationDrawable = true;
- mAnimation = null;
+ mHasAnimation = false;
} else {
+ mHasAnimation = true;
+
if (mInterpolator == null) {
mInterpolator = new LinearInterpolator();
}
- mTransformation = new Transformation();
- mAnimation = new AlphaAnimation(0.0f, 1.0f);
+ if (mTransformation == null) {
+ mTransformation = new Transformation();
+ } else {
+ mTransformation.clear();
+ }
+
+ if (mAnimation == null) {
+ mAnimation = new AlphaAnimation(0.0f, 1.0f);
+ } else {
+ mAnimation.reset();
+ }
+
mAnimation.setRepeatMode(mBehavior);
mAnimation.setRepeatCount(Animation.INFINITE);
mAnimation.setDuration(mDuration);
@@ -881,8 +890,7 @@
* <p>Stop the indeterminate progress animation.</p>
*/
void stopAnimation() {
- mAnimation = null;
- mTransformation = null;
+ mHasAnimation = false;
if (mIndeterminateDrawable instanceof Animatable) {
((Animatable) mIndeterminateDrawable).stop();
mShouldStartAnimationDrawable = false;
@@ -1030,7 +1038,7 @@
canvas.save();
canvas.translate(mPaddingLeft, mPaddingTop);
long time = getDrawingTime();
- if (mAnimation != null) {
+ if (mHasAnimation) {
mAnimation.getTransformation(time, mTransformation);
float scale = mTransformation.getAlpha();
try {