blob: 0dbd013a909f0374e788b5c71cee1d0585fff6fc [file] [log] [blame]
alisionfe9cf712013-05-03 17:26:08 -04001package com.savoirfairelinux.sflphone.model;
2
3import android.content.Context;
4import android.graphics.Bitmap;
5import android.graphics.BitmapFactory;
6import android.graphics.Canvas;
7import android.graphics.Paint;
8import android.graphics.Path;
Adrien Béraud25fc4092013-05-06 15:28:39 +10009import android.graphics.PointF;
alisionfe9cf712013-05-03 17:26:08 -040010import android.graphics.PorterDuff.Mode;
11import android.graphics.PorterDuffXfermode;
12import android.graphics.RectF;
alisionfe9cf712013-05-03 17:26:08 -040013
14import com.savoirfairelinux.sflphone.R;
15
Adrien Béraud04463092013-05-06 14:17:22 +100016public class Bubble
17{
Adrien Béraud6bbce912013-05-24 00:48:13 +100018 public CallContact contact;
Adrien Béraud04463092013-05-06 14:17:22 +100019 // A Bitmap object that is going to be passed to the BitmapShader
20 private Bitmap internalBMP, externalBMP;
alisionfe9cf712013-05-03 17:26:08 -040021
Adrien Béraud25fc4092013-05-06 15:28:39 +100022 private PointF pos = new PointF();
Adrien Béraud04463092013-05-06 14:17:22 +100023 private RectF bounds;
Adrien Béraud6bbce912013-05-24 00:48:13 +100024 public float target_scale = 1.f;
25 private final float radius;
26 private float scale = 1.f;
Adrien Béraude0ef0c22013-05-18 01:56:27 +100027 public PointF speed = new PointF(0, 0);
28 public PointF last_speed = new PointF();
Adrien Béraud25fc4092013-05-06 15:28:39 +100029 public PointF attractor = null;
alisionfe9cf712013-05-03 17:26:08 -040030
Adrien Béraude0ef0c22013-05-18 01:56:27 +100031 public boolean dragged = false;
32 public long last_drag;
alision4a0eb092013-05-07 13:52:03 -040033
Adrien Béraude0ef0c22013-05-18 01:56:27 +100034
35 public void setAttractor(PointF attractor) {
36 this.attractor = attractor;
37 }
38
Adrien Béraud33268882013-05-18 03:41:15 +100039 public Bubble(Context c, float x, float y, float rad, Bitmap photo) {
40 internalBMP = photo;
Adrien Béraude0ef0c22013-05-18 01:56:27 +100041 pos.set(x, y);
alisionfe9cf712013-05-03 17:26:08 -040042
Adrien Béraud04463092013-05-06 14:17:22 +100043 internalBMP = Bitmap.createScaledBitmap(internalBMP, (int) rad, (int) rad, false);
44 int w = internalBMP.getWidth(), h = internalBMP.getHeight();
alisionfe9cf712013-05-03 17:26:08 -040045
Adrien Béraud04463092013-05-06 14:17:22 +100046 externalBMP = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
alisionfe9cf712013-05-03 17:26:08 -040047
Adrien Béraud04463092013-05-06 14:17:22 +100048 radius = externalBMP.getWidth() / 2;
Adrien Béraud25fc4092013-05-06 15:28:39 +100049 Path path = new Path();
alisionfe9cf712013-05-03 17:26:08 -040050
Adrien Béraud04463092013-05-06 14:17:22 +100051 path.addCircle(radius, radius, radius, Path.Direction.CW);
alisionfe9cf712013-05-03 17:26:08 -040052
Adrien Béraud25fc4092013-05-06 15:28:39 +100053 bounds = new RectF(pos.x - radius, pos.y - radius, pos.x + radius, pos.y + radius);
alisionfe9cf712013-05-03 17:26:08 -040054
Adrien Béraud25fc4092013-05-06 15:28:39 +100055 Paint mPaintPath = new Paint(Paint.ANTI_ALIAS_FLAG);
Adrien Béraud04463092013-05-06 14:17:22 +100056 mPaintPath.setStyle(Paint.Style.FILL);
57 mPaintPath.setAntiAlias(true);
58 Bitmap circle = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
59 Canvas circle_drawer = new Canvas(circle);
60 circle_drawer.drawOval(new RectF(0, 0, w, h), mPaintPath);
alisionfe9cf712013-05-03 17:26:08 -040061
Adrien Béraude0ef0c22013-05-18 01:56:27 +100062 attractor = new PointF(x, y);
Adrien Béraud04463092013-05-06 14:17:22 +100063 mPaintPath.setFilterBitmap(false);
Adrien Béraud25fc4092013-05-06 15:28:39 +100064
65 Canvas internalCanvas = new Canvas(externalBMP);
Adrien Béraud04463092013-05-06 14:17:22 +100066 internalCanvas.drawBitmap(internalBMP, 0, 0, mPaintPath);
67 mPaintPath.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
68 internalCanvas.drawBitmap(circle, 0, 0, mPaintPath);
69 }
alisionfe9cf712013-05-03 17:26:08 -040070
Adrien Béraud33268882013-05-18 03:41:15 +100071 public Bubble(Context c, float x, float y, float rad, int resID) {
72 // Initialize the bitmap object by loading an image from the resources folder
73 /*if (resID != -1)
74 internalBMP = BitmapFactory.decodeResource(c.getResources(), resID);
75 else
76 internalBMP = BitmapFactory.decodeResource(c.getResources(), R.drawable.ic_contact_picture);
77 */
78 this(c, x, y, rad, BitmapFactory.decodeResource(c.getResources(), resID==-1 ? resID : R.drawable.ic_contact_picture));
79 }
80
81
82
Adrien Béraud25fc4092013-05-06 15:28:39 +100083 public Bitmap getBitmap() {
84 return externalBMP;
85 }
86
87 public RectF getBounds() {
88 return bounds;
89 }
90
Adrien Béraud6bbce912013-05-24 00:48:13 +100091 public void set(float x, float y, float s) {
92 scale = s;
93 pos.x = x;
94 pos.y = y;
95 float rad = scale*radius;
96 bounds.left = pos.x - rad;
97 bounds.right = pos.x + rad;
98 bounds.top = pos.y - rad;
99 bounds.bottom = pos.y + rad;
100 }
101
Adrien Béraud04463092013-05-06 14:17:22 +1000102 public float getPosX() {
Adrien Béraud25fc4092013-05-06 15:28:39 +1000103 return pos.x;
Adrien Béraud04463092013-05-06 14:17:22 +1000104 }
alisionfe9cf712013-05-03 17:26:08 -0400105
Adrien Béraud04463092013-05-06 14:17:22 +1000106 public float getPosY() {
Adrien Béraud25fc4092013-05-06 15:28:39 +1000107 return pos.y;
108 }
109
110 public void setPos(float x, float y) {
Adrien Béraud6bbce912013-05-24 00:48:13 +1000111 set(x, y, scale);
Adrien Béraud04463092013-05-06 14:17:22 +1000112 }
Adrien Béraud25fc4092013-05-06 15:28:39 +1000113
114 public PointF getPos()
115 {
116 return pos;
117 }
118
Adrien Béraud6bbce912013-05-24 00:48:13 +1000119 public float getScale() {
120 return scale;
121 }
122
123 public void setScale(float s) {
124 set(pos.x, pos.y, s);
125 }
126
127 public float getRadius() {
128 return radius;
129 }
130
Adrien Béraud25fc4092013-05-06 15:28:39 +1000131 /**
132 * Point intersection test.
133 */
134 boolean intersects(float x, float y) {
135 float dx = x-pos.x, dy = y-pos.y;
136 return dx*dx + dy*dy < radius*radius;
137 }
138
139 /**
140 * Other circle intersection test.
141 */
142 boolean intersects(float x, float y, float radius) {
143 float dx = x-pos.x, dy = y-pos.y;
144 float tot_radius = this.radius + radius;
145 return dx*dx + dy*dy < tot_radius*tot_radius;
146 }
alisionfe9cf712013-05-03 17:26:08 -0400147}