* #40232: Add zrtp module in SipCall

SipCall keeps track of its security state, and store its SAS if needed.
This commit also introduce two new Fragments wrappers, for accounts and calls.
These wrappers reduce code duplication between fragments requiring hooks on daemon
signals.
diff --git a/src/org/sflphone/client/CallActivity.java b/src/org/sflphone/client/CallActivity.java
index fda7403..2f5de06 100644
--- a/src/org/sflphone/client/CallActivity.java
+++ b/src/org/sflphone/client/CallActivity.java
@@ -38,28 +38,24 @@
 import java.util.Timer;
 import java.util.TimerTask;
 
+import android.support.v4.app.FragmentActivity;
 import org.sflphone.R;
 import org.sflphone.fragments.CallFragment;
 import org.sflphone.fragments.IMFragment;
-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;
 import org.sflphone.model.SipMessage;
-import org.sflphone.receivers.CallReceiver;
-import org.sflphone.service.CallManagerCallBack;
 import org.sflphone.service.ISipService;
 import org.sflphone.service.SipService;
 import org.sflphone.utils.CallProximityManager;
 import org.sflphone.utils.CallProximityManager.ProximityDirector;
 import org.sflphone.views.CallPaneLayout;
 
-import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
 import android.content.ServiceConnection;
 import android.graphics.Color;
 import android.graphics.PixelFormat;
@@ -70,17 +66,18 @@
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.support.v4.widget.SlidingPaneLayout;
-import android.util.Log;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.Window;
 import android.view.WindowManager;
 
-public class CallActivity extends Activity implements CallInterface, IMFragment.Callbacks, CallFragment.Callbacks, ProximityDirector {
+public class CallActivity extends FragmentActivity implements IMFragment.Callbacks, CallFragment.Callbacks, ProximityDirector {
+
+    @SuppressWarnings("unused")
     static final String TAG = "CallActivity";
     private ISipService mService;
 
-    CallReceiver mReceiver;
+
 
     CallPaneLayout mSlidingPaneLayout;
 
@@ -97,7 +94,7 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_call_layout);
 
-        mReceiver = new CallReceiver(this);
+
 
         mProximityManager = new CallProximityManager(this, this);
 
@@ -131,23 +128,6 @@
         bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
     }
 
