Skip to content
Snippets Groups Projects
Commit 5f899634 authored by alision's avatar alision
Browse files

'Refactoring, and added ISipClient.aidl'

parent 17052d46
No related branches found
No related tags found
No related merge requests found
Showing
with 591 additions and 619 deletions
/*
* Copyright (C) 2004-2012 Savoir-Faire Linux Inc.
*
* Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* Additional permission under GNU GPL version 3 section 7:
*
* If you modify this program, or any covered work, by linking or
* combining it with the OpenSSL project's OpenSSL library (or a
* modified version of that library), containing parts covered by the
* terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
* grants you additional permission to convey the resulting work.
* Corresponding Source for a non-source form of such a combination
* shall include the source code for the parts of OpenSSL used as well
* as that of the covered work.
*/
package com.savoirfairelinux.sflphone.account;
import java.util.ArrayList;
import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver;
public interface AccountManagementUI
{
public void setAccountList(AccountListReceiver accountList);
public void accountSelectedNotifyAccountList(String accountID);
public void setSelectedAccount(String accountID);
public void accountAdded(ArrayList<String> newList);
public void accountRemoved();
public void accountUpdated();
}
......@@ -45,7 +45,7 @@ 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 {
public class AccountSelectionSpinner extends Spinner {
private static final String TAG = AccountSelectionSpinner.class.getSimpleName();
public static final String DEFAULT_ACCOUNT_ID = "IP2IP";
private Context mContext;
......@@ -82,7 +82,7 @@ public class AccountSelectionSpinner extends Spinner implements AccountManagemen
((RadioButton) view.findViewById(R.id.account_checked)).toggle();
}
mAdapter.setSelectedAccount(pos);
accountSelectedNotifyAccountList(mAdapter.getItem(pos));
// accountSelectedNotifyAccountList(mAdapter.getItem(pos));
// setSelection(cursor.getPosition(),true);
}
......@@ -107,48 +107,48 @@ public class AccountSelectionSpinner extends Spinner implements AccountManagemen
* AccountManagementUI Interface
****************************************/
@Override
public void setAccountList(AccountListReceiver accountList) {
Log.i(TAG, "setAccountList");
mAccountList = accountList;
}
@Override
public void accountSelectedNotifyAccountList(String accountID) {
Log.i(TAG, "->accountSelectedNotifyAccountList");
if (mAccountList != null) {
mAccountList.accountSelected(accountID, this);
}
}
@Override
public void setSelectedAccount(String accountID) {
Log.i(TAG, "Account Selected");
// setText(accountID);
}
@Override
public void accountAdded(ArrayList<String> newList) {
mAdapter = new AccountSelectionAdapter(mContext, serviceRef, newList);
setOnItemSelectedListener(onClick);
setAdapter(mAdapter);
// Log.i(TAG, "Account added");
// mList = newList;
//
// if(newList.size() == 1) {
// setText(newList.get(0));
// }
}
@Override
public void accountRemoved() {
Log.i(TAG, "Account Removed");
}
@Override
public void accountUpdated() {
Log.i(TAG, "Account Updated");
}
// @Override
// public void setAccountList(AccountListReceiver accountList) {
// Log.i(TAG, "setAccountList");
// mAccountList = accountList;
//
// }
//
// @Override
// public void accountSelectedNotifyAccountList(String accountID) {
// Log.i(TAG, "->accountSelectedNotifyAccountList");
// if (mAccountList != null) {
// mAccountList.accountSelected(accountID, this);
// }
// }
//
// @Override
// public void setSelectedAccount(String accountID) {
// Log.i(TAG, "Account Selected");
// // setText(accountID);
// }
//
// @Override
// public void accountAdded(ArrayList<String> newList) {
// mAdapter = new AccountSelectionAdapter(mContext, serviceRef, newList);
// setOnItemSelectedListener(onClick);
// setAdapter(mAdapter);
// // Log.i(TAG, "Account added");
// // mList = newList;
// //
// // if(newList.size() == 1) {
// // setText(newList.get(0));
// // }
// }
//
// @Override
// public void accountRemoved() {
// Log.i(TAG, "Account Removed");
// }
//
// @Override
// public void accountUpdated() {
// Log.i(TAG, "Account Updated");
// }
}
......@@ -8,7 +8,7 @@ import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
......@@ -19,14 +19,14 @@ 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 {
public class CallElementAdapter extends BaseAdapter {
private ExecutorService infos_fetcher = Executors.newCachedThreadPool();
private Context mContext;
private final List mCallList;
private final List<SipCall> mCallList;
private static final String CURRENT_STATE_LABEL = " CURRENT STATE: ";
public CallElementAdapter(Context context, List callList) {
super(context, R.layout.item_contact, callList);
public CallElementAdapter(Context context, List<SipCall> callList) {
super();
mContext = context;
mCallList = callList;
}
......@@ -76,6 +76,31 @@ public class CallElementAdapter extends ArrayAdapter {
protected TextView phones;
public TextView state;
}
@Override
public int getCount() {
return mCallList.size();
}
@Override
public Object getItem(int pos) {
return mCallList.get(pos);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
public void add(SipCall c) {
mCallList.add(c);
}
public void remove(SipCall c) {
mCallList.remove(c);
}
}
......@@ -44,487 +44,473 @@ import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v13.app.FragmentStatePagerAdapter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.widget.EditText;
import android.widget.ImageButton;
import com.savoirfairelinux.sflphone.R;
import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver;
import com.savoirfairelinux.sflphone.client.receiver.CallListReceiver;
import com.savoirfairelinux.sflphone.fragments.ButtonSectionFragment;
import com.savoirfairelinux.sflphone.fragments.CallElementListFragment;
import com.savoirfairelinux.sflphone.fragments.ContactListFragment;
import com.savoirfairelinux.sflphone.fragments.HistoryFragment;
import com.savoirfairelinux.sflphone.model.SipCall;
import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
import com.savoirfairelinux.sflphone.service.ConfigurationManagerCallback;
import com.savoirfairelinux.sflphone.service.ISipClient;
import com.savoirfairelinux.sflphone.service.ISipService;
import com.savoirfairelinux.sflphone.service.SipService;
public class SFLPhoneHomeActivity extends Activity implements ActionBar.TabListener, OnClickListener {
SectionsPagerAdapter mSectionsPagerAdapter = null;
static final String TAG = "SFLPhoneHome";
private static final int REQUEST_CODE_PREFERENCES = 1;
ImageButton buttonCall, buttonHangup;
static Animation animation;
private ContactListFragment mContactListFragment = null;
private CallElementListFragment mCallElementList = null;
private HistoryFragment mHistorySectionFragment = null;
private ButtonSectionFragment mButtonSectionFragment = null;
private boolean mBound = false;
private ISipService service;
public AccountListReceiver mAccountList;
public CallListReceiver mCallList = new CallListReceiver(this);
private SFLphoneApplication mApplication;
private static final int ACTION_BAR_TAB_CONTACT = 0;
private static final int ACTION_BAR_TAB_CALL = 1;
private static final int ACTION_BAR_TAB_HISTORY = 2;
private static final int ACTION_BAR_TAB_TEST = 3;
/**
* The {@link ViewPager} that will host the section contents.
*/
ViewPager mViewPager;
final private int[] icon_res_id = { R.drawable.ic_tab_call, R.drawable.ic_tab_call, R.drawable.ic_tab_history, R.drawable.ic_tab_play_selected };
// public SFLPhoneHome extends Activity implements ActionBar.TabListener, OnClickListener
/* called before activity is killed, e.g. rotation */
@Override
protected void onSaveInstanceState(Bundle bundle) {
super.onSaveInstanceState(bundle);
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
try {
/* putFragment (Bundle bundle, String key, Fragment fragment) */
getFragmentManager().putFragment(bundle, mSectionsPagerAdapter.getClassName(i), mSectionsPagerAdapter.getFragment(i));
} catch (IllegalStateException e) {
Log.e(TAG, "IllegalStateException: fragment=" + mSectionsPagerAdapter.getFragment(i));
}
}
Log.w(TAG, "onSaveInstanceState()");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mApplication = (SFLphoneApplication) getApplication();
// Bind to LocalService
if (!mBound) {
Log.i(TAG, "onStart: Binding service...");
Intent intent = new Intent(this, SipService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
setContentView(R.layout.activity_sflphone_home);
if (mSectionsPagerAdapter == null) {
mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());
}
/* getFragment(Bundle, String) */
if (savedInstanceState != null) {
Log.w(TAG, "Activity restarted, recreating PagerAdapter...");
/* getFragment (Bundle bundle, String key) */
mContactListFragment = (ContactListFragment) getFragmentManager().getFragment(savedInstanceState,
mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_CONTACT));
mCallElementList = (CallElementListFragment) getFragmentManager().getFragment(savedInstanceState,
mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_CALL));
mHistorySectionFragment = (HistoryFragment) getFragmentManager().getFragment(savedInstanceState,
mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_HISTORY));
mButtonSectionFragment = (ButtonSectionFragment) getFragmentManager().getFragment(savedInstanceState,
mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_TEST));
}
if (mContactListFragment == null) {
mContactListFragment = new ContactListFragment();
Log.w(TAG, "Recreated mContactListFragment=" + mContactListFragment);
}
if (mCallElementList == null) {
mCallElementList = new CallElementListFragment();
Log.w(TAG, "Recreated mCallElementList=" + mCallElementList);
}
if (mHistorySectionFragment == null) {
mHistorySectionFragment = new HistoryFragment();
Log.w(TAG, "Recreated mHistorySectionFragment=" + mHistorySectionFragment);
}
if (mButtonSectionFragment == null) {
mButtonSectionFragment = new ButtonSectionFragment();
Log.w(TAG, "Recreated mButtonSectionFragment=" + mButtonSectionFragment);
}
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// final ActionBar actionBar = getActionBar();
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
// When swiping between different sections, select the corresponding tab.
// We can also use ActionBar.Tab#select() to do this if we have a reference to the
// Tab.
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
// For each of the sections in the app, add a tab to the action bar.
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
// Create a tab with text corresponding to the page title defined by the adapter.
// Also specify this Activity object, which implements the TabListener interface, as the
// listener for when this tab is selected.
actionBar.addTab(actionBar.newTab().setIcon(icon_res_id[i]).setText(mSectionsPagerAdapter.getPageTitle(i)).setTabListener(this));
}
actionBar.setSelectedNavigationItem(ACTION_BAR_TAB_CALL);
buttonCall = (ImageButton) findViewById(R.id.buttonCall);
buttonHangup = (ImageButton) findViewById(R.id.buttonHangUp);
// Change alpha from fully visible to invisible
animation = new AlphaAnimation(1, 0);
// duration - half a second
animation.setDuration(500);
// do not alter animation rate
animation.setInterpolator(new LinearInterpolator());
// Repeat animation infinitely
animation.setRepeatCount(Animation.INFINITE);
// Reverse
animation.setRepeatMode(Animation.REVERSE);
IntentFilter callFilter = new IntentFilter(CallManagerCallBack.NEW_CALL_CREATED);
callFilter.addAction(CallManagerCallBack.INCOMING_CALL);
callFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
LocalBroadcastManager.getInstance(this).registerReceiver(mCallList, callFilter);
mAccountList = mApplication.getAccountList();
Log.w(TAG, "mAccountList=" + mAccountList + ", mCallElementList=" + mCallElementList);
IntentFilter accountFilter = new IntentFilter(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
public class SFLPhoneHomeActivity extends Activity implements ActionBar.TabListener {
SectionsPagerAdapter mSectionsPagerAdapter = null;
static final String TAG = "SFLPhoneHome";
private static final int REQUEST_CODE_PREFERENCES = 1;
ImageButton buttonCall, buttonHangup;
private ContactListFragment mContactListFragment = null;
private CallElementListFragment mCallElementList = null;
private HistoryFragment mHistorySectionFragment = null;
private boolean mBound = false;
private ISipService service;
// public AccountListReceiver mAccountList;
// public CallListReceiver mCallList = new CallListReceiver(this);
private SFLphoneApplication mApplication;
private static final int ACTION_BAR_TAB_CONTACT = 0;
private static final int ACTION_BAR_TAB_CALL = 1;
private static final int ACTION_BAR_TAB_HISTORY = 2;
/**
* The {@link ViewPager} that will host the section contents.
*/
ViewPager mViewPager;
final private int[] icon_res_id = { R.drawable.ic_tab_call, R.drawable.ic_tab_call, R.drawable.ic_tab_history };
// public SFLPhoneHome extends Activity implements ActionBar.TabListener, OnClickListener
/* called before activity is killed, e.g. rotation */
@Override
protected void onSaveInstanceState(Bundle bundle) {
super.onSaveInstanceState(bundle);
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
try {
/* putFragment (Bundle bundle, String key, Fragment fragment) */
getFragmentManager().putFragment(bundle, mSectionsPagerAdapter.getClassName(i), mSectionsPagerAdapter.getFragment(i));
} catch (IllegalStateException e) {
Log.e(TAG, "IllegalStateException: fragment=" + mSectionsPagerAdapter.getFragment(i));
}
}
Log.w(TAG, "onSaveInstanceState()");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mApplication = (SFLphoneApplication) getApplication();
// Bind to LocalService
if (!mBound) {
Log.i(TAG, "onStart: Binding service...");
Intent intent = new Intent(this, SipService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
setContentView(R.layout.activity_sflphone_home);
if (mSectionsPagerAdapter == null) {
mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());
}
/* getFragment(Bundle, String) */
if (savedInstanceState != null) {
Log.w(TAG, "Activity restarted, recreating PagerAdapter...");
/* getFragment (Bundle bundle, String key) */
mContactListFragment = (ContactListFragment) getFragmentManager().getFragment(savedInstanceState,
mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_CONTACT));
mCallElementList = (CallElementListFragment) getFragmentManager().getFragment(savedInstanceState,
mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_CALL));
mHistorySectionFragment = (HistoryFragment) getFragmentManager().getFragment(savedInstanceState,
mSectionsPagerAdapter.getClassName(ACTION_BAR_TAB_HISTORY));
}
if (mContactListFragment == null) {
mContactListFragment = new ContactListFragment();
Log.w(TAG, "Recreated mContactListFragment=" + mContactListFragment);
}
if (mCallElementList == null) {
mCallElementList = new CallElementListFragment();
Log.w(TAG, "Recreated mCallElementList=" + mCallElementList);
}
if (mHistorySectionFragment == null) {
mHistorySectionFragment = new HistoryFragment();
Log.w(TAG, "Recreated mHistorySectionFragment=" + mHistorySectionFragment);
}
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// final ActionBar actionBar = getActionBar();
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
// When swiping between different sections, select the corresponding tab.
// We can also use ActionBar.Tab#select() to do this if we have a reference to the
// Tab.
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
// For each of the sections in the app, add a tab to the action bar.
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
// Create a tab with text corresponding to the page title defined by the adapter.
// Also specify this Activity object, which implements the TabListener interface, as the
// listener for when this tab is selected.
actionBar.addTab(actionBar.newTab().setIcon(icon_res_id[i]).setText(mSectionsPagerAdapter.getPageTitle(i)).setTabListener(this));
}
actionBar.setSelectedNavigationItem(ACTION_BAR_TAB_CALL);
buttonCall = (ImageButton) findViewById(R.id.buttonCall);
buttonHangup = (ImageButton) findViewById(R.id.buttonHangUp);
buttonCall.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
processingNewCallAction();
}
});
buttonHangup.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
processingHangUpAction();
}
});
// IntentFilter callFilter = new IntentFilter(CallManagerCallBack.NEW_CALL_CREATED);
// callFilter.addAction(CallManagerCallBack.INCOMING_CALL);
// callFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
// LocalBroadcastManager.getInstance(this).registerReceiver(mCallList, callFilter);
//
// mAccountList = mApplication.getAccountList();
// Log.w(TAG, "mAccountList=" + mAccountList + ", mCallElementList=" + mCallElementList);
IntentFilter accountFilter = new IntentFilter(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
accountFilter.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
LocalBroadcastManager.getInstance(this).registerReceiver(mAccountList, accountFilter);
SipCall.setSFLPhoneHomeContext(this);
}
@Override
protected void onStart() {
Log.i(TAG, "onStart");
super.onStart();
}
/* user gets back to the activity, e.g. through task manager */
@Override
protected void onRestart() {
super.onRestart();
}
/* activity gets back to the foreground and user input */
@Override
protected void onResume() {
Log.i(TAG, "onResume");
super.onResume();
}
/* activity no more in foreground */
@Override
protected void onPause() {
super.onPause();
}
/* activity is no longer visible */
@Override
protected void onStop() {
super.onStop();
}
/* activity finishes itself or is being killed by the system */
@Override
protected void onDestroy() {
/* stop the service, if no other bound user, no need to check if it is running */
if (mBound) {
Log.i(TAG, "onStop: Unbinding service...");
unbindService(mConnection);
mBound = false;
}
/* unregister broadcast receiver */
LocalBroadcastManager.getInstance(this).unregisterReceiver(mCallList);
LocalBroadcastManager.getInstance(this).unregisterReceiver(mAccountList);
super.onDestroy();
}
/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder binder) {
service = ISipService.Stub.asInterface(binder);
mApplication.setSipService(service);
mBound = true;
mAccountList.setSipService(service);
mCallElementList.onServiceSipBinded(service);
Log.d(TAG, "Service connected service=" + service);
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mApplication.setSipService(null);
mBound = false;
Log.d(TAG, "Service disconnected service=" + service);
}
};
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.i("SFLphone", "onOptionsItemSelected " + item.getItemId());
if (item.getItemId() != 0) {
// When the button is clicked, launch an activity through this intent
Intent launchPreferencesIntent = new Intent().setClass(this, SFLPhonePreferenceActivity.class);
// Make it a subactivity so we know when it returns
startActivityForResult(launchPreferencesIntent, REQUEST_CODE_PREFERENCES);
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_sflphone_home, menu);
return true;
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
// When the given tab is selected, switch to the corresponding page in the ViewPager.
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
// Log.d(TAG, "onTabReselected");
}
public void onSelectedCallAction(SipCall call) {
int callState = call.getCallStateInt();
if ((callState == SipCall.CALL_STATE_NONE) || (callState == SipCall.CALL_STATE_CURRENT)) {
buttonCall.setEnabled(false);
buttonHangup.setEnabled(true);
} else {
buttonCall.setEnabled(true);
buttonHangup.setEnabled(false);
}
buttonCall.setTag(call);
buttonHangup.setTag(call);
}
public void onUnselectedCallAction() {
buttonCall.setTag(null);
buttonCall.setTag(null);
buttonCall.setEnabled(true);
buttonHangup.setEnabled(false);
}
public void setIncomingCallID(String accountID, String callID, String from) {
Log.i(TAG, "incomingCall(" + accountID + ", " + callID + ", " + from + ")");
buttonCall.startAnimation(animation);
buttonCall.setImageResource(R.drawable.ic_incomingcall);
}
/**
* A {@link FragmentStatePagerAdapter} that returns a fragment corresponding to one of the primary sections of the app.
*/
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
Fragment fragment;
switch (i) {
case 0:
mContactListFragment = new ContactListFragment();
fragment = mContactListFragment;
Log.w(TAG, "getItem() ContactListFragment=" + fragment);
break;
case 1:
mCallElementList = new CallElementListFragment();
SipCall.setCallElementList(mCallElementList);
mCallElementList.setAccountList(mAccountList);
fragment = mCallElementList;
Log.w(TAG, "getItem() CallElementList=" + fragment);
break;
case 2:
fragment = new HistoryFragment();
Log.w(TAG, "getItem() HistoryFragment=" + fragment);
break;
case 3:
fragment = new ButtonSectionFragment();
Log.w(TAG, "getItem() ButtonSectionFragment=" + fragment);
break;
default:
Log.e(TAG, "getItem() unknown tab position " + i);
return null;
}
// Log.i(TAG, "getItem() fragment is " + fragment);
Bundle args = new Bundle();
args.putInt(HistoryFragment.ARG_SECTION_NUMBER, i + 1);
fragment.setArguments(args);
return fragment;
}
public Fragment getFragment(int i) {
Fragment fragment;
switch (i) {
case 0:
fragment = mContactListFragment;
break;
case 1:
fragment = mCallElementList;
break;
case 2:
fragment = mHistorySectionFragment;
break;
case 3:
fragment = mButtonSectionFragment;
break;
default:
Log.e(TAG, "getClassName: unknown fragment position " + i);
fragment = null;
}
// Log.w(TAG, "getFragment: fragment=" + fragment);
return fragment;
}
public String getClassName(int i) {
String name;
switch (i) {
case 0:
name = ContactListFragment.class.getName();
break;
case 1:
name = CallElementListFragment.class.getName();
break;
case 2:
name = HistoryFragment.class.getName();
break;
case 3:
name = ButtonSectionFragment.class.getName();
break;
default:
Log.e(TAG, "getClassName: unknown fragment position " + i);
return null;
}
// Log.w(TAG, "getClassName: name=" + name);
return name;
}
@Override
public int getCount() {
return 4;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return getString(R.string.title_section0).toUpperCase();
case 1:
return getString(R.string.title_section1).toUpperCase();
case 2:
return getString(R.string.title_section2).toUpperCase();
case 3:
return getString(R.string.title_section3).toUpperCase();
default:
Log.e(TAG, "getPageTitle: unknown tab position " + position);
break;
}
return null;
}
}
@Override
public void onClick(View view) {
Log.i(TAG, "onClic from SFLPhoneHome");
switch (view.getId()) {
case R.id.buttonCall:
processingNewCallAction();
break;
case R.id.buttonHangUp:
processingHangUpAction();
break;
default:
Log.w(TAG, "unknown button " + view.getId());
break;
}
}
public void processingNewCallAction() {
// String accountID = mAccountList.currentAccountID;
Log.w(TAG, "processingNewCallAction() mCallElementList=" + mCallElementList);
String accountID = mCallElementList.getSelectedAccount();
EditText editText = (EditText) findViewById(R.id.phoneNumberTextEntry);
String to = editText.getText().toString();
Random random = new Random();
String callID = Integer.toString(random.nextInt());
SipCall.CallInfo info = new SipCall.CallInfo();
info.mCallID = callID;
info.mAccountID = accountID;
info.mDisplayName = "Cool Guy!";
info.mPhone = to;
info.mEmail = "coolGuy@coolGuy.com";
info.mCallType = SipCall.CALL_TYPE_OUTGOING;
SipCall call = CallListReceiver.getCallInstance(info);
call.launchCallActivity(this);
call.placeCallUpdateUi();
call.notifyServicePlaceCall(service);
onSelectedCallAction(call);
}
public void processingHangUpAction() {
SipCall call = (SipCall) buttonHangup.getTag();
if (call != null)
call.notifyServiceHangup(service);
}
// LocalBroadcastManager.getInstance(this).registerReceiver(mAccountList, accountFilter);
SipCall.setSFLPhoneHomeContext(this);
}
@Override
protected void onStart() {
Log.i(TAG, "onStart");
super.onStart();
}
/* user gets back to the activity, e.g. through task manager */
@Override
protected void onRestart() {
super.onRestart();
}
/* activity gets back to the foreground and user input */
@Override
protected void onResume() {
Log.i(TAG, "onResume");
super.onResume();
}
/* activity no more in foreground */
@Override
protected void onPause() {
super.onPause();
}
/* activity is no longer visible */
@Override
protected void onStop() {
super.onStop();
}
/* activity finishes itself or is being killed by the system */
@Override
protected void onDestroy() {
/* stop the service, if no other bound user, no need to check if it is running */
if (mBound) {
Log.i(TAG, "onStop: Unbinding service...");
unbindService(mConnection);
mBound = false;
}
/* unregister broadcast receiver */
// LocalBroadcastManager.getInstance(this).unregisterReceiver(mCallList);
// LocalBroadcastManager.getInstance(this).unregisterReceiver(mAccountList);
super.onDestroy();
}
/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {
private ISipClient callback = new ISipClient.Stub() {
@Override
public void incomingCall() throws RemoteException {
Log.i(TAG,"Incoming call transfered from Service");
}
};
@Override
public void onServiceConnected(ComponentName className, IBinder binder) {
service = ISipService.Stub.asInterface(binder);
try {
service.registerClient(callback );
} catch (RemoteException e) {
Log.e(TAG,e.toString());
}
mApplication.setSipService(service);
mBound = true;
// mAccountList.setSipService(service);
mCallElementList.onServiceSipBinded(service);
Log.d(TAG, "Service connected service=" + service);
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mApplication.setSipService(null);
mBound = false;
Log.d(TAG, "Service disconnected service=" + service);
}
};
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.i("SFLphone", "onOptionsItemSelected " + item.getItemId());
if (item.getItemId() != 0) {
// When the button is clicked, launch an activity through this intent
Intent launchPreferencesIntent = new Intent().setClass(this, SFLPhonePreferenceActivity.class);
// Make it a subactivity so we know when it returns
startActivityForResult(launchPreferencesIntent, REQUEST_CODE_PREFERENCES);
}
return super.onOptionsItemSelected(item);
}
@Override
public void onActivityResult(int requestCode,int resultCode,Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(service != null){
// Refresh Spinner with accounts
mCallElementList.onServiceSipBinded(service);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_sflphone_home, menu);
return true;
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
// When the given tab is selected, switch to the corresponding page in the ViewPager.
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
// Log.d(TAG, "onTabReselected");
}
public void onSelectedCallAction(SipCall call) {
int callState = call.getCallStateInt();
if ((callState == SipCall.CALL_STATE_NONE) || (callState == SipCall.CALL_STATE_CURRENT)) {
buttonCall.setEnabled(false);
buttonHangup.setEnabled(true);
} else {
buttonCall.setEnabled(true);
buttonHangup.setEnabled(false);
}
buttonCall.setTag(call);
buttonHangup.setTag(call);
}
public void onUnselectedCallAction() {
buttonCall.setTag(null);
buttonCall.setTag(null);
buttonCall.setEnabled(true);
buttonHangup.setEnabled(false);
}
public void processingNewCallAction() {
// String accountID = mAccountList.currentAccountID;
Log.w(TAG, "processingNewCallAction() mCallElementList=" + mCallElementList);
String accountID = mCallElementList.getSelectedAccount();
EditText editText = (EditText) findViewById(R.id.phoneNumberTextEntry);
String to = editText.getText().toString();
Random random = new Random();
String callID = Integer.toString(random.nextInt());
SipCall.CallInfo info = new SipCall.CallInfo();
info.mCallID = callID;
info.mAccountID = accountID;
info.mDisplayName = "Cool Guy!";
info.mPhone = to;
info.mEmail = "coolGuy@coolGuy.com";
info.mCallType = SipCall.CALL_TYPE_OUTGOING;
SipCall call = CallListReceiver.getCallInstance(info);
call.launchCallActivity(this);
call.placeCallUpdateUi();
try {
service.placeCall(info.mAccountID, info.mCallID, info.mPhone);
} catch (RemoteException e) {
Log.e(TAG, "Cannot call service method", e);
}
onSelectedCallAction(call);
}
public void processingHangUpAction() {
SipCall call = (SipCall) buttonHangup.getTag();
if (call != null)
call.notifyServiceHangup(service);
}
/**
* A {@link FragmentStatePagerAdapter} that returns a fragment corresponding to one of the primary sections of the app.
*/
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
Fragment fragment;
switch (i) {
case 0:
mContactListFragment = new ContactListFragment();
fragment = mContactListFragment;
Log.w(TAG, "getItem() ContactListFragment=" + fragment);
break;
case 1:
mCallElementList = new CallElementListFragment();
SipCall.setCallElementList(mCallElementList);
// mCallElementList.setAccountList(mAccountList);
fragment = mCallElementList;
Log.w(TAG, "getItem() CallElementList=" + fragment);
break;
case 2:
fragment = new HistoryFragment();
Log.w(TAG, "getItem() HistoryFragment=" + fragment);
break;
default:
Log.e(TAG, "getItem() unknown tab position " + i);
return null;
}
// Log.i(TAG, "getItem() fragment is " + fragment);
Bundle args = new Bundle();
args.putInt(HistoryFragment.ARG_SECTION_NUMBER, i + 1);
fragment.setArguments(args);
return fragment;
}
public Fragment getFragment(int i) {
Fragment fragment;
switch (i) {
case 0:
fragment = mContactListFragment;
break;
case 1:
fragment = mCallElementList;
break;
case 2:
fragment = mHistorySectionFragment;
break;
default:
Log.e(TAG, "getClassName: unknown fragment position " + i);
fragment = null;
}
// Log.w(TAG, "getFragment: fragment=" + fragment);
return fragment;
}
public String getClassName(int i) {
String name;
switch (i) {
case 0:
name = ContactListFragment.class.getName();
break;
case 1:
name = CallElementListFragment.class.getName();
break;
case 2:
name = HistoryFragment.class.getName();
break;
default:
Log.e(TAG, "getClassName: unknown fragment position " + i);
return null;
}
// Log.w(TAG, "getClassName: name=" + name);
return name;
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return getString(R.string.title_section0).toUpperCase();
case 1:
return getString(R.string.title_section1).toUpperCase();
case 2:
return getString(R.string.title_section2).toUpperCase();
case 3:
return getString(R.string.title_section3).toUpperCase();
default:
Log.e(TAG, "getPageTitle: unknown tab position " + position);
break;
}
return null;
}
}
}
......@@ -17,7 +17,6 @@ public class SFLphoneApplication extends Application {
static final String TAG = "SFLphoneApplication";
private boolean serviceRunning = false;
private ISipService sipService;
private AccountListReceiver accountList = new AccountListReceiver();
private void startSipService() {
Thread thread = new Thread("StartSFLphoneService") {
......@@ -79,10 +78,6 @@ public class SFLphoneApplication extends Application {
sipService = service;
}
public AccountListReceiver getAccountList() {
return accountList;
}
public String getAppPath() {
PackageManager pkgMng = getPackageManager();
String pkgName = getPackageName();
......
......@@ -31,15 +31,14 @@
package com.savoirfairelinux.sflphone.client.receiver;
import java.util.ArrayList;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
import android.util.Log;
import java.util.ArrayList;
import com.savoirfairelinux.sflphone.account.AccountManagementUI;
import com.savoirfairelinux.sflphone.service.ConfigurationManagerCallback;
import com.savoirfairelinux.sflphone.service.ISipService;
......@@ -49,7 +48,7 @@ public class AccountListReceiver extends BroadcastReceiver
static final String TAG = "AccountList";
private String currentAccountID = "";
private ArrayList<String> mList = new ArrayList<String>();
private ArrayList<AccountManagementUI> mUserInterfaceList = new ArrayList<AccountManagementUI>();
// private ArrayList<AccountManagementUI> mUserInterfaceList = new ArrayList<AccountManagementUI>();
private static ISipService mService = null;
// private HashMap<String, AccountPreferenceScreen> mAccountList = new HashMap<String, AccountPreferenceScreen>();
......@@ -64,17 +63,17 @@ public class AccountListReceiver extends BroadcastReceiver
}
public void addManagementUI(AccountManagementUI ui) {
mUserInterfaceList.add(ui);
}
public void accountSelected(String accountID, AccountManagementUI userInterface) {
if(!mUserInterfaceList.isEmpty()) {
for(AccountManagementUI ui : mUserInterfaceList) {
ui.setSelectedAccount(accountID);
}
}
}
// public void addManagementUI(AccountManagementUI ui) {
// mUserInterfaceList.add(ui);
// }
//
// public void accountSelected(String accountID, AccountManagementUI userInterface) {
// if(!mUserInterfaceList.isEmpty()) {
// for(AccountManagementUI ui : mUserInterfaceList) {
// ui.setSelectedAccount(accountID);
// }
// }
// }
@Override
public void onReceive(Context context, Intent intent)
......@@ -112,20 +111,20 @@ public class AccountListReceiver extends BroadcastReceiver
newList.remove(DEFAULT_ACCOUNT_ID);
if(!mUserInterfaceList.isEmpty()) {
if(newList.size() > mList.size()) {
for(AccountManagementUI ui : mUserInterfaceList) {
ui.accountAdded(newList);
}
}
}
// if(!mUserInterfaceList.isEmpty()) {
//
// if(newList.size() > mList.size()) {
// for(AccountManagementUI ui : mUserInterfaceList) {
// ui.accountAdded(newList);
// }
// }
// }
mList = newList;
}
private void processAccountStateChanged(Intent intent) {
if(!mUserInterfaceList.isEmpty()) {
}
// if(!mUserInterfaceList.isEmpty()) {
// }
}
}
......@@ -99,7 +99,6 @@ public class CallElementListFragment extends ListFragment implements LoaderManag
super.onAttach(activity);
sflphoneHome = (SFLPhoneHomeActivity) activity;
service = ((SFLphoneApplication) sflphoneHome.getApplication()).getSipService();
mAccountList = ((SFLphoneApplication) sflphoneHome.getApplication()).getAccountList();
Log.w(TAG, "onAttach() service=" + service + ", accountList=" + mAccountList);
}
......@@ -197,7 +196,7 @@ public class CallElementListFragment extends ListFragment implements LoaderManag
setHasOptionsMenu(true);
// Create an empty adapter we will use to display the loaded data.
ArrayList calls = new ArrayList();
ArrayList<SipCall> calls = new ArrayList<SipCall>();
mAdapter = new CallElementAdapter(getActivity(), calls);
setListAdapter(mAdapter);
......@@ -256,8 +255,8 @@ public class CallElementListFragment extends ListFragment implements LoaderManag
View inflatedView = inflater.inflate(R.layout.frag_call_element, container, false);
mAccountSelectionSpinner = (AccountSelectionSpinner) inflatedView.findViewById(R.id.account_selection_button);
mAccountList.addManagementUI(mAccountSelectionSpinner);
mAccountSelectionSpinner.setAccountList(mAccountList);
// mAccountList.addManagementUI(mAccountSelectionSpinner);
// mAccountSelectionSpinner.setAccountList(mAccountList);
isReady = true;
if (service != null) {
......@@ -272,7 +271,6 @@ public class CallElementListFragment extends ListFragment implements LoaderManag
Log.i(TAG, "Call Clicked: " + call.getCallId());
call.launchCallActivity(getActivity());
sflphoneHome.onSelectedCallAction(call);
}
......@@ -331,6 +329,7 @@ public class CallElementListFragment extends ListFragment implements LoaderManag
*/
public void onServiceSipBinded(ISipService isip) {
if (isReady) {
service = isip;
ArrayList<String> accountList;
......
......@@ -91,7 +91,6 @@ public class ContactListFragment extends ListFragment implements OnQueryTextList
private SFLPhoneHomeActivity sflphoneHome;
private SFLphoneApplication sflphoneApplication;
private ISipService service;
private AccountListReceiver mAccountList;
// These are the Contacts rows that we will retrieve.
static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.PHOTO_ID, Contacts.LOOKUP_KEY };
......@@ -104,9 +103,6 @@ public class ContactListFragment extends ListFragment implements OnQueryTextList
sflphoneHome = (SFLPhoneHomeActivity) activity;
sflphoneApplication = (SFLphoneApplication) sflphoneHome.getApplication();
service = sflphoneApplication.getSipService();
mAccountList = sflphoneApplication.getAccountList();
Log.w(TAG, "onAttach() service=" + service + ", mAccountList=" + mAccountList);
}
public static class InfosLoader implements Runnable {
......
......@@ -292,14 +292,6 @@ public class SipCall
mHome.onSelectedCallAction(this);
}
public void notifyServicePlaceCall(ISipService service)
{
try {
service.placeCall(mCallInfo.mAccountID, mCallInfo.mCallID, mCallInfo.mPhone);
} catch (RemoteException e) {
Log.e(TAG, "Cannot call service method", e);
}
}
public void receiveCallUpdateUi()
{
......@@ -449,4 +441,16 @@ public class SipCall
intent.putExtras(bundle);
context.startActivity(intent);
}
/**
* Compare sip calls based on call ID
*/
@Override
public boolean equals(Object c){
if(c instanceof SipCall && ((SipCall) c).mCallInfo.mCallID == mCallInfo.mCallID){
return true;
}
return false;
}
}
package com.savoirfairelinux.sflphone.service;
interface ISipClient {
void incomingCall();
}
\ No newline at end of file
package com.savoirfairelinux.sflphone.service;
import com.savoirfairelinux.sflphone.service.ISipClient;
interface ISipService {
void placeCall(String accountID, in String callID, in String to);
void refuse(in String callID);
......@@ -14,4 +16,5 @@ interface ISipService {
void setAccountDetails(in String accountId, in Map accountDetails);
void setAudioPlugin(in String callID);
String getCurrentAudioOutputPlugin();
void registerClient(in ISipClient callback);
}
......@@ -39,14 +39,13 @@ import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.Vibrator;
import android.os.RemoteException;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.widget.Toast;
import com.savoirfairelinux.sflphone.account.AccountDetailsHandler;
import com.savoirfairelinux.sflphone.client.SFLphoneApplication;
import com.savoirfairelinux.sflphone.client.receiver.CallListReceiver;
public class SipService extends Service {
......@@ -63,7 +62,7 @@ public class SipService extends Service {
private ConfigurationManagerCallback configurationManagerCallback;
private ManagerImpl managerImpl;
private boolean isPjSipStackStarted = false;
public CallListReceiver mCallList;
ISipClient client;
/* Implement public interface for the service */
......@@ -253,6 +252,11 @@ public class SipService extends Service {
}
});
}
@Override
public void registerClient(ISipClient callback) throws RemoteException {
client = callback;
}
};
private BroadcastReceiver IncomingReceiver = new BroadcastReceiver() {
......@@ -260,8 +264,15 @@ public class SipService extends Service {
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "Received"+ intent.getAction());
// Get instance of Vibrator from current Context
Vibrator mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
mVibrator.vibrate(300);
// Vibrator mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// mVibrator.vibrate(300);
if(intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)){
try {
client.incomingCall();
} catch (RemoteException e) {
Log.e(TAG,e.toString());
}
}
}
};
......@@ -283,9 +294,8 @@ public class SipService extends Service {
super.onCreate();
sflphoneApp = (SFLphoneApplication) getApplication();
sipServiceThread = new SipServiceThread();
mCallList = new CallListReceiver();
IntentFilter callFilter = new IntentFilter(CallManagerCallBack.NEW_CALL_CREATED);
IntentFilter callFilter = new IntentFilter();
callFilter.addAction(CallManagerCallBack.INCOMING_CALL);
LocalBroadcastManager.getInstance(this).registerReceiver(IncomingReceiver , callFilter);
getExecutor().execute(new StartRunnable());
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment