blob: 816e4ed0c356c8147236dac2d06adaef744ef1fa [file] [log] [blame]
alisionf76de3b2013-04-16 15:35:22 -04001/*
alision2ec64f92013-06-17 17:28:58 -04002 * Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
alisionf76de3b2013-04-16 15:35:22 -04003 *
4 * Author: Adrien Beraud <adrien.beraud@gmail.com>
alision11e8e162013-05-28 10:33:14 -04005 * Alexandre Lision <alexandre.lision@savoirfairelinux.com>
alisionf76de3b2013-04-16 15:35:22 -04006 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 *
21 * Additional permission under GNU GPL version 3 section 7:
22 *
23 * If you modify this program, or any covered work, by linking or
24 * combining it with the OpenSSL project's OpenSSL library (or a
25 * modified version of that library), containing parts covered by the
26 * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
27 * grants you additional permission to convey the resulting work.
28 * Corresponding Source for a non-source form of such a combination
29 * shall include the source code for the parts of OpenSSL used as well
30 * as that of the covered work.
31 */
32package com.savoirfairelinux.sflphone.client;
33
alisiond45da712013-05-30 09:18:49 -040034import java.util.HashMap;
alisionbd45a822013-06-06 17:35:35 -040035import java.util.Timer;
36import java.util.TimerTask;
alision84813a12013-05-27 17:40:39 -040037
alisionf76de3b2013-04-16 15:35:22 -040038import android.app.Activity;
39import android.app.Fragment;
alisionf76de3b2013-04-16 15:35:22 -040040import android.content.ComponentName;
41import android.content.Context;
42import android.content.Intent;
alision84813a12013-05-27 17:40:39 -040043import android.content.IntentFilter;
alisionf76de3b2013-04-16 15:35:22 -040044import android.content.ServiceConnection;
alision55c36cb2013-06-14 14:57:38 -040045import android.database.Cursor;
alisionf76de3b2013-04-16 15:35:22 -040046import android.os.Bundle;
47import android.os.IBinder;
alision5f899632013-04-22 17:26:56 -040048import android.os.RemoteException;
alision55c36cb2013-06-14 14:57:38 -040049import android.provider.ContactsContract.CommonDataKinds.Phone;
50import android.provider.ContactsContract.CommonDataKinds.SipAddress;
alision9f7a6ec2013-05-24 16:26:26 -040051import android.support.v4.app.ActionBarDrawerToggle;
52import android.support.v4.view.GravityCompat;
alisionf76de3b2013-04-16 15:35:22 -040053import android.support.v4.view.ViewPager;
alision9f7a6ec2013-05-24 16:26:26 -040054import android.support.v4.widget.DrawerLayout;
alisionf76de3b2013-04-16 15:35:22 -040055import android.util.Log;
alision9f7a6ec2013-05-24 16:26:26 -040056import android.view.MenuItem;
57import android.view.View;
alision7297bdb2013-05-21 11:56:55 -040058import android.widget.RelativeLayout;
alisiond45da712013-05-30 09:18:49 -040059import android.widget.TabHost;
alision3c5c2a92013-05-30 09:50:47 -040060import android.widget.TabHost.OnTabChangeListener;
alisiond45da712013-05-30 09:18:49 -040061import android.widget.TabHost.TabContentFactory;
alision04a00182013-05-10 17:05:29 -040062import android.widget.Toast;
alisionf76de3b2013-04-16 15:35:22 -040063
64import com.savoirfairelinux.sflphone.R;
alision58356b72013-06-03 17:13:36 -040065import com.savoirfairelinux.sflphone.adapters.AccountSelectionAdapter;
alision9f7a6ec2013-05-24 16:26:26 -040066import com.savoirfairelinux.sflphone.adapters.SectionsPagerAdapter;
alisionf76de3b2013-04-16 15:35:22 -040067import com.savoirfairelinux.sflphone.fragments.ContactListFragment;
alision7297bdb2013-05-21 11:56:55 -040068import com.savoirfairelinux.sflphone.fragments.DialingFragment;
alisiond9e29442013-04-17 16:10:18 -040069import com.savoirfairelinux.sflphone.fragments.HistoryFragment;
alision55c36cb2013-06-14 14:57:38 -040070import com.savoirfairelinux.sflphone.fragments.HomeFragment;
alision9f7a6ec2013-05-24 16:26:26 -040071import com.savoirfairelinux.sflphone.fragments.MenuFragment;
alision58356b72013-06-03 17:13:36 -040072import com.savoirfairelinux.sflphone.interfaces.AccountsInterface;
alision84813a12013-05-27 17:40:39 -040073import com.savoirfairelinux.sflphone.interfaces.CallInterface;
alision2ec64f92013-06-17 17:28:58 -040074import com.savoirfairelinux.sflphone.loaders.LoaderConstants;
alision84813a12013-05-27 17:40:39 -040075import com.savoirfairelinux.sflphone.model.CallContact;
alisionf76de3b2013-04-16 15:35:22 -040076import com.savoirfairelinux.sflphone.model.SipCall;
alisioncc7bb422013-06-06 15:31:39 -040077import com.savoirfairelinux.sflphone.receivers.AccountsReceiver;
78import com.savoirfairelinux.sflphone.receivers.CallReceiver;
alision84813a12013-05-27 17:40:39 -040079import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
alision58356b72013-06-03 17:13:36 -040080import com.savoirfairelinux.sflphone.service.ConfigurationManagerCallback;
alisionf76de3b2013-04-16 15:35:22 -040081import com.savoirfairelinux.sflphone.service.ISipService;
82import com.savoirfairelinux.sflphone.service.SipService;
alision7297bdb2013-05-21 11:56:55 -040083import com.savoirfairelinux.sflphone.views.CustomSlidingDrawer;
alisionf76de3b2013-04-16 15:35:22 -040084
alision2cb99562013-05-30 17:02:20 -040085public class SFLPhoneHomeActivity extends Activity implements DialingFragment.Callbacks, ContactListFragment.Callbacks,
alision55c36cb2013-06-14 14:57:38 -040086 HomeFragment.Callbacks, HistoryFragment.Callbacks, CallInterface, AccountsInterface {
alisionfde875f2013-05-28 17:01:54 -040087
alision9f7a6ec2013-05-24 16:26:26 -040088 SectionsPagerAdapter mSectionsPagerAdapter = null;
alision84813a12013-05-27 17:40:39 -040089 static final String TAG = "SFLPhoneHomeActivity";
alisionf76de3b2013-04-16 15:35:22 -040090
alision2cb99562013-05-30 17:02:20 -040091 /**
92 * Fragments used
93 */
alision9f7a6ec2013-05-24 16:26:26 -040094 private ContactListFragment mContactsFragment = null;
alision58356b72013-06-03 17:13:36 -040095 // private DialingFragment mDialingFragment = null;
96 // private CallElementListFragment mCallElementList = null;
97 // private HistoryFragment mHistorySectionFragment = null;
alision2cb99562013-05-30 17:02:20 -040098 private Fragment fMenu;
alisionf76de3b2013-04-16 15:35:22 -040099
alision9f7a6ec2013-05-24 16:26:26 -0400100 private boolean mBound = false;
101 private ISipService service;
alisionf76de3b2013-04-16 15:35:22 -0400102
alision9f7a6ec2013-05-24 16:26:26 -0400103 private CharSequence mDrawerTitle;
104 private CharSequence mTitle;
alisionf76de3b2013-04-16 15:35:22 -0400105
alision58356b72013-06-03 17:13:36 -0400106 AccountSelectionAdapter mAdapter;
107// private Spinner spinnerAccounts;
108
alision2cb99562013-05-30 17:02:20 -0400109 public static final int REQUEST_CODE_PREFERENCES = 1;
alision9f7a6ec2013-05-24 16:26:26 -0400110 private static final int REQUEST_CODE_CALL = 2;
alisionf76de3b2013-04-16 15:35:22 -0400111
alision58356b72013-06-03 17:13:36 -0400112// private static final int ACTION_BAR_TAB_DIALING = 0;
113// private static final int ACTION_BAR_TAB_CALL = 1;
114// private static final int ACTION_BAR_TAB_HISTORY = 2;
alisionf76de3b2013-04-16 15:35:22 -0400115
alision0b553832013-05-30 09:31:06 -0400116 RelativeLayout mSliderButton;
alision9f7a6ec2013-05-24 16:26:26 -0400117 CustomSlidingDrawer mDrawer;
alision9f7a6ec2013-05-24 16:26:26 -0400118 private DrawerLayout mDrawerLayout;
alision9f7a6ec2013-05-24 16:26:26 -0400119 private ActionBarDrawerToggle mDrawerToggle;
120 /**
121 * The {@link ViewPager} that will host the section contents.
122 */
123 ViewPager mViewPager;
alisionf76de3b2013-04-16 15:35:22 -0400124
alision58356b72013-06-03 17:13:36 -0400125 CallReceiver callReceiver;
126 AccountsReceiver accountReceiver;
alision84813a12013-05-27 17:40:39 -0400127
alision3c5c2a92013-05-30 09:50:47 -0400128 private TabHost mTabHost;
alisionf76de3b2013-04-16 15:35:22 -0400129
alision9f7a6ec2013-05-24 16:26:26 -0400130 // public SFLPhoneHome extends Activity implements ActionBar.TabListener, OnClickListener
131
132 /* called before activity is killed, e.g. rotation */
133 @Override
134 protected void onSaveInstanceState(Bundle bundle) {
135 super.onSaveInstanceState(bundle);
136 for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
137 try {
138 getFragmentManager().putFragment(bundle, mSectionsPagerAdapter.getClassName(i), mSectionsPagerAdapter.getItem(i));
139 } catch (IllegalStateException e) {
140 Log.e(TAG, "fragment=" + mSectionsPagerAdapter.getItem(i));
141 }
142 }
143
144 getFragmentManager().putFragment(bundle, "ContactsListFragment", mContactsFragment);
145 Log.w(TAG, "onSaveInstanceState()");
146 }
147
148 @Override
149 public void onCreate(Bundle savedInstanceState) {
150 super.onCreate(savedInstanceState);
151
alision58356b72013-06-03 17:13:36 -0400152 callReceiver = new CallReceiver(this);
153 accountReceiver = new AccountsReceiver(this);
alision2cb99562013-05-30 17:02:20 -0400154 // String libraryPath = getApplicationInfo().dataDir + "/lib";
155 // Log.i(TAG, libraryPath);
alision9f7a6ec2013-05-24 16:26:26 -0400156
alision58356b72013-06-03 17:13:36 -0400157 setContentView(R.layout.activity_sflphone_home);
158
alision9f7a6ec2013-05-24 16:26:26 -0400159 // Bind to LocalService
160 if (!mBound) {
161 Log.i(TAG, "onStart: Binding service...");
162 Intent intent = new Intent(this, SipService.class);
163 bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
164 }
165
alision9f7a6ec2013-05-24 16:26:26 -0400166 if (mContactsFragment == null) {
167 mContactsFragment = new ContactListFragment();
168 Log.w(TAG, "Recreated mContactListFragment=" + mContactsFragment);
169 getFragmentManager().beginTransaction().replace(R.id.contacts_frame, mContactsFragment).commit();
170 }
alision2ec64f92013-06-17 17:28:58 -0400171
alision9f7a6ec2013-05-24 16:26:26 -0400172
173 mDrawer = (CustomSlidingDrawer) findViewById(R.id.custom_sliding_drawer);
alision7297bdb2013-05-21 11:56:55 -0400174
alision84813a12013-05-27 17:40:39 -0400175 mContactsFragment.setHandleView((RelativeLayout) findViewById(R.id.slider_button));
alision7297bdb2013-05-21 11:56:55 -0400176
177 mDrawer.setmTrackHandle(findViewById(R.id.handle_title));
alisionf76de3b2013-04-16 15:35:22 -0400178
alision9f7a6ec2013-05-24 16:26:26 -0400179 // Set up the ViewPager with the sections adapter.
180 mViewPager = (ViewPager) findViewById(R.id.pager);
alision55c36cb2013-06-14 14:57:38 -0400181 mViewPager.setPageTransformer(true, new ZoomOutPageTransformer(0.7f));
alision58356b72013-06-03 17:13:36 -0400182
alisionf76de3b2013-04-16 15:35:22 -0400183
alision9f7a6ec2013-05-24 16:26:26 -0400184 mTitle = mDrawerTitle = getTitle();
185 mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
alisionf76de3b2013-04-16 15:35:22 -0400186
alision0b553832013-05-30 09:31:06 -0400187 // set a custom shadow that overlays the main content when the drawer opens
alision9f7a6ec2013-05-24 16:26:26 -0400188 mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
alisionf76de3b2013-04-16 15:35:22 -0400189
alision9f7a6ec2013-05-24 16:26:26 -0400190 getActionBar().setDisplayHomeAsUpEnabled(true);
191 getActionBar().setHomeButtonEnabled(true);
alisionf76de3b2013-04-16 15:35:22 -0400192
alision9f7a6ec2013-05-24 16:26:26 -0400193 mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
194 mDrawerLayout, /* DrawerLayout object */
195 R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
196 R.string.drawer_open, /* "open drawer" description for accessibility */
197 R.string.drawer_close /* "close drawer" description for accessibility */
198 ) {
alision0b553832013-05-30 09:31:06 -0400199 @Override
alision9f7a6ec2013-05-24 16:26:26 -0400200 public void onDrawerClosed(View view) {
201 getActionBar().setTitle(mTitle);
202 invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
203 }
alisionf76de3b2013-04-16 15:35:22 -0400204
alision0b553832013-05-30 09:31:06 -0400205 @Override
alision9f7a6ec2013-05-24 16:26:26 -0400206 public void onDrawerOpened(View drawerView) {
207 getActionBar().setTitle(mDrawerTitle);
208 invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
209 }
210 };
alisionf76de3b2013-04-16 15:35:22 -0400211
alision3c5c2a92013-05-30 09:50:47 -0400212 mTabHost = (TabHost) findViewById(android.R.id.tabhost);
alision9f7a6ec2013-05-24 16:26:26 -0400213 mDrawerLayout.setDrawerListener(mDrawerToggle);
alisionf76de3b2013-04-16 15:35:22 -0400214
alision9f7a6ec2013-05-24 16:26:26 -0400215 mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
216 @Override
217 public void onPageSelected(int position) {
alision3c5c2a92013-05-30 09:50:47 -0400218 mTabHost.setCurrentTab(position);
alision9f7a6ec2013-05-24 16:26:26 -0400219 }
220 });
alisionf76de3b2013-04-16 15:35:22 -0400221
alisionf76de3b2013-04-16 15:35:22 -0400222
alision9f7a6ec2013-05-24 16:26:26 -0400223 fMenu = new MenuFragment();
224 getFragmentManager().beginTransaction().replace(R.id.left_drawer, fMenu).commit();
225 }
alisionf76de3b2013-04-16 15:35:22 -0400226
alision3c5c2a92013-05-30 09:50:47 -0400227 private void initialiseTabHost(Bundle args) {
228
alision3c5c2a92013-05-30 09:50:47 -0400229 mTabHost.setup();
230 TabInfo tabInfo = null;
alision2cb99562013-05-30 17:02:20 -0400231 SFLPhoneHomeActivity
232 .AddTab(this,
233 this.mTabHost,
234 this.mTabHost.newTabSpec("Tab1").setIndicator(mSectionsPagerAdapter.getPageTitle(0),
235 getResources().getDrawable(mSectionsPagerAdapter.getIconOf(0))), (tabInfo = new TabInfo("Tab1",
236 DialingFragment.class, args)));
alision3c5c2a92013-05-30 09:50:47 -0400237 this.mapTabInfo.put(tabInfo.tag, tabInfo);
alision2cb99562013-05-30 17:02:20 -0400238 SFLPhoneHomeActivity.AddTab(
239 this,
240 this.mTabHost,
241 this.mTabHost.newTabSpec("Tab2").setIndicator(mSectionsPagerAdapter.getPageTitle(1),
242 getResources().getDrawable(mSectionsPagerAdapter.getIconOf(1))), (tabInfo = new TabInfo("Tab2",
alision55c36cb2013-06-14 14:57:38 -0400243 HomeFragment.class, args)));
alision3c5c2a92013-05-30 09:50:47 -0400244 this.mapTabInfo.put(tabInfo.tag, tabInfo);
alision2cb99562013-05-30 17:02:20 -0400245 SFLPhoneHomeActivity
246 .AddTab(this,
247 this.mTabHost,
248 this.mTabHost.newTabSpec("Tab3").setIndicator(mSectionsPagerAdapter.getPageTitle(2),
249 getResources().getDrawable(mSectionsPagerAdapter.getIconOf(2))), (tabInfo = new TabInfo("Tab3",
250 HistoryFragment.class, args)));
alision3c5c2a92013-05-30 09:50:47 -0400251 this.mapTabInfo.put(tabInfo.tag, tabInfo);
alision58356b72013-06-03 17:13:36 -0400252
253
alision3c5c2a92013-05-30 09:50:47 -0400254
255 mTabHost.setOnTabChangedListener(new OnTabChangeListener() {
256
257 @Override
258 public void onTabChanged(String tabId) {
259 int pos = mTabHost.getCurrentTab();
260 mViewPager.setCurrentItem(pos);
261
262 }
263 });
264 }
265
alision9f7a6ec2013-05-24 16:26:26 -0400266 @Override
267 protected void onStart() {
268 Log.i(TAG, "onStart");
269 super.onStart();
270 }
alisionf76de3b2013-04-16 15:35:22 -0400271
alision9f7a6ec2013-05-24 16:26:26 -0400272 /* user gets back to the activity, e.g. through task manager */
273 @Override
274 protected void onRestart() {
275 super.onRestart();
276 }
alisionf76de3b2013-04-16 15:35:22 -0400277
alision9f7a6ec2013-05-24 16:26:26 -0400278 /* activity gets back to the foreground and user input */
279 @Override
280 protected void onResume() {
alision58356b72013-06-03 17:13:36 -0400281 super.onResume();
alision84813a12013-05-27 17:40:39 -0400282 IntentFilter intentFilter = new IntentFilter();
283 intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
284 intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
285 intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
alision58356b72013-06-03 17:13:36 -0400286 registerReceiver(callReceiver, intentFilter);
287
288
289 IntentFilter intentFilter2 = new IntentFilter();
290 intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
291 intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
292 registerReceiver(accountReceiver, intentFilter2);
293
alision9f7a6ec2013-05-24 16:26:26 -0400294 }
alisionbd45a822013-06-06 17:35:35 -0400295
296 private boolean isClosing = false;
297 private Timer t = new Timer();
alision55c36cb2013-06-14 14:57:38 -0400298
299
alisionbd45a822013-06-06 17:35:35 -0400300 @Override
301 public void onBackPressed() {
alision2ec64f92013-06-17 17:28:58 -0400302
303 if(getActionBar().getCustomView() != null){
304 getActionBar().setDisplayShowCustomEnabled(false);
305 getActionBar().setCustomView(null);
306 // Display all the contacts again
307 getLoaderManager().restartLoader(LoaderConstants.CONTACT_LOADER, null, mContactsFragment);
308 return;
309 }
310
alisionbd45a822013-06-06 17:35:35 -0400311 if (mDrawer.isOpened()) {
alision55c36cb2013-06-14 14:57:38 -0400312 mDrawer.animateClose();
alisionbd45a822013-06-06 17:35:35 -0400313 return;
314 }
alision2ec64f92013-06-17 17:28:58 -0400315
alisionbd45a822013-06-06 17:35:35 -0400316 if (isClosing) {
317 super.onBackPressed();
318 t.cancel();
319 finish();
320 } else {
321
322 t.schedule(new TimerTask() {
323 @Override
324 public void run() {
325 isClosing = false;
326 }
327 }, 3000);
328 Toast.makeText(this, getResources().getString(R.string.close_msg), Toast.LENGTH_SHORT).show();
329 isClosing = true;
330 }
331 }
alisione2a38e12013-04-25 14:20:20 -0400332
alision9f7a6ec2013-05-24 16:26:26 -0400333 /* activity no more in foreground */
334 @Override
335 protected void onPause() {
336 super.onPause();
alision58356b72013-06-03 17:13:36 -0400337 unregisterReceiver(callReceiver);
338 unregisterReceiver(accountReceiver);
alision55c36cb2013-06-14 14:57:38 -0400339 try {
340 service.createNotification();
341
342 } catch (RemoteException e) {
343 Log.e(TAG, e.toString());
344 }
alision2cb99562013-05-30 17:02:20 -0400345
alision9f7a6ec2013-05-24 16:26:26 -0400346 }
alisionf76de3b2013-04-16 15:35:22 -0400347
alision9f7a6ec2013-05-24 16:26:26 -0400348 /* activity is no longer visible */
349 @Override
350 protected void onStop() {
351 super.onStop();
alision2cb99562013-05-30 17:02:20 -0400352
alision9f7a6ec2013-05-24 16:26:26 -0400353 }
alisionf76de3b2013-04-16 15:35:22 -0400354
alision9f7a6ec2013-05-24 16:26:26 -0400355 /* activity finishes itself or is being killed by the system */
356 @Override
357 protected void onDestroy() {
358 /* stop the service, if no other bound user, no need to check if it is running */
359 if (mBound) {
360 Log.i(TAG, "onDestroy: Unbinding service...");
alision55c36cb2013-06-14 14:57:38 -0400361
alision9f7a6ec2013-05-24 16:26:26 -0400362 unbindService(mConnection);
363 mBound = false;
alision2cb99562013-05-30 17:02:20 -0400364
alision9f7a6ec2013-05-24 16:26:26 -0400365 }
alision371b77e2013-04-23 14:51:26 -0400366
alision9f7a6ec2013-05-24 16:26:26 -0400367 super.onDestroy();
368 }
alision73424b62013-04-26 11:49:18 -0400369
alision55c36cb2013-06-14 14:57:38 -0400370 public void launchCallActivity(SipCall infos) {
alision9f7a6ec2013-05-24 16:26:26 -0400371 Log.i(TAG, "Launch Call Activity");
372 Bundle bundle = new Bundle();
alision9f7a6ec2013-05-24 16:26:26 -0400373 bundle.putParcelable("CallInfo", infos);
374 Intent intent = new Intent().setClass(this, CallActivity.class);
alision55c36cb2013-06-14 14:57:38 -0400375
alision9f7a6ec2013-05-24 16:26:26 -0400376 intent.putExtras(bundle);
377 startActivityForResult(intent, REQUEST_CODE_CALL);
378 }
alisionf76de3b2013-04-16 15:35:22 -0400379
alision9f7a6ec2013-05-24 16:26:26 -0400380 /** Defines callbacks for service binding, passed to bindService() */
381 private ServiceConnection mConnection = new ServiceConnection() {
alision371b77e2013-04-23 14:51:26 -0400382
alision9f7a6ec2013-05-24 16:26:26 -0400383 @Override
384 public void onServiceConnected(ComponentName className, IBinder binder) {
385 service = ISipService.Stub.asInterface(binder);
alisione2a38e12013-04-25 14:20:20 -0400386
alision2cb99562013-05-30 17:02:20 -0400387 try {
alision58356b72013-06-03 17:13:36 -0400388
389 mSectionsPagerAdapter = new SectionsPagerAdapter(SFLPhoneHomeActivity.this, getFragmentManager());
390 initialiseTabHost(null);
391 mViewPager.setAdapter(mSectionsPagerAdapter);
392 mTabHost.setCurrentTab(1);
alision2cb99562013-05-30 17:02:20 -0400393 service.destroyNotification();
alision58356b72013-06-03 17:13:36 -0400394 // mAdapter = new AccountSelectionAdapter(SFLPhoneHomeActivity.this, service, new ArrayList<Account>());
395 // spinnerAccounts.setAdapter(mAdapter);
alision2cb99562013-05-30 17:02:20 -0400396 } catch (RemoteException e) {
397 Log.e(TAG, e.toString());
398 }
alision9f7a6ec2013-05-24 16:26:26 -0400399 mBound = true;
alision9f7a6ec2013-05-24 16:26:26 -0400400 Log.d(TAG, "Service connected service=" + service);
alision371b77e2013-04-23 14:51:26 -0400401
alision9f7a6ec2013-05-24 16:26:26 -0400402 }
alision5f899632013-04-22 17:26:56 -0400403
alision9f7a6ec2013-05-24 16:26:26 -0400404 @Override
405 public void onServiceDisconnected(ComponentName arg0) {
alision5f899632013-04-22 17:26:56 -0400406
alision9f7a6ec2013-05-24 16:26:26 -0400407 mBound = false;
408 Log.d(TAG, "Service disconnected service=" + service);
409 }
410 };
alision5f899632013-04-22 17:26:56 -0400411
alision9f7a6ec2013-05-24 16:26:26 -0400412 @Override
413 public boolean onOptionsItemSelected(MenuItem item) {
414 Log.i(TAG, "onOptionsItemSelected " + item.getItemId());
alision5f899632013-04-22 17:26:56 -0400415
alision9f7a6ec2013-05-24 16:26:26 -0400416 if (mDrawerToggle.onOptionsItemSelected(item)) {
417 return true;
418 }
alision5f899632013-04-22 17:26:56 -0400419
alision9f7a6ec2013-05-24 16:26:26 -0400420 return super.onOptionsItemSelected(item);
421 }
alisionf76de3b2013-04-16 15:35:22 -0400422
alision9f7a6ec2013-05-24 16:26:26 -0400423 @Override
424 public void onActivityResult(int requestCode, int resultCode, Intent data) {
425 super.onActivityResult(requestCode, resultCode, data);
alision84813a12013-05-27 17:40:39 -0400426
427 switch (requestCode) {
alision9f7a6ec2013-05-24 16:26:26 -0400428 case REQUEST_CODE_PREFERENCES:
alisioncc7bb422013-06-06 15:31:39 -0400429 Log.w(TAG, "Result out of PreferenceActivity");
430 ((DialingFragment)mSectionsPagerAdapter.getItem(0)).updateAllAccounts();
alision9f7a6ec2013-05-24 16:26:26 -0400431 break;
432 case REQUEST_CODE_CALL:
alision2cb99562013-05-30 17:02:20 -0400433 Log.w(TAG, "Result out of CallActivity");
alision1005ba12013-06-19 13:52:44 -0400434
alision9f7a6ec2013-05-24 16:26:26 -0400435 break;
436 }
alisionf76de3b2013-04-16 15:35:22 -0400437
alision9f7a6ec2013-05-24 16:26:26 -0400438 }
alisionf76de3b2013-04-16 15:35:22 -0400439
alision9f7a6ec2013-05-24 16:26:26 -0400440 @Override
441 public void onCallSelected(SipCall c) {
alision55c36cb2013-06-14 14:57:38 -0400442 launchCallActivity(c);
alisionf76de3b2013-04-16 15:35:22 -0400443
alision9f7a6ec2013-05-24 16:26:26 -0400444 }
alisionf76de3b2013-04-16 15:35:22 -0400445
alision9f7a6ec2013-05-24 16:26:26 -0400446 @Override
447 public ISipService getService() {
448 return service;
449 }
alisionf76de3b2013-04-16 15:35:22 -0400450
alision84813a12013-05-27 17:40:39 -0400451 /**
452 * Interface implemented to handle incoming events
453 */
alision9f7a6ec2013-05-24 16:26:26 -0400454 @Override
alision84813a12013-05-27 17:40:39 -0400455 public void incomingCall(Intent call) {
456 Toast.makeText(this, "New Call incoming", Toast.LENGTH_LONG).show();
alisionfde875f2013-05-28 17:01:54 -0400457 SipCall infos = call.getParcelableExtra("newcall");
alision84813a12013-05-27 17:40:39 -0400458
alision58356b72013-06-03 17:13:36 -0400459 // mCallElementList.addCall(infos);
alisionfde875f2013-05-28 17:01:54 -0400460
alision55c36cb2013-06-14 14:57:38 -0400461 launchCallActivity(infos);
alision84813a12013-05-27 17:40:39 -0400462
463 }
464
465 @Override
466 public void callStateChanged(Intent callState) {
467 Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
468 String cID = b.getString("CallID");
469 String state = b.getString("State");
470 Log.i(TAG, "callStateChanged" + cID + " " + state);
alision58356b72013-06-03 17:13:36 -0400471 // mCallElementList.updateCall(cID, state);
alision84813a12013-05-27 17:40:39 -0400472
473 }
474
475 @Override
476 public void incomingText(Intent msg) {
477 Bundle b = msg.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
478 b.getString("CallID");
479 String from = b.getString("From");
480 String mess = b.getString("Msg");
481 Toast.makeText(getApplicationContext(), "text from " + from + " : " + mess, Toast.LENGTH_LONG).show();
482 }
483
484 @Override
alision55c36cb2013-06-14 14:57:38 -0400485 public void onContactSelected(final CallContact c) {
alisionfde875f2013-05-28 17:01:54 -0400486
alision55c36cb2013-06-14 14:57:38 -0400487 Thread launcher = new Thread(new Runnable() {
488
489 final String[] CONTACTS_PHONES_PROJECTION = new String[] { Phone.NUMBER, Phone.TYPE };
490 final String[] CONTACTS_SIP_PROJECTION = new String[] { SipAddress.SIP_ADDRESS, SipAddress.TYPE };
491
492 @Override
493 public void run() {
494 SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
495 try {
496 callBuilder.startCallCreation().setAccountID(service.getAccountList().get(1).toString()).setCallType(SipCall.state.CALL_TYPE_OUTGOING);
497 Cursor cPhones = getContentResolver().query(Phone.CONTENT_URI, CONTACTS_PHONES_PROJECTION,
498 Phone.CONTACT_ID + " =" + c.getId(), null, null);
499
500 while (cPhones.moveToNext()) {
501 c.addPhoneNumber(cPhones.getString(cPhones.getColumnIndex(Phone.NUMBER)), cPhones.getInt(cPhones.getColumnIndex(Phone.TYPE)));
502 }
503 cPhones.close();
504
505 Cursor cSip = getContentResolver().query(Phone.CONTENT_URI, CONTACTS_SIP_PROJECTION,
506 Phone.CONTACT_ID + "=" + c.getId(), null, null);
507
508 while (cSip.moveToNext()) {
509 c.addSipNumber(cSip.getString(cSip.getColumnIndex(SipAddress.SIP_ADDRESS)), cSip.getInt(cSip.getColumnIndex(SipAddress.TYPE)));
510 }
511 cSip.close();
512 callBuilder.addContact(c);
513 launchCallActivity(callBuilder.build());
514 } catch (RemoteException e1) {
515 Log.e(TAG, e1.toString());
516 } catch (Exception e) {
517 Log.e(TAG, e.toString());
518 }
519
520 }
521 });
522 launcher.start();
523 mDrawer.close();
524
alision84813a12013-05-27 17:40:39 -0400525
526 }
527
528 @Override
529 public void onCallDialed(String accountID, String to) {
alision84813a12013-05-27 17:40:39 -0400530
alisionfde875f2013-05-28 17:01:54 -0400531 SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
532 callBuilder.startCallCreation().setAccountID(accountID).setCallType(SipCall.state.CALL_TYPE_OUTGOING);
533 callBuilder.addContact(CallContact.ContactBuilder.buildUnknownContact(to));
alision84813a12013-05-27 17:40:39 -0400534
alisionfde875f2013-05-28 17:01:54 -0400535 try {
alision55c36cb2013-06-14 14:57:38 -0400536 launchCallActivity(callBuilder.build());
alisionfde875f2013-05-28 17:01:54 -0400537 } catch (Exception e) {
538 Log.e(TAG, e.toString());
539 }
alision84813a12013-05-27 17:40:39 -0400540
alision9f7a6ec2013-05-24 16:26:26 -0400541 }
alision371b77e2013-04-23 14:51:26 -0400542
alisiond45da712013-05-30 09:18:49 -0400543 @Override
544 public void onContactDragged() {
545
546 mDrawer.close();
alision2cb99562013-05-30 17:02:20 -0400547 mTabHost.setCurrentTab(1);
alisiond45da712013-05-30 09:18:49 -0400548
549 }
550
551 private HashMap<String, TabInfo> mapTabInfo = new HashMap<String, SFLPhoneHomeActivity.TabInfo>();
552
553 /**
554 * A simple factory that returns dummy views to the Tabhost
555 *
556 * @author mwho
557 */
558 class TabFactory implements TabContentFactory {
559
560 private final Context mContext;
561
562 /**
563 * @param context
564 */
565 public TabFactory(Context context) {
566 mContext = context;
567 }
568
569 /**
570 * (non-Javadoc)
571 *
572 * @see android.widget.TabHost.TabContentFactory#createTabContent(java.lang.String)
573 */
574 public View createTabContent(String tag) {
575 View v = new View(mContext);
576 v.setMinimumWidth(0);
577 v.setMinimumHeight(0);
578 return v;
579 }
580
581 }
582
583 /**
584 *
585 * @author mwho Maintains extrinsic info of a tab's construct
586 */
587 private class TabInfo {
588 private String tag;
alisiond45da712013-05-30 09:18:49 -0400589
590 TabInfo(String tag, Class<?> clazz, Bundle args) {
591 this.tag = tag;
alisiond45da712013-05-30 09:18:49 -0400592 }
593
594 }
595
596 private static void AddTab(SFLPhoneHomeActivity activity, TabHost tabHost, TabHost.TabSpec tabSpec, TabInfo tabInfo) {
597 // Attach a Tab view factory to the spec
598 tabSpec.setContent(activity.new TabFactory(activity));
599 tabHost.addTab(tabSpec);
600 }
601
alision58356b72013-06-03 17:13:36 -0400602 @Override
603 public void openDrawer() {
alision55c36cb2013-06-14 14:57:38 -0400604 mDrawer.animateOpen();
alision58356b72013-06-03 17:13:36 -0400605 }
606
607 @Override
608 public void accountsChanged() {
609 ((DialingFragment)mSectionsPagerAdapter.getItem(0)).updateAllAccounts();
610
611 }
612
613 @Override
614 public void accountStateChanged(Intent accountState) {
615 ((DialingFragment)mSectionsPagerAdapter.getItem(0)).updateAccount(accountState);
616
617 }
618
alisionf76de3b2013-04-16 15:35:22 -0400619}