blob: b020e5040fda24b31e85ba00ca5e6de376388a73 [file] [log] [blame]
alisiond295ec22013-05-17 10:12:13 -04001package com.savoirfairelinux.sflphone.adapters;
2
3import java.io.InputStream;
4
5import android.content.ContentResolver;
6import android.content.ContentUris;
7import android.content.Context;
8import android.graphics.Bitmap;
9import android.graphics.BitmapFactory;
10import android.graphics.Canvas;
alisiond295ec22013-05-17 10:12:13 -040011import android.graphics.Paint;
12import android.graphics.Path;
13import android.graphics.PorterDuff.Mode;
14import android.graphics.PorterDuffXfermode;
15import android.graphics.RectF;
16import android.net.Uri;
17import android.provider.ContactsContract;
18import android.widget.ImageView;
19
20import com.savoirfairelinux.sflphone.R;
21
alision84813a12013-05-27 17:40:39 -040022public class ContactPictureLoader implements Runnable {
23 private ImageView view;
24 private long cid;
25 private ContentResolver cr;
26 private final String TAG = ContactPictureLoader.class.getSimpleName();
alisiond295ec22013-05-17 10:12:13 -040027
alision84813a12013-05-27 17:40:39 -040028 public ContactPictureLoader(Context context, ImageView element, long contact_id) {
29 cid = contact_id;
30 cr = context.getContentResolver();
31 view = element;
32 }
alisiond295ec22013-05-17 10:12:13 -040033
alision84813a12013-05-27 17:40:39 -040034 public static Bitmap loadContactPhoto(ContentResolver cr, long id) {
35 Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
36 InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
37 if (input == null) {
38 return null;
39 }
40 return BitmapFactory.decodeStream(input);
41 }
alisiond295ec22013-05-17 10:12:13 -040042
alision84813a12013-05-27 17:40:39 -040043 @Override
44 public void run() {
45 Bitmap photo_bmp = loadContactPhoto(cr, cid);
alisiond295ec22013-05-17 10:12:13 -040046
alision84813a12013-05-27 17:40:39 -040047 if (photo_bmp == null) {
48 photo_bmp = BitmapFactory.decodeResource(view.getResources(), R.drawable.ic_contact_picture);
49 }
alisiond295ec22013-05-17 10:12:13 -040050
alision84813a12013-05-27 17:40:39 -040051 int w = photo_bmp.getWidth(), h = photo_bmp.getHeight();
52 if (w > h) {
53 w = h;
54 } else if (h > w) {
55 h = w;
56 }
alisiond295ec22013-05-17 10:12:13 -040057
alision84813a12013-05-27 17:40:39 -040058 final Bitmap externalBMP = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
alisiond295ec22013-05-17 10:12:13 -040059
alision84813a12013-05-27 17:40:39 -040060 int radius = externalBMP.getWidth() / 2;
61 Path path = new Path();
alisiond295ec22013-05-17 10:12:13 -040062
alision84813a12013-05-27 17:40:39 -040063 path.addCircle(radius, radius, radius, Path.Direction.CW);
64 Paint mPaintPath = new Paint(Paint.ANTI_ALIAS_FLAG);
65 mPaintPath.setStyle(Paint.Style.FILL);
66 mPaintPath.setAntiAlias(true);
67 Bitmap circle = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
68 Canvas circle_drawer = new Canvas(circle);
69 circle_drawer.drawOval(new RectF(0, 0, w, h), mPaintPath);
70 mPaintPath.setFilterBitmap(false);
alisiond295ec22013-05-17 10:12:13 -040071
alision84813a12013-05-27 17:40:39 -040072 Canvas internalCanvas = new Canvas(externalBMP);
73 internalCanvas.drawBitmap(photo_bmp, 0, 0, mPaintPath);
74 mPaintPath.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
75 internalCanvas.drawBitmap(circle, 0, 0, mPaintPath);
alisiond295ec22013-05-17 10:12:13 -040076
alision84813a12013-05-27 17:40:39 -040077 view.post(new Runnable() {
78 @Override
79 public void run() {
80 view.setImageBitmap(externalBMP);
81 view.invalidate();
82 }
83 });
84 }
alisiond295ec22013-05-17 10:12:13 -040085}