Merged AccountCreationActivity and AccountPreferenceActivity (redundant)
Fixed issues in account edition
Added layouts for action bar menus (+ icons)
diff --git a/src/com/savoirfairelinux/sflphone/client/AccountCreationActivity.java b/src/com/savoirfairelinux/sflphone/client/AccountCreationActivity.java
deleted file mode 100644
index 93de02e..0000000
--- a/src/com/savoirfairelinux/sflphone/client/AccountCreationActivity.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- *  Copyright (C) 2004-2012 Savoir-Faire Linux Inc.
- *
- *  Author: Alexandre Savard <alexandre.savard@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 com.savoirfairelinux.sflphone.client;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.preference.CheckBoxPreference;
-import android.preference.EditTextPreference;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceManager;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-
-import com.savoirfairelinux.sflphone.R;
-import com.savoirfairelinux.sflphone.account.AccountDetail;
-import com.savoirfairelinux.sflphone.account.AccountDetailAdvanced;
-import com.savoirfairelinux.sflphone.account.AccountDetailBasic;
-import com.savoirfairelinux.sflphone.account.AccountDetailSrtp;
-import com.savoirfairelinux.sflphone.account.AccountDetailTls;
-import com.savoirfairelinux.sflphone.service.ISipService;
-import com.savoirfairelinux.sflphone.service.SipService;
-
-public class AccountCreationActivity extends PreferenceActivity
-{
-    static final String TAG = "SFLPhonePreferenceActivity";
-    private ISipService service;
-    private boolean mBound = false;
-    private PreferenceManager mPreferenceManager = null;
-    private AccountDetailBasic basicDetails;
-    private AccountDetailAdvanced advancedDetails;
-    private AccountDetailSrtp srtpDetails;
-    private AccountDetailTls tlsDetails;
-    private MenuItem createAccountAction = null;
-    private ArrayList<String> requiredFields = null;
-
-    Preference.OnPreferenceChangeListener changeNewAccountPreferenceListener = new Preference.OnPreferenceChangeListener() {
-        public boolean onPreferenceChange(Preference preference, Object newValue) {
-            preference.setSummary(getString(R.string.account_current_value_label) + (CharSequence)newValue);
-            return true;
-        }
-    };
-
-    Preference.OnPreferenceChangeListener changeNewAccountTwoStateListener = new Preference.OnPreferenceChangeListener() {
-        public boolean onPreferenceChange(Preference preference, Object newValue) {
-            return true;
-        } 
-    };
-
-    private ServiceConnection mConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName className, IBinder binder) {
-            service = ISipService.Stub.asInterface(binder);
-            mBound = true;
-            Log.d(TAG, "Service connected");
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName arg0) {
-            mBound = false;
-            Log.d(TAG, "Service disconnected");
-        }
-    };
-
-    public AccountCreationActivity()
-    {
-        basicDetails = new AccountDetailBasic();
-        advancedDetails = new AccountDetailAdvanced();
-        srtpDetails = new AccountDetailSrtp();
-        tlsDetails = new AccountDetailTls();
-
-        requiredFields = new ArrayList<String>();
-
-        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_ALIAS);
-        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_HOSTNAME);
-        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME);
-        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD);
-    }
-
-    private AlertDialog createAlertDialog()
-    {
-        Activity ownerActivity = this;
-        AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
-        builder.setMessage("All parameters will be lost").setTitle("Account Creation")
-               .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                        Activity activity = ((Dialog)dialog).getOwnerActivity();
-                        activity.finish();
-                    }
-                })
-                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                        /* Terminate with no action */
-                    }
-                });
-
-        AlertDialog alertDialog = builder.create();
-        alertDialog.setOwnerActivity(ownerActivity);
-
-        return alertDialog;
-    }
-
-    private AlertDialog createCouldNotValidateDialog(ArrayList<String> missingValue)
-    {
-        String message = "The following parameters are missing:";
-
-        for(String s : missingValue)
-            message += "\n    - " + s;
-
-        Activity ownerActivity = this;
-        AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
-        builder.setMessage(message).setTitle("Missing Parameters")
-               .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
-                   public void onClick(DialogInterface dialog, int whichButton) {
-                       /* Nothing to be done */
-                   }
-               });
-
-        AlertDialog alertDialog = builder.create();
-        return alertDialog;
-    }
-
-    public boolean validateAccountCreation(ArrayList<String> missingValue)
-    {
-        boolean valid = true;
-
-        for(String s : requiredFields) {
-            EditTextPreference pref = (EditTextPreference)mPreferenceManager.findPreference(s);
-            Log.i(TAG, "Looking for " + s);
-            if(pref.getText().isEmpty()) {
-                Log.i(TAG, "    INVALIDATED " + s + " " + pref.getText() + ";");
-                valid = false;
-                missingValue.add(pref.getTitle().toString());
-            }
-        }
-
-        return valid;
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        addPreferencesFromResource(R.xml.account_creation_preferences);
-        mPreferenceManager = getPreferenceManager();
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        createAccountAction = menu.add("Create Account");
-        createAccountAction.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        ArrayList<String> missingValue = new ArrayList<String>();
-        if(validateAccountCreation(missingValue)) {
-            createNewAccount();
-            finish();
-        }
-        else {
-            AlertDialog dialog = createCouldNotValidateDialog(missingValue);
-            dialog.show();
-        }
-
-        return true;
-    }
-
-    private void addPreferenceListener(AccountDetail details) {
-        for(AccountDetail.PreferenceEntry p : details.getDetailValues()) {
-            Preference pref = mPreferenceManager.findPreference(p.mKey);
-            if(pref != null) {
-                if(!p.isTwoState) {
-                    pref.setOnPreferenceChangeListener(changeNewAccountPreferenceListener);
-                }
-            }
-        }
-    }
-
-    @Override
-    protected void onStart() {
-        super.onStart();
-
-        addPreferenceListener(basicDetails);
-        addPreferenceListener(advancedDetails);
-        addPreferenceListener(srtpDetails);
-        addPreferenceListener(tlsDetails);
- 
-        if(!mBound) {
-            Log.i(TAG, "onStart: Binding service...");
-            Intent intent = new Intent(this, SipService.class);
-            bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
-        }
-    }
-
-    @Override
-    protected void onStop() {
-        super.onStop();
-
-        if(mBound) {
-            Log.i(TAG, "onStop: Unbinding service...");
-            unbindService(mConnection);
-            mBound = false;
-        }
-    }
-
-    @Override
-    public void onBackPressed() {
-
-        AlertDialog dialog = createAlertDialog();
-        dialog.show();
-    }
-
-    private void updateAccountDetails(HashMap<String, String> accountDetails, AccountDetail det) {
-        for(AccountDetail.PreferenceEntry p : det.getDetailValues()) {
-            Preference pref = mPreferenceManager.findPreference(p.mKey);
-            if(pref != null) {
-                if(p.isTwoState) {
-                    CheckBoxPreference boxPref = (CheckBoxPreference) pref;
-                    accountDetails.put(p.mKey, boxPref.isChecked() ? "true" : "false");
-                }
-                else {
-                    EditTextPreference textPref = (EditTextPreference) pref;
-                    accountDetails.put(p.mKey, textPref.getText());
-                }
-            }
-        }
-    }
-
-    private void createNewAccount() {
-
-        HashMap<String, String> accountDetails = new HashMap<String, String>();
-
-        updateAccountDetails(accountDetails, basicDetails);
-        updateAccountDetails(accountDetails, advancedDetails);
-        updateAccountDetails(accountDetails, srtpDetails);
-        updateAccountDetails(accountDetails, tlsDetails);
-
-        try {
-            Log.i(TAG, "ADD ACCOUNT");
-            service.addAccount(accountDetails);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Cannot call service method", e);
-        }
-    }
-}
diff --git a/src/com/savoirfairelinux/sflphone/client/AccountPreferenceActivity.java b/src/com/savoirfairelinux/sflphone/client/AccountPreferenceActivity.java
index 72c8efd..a11b80c 100644
--- a/src/com/savoirfairelinux/sflphone/client/AccountPreferenceActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/AccountPreferenceActivity.java
@@ -31,24 +31,23 @@
 
 package com.savoirfairelinux.sflphone.client;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.content.ComponentName;
