diff options
author | Sailesh Nepal <sail@google.com> | 2016-04-13 15:01:39 -0700 |
---|---|---|
committer | Usman Abdullah <uabdullah@google.com> | 2016-04-20 18:32:47 +0000 |
commit | 4ceb430d354d76f18b293faf87a92854e26a94b8 (patch) | |
tree | ed94f602f61a698506ead57b6a2ebee70a5fa198 | |
parent | d0db4f8941e13766b78c90432b92b4eaccf71e2c (diff) |
Cache call type icons
Looking at the trace attached to b/28142787 it looks like
CallTypeIconsView.Resources is created frequently. In my local testing
with 9 items in my call log, it was created 23 times on load and 3 more
times on scroll.
According to the trace, creating a Resources object can be expensive.
In one frame decodeBitmap was called 3 times and took 1.4 milliseconds.
This CL works around the issue by caching the Resources object. This
should be ok. The only downside of this is:
- the cache won't be updated if the DPI variant changes
- the cache won't be released if we get a memory pressure event
Bug: 28142787
Change-Id: Ibc2ef02f7c92022deabedd70b1af135a10c9df29
(cherry picked from commit 341185547f9d54566055b270f69f1b93f0301c36)
-rw-r--r-- | src/com/android/dialer/calllog/CallTypeIconsView.java | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/src/com/android/dialer/calllog/CallTypeIconsView.java b/src/com/android/dialer/calllog/CallTypeIconsView.java index cfd8f9748..14748433c 100644 --- a/src/com/android/dialer/calllog/CallTypeIconsView.java +++ b/src/com/android/dialer/calllog/CallTypeIconsView.java @@ -42,17 +42,20 @@ import java.util.List; public class CallTypeIconsView extends View { private List<Integer> mCallTypes = Lists.newArrayListWithCapacity(3); private boolean mShowVideo = false; - private Resources mResources; private int mWidth; private int mHeight; + private static Resources sResources; + public CallTypeIconsView(Context context) { this(context, null); } public CallTypeIconsView(Context context, AttributeSet attrs) { super(context, attrs); - mResources = new Resources(context); + if (sResources == null) { + sResources = new Resources(context); + } } public void clear() { @@ -66,7 +69,7 @@ public class CallTypeIconsView extends View { mCallTypes.add(callType); final Drawable drawable = getCallTypeDrawable(callType); - mWidth += drawable.getIntrinsicWidth() + mResources.iconMargin; + mWidth += drawable.getIntrinsicWidth() + sResources.iconMargin; mHeight = Math.max(mHeight, drawable.getIntrinsicHeight()); invalidate(); } @@ -79,8 +82,8 @@ public class CallTypeIconsView extends View { public void setShowVideo(boolean showVideo) { mShowVideo = showVideo; if (showVideo) { - mWidth += mResources.videoCall.getIntrinsicWidth(); - mHeight = Math.max(mHeight, mResources.videoCall.getIntrinsicHeight()); + mWidth += sResources.videoCall.getIntrinsicWidth(); + mHeight = Math.max(mHeight, sResources.videoCall.getIntrinsicHeight()); invalidate(); } } @@ -107,21 +110,21 @@ public class CallTypeIconsView extends View { private Drawable getCallTypeDrawable(int callType) { switch (callType) { case AppCompatConstants.CALLS_INCOMING_TYPE: - return mResources.incoming; + return sResources.incoming; case AppCompatConstants.CALLS_OUTGOING_TYPE: - return mResources.outgoing; + return sResources.outgoing; case AppCompatConstants.CALLS_MISSED_TYPE: - return mResources.missed; + return sResources.missed; case AppCompatConstants.CALLS_VOICEMAIL_TYPE: - return mResources.voicemail; + return sResources.voicemail; case AppCompatConstants.CALLS_BLOCKED_TYPE: - return mResources.blocked; + return sResources.blocked; default: // It is possible for users to end up with calls with unknown call types in their // call history, possibly due to 3rd party call log implementations (e.g. to // distinguish between rejected and missed calls). Instead of crashing, just // assume that all unknown call types are missed calls. - return mResources.missed; + return sResources.missed; } } @@ -138,14 +141,14 @@ public class CallTypeIconsView extends View { final int right = left + drawable.getIntrinsicWidth(); drawable.setBounds(left, 0, right, drawable.getIntrinsicHeight()); drawable.draw(canvas); - left = right + mResources.iconMargin; + left = right + sResources.iconMargin; } // If showing the video call icon, draw it scaled appropriately. if (mShowVideo) { - final Drawable drawable = mResources.videoCall; - final int right = left + mResources.videoCall.getIntrinsicWidth(); - drawable.setBounds(left, 0, right, mResources.videoCall.getIntrinsicHeight()); + final Drawable drawable = sResources.videoCall; + final int right = left + sResources.videoCall.getIntrinsicWidth(); + drawable.setBounds(left, 0, right, sResources.videoCall.getIntrinsicHeight()); drawable.draw(canvas); } } |