blob: 7f64aa85fb963aabddefb78eb42c7aa990ff3cca [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;
11import android.graphics.Matrix;
12import android.graphics.Paint;
13import android.graphics.Path;
14import android.graphics.PorterDuff.Mode;
15import android.graphics.PorterDuffXfermode;
16import android.graphics.RectF;
17import android.net.Uri;
18import android.provider.ContactsContract;
19import android.widget.ImageView;
20
21import com.savoirfairelinux.sflphone.R;
22
23public class ContactPictureLoader implements Runnable {
24 private ImageView view;
25 private long cid;
26 private ContentResolver cr;
27 private final String TAG = ContactPictureLoader.class.getSimpleName();
28
29 public ContactPictureLoader(Context context, ImageView element, long contact_id) {
30 cid = contact_id;
31 cr = context.getContentResolver();
32 view = element;
33 }
34
35 public Bitmap loadContactPhoto(ContentResolver cr, long id) {
36 Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
37 InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
38 if (input == null) {
39 return null;
40 }
41 return BitmapFactory.decodeStream(input);
42 }
43
44 @Override
45 public void run() {
46 Bitmap photo_bmp = loadContactPhoto(cr, cid);
47
48 if (photo_bmp == null) {
49 photo_bmp = BitmapFactory.decodeResource(view.getResources(), R.drawable.ic_contact_picture);
50
51 }
52
53
54 int w = photo_bmp.getWidth(), h = photo_bmp.getHeight();
55
56 final Bitmap externalBMP = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
57
58 int radius = externalBMP.getWidth() / 2;
59 Path path = new Path();
60
61 path.addCircle(radius, radius, radius, Path.Direction.CW);
62 Paint mPaintPath = new Paint(Paint.ANTI_ALIAS_FLAG);
63 mPaintPath.setStyle(Paint.Style.FILL);
64 mPaintPath.setAntiAlias(true);
65 Bitmap circle = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
66 Canvas circle_drawer = new Canvas(circle);
67 circle_drawer.drawOval(new RectF(0, 0, w, h), mPaintPath);
68 mPaintPath.setFilterBitmap(false);
69
70 Canvas internalCanvas = new Canvas(externalBMP);
71 internalCanvas.drawBitmap(photo_bmp, 0, 0, mPaintPath);
72 mPaintPath.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
73 internalCanvas.drawBitmap(circle, 0, 0, mPaintPath);
74
75 view.post(new Runnable() {
76 @Override
77 public void run() {
78 view.setImageBitmap(externalBMP);
79 view.invalidate();
80 }
81 });
82 }
83}