blob: 92d019bf13103ab1dfee04a8807b6c38fcb00027 [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;
Alexandre Lisionc51ccb12013-09-11 16:00:30 -040039import android.app.AlertDialog;
40import android.app.Dialog;
alisionf76de3b2013-04-16 15:35:22 -040041import android.content.ComponentName;
42import android.content.Context;
Alexandre Lisionc51ccb12013-09-11 16:00:30 -040043import android.content.DialogInterface;
alisionf76de3b2013-04-16 15:35:22 -040044import android.content.Intent;
alision84813a12013-05-27 17:40:39 -040045import android.content.IntentFilter;
alisionf76de3b2013-04-16 15:35:22 -040046import android.content.ServiceConnection;
alisionf57d8a62013-07-02 09:37:12 -040047import android.content.res.Configuration;
alision55c36cb2013-06-14 14:57:38 -040048import android.database.Cursor;
Alexandre Lisionf41a3a82013-09-05 17:15:15 -040049import android.graphics.Color;
Alexandre Lisionc51ccb12013-09-11 16:00:30 -040050import android.media.AudioFormat;
51import android.media.AudioTrack;
alisionf76de3b2013-04-16 15:35:22 -040052import android.os.Bundle;
53import android.os.IBinder;
alision5f899632013-04-22 17:26:56 -040054import android.os.RemoteException;
alision55c36cb2013-06-14 14:57:38 -040055import android.provider.ContactsContract.CommonDataKinds.Phone;
56import android.provider.ContactsContract.CommonDataKinds.SipAddress;
alision9f7a6ec2013-05-24 16:26:26 -040057import android.support.v4.app.ActionBarDrawerToggle;
58import android.support.v4.view.GravityCompat;
Alexandre Lisionf41a3a82013-09-05 17:15:15 -040059import android.support.v4.view.PagerTabStrip;
alisionf76de3b2013-04-16 15:35:22 -040060import android.support.v4.view.ViewPager;
alision9f7a6ec2013-05-24 16:26:26 -040061import android.support.v4.widget.DrawerLayout;
alisionf76de3b2013-04-16 15:35:22 -040062import android.util.Log;
Alexandre Lisionf41a3a82013-09-05 17:15:15 -040063import android.util.TypedValue;
alision9f7a6ec2013-05-24 16:26:26 -040064import android.view.MenuItem;
65import android.view.View;
alision7297bdb2013-05-21 11:56:55 -040066import android.widget.RelativeLayout;
alisiond45da712013-05-30 09:18:49 -040067import android.widget.TabHost;
alisiond45da712013-05-30 09:18:49 -040068import android.widget.TabHost.TabContentFactory;
alision04a00182013-05-10 17:05:29 -040069import android.widget.Toast;
alisionf76de3b2013-04-16 15:35:22 -040070
71import com.savoirfairelinux.sflphone.R;
alision9f7a6ec2013-05-24 16:26:26 -040072import com.savoirfairelinux.sflphone.adapters.SectionsPagerAdapter;
Alexandre Lisionc51ccb12013-09-11 16:00:30 -040073import com.savoirfairelinux.sflphone.client.AccountPreferenceActivity.result;
alisionf76de3b2013-04-16 15:35:22 -040074import com.savoirfairelinux.sflphone.fragments.ContactListFragment;
alision7297bdb2013-05-21 11:56:55 -040075import com.savoirfairelinux.sflphone.fragments.DialingFragment;
alisiond9e29442013-04-17 16:10:18 -040076import com.savoirfairelinux.sflphone.fragments.HistoryFragment;
alision55c36cb2013-06-14 14:57:38 -040077import com.savoirfairelinux.sflphone.fragments.HomeFragment;
alision9f7a6ec2013-05-24 16:26:26 -040078import com.savoirfairelinux.sflphone.fragments.MenuFragment;
alision84813a12013-05-27 17:40:39 -040079import com.savoirfairelinux.sflphone.interfaces.CallInterface;
alision2ec64f92013-06-17 17:28:58 -040080import com.savoirfairelinux.sflphone.loaders.LoaderConstants;
alision84813a12013-05-27 17:40:39 -040081import com.savoirfairelinux.sflphone.model.CallContact;
alisiondf1dac92013-06-27 17:35:53 -040082import com.savoirfairelinux.sflphone.model.Conference;
alisionf76de3b2013-04-16 15:35:22 -040083import com.savoirfairelinux.sflphone.model.SipCall;
alisioncc7bb422013-06-06 15:31:39 -040084import com.savoirfairelinux.sflphone.receivers.CallReceiver;
alision84813a12013-05-27 17:40:39 -040085import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
alisionf76de3b2013-04-16 15:35:22 -040086import com.savoirfairelinux.sflphone.service.ISipService;
87import com.savoirfairelinux.sflphone.service.SipService;
alision7297bdb2013-05-21 11:56:55 -040088import com.savoirfairelinux.sflphone.views.CustomSlidingDrawer;
alisionf76de3b2013-04-16 15:35:22 -040089
alision907bde72013-06-20 14:40:37 -040090public class SFLPhoneHomeActivity extends Activity implements DialingFragment.Callbacks, ContactListFragment.Callbacks, HomeFragment.Callbacks,
91 HistoryFragment.Callbacks, CallInterface, MenuFragment.Callbacks {
alisionfde875f2013-05-28 17:01:54 -040092
alision9f7a6ec2013-05-24 16:26:26 -040093 SectionsPagerAdapter mSectionsPagerAdapter = null;
alision84813a12013-05-27 17:40:39 -040094 static final String TAG = "SFLPhoneHomeActivity";
alisionf76de3b2013-04-16 15:35:22 -040095
alision2cb99562013-05-30 17:02:20 -040096 /**
97 * Fragments used
98 */
alision9f7a6ec2013-05-24 16:26:26 -040099 private ContactListFragment mContactsFragment = null;
alision58356b72013-06-03 17:13:36 -0400100 // private DialingFragment mDialingFragment = null;
101 // private CallElementListFragment mCallElementList = null;
102 // private HistoryFragment mHistorySectionFragment = null;
alision907bde72013-06-20 14:40:37 -0400103 private MenuFragment fMenu;
alisionf76de3b2013-04-16 15:35:22 -0400104
alision9f7a6ec2013-05-24 16:26:26 -0400105 private boolean mBound = false;
106 private ISipService service;
alisionf76de3b2013-04-16 15:35:22 -0400107
alision9f7a6ec2013-05-24 16:26:26 -0400108 private CharSequence mDrawerTitle;
109 private CharSequence mTitle;
alisionf76de3b2013-04-16 15:35:22 -0400110
alision2cb99562013-05-30 17:02:20 -0400111 public static final int REQUEST_CODE_PREFERENCES = 1;
alision9f7a6ec2013-05-24 16:26:26 -0400112 private static final int REQUEST_CODE_CALL = 2;
alisionf76de3b2013-04-16 15:35:22 -0400113
alision0b553832013-05-30 09:31:06 -0400114 RelativeLayout mSliderButton;
alision9f7a6ec2013-05-24 16:26:26 -0400115 CustomSlidingDrawer mDrawer;
alision9f7a6ec2013-05-24 16:26:26 -0400116 private DrawerLayout mDrawerLayout;
alision9f7a6ec2013-05-24 16:26:26 -0400117 private ActionBarDrawerToggle mDrawerToggle;
118 /**
119 * The {@link ViewPager} that will host the section contents.
120 */
121 ViewPager mViewPager;
alisionf76de3b2013-04-16 15:35:22 -0400122
alision58356b72013-06-03 17:13:36 -0400123 CallReceiver callReceiver;
alision84813a12013-05-27 17:40:39 -0400124
Alexandre Lisionc51ccb12013-09-11 16:00:30 -0400125 // private TabHost mTabHost;
alisionf76de3b2013-04-16 15:35:22 -0400126
alision9f7a6ec2013-05-24 16:26:26 -0400127 // public SFLPhoneHome extends Activity implements ActionBar.TabListener, OnClickListener
128
129 /* called before activity is killed, e.g. rotation */
130 @Override
131 protected void onSaveInstanceState(Bundle bundle) {
132 super.onSaveInstanceState(bundle);
133 for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
134 try {
135 getFragmentManager().putFragment(bundle, mSectionsPagerAdapter.getClassName(i), mSectionsPagerAdapter.getItem(i));
136 } catch (IllegalStateException e) {
137 Log.e(TAG, "fragment=" + mSectionsPagerAdapter.getItem(i));
138 }
139 }
140
141 getFragmentManager().putFragment(bundle, "ContactsListFragment", mContactsFragment);
142 Log.w(TAG, "onSaveInstanceState()");
143 }
144
145 @Override
146 public void onCreate(Bundle savedInstanceState) {
147 super.onCreate(savedInstanceState);
148
alision58356b72013-06-03 17:13:36 -0400149 callReceiver = new CallReceiver(this);
alision907bde72013-06-20 14:40:37 -0400150
alision2cb99562013-05-30 17:02:20 -0400151 // String libraryPath = getApplicationInfo().dataDir + "/lib";
152 // Log.i(TAG, libraryPath);
alision9f7a6ec2013-05-24 16:26:26 -0400153
alision58356b72013-06-03 17:13:36 -0400154 setContentView(R.layout.activity_sflphone_home);
155
alision9f7a6ec2013-05-24 16:26:26 -0400156 // Bind to LocalService
157 if (!mBound) {
158 Log.i(TAG, "onStart: Binding service...");
159 Intent intent = new Intent(this, SipService.class);
160 bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
161 }
162
alision9f7a6ec2013-05-24 16:26:26 -0400163 if (mContactsFragment == null) {
164 mContactsFragment = new ContactListFragment();
165 Log.w(TAG, "Recreated mContactListFragment=" + mContactsFragment);
166 getFragmentManager().beginTransaction().replace(R.id.contacts_frame, mContactsFragment).commit();
167 }
alision2ec64f92013-06-17 17:28:58 -0400168
alision9f7a6ec2013-05-24 16:26:26 -0400169 mDrawer = (CustomSlidingDrawer) findViewById(R.id.custom_sliding_drawer);
alision7297bdb2013-05-21 11:56:55 -0400170
alision84813a12013-05-27 17:40:39 -0400171 mContactsFragment.setHandleView((RelativeLayout) findViewById(R.id.slider_button));
alision7297bdb2013-05-21 11:56:55 -0400172
173 mDrawer.setmTrackHandle(findViewById(R.id.handle_title));
alisionf76de3b2013-04-16 15:35:22 -0400174
alision9f7a6ec2013-05-24 16:26:26 -0400175 // Set up the ViewPager with the sections adapter.
176 mViewPager = (ViewPager) findViewById(R.id.pager);
alision55c36cb2013-06-14 14:57:38 -0400177 mViewPager.setPageTransformer(true, new ZoomOutPageTransformer(0.7f));
alisionf76de3b2013-04-16 15:35:22 -0400178
alision9f7a6ec2013-05-24 16:26:26 -0400179 mTitle = mDrawerTitle = getTitle();
180 mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
alisionf76de3b2013-04-16 15:35:22 -0400181
alision0b553832013-05-30 09:31:06 -0400182 // set a custom shadow that overlays the main content when the drawer opens
alision9f7a6ec2013-05-24 16:26:26 -0400183 mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
alisionf76de3b2013-04-16 15:35:22 -0400184
alision9f7a6ec2013-05-24 16:26:26 -0400185 getActionBar().setDisplayHomeAsUpEnabled(true);
186 getActionBar().setHomeButtonEnabled(true);
alisionf76de3b2013-04-16 15:35:22 -0400187
alision9f7a6ec2013-05-24 16:26:26 -0400188 mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
189 mDrawerLayout, /* DrawerLayout object */
190 R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
191 R.string.drawer_open, /* "open drawer" description for accessibility */
192 R.string.drawer_close /* "close drawer" description for accessibility */
193 ) {
alision0b553832013-05-30 09:31:06 -0400194 @Override
alision9f7a6ec2013-05-24 16:26:26 -0400195 public void onDrawerClosed(View view) {
196 getActionBar().setTitle(mTitle);
197 invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
198 }
alisionf76de3b2013-04-16 15:35:22 -0400199
alision0b553832013-05-30 09:31:06 -0400200 @Override
alision9f7a6ec2013-05-24 16:26:26 -0400201 public void onDrawerOpened(View drawerView) {
202 getActionBar().setTitle(mDrawerTitle);
203 invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
204 }
205 };
alisionf76de3b2013-04-16 15:35:22 -0400206
Alexandre Lisionc51ccb12013-09-11 16:00:30 -0400207 // mTabHost = (TabHost) findViewById(android.R.id.tabhost);
alision9f7a6ec2013-05-24 16:26:26 -0400208 mDrawerLayout.setDrawerListener(mDrawerToggle);
alisionf76de3b2013-04-16 15:35:22 -0400209
alision9f7a6ec2013-05-24 16:26:26 -0400210 mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
211 @Override
212 public void onPageSelected(int position) {
Alexandre Lisionc51ccb12013-09-11 16:00:30 -0400213 // mTabHost.setCurrentTab(position);
alision9f7a6ec2013-05-24 16:26:26 -0400214 }
215 });
alisionf76de3b2013-04-16 15:35:22 -0400216
alision9f7a6ec2013-05-24 16:26:26 -0400217 }
alisionf76de3b2013-04-16 15:35:22 -0400218
alisionf57d8a62013-07-02 09:37:12 -0400219 @Override
220 protected void onPostCreate(Bundle savedInstanceState) {
221 super.onPostCreate(savedInstanceState);
222 // Sync the toggle state after onRestoreInstanceState has occurred.
223 mDrawerToggle.syncState();
Alexandre Lisionc51ccb12013-09-11 16:00:30 -0400224
225// Toast.makeText(this, "Mini Buff:"+AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT), Toast.LENGTH_LONG).show();
alisionf57d8a62013-07-02 09:37:12 -0400226 }
alision465ceba2013-07-04 09:24:30 -0400227
alisionf57d8a62013-07-02 09:37:12 -0400228 @Override
229 public void onConfigurationChanged(Configuration newConfig) {
230 super.onConfigurationChanged(newConfig);
231 mDrawerToggle.onConfigurationChanged(newConfig);
232 }
alision3c5c2a92013-05-30 09:50:47 -0400233
alision9f7a6ec2013-05-24 16:26:26 -0400234 @Override
235 protected void onStart() {
236 Log.i(TAG, "onStart");
237 super.onStart();
Alexandre Lisionc51ccb12013-09-11 16:00:30 -0400238
alision9f7a6ec2013-05-24 16:26:26 -0400239 }
alisionf76de3b2013-04-16 15:35:22 -0400240
alision9f7a6ec2013-05-24 16:26:26 -0400241 /* user gets back to the activity, e.g. through task manager */
242 @Override
243 protected void onRestart() {
244 super.onRestart();
245 }
alisionf76de3b2013-04-16 15:35:22 -0400246
alision9f7a6ec2013-05-24 16:26:26 -0400247 /* activity gets back to the foreground and user input */
248 @Override
249 protected void onResume() {
alision58356b72013-06-03 17:13:36 -0400250 super.onResume();
alision84813a12013-05-27 17:40:39 -0400251 IntentFilter intentFilter = new IntentFilter();
252 intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
253 intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
254 intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
alision58356b72013-06-03 17:13:36 -0400255 registerReceiver(callReceiver, intentFilter);
alision907bde72013-06-20 14:40:37 -0400256
alision9f7a6ec2013-05-24 16:26:26 -0400257 }
alision907bde72013-06-20 14:40:37 -0400258
alisionbd45a822013-06-06 17:35:35 -0400259 private boolean isClosing = false;
260 private Timer t = new Timer();
alision907bde72013-06-20 14:40:37 -0400261
alisionbd45a822013-06-06 17:35:35 -0400262 @Override
263 public void onBackPressed() {
alision907bde72013-06-20 14:40:37 -0400264
265 if (getActionBar().getCustomView() != null) {
alision2ec64f92013-06-17 17:28:58 -0400266 getActionBar().setDisplayShowCustomEnabled(false);
267 getActionBar().setCustomView(null);
268 // Display all the contacts again
269 getLoaderManager().restartLoader(LoaderConstants.CONTACT_LOADER, null, mContactsFragment);
270 return;
271 }
alision907bde72013-06-20 14:40:37 -0400272
alisionbd45a822013-06-06 17:35:35 -0400273 if (mDrawer.isOpened()) {
alision55c36cb2013-06-14 14:57:38 -0400274 mDrawer.animateClose();
alisionbd45a822013-06-06 17:35:35 -0400275 return;
276 }
alision2ec64f92013-06-17 17:28:58 -0400277
alisionbd45a822013-06-06 17:35:35 -0400278 if (isClosing) {
279 super.onBackPressed();
280 t.cancel();
281 finish();
282 } else {
283
284 t.schedule(new TimerTask() {
285 @Override
286 public void run() {
287 isClosing = false;
288 }
289 }, 3000);
290 Toast.makeText(this, getResources().getString(R.string.close_msg), Toast.LENGTH_SHORT).show();
291 isClosing = true;
292 }
293 }
alisione2a38e12013-04-25 14:20:20 -0400294
alision9f7a6ec2013-05-24 16:26:26 -0400295 /* activity no more in foreground */
296 @Override
297 protected void onPause() {
298 super.onPause();
alision58356b72013-06-03 17:13:36 -0400299 unregisterReceiver(callReceiver);
alision55c36cb2013-06-14 14:57:38 -0400300 try {
301 service.createNotification();
302
303 } catch (RemoteException e) {
304 Log.e(TAG, e.toString());
305 }
alision2cb99562013-05-30 17:02:20 -0400306
alision9f7a6ec2013-05-24 16:26:26 -0400307 }
alisionf76de3b2013-04-16 15:35:22 -0400308
alision9f7a6ec2013-05-24 16:26:26 -0400309 /* activity is no longer visible */
310 @Override
311 protected void onStop() {
312 super.onStop();
alision2cb99562013-05-30 17:02:20 -0400313
alision9f7a6ec2013-05-24 16:26:26 -0400314 }
alisionf76de3b2013-04-16 15:35:22 -0400315
alision9f7a6ec2013-05-24 16:26:26 -0400316 /* activity finishes itself or is being killed by the system */
317 @Override
318 protected void onDestroy() {
319 /* stop the service, if no other bound user, no need to check if it is running */
320 if (mBound) {
321 Log.i(TAG, "onDestroy: Unbinding service...");
alision907bde72013-06-20 14:40:37 -0400322
alision9f7a6ec2013-05-24 16:26:26 -0400323 unbindService(mConnection);
324 mBound = false;
alision2cb99562013-05-30 17:02:20 -0400325
alision9f7a6ec2013-05-24 16:26:26 -0400326 }
alision371b77e2013-04-23 14:51:26 -0400327
alision9f7a6ec2013-05-24 16:26:26 -0400328 super.onDestroy();
329 }
alision73424b62013-04-26 11:49:18 -0400330
alision55c36cb2013-06-14 14:57:38 -0400331 public void launchCallActivity(SipCall infos) {
alision9f7a6ec2013-05-24 16:26:26 -0400332 Log.i(TAG, "Launch Call Activity");
333 Bundle bundle = new Bundle();
alisiondf1dac92013-06-27 17:35:53 -0400334 Conference tmp = new Conference("-1");
alision465ceba2013-07-04 09:24:30 -0400335
alisiondf1dac92013-06-27 17:35:53 -0400336 tmp.getParticipants().add(infos);
alision465ceba2013-07-04 09:24:30 -0400337
alisiondf1dac92013-06-27 17:35:53 -0400338 bundle.putParcelable("conference", tmp);
alision9f7a6ec2013-05-24 16:26:26 -0400339 Intent intent = new Intent().setClass(this, CallActivity.class);
alisiondf1dac92013-06-27 17:35:53 -0400340 intent.putExtra("resuming", false);
alision9f7a6ec2013-05-24 16:26:26 -0400341 intent.putExtras(bundle);
342 startActivityForResult(intent, REQUEST_CODE_CALL);
alision465ceba2013-07-04 09:24:30 -0400343 overridePendingTransition(R.anim.slide_down, R.anim.slide_up);
alision9f7a6ec2013-05-24 16:26:26 -0400344 }
alisionf76de3b2013-04-16 15:35:22 -0400345
alision9f7a6ec2013-05-24 16:26:26 -0400346 /** Defines callbacks for service binding, passed to bindService() */
347 private ServiceConnection mConnection = new ServiceConnection() {
alision371b77e2013-04-23 14:51:26 -0400348
alision9f7a6ec2013-05-24 16:26:26 -0400349 @Override
350 public void onServiceConnected(ComponentName className, IBinder binder) {
351 service = ISipService.Stub.asInterface(binder);
alisione2a38e12013-04-25 14:20:20 -0400352
alision2cb99562013-05-30 17:02:20 -0400353 try {
alision58356b72013-06-03 17:13:36 -0400354
alision907bde72013-06-20 14:40:37 -0400355 fMenu = new MenuFragment();
356 getFragmentManager().beginTransaction().replace(R.id.left_drawer, fMenu).commit();
alision58356b72013-06-03 17:13:36 -0400357 mSectionsPagerAdapter = new SectionsPagerAdapter(SFLPhoneHomeActivity.this, getFragmentManager());
Alexandre Lisionc51ccb12013-09-11 16:00:30 -0400358
Alexandre Lisionf41a3a82013-09-05 17:15:15 -0400359 final PagerTabStrip strip = PagerTabStrip.class.cast(mViewPager.findViewById(R.id.pts_main));
360 strip.setDrawFullUnderline(false);
361 strip.setTabIndicatorColor(getResources().getColor(R.color.holo_blue_dark));
Alexandre Lisiona764c682013-09-09 10:02:07 -0400362 strip.setBackgroundColor(getResources().getColor(R.color.darker_gray));
Alexandre Lisionf41a3a82013-09-05 17:15:15 -0400363 strip.setNonPrimaryAlpha(0.5f);
364 strip.setTextSpacing(25);
365 strip.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
Alexandre Lisionc51ccb12013-09-11 16:00:30 -0400366
367 // initialiseTabHost(null);
alisiondf1dac92013-06-27 17:35:53 -0400368 mViewPager.setOffscreenPageLimit(2);
alision58356b72013-06-03 17:13:36 -0400369 mViewPager.setAdapter(mSectionsPagerAdapter);
Alexandre Lisionc51ccb12013-09-11 16:00:30 -0400370 mViewPager.setCurrentItem(1);
371 // mTabHost.setCurrentTab(1);
alision2cb99562013-05-30 17:02:20 -0400372 service.destroyNotification();
alision58356b72013-06-03 17:13:36 -0400373 // mAdapter = new AccountSelectionAdapter(SFLPhoneHomeActivity.this, service, new ArrayList<Account>());
374 // spinnerAccounts.setAdapter(mAdapter);
alision2cb99562013-05-30 17:02:20 -0400375 } catch (RemoteException e) {
376 Log.e(TAG, e.toString());
377 }
alision9f7a6ec2013-05-24 16:26:26 -0400378 mBound = true;
alision9f7a6ec2013-05-24 16:26:26 -0400379 Log.d(TAG, "Service connected service=" + service);
alision371b77e2013-04-23 14:51:26 -0400380
alision9f7a6ec2013-05-24 16:26:26 -0400381 }
alision5f899632013-04-22 17:26:56 -0400382
alision9f7a6ec2013-05-24 16:26:26 -0400383 @Override
384 public void onServiceDisconnected(ComponentName arg0) {
alision5f899632013-04-22 17:26:56 -0400385
alision9f7a6ec2013-05-24 16:26:26 -0400386 mBound = false;
387 Log.d(TAG, "Service disconnected service=" + service);
388 }
389 };
alision5f899632013-04-22 17:26:56 -0400390
alision9f7a6ec2013-05-24 16:26:26 -0400391 @Override
392 public boolean onOptionsItemSelected(MenuItem item) {
393 Log.i(TAG, "onOptionsItemSelected " + item.getItemId());
alision5f899632013-04-22 17:26:56 -0400394
alision9f7a6ec2013-05-24 16:26:26 -0400395 if (mDrawerToggle.onOptionsItemSelected(item)) {
396 return true;
397 }
alision5f899632013-04-22 17:26:56 -0400398
alision9f7a6ec2013-05-24 16:26:26 -0400399 return super.onOptionsItemSelected(item);
400 }
alisionf76de3b2013-04-16 15:35:22 -0400401
alision9f7a6ec2013-05-24 16:26:26 -0400402 @Override
403 public void onActivityResult(int requestCode, int resultCode, Intent data) {
404 super.onActivityResult(requestCode, resultCode, data);
alision84813a12013-05-27 17:40:39 -0400405
406 switch (requestCode) {
alision9f7a6ec2013-05-24 16:26:26 -0400407 case REQUEST_CODE_PREFERENCES:
alision907bde72013-06-20 14:40:37 -0400408 Log.w(TAG, "In Activity");
409 fMenu.updateAllAccounts();
alision9f7a6ec2013-05-24 16:26:26 -0400410 break;
411 case REQUEST_CODE_CALL:
alision2cb99562013-05-30 17:02:20 -0400412 Log.w(TAG, "Result out of CallActivity");
Alexandre Lisionc51ccb12013-09-11 16:00:30 -0400413 if (resultCode == CallActivity.RESULT_FAILURE) {
414 Log.w(TAG, "CALL FAILEEEED");
415 }
416 // if (mSectionsPagerAdapter != null && mSectionsPagerAdapter.getItem(2) != null)
417 // getLoaderManager().restartLoader(LoaderConstants.HISTORY_LOADER, null, (HistoryFragment) mSectionsPagerAdapter.getItem(2));
alision9f7a6ec2013-05-24 16:26:26 -0400418 break;
419 }
alisionf76de3b2013-04-16 15:35:22 -0400420
alision9f7a6ec2013-05-24 16:26:26 -0400421 }
alisionf76de3b2013-04-16 15:35:22 -0400422
alision9f7a6ec2013-05-24 16:26:26 -0400423 @Override
alision9f7a6ec2013-05-24 16:26:26 -0400424 public ISipService getService() {
425 return service;
426 }
alisionf76de3b2013-04-16 15:35:22 -0400427
alision84813a12013-05-27 17:40:39 -0400428 /**
429 * Interface implemented to handle incoming events
430 */
alision9f7a6ec2013-05-24 16:26:26 -0400431 @Override
alision84813a12013-05-27 17:40:39 -0400432 public void incomingCall(Intent call) {
433 Toast.makeText(this, "New Call incoming", Toast.LENGTH_LONG).show();
alisionfde875f2013-05-28 17:01:54 -0400434 SipCall infos = call.getParcelableExtra("newcall");
alision84813a12013-05-27 17:40:39 -0400435
alision58356b72013-06-03 17:13:36 -0400436 // mCallElementList.addCall(infos);
alisionfde875f2013-05-28 17:01:54 -0400437
alision55c36cb2013-06-14 14:57:38 -0400438 launchCallActivity(infos);
alision84813a12013-05-27 17:40:39 -0400439
440 }
441
442 @Override
443 public void callStateChanged(Intent callState) {
444 Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
445 String cID = b.getString("CallID");
446 String state = b.getString("State");
447 Log.i(TAG, "callStateChanged" + cID + " " + state);
alision58356b72013-06-03 17:13:36 -0400448 // mCallElementList.updateCall(cID, state);
alision84813a12013-05-27 17:40:39 -0400449
450 }
451
452 @Override
453 public void incomingText(Intent msg) {
454 Bundle b = msg.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
455 b.getString("CallID");
456 String from = b.getString("From");
457 String mess = b.getString("Msg");
458 Toast.makeText(getApplicationContext(), "text from " + from + " : " + mess, Toast.LENGTH_LONG).show();
459 }
460
461 @Override
alision55c36cb2013-06-14 14:57:38 -0400462 public void onContactSelected(final CallContact c) {
Alexandre Lisionf0b993d2013-09-12 13:25:10 -0400463
464 if (fMenu.getSelectedAccount() == null) {
465 // Toast.makeText(this, "No Account Selected", Toast.LENGTH_SHORT).show();
466 createAccountDialog().show();
467 return;
468 }
alisionfde875f2013-05-28 17:01:54 -0400469
alision55c36cb2013-06-14 14:57:38 -0400470 Thread launcher = new Thread(new Runnable() {
alision907bde72013-06-20 14:40:37 -0400471
alision55c36cb2013-06-14 14:57:38 -0400472 final String[] CONTACTS_PHONES_PROJECTION = new String[] { Phone.NUMBER, Phone.TYPE };
473 final String[] CONTACTS_SIP_PROJECTION = new String[] { SipAddress.SIP_ADDRESS, SipAddress.TYPE };
alision907bde72013-06-20 14:40:37 -0400474
alision55c36cb2013-06-14 14:57:38 -0400475 @Override
476 public void run() {
477 SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
478 try {
Alexandre Lisionf0b993d2013-09-12 13:25:10 -0400479 callBuilder.startCallCreation().setAccountID(fMenu.getSelectedAccount().getAccountID())
alision907bde72013-06-20 14:40:37 -0400480 .setCallType(SipCall.state.CALL_TYPE_OUTGOING);
481 Cursor cPhones = getContentResolver().query(Phone.CONTENT_URI, CONTACTS_PHONES_PROJECTION, Phone.CONTACT_ID + " =" + c.getId(),
482 null, null);
alision55c36cb2013-06-14 14:57:38 -0400483
alision907bde72013-06-20 14:40:37 -0400484 while (cPhones.moveToNext()) {
485 c.addPhoneNumber(cPhones.getString(cPhones.getColumnIndex(Phone.NUMBER)), cPhones.getInt(cPhones.getColumnIndex(Phone.TYPE)));
486 }
487 cPhones.close();
488
489 Cursor cSip = getContentResolver().query(Phone.CONTENT_URI, CONTACTS_SIP_PROJECTION, Phone.CONTACT_ID + "=" + c.getId(), null,
490 null);
491
492 while (cSip.moveToNext()) {
493 c.addSipNumber(cSip.getString(cSip.getColumnIndex(SipAddress.SIP_ADDRESS)), cSip.getInt(cSip.getColumnIndex(SipAddress.TYPE)));
494 }
495 cSip.close();
496 callBuilder.setContact(c);
alision55c36cb2013-06-14 14:57:38 -0400497 launchCallActivity(callBuilder.build());
498 } catch (RemoteException e1) {
499 Log.e(TAG, e1.toString());
500 } catch (Exception e) {
501 Log.e(TAG, e.toString());
502 }
alision907bde72013-06-20 14:40:37 -0400503
alision55c36cb2013-06-14 14:57:38 -0400504 }
505 });
506 launcher.start();
507 mDrawer.close();
alision84813a12013-05-27 17:40:39 -0400508
509 }
510
511 @Override
alision907bde72013-06-20 14:40:37 -0400512 public void onCallDialed(String to) {
alision84813a12013-05-27 17:40:39 -0400513
alisiondf1dac92013-06-27 17:35:53 -0400514 if (fMenu.getSelectedAccount() == null) {
Alexandre Lisionc51ccb12013-09-11 16:00:30 -0400515 // Toast.makeText(this, "No Account Selected", Toast.LENGTH_SHORT).show();
516 createAccountDialog().show();
alisiondf1dac92013-06-27 17:35:53 -0400517 return;
518 }
519
alisionfde875f2013-05-28 17:01:54 -0400520 SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
alision907bde72013-06-20 14:40:37 -0400521 callBuilder.startCallCreation().setAccountID(fMenu.getSelectedAccount().getAccountID()).setCallType(SipCall.state.CALL_TYPE_OUTGOING);
522 callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(to));
alision84813a12013-05-27 17:40:39 -0400523
alisionfde875f2013-05-28 17:01:54 -0400524 try {
alision55c36cb2013-06-14 14:57:38 -0400525 launchCallActivity(callBuilder.build());
alisionfde875f2013-05-28 17:01:54 -0400526 } catch (Exception e) {
527 Log.e(TAG, e.toString());
528 }
alision84813a12013-05-27 17:40:39 -0400529
alision9f7a6ec2013-05-24 16:26:26 -0400530 }
alision371b77e2013-04-23 14:51:26 -0400531
Alexandre Lisionc51ccb12013-09-11 16:00:30 -0400532 private AlertDialog createAccountDialog() {
533 final Activity ownerActivity = this;
534 AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
535
536 builder.setMessage(getResources().getString(R.string.create_new_account_dialog))
537 .setTitle(getResources().getString(R.string.create_new_account_dialog_title))
538 .setPositiveButton(getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() {
539 public void onClick(DialogInterface dialog, int whichButton) {
540 Intent in = new Intent();
541 in.setClass(ownerActivity, SFLPhonePreferenceActivity.class);
542 ownerActivity.startActivityForResult(in, SFLPhoneHomeActivity.REQUEST_CODE_PREFERENCES);
543 }
544 }).setNegativeButton(getResources().getString(android.R.string.cancel), new DialogInterface.OnClickListener() {
545 public void onClick(DialogInterface dialog, int whichButton) {
546 dialog.dismiss();
547 }
548 });
549
550 AlertDialog alertDialog = builder.create();
551 alertDialog.setOwnerActivity(ownerActivity);
552
553 return alertDialog;
554 }
555
alisiond45da712013-05-30 09:18:49 -0400556 @Override
557 public void onContactDragged() {
558
559 mDrawer.close();
Alexandre Lisionc51ccb12013-09-11 16:00:30 -0400560 // mTabHost.setCurrentTab(1);
alisiond45da712013-05-30 09:18:49 -0400561
562 }
563
alisiond45da712013-05-30 09:18:49 -0400564 /**
565 * A simple factory that returns dummy views to the Tabhost
566 *
567 * @author mwho
568 */
569 class TabFactory implements TabContentFactory {
570
571 private final Context mContext;
572
573 /**
574 * @param context
575 */
576 public TabFactory(Context context) {
577 mContext = context;
578 }
579
580 /**
581 * (non-Javadoc)
582 *
583 * @see android.widget.TabHost.TabContentFactory#createTabContent(java.lang.String)
584 */
585 public View createTabContent(String tag) {
586 View v = new View(mContext);
587 v.setMinimumWidth(0);
588 v.setMinimumHeight(0);
589 return v;
590 }
591
592 }
593
alision58356b72013-06-03 17:13:36 -0400594 @Override
595 public void openDrawer() {
alision55c36cb2013-06-14 14:57:38 -0400596 mDrawer.animateOpen();
alision58356b72013-06-03 17:13:36 -0400597 }
598
alision806e18e2013-06-21 15:30:17 -0400599 @Override
600 public void confCreated(Intent intent) {
601 // TODO Auto-generated method stub
alisiondf1dac92013-06-27 17:35:53 -0400602
alision806e18e2013-06-21 15:30:17 -0400603 }
604
605 @Override
606 public void confRemoved(Intent intent) {
607 // TODO Auto-generated method stub
alisiondf1dac92013-06-27 17:35:53 -0400608
alision806e18e2013-06-21 15:30:17 -0400609 }
610
611 @Override
612 public void confChanged(Intent intent) {
613 // TODO Auto-generated method stub
alisiondf1dac92013-06-27 17:35:53 -0400614
615 }
616
617 @Override
618 public void recordingChanged(Intent intent) {
619 // TODO Auto-generated method stub
620
621 }
622
623 @Override
624 public void resumeCallActivity() {
625 Intent intent = new Intent().setClass(this, CallActivity.class);
626 intent.putExtra("resuming", true);
627 startActivityForResult(intent, REQUEST_CODE_CALL);
alision806e18e2013-06-21 15:30:17 -0400628 }
629
alisionf76de3b2013-04-16 15:35:22 -0400630}