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/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);
-    }
 }
-