-import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
+import android.preference.CheckBoxPreference;
+import android.preference.EditTextPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceManager;
-import android.preference.PreferenceScreen;
-import android.preference.EditTextPreference;
-import android.preference.CheckBoxPreference;
 import android.util.Log;
 import android.view.Menu;
+import android.view.MenuInflater;
 import android.view.MenuItem;
 
 import com.savoirfairelinux.sflphone.R;
@@ -57,49 +56,73 @@
 import com.savoirfairelinux.sflphone.account.AccountDetailBasic;
 import com.savoirfairelinux.sflphone.account.AccountDetailSrtp;
 import com.savoirfairelinux.sflphone.account.AccountDetailTls;
-import com.savoirfairelinux.sflphone.account.AccountDetailsHandler;
 
-import java.util.HashMap;
-import java.util.ArrayList;
-
-public class AccountPreferenceActivity extends PreferenceActivity
-{
+public class AccountPreferenceActivity extends PreferenceActivity {
     private static final String TAG = "AccoutPreferenceActivity";
-    public static final int ACCOUNT_MODIFIED = Activity.RESULT_FIRST_USER + 0;
-    public static final int ACCOUNT_NOT_MODIFIED = Activity.RESULT_FIRST_USER + 1;
-    public static final int ACCOUNT_DELETED = Activity.RESULT_FIRST_USER + 2;
+
+    public static final String KEY_MODE = "mode";
+
+    public interface mode {
+        static final int CREATION_MODE = 0;
+        static final int EDITION_MODE = 1;
+    }
+
+    public interface result {
+        static final int ACCOUNT_CREATED = Activity.RESULT_FIRST_USER + 0;
+        static final int ACCOUNT_MODIFIED = Activity.RESULT_FIRST_USER + 1;
+        static final int ACCOUNT_DELETED = Activity.RESULT_FIRST_USER + 2;
+    }
 
     private AccountDetailBasic basicDetails = null;
     private AccountDetailAdvanced advancedDetails = null;
     private AccountDetailSrtp srtpDetails = null;
     private AccountDetailTls tlsDetails = null;
     private PreferenceManager mPreferenceManager;
-    private HashMap<String, String> mPreferenceMap;
-    private MenuItem deleteAccountAction = null;
     private String mAccountID;
-           
-    Preference.OnPreferenceChangeListener changeBasicPreferenceListener = 
-                                            new Preference.OnPreferenceChangeListener() {
-        public boolean onPreferenceChange(Preference preference, Object newValue) {
-            preference.setSummary(getString(R.string.account_current_value_label)+(CharSequence)newValue);
-            
-            // String preferenceKey = basicDetailKeys.get(preference.getOrder()).mKey; 
-            // accountPreference.preferenceMap.put(preferenceKey, ((CharSequence)newValue).toString());
-            basicDetails.setDetailString(preference.getOrder(), ((CharSequence)newValue).toString());
-            // if(preferenceKey == AccountDetailBasic.CONFIG_ACCOUNT_ALIAS)
-            //     accountPreference.mScreen.setTitle(((CharSequence)newValue.toString()));
-            return true;
-        }
-    };
+    private ArrayList<String> requiredFields = null;
 
-    Preference.OnPreferenceChangeListener changeNewAccountTwoStateListener = 
-                                            new Preference.OnPreferenceChangeListener() {
-        public boolean onPreferenceChange(Preference preference, Object newValue) {
-            return true;
-        }
-    };
+    
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        addPreferencesFromResource(R.xml.account_creation_preferences);
+        mPreferenceManager = getPreferenceManager();
 
-    private void init() {
+        Bundle b = getIntent().getExtras();
+
+        switch (b.getInt(KEY_MODE)) {
+        case mode.CREATION_MODE:
+            Log.i(TAG, "CREATION");
+            initCreation();
+            break;
+        case mode.EDITION_MODE:
+            Log.i(TAG, "ESDITION");
+            initEdition();
+            break;
+        }
+
+        requiredFields = new ArrayList<String>();
+        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_ALIAS);
+        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_HOSTNAME);
+        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME);
+        requiredFields.add(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD);
+
+    }
+
+    private void initCreation() {
+        basicDetails = new AccountDetailBasic();
+        advancedDetails = new AccountDetailAdvanced();
+        srtpDetails = new AccountDetailSrtp();
+        tlsDetails = new AccountDetailTls();
+
+        addPreferenceListener(basicDetails);
+        addPreferenceListener(advancedDetails);
+        addPreferenceListener(srtpDetails);
+        addPreferenceListener(tlsDetails);
+
+    }
+    
+    private void initEdition() {
 
         Bundle b = getIntent().getExtras();
         mAccountID = b.getString("AccountID");
@@ -108,7 +131,7 @@
         ArrayList<String> srtpPreferenceList = b.getStringArrayList(AccountDetailSrtp.BUNDLE_TAG);
         ArrayList<String> tlsPreferenceList = b.getStringArrayList(AccountDetailTls.BUNDLE_TAG);
 
-        basicDetails = new AccountDetailBasic(basicPreferenceList); 
+        basicDetails = new AccountDetailBasic(basicPreferenceList);
         advancedDetails = new AccountDetailAdvanced(advancedPreferenceList);
         srtpDetails = new AccountDetailSrtp(srtpPreferenceList);
         tlsDetails = new AccountDetailTls(tlsPreferenceList);
@@ -124,113 +147,225 @@
         addPreferenceListener(tlsDetails);
     }
 
-    private void setPreferenceDetails(AccountDetail details) {
-        for(AccountDetail.PreferenceEntry p : details.getDetailValues()) {
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        MenuInflater inflater = getMenuInflater();
+
+        Bundle b = getIntent().getExtras();
+
+        switch (b.getInt(KEY_MODE)) {
+        case mode.CREATION_MODE:
+            Log.i(TAG, "CREATION");
+            inflater.inflate(R.menu.account_creation, menu);
+            break;
+        case mode.EDITION_MODE:
+            Log.i(TAG, "onCreateOptionsMenu: " + mAccountID);
+
+            if (mAccountID.equals("IP2IP"))
+                return true;
+
+            inflater.inflate(R.menu.account_edition, menu);
+            break;
+        }
+
+        return true;
+    }
+
+    @Override
+    public void onBackPressed() {
+        Bundle b = getIntent().getExtras();
+        switch (b.getInt(KEY_MODE)) {
+        case mode.CREATION_MODE:
+            Log.i(TAG, "CREATION");
+            AlertDialog dialog = createCancelDialog();
+            dialog.show();
+            break;
+        case mode.EDITION_MODE:
+            finish();
+        }
+
+    }
+
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+
+        switch (item.getItemId()) {
+        case R.id.menuitem_delete:
+            AlertDialog dialog = createDeleteDialog();
+            dialog.show();
+            break;
+        case R.id.menuitem_create:
+            processAccount(result.ACCOUNT_CREATED);
+            break;
+        case R.id.menuitem_edit:
+            processAccount(result.ACCOUNT_MODIFIED);
+            break;
+
+        }
+
+        return true;
+    }
+
+    private void processAccount(int resultCode) {
+        AlertDialog dialog;
+        ArrayList<String> missingValue = new ArrayList<String>();
+        if (validateAccountCreation(missingValue)) {
+
+            Bundle bundle = new Bundle();
+            bundle.putString("AccountID", mAccountID);
+            HashMap<String, String> accountDetails = new HashMap<String, String>();
+
+            updateAccountDetails(accountDetails, basicDetails);
+            updateAccountDetails(accountDetails, advancedDetails);
+            updateAccountDetails(accountDetails, srtpDetails);
+            updateAccountDetails(accountDetails, tlsDetails);
+
+            bundle.putSerializable(AccountDetail.TAG, accountDetails);
+            Intent resultIntent = new Intent();
+            resultIntent.putExtras(bundle);
+
+            setResult(resultCode, resultIntent);
+            finish();
+        } else {
+            dialog = createCouldNotValidateDialog(missingValue);
+            dialog.show();
+        }
+
+    }
+
+    public boolean validateAccountCreation(ArrayList<String> missingValue) {
+        boolean valid = true;
+
+        for (String s : requiredFields) {
+            EditTextPreference pref = (EditTextPreference) mPreferenceManager.findPreference(s);
+            Log.i(TAG, "Looking for " + s);
+            if (pref.getText().isEmpty()) {
+                Log.i(TAG, "    INVALIDATED " + s + " " + pref.getText() + ";");
+                valid = false;
+                missingValue.add(pref.getTitle().toString());
+            }
+        }
+
+        return valid;
+    }
+
+   
+    private void updateAccountDetails(HashMap<String, String> accountDetails, AccountDetail det) {
+        for (AccountDetail.PreferenceEntry p : det.getDetailValues()) {
             Preference pref = mPreferenceManager.findPreference(p.mKey);
-            if(pref != null) {
-                if(!p.isTwoState) {
-                    ((EditTextPreference)pref).setText(p.mValue);
-                    pref.setSummary(getString(R.string.account_current_value_label) + p.mValue);
+            if (pref != null) {
+                if (p.isTwoState) {
+                    CheckBoxPreference boxPref = (CheckBoxPreference) pref;
+                    accountDetails.put(p.mKey, boxPref.isChecked() ? "true" : "false");
+                } else {
+                    EditTextPreference textPref = (EditTextPreference) pref;
+                    accountDetails.put(p.mKey, textPref.getText());
+                }
+            }
+        }
+    }
+
+    Preference.OnPreferenceChangeListener changeBasicPreferenceListener = new Preference.OnPreferenceChangeListener() {
+        public boolean onPreferenceChange(Preference preference, Object newValue) {
+            preference.setSummary((CharSequence) newValue);
+            basicDetails.setDetailString(preference.getOrder(), ((CharSequence) newValue).toString());
+            return true;
+        }
+    };
+    
+    private void setPreferenceDetails(AccountDetail details) {
+        for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
+            Preference pref = mPreferenceManager.findPreference(p.mKey);
+            if (pref != null) {
+                if (!p.isTwoState) {
+                    ((EditTextPreference) pref).setText(p.mValue);
+                    pref.setSummary(p.mValue);
                 }
             }
         }
     }
 
     private void addPreferenceListener(AccountDetail details) {
-        for(AccountDetail.PreferenceEntry p : details.getDetailValues()) {
+        for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
             Preference pref = mPreferenceManager.findPreference(p.mKey);
-            if(pref != null) {
-                if(!p.isTwoState) {
+            if (pref != null) {
+                if (!p.isTwoState) {
                     pref.setOnPreferenceChangeListener(changeBasicPreferenceListener);
                 }
             }
         }
     }
 
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
+    
+    
+    
+    
+    /******************************************
+     * 
+     * AlertDialogs
+     * 
+     ******************************************/
+    
+    private AlertDialog createCouldNotValidateDialog(ArrayList<String> missingValue) {
+        String message = "The following parameters are missing:";
 
-        addPreferencesFromResource(R.xml.account_creation_preferences);
-        mPreferenceManager = getPreferenceManager();
+        for (String s : missingValue)
+            message += "\n    - " + s;
 
-        init();
+        Activity ownerActivity = this;
+        AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
+        builder.setMessage(message).setTitle("Missing Parameters").setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+            public void onClick(DialogInterface dialog, int whichButton) {
+                /* Nothing to be done */
+            }
+        });
+
+        AlertDialog alertDialog = builder.create();
+        return alertDialog;
     }
+    
+    private AlertDialog createCancelDialog() {
+        Activity ownerActivity = this;
+        AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
+        builder.setMessage("All parameters will be lost").setTitle("Account Creation").setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+            public void onClick(DialogInterface dialog, int whichButton) {
+                Activity activity = ((Dialog) dialog).getOwnerActivity();
+                activity.finish();
+            }
+        }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
+            public void onClick(DialogInterface dialog, int whichButton) {
+                /* Terminate with no action */
+            }
+        });
 
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        Log.i(TAG, "onCreateOptionsMenu: " + mAccountID);
-        if(mAccountID.equals("IP2IP"))
-            return true;
-          
-          
-        deleteAccountAction = menu.add("Delete Account");
-        deleteAccountAction.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
-        return true;
+        AlertDialog alertDialog = builder.create();
+        alertDialog.setOwnerActivity(ownerActivity);
+
+        return alertDialog;
     }