-    /* 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);
-        intentFilter.addAction(CallManagerCallBack.CONF_CREATED);
-        intentFilter.addAction(CallManagerCallBack.CONF_REMOVED);
-        intentFilter.addAction(CallManagerCallBack.CONF_CHANGED);
-        intentFilter.addAction(CallManagerCallBack.RECORD_STATE_CHANGED);
-        registerReceiver(mReceiver, intentFilter);
-
-        super.onResume();
-    }
-
     @Override
     public void onAttachedToWindow() {
         super.onAttachedToWindow();
@@ -184,7 +164,7 @@
 
     @Override
     protected void onDestroy() {
-        unregisterReceiver(mReceiver);
+
         unbindService(mConnection);
 
         mProximityManager.stopTracking();
@@ -251,7 +231,7 @@
             }
 
             mSlidingPaneLayout.setCurFragment(mCurrentCallFragment);
-            getFragmentManager().beginTransaction().replace(R.id.ongoingcall_pane, mCurrentCallFragment)
+            getSupportFragmentManager().beginTransaction().replace(R.id.ongoingcall_pane, mCurrentCallFragment)
                                                     .replace(R.id.message_list_frame, mIMFragment).commit();
 
         }
@@ -261,31 +241,6 @@
         }
     };
 
-    @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) {
-        if (mCurrentCallFragment != null) {
-            mCurrentCallFragment.changeCallState(callID, newState);
-        }
-        mProximityManager.updateProximitySensorMode();
-    }
-
-    @Override
-    public void incomingText(Intent in) {
-        Bundle b = in.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
-
-        if (mIMFragment != null) {
-            SipMessage msg = new SipMessage(true, b.getString("Msg"));
-            mIMFragment.putMessage(msg);
-        }
-
-    }
 
     @Override
     public ISipService getService() {
@@ -302,28 +257,6 @@
     }
 
     @Override
-    public void confCreated(Intent intent) {
-        // mCallsFragment.update();
-
-    }
-
-    @Override
-    public void confRemoved(Intent intent) {
-        // mCallsFragment.update();
-    }
-
-    @Override
-    public void confChanged(Intent intent) {
-        // mCallsFragment.update();
-    }
-
-    @Override
-    public void recordingChanged(Intent intent) {
-
-        Log.i(TAG, "RECORDING CHANGED");
-    }
-
-    @Override
     public void terminateCall() {
         mHandler.removeCallbacks(mUpdateTimeTask);
         mCurrentCallFragment.getBubbleView().stopThread();
@@ -336,7 +269,6 @@
         };
 
         new Timer().schedule(quit, 1000);
-
     }
 
     @Override
diff --git a/src/org/sflphone/fragments/AccountWrapperFragment.java b/src/org/sflphone/fragments/AccountWrapperFragment.java
new file mode 100644
index 0000000..7f1144a
--- /dev/null
+++ b/src/org/sflphone/fragments/AccountWrapperFragment.java
@@ -0,0 +1,73 @@
+package org.sflphone.fragments;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.util.Log;
+import org.sflphone.interfaces.AccountsInterface;
+import org.sflphone.service.ConfigurationManagerCallback;
+
+/**
+ * Created by lisional on 11/02/14.
+ */
+public class AccountWrapperFragment extends Fragment implements AccountsInterface {
+
+
+    private AccountsReceiver mReceiver;
+
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mReceiver = new AccountsReceiver();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();IntentFilter intentFilter = new IntentFilter();
+        IntentFilter intentFilter2 = new IntentFilter();
+        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
+        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
+        getActivity().registerReceiver(mReceiver, intentFilter);
+    }
+
+    @Override
+    public void accountsChanged() {
+
+    }
+
+    @Override
+    public void accountStateChanged(Intent accountState) {
+
+    }
+
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        getActivity().unregisterReceiver(mReceiver);
+    }
+
+    public class AccountsReceiver extends BroadcastReceiver {
+
+        private final String TAG = AccountsReceiver.class.getSimpleName();
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
+                Log.i(TAG, "Received" + intent.getAction());
+                accountStateChanged(intent);
+            } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
+                Log.i(TAG, "Received" + intent.getAction());
+                accountsChanged();
+
+            }
+
+        }
+    }
+
+
+}
\ No newline at end of file
diff --git a/src/org/sflphone/fragments/AccountsManagementFragment.java b/src/org/sflphone/fragments/AccountsManagementFragment.java
index 93114dc..7204808 100644
--- a/src/org/sflphone/fragments/AccountsManagementFragment.java
+++ b/src/org/sflphone/fragments/AccountsManagementFragment.java
@@ -32,54 +32,38 @@
 
 package org.sflphone.fragments;
 
-import java.io.File;
-import java.util.ArrayList;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.support.v4.app.ListFragment;
-import android.support.v4.app.LoaderManager;
-import android.support.v4.content.AsyncTaskLoader;
-import android.support.v4.content.Loader;
-import org.sflphone.R;
-import org.sflphone.client.AccountEditionActivity;
-import org.sflphone.client.AccountWizard;
-import org.sflphone.interfaces.AccountsInterface;
-import org.sflphone.loaders.AccountsLoader;
-import org.sflphone.loaders.LoaderConstants;
-import org.sflphone.model.Account;
-import org.sflphone.receivers.AccountsReceiver;
-import org.sflphone.service.ConfigurationManagerCallback;
-import org.sflphone.service.ISipService;
-import org.sflphone.views.dragsortlv.DragSortListView;
-
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
 import android.os.RemoteException;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.AsyncTaskLoader;
+import android.support.v4.content.Loader;
 import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
+import android.view.*;
 import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
+import android.widget.*;
 import android.widget.AdapterView.OnItemClickListener;
-import android.widget.BaseAdapter;
-import android.widget.CheckBox;
-import android.widget.ListView;
-import android.widget.TextView;
+import org.sflphone.R;
+import org.sflphone.client.AccountEditionActivity;
+import org.sflphone.client.AccountWizard;
+import org.sflphone.loaders.AccountsLoader;
+import org.sflphone.loaders.LoaderConstants;
+import org.sflphone.model.Account;
+import org.sflphone.service.ISipService;
+import org.sflphone.views.dragsortlv.DragSortListView;
 
