blob: a45b74698a4a6e6c1c0c73f4a3891497ea998292 [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éraud0c9bd8f2013-05-30 16:16:57 +100027 private float density = 1.f;
Adrien Béraude0ef0c22013-05-18 01:56:27 +100028 public PointF speed = new PointF(0, 0);
29 public PointF last_speed = new PointF();
Adrien Béraud25fc4092013-05-06 15:28:39 +100030 public PointF attractor = null;
alisionfe9cf712013-05-03 17:26:08 -040031
Adrien Béraude0ef0c22013-05-18 01:56:27 +100032 public boolean dragged = false;
33 public long last_drag;
alision4a0eb092013-05-07 13:52:03 -040034
Adrien Béraude0ef0c22013-05-18 01:56:27 +100035
36 public void setAttractor(PointF attractor) {
37 this.attractor = attractor;
38 }
39
Adrien Béraudc9c424d2013-05-30 17:47:35 +100040 public Bubble(float x, float y, float size, Bitmap photo) {
41 internalBMP = Bitmap.createScaledBitmap(photo, (int) size, (int) size, false);
Adrien Béraud04463092013-05-06 14:17:22 +100042 int w = internalBMP.getWidth(), h = internalBMP.getHeight();
alisionfe9cf712013-05-03 17:26:08 -040043
Adrien Béraudc9c424d2013-05-30 17:47:35 +100044 pos.set(x, y);
45 radius = w / 2;
46 bounds = new RectF(pos.x - radius, pos.y - radius, pos.x + radius, pos.y + radius);
47 attractor = new PointF(x, y);
alisionfe9cf712013-05-03 17:26:08 -040048
Adrien Béraud25fc4092013-05-06 15:28:39 +100049 Path path = new Path();
Adrien Béraud04463092013-05-06 14:17:22 +100050 path.addCircle(radius, radius, radius, Path.Direction.CW);
alisionfe9cf712013-05-03 17:26:08 -040051
Adrien Béraudc9c424d2013-05-30 17:47:35 +100052 Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
53 circlePaint.setStyle(Paint.Style.FILL);
Adrien Béraud04463092013-05-06 14:17:22 +100054 Bitmap circle = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
55 Canvas circle_drawer = new Canvas(circle);
Adrien Béraudc9c424d2013-05-30 17:47:35 +100056 circle_drawer.drawOval(new RectF(0, 0, w, h), circlePaint);
alisionfe9cf712013-05-03 17:26:08 -040057
Adrien Béraudc9c424d2013-05-30 17:47:35 +100058 externalBMP = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
59 Canvas canvas = new Canvas(externalBMP);
Adrien Béraud25fc4092013-05-06 15:28:39 +100060
Adrien Béraudc9c424d2013-05-30 17:47:35 +100061 circlePaint.setFilterBitmap(false);
62 canvas.drawBitmap(internalBMP, 0, 0, circlePaint);
63
64 circlePaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
65 canvas.drawBitmap(circle, 0, 0, circlePaint);
Adrien Béraud04463092013-05-06 14:17:22 +100066 }
alisionfe9cf712013-05-03 17:26:08 -040067
Adrien Béraud0c9bd8f2013-05-30 16:16:57 +100068 public Bubble(float x, float y, float rad, Context c, int resID) {
Adrien Béraud33268882013-05-18 03:41:15 +100069 // Initialize the bitmap object by loading an image from the resources folder
Adrien Béraud0c9bd8f2013-05-30 16:16:57 +100070 this(x, y, rad, BitmapFactory.decodeResource(c.getResources(), resID==-1 ? resID : R.drawable.ic_contact_picture));
Adrien Béraud33268882013-05-18 03:41:15 +100071 }
72
Adrien Béraud25fc4092013-05-06 15:28:39 +100073 public Bitmap getBitmap() {
74 return externalBMP;
75 }
76
77 public RectF getBounds() {
78 return bounds;
79 }
80
Adrien Béraud6bbce912013-05-24 00:48:13 +100081 public void set(float x, float y, float s) {
82 scale = s;
83 pos.x = x;
84 pos.y = y;
Adrien Béraud0c9bd8f2013-05-30 16:16:57 +100085 float rad = scale*radius*density;
Adrien Béraudc9c424d2013-05-30 17:47:35 +100086 bounds.set(pos.x-rad, pos.y-rad, pos.x+rad, pos.y+rad);
Adrien Béraud6bbce912013-05-24 00:48:13 +100087 }
88
Adrien Béraud04463092013-05-06 14:17:22 +100089 public float getPosX() {
Adrien Béraud25fc4092013-05-06 15:28:39 +100090 return pos.x;
Adrien Béraud04463092013-05-06 14:17:22 +100091 }
alisionfe9cf712013-05-03 17:26:08 -040092
Adrien Béraud04463092013-05-06 14:17:22 +100093 public float getPosY() {
Adrien Béraud25fc4092013-05-06 15:28:39 +100094 return pos.y;
95 }
96
97 public void setPos(float x, float y) {
Adrien Béraud6bbce912013-05-24 00:48:13 +100098 set(x, y, scale);
Adrien Béraud04463092013-05-06 14:17:22 +100099 }
Adrien Béraud25fc4092013-05-06 15:28:39 +1000100
101 public PointF getPos()
102 {
103 return pos;
104 }
105
Adrien Béraud6bbce912013-05-24 00:48:13 +1000106 public float getScale() {
107 return scale;
108 }
109
110 public void setScale(float s) {
111 set(pos.x, pos.y, s);
112 }
113
114 public float getRadius() {
115 return radius;
116 }
117
Adrien Béraud25fc4092013-05-06 15:28:39 +1000118 /**
119 * Point intersection test.
120 */
121 boolean intersects(float x, float y) {
122 float dx = x-pos.x, dy = y-pos.y;
123 return dx*dx + dy*dy < radius*radius;
124 }
125
126 /**
127 * Other circle intersection test.
128 */
129 boolean intersects(float x, float y, float radius) {
130 float dx = x-pos.x, dy = y-pos.y;
131 float tot_radius = this.radius + radius;
132 return dx*dx + dy*dy < tot_radius*tot_radius;
133 }
Adrien Béraud0c9bd8f2013-05-30 16:16:57 +1000134
135 public void setDensity(float density)
136 {
137 this.density = density;
138 }
alisionfe9cf712013-05-03 17:26:08 -0400139}