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