diff --git a/res/layout/assistant_linphone_login.xml b/res/layout/assistant_linphone_login.xml
index bbe5d2c3b..d1b5facff 100644
--- a/res/layout/assistant_linphone_login.xml
+++ b/res/layout/assistant_linphone_login.xml
@@ -85,7 +85,7 @@
-
-
-
+
\ No newline at end of file
diff --git a/res/layout/assistant_remote_provisioning_login.xml b/res/layout/assistant_remote_provisioning_login.xml
index 3aefe9b4d..17aa63ab1 100644
--- a/res/layout/assistant_remote_provisioning_login.xml
+++ b/res/layout/assistant_remote_provisioning_login.xml
@@ -1,91 +1,113 @@
-
-
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+ android:paddingLeft="10dp"
+ android:paddingRight="10dp"
+ android:gravity="center"
+ android:orientation="vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e41d94ec9..9694c6cf3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -39,6 +39,7 @@
Fetch remote configuration
Create account
Fetch and apply
+ Login
Echo canceller calibration in progress
Enter your login
Connection
diff --git a/src/org/linphone/LinphonePreferences.java b/src/org/linphone/LinphonePreferences.java
index 647ae1882..63892c36f 100644
--- a/src/org/linphone/LinphonePreferences.java
+++ b/src/org/linphone/LinphonePreferences.java
@@ -1182,13 +1182,17 @@ public class LinphonePreferences {
}
public void contactsMigrationDone(){
- getConfig().setBool("app", "contacts_migration_done",true);
+ getConfig().setBool("app", "contacts_migration_done", true);
}
public boolean isContactsMigrationDone(){
return getConfig().getBool("app", "contacts_migration_done",false);
}
+ public String getXmlRpcServerUrl() {
+ return getConfig().getString("app", "server_url", null);
+ }
+
public String getDebugPopupAddress(){
return getConfig().getString("app", "debug_popup_magic", null);
}
diff --git a/src/org/linphone/assistant/AssistantActivity.java b/src/org/linphone/assistant/AssistantActivity.java
index aca199db4..fb517673a 100644
--- a/src/org/linphone/assistant/AssistantActivity.java
+++ b/src/org/linphone/assistant/AssistantActivity.java
@@ -98,7 +98,7 @@ public class AssistantActivity extends Activity implements OnClickListener {
if(address != null && address.asString().equals(cfg.getIdentity()) ) {
if (state == RegistrationState.RegistrationOk) {
if (LinphoneManager.getLc().getDefaultProxyConfig() != null) {
- //launchEchoCancellerCalibration(true);
+ launchEchoCancellerCalibration(true);
success();
}
} else if (state == RegistrationState.RegistrationFailed) {
@@ -403,7 +403,7 @@ public class AssistantActivity extends Activity implements OnClickListener {
public void isAccountVerified(String username) {
Toast.makeText(this, getString(R.string.setup_account_validated), Toast.LENGTH_LONG).show();
LinphoneManager.getLcIfManagerNotDestroyedOrNull().refreshRegisters();
- //launchEchoCancellerCalibration(true);
+ launchEchoCancellerCalibration(true);
}
public void isEchoCalibrationFinished() {
diff --git a/src/org/linphone/assistant/RemoteProvisioningActivity.java b/src/org/linphone/assistant/RemoteProvisioningActivity.java
index 164115a57..08942cee5 100644
--- a/src/org/linphone/assistant/RemoteProvisioningActivity.java
+++ b/src/org/linphone/assistant/RemoteProvisioningActivity.java
@@ -18,12 +18,10 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-import static android.content.Intent.ACTION_MAIN;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
-import org.linphone.LinphoneActivity;
import org.linphone.LinphoneLauncherActivity;
import org.linphone.LinphoneManager;
import org.linphone.LinphonePreferences;
@@ -72,7 +70,7 @@ public class RemoteProvisioningActivity extends Activity {
}
};
}
-
+
@Override
protected void onResume() {
super.onResume();
@@ -81,10 +79,10 @@ public class RemoteProvisioningActivity extends Activity {
lc.addListener(mListener);
}
LinphonePreferences.instance().setContext(this);
-
+
checkIntentForConfigUri(getIntent());
}
-
+
@Override
protected void onPause() {
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
@@ -93,16 +91,21 @@ public class RemoteProvisioningActivity extends Activity {
}
super.onPause();
}
-
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ }
+
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
checkIntentForConfigUri(intent);
}
-
+
private void checkIntentForConfigUri(final Intent intent) {
new Thread(new Runnable() {
-
+
@Override
public void run() {
Uri openUri = intent.getData();
@@ -116,7 +119,7 @@ public class RemoteProvisioningActivity extends Activity {
}
Log.d("Using config uri: " + configUriParam);
}
-
+
if (configUriParam == null) {
if (!LinphonePreferences.instance().isFirstRemoteProvisioning()) {
mHandler.post(new Runnable() {
@@ -135,7 +138,7 @@ public class RemoteProvisioningActivity extends Activity {
}, 1500);
} // else we do nothing if there is no config uri parameter and if user not allowed to leave this screen
} else {
- if (getResources().getBoolean(R.bool.display_confirmation_popup_after_first_configuration)
+ if (getResources().getBoolean(R.bool.display_confirmation_popup_after_first_configuration)
&& !LinphonePreferences.instance().isFirstRemoteProvisioning()) {
mHandler.post(new Runnable() {
@Override
@@ -155,31 +158,30 @@ public class RemoteProvisioningActivity extends Activity {
}
}).start();
}
-
+
private void displayDialogConfirmation() {
new AlertDialog.Builder(RemoteProvisioningActivity.this)
- .setTitle(getString(R.string.remote_provisioning_again_title))
- .setMessage(getString(R.string.remote_provisioning_again_message))
- .setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- setRemoteProvisioningAddressAndRestart(configUriParam);
- }
- })
- .setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- goToLinphoneActivity();
- }
- })
- .show();
+ .setTitle(getString(R.string.remote_provisioning_again_title))
+ .setMessage(getString(R.string.remote_provisioning_again_message))
+ .setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ setRemoteProvisioningAddressAndRestart(configUriParam);
+ }
+ })
+ .setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ goToLinphoneActivity();
+ }
+ })
+ .show();
}
-
- private void setRemoteProvisioningAddressAndRestart(String configUri) {
+
+ private void setRemoteProvisioningAddressAndRestart(final String configUri) {
if (spinner != null) spinner.setVisibility(View.VISIBLE);
-
+
LinphonePreferences.instance().setContext(this); // Needed, else the next call will crash
LinphonePreferences.instance().setRemoteProvisioningUrl(configUri);
- LinphonePreferences.instance().firstRemoteProvisioningSuccessful();
-
+
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
@@ -187,14 +189,15 @@ public class RemoteProvisioningActivity extends Activity {
}
}, 1000);
}
-
+
private void goToLinphoneActivity() {
if (LinphoneService.isReady()) {
- LinphoneService.instance().setActivityToLaunchOnIncomingReceived(LinphoneActivity.class);
+ LinphoneService.instance().setActivityToLaunchOnIncomingReceived(LinphoneLauncherActivity.class);
//finish(); // To prevent the user to come back to this page using back button
- startActivity(new Intent().setClass(this, LinphoneActivity.class));
+ startActivity(new Intent().setClass(this, LinphoneLauncherActivity.class));
} else {
finish();
}
}
+
}
diff --git a/src/org/linphone/assistant/RemoteProvisioningFragment.java b/src/org/linphone/assistant/RemoteProvisioningFragment.java
index a24468873..0ced0cc19 100644
--- a/src/org/linphone/assistant/RemoteProvisioningFragment.java
+++ b/src/org/linphone/assistant/RemoteProvisioningFragment.java
@@ -19,13 +19,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-import org.linphone.LinphoneActivity;
-import org.linphone.LinphoneLauncherActivity;
+import org.linphone.LinphoneManager;
import org.linphone.LinphonePreferences;
import org.linphone.R;
import android.app.Fragment;
-import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -57,13 +55,7 @@ public class RemoteProvisioningFragment extends Fragment implements OnClickListe
if (id == R.id.assistant_apply) {
String url = remoteProvisioningUrl.getText().toString();
LinphonePreferences.instance().setRemoteProvisioningUrl(url);
-
- // Restart Linphone
- Intent intent = new Intent();
- intent.setClass(getActivity(), LinphoneLauncherActivity.class);
- getActivity().finish();
- LinphoneActivity.instance().quit();
- startActivity(intent);
+ LinphoneManager.getInstance().restartLinphoneCore();
}
}
}
diff --git a/src/org/linphone/assistant/RemoteProvisioningLoginActivity.java b/src/org/linphone/assistant/RemoteProvisioningLoginActivity.java
index cc40937f2..31a74790d 100644
--- a/src/org/linphone/assistant/RemoteProvisioningLoginActivity.java
+++ b/src/org/linphone/assistant/RemoteProvisioningLoginActivity.java
@@ -18,21 +18,31 @@ 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.LinphoneActivity;
+import org.linphone.LinphoneLauncherActivity;
import org.linphone.LinphoneManager;
import org.linphone.LinphonePreferences;
+import org.linphone.LinphoneService;
+import org.linphone.core.LinphoneCoreListenerBase;
+import org.linphone.mediastream.Log;
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 org.linphone.xmlrpc.XmlRpcHelper;
+import org.linphone.xmlrpc.XmlRpcListenerBase;
import android.app.Activity;
+import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
+import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
+import android.widget.Toast;
/**
* @author Sylvain Berfini
@@ -40,24 +50,40 @@ import android.widget.ImageView;
public class RemoteProvisioningLoginActivity extends Activity implements OnClickListener {
private EditText login, password, domain;
private ImageView cancel;
-
+ private Button connect;
+ private LinphoneCoreListenerBase mListener;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.assistant_remote_provisioning_login);
- login = (EditText) findViewById(R.id.setup_username);
- password = (EditText) findViewById(R.id.setup_password);
- domain = (EditText) findViewById(R.id.setup_domain);
+ login = (EditText) findViewById(R.id.assistant_username);
+ password = (EditText) findViewById(R.id.assistant_password);
+ domain = (EditText) findViewById(R.id.assistant_domain);
+
+ //cancel = (ImageView) findViewById(R.id.cancel);
+ //cancel.setOnClickListener(this);
+
+ connect = (Button) findViewById(R.id.assistant_connect);
+ connect.setOnClickListener(this);
- cancel = (ImageView) findViewById(R.id.cancel);
- cancel.setOnClickListener(this);
-
String defaultDomain = getIntent().getStringExtra("Domain");
if (defaultDomain != null) {
domain.setText(defaultDomain);
domain.setEnabled(false);
}
+
+ mListener = new LinphoneCoreListenerBase(){
+ @Override
+ public void configuringStatus(LinphoneCore lc, final LinphoneCore.RemoteProvisioningState state, String message) {
+ if (state == LinphoneCore.RemoteProvisioningState.ConfiguringSuccessful) {
+ //TODO
+ } else if (state == LinphoneCore.RemoteProvisioningState.ConfiguringFailed) {
+ Toast.makeText(RemoteProvisioningLoginActivity.this, R.string.remote_provisioning_failure, Toast.LENGTH_LONG).show();
+ }
+ }
+ };
}
private void cancelWizard(boolean bypassCheck) {
@@ -70,8 +96,20 @@ public class RemoteProvisioningLoginActivity extends Activity implements OnClick
private boolean storeAccount(String username, String password, String domain) {
LinphoneCore lc = LinphoneManager.getLc();
-
- String identity = "sip:" + username + "@" + domain;
+
+ XmlRpcHelper xmlRpcHelper = new XmlRpcHelper(null);
+ xmlRpcHelper.getRemoteProvisioningFilenameAsync(new XmlRpcListenerBase() {
+ @Override
+ public void onRemoteProvisioningFilenameSent(String result) {
+ LinphonePreferences.instance().setRemoteProvisioningUrl(result);
+ LinphoneManager.getInstance().restartLinphoneCore();
+ }
+ }, username.toString(), password.toString(), domain.toString());
+
+ LinphonePreferences.instance().firstLaunchSuccessful();
+ setResult(Activity.RESULT_OK);
+ finish();
+ /*String identity = "sip:" + username + "@" + domain;
LinphoneProxyConfig prxCfg = lc.createProxyConfig();
try {
prxCfg.setIdentity(identity);
@@ -86,10 +124,28 @@ public class RemoteProvisioningLoginActivity extends Activity implements OnClick
if (LinphonePreferences.instance().getAccountCount() == 1)
lc.setDefaultProxyConfig(prxCfg);
-
+ */
return true;
}
+ @Override
+ protected void onResume() {
+ super.onResume();
+ LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
+ if (lc != null) {
+ lc.addListener(mListener);
+ }
+ }
+
+ @Override
+ protected void onPause() {
+ LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
+ if (lc != null) {
+ lc.removeListener(mListener);
+ }
+ super.onPause();
+ }
+
@Override
public void onClick(View v) {
int id = v.getId();
@@ -97,6 +153,9 @@ public class RemoteProvisioningLoginActivity extends Activity implements OnClick
if (id == R.id.cancel) {
cancelWizard(false);
}
+ if (id == R.id.assistant_connect){
+ storeAccount(login.getText().toString(), password.getText().toString(), domain.getText().toString());
+ }
}
@Override
diff --git a/src/org/linphone/xmlrpc/XmlRpcHelper.java b/src/org/linphone/xmlrpc/XmlRpcHelper.java
new file mode 100644
index 000000000..ed66dfabc
--- /dev/null
+++ b/src/org/linphone/xmlrpc/XmlRpcHelper.java
@@ -0,0 +1,884 @@
+package org.linphone.xmlrpc;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.linphone.LinphonePreferences;
+import org.linphone.mediastream.Log;
+
+import de.timroes.axmlrpc.XMLRPCCallback;
+import de.timroes.axmlrpc.XMLRPCClient;
+import de.timroes.axmlrpc.XMLRPCException;
+import de.timroes.axmlrpc.XMLRPCServerException;
+
+public class XmlRpcHelper {
+ public static final String SERVER_ERROR_INVALID_ACCOUNT = "ERROR_INVALID_ACCOUNT";
+ public static final String SERVER_ERROR_PURCHASE_CANCELLED = "ERROR_PURCHASE_CANCELLED";
+ public static final String SERVER_ERROR_RECEIPT_PARSING_FAILED = "ERROR_RECEIPT_PARSING_FAILED";
+ public static final String SERVER_ERROR_UID_ALREADY_IN_USE = "ERROR_UID_ALREADY_IN_USE";
+ public static final String SERVER_ERROR_SIGNATURE_VERIFICATION_FAILED = "ERROR_SIGNATURE_VERIFICATION_FAILED";
+ public static final String SERVER_ERROR_ACCOUNT_ALREADY_EXISTS = "ERROR_ACCOUNT_ALREADY_EXISTS";
+ public static final String SERVER_ERROR_UNKNOWN_ERROR = "ERROR_UNKNOWN_ERROR";
+
+ public static final String CLIENT_ERROR_INVALID_SERVER_URL = "INVALID_SERVER_URL";
+ public static final String CLIENT_ERROR_SERVER_NOT_REACHABLE = "SERVER_NOT_REACHABLE";
+
+ private XMLRPCClient mXmlRpcClient;
+
+ public XmlRpcHelper(String serverUrl) {
+ try {
+ if(serverUrl != null) {
+ mXmlRpcClient = new XMLRPCClient(new URL(serverUrl));
+ } else {
+ mXmlRpcClient = new XMLRPCClient(new URL(LinphonePreferences.instance().getXmlRpcServerUrl()));
+ }
+ } catch (MalformedURLException e) {
+ Log.e(e);
+ }
+ }
+
+ public void createAccountAsync(final XmlRpcListener listener, String username, String email, String password) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("createAccountAsync: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ listener.onError(result);
+ return;
+ }
+
+ listener.onAccountCreated(result);
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "create_account", username, email, password == null ? "" : password);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public String createAccount(String username, String email, String password) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("create_account", username, email, password == null ? "" : password);
+ String result = (String)object;
+ Log.d("createAccount: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ return null;
+ }
+ return result;
+
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return null;
+ }
+
+ public void getAccountExpireAsync(final XmlRpcListener listener, String username, String password) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("getAccountExpireAsync: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ listener.onError(result);
+ return;
+ }
+
+ listener.onAccountExpireFetched(result);
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "get_expiration_for_account", username, password);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public String getAccountExpire(String username, String password) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("get_expiration_for_account", username, password);
+ String result = (String)object;
+ Log.d("getAccountExpire: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ return null;
+ }
+ return result;
+
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return null;
+ }
+
+ public void updateAccountExpireAsync(final XmlRpcListener listener, String username, String password, String payload, String signature) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("updateAccountExpireAsync: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ listener.onError(result);
+ return;
+ }
+
+ listener.onAccountExpireUpdated(result);
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "update_expiration_date", username, password, payload, signature);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public String updateAccountExpire(String username, String password, String payload, String signature) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("update_expiration_date", username, password, payload, signature);
+ String result = (String)object;
+ Log.d("updateAccountExpire: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ return null;
+ }
+ return result;
+
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return null;
+ }
+
+ public void activateAccountAsync(final XmlRpcListener listener, String username, String password) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("activateAccountAsync: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ listener.onError(result);
+ return;
+ }
+
+ listener.onAccountActivated(result);
+ return;
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "activate_account", username, password);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public String activateAccount(String gmailAccount, String username, String password) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("activate_account", username, password);
+ String result = (String)object;
+ Log.d("activateAccount: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ return null;
+ }
+ return result;
+
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return null;
+ }
+
+ public void isAccountActivatedAsync(final XmlRpcListener listener, String username) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String) object;
+ Log.d("isAccountActivatedAsync: " + result);
+
+ if ("OK".equals(result)) {
+ listener.onAccountActivatedFetched(true);
+ return;
+ } else if (!"ERROR_ACCOUNT_NOT_ACTIVATED".equals(result)) {
+ Log.e(result);
+ listener.onError(result);
+ }
+ listener.onAccountActivatedFetched(false);
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "check_account_activated", username);
+ }
+ }
+
+ public boolean isAccountActivated(String username) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("check_account_activated", username);
+ String result = (String)object;
+ Log.d("isAccountActivated: " + result);
+
+ if ("OK".equals(result)) {
+ return true;
+ } else if (!"ERROR_ACCOUNT_NOT_ACTIVATED".equals(result)) {
+ Log.e(result);
+ }
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return false;
+ }
+
+ public void isTrialAccountAsync(final XmlRpcListener listener, String username, String password) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("isTrialAccountAsync: " + result);
+
+ if (!"NOK".equals(result) && !"OK".equals(result)) {
+ listener.onError(result);
+ }
+ listener.onAccountFetched("OK".equals(result));
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "check_account_trial", username, password);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public boolean isTrialAccount(String username, String password) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("check_account_trial", username, password);
+ String result = (String)object;
+ Log.d("isTrialAccount: " + result);
+
+ return "OK".equals(result);
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return false;
+ }
+
+ public void isAccountAsync(final XmlRpcListener listener, String username) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("isAccountAsync: " + result);
+
+ if ("OK".equals(result)) {
+ listener.onAccountFetched(true);
+ return;
+ } else if (!"ERROR_ACCOUNT_DOESNT_EXIST".equals(result)) {
+ Log.e(result);
+ listener.onError(result);
+ }
+ listener.onAccountFetched(false);
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "check_account_activated", username);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public boolean isAccount(String username) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("check_account_activated", username);
+ String result = (String)object;
+ Log.d("isAccount: " + result);
+
+ if ("OK".equals(result)) {
+ return true;
+ } else if (!"ERROR_ACCOUNT_DOESNT_EXIST".equals(result)) {
+ Log.e(result);
+ }
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return false;
+ }
+
+ public void changeAccountEmailAsync(final XmlRpcListener listener, String username, String password, String newEmail) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("changeAccountEmailAsync: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ listener.onError(result);
+ return;
+ }
+
+ listener.onAccountEmailChanged(result);
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "change_email", username, password, newEmail);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public String changeAccountEmail(String username, String password, String newEmail) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("change_email", username, password, newEmail);
+ String result = (String)object;
+ Log.d("changeAccountEmail: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ return null;
+ }
+ return result;
+
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return null;
+ }
+
+ public void changeAccountPasswordAsync(final XmlRpcListener listener, String username, String oldPassword, String newPassword) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("changeAccountPasswordAsync: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ listener.onError(result);
+ return;
+ }
+
+ listener.onAccountPasswordChanged(result);
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "change_password", username, oldPassword, newPassword);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public String changeAccountPassword(String username, String oldPassword, String newPassword) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("change_password", username, oldPassword, newPassword);
+ String result = (String)object;
+ Log.d("changeAccountPassword: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ return null;
+ }
+ return result;
+
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return null;
+ }
+
+ public void changeAccountHashPasswordAsync(final XmlRpcListener listener, String username, String oldPassword, String newPassword) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("changeAccountHashPasswordAsync: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ listener.onError(result);
+ return;
+ }
+
+ listener.onAccountPasswordChanged(result);
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "change_hash", username, oldPassword, newPassword);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public String changeAccountHashPassword(String username, String oldPassword, String newPassword) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("change_hash", username, oldPassword, newPassword);
+ String result = (String)object;
+ Log.d("changeAccountHashPassword: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ return null;
+ }
+ return result;
+
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return null;
+ }
+
+ public void sendRecoverPasswordLinkByEmailAsync(final XmlRpcListener listener, String usernameOrEmail) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("sendRecoverPasswordLinkByEmailAsync: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ listener.onError(result);
+ return;
+ }
+
+ listener.onRecoverPasswordLinkSent(result);
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "send_reset_account_password_email", usernameOrEmail);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public String sendRecoverPasswordLinkByEmail(String usernameOrEmail) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("send_reset_account_password_email", usernameOrEmail);
+ String result = (String)object;
+ Log.d("sendRecoverPasswordLinkByEmail: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ return null;
+ }
+ return result;
+
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return null;
+ }
+
+ public void sendActivateAccountLinkByEmailAsync(final XmlRpcListener listener, String usernameOrEmail) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("sendActivateAccountLinkByEmailAsync: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ listener.onError(result);
+ return;
+ }
+
+ listener.onActivateAccountLinkSent(result);
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "resend_activation_email", usernameOrEmail);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public String sendActivateAccountLinkByEmail(String usernameOrEmail) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("resend_activation_email", usernameOrEmail);
+ String result = (String)object;
+ Log.d("sendActivateAccountLinkByEmail: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ return null;
+ }
+ return result;
+
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return null;
+ }
+
+ public void sendUsernameByEmailAsync(final XmlRpcListener listener, String email) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("sendUsernameByEmailAsync: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ listener.onError(result);
+ return;
+ }
+
+ listener.onUsernameSent(result);
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "recover_username_from_email", email);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public String sendUsernameByEmail(String email) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("recover_username_from_email", email);
+ String result = (String)object;
+ Log.d("sendUsernameByEmail: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ return null;
+ }
+ return result;
+
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return null;
+ }
+
+ public void verifySignatureAsync(final XmlRpcListener listener, String payload, String signature) {
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("verifySignatureAsync: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ listener.onError(result);
+ return;
+ }
+
+ listener.onSignatureVerified("OK".equals(result));
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "verify_payload_signature", payload, signature);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public boolean verifySignature(String payload, String signature) {
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("verify_payload_signature", payload, signature);
+ String result = (String)object;
+ Log.d("verifySignature: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ return false;
+ }
+ return "OK".equals(result);
+
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return false;
+ }
+
+ public void getRemoteProvisioningFilenameAsync(final XmlRpcListener listener,String username, String domain, String password){
+ if (mXmlRpcClient != null) {
+ mXmlRpcClient.callAsync(new XMLRPCCallback() {
+ @Override
+ public void onServerError(long id, XMLRPCServerException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+
+ @Override
+ public void onResponse(long id, Object object) {
+ String result = (String)object;
+ Log.d("getRemoteProvisioningFilenameAsync: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ listener.onError(result);
+ return;
+ }
+
+ listener.onRemoteProvisioningFilenameSent(result);
+ }
+
+ @Override
+ public void onError(long id, XMLRPCException error) {
+ Log.e(error);
+ listener.onError(error.toString());
+ }
+ }, "get_remote_provisioning_filename", username, domain, password);
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ listener.onError(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ }
+
+ public String getRemoteProvisioningFilename(String username, String domain, String password){
+ if (mXmlRpcClient != null) {
+ try {
+ Object object = mXmlRpcClient.call("get_remote_provisioning_filename", username, domain, password);
+ String result = (String)object;
+ Log.d("getRemoteProvisioningFilename:: " + result);
+
+ if (result.startsWith("ERROR_")) {
+ Log.e(result);
+ return result;
+ }
+ return result;
+
+ } catch (XMLRPCException e) {
+ Log.e(e);
+ }
+ } else {
+ Log.e(CLIENT_ERROR_INVALID_SERVER_URL);
+ }
+ return null;
+ }
+}
diff --git a/src/org/linphone/xmlrpc/XmlRpcListener.java b/src/org/linphone/xmlrpc/XmlRpcListener.java
new file mode 100644
index 000000000..976ad9316
--- /dev/null
+++ b/src/org/linphone/xmlrpc/XmlRpcListener.java
@@ -0,0 +1,19 @@
+package org.linphone.xmlrpc;
+
+public interface XmlRpcListener {
+ public void onError(String error);
+ public void onAccountCreated(String result);
+ public void onAccountExpireFetched(String result);
+ public void onAccountExpireUpdated(String result);
+ public void onAccountActivated(String result);
+ public void onAccountActivatedFetched(boolean isActivated);
+ public void onTrialAccountFetched(boolean isTrial);
+ public void onAccountFetched(boolean isExisting);
+ public void onAccountEmailChanged(String result);
+ public void onAccountPasswordChanged(String result);
+ public void onRecoverPasswordLinkSent(String result);
+ public void onActivateAccountLinkSent(String result);
+ public void onSignatureVerified(boolean success);
+ public void onUsernameSent(String result);
+ public void onRemoteProvisioningFilenameSent(String result);
+}
diff --git a/src/org/linphone/xmlrpc/XmlRpcListenerBase.java b/src/org/linphone/xmlrpc/XmlRpcListenerBase.java
new file mode 100644
index 000000000..9f096c021
--- /dev/null
+++ b/src/org/linphone/xmlrpc/XmlRpcListenerBase.java
@@ -0,0 +1,93 @@
+package org.linphone.xmlrpc;
+
+public class XmlRpcListenerBase implements XmlRpcListener {
+ @Override
+ public void onError(String error) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onAccountCreated(String result) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onAccountExpireFetched(String result) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onAccountActivated(String result) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onAccountActivatedFetched(boolean isActivated) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onTrialAccountFetched(boolean isTrial) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onAccountFetched(boolean isExisting) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onAccountEmailChanged(String result) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onAccountPasswordChanged(String result) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onRecoverPasswordLinkSent(String result) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onActivateAccountLinkSent(String result) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onAccountExpireUpdated(String result) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onSignatureVerified(boolean success) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onUsernameSent(String result) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onRemoteProvisioningFilenameSent(String result) {
+ // TODO Auto-generated method stub
+
+ }
+}