-
-    @Override
-    protected void onStart() {
-        super.onStart();
-    }
-
-    @Override
-    protected void onStop() {
-       super.onStop();
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-    }
-
-    @Override
-    public void onBackPressed() {
-        Bundle bundle = new Bundle();
-        bundle.putString("AccountID", mAccountID);
-        bundle.putStringArrayList(AccountDetailBasic.BUNDLE_TAG, basicDetails.getValuesOnly()); 
-        bundle.putStringArrayList(AccountDetailAdvanced.BUNDLE_TAG, advancedDetails.getValuesOnly());
-        bundle.putStringArrayList(AccountDetailSrtp.BUNDLE_TAG, srtpDetails.getValuesOnly());
-        bundle.putStringArrayList(AccountDetailTls.BUNDLE_TAG, tlsDetails.getValuesOnly());
-
-        Intent resultIntent = new Intent();
-        resultIntent.putExtras(bundle);
-
-        setResult(ACCOUNT_MODIFIED, resultIntent);
-        finish(); 
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        AlertDialog dialog = createAlertDialog();
-        dialog.show();
-
-        return true;
-    }
-
-    private AlertDialog createAlertDialog()
-    {
+    
+    private AlertDialog createDeleteDialog() {
         Activity ownerActivity = this;
         AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
         builder.setMessage("Do you realy want to delete this account").setTitle("Delete Account")
-               .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
-                   public void onClick(DialogInterface dialog, int whichButton) {
-                       Bundle bundle = new Bundle();
-                       bundle.putString("AccountID", mAccountID);
+                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int whichButton) {
+                        Bundle bundle = new Bundle();
+                        bundle.putString("AccountID", mAccountID);
 
-                       Intent resultIntent = new Intent();
-                       resultIntent.putExtras(bundle);
+                        Intent resultIntent = new Intent();
+                        resultIntent.putExtras(bundle);
 
-                       Activity activity = ((Dialog)dialog).getOwnerActivity();
-                       activity.setResult(ACCOUNT_DELETED, resultIntent);
-                       activity.finish();
-                   }
-               })
-               .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
-                   public void onClick(DialogInterface dialog, int whichButton) {
-                       /* Terminate with no action */
-                   }
-               });
+                        Activity activity = ((Dialog) dialog).getOwnerActivity();
+                        activity.setResult(result.ACCOUNT_DELETED, resultIntent);
+                        activity.finish();
+                    }
+                }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int whichButton) {
+                        /* Terminate with no action */
+                    }
+                });
 
         AlertDialog alertDialog = builder.create();
         alertDialog.setOwnerActivity(ownerActivity);
