#17195: Add AccountList class to manage account list and propagate account status
diff --git a/src/com/savoirfairelinux/sflphone/client/CallElementList.java b/src/com/savoirfairelinux/sflphone/client/CallElementList.java
index e36882b..cb2f249 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallElementList.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallElementList.java
@@ -68,6 +68,7 @@
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.service.ISipService;
 import com.savoirfairelinux.sflphone.utils.AccountSelectionButton;
+import com.savoirfairelinux.sflphone.utils.AccountList;
 
 /**
  * Main list of Call Elements.
@@ -83,6 +84,7 @@
     private SFLPhoneHome sflphoneHome;
     private ISipService service;
     private AccountSelectionButton mAccountSelectionButton;
+    private AccountList mAccountList;
 
     static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME,
                                                                        Contacts.PHOTO_ID, Contacts.LOOKUP_KEY };
@@ -246,7 +248,10 @@
     public void setService(ISipService s)
     {
         service = s;
-        mAccountSelectionButton.setSipService(service, (Context)getActivity());
+    }
+
+    public void setAccountList(AccountList accountList) {
+        mAccountList = accountList;
     }
 
     public void addCall(SipCall c)
@@ -333,6 +338,7 @@
         View inflatedView = inflater.inflate(R.layout.call_element_list, container, false);
 
         mAccountSelectionButton = (AccountSelectionButton) inflatedView.findViewById(R.id.account_selection_button);
+        mAccountList.addManagementUI(mAccountSelectionButton);
 
         return inflatedView;
     }
diff --git a/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java b/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
index d705ccb..2e870b9 100644
--- a/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
@@ -78,6 +78,8 @@
 
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.service.ISipService;
+import com.savoirfairelinux.sflphone.utils.AccountList;
+import com.savoirfairelinux.sflphone.utils.AccountSelectionButton;
 
 public class ContactListFragment extends ListFragment implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor>
 {
@@ -86,6 +88,8 @@
     Context mContext;
     String mCurFilter;
     private ISipService service;
+    private AccountSelectionButton mAccountSelectionButton;
+    private AccountList mAccountList;
 
     // These are the Contacts rows that we will retrieve.
     static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME,
@@ -192,6 +196,10 @@
         service = s;
     }
 
+    public void setAccountList(AccountList accountList) {
+        mAccountList = accountList;
+    }
+
     @Override
     public void onActivityCreated(Bundle savedInstanceState)
     {
@@ -270,6 +278,8 @@
         View inflatedView = inflater.inflate(R.layout.call_element_list, container, false);
 
         // Button accountSelectionButton = (Button) inflatedView.findViewById(R.id.account_selection_button);
+        mAccountSelectionButton = (AccountSelectionButton) inflatedView.findViewById(R.id.account_selection_button);
+        mAccountList.addManagementUI(mAccountSelectionButton);
 
         return inflatedView;
     }
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java
index a3ead4b..8de08a2 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java
@@ -72,6 +72,7 @@
 import com.savoirfairelinux.sflphone.service.SipService;
 import com.savoirfairelinux.sflphone.utils.AccountList;
 import com.savoirfairelinux.sflphone.utils.CallList;
+import com.savoirfairelinux.sflphone.utils.AccountList;
 
 import java.util.HashMap;
 
@@ -177,6 +178,9 @@
         LocalBroadcastManager.getInstance(this).registerReceiver(mCallList, new IntentFilter("call-state-changed"));
         LocalBroadcastManager.getInstance(this).registerReceiver(mCallList, new IntentFilter("incoming-call"));
 
+        LocalBroadcastManager.getInstance(this).registerReceiver(mAccountList, new IntentFilter("accounts-changed"));
+        LocalBroadcastManager.getInstance(this).registerReceiver(mAccountList, new IntentFilter("account-state-changed"));
+
         SipCall.setSFLPhoneHomeContext(this);
     }
 
@@ -236,6 +240,7 @@
             mBound = true;
             mContactListFragment.setService(service);
             mCallElementList.setService(service);
+            mAccountList.setSipService(service);
             Log.d(TAG, "Service connected");
         }
 
@@ -357,11 +362,13 @@
             switch (i) {
             case 0:
                 mContactListFragment = new ContactListFragment(service);
+                mContactListFragment.setAccountList(mAccountList);
                 fragment = mContactListFragment;
                 break;
             case 1:
                 mCallElementList = new CallElementList(service, mHome);
                 SipCall.setCallElementList(mCallElementList);
+                mCallElementList.setAccountList(mAccountList);
                 fragment = mCallElementList;
                 break;
             case 2:
diff --git a/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java b/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java
index cea5732..ab9fbbf 100644
--- a/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java
+++ b/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java
@@ -31,6 +31,10 @@
     private static final String TAG = "ConfigurationManagerCallback";
     private Context mContext; 
 
+    static public final String SIGNAL_NAME = "signal-name";
+    static public final String ACCOUNTS_CHANGED = "accounts-changed"; 
+    static public final String ACCOUNT_STATE_CHANGED = "account-state-changed";
+
     public ConfigurationManagerCallback(Context context) {
         mContext = context;
     }
@@ -41,9 +45,18 @@
     }
 
     private void sendAccountsChangedMessage() {
-        Log.d("sender", "Boradcasting message");
-        Intent intent = new Intent("accounts-changed");
+        Log.d(TAG, "Broadcast Accounts Changed signal");
+        Intent intent = new Intent(ACCOUNTS_CHANGED);
+        intent.putExtra(SIGNAL_NAME, ACCOUNTS_CHANGED);
         intent.putExtra("message", "Accounts Changed");
         LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
     }
+
+    private void sendAccountStateChangedMessage() {
+        Log.d(TAG, "Broadcast Account State Changed signal");
+        Intent intent = new Intent(ACCOUNT_STATE_CHANGED);
+        intent.putExtra(SIGNAL_NAME, ACCOUNTS_CHANGED);
+        intent.putExtra("message", "Account State Changed");
+        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
+    }
 }
diff --git a/src/com/savoirfairelinux/sflphone/utils/AccountList.java b/src/com/savoirfairelinux/sflphone/utils/AccountList.java
index 27604c5..016c049 100644
--- a/src/com/savoirfairelinux/sflphone/utils/AccountList.java
+++ b/src/com/savoirfairelinux/sflphone/utils/AccountList.java
@@ -31,13 +31,94 @@
 
 package com.savoirfairelinux.sflphone.utils;
 
-public class AccountList
+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.service.ConfigurationManagerCallback;
+import com.savoirfairelinux.sflphone.service.ISipService;
+
+public class AccountList extends BroadcastReceiver 
 {
     static final String TAG = "AccountList";
-    public String currentAccountID = "Account:1345153770";
+    private String currentAccountID = "";
+    private ArrayList<String> mList = new ArrayList<String>();
+    private ArrayList<AccountManagementUI> mUserInterfaceList = new ArrayList<AccountManagementUI>();
+    private ISipService mService;
     // private HashMap<String, AccountPreferenceScreen> mAccountList = new HashMap<String, AccountPreferenceScreen>();
 
-    public AccountList() {
+    public static final String DEFAULT_ACCOUNT_ID = "IP2IP";
 
+    public AccountList() {
+    }
+
+    public void setSipService(ISipService service) {
+        mService = service;
+        mList = getAccountListFromService();
+    }
+        
+
+    public void addManagementUI(AccountManagementUI ui) {
+        mUserInterfaceList.add(ui);
+    }
+
+    @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) {
+                    Log.i(TAG, "UPDATE UI");
+                    ui.accountAdded(newList);
+                }
+            }
+        } else {
+            Log.i(TAG, "UI LIST IS EMPTY");
+        }
+
+        mList = newList;
+    }
+
+    private void processAccountStateChanged(Intent intent) {
+        if(!mUserInterfaceList.isEmpty()) {
+        }
     }
 }
diff --git a/src/com/savoirfairelinux/sflphone/utils/AccountSelectionButton.java b/src/com/savoirfairelinux/sflphone/utils/AccountSelectionButton.java
index 01b99a7..1049ed8 100644
--- a/src/com/savoirfairelinux/sflphone/utils/AccountSelectionButton.java
+++ b/src/com/savoirfairelinux/sflphone/utils/AccountSelectionButton.java
@@ -42,56 +42,56 @@
 
 import java.util.ArrayList;
 
-public class AccountSelectionButton extends Button
+public class AccountSelectionButton extends Button implements AccountManagementUI
 {
     private static final String TAG = "AccountSelectionButton";
     private ISipService mService;
     private Context mContext;
+    private ArrayList<String> mList = new ArrayList<String>();
 
     public AccountSelectionButton(Context context) {
         super(context);
+        mContext = context;
+        init();
     }
 
     public AccountSelectionButton(Context context, AttributeSet attrs) {
         super(context, attrs);
+        mContext = context;
+        init();
     }
 
     public AccountSelectionButton(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
+        mContext = context;
+        init();
     }
 
-    public void setSipService(ISipService service, Context context) {
-        mService = service;
-        mContext = context;
+    private void init() {
         final AccountSelectionButton b = this;
 
-        ArrayList<String> list = getAccountList();
-        if(list.size() > 1) {
-            list.remove("IP2IP");
-            setText(list.get(0));
-        } else {
-            setText("IP2IP");
-        }
-
         setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
-                ArrayList<String> list = getAccountList();
-                AccountSelectionDialog accountSelectionDialog = new AccountSelectionDialog(mContext, list, b);
+                AccountSelectionDialog accountSelectionDialog = new AccountSelectionDialog(mContext, mList, b);
                 accountSelectionDialog.show();
             }
         });
     }
 
-    public ArrayList<String> getAccountList() {
-        ArrayList<String> list = null;
+    public void accountAdded(ArrayList<String> newList) {
+        Log.i(TAG, "Account added");
+        mList = newList;
 
-        try {
-            list = (ArrayList<String>)mService.getAccountList();
+        if(newList.size() == 1) {
+            setText(newList.get(0));
         }
-        catch (RemoteException e) {
-            Log.e(TAG, "Remote exception", e);
-        }
+    }
 
-        return list;
+    public void accountRemoved() {
+
+    }
+
+    public void accountUpdated() {
+
     }
 }