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