@@ -238,29 +373,4 @@
         return alertDialog;
     }
 
-    private void updateAccountDetails(HashMap<String, String> accountDetails, AccountDetail det) {
-        for(AccountDetail.PreferenceEntry p : det.getDetailValues()) {
-            Preference pref = mPreferenceManager.findPreference(p.mKey);
-            if(pref != null) {
-                if(p.isTwoState) {
-                    CheckBoxPreference boxPref = (CheckBoxPreference) pref;
-                    accountDetails.put(p.mKey, boxPref.isChecked() ? "true" : "false");
-                }
-                else {
-                    EditTextPreference textPref = (EditTextPreference)pref;
-                    accountDetails.put(p.mKey, textPref.getText());
-                }
-            }
-        }
-    }
-
-    private void updateAccountDetails() {
-        HashMap<String, String> accountDetails = new HashMap<String, String>();
-
-        updateAccountDetails(accountDetails, basicDetails);
-        updateAccountDetails(accountDetails, advancedDetails);
-        updateAccountDetails(accountDetails, srtpDetails);
-        updateAccountDetails(accountDetails, tlsDetails);
-    }
 }
-
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
index 26eb7b3..ad06924 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
@@ -48,26 +48,23 @@
 import android.support.v4.content.LocalBroadcastManager;
 import android.support.v4.view.ViewPager;
 import android.util.Log;
