Linphone service waiting activity.

This commit is contained in:
Guillaume Beraudo 2011-09-29 16:07:57 +02:00
parent 45da67aa1c
commit 08e025a07e
5 changed files with 168 additions and 45 deletions

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ProgressBar android:layout_height="wrap_content" android:layout_width="wrap_content"/>
<TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="waiting"/>
</LinearLayout>

View file

@ -62,7 +62,7 @@ import android.widget.Toast;
* </ul>
*
*/
public class DialerActivity extends SoftVolumeActivity implements LinphoneGuiListener, NewOutgoingCallUiListener {
public class DialerActivity extends LinphoneManagerWaitActivity implements LinphoneGuiListener, NewOutgoingCallUiListener {
private TextView mStatus;
private View mHangup;
@ -89,7 +89,7 @@ public class DialerActivity extends SoftVolumeActivity implements LinphoneGuiLis
private static final String CURRENT_ADDRESS = "org.linphone.current-address";
private static final String CURRENT_DISPLAYNAME = "org.linphone.current-displayname";
private static final int INCOMING_CALL_DIALOG_ID = 1;
private static final int incomingCallDialogId = 1;
/**
* @return null if not ready yet
@ -146,7 +146,11 @@ public class DialerActivity extends SoftVolumeActivity implements LinphoneGuiLis
checkIfOutgoingCallIntentReceived();
if (LinphoneService.isReady()) {
instance = this;
}
@Override
protected void onLinphoneManagerAvailable(LinphoneManager m) {
LinphoneCore lc = LinphoneManager.getLc();
if (lc.isIncall()) {
if(lc.isInComingInvitePending()) {
@ -156,9 +160,6 @@ public class DialerActivity extends SoftVolumeActivity implements LinphoneGuiLis
}
}
}
instance = this;
}
@ -268,7 +269,7 @@ public class DialerActivity extends SoftVolumeActivity implements LinphoneGuiLis
private void exitCallMode() {
// Remove dialog if existing
try {
dismissDialog(INCOMING_CALL_DIALOG_ID);
dismissDialog(incomingCallDialogId);
} catch (Throwable e) {/* Exception if never created */}
if (useIncallActivity) {
@ -301,19 +302,23 @@ public class DialerActivity extends SoftVolumeActivity implements LinphoneGuiLis
private void callPending(final LinphoneCall call) {
showDialog(INCOMING_CALL_DIALOG_ID);
showDialog(incomingCallDialogId);
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
if (id == incomingCallDialogId) {
String from = LinphoneManager.getInstance().extractIncomingRemoteName();
String msg = String.format(getString(R.string.incoming_call_dialog_title), from);
((AlertDialog) dialog).setMessage(msg);
} else {
super.onPrepareDialog(id, dialog);
}
}
@Override
protected Dialog onCreateDialog(int id) {
if (id == incomingCallDialogId) {
View incomingCallView = getLayoutInflater().inflate(R.layout.incoming_call, null);
final Dialog dialog = new AlertDialog.Builder(this)
@ -343,6 +348,9 @@ public class DialerActivity extends SoftVolumeActivity implements LinphoneGuiLis
});
return dialog;
} else {
return super.onCreateDialog(id);
}
}

View file

@ -0,0 +1,103 @@
/*
LinphoneManagerWaitActivity.java
Copyright (C) 2011 Belledonne Communications, Grenoble, France
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 2
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.linphone;
import org.linphone.core.Log;
import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
/**
* Activity requiring access to LinphoneManager should inherit from this class.
*
* @author Guillaume Beraudo
*
*/
public abstract class LinphoneManagerWaitActivity extends SoftVolumeActivity {
private final int waitServiceDialogId = 314159265;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (LinphoneService.isReady()) {
onLinphoneManagerAvailable(LinphoneManager.getInstance());
} else {
showDialog(waitServiceDialogId);
thread = new ServiceWaitThread();
thread.start();
}
}
private ServiceWaitThread thread;
@Override
protected void onDestroy() {
if (thread != null) thread.interrupt();
super.onDestroy();
}
@Override
protected Dialog onCreateDialog(int id) {
if (id == waitServiceDialogId) {
View v = getLayoutInflater().inflate((R.layout.wait_service_dialog), null);
return new AlertDialog.Builder(this).setView(v).setCancelable(false).create();
}
return super.onCreateDialog(id);
}
protected abstract void onLinphoneManagerAvailable(LinphoneManager m);
private void dismissDialogFromThread(final int id) {
mHandler.post(new Runnable() {
@Override
public void run() {
try {
dismissDialog(id);
} catch (Throwable e) {
// Discarding exception which may be thrown if the dialog wasn't showing.
}
}
});
}
private class ServiceWaitThread extends Thread {
@Override
public void run() {
while (!LinphoneService.isReady()) {
try {
sleep(30);
} catch (InterruptedException e) {
Log.e("waiting thread sleep() has been interrupted, exiting as requested");
dismissDialogFromThread(waitServiceDialogId); // FIXME, may not be the best thing to do
return;
}
}
onLinphoneManagerAvailable(LinphoneManager.getInstance());
dismissDialogFromThread(waitServiceDialogId);
super.run();
}
}
}

View file

@ -99,7 +99,6 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
@Override
public void onCreate() {
super.onCreate();
instance = this;
// In case restart after a crash. Main in LinphoneActivity
LinphonePreferenceManager.getInstance(this);
@ -127,6 +126,7 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
LinphoneManager.createAndStart(this, this);
instance = this; // instance is ready once linphone manager has been created
}

View file

@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.linphone;
import org.linphone.core.Log;
import org.linphone.mediastream.video.capture.hwconf.Hacks;
import android.app.Activity;
@ -35,9 +36,12 @@ public class SoftVolumeActivity extends Activity {
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)
&& (Hacks.needSoftvolume() || LinphonePreferenceManager.getInstance().useSoftvolume())) {
&& (Hacks.needSoftvolume() || LinphonePreferenceManager.getInstance(this).useSoftvolume())) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
if (!LinphoneService.isReady()) {
Log.i("Couldn't change softvolume has service is not running");
return true;
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
LinphoneManager.getInstance().adjustSoftwareVolume(1);
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
LinphoneManager.getInstance().adjustSoftwareVolume(-1);