* Changed process of call creation
* Modified Fly-in menu layout
* Added SearchView in ContactList handle
diff --git a/src/com/savoirfairelinux/sflphone/client/CallActivity.java b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
index 122ee33..1f39852 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
@@ -32,8 +32,6 @@
package com.savoirfairelinux.sflphone.client;
-import java.util.HashMap;
-import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -41,48 +39,37 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.ServiceConnection;
-import android.graphics.Bitmap;
-import android.graphics.PointF;
import android.os.Bundle;
import android.os.IBinder;
-import android.os.Parcelable;
import android.os.RemoteException;
-import android.util.DisplayMetrics;
+import android.support.v4.view.ViewPager;
import android.util.Log;
import android.widget.Toast;
import com.savoirfairelinux.sflphone.R;
-import com.savoirfairelinux.sflphone.adapters.ContactPictureLoader;
-import com.savoirfairelinux.sflphone.client.receiver.CallListReceiver;
-import com.savoirfairelinux.sflphone.model.Attractor;
-import com.savoirfairelinux.sflphone.model.Bubble;
-import com.savoirfairelinux.sflphone.model.BubbleModel;
-import com.savoirfairelinux.sflphone.model.BubblesView;
-import com.savoirfairelinux.sflphone.model.CallContact;
+import com.savoirfairelinux.sflphone.adapters.CallPagerAdapter;
+import com.savoirfairelinux.sflphone.client.receiver.CallReceiver;
+import com.savoirfairelinux.sflphone.fragments.CallFragment;
+import com.savoirfairelinux.sflphone.interfaces.CallInterface;
import com.savoirfairelinux.sflphone.model.SipCall;
-import com.savoirfairelinux.sflphone.service.ISipClient;
+import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
import com.savoirfairelinux.sflphone.service.ISipService;
import com.savoirfairelinux.sflphone.service.SipService;
-public class CallActivity extends Activity {
+public class CallActivity extends Activity implements CallInterface, CallFragment.Callbacks {
static final String TAG = "CallActivity";
private ISipService service;
+
private String pendingAction = null;
- private SipCall mCall;
-
- private BubblesView view;
- private BubbleModel model;
- private PointF screenCenter;
- private DisplayMetrics metrics;
-
- private HashMap<CallContact, Bubble> contacts = new HashMap<CallContact, Bubble>();
private ExecutorService infos_fetcher = Executors.newCachedThreadPool();
+ CallReceiver receiver;
- public interface CallFragment {
- void setCall(SipCall c);
- }
+ ViewPager vp;
+ private CallPagerAdapter mCallPagerAdapter;
+ private ViewPager mViewPager;
/*
* private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@@ -93,140 +80,50 @@
* if (signalName.equals(CallManagerCallBack.NEW_CALL_CREATED)) { } else if (signalName.equals(CallManagerCallBack.CALL_STATE_CHANGED)) {
* processCallStateChangedSignal(intent); } else if (signalName.equals(CallManagerCallBack.INCOMING_CALL)) { } } };
*/
- private ISipClient callback = new ISipClient.Stub() {
-
- @Override
- public void incomingCall(Intent call) throws RemoteException {
- Log.i(TAG, "Incoming call transfered from Service");
- SipCall.CallInfo infos = new SipCall.CallInfo(call);
- SipCall c = new SipCall(infos);
- //
- }
-
- @Override
- public void callStateChanged(Intent callState) throws RemoteException {
- Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
- String cID = b.getString("CallID");
- String state = b.getString("State");
- Log.i(TAG, "callStateChanged" + cID + " " + state);
- processCallStateChangedSignal(cID, state);
- }
-
- @Override
- public void incomingText(Intent msg) throws RemoteException {
- Bundle b = msg.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
- b.getString("CallID");
- String from = b.getString("From");
- String mess = b.getString("Msg");
- Toast.makeText(getApplicationContext(), "text from " + from + " : " + mess, Toast.LENGTH_LONG).show();
- }
- };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.bubbleview_layout);
+ setContentView(R.layout.activity_call_layout);
- model = new BubbleModel(getResources().getDisplayMetrics().density);
- metrics = getResources().getDisplayMetrics();
- screenCenter = new PointF(metrics.widthPixels / 2, metrics.heightPixels / 3);
- // radiusCalls = metrics.widthPixels / 2 - 150;
- // model.listBubbles.add(new Bubble(this, metrics.widthPixels / 2, metrics.heightPixels / 4, 150, R.drawable.me));
- // model.listBubbles.add(new Bubble(this, metrics.widthPixels / 2, metrics.heightPixels / 4 * 3, 150, R.drawable.callee));
+ receiver = new CallReceiver(this);
- view = (BubblesView) findViewById(R.id.main_view);
- view.setModel(model);
+ if (mCallPagerAdapter == null) {
+ mCallPagerAdapter = new CallPagerAdapter(this, getFragmentManager());
+ }
+
+ mViewPager = (ViewPager) findViewById(R.id.pager);
+
+ mViewPager.setAdapter(mCallPagerAdapter);
Bundle b = getIntent().getExtras();
-
- SipCall.CallInfo info = b.getParcelable("CallInfo");
- Log.i(TAG, "Starting activity for call " + info.mCallID);
- mCall = new SipCall(info);
-
Intent intent = new Intent(this, SipService.class);
// setCallStateDisplay(mCall.getCallStateString());
- pendingAction = b.getString("action");
- if (pendingAction != null && pendingAction.equals("call")) {
- CallContact contact = b.getParcelable("CallContact");
-
- Log.i(TAG, "Calling " + contact.getmDisplayName());
- callContact(contact);
- // SipCall.CallInfo info = new SipCall.CallInfo();
- // Random random = new Random();
- // String callID = Integer.toString(random.nextInt());
- // Phone phone = contact.getSipPhone();
-
- // info.mCallID = callID;
- // info.mAccountID = ""+contact.getId();
- // info.mDisplayName = contact.getmDisplayName();
- // info.mPhone = phone==null?null:phone.toString();
- // info.mEmail = contact.getmEmail();
- // info.mCallType = SipCall.CALL_TYPE_OUTGOING;
-
- // mCall = CallListReceiver.getCallInstance(info);
-
- // mCallbacks.onCallSelected(call);
-
- /*
- * try { service.placeCall(info.mAccountID, info.mCallID, info.mPhone); } catch (RemoteException e) { Log.e(TAG,
- * "Cannot call service method", e); }
- */
-
- } else if (pendingAction.equals("incoming")) {
- callIncoming();
- }
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
- /*
- * LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter(CallManagerCallBack.NEW_CALL_CREATED));
- * LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter(CallManagerCallBack.CALL_STATE_CHANGED));
- * LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter(CallManagerCallBack.INCOMING_CALL));
- */
}
- private void callContact(final CallContact contact) {
- // TODO off-thread image loading
- Bubble contact_bubble;
- if (contact.getPhoto_id() > 0) {
- Bitmap photo = ContactPictureLoader.loadContactPhoto(getContentResolver(), contact.getId());
- contact_bubble = new Bubble(this, screenCenter.x, screenCenter.y, 150, photo);
- } else {
- contact_bubble = new Bubble(this, screenCenter.x, screenCenter.y, 150, R.drawable.ic_contact_picture);
- }
-
- model.attractors.clear();
- model.attractors.add(new Attractor(new PointF(metrics.widthPixels / 2, metrics.heightPixels * .8f), new Attractor.Callback() {
- @Override
- public void onBubbleSucked(Bubble b) {
- Log.w(TAG, "Bubble sucked ! ");
- onCallEnded();
- }
- }));
-
- contact_bubble.contact = contact;
- model.listBubbles.add(contact_bubble);
- contacts.put(contact, contact_bubble);
+ /* activity gets back to the foreground and user input */
+ @Override
+ protected void onResume() {
+ Log.i(TAG, "onResume");
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
+ intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
+ intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
+ registerReceiver(receiver, intentFilter);
+ super.onResume();
}
- private void callIncoming() {
- model.attractors.clear();
- model.attractors.add(new Attractor(new PointF(3 * metrics.widthPixels / 4, metrics.heightPixels / 4), new Attractor.Callback() {
- @Override
- public void onBubbleSucked(Bubble b) {
- onCallAccepted();
- }
- }));
- model.attractors.add(new Attractor(new PointF(metrics.widthPixels / 4, metrics.heightPixels / 4), new Attractor.Callback() {
- @Override
- public void onBubbleSucked(Bubble b) {
- onCallRejected();
- }
- }));
-
+ /* activity no more in foreground */
+ @Override
+ protected void onPause() {
+ super.onPause();
+ unregisterReceiver(receiver);
}
@Override
@@ -243,30 +140,13 @@
@Override
public void onServiceConnected(ComponentName className, IBinder binder) {
service = ISipService.Stub.asInterface(binder);
- try {
- service.registerClient(callback);
- if (pendingAction != null && pendingAction.contentEquals("call")) {
+ Log.i(TAG, "Placing call");
+ CallFragment newCall = new CallFragment();
+ newCall.setArguments(getIntent().getExtras());
+ getIntent().getExtras();
+ SipCall.CallInfo info = getIntent().getExtras().getParcelable("CallInfo");
+ mCallPagerAdapter.addCall(info.mCallID, newCall);
- Log.i(TAG, "Placing call");
- CallContact contact = model.listBubbles.get(0).contact;
-
- String callID = Integer.toString(new Random().nextInt());
- SipCall.CallInfo info = new SipCall.CallInfo();
- info.mCallID = callID;
- info.mAccountID = service.getAccountList().get(0).toString();
- info.mDisplayName = contact.getmDisplayName();
- info.mPhone = contact.getSipPhone().getNumber();
- info.mEmail = contact.getmEmail();
- info.mCallType = SipCall.CALL_TYPE_OUTGOING;
-
- mCall = CallListReceiver.getCallInstance(info);
-
- service.placeCall(info.mAccountID, info.mCallID, info.mPhone);
- pendingAction = null;
- }
- } catch (RemoteException e) {
- Log.e(TAG, e.toString());
- }
}
@Override
@@ -274,104 +154,73 @@
}
};
- private void processCallStateChangedSignal(String callID, String newState) {
+ @Override
+ public void incomingCall(Intent call) {
+ Toast.makeText(this, "New Call incoming", Toast.LENGTH_LONG).show();
+
+ // TODO Handle multicall here
+
+ }
+
+ @Override
+ public void callStateChanged(Intent callState) {
+
+ Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
+ processCallStateChangedSignal(b.getString("CallID"), b.getString("State"));
+
+ }
+
+ public void processCallStateChangedSignal(String callID, String newState) {
/*
* Bundle bundle = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate"); String callID = bundle.getString("CallID"); String
* newState = bundle.getString("State");
*/
+ CallFragment fr = (CallFragment) mCallPagerAdapter.getCall(callID);
if (newState.equals("INCOMING")) {
- mCall.setCallState(SipCall.CALL_STATE_INCOMING);
- setCallStateDisplay(newState);
+ fr.changeCallState(SipCall.CALL_STATE_INCOMING);
+
} else if (newState.equals("RINGING")) {
- mCall.setCallState(SipCall.CALL_STATE_RINGING);
- setCallStateDisplay(newState);
+ fr.changeCallState(SipCall.CALL_STATE_RINGING);
+
} else if (newState.equals("CURRENT")) {
- mCall.setCallState(SipCall.CALL_STATE_CURRENT);
- setCallStateDisplay(newState);
+ fr.changeCallState(SipCall.CALL_STATE_CURRENT);
+
} else if (newState.equals("HUNGUP")) {
- mCall.setCallState(SipCall.CALL_STATE_HUNGUP);
- setCallStateDisplay(newState);
- finish();
+// mCallPagerAdapter.remove(callID);
+
} else if (newState.equals("BUSY")) {
- mCall.setCallState(SipCall.CALL_STATE_BUSY);
- setCallStateDisplay(newState);
+// mCallPagerAdapter.remove(callID);
+
} else if (newState.equals("FAILURE")) {
- mCall.setCallState(SipCall.CALL_STATE_FAILURE);
- setCallStateDisplay(newState);
+// mCallPagerAdapter.remove(callID);
+
} else if (newState.equals("HOLD")) {
- mCall.setCallState(SipCall.CALL_STATE_HOLD);
- setCallStateDisplay(newState);
+ fr.changeCallState(SipCall.CALL_STATE_HOLD);
+
} else if (newState.equals("UNHOLD")) {
- mCall.setCallState(SipCall.CALL_STATE_CURRENT);
- setCallStateDisplay("CURRENT");
+ fr.changeCallState(SipCall.CALL_STATE_CURRENT);
+
} else {
- mCall.setCallState(SipCall.CALL_STATE_NONE);
- setCallStateDisplay(newState);
+ fr.changeCallState(SipCall.CALL_STATE_NONE);
+
}
Log.w(TAG, "processCallStateChangedSignal " + newState);
}
- private void setCallStateDisplay(String newState) {
- if (newState == null || newState.equals("NULL")) {
- newState = "INCOMING";
- }
+ @Override
+ public void incomingText(Intent msg) {
+ Toast.makeText(this, "New Call incoming", Toast.LENGTH_LONG).show();
- Log.w(TAG, "setCallStateDisplay " + newState);
-
- /*
- * mCall.printCallInfo();
- *
- * FragmentManager fm = getFragmentManager(); Fragment newf, f = fm.findFragmentByTag("call_fragment"); boolean replace = true; if
- * (newState.equals("INCOMING") && !(f instanceof IncomingCallFragment)) { newf = new IncomingCallFragment(); } else if
- * (!newState.equals("INCOMING") && !(f instanceof OngoingCallFragment)) { newf = new OngoingCallFragment(); } else { replace = false; newf =
- * f; }
- *
- * ((CallFragment) newf).setCall(mCall);
- *
- * if (replace) { FragmentTransaction ft = fm.beginTransaction(); if(f != null) // do not animate if there is no previous fragment
- * ft.setCustomAnimations(R.animator.slide_in, R.animator.slide_out); //ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
- * ft.replace(R.id.fragment_layout, newf, "call_fragment").commit(); }
- */
- }
-
- public void onCallAccepted() {
- mCall.notifyServiceAnswer(service);
- }
-
- public void onCallRejected() {
- if (mCall.notifyServiceHangup(service))
- finish();
- }
-
- public void onCallEnded() {
- if (mCall.notifyServiceHangup(service))
- finish();
- }
-
- public void onCallSuspended() {
- mCall.notifyServiceHold(service);
- }
-
- public void onCallResumed() {
- mCall.notifyServiceUnhold(service);
- }
-
- public void onCalltransfered(String to) {
- mCall.notifyServiceTransfer(service, to);
+ // TODO link text message to associate call and display it at the right place
}
- public void onRecordCall() {
- mCall.notifyServiceRecord(service);
-
- }
-
- public void onSendMessage(String msg) {
- mCall.notifyServiceSendMsg(service, msg);
-
+ @Override
+ public ISipService getService() {
+ return service;
}
}