-import android.view.Gravity;
-import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
-import android.view.ViewGroup;
 import android.view.animation.AlphaAnimation;
 import android.view.animation.Animation;
 import android.view.animation.LinearInterpolator;
 import android.widget.EditText;
 import android.widget.ImageButton;
-import android.widget.TextView;
 
 import com.savoirfairelinux.sflphone.R;
-import com.savoirfairelinux.sflphone.account.AccountListReceiver;
-import com.savoirfairelinux.sflphone.client.receiver.CallList;
+import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver;
+import com.savoirfairelinux.sflphone.client.receiver.CallListReceiver;
 import com.savoirfairelinux.sflphone.fragments.ButtonSectionFragment;
 import com.savoirfairelinux.sflphone.fragments.CallElementListFragment;
 import com.savoirfairelinux.sflphone.fragments.ContactListFragment;
+import com.savoirfairelinux.sflphone.fragments.HistoryFragment;
 import com.savoirfairelinux.sflphone.model.SipCall;
 import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
 import com.savoirfairelinux.sflphone.service.ConfigurationManagerCallback;
@@ -82,12 +79,12 @@
 	static Animation animation;
 	private ContactListFragment mContactListFragment = null;
 	private CallElementListFragment mCallElementList = null;
-	private HistorySectionFragment mHistorySectionFragment = null;
+	private HistoryFragment mHistorySectionFragment = null;
 	private ButtonSectionFragment mButtonSectionFragment = null;
 	private boolean mBound = false;
 	private ISipService service;
 	public AccountListReceiver mAccountList;
-	public CallList mCallList = new CallList(this);
+	public CallListReceiver mCallList = new CallListReceiver(this);
 	private SFLphoneApplication mApplication;
 
 	private static final int ACTION_BAR_TAB_CONTACT = 0;
@@ -146,7 +143,7 @@
 			        mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_CONTACT));
 			mCallElementList = (CallElementListFragment) getFragmentManager().getFragment(savedInstanceState,
 			        mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_CALL));
-			mHistorySectionFragment = (HistorySectionFragment) getFragmentManager().getFragment(savedInstanceState,
+			mHistorySectionFragment = (HistoryFragment) getFragmentManager().getFragment(savedInstanceState,
 			        mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_HISTORY));
 			mButtonSectionFragment = (ButtonSectionFragment) getFragmentManager().getFragment(savedInstanceState,
 			        mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_TEST));
@@ -161,7 +158,7 @@
 			Log.w(TAG, "Recreated mCallElementList=" + mCallElementList);
 		}
 		if (mHistorySectionFragment == null) {
-			mHistorySectionFragment = new HistorySectionFragment();
+			mHistorySectionFragment = new HistoryFragment();
 			Log.w(TAG, "Recreated mHistorySectionFragment=" + mHistorySectionFragment);
 		}
 		if (mButtonSectionFragment == null) {
@@ -408,8 +405,8 @@
 				Log.w(TAG, "getItem() CallElementList=" + fragment);
 				break;
 			case 2:
-				fragment = new HistorySectionFragment();
-				Log.w(TAG, "getItem() HistorySectionFragment=" + fragment);
+				fragment = new HistoryFragment();
+				Log.w(TAG, "getItem() HistoryFragment=" + fragment);
 				break;
 			case 3:
 				fragment = new ButtonSectionFragment();
@@ -422,7 +419,7 @@
 
 			// Log.i(TAG, "getItem() fragment is " + fragment);
 			Bundle args = new Bundle();
-			args.putInt(HistorySectionFragment.ARG_SECTION_NUMBER, i + 1);
+			args.putInt(HistoryFragment.ARG_SECTION_NUMBER, i + 1);
 			fragment.setArguments(args);
 			return fragment;
 		}
