diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 352dc029e..878bdfde9 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -94,6 +94,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/setup_remote_provisioning_login.xml b/res/layout/setup_remote_provisioning_login.xml new file mode 100644 index 000000000..f2e206989 --- /dev/null +++ b/res/layout/setup_remote_provisioning_login.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values/non_localizable_custom.xml b/res/values/non_localizable_custom.xml index ccf0d6af3..51f536c59 100644 --- a/res/values/non_localizable_custom.xml +++ b/res/values/non_localizable_custom.xml @@ -29,7 +29,7 @@ false false false - true + true false true true diff --git a/res/values/strings.xml b/res/values/strings.xml index e577f1e7d..521c25c7d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -437,6 +437,7 @@ Download provisioning This assistant will download an existing configuration. provisioning url + The configuration you downloaded doesn\'t include your account. Please fill it in. Your username will be %s (uppercase characters are not allowed). Do you accept ? Accept diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 2e6e2739e..88fb48e57 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -44,6 +44,7 @@ import org.linphone.core.LinphoneCoreException; import org.linphone.core.LinphoneCoreFactory; import org.linphone.core.LinphoneFriend; import org.linphone.mediastream.Log; +import org.linphone.setup.RemoteProvisioningLoginActivity; import org.linphone.setup.SetupActivity; import org.linphone.ui.AddressText; @@ -92,6 +93,7 @@ public class LinphoneActivity extends FragmentActivity implements public static final String PREF_FIRST_LAUNCH = "pref_first_launch"; private static final int SETTINGS_ACTIVITY = 123; private static final int FIRST_LOGIN_ACTIVITY = 101; + private static final int REMOTE_PROVISIONING_LOGIN_ACTIVITY = 102; private static final int CALL_ACTIVITY = 19; private static LinphoneActivity instance; @@ -138,16 +140,21 @@ public class LinphoneActivity extends FragmentActivity implements startActivity(getIntent().setClass(this, LinphoneLauncherActivity.class)); return; } - + boolean useFirstLoginActivity = getResources().getBoolean(R.bool.display_account_wizard_at_first_start); - if (useFirstLoginActivity && LinphonePreferences.instance().isFirstLaunch()) { + if (LinphonePreferences.instance().isProvisioningLoginViewEnabled()) { + Intent wizard = new Intent(); + wizard.setClass(this, RemoteProvisioningLoginActivity.class); + wizard.putExtra("Domain", LinphoneManager.getInstance().wizardLoginViewDomain); + startActivityForResult(wizard, REMOTE_PROVISIONING_LOGIN_ACTIVITY); + } else if (useFirstLoginActivity && LinphonePreferences.instance().isFirstLaunch()) { if (LinphonePreferences.instance().getAccountCount() > 0) { LinphonePreferences.instance().firstLaunchSuccessful(); } else { startActivityForResult(new Intent().setClass(this, SetupActivity.class), FIRST_LOGIN_ACTIVITY); } } - + setContentView(R.layout.main); instance = this; fragmentsHistory = new ArrayList(); diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 728df5c21..aebc5d3a1 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -156,6 +156,8 @@ public class LinphoneManager implements LinphoneCoreListener { public boolean isUsingBluetoothAudioRoute; private boolean mBluetoothStarted; + public String wizardLoginViewDomain = null; + private static List simpleListeners = new ArrayList(); public static void addListener(LinphoneSimpleListener listener) { if (!simpleListeners.contains(listener)) { @@ -881,12 +883,12 @@ public class LinphoneManager implements LinphoneCoreListener { mListenerDispatcher.onDisplayStatus(message); } - public void globalState(final LinphoneCore lc, final LinphoneCore.GlobalState state, final String message) { + public void globalState(final LinphoneCore lc, final GlobalState state, final String message) { Log.i("new state [",state,"]"); mListenerDispatcher.onGlobalStateChanged(state, message); } - public void registrationState(final LinphoneCore lc, final LinphoneProxyConfig cfg,final LinphoneCore.RegistrationState state,final String message) { + public void registrationState(final LinphoneCore lc, final LinphoneProxyConfig cfg,final RegistrationState state,final String message) { Log.i("new state ["+state+"]"); mListenerDispatcher.onRegistrationStateChanged(state, message); } @@ -1466,8 +1468,14 @@ public class LinphoneManager implements LinphoneCoreListener { Log.d("Remote provisioning status = " + state.toString() + " (" + message + ")"); if (state == RemoteProvisioningState.ConfiguringSuccessful) { - if (mR.getBoolean(R.bool.show_login_wizard_after_remote_provisioning_without_credentials)) { - + if (LinphonePreferences.instance().isProvisioningLoginViewEnabled()) { + LinphoneProxyConfig proxyConfig = lc.createProxyConfig(); + try { + LinphoneAddress addr = LinphoneCoreFactory.instance().createLinphoneAddress(proxyConfig.getIdentity()); + wizardLoginViewDomain = addr.getDomain(); + } catch (LinphoneCoreException e) { + wizardLoginViewDomain = null; + } } } } diff --git a/src/org/linphone/LinphonePreferences.java b/src/org/linphone/LinphonePreferences.java index f6e4c5f36..c1376cca6 100644 --- a/src/org/linphone/LinphonePreferences.java +++ b/src/org/linphone/LinphonePreferences.java @@ -833,4 +833,16 @@ public class LinphonePreferences { LinphoneManager.getInstance().initTunnelFromConf(); } // End of tunnel settings + + public boolean isProvisioningLoginViewEnabled() { + return getConfig().getBool("app", "show_login_view", false); + } + + public void disableProvisioningLoginView() { + if (isProvisioningLoginViewEnabled()) { // Only do it if it was previously enabled + getConfig().setBool("app", "show_login_view", false); + } else { + Log.w("Remote provisioning login view wasn't enabled, ignoring"); + } + } } diff --git a/src/org/linphone/setup/RemoteProvisioningLoginActivity.java b/src/org/linphone/setup/RemoteProvisioningLoginActivity.java new file mode 100644 index 000000000..6b358d7b1 --- /dev/null +++ b/src/org/linphone/setup/RemoteProvisioningLoginActivity.java @@ -0,0 +1,117 @@ +package org.linphone.setup; +/* +RemoteProvisioningLoginActivity.java +Copyright (C) 2014 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. +*/ + +import org.linphone.LinphoneManager; +import org.linphone.LinphonePreferences; +import org.linphone.R; +import org.linphone.core.LinphoneAuthInfo; +import org.linphone.core.LinphoneCore; +import org.linphone.core.LinphoneCoreException; +import org.linphone.core.LinphoneCoreFactory; +import org.linphone.core.LinphoneProxyConfig; + +import android.app.Activity; +import android.os.Bundle; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.EditText; +import android.widget.RelativeLayout; +import android.widget.Toast; + +/** + * @author Sylvain Berfini + */ +public class RemoteProvisioningLoginActivity extends Activity implements OnClickListener { + private EditText login, password, domain; + private RelativeLayout next, cancel; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.setup_remote_provisioning_login); + + login = (EditText) findViewById(R.id.setup_username); + password = (EditText) findViewById(R.id.setup_password); + domain = (EditText) findViewById(R.id.setup_domain); + + next = (RelativeLayout) findViewById(R.id.setup_next); + next.setOnClickListener(this); + cancel = (RelativeLayout) findViewById(R.id.setup_cancel); + cancel.setOnClickListener(this); + + String defaultDomain = getIntent().getStringExtra("Domain"); + if (defaultDomain != null) { + domain.setText(defaultDomain); + domain.setEnabled(false); + } + } + + private void cancelWizard(boolean bypassCheck) { + if (bypassCheck || getResources().getBoolean(R.bool.allow_cancel_remote_provisioning_login_activity)) { + LinphonePreferences.instance().disableProvisioningLoginView(); + setResult(bypassCheck ? Activity.RESULT_OK : Activity.RESULT_CANCELED); + finish(); + } + } + + private boolean storeAccount(String username, String password, String domain) { + LinphoneCore lc = LinphoneManager.getLc(); + + String identity = "sip:" + username + "@" + domain; + LinphoneProxyConfig prxCfg = lc.createProxyConfig(); + try { + prxCfg.setIdentity(identity); + lc.addProxyConfig(prxCfg); + } catch (LinphoneCoreException e) { + e.printStackTrace(); + return false; + } + + LinphoneAuthInfo authInfo = LinphoneCoreFactory.instance().createAuthInfo(username, null, password, null, null, domain); + lc.addAuthInfo(authInfo); + + if (LinphonePreferences.instance().getAccountCount() == 1) + lc.setDefaultProxyConfig(prxCfg); + + return true; + } + + @Override + public void onClick(View v) { + int id = v.getId(); + + if (id == R.id.setup_next) { + if (login.getText() == null || login.length() == 0 || password.getText() == null || password.length() == 0 || domain.getText() == null || domain.length() == 0) { + Toast.makeText(this, getString(R.string.first_launch_no_login_password), Toast.LENGTH_LONG).show(); + return; + } + + storeAccount(login.getText().toString(), password.getText().toString(), domain.getText().toString()); + cancelWizard(true); + } else if (id == R.id.setup_cancel) { + cancelWizard(false); + } + } + + @Override + public void onBackPressed() { + cancelWizard(false); + } +} diff --git a/submodules/linphone b/submodules/linphone index 028f4c550..7d64dedf1 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 028f4c550b267c2801cfc7fd93dcb3c8d237a84d +Subproject commit 7d64dedf12c4a7795d2ffe204416543025055de2