* #31377: improved drawing quality
diff --git a/src/org/sflphone/adapters/ContactPictureTask.java b/src/org/sflphone/adapters/ContactPictureTask.java
index 42b7cd5..7b57a17 100644
--- a/src/org/sflphone/adapters/ContactPictureTask.java
+++ b/src/org/sflphone/adapters/ContactPictureTask.java
@@ -44,15 +44,10 @@
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.Shader;
import android.net.Uri;
import android.provider.ContactsContract;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class ContactPictureTask implements Runnable {
diff --git a/src/org/sflphone/client/CallActivity.java b/src/org/sflphone/client/CallActivity.java
index 71632c4..195b758 100644
--- a/src/org/sflphone/client/CallActivity.java
+++ b/src/org/sflphone/client/CallActivity.java
@@ -39,6 +39,7 @@
import org.sflphone.fragments.CallFragment;
import org.sflphone.fragments.CallListFragment;
import org.sflphone.interfaces.CallInterface;
+import org.sflphone.model.Account;
import org.sflphone.model.CallContact;
import org.sflphone.model.Conference;
import org.sflphone.model.SipCall;
@@ -214,7 +215,7 @@
try {
service.destroyNotification();
SipCall call = SipCall.SipCallBuilder.getInstance().startCallCreation().setContact(c)
- .setAccountID(service.getAccountList().get(1).toString()).setCallType(SipCall.state.CALL_TYPE_OUTGOING).build();
+ .setAccount((Account)service.getAccountList().get(1)).setCallType(SipCall.state.CALL_TYPE_OUTGOING).build();
Conference tmp = new Conference("-1");
tmp.getParticipants().add(call);
Bundle b = new Bundle();
diff --git a/src/org/sflphone/client/SFLPhoneHomeActivity.java b/src/org/sflphone/client/SFLPhoneHomeActivity.java
index 21c898c..9ee0b03 100644
--- a/src/org/sflphone/client/SFLPhoneHomeActivity.java
+++ b/src/org/sflphone/client/SFLPhoneHomeActivity.java
@@ -164,13 +164,13 @@
@Override
public void onScrollStarted() {
-// getActionBar().hide();
+ // getActionBar().hide();
}
@Override
public void onScrollEnded() {
-// getActionBar().show();
+ // getActionBar().show();
}
@@ -183,22 +183,22 @@
}
}
});
-
-// mDrawer.setOnDrawerCloseListener(new OnDrawerCloseListener() {
-//
-// @Override
-// public void onDrawerClosed() {
-// getActionBar().show();
-// }
-// });
-//
-// mDrawer.setOnDrawerOpenListener(new OnDrawerOpenListener() {
-//
-// @Override
-// public void onDrawerOpened() {
-// getActionBar().hide();
-// }
-// });
+
+ // mDrawer.setOnDrawerCloseListener(new OnDrawerCloseListener() {
+ //
+ // @Override
+ // public void onDrawerClosed() {
+ // getActionBar().show();
+ // }
+ // });
+ //
+ // mDrawer.setOnDrawerOpenListener(new OnDrawerOpenListener() {
+ //
+ // @Override
+ // public void onDrawerOpened() {
+ // getActionBar().hide();
+ // }
+ // });
mContactsFragment.setHandleView((RelativeLayout) findViewById(R.id.slider_button));
@@ -291,8 +291,8 @@
@Override
public void onBackPressed() {
-
- if(mDrawerLayout.isDrawerVisible(Gravity.LEFT)){
+
+ if (mDrawerLayout.isDrawerVisible(Gravity.LEFT)) {
mDrawerLayout.closeDrawer(Gravity.LEFT);
}
if (getActionBar().getCustomView() != null) {
@@ -347,7 +347,6 @@
public void launchCallActivity(SipCall infos) {
- Log.i(TAG, "Launch Call Activity");
Bundle bundle = new Bundle();
Conference tmp = new Conference("-1");
@@ -358,6 +357,7 @@
intent.putExtra("resuming", false);
intent.putExtras(bundle);
startActivityForResult(intent, REQUEST_CODE_CALL);
+
// overridePendingTransition(R.anim.slide_down, R.anim.slide_up);
}
@@ -467,12 +467,12 @@
String mess = b.getString("Msg");
Toast.makeText(getApplicationContext(), "text from " + from + " : " + mess, Toast.LENGTH_LONG).show();
}
-
+
@Override
public void onTextContact(final CallContact c) {
// TODO
}
-
+
@Override
public void onEditContact(final CallContact c) {
Intent intent = new Intent(Intent.ACTION_VIEW);
@@ -491,6 +491,11 @@
return;
}
+ if (!fMenu.getSelectedAccount().isRegistered()) {
+ createNotRegisteredDialog().show();
+ return;
+ }
+
Thread launcher = new Thread(new Runnable() {
final String[] CONTACTS_PHONES_PROJECTION = new String[] { Phone.NUMBER, Phone.TYPE };
@@ -500,8 +505,7 @@
public void run() {
SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
try {
- callBuilder.startCallCreation().setAccountID(fMenu.getSelectedAccount().getAccountID())
- .setCallType(SipCall.state.CALL_TYPE_OUTGOING);
+ callBuilder.startCallCreation().setAccount(fMenu.getSelectedAccount()).setCallType(SipCall.state.CALL_TYPE_OUTGOING);
Cursor cPhones = getContentResolver().query(Phone.CONTENT_URI, CONTACTS_PHONES_PROJECTION, Phone.CONTACT_ID + " =" + c.getId(),
null, null);
@@ -541,18 +545,42 @@
return;
}
- SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
- callBuilder.startCallCreation().setAccountID(fMenu.getSelectedAccount().getAccountID()).setCallType(SipCall.state.CALL_TYPE_OUTGOING);
- callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(to));
+ if (fMenu.getSelectedAccount().isRegistered()) {
+ SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
+ callBuilder.startCallCreation().setAccount(fMenu.getSelectedAccount()).setCallType(SipCall.state.CALL_TYPE_OUTGOING);
+ callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(to));
- try {
- launchCallActivity(callBuilder.build());
- } catch (Exception e) {
- Log.e(TAG, e.toString());
+ try {
+ launchCallActivity(callBuilder.build());
+ } catch (Exception e) {
+ Log.e(TAG, e.toString());
+ }
+ } else {
+ createNotRegisteredDialog().show();;
}
}
+ private AlertDialog createNotRegisteredDialog() {
+ final Activity ownerActivity = this;
+ AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
+
+ builder.setMessage(getResources().getString(R.string.cannot_pass_sipcall))
+ .setTitle(getResources().getString(R.string.cannot_pass_sipcall_title))
+ .setPositiveButton(getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ Intent in = new Intent();
+ in.setClass(ownerActivity, SFLPhonePreferenceActivity.class);
+ ownerActivity.startActivityForResult(in, SFLPhoneHomeActivity.REQUEST_CODE_PREFERENCES);
+ }
+ });
+
+ AlertDialog alertDialog = builder.create();
+ alertDialog.setOwnerActivity(ownerActivity);
+
+ return alertDialog;
+ }
+
private AlertDialog createAccountDialog() {
final Activity ownerActivity = this;
AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
diff --git a/src/org/sflphone/fragments/CallFragment.java b/src/org/sflphone/fragments/CallFragment.java
index 6c25b15..70950dd 100644
--- a/src/org/sflphone/fragments/CallFragment.java
+++ b/src/org/sflphone/fragments/CallFragment.java
@@ -35,6 +35,7 @@
import java.util.Locale;
import org.sflphone.R;
+import org.sflphone.client.AccountWizard;
import org.sflphone.model.Attractor;
import org.sflphone.model.Bubble;
import org.sflphone.model.BubbleModel;
@@ -60,6 +61,9 @@
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.View;
@@ -108,6 +112,7 @@
Log.e(TAG, "BUBBLE_SIZE " + BUBBLE_SIZE);
mSensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+ this.setHasOptionsMenu(true);
}
@@ -210,6 +215,25 @@
myself = SipCall.SipCallBuilder.buildMyselfCall(activity.getContentResolver(), "Me");
}
+
+ @Override
+ public void onCreateOptionsMenu(Menu m, MenuInflater inf) {
+ super.onCreateOptionsMenu(m, inf);
+ inf.inflate(R.menu.account_creation, m);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ super.onOptionsItemSelected(item);
+ switch (item.getItemId()) {
+ case R.id.menuitem_create:
+// Intent intent = new Intent().setClass(getActivity(), AccountWizard.class);
+// startActivityForResult(intent, ACCOUNT_CREATE_REQUEST);
+ break;
+ }
+
+ return true;
+ }
@Override
public void onDetach() {
@@ -249,22 +273,17 @@
mCallbacks.getService().attendedTransfer(transfer.getCallId(), c.getParticipants().get(0).getCallId());
} catch (RemoteException e) {
- // TODO Auto-generated catch block
e.printStackTrace();
}
- // Toast.makeText(getActivity(), "Transfer complete", Toast.LENGTH_LONG).show();
break;
case TransferDFragment.RESULT_TRANSFER_NUMBER:
String to = data.getStringExtra("to_number");
transfer = data.getParcelableExtra("transfer");
try {
- // Toast.makeText(getActivity(), "Transferring " + transfer.getContact().getmDisplayName() + " to " + to,
- // Toast.LENGTH_SHORT).show();
mCallbacks.getService().transfer(transfer.getCallId(), to);
mCallbacks.getService().hangUp(transfer.getCallId());
} catch (RemoteException e) {
- // TODO Auto-generated catch block
e.printStackTrace();
}
break;
diff --git a/src/org/sflphone/model/Bubble.java b/src/org/sflphone/model/Bubble.java
index ecbc108..e6ad794 100644
--- a/src/org/sflphone/model/Bubble.java
+++ b/src/org/sflphone/model/Bubble.java
@@ -1,25 +1,24 @@
package org.sflphone.model;
+import org.sflphone.R;
import org.sflphone.adapters.ContactPictureTask;
import android.content.Context;
import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
+import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
+import android.graphics.Paint.Style;
import android.graphics.PointF;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
+import android.graphics.Shader;
import android.util.Log;
-import org.sflphone.R;
-
public class Bubble {
// A Bitmap object that is going to be passed to the BitmapShader
- private Bitmap internalBMP, externalBMP;
+ private Bitmap externalBMP;
public SipCall associated_call;
private PointF pos = new PointF();
@@ -40,43 +39,49 @@
private Bitmap saved_photo;
private float expanded_radius;
+ ActionDrawer act = new ActionDrawer(0, 0, false, false);
+
public void setAttractor(PointF attractor) {
this.attractor = attractor;
}
public Bubble(Context context, SipCall call, float x, float y, float size) {
- Bitmap photo = null;
- if (call.getContact().getPhoto_id() > 0) {
- photo = ContactPictureTask.loadContactPhoto(context.getContentResolver(), call.getContact().getId());
- } else {
- photo = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_contact_picture);
- }
-
- saved_photo = photo;
- internalBMP = Bitmap.createScaledBitmap(photo, (int) size, (int) size, false);
- internalBMP.setHasAlpha(true);
+ saved_photo = getContactPhoto(context, call, (int) size);
associated_call = call;
pos.set(x, y);
- radius = internalBMP.getWidth() / 2;
+ radius = size / 2;
expanded_radius = (float) (size * 1.5);
- bounds = new RectF(pos.x - radius, pos.y - radius, pos.x + radius, pos.y + radius);
+
+ int w = saved_photo.getWidth(), h = saved_photo.getHeight();
+ if (w > h) {
+ w = h;
+ } else if (h > w) {
+ h = w;
+ }
+
+ externalBMP = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
+
+ BitmapShader shader;
+ shader = new BitmapShader(saved_photo, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
+
+ Paint paint = new Paint();
+ paint.setAntiAlias(true);
+ paint.setShader(shader);
+ Canvas internalCanvas = new Canvas(externalBMP);
+ internalCanvas.drawOval(new RectF(0, 0, w, h), paint);
+
+ bounds = new RectF(pos.x - getRadius(), pos.y - getRadius(), pos.x + getRadius(), pos.y + getRadius());
attractor = new PointF(x, y);
- Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- circlePaint.setStyle(Paint.Style.FILL);
- Bitmap circle = Bitmap.createBitmap(internalBMP.getWidth(), internalBMP.getHeight(), Bitmap.Config.ARGB_8888);
- Canvas circle_drawer = new Canvas(circle);
- circle_drawer.drawOval(new RectF(0, 0, internalBMP.getWidth(), internalBMP.getHeight()), circlePaint);
+ }
- externalBMP = Bitmap.createBitmap(internalBMP.getWidth(), internalBMP.getHeight(), Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(externalBMP);
-
- circlePaint.setFilterBitmap(false);
- canvas.drawBitmap(internalBMP, 0, 0, circlePaint);
-
- circlePaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
- canvas.drawBitmap(circle, 0, 0, circlePaint);
+ private Bitmap getContactPhoto(Context context, SipCall call, int size) {
+ if (call.getContact().getPhoto_id() > 0) {
+ return ContactPictureTask.loadContactPhoto(context.getContentResolver(), call.getContact().getId());
+ } else {
+ return ContactPictureTask.decodeSampledBitmapFromResource(context.getResources(), R.drawable.ic_contact_picture, (int) size, (int) size);
+ }
}
public Bitmap getBitmap() {
@@ -91,8 +96,11 @@
scale = s;
pos.x = x;
pos.y = y;
- float rad = scale * getRadius() * density;
- bounds.set(pos.x - rad, pos.y - rad, pos.x + rad, pos.y + rad);
+ if (!expanded) {
+ bounds.set(pos.x - getRadius(), pos.y - getRadius(), pos.x + getRadius(), pos.y + getRadius());
+ } else {
+ bounds.set(pos.x - getRadius(), pos.y - getRadius(), pos.x + getRadius(), pos.y + getRadius());
+ }
}
public float getPosX() {
@@ -119,8 +127,11 @@
set(pos.x, pos.y, s);
}
- public float getRadius() {
- return expanded ? expanded_radius : radius;
+ public int getRadius() {
+ if (expanded)
+ return (int) (expanded_radius * scale * density);
+
+ return (int) (radius * scale * density);
}
/**
@@ -146,84 +157,157 @@
this.density = density;
}
- public void expand() {
+ public void expand(int width, int height) {
expanded = true;
- internalBMP = Bitmap.createScaledBitmap(saved_photo, (int) (2 * radius), (int) (2 * radius), false);
- bounds = new RectF(pos.x - getRadius(), pos.y - getRadius(), pos.x + getRadius(), pos.y + getRadius());
+// if (associated_call.getContact().isUser()) {
+ createCircularExpandedBubble();
+// } else {
+// createRectangularExpandedBubble(width, height);
+// }
- Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- circlePaint.setAntiAlias(true);
- circlePaint.setDither(true);
- circlePaint.setStyle(Paint.Style.FILL);
- circlePaint.setColor(Color.RED);
+ }
- Bitmap circle = Bitmap.createBitmap(internalBMP.getWidth(), internalBMP.getHeight(), Bitmap.Config.ARGB_8888);
- Canvas circle_drawer = new Canvas(circle);
- circle_drawer.drawOval(new RectF(0, 0, internalBMP.getWidth(), internalBMP.getHeight()), circlePaint);
+ private void createRectangularExpandedBubble(int width, int height) {
- Canvas canvas = new Canvas(internalBMP);
- circlePaint.setFilterBitmap(false);
- canvas.drawBitmap(internalBMP, 0, 0, circlePaint);
+ // int w = saved_photo.getWidth(), h = saved_photo.getHeight();
+ // if (w > h) {
+ // w = h;
+ // } else if (h > w) {
+ // h = w;
+ // }
+ // externalBMP = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
+ //
+ // BitmapShader shader;
+ // shader = new BitmapShader(saved_photo, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
+ //
+ // Paint paint = new Paint();
+ // paint.setAntiAlias(true);
+ // paint.setShader(shader);
+ // Canvas internalCanvas = new Canvas(externalBMP);
+ // internalCanvas.drawOval(new RectF(0, 0, w, h), paint);
+ //
+ // bounds = new RectF(pos.x - getRadius(), pos.y - getRadius(), pos.x + getRadius(), pos.y + getRadius());
- circlePaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
- canvas.drawBitmap(circle, 0, 0, circlePaint);
- circle_drawer.drawOval(new RectF(0, 0, internalBMP.getWidth(), internalBMP.getHeight()), circlePaint);
+ int w = saved_photo.getWidth(), h = saved_photo.getHeight();
+ if (w > h) {
+ w = h;
+ } else if (h > w) {
+ h = w;
+ }
- externalBMP = Bitmap.createBitmap((int) (getRadius() * 2), (int) (getRadius() * 2), Bitmap.Config.ARGB_8888);
- Canvas canvasf = new Canvas(externalBMP);
+ BitmapShader shader;
+ shader = new BitmapShader(saved_photo, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
- Paint mPaintPath = new Paint(Paint.ANTI_ALIAS_FLAG);
- mPaintPath.setStyle(Paint.Style.FILL);
- mPaintPath.setColor(0xAA000000);
+ Paint paint = new Paint();
+ paint.setAntiAlias(true);
+ paint.setShader(shader);
- Paint fatality = new Paint(Paint.ANTI_ALIAS_FLAG);
- fatality.setAntiAlias(true);
- fatality.setDither(true);
- fatality.setStyle(Paint.Style.FILL);
+ Paint test = new Paint();
+ test.setColor(Color.CYAN);
+ test.setStyle(Style.FILL);
- canvasf.drawOval(new RectF(0, 0, getRadius() * 2, getRadius() * 2), mPaintPath); // background with buttons
+ if (pos.x < width / 3) {
+ // Open on the right
+ bounds = new RectF(pos.x - getRadius(), pos.y - getRadius(), pos.x + 300, pos.y + getRadius());
+ externalBMP = Bitmap.createBitmap(w + 300, h, Bitmap.Config.ARGB_8888);
+ Canvas internalCanvas = new Canvas(externalBMP);
+ internalCanvas.drawRect(new RectF(0, 0, w + 300, h), test);
+ internalCanvas.drawOval(new RectF(0, 0, w, h), paint);
+ } else if (pos.x > 2 * width / 3) {
+ // Open on the left
+ bounds = new RectF(pos.x - getRadius() - 300, pos.y - getRadius(), pos.x + getRadius(), pos.y + getRadius());
+ externalBMP = Bitmap.createBitmap(w + 300, h, Bitmap.Config.ARGB_8888);
+ Canvas internalCanvas = new Canvas(externalBMP);
+ internalCanvas.drawRect(new RectF(0, 0, w + 300, h), test);
+ internalCanvas.drawOval(new RectF(300, 0, 300 + w, h), paint);
+ } else {
+ // Middle of the screen
+ if (pos.y < height / 3) {
- int[] allpixels = new int[internalBMP.getHeight() * internalBMP.getWidth()];
+ // Middle Top
- internalBMP.getPixels(allpixels, 0, internalBMP.getWidth(), 0, 0, internalBMP.getWidth(), internalBMP.getHeight());
- for (int i = 0; i < internalBMP.getHeight() * internalBMP.getWidth(); i++) {
- // Log.i("Bubble", "allpixels[i]:"+allpixels[i]);
- if (allpixels[i] == Color.BLACK) {
- allpixels[i] = 0xAA000000;
+ Log.i("Bubble", "Middle Top screen");
+ Log.i("Bubble", "Bounds:" + bounds.toShortString());
+ Log.i("Bubble", "w:" + w);
+ Log.i("Bubble", "h:" + h);
+
+ act = new ActionDrawer(w - 200, 4 * h, false, true);
+ act.setBounds(new RectF(pos.x - act.getWidth() / 2, pos.y, pos.x + act.getWidth() / 2, pos.y + act.getHeight()));
+
+
+
+ externalBMP = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
+
+ Canvas internalCanvas = new Canvas(externalBMP);
+ internalCanvas.drawOval(new RectF(0, 0, w, h), paint);
+// internalCanvas.drawRect(new RectF(0, h, w, h + act.getHeight()), test);
+
+ bounds = new RectF(pos.x - getRadius(), pos.y - getRadius(), pos.x + getRadius(), pos.y + getRadius());
+
+ } else if (pos.y > 2 * height / 3) {
+ // Middle Bottom
+ bounds = new RectF(pos.x - getRadius(), pos.y - 300 - getRadius(), pos.x + getRadius(), pos.y + getRadius());
+ externalBMP = Bitmap.createBitmap(w, h + 300, Bitmap.Config.ARGB_8888);
+ Canvas internalCanvas = new Canvas(externalBMP);
+ internalCanvas.drawRect(new RectF(0, 0, w, h + 300), test);
+ internalCanvas.drawOval(new RectF(0, 300, w, h + 300), paint);
}
}
- internalBMP.setPixels(allpixels, 0, internalBMP.getWidth(), 0, 0, internalBMP.getWidth(), internalBMP.getHeight());
- canvasf.drawBitmap(internalBMP, (float) (getRadius() - radius), (float) (getRadius() - radius), fatality);
+ }
+
+ private void createCircularExpandedBubble() {
+
+ int w = saved_photo.getWidth(), h = saved_photo.getHeight();
+ if (w > h) {
+ w = h;
+ } else if (h > w) {
+ h = w;
+ }
+
+ externalBMP = Bitmap.createBitmap((int) (w * expanded_radius / radius), (int) (h * expanded_radius / radius), Bitmap.Config.ARGB_8888);
+ BitmapShader shader;
+ shader = new BitmapShader(saved_photo, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
+
+ Paint paint = new Paint();
+ paint.setAntiAlias(true);
+ paint.setShader(shader);
+ Canvas internalCanvas = new Canvas(externalBMP);
+
+ Paint paint2 = new Paint();
+ paint2.setColor(0xAA000000);
+
+ internalCanvas.drawOval(new RectF(0, 0, (int) (w * expanded_radius / radius), (int) (h * expanded_radius / radius)), paint2);
+ internalCanvas.drawOval(new RectF(externalBMP.getWidth() / 2 - w / 2, externalBMP.getHeight() / 2 - h / 2,
+ externalBMP.getWidth() / 2 + w / 2, externalBMP.getHeight() / 2 + h / 2), paint);
+
+ bounds.set(pos.x - getRadius(), pos.y - getRadius(), pos.x + getRadius(), pos.y + getRadius());
}
public void retract() {
expanded = false;
- internalBMP = Bitmap.createScaledBitmap(saved_photo, (int) (2 * radius), (int) (2 * radius), false);
+
+ int w = saved_photo.getWidth(), h = saved_photo.getHeight();
+ if (w > h) {
+ w = h;
+ } else if (h > w) {
+ h = w;
+ }
+ externalBMP = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
+
+ BitmapShader shader;
+ shader = new BitmapShader(saved_photo, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
+
+ Paint paint = new Paint();
+ paint.setAntiAlias(true);
+ paint.setShader(shader);
+ Canvas internalCanvas = new Canvas(externalBMP);
+ internalCanvas.drawOval(new RectF(0, 0, w, h), paint);
bounds = new RectF(pos.x - getRadius(), pos.y - getRadius(), pos.x + getRadius(), pos.y + getRadius());
-
- Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- circlePaint.setAntiAlias(true);
- circlePaint.setDither(true);
- circlePaint.setStyle(Paint.Style.FILL);
-
- Bitmap circle = Bitmap.createBitmap(internalBMP.getWidth(), internalBMP.getHeight(), Bitmap.Config.ARGB_8888);
- Canvas circle_drawer = new Canvas(circle);
- circle_drawer.drawOval(new RectF(0, 0, internalBMP.getWidth(), internalBMP.getHeight()), circlePaint);
-
- externalBMP = Bitmap.createBitmap(internalBMP.getWidth(), internalBMP.getHeight(), Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(externalBMP);
-
- circlePaint.setFilterBitmap(false);
- canvas.drawBitmap(internalBMP, 0, 0, circlePaint);
-
- circlePaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
- canvas.drawBitmap(circle, 0, 0, circlePaint);
-
}
/**
@@ -246,8 +330,8 @@
* @return
*/
public int getAction(float x, float y) {
- float relativeX = x - pos.x + externalBMP.getWidth() / 2;
- float relativeY = y - pos.y + externalBMP.getHeight() / 2;
+ float relativeX = x - pos.x + bounds.width()/2;
+ float relativeY = y - pos.y + bounds.height() / 2;
// Log.i("Bubble", "relativeX:" + relativeX);
// Log.i("Bubble", "relativeY:" + relativeY);
@@ -259,19 +343,19 @@
// Log.i("Bubble", "externalBMP.getHeight():" + externalBMP.getHeight());
// Hold - Left
- if (relativeX < externalBMP.getWidth() / 3 && relativeY > externalBMP.getHeight() / 3) {
+ if (relativeX < bounds.width()/2 / 3 && relativeY > bounds.height() / 3) {
Log.i("Bubble", "Holding");
return 1;
}
// Record - Right
- if (relativeX > externalBMP.getWidth() * 2 / 3 && relativeY > externalBMP.getHeight() / 3) {
+ if (relativeX > bounds.width()/2 * 2 / 3 && relativeY > bounds.height() / 3) {
Log.i("Bubble", "Record");
return 2;
}
// Transfer - Bottom
- if (relativeY > externalBMP.getHeight() * 2 / 3) {
+ if (relativeY > bounds.height() * 2 / 3) {
Log.i("Bubble", "Transfer");
return 3;
}
@@ -304,4 +388,43 @@
else
return R.string.action_call_record;
}
+
+ // Calculate the position of this Bubble depending on its coordinates
+ // It will open the actions drawer differently depending on it
+ public int getPosition(int width, int height) {
+
+ return 0;
+ }
+
+ protected class ActionDrawer {
+
+ int mWidth, mHeight;
+ boolean isLeft, isTop;
+ RectF bounds;
+
+ public ActionDrawer(int w, int h, boolean left, boolean top) {
+ isLeft = left;
+ isTop = top;
+ mWidth = w;
+ mHeight = h;
+ bounds = new RectF(0, 0, 0, 0);
+ }
+
+ public RectF getBounds() {
+ return bounds;
+ }
+
+ public void setBounds(RectF bounds) {
+ this.bounds = bounds;
+ }
+
+ public int getWidth() {
+ return mWidth;
+ }
+
+ public int getHeight() {
+ return mHeight;
+ }
+
+ }
}
diff --git a/src/org/sflphone/model/BubblesView.java b/src/org/sflphone/model/BubblesView.java
index fb4a92d..660eb9a 100644
--- a/src/org/sflphone/model/BubblesView.java
+++ b/src/org/sflphone/model/BubblesView.java
@@ -131,10 +131,9 @@
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.w(TAG, "surfaceChanged " + width + "-" + height);
- if(height < model.height) // probably showing the keyboard, don't move!
+ if (height < model.height) // probably showing the keyboard, don't move!
return;
-
thread.setSurfaceSize(width, height);
}
@@ -269,43 +268,13 @@
canvas.drawColor(Color.WHITE);
if (dragging_bubble) {
- // Draw red gradient around to hang up call
- // canvas.drawColor(Color.RED);
-
- // LinearGradient grTop = new LinearGradient(0, 0, 0, 40, Color.RED, Color.WHITE, TileMode.CLAMP);
- // RadialGradient gr = new RadialGradient(model.width/2, model.height/2, model.width/2, Color.WHITE, Color.RED, TileMode.CLAMP);
Paint p = new Paint();
p.setDither(true);
- // p.setShader(gr);
p.setColor(getResources().getColor(R.color.holo_red_light));
- // p.setXfermode(new PorterDuffXfermode(Mode.))
p.setStyle(Style.STROKE);
- // canvas.drawRect(new RectF(0, 0, model.width, 40), p);
p.setStrokeWidth(20);
canvas.drawRect(new RectF(10, 10, model.width - 10, model.height - 10), p);
-
- // canvas.drawRoundRect(new RectF(0,0,model.width, model.height), 200, 200, p);
-
- // LinearGradient grBottom = new LinearGradient(0, model.height, 0, model.height - 40, Color.RED, Color.WHITE, TileMode.CLAMP);
- // p.setDither(true);
- // p.setShader(grBottom);
- // canvas.drawRect(new RectF(0, model.height - 40, model.width, model.height), p);
- //
- // LinearGradient grLeft = new LinearGradient(0, 0, 40, 0, Color.RED, Color.WHITE, TileMode.CLAMP);
- // p.setDither(true);
- // p.setShader(grLeft);
- // canvas.drawRect(new RectF(0, 0, 40, model.height), p);
- //
- // LinearGradient grRight = new LinearGradient(model.width, 0, model.width - 40, 0, Color.RED, Color.WHITE, TileMode.CLAMP);
- // p.setDither(true);
- // p.setShader(grRight);
- // canvas.drawRect(new RectF(model.width - 40, 0, model.width, model.height), p);
-
- // tryMe.setColor(getResources().getColor(R.color.lighter_gray));
- // tryMe.setStyle(Paint.Style.FILL);
- // tryMe.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));
- // canvas.drawArc(new RectF(15, 30, model.width - 15, model.height - 30), 0, 360, false, tryMe);
}
tryMe.setStyle(Paint.Style.STROKE);
@@ -332,7 +301,9 @@
Bubble first_plan = getExpandedBubble();
if (first_plan != null) {
+
canvas.drawBitmap(first_plan.getBitmap(), null, first_plan.getBounds(), null);
+ Log.i(TAG, first_plan.getBounds().toShortString());
canvas.drawText(first_plan.associated_call.getContact().getmDisplayName(), first_plan.getPosX(),
(float) (first_plan.getPosY() - first_plan.getRetractedRadius() * 1.2 * density), getNamePaint(first_plan));
@@ -495,7 +466,7 @@
// Log.d("Main", "onLongPress");
if (isDraggingBubble()) {
Bubble b = getDraggedBubble(e);
- b.expand();
+ b.expand(model.width, model.height);
}
}