diff --git a/res/layout/item_account.xml b/res/layout/item_account.xml new file mode 100644 index 0000000000000000000000000000000000000000..2ebaca89fb89606ba5ce110a9cb57ab1fb588e40 --- /dev/null +++ b/res/layout/item_account.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" > + + <TextView + android:id="@+id/account_alias" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentLeft="true" + android:layout_alignParentTop="true" + android:textAppearance="?android:attr/textAppearanceLarge" /> + + <TextView + android:id="@+id/account_host" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentLeft="true" + android:layout_below="@+id/account_alias" + android:textAppearance="?android:attr/textAppearanceSmall" /> + + <RadioButton + android:id="@+id/account_checked" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:focusable="false" + android:clickable="false" + android:layout_alignParentRight="true" + android:layout_centerVertical="true"/> + +</RelativeLayout> \ No newline at end of file diff --git a/src/com/savoirfairelinux/sflphone/account/AccountSelectionSpinner.java b/src/com/savoirfairelinux/sflphone/account/AccountSelectionSpinner.java index 9642fdf4291c1a3cfa28bd82058d36ae949beb1a..f0f63cca65f766d719b40d9f94cc2ef81627669a 100644 --- a/src/com/savoirfairelinux/sflphone/account/AccountSelectionSpinner.java +++ b/src/com/savoirfairelinux/sflphone/account/AccountSelectionSpinner.java @@ -32,23 +32,26 @@ package com.savoirfairelinux.sflphone.account; 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 @@ public class AccountSelectionSpinner extends Spinner implements AccountManagemen 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 class AccountSelectionSpinner extends Spinner implements AccountManagemen }; + 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 @@ public class AccountSelectionSpinner extends Spinner implements AccountManagemen @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 @@ public class AccountSelectionSpinner extends Spinner implements AccountManagemen @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 0000000000000000000000000000000000000000..7f4b099303ab5e439c541b97f9bb615217dd8e95 --- /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 0000000000000000000000000000000000000000..5196cf894fc9b22f8cfc04462d84bbedf327e673 --- /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 ad0692493ae9c3a65f108f07d21e6b468ba33772..226a4a3f0d8fedd3f6dba1d6239da44c8becfc99 100644 --- a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java +++ b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java @@ -263,9 +263,6 @@ public class SFLPhoneHomeActivity extends Activity implements ActionBar.TabListe 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 @@ public class SFLPhoneHomeActivity extends Activity implements ActionBar.TabListe super.onDestroy(); } + + /** Defines callbacks for service binding, passed to bindService() */ private ServiceConnection mConnection = new ServiceConnection() { @@ -283,6 +282,7 @@ public class SFLPhoneHomeActivity extends Activity implements ActionBar.TabListe mApplication.setSipService(service); mBound = true; mAccountList.setSipService(service); + mCallElementList.onServiceSipBinded(service); Log.d(TAG, "Service connected service=" + service); } @@ -294,25 +294,6 @@ public class SFLPhoneHomeActivity extends Activity implements ActionBar.TabListe } }; - // 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 4881381e0410caff64a7fb139d9534d23cae9436..e4d72c9edd3d0945874cd10fc41dc6f6db22b100 100644 --- a/src/com/savoirfairelinux/sflphone/fragments/AccountManagementFragment.java +++ b/src/com/savoirfairelinux/sflphone/fragments/AccountManagementFragment.java @@ -180,8 +180,24 @@ public class AccountManagementFragment extends PreferenceFragment { } 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 @@ public class AccountManagementFragment extends PreferenceFragment { 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 @@ public class AccountManagementFragment extends PreferenceFragment { 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 48535cd05ef271927f335fb127ce66ecc9d1e306..fb9f83b7b1e34c3bbea04183203d7130cb206ae5 100644 --- a/src/com/savoirfairelinux/sflphone/fragments/CallElementListFragment.java +++ b/src/com/savoirfairelinux/sflphone/fragments/CallElementListFragment.java @@ -33,8 +33,6 @@ package com.savoirfairelinux.sflphone.fragments; 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.Bitmap; 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.View; 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 @@ import com.savoirfairelinux.sflphone.service.ISipService; */ 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 @@ public class CallElementListFragment extends ListFragment implements LoaderManag } } - /** - * 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 @@ public class CallElementListFragment extends ListFragment implements LoaderManag 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 @@ public class CallElementListFragment extends ListFragment implements LoaderManag @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 @@ public class CallElementListFragment extends ListFragment implements LoaderManag @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 @@ public class CallElementListFragment extends ListFragment implements LoaderManag @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 @@ public class CallElementListFragment extends ListFragment implements LoaderManag // 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 0466cdf7d8ed713cd7fe65db506206ae7a3b7d37..679d2dfe3aa45bb7f3748f1e46c7bb377e211ca7 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 ab9fbbfe91574c586f72e27d36c6a2560c8a85bd..e0d4e58d08402dcb7438dac6f38e7bf10eaf0415 100644 --- a/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java +++ b/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java @@ -32,7 +32,8 @@ public class ConfigurationManagerCallback extends ConfigurationCallback { 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) {