diff --git a/res/layout/wait_service_dialog.xml b/res/layout/wait_service_dialog.xml index e69c00152..ec09488c1 100644 --- a/res/layout/wait_service_dialog.xml +++ b/res/layout/wait_service_dialog.xml @@ -4,5 +4,5 @@ android:layout_width="fill_parent" android:layout_height="fill_parent"> - + diff --git a/res/raw/linphonerc b/res/raw/linphonerc index 06e1169bd..a1459867b 100644 --- a/res/raw/linphonerc +++ b/res/raw/linphonerc @@ -18,7 +18,7 @@ default_proxy=0 auto_net_state_mon=0 keepalive_period=30000 auto_answer_replacing_calls=1 -media_encryption=none +media_encryption=zrtp media_encryption_mandatory=0 [rtp] diff --git a/res/values/custom.xml b/res/values/custom.xml index 0b975b0c4..ae8368152 100644 --- a/res/values/custom.xml +++ b/res/values/custom.xml @@ -4,6 +4,7 @@ Linphone Linphone + Starting up Registered to %s Fails to register to %s Linphone %s SIP (rfc 3261) compatible phone under GNU Public License V2\n http://www.linphone.org\n\nInstructions\nhttp://www.linphone.org/m/help\n\n© 2011 Belledonne Communications diff --git a/src/org/linphone/DialerActivity.java b/src/org/linphone/DialerActivity.java index 5ab508b5a..4974b1076 100644 --- a/src/org/linphone/DialerActivity.java +++ b/src/org/linphone/DialerActivity.java @@ -19,7 +19,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package org.linphone; import org.linphone.LinphoneManager.NewOutgoingCallUiListener; -import org.linphone.LinphoneManagerWaitHelper.LinphoneManagerReadyListener; import org.linphone.LinphoneService.LinphoneGuiListener; import org.linphone.core.LinphoneCall; import org.linphone.core.Log; @@ -30,7 +29,6 @@ import org.linphone.ui.CallButton; import org.linphone.ui.EraseButton; import android.app.Activity; -import android.app.Dialog; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -51,7 +49,7 @@ import android.widget.Toast; * * */ -public class DialerActivity extends Activity implements LinphoneGuiListener, LinphoneManagerReadyListener, NewOutgoingCallUiListener { +public class DialerActivity extends Activity implements LinphoneGuiListener, NewOutgoingCallUiListener { private TextView mStatus; private Handler mHandler; @@ -71,7 +69,6 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin return instance; } - private LinphoneManagerWaitHelper waitHelper; public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.dialer); @@ -96,8 +93,6 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin checkIfOutgoingCallIntentReceived(); - waitHelper = new LinphoneManagerWaitHelper(this, this); - waitHelper.doManagerDependentOnCreate(); instance = this; super.onCreate(savedInstanceState); } @@ -153,22 +148,11 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin super.onDestroy(); instance=null; } - - - - @Override - protected Dialog onCreateDialog(int id) { - if (id == LinphoneManagerWaitHelper.DIALOG_ID) { - return waitHelper.createWaitDialog(); - } else { - return super.onCreateDialog(id); - } - } - - + + public void newOutgoingCall(Intent intent) { if (Intent.ACTION_CALL.equalsIgnoreCase(intent.getAction())) { mAddress.setText(intent.getData().getSchemeSpecificPart()); @@ -241,12 +225,9 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin // done in incall view } - @Override - public void onCreateWhenManagerReady() {} - - @Override - public void onResumeWhenManagerReady() { + @Override + protected void onResume() { // When coming back from a video call, if the phone orientation is different // Android will destroy the previous Dialer and create a new one. // Unfortunately the "call end" status event is received in the meanwhile @@ -267,11 +248,6 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin }; mHandler.postDelayed(r, 1000); } - } - - @Override - protected void onResume() { - waitHelper.doManagerDependentOnResume(); super.onResume(); } diff --git a/src/org/linphone/IncallActivity.java b/src/org/linphone/IncallActivity.java index 921a3469e..853b6f5d0 100644 --- a/src/org/linphone/IncallActivity.java +++ b/src/org/linphone/IncallActivity.java @@ -26,7 +26,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; -import org.linphone.LinphoneManagerWaitHelper.LinphoneManagerReadyListener; import org.linphone.LinphoneSimpleListener.LinphoneOnAudioChangedListener; import org.linphone.LinphoneSimpleListener.LinphoneOnCallEncryptionChangedListener; import org.linphone.LinphoneSimpleListener.LinphoneOnCallStateChangedListener; @@ -66,7 +65,6 @@ import android.widget.ToggleButton; * @author Guillaume Beraudo */ public class IncallActivity extends ListActivity implements - LinphoneManagerReadyListener, LinphoneOnAudioChangedListener, LinphoneOnCallStateChangedListener, LinphoneOnCallEncryptionChangedListener, @@ -110,7 +108,6 @@ public class IncallActivity extends ListActivity implements lc().leaveConference(); } - private LinphoneManagerWaitHelper waitHelper; private ToggleButton mMuteMicButton; private ToggleButton mSpeakerButton; private int multipleCallsLimit; @@ -142,40 +139,14 @@ public class IncallActivity extends ListActivity implements mSpeakerButton = (ToggleButton) findViewById(R.id.toggleSpeaker); mSpeakerButton.setOnClickListener(this); - waitHelper = new LinphoneManagerWaitHelper(this, this); - waitHelper.doManagerDependentOnCreate(); - -// workaroundStatusBarBug(); - super.onCreate(savedInstanceState); - } - - @Override - public void onCreateWhenManagerReady() { List calls = getInitialCalls(); setListAdapter(new CalleeListAdapter(calls)); findViewById(R.id.incallHang).setOnClickListener(this); multipleCallsLimit = lc().getMaxCalls(); - } - @Override - public void onResumeWhenManagerReady() { - registerLinphoneListener(true); - updateCalleeImage(); - updateConfState(); - updateSimpleControlButtons(); - updateSoundLock(); - updateDtmfButton(); - CalleeListAdapter adapter = (CalleeListAdapter) getListAdapter(); - if (adapter.linphoneCalls.size() != lc().getCallsNb()) { - adapter.linphoneCalls.clear(); - adapter.linphoneCalls.addAll(getInitialCalls()); - } - recreateActivity(adapter); - LinphoneManager.startProximitySensorForActivity(this); - mSpeakerButton.setChecked(LinphoneManager.getInstance().isSpeakerOn()); - mMuteMicButton.setChecked(LinphoneManager.getLc().isMicMuted()); - updateAddCallButton(); +// workaroundStatusBarBug(); + super.onCreate(savedInstanceState); } private void updateSoundLock() { @@ -216,7 +187,23 @@ public class IncallActivity extends ListActivity implements @Override protected void onResume() { active=true; - waitHelper.doManagerDependentOnResume(); + registerLinphoneListener(true); + updateCalleeImage(); + updateConfState(); + updateSimpleControlButtons(); + updateSoundLock(); + updateDtmfButton(); + CalleeListAdapter adapter = (CalleeListAdapter) getListAdapter(); + if (adapter.linphoneCalls.size() != lc().getCallsNb()) { + adapter.linphoneCalls.clear(); + adapter.linphoneCalls.addAll(getInitialCalls()); + } + recreateActivity(adapter); + LinphoneManager.startProximitySensorForActivity(this); + mSpeakerButton.setChecked(LinphoneManager.getInstance().isSpeakerOn()); + mMuteMicButton.setChecked(LinphoneManager.getLc().isMicMuted()); + + updateAddCallButton(); super.onResume(); } @@ -250,10 +237,6 @@ public class IncallActivity extends ListActivity implements } @Override protected Dialog onCreateDialog(final int id) { - if (id == LinphoneManagerWaitHelper.DIALOG_ID) { - return waitHelper.createWaitDialog(); - } - switch (id) { case numpad_dialog_id: Numpad numpad = new Numpad(this, true); diff --git a/src/org/linphone/IncomingCallActivity.java b/src/org/linphone/IncomingCallActivity.java index 6cb8f5609..eaf25f8c0 100644 --- a/src/org/linphone/IncomingCallActivity.java +++ b/src/org/linphone/IncomingCallActivity.java @@ -20,7 +20,6 @@ package org.linphone; import java.util.List; -import org.linphone.LinphoneManagerWaitHelper.LinphoneManagerReadyListener; import org.linphone.LinphoneSimpleListener.LinphoneOnCallStateChangedListener; import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneCall; @@ -45,13 +44,12 @@ import android.widget.Toast; * * @author Guillaume Beraudo */ -public class IncomingCallActivity extends Activity implements LinphoneManagerReadyListener, LinphoneOnCallStateChangedListener, OnTriggerListener { +public class IncomingCallActivity extends Activity implements LinphoneOnCallStateChangedListener, OnTriggerListener { private TextView mNameView; private TextView mNumberView; private ImageView mPictureView; private LinphoneCall mCall; - private LinphoneManagerWaitHelper mHelper; private SlidingTab mIncomingCallWidget; @Override @@ -79,15 +77,12 @@ public class IncomingCallActivity extends Activity implements LinphoneManagerRea mIncomingCallWidget.setOnTriggerListener(this); - mHelper = new LinphoneManagerWaitHelper(this, this); super.onCreate(savedInstanceState); } @Override - public void onCreateWhenManagerReady() {} - - @Override - public void onResumeWhenManagerReady() { + protected void onResume() { + super.onResume(); LinphoneManager.addListener(this); // Only one call ringing at a time is allowed List calls = LinphoneUtils.getLinphoneCalls(LinphoneManager.getLc()); @@ -115,12 +110,6 @@ public class IncomingCallActivity extends Activity implements LinphoneManagerRea mNumberView.setText(address.getUserName()); } } - - @Override - protected void onResume() { - super.onResume(); - mHelper.doManagerDependentOnResume(); - } @Override protected void onPause() { diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 54495e3d8..6b025fc29 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -22,7 +22,6 @@ package org.linphone; import static android.content.Intent.ACTION_MAIN; import org.linphone.LinphoneManager.EcCalibrationListener; -import org.linphone.LinphoneManagerWaitHelper.LinphoneManagerReadyListener; import org.linphone.LinphoneSimpleListener.LinphoneOnCallStateChangedListener; import org.linphone.core.CallDirection; import org.linphone.core.LinphoneCall; @@ -57,6 +56,7 @@ import android.text.Html; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.View; import android.widget.TabWidget; import android.widget.TextView; import android.widget.Toast; @@ -66,7 +66,6 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener , ContactPicked , LinphoneOnCallStateChangedListener - , LinphoneManagerReadyListener { public static final String DIALER_TAB = "dialer"; public static final String PREF_FIRST_LAUNCH = "pref_first_launch"; @@ -83,16 +82,17 @@ public class LinphoneActivity extends TabActivity implements private SensorManager mSensorManager; private Sensor mAccelerometer; private int previousRotation = -1; - + private Handler mHandler = new Handler(); - - + + private static final int waitDialogId = 1; + private ServiceWaitThread thread; + // Customization private static boolean useFirstLoginActivity; private static boolean useMenuSettings; private static boolean useMenuAbout; private boolean checkAccount; - private LinphoneManagerWaitHelper waitHelper; static final boolean isInstanciated() { return instance != null; @@ -106,8 +106,9 @@ public class LinphoneActivity extends TabActivity implements @Override protected Dialog onCreateDialog(final int id) { - if (id == LinphoneManagerWaitHelper.DIALOG_ID) { - return waitHelper.createWaitDialog(); + if (id == waitDialogId) { + View v = getLayoutInflater().inflate((R.layout.wait_service_dialog), null); + return new AlertDialog.Builder(this).setView(v).setCancelable(false).create(); } return super.onCreateDialog(id); } @@ -123,36 +124,19 @@ public class LinphoneActivity extends TabActivity implements useMenuAbout = getResources().getBoolean(R.bool.useMenuAbout); checkAccount = !useFirstLoginActivity; - // start linphone as background - startService(new Intent(ACTION_MAIN).setClass(this, LinphoneService.class)); - - - mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); - SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); - - if (!useFirstLoginActivity || pref.getBoolean(getString(R.string.first_launch_suceeded_once_key), false)) { - fillTabHost(); - } else { - startActivityForResult(new Intent().setClass(this, FirstLoginActivity.class), FIRST_LOGIN_ACTIVITY); - } - - if (checkAccount && !useFirstLoginActivity) { - if (pref.getBoolean(PREF_FIRST_LAUNCH, true)) { - onFirstLaunch(); - } else if (!pref.getBoolean(PREF_CHECK_CONFIG, false) - && !checkDefined(pref, R.string.pref_username_key, R.string.pref_domain_key)) { - onBadSettings(pref); - } else { - checkAccount = false; - } - } - PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE,Log.TAG+"#"+getClass().getName()); - LinphoneManager.addListener(this); - waitHelper = new LinphoneManagerWaitHelper(this, this); - waitHelper.doManagerDependentOnCreate(); + if (LinphoneService.isReady()) { + onCreateWhenServiceReady(); + } else { + if (thread != null) { + throw new RuntimeException("already waiting for Manager"); + } + // start linphone as background + startService(new Intent(ACTION_MAIN).setClass(this, LinphoneService.class)); + startWaitingThreadIfNotRunning(); + } } @@ -259,9 +243,9 @@ public class LinphoneActivity extends TabActivity implements @Override protected void onPause() { super.onPause(); + doResumeWhenServiceReady = false; if (isFinishing()) { //restore audio settings - boolean isUserRequest = false; LinphoneManager.removeListener(this); LinphoneManager.stopProximitySensorForActivity(this); instance = null; @@ -273,7 +257,6 @@ public class LinphoneActivity extends TabActivity implements // Inflate the currently selected menu XML resource. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.linphone_activity_menu, menu); - menu.findItem(R.id.menu_settings).setVisible(useMenuSettings); menu.findItem(R.id.menu_about).setVisible(useMenuAbout); return true; @@ -563,9 +546,6 @@ public class LinphoneActivity extends TabActivity implements }); } - @Override - public void onCreateWhenManagerReady() {} - private void enterIncallMode() { LinphoneManager.startProximitySensorForActivity(this); if (!mWakeLock.isHeld()) mWakeLock.acquire(); @@ -587,7 +567,44 @@ public class LinphoneActivity extends TabActivity implements @Override - public void onResumeWhenManagerReady() { + protected void onDestroy() { + if (mWakeLock.isHeld()) mWakeLock.release(); + + super.onDestroy(); + } + + + @Override + protected void onResume() { + super.onResume(); + + if (LinphoneService.isReady()) { + onResumeWhenServiceReady(); + doResumeWhenServiceReady=false; + } else { + doResumeWhenServiceReady = true; + startWaitingThreadIfNotRunning(); + } + } + + private void startWaitingThreadIfNotRunning() { + if (thread == null) { + thread = new ServiceWaitThread(); + thread.start(); + + // Delay to avoid flicker + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + if (!LinphoneService.isReady()) { + showDialog(waitDialogId); + } + } + }, 2000); + } + } + + private void onResumeWhenServiceReady() { LinphoneCall pendingCall = LinphoneManager.getInstance().getPendingIncomingCall(); if (pendingCall != null) { LinphoneActivity.instance().startIncomingCallActivity(pendingCall); @@ -600,19 +617,71 @@ public class LinphoneActivity extends TabActivity implements // removing is done directly in LinphoneActivity.onPause() } } - - @Override - protected void onDestroy() { - if (mWakeLock.isHeld()) mWakeLock.release(); - super.onDestroy(); + + + private synchronized void onCreateWhenServiceReady() { + mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); + SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); + + if (!useFirstLoginActivity || pref.getBoolean(getString(R.string.first_launch_suceeded_once_key), false)) { + fillTabHost(); + } else { + startActivityForResult(new Intent().setClass(this, FirstLoginActivity.class), FIRST_LOGIN_ACTIVITY); + } + + if (checkAccount && !useFirstLoginActivity) { + if (pref.getBoolean(PREF_FIRST_LAUNCH, true)) { + onFirstLaunch(); + } else if (!pref.getBoolean(PREF_CHECK_CONFIG, false) + && !checkDefined(pref, R.string.pref_username_key, R.string.pref_domain_key)) { + onBadSettings(pref); + } else { + checkAccount = false; + } + } + + LinphoneManager.addListener(this); } - - @Override - protected void onResume() { - waitHelper.doManagerDependentOnResume(); - super.onResume(); + + private boolean doResumeWhenServiceReady; + + private class ServiceWaitThread extends Thread { + public void run() { + while (!LinphoneService.isReady()) { + try { + sleep(30); + } catch (InterruptedException e) { + throw new RuntimeException("waiting thread sleep() has been interrupted"); + } + } + + mHandler.post(new Runnable() { + @Override + public void run() { + try { + dismissDialog(waitDialogId); + } catch (Throwable e) { + // Discarding exception which may be thrown if the dialog wasn't showing. + } + } + }); + + mHandler.post(new Runnable() { + @Override + public void run() { + onCreateWhenServiceReady(); + if (doResumeWhenServiceReady) { + onResumeWhenServiceReady(); + } + } + }); + thread = null; + } } + + + } interface ContactPicked { diff --git a/src/org/linphone/LinphoneManagerWaitHelper.java b/src/org/linphone/LinphoneManagerWaitHelper.java deleted file mode 100644 index 107a520c3..000000000 --- a/src/org/linphone/LinphoneManagerWaitHelper.java +++ /dev/null @@ -1,154 +0,0 @@ -/* -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.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.os.Handler; -import android.view.View; - -/** - * Activity requiring access to LinphoneManager should use this helper class. - * - * @author Guillaume Beraudo - * - */ -public final class LinphoneManagerWaitHelper { - - public static final int DIALOG_ID = 314159265; - private Handler mHandler = new Handler(); - private LinphoneManagerReadyListener listener; - private Activity activity; - private boolean dialogIsShowing; - private boolean notifyOnCreate; - private boolean notifyOnResume; - static boolean disabled; - - public LinphoneManagerWaitHelper(Activity activity, LinphoneManagerReadyListener listener) { - this.listener = listener; - this.activity = activity; - } - - private ServiceWaitThread thread; - - public Dialog createWaitDialog() { - View v = activity.getLayoutInflater().inflate((R.layout.wait_service_dialog), null); - return new AlertDialog.Builder(activity).setView(v).setCancelable(false).create(); - } - - - public synchronized void doManagerDependentOnCreate() { - if (disabled || LinphoneService.isReady()) { - listener.onCreateWhenManagerReady(); - return; - } - if (thread != null) { - throw new RuntimeException("already waiting for Manager"); - } - - notifyOnCreate = true; - - thread = new ServiceWaitThread(); - thread.start(); - - if (!dialogIsShowing) { - activity.showDialog(LinphoneManagerWaitHelper.DIALOG_ID); - } - } - - public synchronized void doManagerDependentOnResume() { - if (disabled || LinphoneService.isReady()) { - listener.onResumeWhenManagerReady(); - return; - } - notifyOnResume = true; - if (thread == null) { - thread = new ServiceWaitThread(); - thread.start(); - } - if (!dialogIsShowing) { - activity.showDialog(LinphoneManagerWaitHelper.DIALOG_ID); - } - } - - private void dismissDialogFromThread(final int id) { - mHandler.post(new Runnable() { - @Override - public void run() { - try { - activity.dismissDialog(id); - } catch (Throwable e) { - // Discarding exception which may be thrown if the dialog wasn't showing. - } - } - }); - } - - private class ServiceWaitThread extends Thread { - private void onCreateWhenManagerReady() { - mHandler.post(new Runnable() { - @Override - public void run() { - listener.onCreateWhenManagerReady(); - } - }); - } - private void onResumeWhenManagerReady() { - mHandler.post(new Runnable() { - @Override - public void run() { - listener.onResumeWhenManagerReady(); - } - }); - } - @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(DIALOG_ID); // FIXME, may not be the best thing to do - thread = null; - return; - } - } - if (notifyOnCreate) { - onCreateWhenManagerReady(); - notifyOnCreate=false; - } - if (notifyOnResume) { - onResumeWhenManagerReady(); - notifyOnResume=false; - } - thread = null; - dismissDialogFromThread(DIALOG_ID); - super.run(); - } - } - - public interface LinphoneManagerReadyListener { - void onCreateWhenManagerReady(); - void onResumeWhenManagerReady(); - } - -} diff --git a/test/org/linphone/TestConferenceActivity.java b/test/org/linphone/TestConferenceActivity.java index a8bd25759..77fe7a936 100644 --- a/test/org/linphone/TestConferenceActivity.java +++ b/test/org/linphone/TestConferenceActivity.java @@ -94,7 +94,6 @@ public class TestConferenceActivity extends IncallActivity { @Override protected void onCreate(Bundle savedInstanceState) { - LinphoneManagerWaitHelper.disabled=true; //if (!serviceStarted) startService(new Intent(ACTION_MAIN).setClass(this, LinphoneService.class)); findViewById(R.id.toggleMuteMic).setOnClickListener(null);