* #31301: switch registration state for each account
diff --git a/src/org/sflphone/fragments/AccountManagementFragment.java b/src/org/sflphone/fragments/AccountManagementFragment.java
index e6f2a5d..af3356a 100644
--- a/src/org/sflphone/fragments/AccountManagementFragment.java
+++ b/src/org/sflphone/fragments/AccountManagementFragment.java
@@ -34,7 +34,6 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Set;
 
 import org.sflphone.R;
 import org.sflphone.account.AccountDetail;
@@ -44,58 +43,75 @@
 import org.sflphone.account.AccountDetailTls;
 import org.sflphone.client.AccountEditionActivity;
 import org.sflphone.client.AccountWizard;
-import org.sflphone.client.SFLPhonePreferenceActivity;
-import org.sflphone.client.SFLphoneApplication;
+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 android.app.Activity;
-import android.content.BroadcastReceiver;
+import android.app.ListFragment;
+import android.app.LoaderManager.LoaderCallbacks;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.Loader;
 import android.os.Bundle;
 import android.os.RemoteException;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
-import android.preference.PreferenceScreen;
-import android.support.v4.content.LocalBroadcastManager;
 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.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.BaseAdapter;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+import android.widget.TextView;
 
-public class AccountManagementFragment extends PreferenceFragment {
+public class AccountManagementFragment extends ListFragment implements LoaderCallbacks<ArrayList<Account>>, AccountsInterface {
     static final String TAG = "AccountManagementFragment";
     static final String DEFAULT_ACCOUNT_ID = "IP2IP";
     static final int ACCOUNT_CREATE_REQUEST = 1;
     static final int ACCOUNT_EDIT_REQUEST = 2;
-    private SFLPhonePreferenceActivity sflphonePreferenceActivity;
-    private ISipService service = null;
+    AccountsReceiver accountReceiver;
+    AccountsAdapter mAdapter;
 
-    // ArrayList<AccountDetail.PreferenceEntry> basicDetailKeys = null;
-    // ArrayList<AccountDetail.PreferenceEntry> advancedDetailKeys = null;
-    // ArrayList<AccountDetail.PreferenceEntry> srtpDetailKeys = null;
-    // ArrayList<AccountDetail.PreferenceEntry> tlsDetailKeys = null;
-    HashMap<String, Preference> accountPreferenceHashMap = null;
-    PreferenceScreen mRoot = null;
+    private Callbacks mCallbacks = sDummyCallbacks;
+    private static Callbacks sDummyCallbacks = new Callbacks() {
+
+        @Override
+        public ISipService getService() {
+            return null;
+        }
+    };
+
+    public interface Callbacks {
+
+        public ISipService getService();
+
+    }
 
     @Override
     public void onAttach(Activity activity) {
         super.onAttach(activity);
-        sflphonePreferenceActivity = (SFLPhonePreferenceActivity) activity;
-        service = sflphonePreferenceActivity.getSipService();
-        Log.w(TAG, "onAttach() service=" + service);
+        if (!(activity instanceof Callbacks)) {
+            throw new IllegalStateException("Activity must implement fragment's callbacks.");
+        }
+
+        mCallbacks = (Callbacks) activity;
     }
 
-    public AccountManagementFragment() {
-        // basicDetailKeys = AccountDetailBasic.getPreferenceEntries();
-        // advancedDetailKeys = AccountDetailAdvanced.getPreferenceEntries();
-        // srtpDetailKeys = AccountDetailSrtp.getPreferenceEntries();
-        // tlsDetailKeys = AccountDetailTls.getPreferenceEntries();
-
-        accountPreferenceHashMap = new HashMap<String, Preference>();
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        mCallbacks = sDummyCallbacks;
     }
 
     @Override
@@ -103,53 +119,57 @@
         super.onCreate(savedInstanceState);
 
         Log.i(TAG, "Create Account Management Fragment");
-
+        mAdapter = new AccountsAdapter(getActivity(), new ArrayList<Account>());
         this.setHasOptionsMenu(true);
+        accountReceiver = new AccountsReceiver(this);
+        getLoaderManager().initLoader(LoaderConstants.ACCOUNTS_LOADER, null, this);
+    }
 
-        /*
-         * FIXME if service cannot be obtained from SFLPhonePreferenceActivity, then get it from Application
-         */
-        service = sflphonePreferenceActivity.getSipService();
-        if (service == null) {
-            service = ((SFLphoneApplication) sflphonePreferenceActivity.getApplication()).getSipService();
-            if (service == null) {
-                Log.e(TAG, "onCreate() service=" + service);
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
+        View inflatedView = inflater.inflate(android.R.layout.list_content, parent, false);
+        setListAdapter(mAdapter);
+        return inflatedView;
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        getListView().setOnItemClickListener(new OnItemClickListener() {
+
+            @Override
+            public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
+                Log.i(TAG, "CLICKING");
+                launchAccountEditActivity(mAdapter.getItem(pos));
             }
-        }
-
-        setPreferenceScreen(getAccountListPreferenceScreen());
-
-        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mMessageReceiver,
-                new IntentFilter(ConfigurationManagerCallback.ACCOUNTS_CHANGED));
+        });
     }
 
     @Override