@@ -463,7 +460,7 @@
 				name = CallElementListFragment.class.getName();
 				break;
 			case 2:
-				name = HistorySectionFragment.class.getName();
+				name = HistoryFragment.class.getName();
 				break;
 			case 3:
 				name = ButtonSectionFragment.class.getName();
@@ -501,25 +498,6 @@
 		}
 	}
 
-	/**
-	 * A dummy fragment representing a section of the app, but that simply displays dummy text.
-	 */
-	public static class HistorySectionFragment extends Fragment {
-		public HistorySectionFragment() {
-			setRetainInstance(true);
-		}
-
-		public static final String ARG_SECTION_NUMBER = "section_number";
-
-		@Override
-		public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
-			TextView textView = new TextView(getActivity());
-			textView.setGravity(Gravity.CENTER);
-			Bundle args = getArguments();
-			textView.setText("ARG_SECTION_NUMBER=" + Integer.toString(args.getInt(ARG_SECTION_NUMBER)));
-			return textView;
-		}
-	}
 
 	@Override
 	public void onClick(View view) {
@@ -555,7 +533,7 @@
 		info.mEmail = "coolGuy@coolGuy.com";
 		info.mCallType = SipCall.CALL_TYPE_OUTGOING;
 
-		SipCall call = CallList.getCallInstance(info);
+		SipCall call = CallListReceiver.getCallInstance(info);
 		call.launchCallActivity(this);
 		call.placeCallUpdateUi();
 		call.notifyServicePlaceCall(service);
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhonePreferenceActivity.java b/src/com/savoirfairelinux/sflphone/client/SFLPhonePreferenceActivity.java
index 17bed3e..00d3023 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhonePreferenceActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhonePreferenceActivity.java
@@ -49,14 +49,14 @@
 
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.fragments.AccountManagementFragment;
-import com.savoirfairelinux.sflphone.fragments.PrefManagementFragment;
+import com.savoirfairelinux.sflphone.fragments.AudioManagementFragment;
 import com.savoirfairelinux.sflphone.service.ISipService;
 import com.savoirfairelinux.sflphone.service.SipService;
 
 public class SFLPhonePreferenceActivity extends Activity implements ActionBar.TabListener
 {
     static final int NUM_PAGES = 2;
-    static final String TAG = "SFLPhonePreferenceActivity";
+    static final String TAG = SFLPhonePreferenceActivity.class.getSimpleName();
     PreferencesPagerAdapter mPreferencesPagerAdapter;
     private boolean mBound = false;
     static boolean serviceIsOn = false;
@@ -185,7 +185,7 @@
                 fragment = new AccountManagementFragment();
                 break;
             case 1:
-                fragment = new PrefManagementFragment();
+                fragment = new AudioManagementFragment();
                 break;
             default:
                 Log.i(TAG, "Get new fragment " + position + " is null");
@@ -211,32 +211,4 @@
         }
     }
 
-    public static class ArrayListFragment extends ListFragment {
-        int mNum;
-
-        static ArrayListFragment newInstance(int num) {
-            ArrayListFragment f = new ArrayListFragment();
-
-            // Supply num input as an argument.
-            Bundle args = new Bundle();
-            args.putInt("num", num);
-            f.setArguments(args);
-
-            return f;
-        }
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            mNum = getArguments() != null ? getArguments().getInt("num") : 1;
-        }
-
-        @Override
-        public void onActivityCreated(Bundle savedInstanceState) {
-            super.onActivityCreated(savedInstanceState);
-            // setListAdapter(new ArrayAdapter<String>(getActivity(),
-            //        android.R.layout.simple_list_item_1, Cheeses.sCheeseStrings));
-        }
-
-    }
 }
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLphoneApplication.java b/src/com/savoirfairelinux/sflphone/client/SFLphoneApplication.java
index f7ef9c9..4fc4427 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLphoneApplication.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLphoneApplication.java
@@ -8,7 +8,7 @@
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.util.Log;
 
-import com.savoirfairelinux.sflphone.account.AccountListReceiver;
+import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver;
 import com.savoirfairelinux.sflphone.service.ISipService;
 import com.savoirfairelinux.sflphone.service.SipService;
 
