Added custom adapter for AccountSelectionSpinner and async details loading
diff --git a/src/com/savoirfairelinux/sflphone/account/AccountSelectionSpinner.java b/src/com/savoirfairelinux/sflphone/account/AccountSelectionSpinner.java
index 9642fdf..f0f63cc 100644
--- a/src/com/savoirfairelinux/sflphone/account/AccountSelectionSpinner.java
+++ b/src/com/savoirfairelinux/sflphone/account/AccountSelectionSpinner.java
@@ -32,23 +32,26 @@
import java.util.ArrayList;
-import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver;
-
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
+import android.widget.RadioButton;
import android.widget.Spinner;
-import android.widget.TextView;
+
+import com.savoirfairelinux.sflphone.R;
+import com.savoirfairelinux.sflphone.adapters.AccountSelectionAdapter;
+import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver;
+import com.savoirfairelinux.sflphone.service.ISipService;
public class AccountSelectionSpinner extends Spinner implements AccountManagementUI {
- private static final String TAG = "AccountSelectionButton";
+ private static final String TAG = AccountSelectionSpinner.class.getSimpleName();
+ public static final String DEFAULT_ACCOUNT_ID = "IP2IP";
private Context mContext;
- private ArrayList<String> mList = new ArrayList<String>();
private AccountListReceiver mAccountList = null;
- ArrayAdapter mListAdapter;
+ AccountSelectionAdapter mAdapter;
+ ISipService serviceRef;
public AccountSelectionSpinner(Context context) {
super(context);
@@ -60,27 +63,26 @@
super(context, attrs);
mContext = context;
-
}
public AccountSelectionSpinner(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
- mListAdapter = new ArrayAdapter(mContext, android.R.layout.simple_expandable_list_item_1, mList.toArray());
- setOnItemSelectedListener(onClick);
- setAdapter(mListAdapter);
}
private AdapterView.OnItemSelectedListener onClick = new AdapterView.OnItemSelectedListener() {
@Override
- public void onItemSelected(AdapterView<?> arg0, View view, int arg2, long arg3) {
+ public void onItemSelected(AdapterView<?> arg0, View view, int pos, long arg3) {
// public void onClick(DialogInterface dialog, int which) {
- Log.i(TAG, "Selected Account: " + ((TextView) view).getText());
- // mButton.setText(((TextView)view).getText());
- accountSelectedNotifyAccountList(((TextView) view).getText().toString());
+ Log.i(TAG, "Selected Account: " + mAdapter.getItem(pos));
+ if (null != view) {
+ ((RadioButton) view.findViewById(R.id.account_checked)).toggle();
+ }
+ mAdapter.setSelectedAccount(pos);
+ accountSelectedNotifyAccountList(mAdapter.getItem(pos));
// setSelection(cursor.getPosition(),true);
}
@@ -93,16 +95,23 @@
};
+ public void populate(ISipService service, ArrayList<String> accountList) {
+ Log.i(TAG, "populate");
+ serviceRef = service;
+ mAdapter = new AccountSelectionAdapter(mContext, serviceRef, accountList);
+ setOnItemSelectedListener(onClick);
+ setAdapter(mAdapter);
+ }
/****************************************
* AccountManagementUI Interface
****************************************/
-
+
@Override
public void setAccountList(AccountListReceiver accountList) {
- Log.i(TAG,"setAccountList");
+ Log.i(TAG, "setAccountList");
mAccountList = accountList;
-
+
}
@Override
@@ -115,16 +124,15 @@
@Override
public void setSelectedAccount(String accountID) {
- Log.i(TAG,"Account Selected");
+ Log.i(TAG, "Account Selected");
// setText(accountID);
}
@Override
public void accountAdded(ArrayList<String> newList) {
- mListAdapter = new ArrayAdapter(mContext, android.R.layout.simple_expandable_list_item_1, newList.toArray());
-
+ mAdapter = new AccountSelectionAdapter(mContext, serviceRef, newList);
setOnItemSelectedListener(onClick);
- setAdapter(mListAdapter);
+ setAdapter(mAdapter);
// Log.i(TAG, "Account added");
// mList = newList;
//
@@ -135,11 +143,12 @@
@Override
public void accountRemoved() {
- Log.i(TAG,"Account Removed");
+ Log.i(TAG, "Account Removed");
}
@Override
public void accountUpdated() {
- Log.i(TAG,"Account Updated");
+ Log.i(TAG, "Account Updated");
}
+
}
diff --git a/src/com/savoirfairelinux/sflphone/adapters/AccountSelectionAdapter.java b/src/com/savoirfairelinux/sflphone/adapters/AccountSelectionAdapter.java
new file mode 100644
index 0000000..7f4b099
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/adapters/AccountSelectionAdapter.java
@@ -0,0 +1,232 @@
+package com.savoirfairelinux.sflphone.adapters;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Stack;
+
+import android.app.Activity;
+import android.content.Context;
+import android.net.Uri;
+import android.os.RemoteException;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.RadioButton;
+import android.widget.TextView;
+
+import com.savoirfairelinux.sflphone.R;
+import com.savoirfairelinux.sflphone.account.AccountDetailBasic;
+import com.savoirfairelinux.sflphone.service.ISipService;
+
+public class AccountSelectionAdapter extends BaseAdapter {
+
+ private static final String TAG = AccountSelectionAdapter.class.getSimpleName();
+
+ ArrayList<String> accountIDs;
+ Context mContext;
+ AccountManager accManager;
+ ISipService service;
+ int selectedAccount = 0;
+
+ public AccountSelectionAdapter(Context cont, ISipService s, ArrayList<String> newList) {
+ super();
+ accountIDs = newList;
+ mContext = cont;
+ service = s;
+ accManager = new AccountManager(mContext);
+ }
+
+ @Override
+ public int getCount() {
+ return accountIDs.size();
+ }
+
+ @Override
+ public String getItem(int pos) {
+ return accountIDs.get(pos);
+ }
+
+ @Override
+ public long getItemId(int pos) {
+ return 0;
+ }
+
+ @Override
+ public View getView(int pos, View convertView, ViewGroup parent) {
+ View rowView = convertView;
+ AccountView entryView = null;
+
+ if (rowView == null) {
+ LayoutInflater inflater = LayoutInflater.from(mContext);
+ rowView = inflater.inflate(R.layout.item_account, null);
+
+ entryView = new AccountView();
+ entryView.alias = (TextView) rowView.findViewById(R.id.account_alias);
+ entryView.host = (TextView) rowView.findViewById(R.id.account_host);
+ entryView.select = (RadioButton) rowView.findViewById(R.id.account_checked);
+ rowView.setTag(entryView);
+ } else {
+ entryView = (AccountView) rowView.getTag();
+ }
+
+ accManager.displayAccountDetails(accountIDs.get(pos), entryView);
+ if(pos == selectedAccount){
+ entryView.select.setChecked(true);
+ }
+
+ return rowView;
+ }
+
+ /*********************
+ * ViewHolder Pattern
+ *********************/
+ public class AccountView {
+ public TextView alias;
+ public TextView host;
+ public RadioButton select;
+ }
+
+ /**
+ * Asynchronous account details retriever
+ */
+ public class AccountManager {
+
+ // private static final String TAG = ImageManager.class.getSimpleName();
+
+ private HashMap<String, HashMap<String, String>> accountMap = new HashMap<String, HashMap<String, String>>();
+ private AccountQueue accountQueue = new AccountQueue();
+ private Thread accountLoaderThread = new Thread(new AccountQueueManager());
+
+
+ public AccountManager(Context context) {
+ accountLoaderThread.setPriority(Thread.NORM_PRIORITY - 1);
+
+ }
+
+ public void displayAccountDetails(String id, AccountView account) {
+
+ if (accountMap.containsKey(id)) {
+
+ HashMap<String, String> details = accountMap.get(id);
+ account.alias.setText(details.get(AccountDetailBasic.CONFIG_ACCOUNT_ALIAS));
+ account.host.setText(details.get(AccountDetailBasic.CONFIG_ACCOUNT_HOSTNAME));
+
+ } else {
+ queueAccount(id, account);
+ }
+ }
+
+ private void queueAccount(String id, AccountView row) {
+ // This ImageView might have been used for other images, so we clear
+ // the queue of old tasks before starting.
+ accountQueue.Clean(row);
+ AccountRef p = new AccountRef(id, row);
+
+ synchronized (accountQueue.accountRefsStack) {
+ accountQueue.accountRefsStack.push(p);
+ accountQueue.accountRefsStack.notifyAll();
+ }
+
+ // Start thread if it's not started yet
+ if (accountLoaderThread.getState() == Thread.State.NEW) {
+ accountLoaderThread.start();
+ }
+ }
+
+ /** Classes **/
+
+ private class AccountRef {
+ public String accountID;
+ public AccountView row;
+
+ public AccountRef(String u, AccountView i) {
+ accountID = u;
+ row = i;
+ }
+ }
+
+ private class AccountQueue {
+ private Stack<AccountRef> accountRefsStack = new Stack<AccountRef>();
+
+ // removes all instances of this account
+ public void Clean(AccountView view) {
+
+ for (int i = 0; i < accountRefsStack.size();) {
+ if (accountRefsStack.get(i).row == view)
+ accountRefsStack.remove(i);
+ else
+ ++i;
+ }
+ }
+ }
+
+ private class AccountQueueManager implements Runnable {
+ @Override
+ public void run() {
+ try {
+ while (true) {
+ // Thread waits until there are accountsID in the queue to be retrieved
+ if (accountQueue.accountRefsStack.size() == 0) {
+ synchronized (accountQueue.accountRefsStack) {
+ accountQueue.accountRefsStack.wait();
+ }
+ }
+
+ // When we have accounts to load
+ if (accountQueue.accountRefsStack.size() != 0) {
+ AccountRef accountToLoad;
+
+ synchronized (accountQueue.accountRefsStack) {
+ accountToLoad = accountQueue.accountRefsStack.pop();
+ }
+
+ HashMap<String, String> details = (HashMap<String, String>) service.getAccountDetails(accountToLoad.accountID);
+ accountMap.put(accountToLoad.accountID, details);
+ AccountDisplayer accDisplayer = new AccountDisplayer(details, accountToLoad.row);
+ Activity a = (Activity) mContext;
+
+ a.runOnUiThread(accDisplayer);
+
+ }
+
+ if (Thread.interrupted())
+ break;
+ }
+ } catch (InterruptedException e) {
+ Log.e(TAG, e.toString());
+ } catch (RemoteException e) {
+ Log.e(TAG, e.toString());
+ }
+ }
+ }
+
+ // Used to display details in the UI thread
+ private class AccountDisplayer implements Runnable {
+ HashMap<String, String> displayDetails;
+ AccountView displayRow;
+
+ public AccountDisplayer(HashMap<String, String> details, AccountView row) {
+ displayRow = row;
+ displayDetails = details;
+ }
+
+ public void run() {
+ displayRow.alias.setText(displayDetails.get(AccountDetailBasic.CONFIG_ACCOUNT_ALIAS));
+ displayRow.host.setText(displayDetails.get(AccountDetailBasic.CONFIG_ACCOUNT_HOSTNAME));
+ }
+ }
+
+ public void removeFromCache(Uri uri) {
+ if (accountMap.containsKey(uri)) {
+ accountMap.remove(uri);
+ }
+ }
+ }
+
+ public void setSelectedAccount(int pos) {
+ selectedAccount = pos;
+ }
+
+}
diff --git a/src/com/savoirfairelinux/sflphone/adapters/CallElementAdapter.java b/src/com/savoirfairelinux/sflphone/adapters/CallElementAdapter.java
new file mode 100644
index 0000000..5196cf8
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/adapters/CallElementAdapter.java
@@ -0,0 +1,87 @@
+package com.savoirfairelinux.sflphone.adapters;
+
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.savoirfairelinux.sflphone.R;
+import com.savoirfairelinux.sflphone.model.SipCall;
+
+/**
+ * A CursorAdapter that creates and update call elements using corresponding contact infos. TODO: handle contact list separatly to allow showing
+ * synchronized contacts on Call cards with multiple contacts etc.
+ */
+public class CallElementAdapter extends ArrayAdapter {
+ private ExecutorService infos_fetcher = Executors.newCachedThreadPool();
+ private Context mContext;
+ private final List mCallList;
+ private static final String CURRENT_STATE_LABEL = " CURRENT STATE: ";
+
+ public CallElementAdapter(Context context, List callList) {
+ super(context, R.layout.item_contact, callList);
+ mContext = context;
+ mCallList = callList;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View rowView = convertView;
+ CallElementView entryView = null;
+
+ if (rowView == null) {
+ // Get a new instance of the row layout view
+ LayoutInflater inflater = LayoutInflater.from(mContext);
+ rowView = inflater.inflate(R.layout.item_contact, null);
+
+ // Hold the view objects in an object
+ // so they don't need to be re-fetched
+ entryView = new CallElementView();
+ entryView.toggleButton = (ImageButton) rowView.findViewById(R.id.toggleButton1);
+ entryView.button = (Button) rowView.findViewById(R.id.button2);
+ entryView.photo = (ImageView) rowView.findViewById(R.id.photo);
+ entryView.displayName = (TextView) rowView.findViewById(R.id.display_name);
+ entryView.phones = (TextView) rowView.findViewById(R.id.phones);
+ entryView.state = (TextView) rowView.findViewById(R.id.callstate);
+
+ // Cache the view obects in the tag
+ // so they can be re-accessed later
+ rowView.setTag(entryView);
+ } else {
+ entryView = (CallElementView) rowView.getTag();
+ }
+
+ // Transfer the stock data from the data object
+ // to the view objects
+ SipCall call = (SipCall) mCallList.get(position);
+ call.setAssociatedRowView(rowView);
+ entryView.displayName.setText(call.getDisplayName());
+ entryView.phones.setText(call.getPhone());
+ entryView.state.setText(CURRENT_STATE_LABEL + call.getCallStateString());
+
+ return rowView;
+ }
+
+ /*********************
+ * ViewHolder Pattern
+ *********************/
+ public class CallElementView {
+ protected ImageButton toggleButton;
+ protected Button button;
+ protected ImageView photo;
+ protected TextView displayName;
+ protected TextView phones;
+ public TextView state;
+ }
+
+
+}
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
index ad06924..226a4a3 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
@@ -263,9 +263,6 @@
unbindService(mConnection);
mBound = false;
}
- // Log.i(TAG, "onDestroy: stopping SipService...");
- // stopService(new Intent(this, SipService.class));
- // mApplication.setServiceRunning(false);
/* unregister broadcast receiver */
LocalBroadcastManager.getInstance(this).unregisterReceiver(mCallList);
@@ -273,6 +270,8 @@
super.onDestroy();
}
+
+
/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {
@@ -283,6 +282,7 @@
mApplication.setSipService(service);
mBound = true;
mAccountList.setSipService(service);
+ mCallElementList.onServiceSipBinded(service);
Log.d(TAG, "Service connected service=" + service);
}
@@ -294,25 +294,6 @@
}
};
- // private void startSipService() {
- // Thread thread = new Thread("StartSFLphoneService") {
- // public void run() {
- // Intent sipServiceIntent = new Intent(SFLPhoneHome.this, SipService.class);
- // //sipServiceIntent.putExtra(ServiceConstants.EXTRA_OUTGOING_ACTIVITY, new ComponentName(SFLPhoneHome.this, SFLPhoneHome.class));
- // startService(sipServiceIntent);
- // mApplication.setServiceRunning(true);
- // };
- // };
- // try {
- // thread.start();
- // } catch (IllegalThreadStateException e) {
- // AlertDialog.Builder builder = new AlertDialog.Builder(this);
- // builder.setMessage("Cannot start SFLPhone SipService!");
- // AlertDialog alert = builder.create();
- // alert.show();
- // finish();
- // }
- // }
@Override
public boolean onOptionsItemSelected(MenuItem item) {
diff --git a/src/com/savoirfairelinux/sflphone/fragments/AccountManagementFragment.java b/src/com/savoirfairelinux/sflphone/fragments/AccountManagementFragment.java
index 4881381..e4d72c9 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/AccountManagementFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/AccountManagementFragment.java
@@ -180,8 +180,24 @@
} catch (RemoteException e) {
Log.e(TAG, "Cannot call service method", e);
}
-
}
+
+ private void setAccountDetails(String accountID, HashMap<String, String> accountDetails) {
+ try {
+ service.setAccountDetails(accountID, accountDetails);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Cannot call service method", e);
+ }
+ }
+
+ private void deleteSelectedAccount(String accountID) {
+ Log.i(TAG, "DeleteSelectedAccount");
+ try {
+ service.removeAccount(accountID);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Cannot call service method", e);
+ }
+ };
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
@@ -256,14 +272,7 @@
startActivityForResult(intent, ACCOUNT_EDIT_REQUEST);
}
- private void deleteSelectedAccount(String accountID) {
- Log.i(TAG, "DeleteSelectedAccount");
- try {
- service.removeAccount(accountID);
- } catch (RemoteException e) {
- Log.e(TAG, "Cannot call service method", e);
- }
- };
+
private ArrayList<String> getAccountList() {
ArrayList<String> accountList = null;
@@ -290,13 +299,7 @@
return accountDetails;
}
- private void setAccountDetails(String accountID, HashMap<String, String> accountDetails) {
- try {
- service.setAccountDetails(accountID, accountDetails);
- } catch (RemoteException e) {
- Log.e(TAG, "Cannot call service method", e);
- }
- }
+
public PreferenceScreen getAccountListPreferenceScreen() {
Activity currentContext = getActivity();
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallElementListFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallElementListFragment.java
index 48535cd..fb9f83b 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallElementListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallElementListFragment.java
@@ -33,8 +33,6 @@
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
import android.app.Activity;
import android.app.AlertDialog;
@@ -51,6 +49,7 @@
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
+import android.os.RemoteException;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds;
import android.provider.ContactsContract.CommonDataKinds.Phone;
@@ -62,19 +61,14 @@
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.ImageButton;
-import android.widget.ImageView;
import android.widget.ListView;
-import android.widget.TextView;
import com.savoirfairelinux.sflphone.R;
import com.savoirfairelinux.sflphone.account.AccountSelectionSpinner;
+import com.savoirfairelinux.sflphone.adapters.CallElementAdapter;
import com.savoirfairelinux.sflphone.client.SFLPhoneHomeActivity;
import com.savoirfairelinux.sflphone.client.SFLphoneApplication;
import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver;
-import com.savoirfairelinux.sflphone.model.ContactManager;
import com.savoirfairelinux.sflphone.model.SipCall;
import com.savoirfairelinux.sflphone.service.ISipService;
@@ -83,16 +77,19 @@
*/
public class CallElementListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
private static final String TAG = CallElementListFragment.class.getSimpleName();
- private static final String CURRENT_STATE_LABEL = " CURRENT STATE: ";
- private ContactManager mContactManager;
+
+ // private ContactManager mContactManager;
private CallElementAdapter mAdapter;
private String mCurFilter;
private SFLPhoneHomeActivity sflphoneHome;
- private SFLphoneApplication sflphoneApplication;
+ // private SFLphoneApplication sflphoneApplication;
private ISipService service;
- private AccountSelectionSpinner mAccountSelectionButton;
+ private AccountSelectionSpinner mAccountSelectionSpinner;
+
private AccountListReceiver mAccountList;
+ private boolean isReady = false;
+
static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.PHOTO_ID, Contacts.LOOKUP_KEY };
static final String[] CONTACTS_PHONES_PROJECTION = new String[] { Phone.NUMBER, Phone.TYPE };
static final String[] CONTACTS_SIP_PROJECTION = new String[] { SipAddress.SIP_ADDRESS, SipAddress.TYPE };
@@ -170,69 +167,6 @@
}
}
- /**
- * A CursorAdapter that creates and update call elements using corresponding contact infos. TODO: handle contact list separatly to allow showing
- * synchronized contacts on Call cards with multiple contacts etc.
- */
- public static class CallElementAdapter extends ArrayAdapter {
- private ExecutorService infos_fetcher = Executors.newCachedThreadPool();
- private Context mContext;
- private final List mCallList;
-
- public CallElementAdapter(Context context, List callList) {
- super(context, R.layout.item_contact, callList);
- mContext = context;
- mCallList = callList;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View rowView = convertView;
- CallElementView entryView = null;
-
- if (rowView == null) {
- // Get a new instance of the row layout view
- LayoutInflater inflater = LayoutInflater.from(mContext);
- rowView = inflater.inflate(R.layout.item_contact, null);
-
- // Hold the view objects in an object
- // so they don't need to be re-fetched
- entryView = new CallElementView();
- entryView.toggleButton = (ImageButton) rowView.findViewById(R.id.toggleButton1);
- entryView.button = (Button) rowView.findViewById(R.id.button2);
- entryView.photo = (ImageView) rowView.findViewById(R.id.photo);
- entryView.displayName = (TextView) rowView.findViewById(R.id.display_name);
- entryView.phones = (TextView) rowView.findViewById(R.id.phones);
- entryView.state = (TextView) rowView.findViewById(R.id.callstate);
-
- // Cache the view obects in the tag
- // so they can be re-accessed later
- rowView.setTag(entryView);
- } else {
- entryView = (CallElementView) rowView.getTag();
- }
-
- // Transfer the stock data from the data object
- // to the view objects
- SipCall call = (SipCall) mCallList.get(position);
- call.setAssociatedRowView(rowView);
- entryView.displayName.setText(call.getDisplayName());
- entryView.phones.setText(call.getPhone());
- entryView.state.setText(CURRENT_STATE_LABEL + call.getCallStateString());
-
- return rowView;
- }
- };
-
- public static class CallElementView {
- protected ImageButton toggleButton;
- protected Button button;
- protected ImageView photo;
- protected TextView displayName;
- protected TextView phones;
- public TextView state;
- }
-
public CallElementListFragment() {
super();
}
@@ -282,8 +216,8 @@
Log.i(TAG, "On Long Click");
final CharSequence[] items = { "Hang up Call", "Send Message", "Add to Conference" };
final SipCall call = (SipCall) mAdapter.getItem(pos);
- // FIXME
- service = sflphoneApplication.getSipService();
+ // // FIXME
+ // service = sflphoneApplication.getSipService();
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Action to perform with " + call.mCallInfo.mDisplayName).setCancelable(true)
.setItems(items, new DialogInterface.OnClickListener() {
@@ -318,12 +252,17 @@
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ Log.i(TAG, "onCreateView");
View inflatedView = inflater.inflate(R.layout.frag_call_element, container, false);
- mAccountSelectionButton = (AccountSelectionSpinner) inflatedView.findViewById(R.id.account_selection_button);
- mAccountList.addManagementUI(mAccountSelectionButton);
- mAccountSelectionButton.setAccountList(mAccountList);
+ mAccountSelectionSpinner = (AccountSelectionSpinner) inflatedView.findViewById(R.id.account_selection_button);
+ mAccountList.addManagementUI(mAccountSelectionSpinner);
+ mAccountSelectionSpinner.setAccountList(mAccountList);
+ isReady = true;
+ if (service != null) {
+ onServiceSipBinded(service);
+ }
return inflatedView;
}
@@ -340,7 +279,7 @@
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
- Log.i(TAG,"onCreateLoader");
+ Log.i(TAG, "onCreateLoader");
// return new CursorLoader(getActivity(), CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
// This is called when a new Loader needs to be created. This
@@ -366,6 +305,7 @@
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ Log.i(TAG, "onLoadFinished");
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
// mAdapter.swapCursor(data);
@@ -383,4 +323,25 @@
// longer using it.
// mAdapter.swapCursor(null);
}
+
+ /**
+ * Called by activity to pass a reference to sipservice to Fragment.
+ *
+ * @param isip
+ */
+ public void onServiceSipBinded(ISipService isip) {
+
+ if (isReady) {
+ service = isip;
+ ArrayList<String> accountList;
+ try {
+ accountList = (ArrayList<String>) service.getAccountList();
+ mAccountSelectionSpinner.populate(service, accountList);
+ } catch (RemoteException e) {
+ Log.i(TAG, e.toString());
+ }
+ }
+
+ }
+
}
diff --git a/src/com/savoirfairelinux/sflphone/model/SipCall.java b/src/com/savoirfairelinux/sflphone/model/SipCall.java
index 0466cdf..679d2df 100644
--- a/src/com/savoirfairelinux/sflphone/model/SipCall.java
+++ b/src/com/savoirfairelinux/sflphone/model/SipCall.java
@@ -30,21 +30,22 @@
*/
package com.savoirfairelinux.sflphone.model;
+import java.util.ArrayList;
+
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.os.Parcelable;
import android.os.Parcel;
+import android.os.Parcelable;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
-import java.util.ArrayList;
-import com.savoirfairelinux.sflphone.service.ISipService;
+import com.savoirfairelinux.sflphone.adapters.CallElementAdapter.CallElementView;
import com.savoirfairelinux.sflphone.client.CallActivity;
import com.savoirfairelinux.sflphone.client.SFLPhoneHomeActivity;
import com.savoirfairelinux.sflphone.fragments.CallElementListFragment;
-import com.savoirfairelinux.sflphone.fragments.CallElementListFragment.CallElementView;
+import com.savoirfairelinux.sflphone.service.ISipService;
public class SipCall
{
diff --git a/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java b/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java
index ab9fbbf..e0d4e58 100644
--- a/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java
+++ b/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java
@@ -32,7 +32,8 @@
private Context mContext;
static public final String SIGNAL_NAME = "signal-name";
- static public final String ACCOUNTS_CHANGED = "accounts-changed";
+ static public final String ACCOUNTS_LOADED = "accounts-loaded";
+ static public final String ACCOUNTS_CHANGED = "accounts-changed";
static public final String ACCOUNT_STATE_CHANGED = "account-state-changed";
public ConfigurationManagerCallback(Context context) {