-    public void onStop() {
-        super.onStop();
-        Log.i(TAG, "onStop");
+    public void onPause() {
+        super.onPause();
+        getActivity().unregisterReceiver(accountReceiver);
     }
 
-    @Override
-    public void onDestroy() {
-        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mMessageReceiver);
-        super.onDestroy();
-        Log.i(TAG, "onDestroy");
+    public void onResume() {
+        super.onResume();
+        IntentFilter intentFilter2 = new IntentFilter();
+        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
+        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
+        getActivity().registerReceiver(accountReceiver, intentFilter2);
     }
 
-    @SuppressWarnings("unchecked") // No proper solution with HashMap runtime cast
+    @SuppressWarnings("unchecked")
+    // No proper solution with HashMap runtime cast
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         switch (requestCode) {
         case ACCOUNT_CREATE_REQUEST:
             if (resultCode == AccountWizard.ACCOUNT_CREATED) {
                 Bundle bundle = data.getExtras();
-                Log.i(TAG, "Create account settings");
                 HashMap<String, String> accountDetails = new HashMap<String, String>();
                 accountDetails = (HashMap<String, String>) bundle.getSerializable(AccountDetail.TAG);
-                // if(accountDetails == null){
-                // Toast.makeText(getActivity(), "NUUUUL", Toast.LENGTH_SHORT).show();
-                // } else
-                // Toast.makeText(getActivity(), "OKKKK", Toast.LENGTH_SHORT).show();
+
                 createNewAccount(accountDetails);
             }
             break;
@@ -161,10 +181,6 @@
 
                 HashMap<String, String> accountDetails = new HashMap<String, String>();
                 accountDetails = (HashMap<String, String>) bundle.getSerializable(AccountDetail.TAG);
-
-                Preference accountScreen = accountPreferenceHashMap.get(accountID);
-                mRoot.removePreference(accountScreen);
-                accountPreferenceHashMap.remove(accountID);
                 setAccountDetails(accountID, accountDetails);
 
             } else if (resultCode == AccountEditionActivity.result.ACCOUNT_DELETED) {
@@ -173,9 +189,9 @@
 
                 Log.i(TAG, "Remove account " + accountID);
                 deleteSelectedAccount(accountID);
-                Preference accountScreen = accountPreferenceHashMap.get(accountID);
-                mRoot.removePreference(accountScreen);
-                accountPreferenceHashMap.remove(accountID);
+                // Preference accountScreen = accountPreferenceHashMap.get(accountID);
+                // mRoot.removePreference(accountScreen);
+                // accountPreferenceHashMap.remove(accountID);
             } else {
                 Log.i(TAG, "Edition canceled");
             }
@@ -188,7 +204,7 @@
     private void createNewAccount(HashMap<String, String> accountDetails) {
         try {
             Log.i(TAG, "ADD ACCOUNT");
-            service.addAccount(accountDetails);
+            mCallbacks.getService().addAccount(accountDetails);
         } catch (RemoteException e) {
             Log.e(TAG, "Cannot call service method", e);
         }
@@ -196,61 +212,40 @@
 
     private void setAccountDetails(String accountID, HashMap<String, String> accountDetails) {
         try {
-            service.setAccountDetails(accountID, accountDetails);
+            mCallbacks.getService().setAccountDetails(accountID, accountDetails);
         } catch (RemoteException e) {
             Log.e(TAG, "Cannot call service method", e);
         }
     }
 
+    @Override
+    public Loader<ArrayList<Account>> onCreateLoader(int id, Bundle args) {
+        AccountsLoader l = new AccountsLoader(getActivity(), mCallbacks.getService());
+        l.forceLoad();
+        return l;
+    }
+
+    @Override
+    public void onLoadFinished(Loader<ArrayList<Account>> loader, ArrayList<Account> results) {
+        mAdapter.removeAll();
+        mAdapter.addAll(results);
+    }
+
+    @Override
+    public void onLoaderReset(Loader<ArrayList<Account>> arg0) {
+        // TODO Auto-generated method stub
+
+    }
+
     private void deleteSelectedAccount(String accountID) {
         Log.i(TAG, "DeleteSelectedAccount");
         try {
-            service.removeAccount(accountID);
+            mCallbacks.getService().removeAccount(accountID);
         } catch (RemoteException e) {
             Log.e(TAG, "Cannot call service method", e);
         }
     };
 
-    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            ArrayList<String> newList = (ArrayList<String>) getAccountList();
-            Set<String> currentList = (Set<String>) accountPreferenceHashMap.keySet();
-            if (newList.size() > currentList.size()) {
-                for (String s : newList) {
-                    if (!currentList.contains(s)) {
-                        Preference accountScreen = createAccountPreferenceScreen(s);
-                        mRoot.addPreference(accountScreen);
-                        accountPreferenceHashMap.put(s, accountScreen);
-                    }
-                }
-            }
-        }
-    };
-
-    Preference.OnPreferenceClickListener launchAccountCreationOnClick = new Preference.OnPreferenceClickListener() {
-        public boolean onPreferenceClick(Preference preference) {
-            launchAccountCreationActivity(preference);
-            return true;
-        }
-    };
-
-    Preference.OnPreferenceClickListener launchAccountEditOnClick = new Preference.OnPreferenceClickListener() {
-        public boolean onPreferenceClick(Preference preference) {
-            launchAccountEditActivity(preference);
-            return true;
-        }
-    };
-
-    Preference.OnPreferenceClickListener removeSelectedAccountOnClick = new Preference.OnPreferenceClickListener() {
-        public boolean onPreferenceClick(Preference preference) {
-            if (preference.getTitle() == "Delete Account") {
-                deleteSelectedAccount(preference.getKey());
-            }
-            return true;
-        }
-    };
-
     @Override
     public void onCreateOptionsMenu(Menu m, MenuInflater inf) {
         super.onCreateOptionsMenu(m, inf);
@@ -270,107 +265,147 @@
         return true;
     }
 
