summaryrefslogtreecommitdiff
path: root/src/com
diff options
context:
space:
mode:
authorSailesh Nepal <sail@google.com>2016-04-13 15:01:39 -0700
committerUsman Abdullah <uabdullah@google.com>2016-04-20 18:32:47 +0000
commit4ceb430d354d76f18b293faf87a92854e26a94b8 (patch)
treeed94f602f61a698506ead57b6a2ebee70a5fa198 /src/com
parentd0db4f8941e13766b78c90432b92b4eaccf71e2c (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)
Diffstat (limited to 'src/com')
-rw-r--r--src/com/android/dialer/calllog/CallTypeIconsView.java33
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);
}
}