-public class AccountsManagementFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Bundle>, AccountsInterface {
+import java.io.File;
+import java.util.ArrayList;
+
+public class AccountsManagementFragment extends AccountWrapperFragment implements LoaderManager.LoaderCallbacks<Bundle> {
     static final String TAG = "AccountManagementFragment";
     static final String DEFAULT_ACCOUNT_ID = "IP2IP";
     static final int ACCOUNT_CREATE_REQUEST = 1;
     public static final int ACCOUNT_EDIT_REQUEST = 2;
-    AccountsReceiver accountReceiver;
     AccountsAdapter mAccountsAdapter;
     AccountsAdapter mIP2IPAdapter;
 
@@ -144,7 +128,6 @@
         mAccountsAdapter = new AccountsAdapter(getActivity(), new ArrayList<Account>());
         mIP2IPAdapter = new AccountsAdapter(getActivity(), new ArrayList<Account>());
         this.setHasOptionsMenu(true);
-        accountReceiver = new AccountsReceiver(this);
 
         mShortAnimationDuration = getResources().getInteger(android.R.integer.config_mediumAnimTime);
         Log.i(TAG, "anim time: " + mShortAnimationDuration);
@@ -154,21 +137,16 @@
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
         View inflatedView = inflater.inflate(R.layout.frag_accounts_list, parent, false);
-        setListAdapter(mAccountsAdapter);
+        ((ListView)inflatedView.findViewById(R.id.accounts_list)).setAdapter(mAccountsAdapter);
 
         return inflatedView;
     }
 
     @Override
-    public DragSortListView getListView() {
-        return (DragSortListView) super.getListView();
-    }
-
-    @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
-        mDnDListView = getListView();
+        mDnDListView = (DragSortListView) getView().findViewById(R.id.accounts_list);
 
         mDnDListView.setDropListener(onDrop);
         mDnDListView.setOnItemClickListener(new OnItemClickListener() {
@@ -195,15 +173,11 @@
     @Override
     public void onPause() {
         super.onPause();
-        getActivity().unregisterReceiver(accountReceiver);
     }
 
     public void onResume() {
         super.onResume();
-        IntentFilter intentFilter2 = new IntentFilter();
-        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
-        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
-        getActivity().registerReceiver(accountReceiver, intentFilter2);
+
         getLoaderManager().restartLoader(LoaderConstants.ACCOUNTS_LOADER, null, this);
         getActivity().getActionBar().setTitle(R.string.menu_item_accounts);
     }
diff --git a/src/org/sflphone/fragments/CallFragment.java b/src/org/sflphone/fragments/CallFragment.java
index 04b2e21..1436954 100644
--- a/src/org/sflphone/fragments/CallFragment.java
+++ b/src/org/sflphone/fragments/CallFragment.java
@@ -31,62 +31,46 @@
 
 package org.sflphone.fragments;
 
-import java.util.ArrayList;
-import java.util.Locale;
-
-import android.content.BroadcastReceiver;
-import android.content.IntentFilter;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
-import org.sflphone.R;
-import org.sflphone.model.Attractor;
-import org.sflphone.model.Bubble;
-import org.sflphone.model.BubbleContact;
-import org.sflphone.model.BubbleModel;
-import org.sflphone.model.BubbleUser;
-import org.sflphone.model.BubblesView;
-import org.sflphone.model.CallContact;
-import org.sflphone.model.Conference;
-import org.sflphone.model.SipCall;
-import org.sflphone.service.ISipService;
-
 import android.app.Activity;
-import android.app.Fragment;
-import android.app.FragmentManager;
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.PointF;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.os.PowerManager;
-import android.os.RemoteException;
 import android.os.PowerManager.WakeLock;
+import android.os.RemoteException;
+import android.support.v4.app.FragmentManager;
 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.*;
 import android.view.SurfaceHolder.Callback;
-import android.view.View;
 import android.view.View.OnClickListener;
-import android.view.ViewGroup;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.CompoundButton;
 import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.ImageButton;
 import android.widget.TextView;
 import android.widget.ToggleButton;
+import org.sflphone.R;
+import org.sflphone.interfaces.CallInterface;
+import org.sflphone.model.*;
+import org.sflphone.service.ISipService;
 
-public class CallFragment extends Fragment implements Callback {
+import java.util.ArrayList;
+import java.util.Locale;
+
+public class CallFragment extends CallableWrapperFragment implements CallInterface, Callback {
 
     static final String TAG = "CallFragment";
 
     float BUBBLE_SIZE = 75;
     static final float ATTRACTOR_SIZE = 40;
 
+
     public static final int REQUEST_TRANSFER = 10;
 
     private Conference conf;
@@ -94,6 +78,7 @@
     private TextView callStatusTxt;
     private ToggleButton speakers;
 
+
     private PowerManager powerManager;
     // Screen wake lock for incoming call
     private WakeLock wakeLock;
@@ -131,6 +116,7 @@
                 "org.sflphone.onIncomingCall");
         wakeLock.setReferenceCounted(false);
 
+
         Log.d(TAG, "Acquire wake up lock");
         if (wakeLock != null && !wakeLock.isHeld()) {
             wakeLock.acquire();
@@ -251,9 +237,36 @@
     }
 
     @Override
+    public void callStateChanged(Intent callState) {
+        Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
+        changeCallState(b.getString("CallID"), b.getString("State"));
+    }
+
+    @Override
+    public void recordingChanged(Intent intent) {
+
+    }
+
+    @Override
+    public void secureZrtpOn(Intent intent) {
+        Log.i(TAG, "secureZrtpOn");
+        //enableSASButton();
+    }
+
+    @Override
+    public void secureZrtpOff(Intent intent) {
+        Log.i(TAG, "secureZrtpOff");
+    }
+
+    @Override
+    public void displaySAS(Intent intent) {
+        Log.i(TAG, "displaySAS");
+    }
+
+    @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
-        SipCall transfer = null;
+        SipCall transfer;
         if (requestCode == REQUEST_TRANSFER) {
             switch (resultCode) {
             case TransferDFragment.RESULT_TRANSFER_CONF:
@@ -314,7 +327,7 @@
             }
         });
 
-        ((ImageButton) rootView.findViewById(R.id.dialpad_btn)).setOnClickListener(new OnClickListener() {
+        rootView.findViewById(R.id.dialpad_btn).setOnClickListener(new OnClickListener() {
 
             @Override
             public void onClick(View v) {
@@ -334,8 +347,7 @@
         getBubbleForUser(conf, model.width / 2, model.height / 2);
 
         int angle_part = 360 / conf.getParticipants().size();
-        double dX = 0;
-        double dY = 0;
+        double dX, dY;
         int radiusCalls = (int) (model.width / 2 - BUBBLE_SIZE);
         for (int i = 0; i < conf.getParticipants().size(); ++i) {
 
@@ -394,8 +406,7 @@
 
         // TODO off-thread image loading
         int angle_part = 360 / conf.getParticipants().size();
-        double dX = 0;
-        double dY = 0;
+        double dX, dY;
         int radiusCalls = (int) (model.width / 2 - BUBBLE_SIZE);
         for (int i = 0; i < conf.getParticipants().size(); ++i) {
             dX = Math.cos(Math.toRadians(angle_part * i - 90)) * radiusCalls;
diff --git a/src/org/sflphone/fragments/CallListFragment.java b/src/org/sflphone/fragments/CallListFragment.java
index 9aae4b2..86e67ea 100644
--- a/src/org/sflphone/fragments/CallListFragment.java
+++ b/src/org/sflphone/fragments/CallListFragment.java
@@ -35,10 +35,8 @@
 import android.content.ClipData.Item;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
 import android.graphics.Color;
 import android.os.*;
-import android.support.v4.app.Fragment;
 import android.util.Log;
 import android.view.DragEvent;
 import android.view.LayoutInflater;
@@ -52,10 +50,7 @@
 import org.sflphone.R;
 import org.sflphone.client.CallActivity;
 import org.sflphone.client.HomeActivity;
-import org.sflphone.interfaces.CallInterface;
 import org.sflphone.model.Conference;
-import org.sflphone.receivers.CallReceiver;
-import org.sflphone.service.CallManagerCallBack;
 import org.sflphone.service.ISipService;
 
 import java.util.ArrayList;
@@ -63,14 +58,13 @@
 import java.util.Observable;
 import java.util.Observer;
 
-public class CallListFragment extends Fragment implements CallInterface {
+public class CallListFragment extends CallableWrapperFragment {
 
     private static final String TAG = CallListFragment.class.getSimpleName();
 
     private Callbacks mCallbacks = sDummyCallbacks;
     private TextView mConversationsTitleTextView;
     CallListAdapter mConferenceAdapter;
-    CallReceiver mCallReceiver;
 
     public static final int REQUEST_TRANSFER = 10;
     public static final int REQUEST_CONF = 20;
@@ -128,7 +122,8 @@
 
     @Override
     public void recordingChanged(Intent intent) {
-
+        Log.i(TAG, "confChanged");
+        updateLists();
     }
 
     /**
@@ -168,11 +163,6 @@
     @Override
     public void onResume() {
         super.onResume();
-        IntentFilter intentFilter = new IntentFilter();
-        intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
-        intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
-        intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
-        getActivity().registerReceiver(mCallReceiver, intentFilter);
         if (mCallbacks.getService() != null) {
 
             updateLists();
@@ -206,14 +196,12 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mCallReceiver = new CallReceiver(this);
     }
 
     @Override
     public void onPause() {
         super.onPause();
         mHandler.removeCallbacks(mUpdateTimeTask);
-        getActivity().unregisterReceiver(mCallReceiver);
     }
 
     @Override
diff --git a/src/org/sflphone/fragments/CallableWrapperFragment.java b/src/org/sflphone/fragments/CallableWrapperFragment.java
new file mode 100644
index 0000000..fc6b732
--- /dev/null
+++ b/src/org/sflphone/fragments/CallableWrapperFragment.java
@@ -0,0 +1,132 @@
+package org.sflphone.fragments;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import org.sflphone.interfaces.CallInterface;
+import org.sflphone.service.CallManagerCallBack;
+
+/**
+ * Created by lisional on 10/02/14.
+ */
+public abstract class CallableWrapperFragment extends Fragment implements CallInterface {
+
+
+    private CallReceiver mReceiver;
+
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mReceiver = new CallReceiver();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
+        intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
+        intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
+        intentFilter.addAction(CallManagerCallBack.CONF_CREATED);
+        intentFilter.addAction(CallManagerCallBack.CONF_REMOVED);
+        intentFilter.addAction(CallManagerCallBack.CONF_CHANGED);
+        intentFilter.addAction(CallManagerCallBack.RECORD_STATE_CHANGED);
+        intentFilter.addAction(CallManagerCallBack.ZRTP_OFF);
+        intentFilter.addAction(CallManagerCallBack.ZRTP_ON);
+        intentFilter.addAction(CallManagerCallBack.DISPLAY_SAS);
+        getActivity().registerReceiver(mReceiver, intentFilter);
+    }
+
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        getActivity().unregisterReceiver(mReceiver);
+    }
+
+    @Override
+    public void callStateChanged(Intent callState) {
+
+    }
+
+    @Override
+    public void incomingText(Intent msg) {
+
+    }
+
+    @Override
+    public void confCreated(Intent intent) {
+
+    }
+
+    @Override
+    public void confRemoved(Intent intent) {
+
+    }
+
+    @Override
+    public void confChanged(Intent intent) {
+
+    }
+
+    @Override
+    public void recordingChanged(Intent intent) {
+
+    }
+
+    @Override
+    public void secureZrtpOn(Intent intent) {
+
+    }
+
+    @Override
+    public void secureZrtpOff(Intent intent) {
+
+    }
+
+    @Override
+    public void displaySAS(Intent intent) {
+
+    }
+
+    public class CallReceiver extends BroadcastReceiver {
+
+        private final String TAG = CallReceiver.class.getSimpleName();
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
+                incomingText(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
+                callStateChanged(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
+                confCreated(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
+                confRemoved(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
+                confChanged(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
+                recordingChanged(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.ZRTP_OFF)) {
+                secureZrtpOff(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.ZRTP_ON)) {
+                secureZrtpOn(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.DISPLAY_SAS)) {
+                displaySAS(intent);
+            } else {
+                Log.e(TAG, "Unknown action: " + intent.getAction());
+            }
+
+        }
+
+    }
+
+
+}
\ No newline at end of file
diff --git a/src/org/sflphone/fragments/IMFragment.java b/src/org/sflphone/fragments/IMFragment.java
index cc57d3f..6ec7e39 100644
--- a/src/org/sflphone/fragments/IMFragment.java
+++ b/src/org/sflphone/fragments/IMFragment.java
@@ -37,7 +37,6 @@
 import org.sflphone.service.ISipService;
 
 import android.app.Activity;
-import android.app.Fragment;
 import android.content.Intent;
 import android.os.Bundle;
 import android.util.Log;
@@ -49,7 +48,7 @@
 import android.view.inputmethod.EditorInfo;
 import android.widget.TextView.OnEditorActionListener;
 
-public class IMFragment extends Fragment {
+public class IMFragment extends CallableWrapperFragment {
     static final String TAG = IMFragment.class.getSimpleName();
 
     private Callbacks mCallbacks = sDummyCallbacks;
@@ -67,6 +66,14 @@
 
     }
 
+    @Override
+    public void incomingText(Intent in) {
+        Bundle b = in.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
+        SipMessage msg = new SipMessage(true, b.getString("Msg"));
+        putMessage(msg);
+    }
+
+
     /**
      * A dummy implementation of the {@link Callbacks} interface that does nothing. Used only when this fragment is not attached to an activity.
      */
@@ -86,7 +93,6 @@
 
     /**
      * The Activity calling this fragment has to implement this interface
-     * 
      */
     public interface Callbacks {
         public ISipService getService();
@@ -141,14 +147,13 @@
         });
 
 
-
         return rootView;
     }
 
     private void sendMessage() {
         if (sendTextField.getText().toString().length() > 0) {
             SipMessage toSend = new SipMessage(false, sendTextField.getText().toString());
-            if(mCallbacks.sendIM(toSend)){
+            if (mCallbacks.sendIM(toSend)) {
                 putMessage(toSend);
                 sendTextField.setText("");
             } else {
@@ -158,7 +163,6 @@
     }
 
 
-
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
diff --git a/src/org/sflphone/fragments/MenuFragment.java b/src/org/sflphone/fragments/MenuFragment.java
index e097505..dde43fd 100644
--- a/src/org/sflphone/fragments/MenuFragment.java
+++ b/src/org/sflphone/fragments/MenuFragment.java
@@ -30,50 +30,40 @@
  */
 package org.sflphone.fragments;
 
-import java.util.ArrayList;
-
-import android.support.v4.app.Fragment;
-import android.support.v4.app.LoaderManager;
-import android.support.v4.content.AsyncTaskLoader;
-import android.support.v4.content.Loader;
-import android.util.Log;
-import org.sflphone.R;
-import org.sflphone.adapters.AccountSelectionAdapter;
-import org.sflphone.adapters.ContactPictureTask;
-import org.sflphone.interfaces.AccountsInterface;
-import org.sflphone.loaders.AccountsLoader;
-import org.sflphone.loaders.LoaderConstants;
-import org.sflphone.model.Account;
-import org.sflphone.model.CallContact;
-import org.sflphone.receivers.AccountsReceiver;
-import org.sflphone.service.ConfigurationManagerCallback;
-import org.sflphone.service.ISipService;
-
 import android.app.Activity;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.Bundle;
 import android.os.RemoteException;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.AsyncTaskLoader;
+import android.support.v4.content.Loader;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.AdapterView;
+import android.widget.*;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.AdapterView.OnItemSelectedListener;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.Spinner;
-import android.widget.TextView;
+import org.sflphone.R;
+import org.sflphone.adapters.AccountSelectionAdapter;
+import org.sflphone.adapters.ContactPictureTask;
+import org.sflphone.loaders.AccountsLoader;
+import org.sflphone.loaders.LoaderConstants;
+import org.sflphone.model.Account;
+import org.sflphone.model.CallContact;
+import org.sflphone.service.ConfigurationManagerCallback;
+import org.sflphone.service.ISipService;
 
-public class MenuFragment extends Fragment implements LoaderManager.LoaderCallbacks<Bundle>, AccountsInterface {
+import java.util.ArrayList;
+
+public class MenuFragment extends AccountWrapperFragment implements LoaderManager.LoaderCallbacks<Bundle> {
 
     @SuppressWarnings("unused")
     private static final String TAG = MenuFragment.class.getSimpleName();
 
     AccountSelectionAdapter mAccountAdapter;
     private Spinner spinnerAccounts;
-    AccountsReceiver accountReceiver;
     private Callbacks mCallbacks = sDummyCallbacks;
 
     private ListView sections;
@@ -127,17 +117,12 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        accountReceiver = new AccountsReceiver(this);
     }
 
     public void onResume() {
         super.onResume();
 
         Log.i(TAG, "Resuming");
-        IntentFilter intentFilter2 = new IntentFilter();
-        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
-        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
-        getActivity().registerReceiver(accountReceiver, intentFilter2);
         getLoaderManager().restartLoader(LoaderConstants.ACCOUNTS_LOADER, null, this);
 
     }
@@ -153,7 +138,6 @@
     @Override
     public void onPause() {
         super.onPause();
-        getActivity().unregisterReceiver(accountReceiver);
     }
 
     @Override
diff --git a/src/org/sflphone/fragments/TransferDFragment.java b/src/org/sflphone/fragments/TransferDFragment.java
index ff925f8..6c8bee9 100644
--- a/src/org/sflphone/fragments/TransferDFragment.java
+++ b/src/org/sflphone/fragments/TransferDFragment.java
@@ -35,6 +35,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import android.app.Dialog;
+import android.support.v4.app.DialogFragment;
 import org.sflphone.R;
 import org.sflphone.loaders.ContactsLoader;
 import org.sflphone.model.Conference;
@@ -42,8 +44,6 @@
 
 import android.app.Activity;
 import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
 import android.app.LoaderManager;
 import android.content.Context;
 import android.content.DialogInterface;
diff --git a/src/org/sflphone/interfaces/CallInterface.java b/src/org/sflphone/interfaces/CallInterface.java
index e7a9145..708d59e 100644
--- a/src/org/sflphone/interfaces/CallInterface.java
+++ b/src/org/sflphone/interfaces/CallInterface.java
@@ -46,5 +46,14 @@
     public void confChanged(Intent intent);
     
     public void recordingChanged(Intent intent);
+
+    public void secureZrtpOn(Intent intent);
+
+    public void secureZrtpOff(Intent intent);
+
+    public void displaySAS(Intent intent);
+
+
+
     
 }
diff --git a/src/org/sflphone/model/SipCall.java b/src/org/sflphone/model/SipCall.java
index 7aa83be..1a9c297 100644
--- a/src/org/sflphone/model/SipCall.java
+++ b/src/org/sflphone/model/SipCall.java
@@ -52,6 +52,15 @@
     private int mCallType;
     private int mCallState = state.CALL_STATE_NONE;
 
+    private boolean isSecured;
+    private String SAS;
+    private boolean confirmedSAS;
+
+
+    public boolean isSecured() {
+        return isSecured;
+    }
+
     /**
      * *********************
      * Construtors
@@ -68,6 +77,9 @@
         mCallState = in.readInt();
         timestampStart_ = in.readLong();
         timestampEnd_ = in.readLong();
+        SAS = in.readString();
+        confirmedSAS = in.readByte() == 1;
+        isSecured = in.readByte() == 1;
     }
 
     private SipCall(String id, Account account, int call_type, int call_state, CallContact c) {
@@ -90,6 +102,10 @@
         return mCallType;
     }
 
+    public void setSecured(boolean secured) {
+        isSecured = secured;
+    }
+
     public interface direction {
         public static final int CALL_TYPE_INCOMING = 1;
         public static final int CALL_TYPE_OUTGOING = 2;
@@ -123,6 +139,9 @@
         out.writeInt(mCallState);
         out.writeLong(timestampStart_);
         out.writeLong(timestampEnd_);
+        out.writeString(SAS);
+        out.writeByte((byte) (confirmedSAS ? 1 : 0));
+        out.writeByte((byte) (isSecured ? 1 : 0));
     }
 
     public static final Parcelable.Creator<SipCall> CREATOR = new Parcelable.Creator<SipCall>() {
@@ -355,4 +374,20 @@
     public boolean isCurrent() {
         return mCallState == state.CALL_STATE_CURRENT;
     }
+
+    public boolean isConfirmedSAS() {
+        return confirmedSAS;
+    }
+
+    public void setConfirmedSAS(boolean confirmedSAS) {
+        this.confirmedSAS = confirmedSAS;
+    }
+
+    public String getSAS() {
+        return SAS;
+    }
+
+    public void setSAS(String SAS) {
+        this.SAS = SAS;
+    }
 }
diff --git a/src/org/sflphone/receivers/AccountsReceiver.java b/src/org/sflphone/receivers/AccountsReceiver.java
deleted file mode 100644
index 23c5b6c..0000000
--- a/src/org/sflphone/receivers/AccountsReceiver.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (C) 2004-2014 Savoir-Faire Linux Inc.
- *
- *  Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *  Additional permission under GNU GPL version 3 section 7:
- *
- *  If you modify this program, or any covered work, by linking or
- *  combining it with the OpenSSL project's OpenSSL library (or a
- *  modified version of that library), containing parts covered by the
- *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
- *  grants you additional permission to convey the resulting work.
- *  Corresponding Source for a non-source form of such a combination
- *  shall include the source code for the parts of OpenSSL used as well
- *  as that of the covered work.
- */
-package org.sflphone.receivers;
-
-import org.sflphone.interfaces.AccountsInterface;
-import org.sflphone.service.ConfigurationManagerCallback;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.util.Log;
-
-public class AccountsReceiver extends BroadcastReceiver {
-
-    static final String TAG = AccountsReceiver.class.getSimpleName();
-
-    AccountsInterface callback;
-
-    public AccountsReceiver(AccountsInterface client) {
-        callback = client;
-    }
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
-            Log.i(TAG, "Received" + intent.getAction());
-            callback.accountStateChanged(intent);
-        } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
-            Log.i(TAG, "Received" + intent.getAction());
-            callback.accountsChanged();
-
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/src/org/sflphone/receivers/CallReceiver.java b/src/org/sflphone/receivers/CallReceiver.java
deleted file mode 100644
index 27848a7..0000000
--- a/src/org/sflphone/receivers/CallReceiver.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (C) 2004-2014 Savoir-Faire Linux Inc.
- *
- *  Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *  Additional permission under GNU GPL version 3 section 7:
- *
- *  If you modify this program, or any covered work, by linking or
- *  combining it with the OpenSSL project's OpenSSL library (or a
- *  modified version of that library), containing parts covered by the
- *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
- *  grants you additional permission to convey the resulting work.
- *  Corresponding Source for a non-source form of such a combination
- *  shall include the source code for the parts of OpenSSL used as well
- *  as that of the covered work.
- */
-package org.sflphone.receivers;
-
-import org.sflphone.interfaces.CallInterface;
-import org.sflphone.service.CallManagerCallBack;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.util.Log;
-
-public class CallReceiver extends BroadcastReceiver {
-
-    static final String TAG = CallReceiver.class.getSimpleName();
-
-    CallInterface callback;
-
-    public CallReceiver(CallInterface client) {
-        callback = client;
-    }
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
-            callback.incomingText(intent);
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
-            callback.callStateChanged(intent);
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
-            callback.confCreated(intent);
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
-            callback.confRemoved(intent);
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
-            callback.confChanged(intent);
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
-            callback.recordingChanged(intent);
-        } else {
-            Log.e(TAG, "Unknown action: " + intent.getAction());
-        }
-
-    }
-
-}
diff --git a/src/org/sflphone/service/CallManagerCallBack.java b/src/org/sflphone/service/CallManagerCallBack.java
index 6b67e24..093b10e 100644
--- a/src/org/sflphone/service/CallManagerCallBack.java
+++ b/src/org/sflphone/service/CallManagerCallBack.java
@@ -24,6 +24,10 @@
     static public final String CONF_CHANGED = "conf_changed";
     static public final String RECORD_STATE_CHANGED = "record_state";
 
+    static public final String ZRTP_ON = "secure_zrtp_on";
+    static public final String ZRTP_OFF = "secure_zrtp_off";
+    static public final String DISPLAY_SAS = "display_sas";
+
 
     public CallManagerCallBack(SipService context) {
         mService = context;
@@ -303,17 +307,34 @@
     @Override
     public void on_secure_zrtp_on(String callID, String cipher) {
         Log.i(TAG, "on_secure_zrtp_on");
+        SipCall call = mService.getCallById(callID);
+        call.setSecured(true);
+        Intent intent = new Intent(ZRTP_ON);
+        intent.putExtra("callID", callID);
+        mService.sendBroadcast(intent);
     }
 
     @Override
     public void on_secure_zrtp_off(String callID) {
         Log.i(TAG, "on_secure_zrtp_off");
+        SipCall call = mService.getCallById(callID);
+        call.setSecured(false);
+        Intent intent = new Intent(ZRTP_OFF);
+        intent.putExtra("callID", callID);
+        mService.sendBroadcast(intent);
+
     }
 
     @Override
     public void on_show_sas(String callID, String sas, boolean verified) {
         Log.i(TAG, "on_show_sas:"+ sas);
         Log.i(TAG, "SAS Verified:"+ verified);
+        SipCall call = mService.getCallById(callID);
+        call.setSAS(sas);
+        call.setConfirmedSAS(verified);
+        Intent intent = new Intent(DISPLAY_SAS);
+        intent.putExtra("callID", callID);
+        mService.sendBroadcast(intent);
     }
 
     @Override
diff --git a/src/org/sflphone/service/SipService.java b/src/org/sflphone/service/SipService.java
index 1d9a5d1..d381b10 100644
--- a/src/org/sflphone/service/SipService.java
+++ b/src/org/sflphone/service/SipService.java
@@ -185,6 +185,22 @@
         return mExecutor;
     }
 
+    public SipCall getCallById(String callID) {
+        if (getConferences().get(callID) != null) {
+            return getConferences().get(callID).getCallById(callID);
+        } else {
+            // Check if call is in a conference
+            Iterator<Map.Entry<String, Conference>> it = getConferences().entrySet().iterator();
+            while (it.hasNext()) {
+                Conference tmp = it.next().getValue();
+                SipCall c = tmp.getCallById(callID);
+                if(c != null)
+                     return c;
+            }
+        }
+        return null;
+    }
+
     // Executes immediate tasks in a single executorThread.
     public static class SipServiceExecutor extends Handler {