blob: 025709c89d0d7123cc76d3104deaaa6d48772ab4 [file] [log] [blame]
Alexandre Savard14323be2012-10-24 10:02:13 -04001/*
2 * Copyright (C) 2004-2012 Savoir-Faire Linux Inc.
3 *
4 * Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
Adrien Béraud71b2f812013-04-26 18:51:02 +10005 * Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
alisionfde875f2013-05-28 17:01:54 -04006 * Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
Alexandre Savard14323be2012-10-24 10:02:13 -04007 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 *
22 * Additional permission under GNU GPL version 3 section 7:
23 *
24 * If you modify this program, or any covered work, by linking or
25 * combining it with the OpenSSL project's OpenSSL library (or a
26 * modified version of that library), containing parts covered by the
27 * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
28 * grants you additional permission to convey the resulting work.
29 * Corresponding Source for a non-source form of such a combination
30 * shall include the source code for the parts of OpenSSL used as well
31 * as that of the covered work.
32 */
33
34package com.savoirfairelinux.sflphone.client;
35
Adrien Béraud33268882013-05-18 03:41:15 +100036import java.util.concurrent.ExecutorService;
37import java.util.concurrent.Executors;
38
Alexandre Savard14323be2012-10-24 10:02:13 -040039import android.app.Activity;
Alexandre Savard6d54bbc2012-10-24 11:04:23 -040040import android.content.ComponentName;
alision17052d42013-04-22 10:39:38 -040041import android.content.Context;
Alexandre Savard6d54bbc2012-10-24 11:04:23 -040042import android.content.Intent;
alision84813a12013-05-27 17:40:39 -040043import android.content.IntentFilter;
Alexandre Savard6d54bbc2012-10-24 11:04:23 -040044import android.content.ServiceConnection;
Alexandre Savard14323be2012-10-24 10:02:13 -040045import android.os.Bundle;
Alexandre Savard6d54bbc2012-10-24 11:04:23 -040046import android.os.IBinder;
alision84813a12013-05-27 17:40:39 -040047import android.support.v4.view.ViewPager;
alisionfde875f2013-05-28 17:01:54 -040048import android.support.v4.widget.SlidingPaneLayout;
Alexandre Savard6d54bbc2012-10-24 11:04:23 -040049import android.util.Log;
alisionfde875f2013-05-28 17:01:54 -040050import android.view.View;
Adrien Béraud33268882013-05-18 03:41:15 +100051import android.widget.Toast;
Alexandre Savard14323be2012-10-24 10:02:13 -040052
53import com.savoirfairelinux.sflphone.R;
alision84813a12013-05-27 17:40:39 -040054import com.savoirfairelinux.sflphone.client.receiver.CallReceiver;
55import com.savoirfairelinux.sflphone.fragments.CallFragment;
alisionfde875f2013-05-28 17:01:54 -040056import com.savoirfairelinux.sflphone.fragments.CallListFragment;
alision84813a12013-05-27 17:40:39 -040057import com.savoirfairelinux.sflphone.interfaces.CallInterface;
alisionf76de3b2013-04-16 15:35:22 -040058import com.savoirfairelinux.sflphone.model.SipCall;
alision84813a12013-05-27 17:40:39 -040059import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
Alexandre Savard6d54bbc2012-10-24 11:04:23 -040060import com.savoirfairelinux.sflphone.service.ISipService;
61import com.savoirfairelinux.sflphone.service.SipService;
Alexandre Savard14323be2012-10-24 10:02:13 -040062
alisionfde875f2013-05-28 17:01:54 -040063public class CallActivity extends Activity implements CallInterface, CallFragment.Callbacks, CallListFragment.Callbacks {
alision9f7a6ec2013-05-24 16:26:26 -040064 static final String TAG = "CallActivity";
65 private ISipService service;
alision84813a12013-05-27 17:40:39 -040066
alision9f7a6ec2013-05-24 16:26:26 -040067 private String pendingAction = null;
Adrien Béraud33268882013-05-18 03:41:15 +100068
alision9f7a6ec2013-05-24 16:26:26 -040069 private ExecutorService infos_fetcher = Executors.newCachedThreadPool();
alision84813a12013-05-27 17:40:39 -040070 CallReceiver receiver;
alisionfde875f2013-05-28 17:01:54 -040071
72 CallListFragment mCallsFragment;
73 CallFragment mCurrentCallFragment;
Adrien Béraud33268882013-05-18 03:41:15 +100074
alisionfde875f2013-05-28 17:01:54 -040075
76 // private CallPagerAdapter mCallPagerAdapter;
77 // private ViewPager mViewPager;
Alexandre Savard4f42ade2012-10-24 18:03:31 -040078
alision9f7a6ec2013-05-24 16:26:26 -040079 /*
80 * private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
81 *
82 * @Override public void onReceive(Context context, Intent intent) { String signalName = intent.getStringExtra(CallManagerCallBack.SIGNAL_NAME);
83 * Log.d(TAG, "Signal received: " + signalName);
84 *
85 * if (signalName.equals(CallManagerCallBack.NEW_CALL_CREATED)) { } else if (signalName.equals(CallManagerCallBack.CALL_STATE_CHANGED)) {
86 * processCallStateChangedSignal(intent); } else if (signalName.equals(CallManagerCallBack.INCOMING_CALL)) { } } };
87 */
Alexandre Savard4f42ade2012-10-24 18:03:31 -040088
alision9f7a6ec2013-05-24 16:26:26 -040089 @Override
90 protected void onCreate(Bundle savedInstanceState) {
91 super.onCreate(savedInstanceState);
alision84813a12013-05-27 17:40:39 -040092 setContentView(R.layout.activity_call_layout);
Adrien Béraud33268882013-05-18 03:41:15 +100093
alision84813a12013-05-27 17:40:39 -040094 receiver = new CallReceiver(this);
Adrien Béraud33268882013-05-18 03:41:15 +100095
alision84813a12013-05-27 17:40:39 -040096
alisionfde875f2013-05-28 17:01:54 -040097 mCallsFragment = new CallListFragment();
98
99
100
101 getFragmentManager().beginTransaction().replace(R.id.calllist_pane, mCallsFragment).commit();
102
alision84813a12013-05-27 17:40:39 -0400103
alisionfde875f2013-05-28 17:01:54 -0400104 final SlidingPaneLayout slidingPaneLayout = (SlidingPaneLayout) findViewById(R.id.slidingpanelayout);
105 slidingPaneLayout.setPanelSlideListener(new SlidingPaneLayout.PanelSlideListener() {
106
107 @Override
108 public void onPanelSlide(View view, float offSet) {
109 }
110
111 @Override
112 public void onPanelOpened(View view) {
113
114 switch (view.getId()) {
115 case R.id.calllist_pane:
116// getFragmentManager().findFragmentById(R.id.calllist_pane).setHasOptionsMenu(true);
117// getFragmentManager().findFragmentById(R.id.ongoingcall_pane).setHasOptionsMenu(false);
118 break;
119 default:
120 break;
121 }
122 }
123
124 @Override
125 public void onPanelClosed(View view) {
126
127 switch (view.getId()) {
128 case R.id.ongoingcall_pane:
129// getFragmentManager().findFragmentById(R.id.calllist_pane).setHasOptionsMenu(false);
130// getFragmentManager().findFragmentById(R.id.ongoingcall_pane).setHasOptionsMenu(true);
131 break;
132 default:
133 break;
134 }
135 }
136 });
Adrien Béraud33268882013-05-18 03:41:15 +1000137
alision9f7a6ec2013-05-24 16:26:26 -0400138 Bundle b = getIntent().getExtras();
Alexandre Savard6d54bbc2012-10-24 11:04:23 -0400139
alision9f7a6ec2013-05-24 16:26:26 -0400140 Intent intent = new Intent(this, SipService.class);
Alexandre Savard6d54bbc2012-10-24 11:04:23 -0400141
alision9f7a6ec2013-05-24 16:26:26 -0400142 // setCallStateDisplay(mCall.getCallStateString());
Adrien Béraud6bbce912013-05-24 00:48:13 +1000143
alision9f7a6ec2013-05-24 16:26:26 -0400144 bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
Adrien Béraud33268882013-05-18 03:41:15 +1000145
alision9f7a6ec2013-05-24 16:26:26 -0400146 }
Adrien Béraud33268882013-05-18 03:41:15 +1000147
alision84813a12013-05-27 17:40:39 -0400148 /* activity gets back to the foreground and user input */
149 @Override
150 protected void onResume() {
151 Log.i(TAG, "onResume");
152 IntentFilter intentFilter = new IntentFilter();
153 intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
154 intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
155 intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
156 registerReceiver(receiver, intentFilter);
157 super.onResume();
alision9f7a6ec2013-05-24 16:26:26 -0400158 }
Adrien Béraud33268882013-05-18 03:41:15 +1000159
alision84813a12013-05-27 17:40:39 -0400160 /* activity no more in foreground */
161 @Override
162 protected void onPause() {
163 super.onPause();
164 unregisterReceiver(receiver);
alision9f7a6ec2013-05-24 16:26:26 -0400165 }
Alexandre Savard6d54bbc2012-10-24 11:04:23 -0400166
alision9f7a6ec2013-05-24 16:26:26 -0400167 @Override
168 protected void onDestroy() {
169 // Log.i(TAG, "Destroying Call Activity for call " + mCall.getCallId());
170 // LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
171 unbindService(mConnection);
alisiond8c83882013-05-17 17:00:42 -0400172
alision9f7a6ec2013-05-24 16:26:26 -0400173 super.onDestroy();
174 }
Adrien Béraud6bbce912013-05-24 00:48:13 +1000175
alision9f7a6ec2013-05-24 16:26:26 -0400176 /** Defines callbacks for service binding, passed to bindService() */
177 private ServiceConnection mConnection = new ServiceConnection() {
178 @Override
179 public void onServiceConnected(ComponentName className, IBinder binder) {
180 service = ISipService.Stub.asInterface(binder);
alisionfde875f2013-05-28 17:01:54 -0400181 Log.i(TAG, "Placing call");
182 mCurrentCallFragment = new CallFragment();
183 mCurrentCallFragment.setArguments(getIntent().getExtras());
184 getIntent().getExtras();
185 SipCall info = getIntent().getExtras().getParcelable("CallInfo");
186 // mCallPagerAdapter.addCall(info.mCallID, newCall);
187 getFragmentManager().beginTransaction().replace(R.id.ongoingcall_pane, mCurrentCallFragment).commit();
Adrien Béraud6bbce912013-05-24 00:48:13 +1000188
alision9f7a6ec2013-05-24 16:26:26 -0400189 }
Alexandre Savarde41f5212012-10-26 14:23:50 -0400190
alision9f7a6ec2013-05-24 16:26:26 -0400191 @Override
192 public void onServiceDisconnected(ComponentName arg0) {
193 }
194 };
Alexandre Savarddf544262012-10-25 14:24:08 -0400195
alision84813a12013-05-27 17:40:39 -0400196 @Override
197 public void incomingCall(Intent call) {
198 Toast.makeText(this, "New Call incoming", Toast.LENGTH_LONG).show();
199
alisionfde875f2013-05-28 17:01:54 -0400200 mCallsFragment.update();
alision84813a12013-05-27 17:40:39 -0400201
202 }
203
204 @Override
205 public void callStateChanged(Intent callState) {
206
207 Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
208 processCallStateChangedSignal(b.getString("CallID"), b.getString("State"));
209
210 }
211
212 public void processCallStateChangedSignal(String callID, String newState) {
alision9f7a6ec2013-05-24 16:26:26 -0400213 /*
214 * Bundle bundle = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate"); String callID = bundle.getString("CallID"); String
215 * newState = bundle.getString("State");
216 */
alisionfde875f2013-05-28 17:01:54 -0400217 CallFragment fr = mCurrentCallFragment;
Adrien Béraud29556042013-04-26 17:35:43 +1000218
alision9f7a6ec2013-05-24 16:26:26 -0400219 if (newState.equals("INCOMING")) {
alisionfde875f2013-05-28 17:01:54 -0400220 fr.changeCallState(SipCall.state.CALL_STATE_INCOMING);
alision84813a12013-05-27 17:40:39 -0400221
alision9f7a6ec2013-05-24 16:26:26 -0400222 } else if (newState.equals("RINGING")) {
alisionfde875f2013-05-28 17:01:54 -0400223 fr.changeCallState(SipCall.state.CALL_STATE_RINGING);
alision84813a12013-05-27 17:40:39 -0400224
alision9f7a6ec2013-05-24 16:26:26 -0400225 } else if (newState.equals("CURRENT")) {
alisionfde875f2013-05-28 17:01:54 -0400226 fr.changeCallState(SipCall.state.CALL_STATE_CURRENT);
alision84813a12013-05-27 17:40:39 -0400227
alision9f7a6ec2013-05-24 16:26:26 -0400228 } else if (newState.equals("HUNGUP")) {
alisionfde875f2013-05-28 17:01:54 -0400229// mCallPagerAdapter.remove(callID);
230// if (mCallPagerAdapter.getCount() == 0) {
231// finish();
232// }
alision84813a12013-05-27 17:40:39 -0400233
alision9f7a6ec2013-05-24 16:26:26 -0400234 } else if (newState.equals("BUSY")) {
alisionfde875f2013-05-28 17:01:54 -0400235// mCallPagerAdapter.remove(callID);
236// if (mCallPagerAdapter.getCount() == 0) {
237// finish();
238// }
alision84813a12013-05-27 17:40:39 -0400239
alision9f7a6ec2013-05-24 16:26:26 -0400240 } else if (newState.equals("FAILURE")) {
alisionfde875f2013-05-28 17:01:54 -0400241// mCallPagerAdapter.remove(callID);
242// if (mCallPagerAdapter.getCount() == 0) {
243// finish();
244// }
alision84813a12013-05-27 17:40:39 -0400245
alision9f7a6ec2013-05-24 16:26:26 -0400246 } else if (newState.equals("HOLD")) {
alisionfde875f2013-05-28 17:01:54 -0400247 fr.changeCallState(SipCall.state.CALL_STATE_HOLD);
alision84813a12013-05-27 17:40:39 -0400248
alision9f7a6ec2013-05-24 16:26:26 -0400249 } else if (newState.equals("UNHOLD")) {
alisionfde875f2013-05-28 17:01:54 -0400250 fr.changeCallState(SipCall.state.CALL_STATE_CURRENT);
alision84813a12013-05-27 17:40:39 -0400251
alision9f7a6ec2013-05-24 16:26:26 -0400252 } else {
alisionfde875f2013-05-28 17:01:54 -0400253 fr.changeCallState(SipCall.state.CALL_STATE_NONE);
alision84813a12013-05-27 17:40:39 -0400254
alision9f7a6ec2013-05-24 16:26:26 -0400255 }
Adrien Béraudc99b8432013-04-25 16:27:46 +1000256
alision9f7a6ec2013-05-24 16:26:26 -0400257 Log.w(TAG, "processCallStateChangedSignal " + newState);
Adrien Béraud29556042013-04-26 17:35:43 +1000258
alision9f7a6ec2013-05-24 16:26:26 -0400259 }
Adrien Béraud71b2f812013-04-26 18:51:02 +1000260
alision84813a12013-05-27 17:40:39 -0400261 @Override
262 public void incomingText(Intent msg) {
263 Toast.makeText(this, "New Call incoming", Toast.LENGTH_LONG).show();
Adrien Béraud29556042013-04-26 17:35:43 +1000264
alision84813a12013-05-27 17:40:39 -0400265 // TODO link text message to associate call and display it at the right place
Adrien Béraud71b2f812013-04-26 18:51:02 +1000266
alision9f7a6ec2013-05-24 16:26:26 -0400267 }
alision7f18fc82013-05-01 09:37:33 -0400268
alision84813a12013-05-27 17:40:39 -0400269 @Override
270 public ISipService getService() {
271 return service;
alision9f7a6ec2013-05-24 16:26:26 -0400272 }
alision04a00182013-05-10 17:05:29 -0400273
Alexandre Savard14323be2012-10-24 10:02:13 -0400274}