-    private void launchAccountCreationActivity(Preference preference) {
-        Log.i(TAG, "Launch account creation activity");
-        Intent intent = preference.getIntent();
-        startActivityForResult(intent, ACCOUNT_CREATE_REQUEST);
-    }
-
-    private void launchAccountEditActivity(Preference preference) {
+    private void launchAccountEditActivity(Account acc) {
         Log.i(TAG, "Launch account edit activity");
-        Intent intent = preference.getIntent();
-        Bundle bundle = intent.getExtras();
-        String accountID = bundle.getString("AccountID");
 
-        HashMap<String, String> preferenceMap = getAccountDetails(accountID);
-
-        Account d = new Account(accountID, preferenceMap);
-
-        bundle.putStringArrayList(AccountDetailBasic.BUNDLE_TAG, d.getBasicDetails().getValuesOnly());
-        bundle.putStringArrayList(AccountDetailAdvanced.BUNDLE_TAG, d.getAdvancedDetails().getValuesOnly());
-        bundle.putStringArrayList(AccountDetailSrtp.BUNDLE_TAG, d.getSrtpDetails().getValuesOnly());
-        bundle.putStringArrayList(AccountDetailTls.BUNDLE_TAG, d.getTlsDetails().getValuesOnly());
+        Intent intent = new Intent().setClass(getActivity(), AccountEditionActivity.class);
+        Bundle bundle = new Bundle();
+        bundle.putString("AccountID", acc.getAccountID());
+        bundle.putStringArrayList(AccountDetailBasic.BUNDLE_TAG, acc.getBasicDetails().getValuesOnly());
+        bundle.putStringArrayList(AccountDetailAdvanced.BUNDLE_TAG, acc.getAdvancedDetails().getValuesOnly());
+        bundle.putStringArrayList(AccountDetailSrtp.BUNDLE_TAG, acc.getSrtpDetails().getValuesOnly());
+        bundle.putStringArrayList(AccountDetailTls.BUNDLE_TAG, acc.getTlsDetails().getValuesOnly());
 
         intent.putExtras(bundle);
 
         startActivityForResult(intent, ACCOUNT_EDIT_REQUEST);
     }
 
-    @SuppressWarnings("unchecked") // No proper solution with HashMap runtime cast
-    private ArrayList<String> getAccountList() {
-        ArrayList<String> accountList = null;
-        try {
-            accountList = (ArrayList<String>) service.getAccountList();
-        } catch (RemoteException e) {
-            Log.e(TAG, "Cannot call service method", e);
-        }
-
-        // Remove the default account from list
-        accountList.remove(DEFAULT_ACCOUNT_ID);
-
-        return accountList;
+    @Override
+    public void accountsChanged() {
+        if (getActivity() != null)
+            getActivity().getLoaderManager().restartLoader(LoaderConstants.ACCOUNTS_LOADER, null, this);
     }
 
-    @SuppressWarnings("unchecked") // No proper solution with HashMap runtime cast
-    private HashMap<String, String> getAccountDetails(String accountID) {
-        HashMap<String, String> accountDetails = null;
-        try {
-            accountDetails = (HashMap<String, String>) service.getAccountDetails(accountID);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Cannot call service method", e);
-        }
-
-        return accountDetails;
+    @Override
+    public void accountStateChanged(Intent accountState) {
+        mAdapter.updateAccount(accountState);
     }
 
-    public PreferenceScreen getAccountListPreferenceScreen() {
-        Activity currentContext = getActivity();
+    
+    /**
+     * 
+     * Adapter for accounts List
+     * @author lisional
+     *
+     */
+    public class AccountsAdapter extends BaseAdapter {
 
-        mRoot = getPreferenceManager().createPreferenceScreen(currentContext);
+        // private static final String TAG = AccountSelectionAdapter.class.getSimpleName();
 
-        // Default account category
-        // PreferenceCategory defaultAccountCat = new PreferenceCategory(currentContext);
-        // defaultAccountCat.setTitle(R.string.default_account_category);
-        // mRoot.addPreference(defaultAccountCat);
-        //
-        // mRoot.addPreference(createAccountPreferenceScreen(DEFAULT_ACCOUNT_ID));
+        ArrayList<Account> accounts;
+        Context mContext;
 
-        // Account list category
-        // PreferenceCategory accountListCat = new PreferenceCategory(currentContext);
-        // accountListCat.setTitle(R.string.default_account_category);
-        // mRoot.addPreference(accountListCat);
-
-        ArrayList<String> accountList = getAccountList();
-
-        for (String s : accountList) {
-            Preference accountScreen = createAccountPreferenceScreen(s);
-            mRoot.addPreference(accountScreen);
-            accountPreferenceHashMap.put(s, accountScreen);
+        public AccountsAdapter(Context cont, ArrayList<Account> newList) {
+            super();
+            accounts = newList;
+            mContext = cont;
         }
 
-        return mRoot;
-    }
+        @Override
+        public int getCount() {
+            return accounts.size();
+        }
 
-    Preference createAccountPreferenceScreen(String accountID) {
+        @Override
+        public Account getItem(int pos) {
+            return accounts.get(pos);
+        }
 
-        HashMap<String, String> details = getAccountDetails(accountID);
-        // Set<String> keys = details.keySet();
-        // Iterator<String> ite = keys.iterator();
-        // while(ite.hasNext()){
-        // Log.i(TAG,"key : "+ ite.next());
-        // }
-        Bundle bundle = new Bundle();
-        bundle.putString("AccountID", accountID);
+        @Override
+        public long getItemId(int pos) {
+            return 0;
+        }
 
-        Intent intent = new Intent().setClass(getActivity(), AccountEditionActivity.class);
-        intent.putExtras(bundle);
+        @Override
+        public View getView(final int pos, View convertView, ViewGroup parent) {
+            View rowView = convertView;
+            AccountView entryView = null;
 
-        Preference editAccount = new Preference(getActivity());
-        editAccount.setTitle(details.get(AccountDetailBasic.CONFIG_ACCOUNT_ALIAS));
-        editAccount.setSummary(details.get(AccountDetailBasic.CONFIG_ACCOUNT_HOSTNAME));
-        editAccount.setOnPreferenceClickListener(launchAccountEditOnClick);
-        editAccount.setIntent(intent);
+            if (rowView == null) {
+                LayoutInflater inflater = LayoutInflater.from(mContext);
+                rowView = inflater.inflate(R.layout.item_account_pref, null);
 
-        return editAccount;
+                entryView = new AccountView();
+                entryView.alias = (TextView) rowView.findViewById(R.id.account_alias);
+                entryView.host = (TextView) rowView.findViewById(R.id.account_host);
+                entryView.enabled = (CheckBox) rowView.findViewById(R.id.account_checked);
+                rowView.setTag(entryView);
+            } else {
+                entryView = (AccountView) rowView.getTag();
+            }
+
+            entryView.alias.setText(accounts.get(pos).getAlias());
+            entryView.host.setText(accounts.get(pos).getHost() + " - " + accounts.get(pos).getRegistered_state());
+            entryView.enabled.setChecked(accounts.get(pos).isEnabled());
+
+            entryView.enabled.setOnCheckedChangeListener(new OnCheckedChangeListener() {
+
+                @Override
+                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                    accounts.get(pos).setEnabled(isChecked);
+
+                    try {
+                        mCallbacks.getService().setAccountDetails(accounts.get(pos).getAccountID(), accounts.get(pos).getDetails());
+                    } catch (RemoteException e) {
+                        e.printStackTrace();
+                    }
+                }
+            });
+
+            return rowView;
+        }
+
+        /*********************
+         * ViewHolder Pattern
+         *********************/
+        public class AccountView {
+            public TextView alias;
+            public TextView host;
+            public CheckBox enabled;
+        }
+
+        public void removeAll() {
+            accounts.clear();
+            notifyDataSetChanged();
+
+        }
+
+        public void addAll(ArrayList<Account> results) {
+            accounts.addAll(results);
+            notifyDataSetChanged();
+        }
+
+        /**
+         * Modify state of specific account
+         * 
+         * @param accountState
+         */
+        public void updateAccount(Intent accountState) {
+            Log.i(TAG, "updateAccount");
+            String id = accountState.getStringExtra("Account");
+            String newState = accountState.getStringExtra("state");
+            accountState.getStringExtra("Account");
+
+            for (Account a : accounts) {
+                if (a.getAccountID().contentEquals(id)) {
+                    a.setRegistered_state(newState);
+                    notifyDataSetChanged();
+                    return;
+                }
+            }
+
+        }
+
     }
 }