16ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann/* 26ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * Copyright (C) 2011 The Android Open Source Project 36ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * 46ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * Licensed under the Apache License, Version 2.0 (the "License"); 56ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * you may not use this file except in compliance with the License. 66ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * You may obtain a copy of the License at 76ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * 86ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * http://www.apache.org/licenses/LICENSE-2.0 96ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * 106ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * Unless required by applicable law or agreed to in writing, software 116ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * distributed under the License is distributed on an "AS IS" BASIS, 126ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * See the License for the specific language governing permissions and 146ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * limitations under the License. 156ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann */ 166ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 176ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmannpackage com.android.contacts.calllog; 186ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 196ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmannimport android.content.Context; 206ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmannimport android.graphics.Canvas; 216ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmannimport android.graphics.drawable.Drawable; 226ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmannimport android.provider.CallLog.Calls; 236ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmannimport android.util.AttributeSet; 246ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmannimport android.view.View; 256ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 26e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.R; 27e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.test.NeededForTesting; 28e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.google.common.collect.Lists; 29e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 306ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmannimport java.util.List; 316ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 326ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann/** 336ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * View that draws one or more symbols for different types of calls (missed calls, outgoing etc). 346ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * The symbols are set up horizontally. As this view doesn't create subviews, it is better suited 356ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann * for ListView-recycling that a regular LinearLayout using ImageViews. 366ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann */ 376ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmannpublic class CallTypeIconsView extends View { 386ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann private List<Integer> mCallTypes = Lists.newArrayListWithCapacity(3); 396ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann private Resources mResources; 406ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann private int mWidth; 416ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann private int mHeight; 426ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 436ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann public CallTypeIconsView(Context context) { 446ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann this(context, null); 456ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann } 466ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 476ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann public CallTypeIconsView(Context context, AttributeSet attrs) { 486ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann super(context, attrs); 496ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann mResources = new Resources(context); 506ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann } 516ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 526ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann public void clear() { 536ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann mCallTypes.clear(); 546ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann mWidth = 0; 556ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann mHeight = 0; 566ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann invalidate(); 576ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann } 586ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 596ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann public void add(int callType) { 606ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann mCallTypes.add(callType); 616ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 626ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann final Drawable drawable = getCallTypeDrawable(callType); 636ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann mWidth += drawable.getIntrinsicWidth() + mResources.iconMargin; 646ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann mHeight = Math.max(mHeight, drawable.getIntrinsicHeight()); 656ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann invalidate(); 666ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann } 676ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 68155c0708cc28642836360b820833e22217130f0cFlavio Lerda @NeededForTesting 696ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann public int getCount() { 706ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann return mCallTypes.size(); 716ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann } 726ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 73155c0708cc28642836360b820833e22217130f0cFlavio Lerda @NeededForTesting 746ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann public int getCallType(int index) { 756ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann return mCallTypes.get(index); 766ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann } 776ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 786ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann private Drawable getCallTypeDrawable(int callType) { 796ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann switch (callType) { 806ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann case Calls.INCOMING_TYPE: 816ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann return mResources.incoming; 826ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann case Calls.OUTGOING_TYPE: 836ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann return mResources.outgoing; 846ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann case Calls.MISSED_TYPE: 856ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann return mResources.missed; 866ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann case Calls.VOICEMAIL_TYPE: 876ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann return mResources.voicemail; 886ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann default: 896ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann throw new IllegalArgumentException("invalid call type: " + callType); 906ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann } 916ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann } 926ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 936ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann @Override 946ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 956ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann setMeasuredDimension(mWidth, mHeight); 966ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann } 976ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 986ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann @Override 996ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann protected void onDraw(Canvas canvas) { 1006ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann int left = 0; 1016ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann for (Integer callType : mCallTypes) { 1026ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann final Drawable drawable = getCallTypeDrawable(callType); 1036ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann final int right = left + drawable.getIntrinsicWidth(); 1046ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann drawable.setBounds(left, 0, right, drawable.getIntrinsicHeight()); 1056ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann drawable.draw(canvas); 1066ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann left = right + mResources.iconMargin; 1076ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann } 1086ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann } 1096ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 1106ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann private static class Resources { 1116ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann public final Drawable incoming; 1126ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann public final Drawable outgoing; 1136ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann public final Drawable missed; 1146ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann public final Drawable voicemail; 1156ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann public final int iconMargin; 1166ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann 1176ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann public Resources(Context context) { 1186ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann final android.content.res.Resources r = context.getResources(); 1196ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann incoming = r.getDrawable(R.drawable.ic_call_incoming_holo_dark); 1206ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann outgoing = r.getDrawable(R.drawable.ic_call_outgoing_holo_dark); 1216ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann missed = r.getDrawable(R.drawable.ic_call_missed_holo_dark); 1226ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann voicemail = r.getDrawable(R.drawable.ic_call_voicemail_holo_dark); 1236ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann iconMargin = r.getDimensionPixelSize(R.dimen.call_log_icon_margin); 1246ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann } 1256ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann } 1266ecb732e22b271878d5f9215b7c821a1d97d888fDaniel Lehmann} 127