diff --git a/src/com/savoirfairelinux/sflphone/client/receiver/AccountListReceiver.java b/src/com/savoirfairelinux/sflphone/client/receiver/AccountListReceiver.java
new file mode 100644
index 0000000..efd6c5b
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/client/receiver/AccountListReceiver.java
@@ -0,0 +1,131 @@
+/*
+ *  Copyright (C) 2004-2012 Savoir-Faire Linux Inc.
+ *
+ *  Author: Alexandre Savard <alexandre.savard@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 com.savoirfairelinux.sflphone.client.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Intent;
+import android.content.Context;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.util.ArrayList;
+
+import com.savoirfairelinux.sflphone.account.AccountManagementUI;
+import com.savoirfairelinux.sflphone.service.ConfigurationManagerCallback;
+import com.savoirfairelinux.sflphone.service.ISipService;
+
+public class AccountListReceiver extends BroadcastReceiver 
+{
+    private static final long serialVersionUID = -9178386308804218835L;
+    static final String TAG = "AccountList";
+    private String currentAccountID = "";
+    private ArrayList<String> mList = new ArrayList<String>();
+    private ArrayList<AccountManagementUI> mUserInterfaceList = new ArrayList<AccountManagementUI>();
+    private static ISipService mService = null;
+    // private HashMap<String, AccountPreferenceScreen> mAccountList = new HashMap<String, AccountPreferenceScreen>();
+
+    public static final String DEFAULT_ACCOUNT_ID = "IP2IP";
+
+    public AccountListReceiver() {
+    }
+
+    public void setSipService(ISipService service) {
+        mService = service;
+        mList = getAccountListFromService();
+    }
+        
+
+    public void addManagementUI(AccountManagementUI ui) {
+        mUserInterfaceList.add(ui);
+    }
+
+    public void accountSelected(String accountID, AccountManagementUI userInterface) {
+        if(!mUserInterfaceList.isEmpty()) {
+            for(AccountManagementUI ui : mUserInterfaceList) {
+                 ui.setSelectedAccount(accountID);
+            }
+        }
+    }
+
+    @Override
+    public void onReceive(Context context, Intent intent)
+    {
+        String signalName = intent.getStringExtra(ConfigurationManagerCallback.SIGNAL_NAME);
+        Log.d(TAG, "Signal received: " + signalName);
+        
+        if(signalName.equals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
+            processAccountsChangedSignal(intent);
+        } else if(signalName.equals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
+            processAccountStateChanged(intent);
+        }
+    }
+
+    private ArrayList<String> getAccountListFromService() {
+        ArrayList<String> list = null;
+
+        try {
+            list = (ArrayList<String>)mService.getAccountList();
+        }
+        catch (RemoteException e) {
+            Log.e(TAG, "Remote exception", e);
+        }
+
+        list.remove(DEFAULT_ACCOUNT_ID);
+
+        return list;
+    }
+
+
+    private void processAccountsChangedSignal(Intent intent) {
+        ArrayList<String> newList = getAccountListFromService();
+
+        Log.i(TAG, "Process AccountsChanged signal in AccountList");
+
+        newList.remove(DEFAULT_ACCOUNT_ID);
+
+        if(!mUserInterfaceList.isEmpty()) {
+
+            if(newList.size() > mList.size()) {
+                for(AccountManagementUI ui : mUserInterfaceList) {
+                    ui.accountAdded(newList);
+                }
+            }
+        }
+
+        mList = newList;
+    }
+
+    private void processAccountStateChanged(Intent intent) {
+        if(!mUserInterfaceList.isEmpty()) {
+        }
+    }
+}
diff --git a/src/com/savoirfairelinux/sflphone/client/receiver/CallList.java b/src/com/savoirfairelinux/sflphone/client/receiver/CallListReceiver.java
similarity index 97%
rename from src/com/savoirfairelinux/sflphone/client/receiver/CallList.java
rename to src/com/savoirfairelinux/sflphone/client/receiver/CallListReceiver.java
index bfec63a..ddf4efa 100644
--- a/src/com/savoirfairelinux/sflphone/client/receiver/CallList.java
+++ b/src/com/savoirfairelinux/sflphone/client/receiver/CallListReceiver.java
@@ -44,7 +44,7 @@
 import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
 import com.savoirfairelinux.sflphone.client.SFLPhoneHomeActivity;
 
-public class CallList extends BroadcastReceiver
+public class CallListReceiver extends BroadcastReceiver
 {
     static final String TAG = "CallList";
     static ArrayList<SipCall> mList = new ArrayList<SipCall>();
@@ -81,7 +81,7 @@
         return call;
     }
 
-    public CallList(SFLPhoneHomeActivity home) {
+    public CallListReceiver(SFLPhoneHomeActivity home) {
         mHome = home;
     }