diff --git a/.classpath b/.classpath index aefe1a96e..b95f2cc1d 100644 --- a/.classpath +++ b/.classpath @@ -5,10 +5,10 @@ + - diff --git a/.gitmodules b/.gitmodules index 9b6f29f6c..1704828bf 100644 --- a/.gitmodules +++ b/.gitmodules @@ -67,3 +67,6 @@ [submodule "submodules/externals/cunit"] path = submodules/externals/cunit url = gitosis@git.linphone.org:cunit.git +[submodule "submodules/externals/axmlrpc"] + path = submodules/externals/axmlrpc + url = git://git.linphone.org/axmlrpc.git diff --git a/ant.properties b/ant.properties index 7ddeeeb30..7f65258e5 100644 --- a/ant.properties +++ b/ant.properties @@ -1,3 +1,3 @@ -source.dir=src:submodules/linphone/mediastreamer2/java/src:submodules/linphone/java/j2se:submodules/linphone/java/common:submodules/linphone/java/impl:submodules/linphone/coreapi/help/java +source.dir=src:submodules/linphone/mediastreamer2/java/src:submodules/linphone/java/j2se:submodules/linphone/java/common:submodules/linphone/java/impl:submodules/linphone/coreapi/help/java:submodules/externals/axmlrpc/src/main/java key.store=bc-android.keystore key.alias=nw8000 diff --git a/custom_rules.xml b/custom_rules.xml index 5ddacc5b0..9bf088275 100644 --- a/custom_rules.xml +++ b/custom_rules.xml @@ -62,7 +62,7 @@ destdir="${javadoc.dir}" verbose="off" use="true" - classpath="${sdk.dir}/platforms/${target}/android.jar:libs/aXMLRPC.jar:libs/android-support-v4.jar:libs/gcm.jar" + classpath="${sdk.dir}/platforms/${target}/android.jar:libs/android-support-v4.jar:libs/gcm.jar" sourcepath="${source.dir}:gen" linkoffline="http://developer.android.com/reference file:/${sdk.dir}/docs/reference" stylesheetfile="${sdk.dir}/docs/assets/android-developer-docs.css"> diff --git a/libs/aXMLRPC.jar b/libs/aXMLRPC.jar deleted file mode 100644 index 9cf8f61e0..000000000 Binary files a/libs/aXMLRPC.jar and /dev/null differ diff --git a/res/layout-FR/chat.xml b/res/layout-FR/chat.xml index 0261f0a39..8acf785ba 100644 --- a/res/layout-FR/chat.xml +++ b/res/layout-FR/chat.xml @@ -81,6 +81,7 @@ android:paddingRight="5dp" /> - - + + + + + + + + @@ -104,6 +124,7 @@ android:layout_height="wrap_content"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/values/non_localizable_custom.xml b/res/values/non_localizable_custom.xml index 56c2e3afc..0b8446b57 100644 --- a/res/values/non_localizable_custom.xml +++ b/res/values/non_localizable_custom.xml @@ -34,7 +34,7 @@ true false true - true + true true false @@ -64,5 +64,7 @@ linphone-android@belledonne-communications.com linphone-android-photo-temp.jpg linphone-android-photo-%s.jpg + + true diff --git a/src/org/linphone/AccountPreferencesFragment.java b/src/org/linphone/AccountPreferencesFragment.java index 4414b4e9f..1da113e2a 100644 --- a/src/org/linphone/AccountPreferencesFragment.java +++ b/src/org/linphone/AccountPreferencesFragment.java @@ -103,12 +103,12 @@ public class AccountPreferencesFragment extends PreferencesListFragment { outboundProxy.setKey(getString(R.string.pref_enable_outbound_proxy_key) + key); final Preference disable = advanced.getPreference(2); - disable.setEnabled(prefs.getInt(getString(R.string.pref_default_account_key), 0) != n); + disable.setEnabled(true); Compatibility.setPreferenceChecked(disable, prefs.getBoolean(getString(R.string.pref_disable_account_key) + key, false)); disable.setKey(getString(R.string.pref_disable_account_key) + key); final Preference delete = advanced.getPreference(4); - delete.setEnabled(prefs.getInt(getString(R.string.pref_default_account_key), 0) != n); + delete.setEnabled(true); delete.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { int nbAccounts = prefs.getInt(getString(R.string.pref_extra_accounts), 1); @@ -123,22 +123,29 @@ public class AccountPreferencesFragment extends PreferencesListFragment { editor.putBoolean(getString(R.string.pref_enable_outbound_proxy_key) + getAccountNumber(i), prefs.getBoolean(getString(R.string.pref_enable_outbound_proxy_key) + getAccountNumber(i+1), false)); editor.putBoolean(getString(R.string.pref_disable_account_key) + getAccountNumber(i), prefs.getBoolean(getString(R.string.pref_disable_account_key) + getAccountNumber(i+1), false)); } - - int lastAccount = nbAccounts - 1; - editor.putString(getString(R.string.pref_username_key) + getAccountNumber(lastAccount), null); - editor.putString(getString(R.string.pref_auth_userid_key) + getAccountNumber(lastAccount), null); - editor.putString(getString(R.string.pref_passwd_key) + getAccountNumber(lastAccount), null); - editor.putString(getString(R.string.pref_domain_key) + getAccountNumber(lastAccount), null); - editor.putString(getString(R.string.pref_proxy_key) + getAccountNumber(lastAccount), null); - editor.putBoolean(getString(R.string.pref_enable_outbound_proxy_key) + getAccountNumber(lastAccount), false); - editor.putBoolean(getString(R.string.pref_disable_account_key) + getAccountNumber(lastAccount), false); - - int defaultAccount = prefs.getInt(getString(R.string.pref_default_account_key), 0); - if (defaultAccount > n) { - editor.putInt(getString(R.string.pref_default_account_key), defaultAccount - 1); - } - - editor.putInt(getString(R.string.pref_extra_accounts), nbAccounts - 1); + + if (n != 0) { + int lastAccount = nbAccounts - 1; + editor.putString(getString(R.string.pref_username_key) + getAccountNumber(lastAccount), null); + editor.putString(getString(R.string.pref_passwd_key) + getAccountNumber(lastAccount), null); + editor.putString(getString(R.string.pref_domain_key) + getAccountNumber(lastAccount), null); + editor.putString(getString(R.string.pref_proxy_key) + getAccountNumber(lastAccount), null); + editor.putBoolean(getString(R.string.pref_enable_outbound_proxy_key) + getAccountNumber(lastAccount), false); + editor.putBoolean(getString(R.string.pref_disable_account_key) + getAccountNumber(lastAccount), false); + + int defaultAccount = prefs.getInt(getString(R.string.pref_default_account_key), 0); + if (defaultAccount > n) { + editor.putInt(getString(R.string.pref_default_account_key), defaultAccount - 1); + } + editor.putInt(getString(R.string.pref_extra_accounts), nbAccounts - 1); + } else if (n == 0 && nbAccounts <= 1) { + editor.putString(getString(R.string.pref_username_key), ""); + editor.putString(getString(R.string.pref_passwd_key), ""); + editor.putString(getString(R.string.pref_domain_key), ""); + } else { + editor.putInt(getString(R.string.pref_extra_accounts), nbAccounts - 1); + } + editor.commit(); LinphoneActivity.instance().displaySettings(); @@ -157,7 +164,6 @@ public class AccountPreferencesFragment extends PreferencesListFragment { SharedPreferences.Editor editor = prefs.edit(); editor.putInt(getString(R.string.pref_default_account_key), n); editor.commit(); - delete.setEnabled(false); disable.setEnabled(false); Compatibility.setPreferenceChecked(disable, false); preference.setEnabled(false); @@ -179,7 +185,7 @@ public class AccountPreferencesFragment extends PreferencesListFragment { SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); int n = prefs.getInt(getString(R.string.pref_extra_accounts), 1); - String keyUsername = getString(R.string.pref_username_key) + (n-1 == 0 ? "" : Integer.toString(n-1)); + String keyUsername = getString(R.string.pref_username_key) + getAccountNumber(n-1); if (prefs.getString(keyUsername, "").equals("")) { //If not, we suppress it to not display a blank field diff --git a/src/org/linphone/EditContactFragment.java b/src/org/linphone/EditContactFragment.java index 54d5d729d..c9e34268a 100644 --- a/src/org/linphone/EditContactFragment.java +++ b/src/org/linphone/EditContactFragment.java @@ -235,7 +235,7 @@ public class EditContactFragment extends Fragment { } private View displayNumberOrAddress(final TableLayout controls, String numberOrAddress, boolean forceAddNumber) { - final boolean isSip = numberOrAddress.startsWith("sip:"); + boolean isSip = numberOrAddress.startsWith("sip:"); if (isSip) { if (firstSipAddressIndex == -1) { firstSipAddressIndex = controls.getChildCount(); @@ -243,7 +243,10 @@ public class EditContactFragment extends Fragment { numberOrAddress = numberOrAddress.replace("sip:", ""); } if ((getResources().getBoolean(R.bool.hide_phone_numbers_in_editor) && !isSip) || (getResources().getBoolean(R.bool.hide_sip_addresses_in_editor) && isSip)) { - return null; + if (forceAddNumber) + isSip = !isSip; // If number can't be displayed because we hide a sort of number, change that category + else + return null; } NewOrUpdatedNumberOrAddress tempNounoa; @@ -341,11 +344,6 @@ public class EditContactFragment extends Fragment { if (isSip) { controls.addView(view, controls.getChildCount()); - if (deleteContact != null) { - // Move to the bottom the remove contact button - controls.removeView(deleteContact); - controls.addView(deleteContact, controls.getChildCount()); - } } else { if (firstSipAddressIndex != -1) { controls.addView(view, firstSipAddressIndex); @@ -353,6 +351,11 @@ public class EditContactFragment extends Fragment { controls.addView(view); } } + if (deleteContact != null) { + // Move to the bottom the remove contact button + controls.removeView(deleteContact); + controls.addView(deleteContact, controls.getChildCount()); + } } private void createNewContact() { diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index ffae79063..db4ab909f 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -762,6 +762,8 @@ public class LinphoneActivity extends FragmentActivity implements LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); if (lc != null && lc.getDefaultProxyConfig() != null) statusFragment.registrationStateChanged(lc.getDefaultProxyConfig().getState()); + else + statusFragment.registrationStateChanged(RegistrationState.RegistrationNone); } } diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 232dd6b39..03ecb2e99 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -42,8 +42,10 @@ import java.util.Set; import java.util.Timer; import java.util.TimerTask; +import org.linphone.LinphoneSimpleListener.ConnectivityChangedListener; import org.linphone.LinphoneSimpleListener.LinphoneOnAudioChangedListener; import org.linphone.LinphoneSimpleListener.LinphoneOnAudioChangedListener.AudioState; +import org.linphone.LinphoneSimpleListener.LinphoneOnDTMFReceivedListener; import org.linphone.LinphoneSimpleListener.LinphoneOnMessageReceivedListener; import org.linphone.LinphoneSimpleListener.LinphoneServiceListener; import org.linphone.core.CallDirection; @@ -144,6 +146,7 @@ public final class LinphoneManager implements LinphoneCoreListener { private String lastLcStatusMessage; private String basePath; private static boolean sExited; + private String contactParams; private WakeLock mIncallWakeLock; @@ -445,7 +448,8 @@ public final class LinphoneManager implements LinphoneCoreListener { public void enableCamera(LinphoneCall call, boolean enable) { if (call != null) { call.enableCamera(enable); - LinphoneService.instance().refreshIncallIcon(mLc.getCurrentCall()); + if (mServiceContext.getResources().getBoolean(R.bool.enable_call_notification)) + LinphoneService.instance().refreshIncallIcon(mLc.getCurrentCall()); } } @@ -663,7 +667,7 @@ public final class LinphoneManager implements LinphoneCoreListener { } LinphoneProxyConfig lDefaultProxyConfig = mLc.getDefaultProxyConfig(); - if (lDefaultProxyConfig !=null) { + if (lDefaultProxyConfig != null) { //prefix String lPrefix = getPrefString(R.string.pref_prefix_key, null); if (lPrefix != null) { @@ -671,6 +675,8 @@ public final class LinphoneManager implements LinphoneCoreListener { } //escape + lDefaultProxyConfig.setDialEscapePlus(getPrefBoolean(R.string.pref_escape_plus_key, false)); + } else if (LinphoneService.isReady()) { + LinphoneService.instance().onRegistrationStateChanged(RegistrationState.RegistrationNone, null); } } @@ -706,9 +712,11 @@ public final class LinphoneManager implements LinphoneCoreListener { String regId = getPrefString(R.string.push_reg_id_key, null); String appId = getString(R.string.push_sender_id); if (regId != null && getPrefBoolean(R.string.pref_push_notification_key, mR.getBoolean(R.bool.pref_push_notification_default))) { - String contactInfos = "app-id=" + appId + ";pn-type=google;pn-tok=" + regId + ";pn-msg-str=IM_MSG;pn-call-str=IC_MSG;pn-call-snd=ring.caf;pn-msg-snd=msg.caf;"; + String contactInfos = "app-id=" + appId + ";pn-type=google;pn-tok=" + regId + ";pn-msg-str=IM_MSG;pn-call-str=IC_MSG;pn-call-snd=ring.caf;pn-msg-snd=msg.caf"; proxycon.setContactParameters(contactInfos); } + } else if (contactParams != null) { + proxycon.setContactParameters(contactParams); } mLc.addProxyConfig(proxycon); @@ -788,6 +796,10 @@ public final class LinphoneManager implements LinphoneCoreListener { } return defaultValue; } + + public void setContactParams(String params) { + contactParams = params; + } public void initFromConf() throws LinphoneConfigException { boolean isDebugLogEnabled = !(mR.getBoolean(R.bool.disable_every_log)) && getPrefBoolean(R.string.pref_debug_key, mR.getBoolean(R.bool.pref_debug_default)); @@ -1028,6 +1040,15 @@ public final class LinphoneManager implements LinphoneCoreListener { Log.i(eventInfo.getTypeName()," connected: wifi only activated, setting network unreachable"); } } + + if (connectivityListener != null) { + connectivityListener.onConnectivityChanged(mServiceContext, eventInfo, cm); + } + } + + private ConnectivityChangedListener connectivityListener; + public void addConnectivityChangedListener(ConnectivityChangedListener l) { + connectivityListener = l; } public interface EcCalibrationListener { @@ -1062,6 +1083,18 @@ public final class LinphoneManager implements LinphoneCoreListener { LinphoneAddress from, String message) { //deprecated } + + @Override + public void dtmfReceived(LinphoneCore lc, LinphoneCall call, int dtmf) { + Log.d("DTMF received: " + dtmf); + if (dtmfReceivedListener != null) + dtmfReceivedListener.onDTMFReceived(call, dtmf); + } + + private LinphoneOnDTMFReceivedListener dtmfReceivedListener; + public void setOnDTMFReceivedListener(LinphoneOnDTMFReceivedListener listener) { + dtmfReceivedListener = listener; + } @Override public void messageReceived(LinphoneCore lc, LinphoneChatRoom cr, LinphoneChatMessage message) { @@ -1093,11 +1126,6 @@ public final class LinphoneManager implements LinphoneCoreListener { } } - @Override - public void dtmfReceived(LinphoneCore lc, LinphoneCall call, int dtmf) { - Log.d("DTMF received: " + dtmf); - } - public String getLastLcStatusMessage() { return lastLcStatusMessage; } @@ -1396,6 +1424,16 @@ public final class LinphoneManager implements LinphoneCoreListener { } return false; } + + public boolean acceptCall(LinphoneCall call) { + try { + mLc.acceptCall(call); + return true; + } catch (LinphoneCoreException e) { + Log.i(e, "Accept call failed"); + } + return false; + } public boolean acceptCallWithParams(LinphoneCall call, LinphoneCallParams params) { try { diff --git a/src/org/linphone/LinphoneService.java b/src/org/linphone/LinphoneService.java index 5301b0982..257ea0b35 100644 --- a/src/org/linphone/LinphoneService.java +++ b/src/org/linphone/LinphoneService.java @@ -291,6 +291,11 @@ public final class LinphoneService extends Service implements LinphoneServiceLis notifyWrapper(CUSTOM_NOTIF_ID, mCustomNotif); } + public void removeCustomNotification() { + mNM.cancel(CUSTOM_NOTIF_ID); + resetIntentLaunchedOnNotificationClick(); + } + public void displayMessageNotification(String fromSipUri, String fromName, String message) { Intent notifIntent = new Intent(this, LinphoneActivity.class); notifIntent.putExtra("GoToChat", true); @@ -513,6 +518,9 @@ public final class LinphoneService extends Service implements LinphoneServiceLis if ((state == RegistrationState.RegistrationFailed || state == RegistrationState.RegistrationCleared) && (LinphoneManager.getLc().getDefaultProxyConfig() == null || !LinphoneManager.getLc().getDefaultProxyConfig().isRegistered())) { sendNotification(IC_LEVEL_OFFLINE, R.string.notification_register_failure); } + if (state == RegistrationState.RegistrationNone) { + sendNotification(IC_LEVEL_OFFLINE, R.string.notification_started); + } mHandler.post(new Runnable() { public void run() { @@ -567,10 +575,12 @@ public final class LinphoneService extends Service implements LinphoneServiceLis if (state == State.StreamsRunning) { // Workaround bug current call seems to be updated after state changed to streams running - refreshIncallIcon(call); + if (getResources().getBoolean(R.bool.enable_call_notification)) + refreshIncallIcon(call); mWifiLock.acquire(); } else { - refreshIncallIcon(LinphoneManager.getLc().getCurrentCall()); + if (getResources().getBoolean(R.bool.enable_call_notification)) + refreshIncallIcon(LinphoneManager.getLc().getCurrentCall()); } if ((state == State.CallEnd || state == State.Error) && LinphoneManager.getLc().getCallsNb() < 1) { mWifiLock.release(); diff --git a/src/org/linphone/LinphoneSimpleListener.java b/src/org/linphone/LinphoneSimpleListener.java index 3d2fe0d7f..7864a20ba 100644 --- a/src/org/linphone/LinphoneSimpleListener.java +++ b/src/org/linphone/LinphoneSimpleListener.java @@ -25,7 +25,10 @@ import org.linphone.core.LinphoneChatMessage; import org.linphone.core.LinphoneCore.GlobalState; import org.linphone.core.LinphoneCore.RegistrationState; +import android.content.Context; import android.media.MediaPlayer; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; public interface LinphoneSimpleListener { @@ -67,4 +70,12 @@ public interface LinphoneSimpleListener { public static interface LinphoneOnRegistrationStateChangedListener extends LinphoneSimpleListener { void onRegistrationStateChanged(RegistrationState state); } + + public static interface ConnectivityChangedListener extends LinphoneSimpleListener { + void onConnectivityChanged(Context context, NetworkInfo eventInfo, ConnectivityManager cm); + } + + public static interface LinphoneOnDTMFReceivedListener extends LinphoneSimpleListener { + void onDTMFReceived(LinphoneCall call, int dtmf); + } } diff --git a/src/org/linphone/LinphoneUtils.java b/src/org/linphone/LinphoneUtils.java index 822a3fbe7..97af9bda3 100644 --- a/src/org/linphone/LinphoneUtils.java +++ b/src/org/linphone/LinphoneUtils.java @@ -29,13 +29,12 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneCall; import org.linphone.core.LinphoneCall.State; import org.linphone.core.LinphoneCore; +import org.linphone.core.LinphoneCoreFactory; import org.linphone.mediastream.Log; import org.linphone.mediastream.Version; import org.linphone.mediastream.video.capture.hwconf.Hacks; @@ -68,19 +67,15 @@ public final class LinphoneUtils { private LinphoneUtils(){} private static boolean preventVolumeBarToDisplay = false; - private static final String sipAddressRegExp = "^(sip:)?(\\+)?[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\\.-][a-z0-9]+)*)+\\.[a-z]{2,}(:[0-9]{2,5})?$"; - private static final String strictSipAddressRegExp = "^sip:(\\+)?[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\\.-][a-z0-9]+)*)+\\.[a-z]{2,}$"; + //private static final String sipAddressRegExp = "^(sip:)?(\\+)?[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\\.-][a-z0-9]+)*)+\\.[a-z]{2,}(:[0-9]{2,5})?$"; + //private static final String strictSipAddressRegExp = "^sip:(\\+)?[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\\.-][a-z0-9]+)*)+\\.[a-z]{2,}$"; public static boolean isSipAddress(String numberOrAddress) { - Pattern p = Pattern.compile(sipAddressRegExp); - Matcher m = p.matcher(numberOrAddress); - return m != null && m.matches(); + return LinphoneCoreFactory.instance().createLinphoneAddress(numberOrAddress) != null; } public static boolean isStrictSipAddress(String numberOrAddress) { - Pattern p = Pattern.compile(strictSipAddressRegExp); - Matcher m = p.matcher(numberOrAddress); - return m != null && m.matches(); + return isSipAddress(numberOrAddress) && numberOrAddress.startsWith("sip:"); } public static String getUsernameFromAddress(String address) { diff --git a/src/org/linphone/PreferencesFragment.java b/src/org/linphone/PreferencesFragment.java index daf98c696..417b966e4 100644 --- a/src/org/linphone/PreferencesFragment.java +++ b/src/org/linphone/PreferencesFragment.java @@ -281,6 +281,10 @@ public class PreferencesFragment extends PreferencesListFragment implements EcCa addAccount.setTitle(getString(R.string.pref_add_account)); addAccount.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { + SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); + nbAccounts = prefs.getInt(getString(R.string.pref_extra_accounts), 0); + prefs.edit().putInt(getString(R.string.pref_extra_accounts), nbAccounts+1).commit(); + addExtraAccountPreferencesButton(accounts, nbAccounts, true); LinphoneActivity.instance().displayAccountSettings(nbAccounts); nbAccounts++; diff --git a/src/org/linphone/StatusFragment.java b/src/org/linphone/StatusFragment.java index 8f27c5e3b..0309ce5df 100644 --- a/src/org/linphone/StatusFragment.java +++ b/src/org/linphone/StatusFragment.java @@ -231,7 +231,7 @@ public class StatusFragment extends Fragment { e.printStackTrace(); } - return -1; + return R.drawable.led_disconnected; } private String getStatusIconText(LinphoneCore.RegistrationState state) { @@ -253,7 +253,7 @@ public class StatusFragment extends Fragment { e.printStackTrace(); } - return null; + return context.getString(R.string.status_not_connected); } private void startCallQuality() { diff --git a/src/org/linphone/setup/WizardFragment.java b/src/org/linphone/setup/WizardFragment.java index 1e4240516..4309edff2 100644 --- a/src/org/linphone/setup/WizardFragment.java +++ b/src/org/linphone/setup/WizardFragment.java @@ -50,6 +50,7 @@ public class WizardFragment extends Fragment { private boolean usernameOk = false; private boolean passwordOk = false; private boolean emailOk = false; + private boolean confirmPasswordOk = false; private ImageView createAccount; private TextView errorMessage; @@ -66,7 +67,10 @@ public class WizardFragment extends Fragment { passwordConfirm = (EditText) view.findViewById(R.id.setup_password_confirm); ImageView passwordOkIV = (ImageView) view.findViewById(R.id.setup_password_ok); - addXMLRPCPasswordHandler(password, passwordConfirm, passwordOkIV); + addXMLRPCPasswordHandler(password, passwordOkIV); + + ImageView passwordConfirmOkIV = (ImageView) view.findViewById(R.id.setup_confirm_password_ok); + addXMLRPCConfirmPasswordHandler(password, passwordConfirm, passwordConfirmOkIV); email = (EditText) view.findViewById(R.id.setup_email); ImageView emailOkIV = (ImageView) view.findViewById(R.id.setup_email_ok); @@ -95,7 +99,7 @@ public class WizardFragment extends Fragment { errorMessage.setText(R.string.wizard_server_unavailable); usernameOk = false; icon.setImageResource(R.drawable.wizard_notok); - createAccount.setEnabled(usernameOk && passwordOk && emailOk); + createAccount.setEnabled(usernameOk && passwordOk && confirmPasswordOk && emailOk); } }; @@ -108,7 +112,7 @@ public class WizardFragment extends Fragment { errorMessage.setText(R.string.wizard_username_unavailable); usernameOk = false; icon.setImageResource(R.drawable.wizard_notok); - createAccount.setEnabled(usernameOk && passwordOk && emailOk); + createAccount.setEnabled(usernameOk && passwordOk && confirmPasswordOk && emailOk); } }; @@ -117,7 +121,7 @@ public class WizardFragment extends Fragment { errorMessage.setText(""); icon.setImageResource(R.drawable.wizard_ok); usernameOk = true; - createAccount.setEnabled(usernameOk && passwordOk && emailOk); + createAccount.setEnabled(usernameOk && passwordOk && confirmPasswordOk && emailOk); } }; @@ -253,12 +257,12 @@ public class WizardFragment extends Fragment { errorMessage.setText(R.string.wizard_email_incorrect); icon.setImageResource(R.drawable.wizard_notok); } - createAccount.setEnabled(usernameOk && passwordOk && emailOk); + createAccount.setEnabled(usernameOk && passwordOk && confirmPasswordOk && emailOk); } }); } - private void addXMLRPCPasswordHandler(final EditText field1, final EditText field2, final ImageView icon) { + private void addXMLRPCPasswordHandler(final EditText field1, final ImageView icon) { TextWatcher passwordListener = new TextWatcher() { public void afterTextChanged(Editable arg0) { @@ -271,21 +275,51 @@ public class WizardFragment extends Fragment { public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { passwordOk = false; - if (isPasswordCorrect(field1.getText().toString()) && field1.getText().toString().equals(field2.getText().toString())) { + if (isPasswordCorrect(field1.getText().toString())) { passwordOk = true; icon.setImageResource(R.drawable.wizard_ok); errorMessage.setText(""); } else { - if (isPasswordCorrect(field1.getText().toString())) { - errorMessage.setText(R.string.wizard_passwords_unmatched); - } - else { - errorMessage.setText(R.string.wizard_password_incorrect); - } + errorMessage.setText(R.string.wizard_password_incorrect); icon.setImageResource(R.drawable.wizard_notok); } - createAccount.setEnabled(usernameOk && passwordOk && emailOk); + createAccount.setEnabled(usernameOk && passwordOk && confirmPasswordOk && emailOk); + } + }; + + field1.addTextChangedListener(passwordListener); + } + + private void addXMLRPCConfirmPasswordHandler(final EditText field1, final EditText field2, final ImageView icon) { + TextWatcher passwordListener = new TextWatcher() { + public void afterTextChanged(Editable arg0) { + + } + + public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { + + } + + public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) + { + confirmPasswordOk = false; + if (field1.getText().toString().equals(field2.getText().toString())) { + confirmPasswordOk = true; + icon.setImageResource(R.drawable.wizard_ok); + + if (!isPasswordCorrect(field1.getText().toString())) { + errorMessage.setText(R.string.wizard_password_incorrect); + } + else { + errorMessage.setText(""); + } + } + else { + errorMessage.setText(R.string.wizard_passwords_unmatched); + icon.setImageResource(R.drawable.wizard_notok); + } + createAccount.setEnabled(usernameOk && passwordOk && confirmPasswordOk && emailOk); } }; diff --git a/submodules/externals/axmlrpc b/submodules/externals/axmlrpc new file mode 160000 index 000000000..c47eaa453 --- /dev/null +++ b/submodules/externals/axmlrpc @@ -0,0 +1 @@ +Subproject commit c47eaa453fb75d55d32304413672c16706af85e0 diff --git a/submodules/linphone b/submodules/linphone index ff2563b24..e1552ee1e 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit ff2563b24413a364ee1ce57d4aff260761f19771 +Subproject commit e1552ee1eef40ca9efeb0e814223cff17e580462