From 4ceb430d354d76f18b293faf87a92854e26a94b8 Mon Sep 17 00:00:00 2001 From: Sailesh Nepal Date: Wed, 13 Apr 2016 15:01:39 -0700 Subject: 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) --- .../android/dialer/calllog/CallTypeIconsView.java | 33 ++++++++++++---------- 1 file 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 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); } } -- cgit v1.2.3