diff --git a/res/values/strings.xml b/res/values/strings.xml index 21c7a1d97..a30eaff15 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7,7 +7,7 @@ UDP TCP TLS - Don\'t use random ports + Use standard ports At least one item is required diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index fa8df8cbc..5572b6246 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -44,23 +44,25 @@ - + + + android:title="@string/pref_codec_speex16"/> + android:title="@string/pref_codec_speex8"/> + android:title="@string/pref_codec_ilbc" + android:shouldDisableView="true" + android:summary="@string/pref_ilbc_summary"/> + android:title="@string/pref_codec_gsm"/> + android:title="@string/pref_codec_pcmu"/> + android:title="@string/pref_codec_pcma"/> @@ -118,7 +120,8 @@ android:title="@string/pref_transport_udp" android:defaultValue="true"/> - + + diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 1c3c4cc93..75dd15244 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -55,6 +55,7 @@ import android.view.View; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.TabHost; +import android.widget.TabWidget; import android.widget.TextView; import android.widget.Toast; @@ -86,7 +87,9 @@ public class LinphoneActivity extends TabActivity { private boolean checkAccount; - + static final boolean isInstanciated() { + return instance != null; + } static final LinphoneActivity instance() { if (instance != null) return instance; @@ -148,7 +151,7 @@ public class LinphoneActivity extends TabActivity { if (requestCode == FIRST_LOGIN_ACTIVITY) { if (resultCode == RESULT_OK) { Toast.makeText(this, getString(R.string.ec_calibration_launch_message), Toast.LENGTH_LONG).show(); - + LinphoneManager.getInstance().initializePayloads(); try { LinphoneManager.getInstance().startEcCalibration(new EcCalibrationListener() { public void onEcCalibrationStatus(EcCalibratorStatus status, int delayMs) { @@ -173,7 +176,9 @@ public class LinphoneActivity extends TabActivity { } - private void fillTabHost() { + private synchronized void fillTabHost() { + if (((TabWidget) findViewById(android.R.id.tabs)).getChildCount() != 0) return; + TabHost lTabHost = getTabHost(); // The activity TabHost TabHost.TabSpec spec; // Reusable TabSpec for each tab Drawable tabDrawable; // Drawable for a tab @@ -343,9 +348,7 @@ public class LinphoneActivity extends TabActivity { .setCancelable(false) .setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - Intent intent = new Intent(ACTION_MAIN); - intent.setClass(getApplicationContext(), LinphonePreferencesActivity.class); - startActivity(intent); + startprefActivity(); } }) .setNegativeButton(getString(R.string.no), new DialogInterface.OnClickListener() { @@ -390,7 +393,8 @@ public class LinphoneActivity extends TabActivity { .setCancelable(false) .setPositiveButton(getString(R.string.cont), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - LinphoneActivity.instance().startprefActivity(); + LinphoneManager.getInstance().initializePayloads(); + startprefActivity(); checkAccount = false; } }); @@ -410,7 +414,7 @@ public class LinphoneActivity extends TabActivity { .setCancelable(false) .setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - LinphoneActivity.instance().startprefActivity(); + startprefActivity(); checkAccount = false; } }).setNeutralButton(getString(R.string.no), new DialogInterface.OnClickListener() { diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 6624dc121..e41c617f7 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -18,8 +18,21 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone; -import static android.media.AudioManager.*; -import static org.linphone.core.LinphoneCall.State.*; +import static android.media.AudioManager.MODE_IN_CALL; +import static android.media.AudioManager.MODE_NORMAL; +import static android.media.AudioManager.MODE_RINGTONE; +import static android.media.AudioManager.ROUTE_SPEAKER; +import static android.media.AudioManager.STREAM_RING; +import static android.media.AudioManager.STREAM_VOICE_CALL; +import static android.media.AudioManager.VIBRATE_TYPE_RINGER; +import static org.linphone.R.string.pref_codec_ilbc_key; +import static org.linphone.R.string.pref_codec_speex16_key; +import static org.linphone.R.string.pref_codec_speex32_key; +import static org.linphone.R.string.pref_echo_cancellation_key; +import static org.linphone.core.LinphoneCall.State.CallEnd; +import static org.linphone.core.LinphoneCall.State.Error; +import static org.linphone.core.LinphoneCall.State.IncomingReceived; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -39,6 +52,7 @@ import org.linphone.core.LinphoneCoreListener; import org.linphone.core.LinphoneFriend; import org.linphone.core.LinphoneProxyConfig; import org.linphone.core.PayloadType; +import org.linphone.core.Version; import org.linphone.core.LinphoneCall.State; import org.linphone.core.LinphoneCore.EcCalibratorStatus; import org.linphone.core.LinphoneCore.FirewallPolicy; @@ -53,6 +67,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; import android.content.res.Resources; import android.hardware.Camera; import android.media.AudioManager; @@ -98,6 +113,12 @@ public final class LinphoneManager implements LinphoneCoreListener { private LinphoneManager(final Context c) { + String basePath = c.getFilesDir().getAbsolutePath(); + linphoneInitialConfigFile = basePath + "/linphonerc"; + linphoneConfigFile = basePath + "/.linphonerc"; + ringSoundFile = basePath + "/oldphone_mono.wav"; + ringbackSoundFile = basePath + "/ringback.wav"; + mAudioManager = ((AudioManager) c.getSystemService(Context.AUDIO_SERVICE)); mVibrator = (Vibrator) c.getSystemService(Context.VIBRATOR_SERVICE); mPref = PreferenceManager.getDefaultSharedPreferences(c); @@ -135,10 +156,10 @@ public final class LinphoneManager implements LinphoneCoreListener { public static final String TAG="Linphone"; /** Called when the activity is first created. */ - private static final String LINPHONE_FACTORY_RC = "/data/data/org.linphone/files/linphonerc"; - private static final String LINPHONE_RC = "/data/data/org.linphone/files/.linphonerc"; - private static final String RING_SND = "/data/data/org.linphone/files/oldphone_mono.wav"; - private static final String RINGBACK_SND = "/data/data/org.linphone/files/ringback.wav"; + private final String linphoneInitialConfigFile; + private final String linphoneConfigFile; + private final String ringSoundFile; + private final String ringbackSoundFile; private Timer mTimer = new Timer("Linphone scheduler"); @@ -306,7 +327,7 @@ public final class LinphoneManager implements LinphoneCoreListener { copyAssetsFromPackage(context); mLc = LinphoneCoreFactory.instance().createLinphoneCore( - this, LINPHONE_RC, LINPHONE_FACTORY_RC, null); + this, linphoneConfigFile, linphoneInitialConfigFile, null); mLc.setPlaybackGain(3); mLc.setRing(null); @@ -335,9 +356,9 @@ public final class LinphoneManager implements LinphoneCoreListener { } private void copyAssetsFromPackage(Context context) throws IOException { - copyIfNotExist(context, R.raw.oldphone_mono,RING_SND); - copyIfNotExist(context, R.raw.ringback,RINGBACK_SND); - copyFromPackage(context, R.raw.linphonerc, new File(LINPHONE_FACTORY_RC).getName()); + copyIfNotExist(context, R.raw.oldphone_mono,ringSoundFile); + copyIfNotExist(context, R.raw.ringback,ringbackSoundFile); + copyFromPackage(context, R.raw.linphonerc, new File(linphoneInitialConfigFile).getName()); } private void copyIfNotExist(Context context, int ressourceId,String target) throws IOException { File lFileToCopy = new File(target); @@ -761,4 +782,25 @@ public final class LinphoneManager implements LinphoneCoreListener { /* ops */ } } + + public void initializePayloads() { + Log.i(TAG, "Initializing supported payloads"); + Editor e = mPref.edit(); + boolean fastCpu = Version.isArmv7(); + + e.putBoolean(getString(pref_echo_cancellation_key), fastCpu); + + e.putBoolean(getString(R.string.pref_codec_gsm_key), true); + e.putBoolean(getString(R.string.pref_codec_pcma_key), true); + e.putBoolean(getString(R.string.pref_codec_pcmu_key), true); + e.putBoolean(getString(R.string.pref_codec_speex8_key), true); + e.putBoolean(getString(pref_codec_speex16_key), fastCpu); + e.putBoolean(getString(pref_codec_speex32_key), fastCpu); + + boolean ilbc = LinphoneService.isReady() && LinphoneManager.getLc() + .findPayloadType("iLBC", 8000)!=null; + e.putBoolean(getString(pref_codec_ilbc_key), ilbc); + + e.commit(); + } } diff --git a/src/org/linphone/LinphonePreferencesActivity.java b/src/org/linphone/LinphonePreferencesActivity.java index 6c9b3d8af..fe783fa4f 100644 --- a/src/org/linphone/LinphonePreferencesActivity.java +++ b/src/org/linphone/LinphonePreferencesActivity.java @@ -24,8 +24,6 @@ import static org.linphone.R.string.ec_calibrating; import static org.linphone.R.string.ec_calibration_launch_message; import static org.linphone.R.string.pref_codec_ilbc_key; import static org.linphone.R.string.pref_codec_speex16_key; -import static org.linphone.R.string.pref_codec_speex32_key; -import static org.linphone.R.string.pref_echo_cancellation_key; import static org.linphone.R.string.pref_echo_canceller_calibration_key; import static org.linphone.R.string.pref_video_enable_key; @@ -43,14 +41,12 @@ import android.os.Handler; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceActivity; -import android.preference.PreferenceScreen; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.util.Log; import android.widget.Toast; public class LinphonePreferencesActivity extends PreferenceActivity implements EcCalibrationListener { - private boolean mIsLowEndCpu = true; private Handler mHandler = new Handler(); private CheckBoxPreference ecPref; @@ -70,23 +66,6 @@ public class LinphonePreferencesActivity extends PreferenceActivity implements E addTransportChecboxesListener(); - - boolean enableIlbc=false; - if (LinphoneService.isReady()) { - // if not ilbc, we are on low end cpu. - enableIlbc = LinphoneManager.getLc().findPayloadType("iLBC", 8000)!=null?true:false; - mIsLowEndCpu=!enableIlbc; - if (!mIsLowEndCpu && !prefs().contains(getString(pref_echo_cancellation_key))) { - writeBoolean(pref_echo_cancellation_key, true); - } - if (mIsLowEndCpu) { - writeBoolean(pref_codec_ilbc_key, false); - writeBoolean(pref_codec_speex16_key, false); - writeBoolean(pref_codec_speex32_key, false); - } - - } - ecPref = (CheckBoxPreference) findPreference(pref_echo_canceller_calibration_key); ecPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { @@ -95,38 +74,37 @@ public class LinphonePreferencesActivity extends PreferenceActivity implements E } }); - - if (!mIsLowEndCpu) { - findPreference(pref_codec_ilbc_key).setEnabled(enableIlbc); - findPreference(pref_codec_speex16_key).setEnabled(enableIlbc); + boolean fastCpu = Version.isArmv7(); + if (fastCpu) { + boolean ilbc = LinphoneService.isReady() && LinphoneManager.getLc().findPayloadType("iLBC", 8000)!=null; + findPreference(pref_codec_ilbc_key).setEnabled(ilbc); + findPreference(pref_codec_speex16_key).setEnabled(true); //findPreference(pref_codec_speex32_key)).setEnabled(enableIlbc); } - // Force disable video - if (Version.sdkStrictlyBelow(5) || !enableIlbc || !LinphoneManager.getInstance().hasCamera()) { + // No video + if (Version.sdkStrictlyBelow(5) || !fastCpu || !LinphoneManager.getInstance().hasCamera()) { disableCheckbox(pref_video_enable_key); } if (prefs().getBoolean(LinphoneActivity.PREF_FIRST_LAUNCH,true)) { - if (!mIsLowEndCpu ) { + if (fastCpu) { Toast.makeText(this, getString(ec_calibration_launch_message), Toast.LENGTH_LONG).show(); startEcCalibration(); + } - } prefs().edit().putBoolean(LinphoneActivity.PREF_FIRST_LAUNCH, false).commit(); } + } + - } - - private List findTransportCb() { - return Arrays.asList( - findCheckbox(R.string.pref_transport_udp_key), - findCheckbox(R.string.pref_transport_tcp_key), - findCheckbox(R.string.pref_transport_tls_key)); - } - private void addTransportChecboxesListener() { - final List checkboxes = findTransportCb(); + final List checkboxes = Arrays.asList( + findCheckbox(R.string.pref_transport_udp_key) + ,findCheckbox(R.string.pref_transport_tcp_key) +// ,findCheckbox(R.string.pref_transport_tls_key) + ); + OnPreferenceChangeListener changedListener = new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { diff --git a/src/org/linphone/LinphoneService.java b/src/org/linphone/LinphoneService.java index c8f6ebad4..b1d5d6c96 100644 --- a/src/org/linphone/LinphoneService.java +++ b/src/org/linphone/LinphoneService.java @@ -201,7 +201,8 @@ public final class LinphoneService extends Service implements LinphoneServiceLis if (state == RegistrationState.RegistrationOk || state == RegistrationState.RegistrationFailed) { mHandler.post(new Runnable() { public void run() { - LinphoneActivity.instance().onRegistrationStateChanged(state, message); + if (LinphoneActivity.isInstanciated()) + LinphoneActivity.instance().onRegistrationStateChanged(state, message); } }); } diff --git a/src/org/linphone/core/Version.java b/src/org/linphone/core/Version.java index c06a2efea..65d5370d6 100644 --- a/src/org/linphone/core/Version.java +++ b/src/org/linphone/core/Version.java @@ -42,4 +42,13 @@ public class Version { return buildVersion; } + public static boolean isArmv7() { + try { + return sdkAboveOrEqual(4) + && Build.class.getField("CPU_ABI").get(null).toString().startsWith("armeabi-v7"); + } catch (Throwable e) {} + return false; + } + + } \ No newline at end of file