126b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru/*
226b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru * Copyright (C) 2011 The Android Open Source Project
326b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru *
426b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru * Licensed under the Apache License, Version 2.0 (the "License");
526b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru * you may not use this file except in compliance with the License.
626b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru * You may obtain a copy of the License at
726b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru *
826b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru *      http://www.apache.org/licenses/LICENSE-2.0
926b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru *
1026b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software
1126b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru * distributed under the License is distributed on an "AS IS" BASIS,
1226b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1326b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru * See the License for the specific language governing permissions and
1426b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru * limitations under the License.
1526b9d70ba7ab0dd1f99b3e86acae93444f4ee57dJean-Baptiste Queru */
1610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
1710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylorpackage com.android.mms.ui;
1810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
1910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylorimport android.content.Context;
2010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylorimport android.content.res.Resources;
2110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylorimport android.graphics.Canvas;
2210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylorimport android.graphics.drawable.Drawable;
2310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylorimport android.util.AttributeSet;
2410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylorimport android.widget.ImageView;
2510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylorimport android.widget.QuickContactBadge;
2610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
2710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylorimport com.android.mms.R;
2810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
2910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylorpublic class QuickContactDivot extends QuickContactBadge implements Divot{
3010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    private Drawable mDrawable;
3110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    private int mDrawableIntrinsicWidth;
3210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    private int mDrawableIntrinsicHeight;
3310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    private int mPosition;
3410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
3510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    // The screen density.  Multiple this by dips to get pixels.
3610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    private float mDensity;
3710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
3810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    public QuickContactDivot(Context context, AttributeSet attrs, int defStyle) {
3910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        super(context, attrs, defStyle);
4010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        initialize(attrs);
4110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    }
4210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
4310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    public QuickContactDivot(Context context, AttributeSet attrs) {
4410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        super(context, attrs);
4510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        initialize(attrs);
4610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    }
4710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
4810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    public QuickContactDivot(Context context) {
4910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        super(context);
5010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        initialize(null);
5110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    }
5210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
5310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    private void initialize(AttributeSet attrs) {
5410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        if (attrs != null) {
5510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor            mPosition = attrs.getAttributeListValue(null, "position", sPositionChoices, -1);
5610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        }
5710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
5810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        Resources r = getContext().getResources();
5910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        mDensity = r.getDisplayMetrics().density;
6010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
6110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        setDrawable();
6210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    }
6310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
6410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    private void setDrawable() {
6510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        Resources r = getContext().getResources();
6610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
6710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        switch (mPosition) {
6810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor            case LEFT_UPPER:
6910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor            case LEFT_MIDDLE:
7010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor            case LEFT_LOWER:
7110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                mDrawable = r.getDrawable(R.drawable.msg_bubble_right);
7210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                break;
7310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
7410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor            case RIGHT_UPPER:
7510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor            case RIGHT_MIDDLE:
7610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor            case RIGHT_LOWER:
7710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                mDrawable = r.getDrawable(R.drawable.msg_bubble_left);
7810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                break;
7910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
8010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor//            case TOP_LEFT:
8110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor//            case TOP_MIDDLE:
8210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor//            case TOP_RIGHT:
8310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor//                mDrawable = r.getDrawable(R.drawable.msg_bubble_bottom);
8410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor//                break;
8510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor//
8610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor//            case BOTTOM_LEFT:
8710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor//            case BOTTOM_MIDDLE:
8810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor//            case BOTTOM_RIGHT:
8910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor//                mDrawable = r.getDrawable(R.drawable.msg_bubble_top);
9010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor//                break;
9110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        }
9210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        mDrawableIntrinsicWidth = mDrawable.getIntrinsicWidth();
9310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        mDrawableIntrinsicHeight = mDrawable.getIntrinsicHeight();
9410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    }
9510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
9610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    @Override
9710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    public void onDraw(Canvas c) {
9810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        super.onDraw(c);
9910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        c.save();
10010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        computeBounds(c);
10110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        mDrawable.draw(c);
10210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        c.restore();
10310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    }
10410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
10510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    public void setPosition(int position) {
10610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        mPosition = position;
10710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        setDrawable();
10810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        invalidate();
10910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    }
11010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
11110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    public int getPosition() {
11210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        return mPosition;
11310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    }
11410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
11510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    public float getCloseOffset() {
11610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        return CORNER_OFFSET * mDensity;  // multiply by density to get pixels
11710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    }
11810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
11910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    public ImageView asImageView() {
12010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        return this;
12110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    }
12210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
12310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    public void assignContactFromEmail(String emailAddress) {
12410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        assignContactFromEmail(emailAddress, true);
12510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    }
12610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
12710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    public float getFarOffset() {
12810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        return getCloseOffset() + mDrawableIntrinsicHeight;
12910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    }
13010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
13110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    private void computeBounds(Canvas c) {
13210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        final int left = 0;
13310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        final int top = 0;
13410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        final int right = getWidth();
13510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        final int middle = right / 2;
13610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        final int bottom = getHeight();
13710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
13810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        final int cornerOffset = (int) getCloseOffset();
13910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
14010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        switch (mPosition) {
14110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor            case RIGHT_UPPER:
14210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                mDrawable.setBounds(
14310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                        right - mDrawableIntrinsicWidth,
14410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                        top + cornerOffset,
14510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                        right,
14610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                        top + cornerOffset + mDrawableIntrinsicHeight);
14710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                break;
14810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
14910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor            case LEFT_UPPER:
15010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                mDrawable.setBounds(
15110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                        left,
15210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                        top + cornerOffset,
15310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                        left + mDrawableIntrinsicWidth,
15410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                        top + cornerOffset + mDrawableIntrinsicHeight);
15510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                break;
15610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
15710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor            case BOTTOM_MIDDLE:
15810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                int halfWidth = mDrawableIntrinsicWidth / 2;
15910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                mDrawable.setBounds(
16010ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                        (int)(middle - halfWidth),
16110ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                        (int)(bottom - mDrawableIntrinsicHeight),
16210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                        (int)(middle + halfWidth),
16310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                        (int)(bottom));
16410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
16510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor                break;
16610ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor        }
16710ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor    }
16810ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor
16910ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor}
170