From ff81ad9a30b381f3a7b88c7f6f30888739b8664d Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Fri, 25 Nov 2011 15:44:10 +0100 Subject: [PATCH] After a crash, finish some autostarting activities. - auto restart of activities when service crash spotted on Samsung devices; - only some activities supported: incall, conference, linphoneactivity. --- src/org/linphone/AbstractCalleesActivity.java | 10 ++++++++++ src/org/linphone/CallManager.java | 3 ++- src/org/linphone/ConferenceDetailsActivity.java | 1 + src/org/linphone/IncallActivity.java | 1 + src/org/linphone/LinphoneActivity.java | 14 ++++++++++++-- src/org/linphone/VideoCallActivity.java | 7 ++++++- 6 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/org/linphone/AbstractCalleesActivity.java b/src/org/linphone/AbstractCalleesActivity.java index abf16eafd..8333d7f7e 100644 --- a/src/org/linphone/AbstractCalleesActivity.java +++ b/src/org/linphone/AbstractCalleesActivity.java @@ -28,6 +28,7 @@ import org.linphone.LinphoneSimpleListener.LinphoneOnCallStateChangedListener; import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneCall; import org.linphone.core.LinphoneCore; +import org.linphone.core.Log; import org.linphone.core.LinphoneCall.State; import android.app.ListActivity; @@ -82,6 +83,15 @@ public abstract class AbstractCalleesActivity extends ListActivity implements Li protected abstract CalleeListAdapter createCalleeListAdapter(); + protected final boolean finishIfAutoRestartAfterACrash() { + if (!LinphoneManager.isInstanciated() || LinphoneManager.getLc().getCallsNb() == 0) { + Log.e("No service running: avoid crash by finishing ", this.getClass().getName()); + finish(); + return true; + } + return false; + } + @Override protected void onResume() { mSpecificCalls = updateSpecificCallsList(); diff --git a/src/org/linphone/CallManager.java b/src/org/linphone/CallManager.java index 72badf20f..8b2cf7a0c 100644 --- a/src/org/linphone/CallManager.java +++ b/src/org/linphone/CallManager.java @@ -87,12 +87,13 @@ public class CallManager { // Check if video possible regarding bandwidth limitations bm().updateWithProfileSettings(lc, params); + + // Abort if not enough bandwidth... if (!params.getVideoEnabled()) { return false; } // Not yet in video call: try to re-invite with video - params.setVideoEnabled(true); lc.updateCall(lCall, params); return true; } diff --git a/src/org/linphone/ConferenceDetailsActivity.java b/src/org/linphone/ConferenceDetailsActivity.java index bef4706d5..146a79cbd 100644 --- a/src/org/linphone/ConferenceDetailsActivity.java +++ b/src/org/linphone/ConferenceDetailsActivity.java @@ -47,6 +47,7 @@ public class ConferenceDetailsActivity extends AbstractCalleesActivity { @Override protected void onCreate(Bundle savedInstanceState) { + if (finishIfAutoRestartAfterACrash()) return; setContentView(R.layout.conference_details_layout); super.onCreate(savedInstanceState); } diff --git a/src/org/linphone/IncallActivity.java b/src/org/linphone/IncallActivity.java index 1ad15acef..76498067c 100644 --- a/src/org/linphone/IncallActivity.java +++ b/src/org/linphone/IncallActivity.java @@ -89,6 +89,7 @@ public class IncallActivity extends AbstractCalleesActivity implements @Override protected void onCreate(Bundle savedInstanceState) { + if (finishIfAutoRestartAfterACrash()) return; setContentView(R.layout.incall_layout); mAllowTransfers = getResources().getBoolean(R.bool.allow_transfers); diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 804126579..024531e2b 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -95,6 +95,11 @@ public class LinphoneActivity extends TabActivity implements } public void onCreate(Bundle savedInstanceState) { + if (!LinphoneManager.isInstanciated()) { + Log.e("No service running: avoid crash by finishing ", this.getClass().getName()); + finish(); + return; + } instance = this; super.onCreate(savedInstanceState); setContentView(R.layout.main); @@ -424,15 +429,20 @@ public class LinphoneActivity extends TabActivity implements // Do not call if video activity already launched as it would cause a pause() of the launched one // and a race condition with capture surfaceview leading to a crash public void startVideoActivity(final LinphoneCall call, int delay) { - if (VideoCallActivity.launched || call == null) return; + if (VideoCallActivity.launched || call == null) { + return; + } + mHandler.postDelayed(new Runnable() { public void run() { - LinphoneManager.getInstance().enableCamera(call, true); if (VideoCallActivity.launched) return; + LinphoneManager.getInstance().enableCamera(call, true); startActivityForResult(new Intent().setClass( LinphoneActivity.this, VideoCallActivity.class), video_activity); + // Avoid two consecutive runs to enter the previous block + VideoCallActivity.launched = true; } }, delay); LinphoneManager.getInstance().routeAudioToSpeaker(); diff --git a/src/org/linphone/VideoCallActivity.java b/src/org/linphone/VideoCallActivity.java index 831bb3156..851b074f3 100755 --- a/src/org/linphone/VideoCallActivity.java +++ b/src/org/linphone/VideoCallActivity.java @@ -59,7 +59,12 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh AndroidVideoWindowImpl androidVideoWindowImpl; private Runnable mCallQualityUpdater; - public void onCreate(Bundle savedInstanceState) { + public void onCreate(Bundle savedInstanceState) { + if (!LinphoneManager.isInstanciated() || LinphoneManager.getLc().getCallsNb() == 0) { + Log.e("No service running: avoid crash by finishing ", this.getClass().getName()); + finish(); + return; + } Log.d("onCreate VideoCallActivity"); super.onCreate(savedInstanceState); setContentView(R.layout.videocall);