package org.commcare.activities;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.commcare.CommCareApplication;
import org.commcare.dalvik.R;
import org.commcare.preferences.CommCareServerPreferences;
import org.commcare.tasks.ConnectionDiagnosticTask;
import org.commcare.tasks.DataSubmissionListener;
import org.commcare.tasks.LogSubmissionTask;
import org.commcare.utils.MarkupUtil;
import org.commcare.views.ManagedUi;
import org.commcare.views.UiElement;
import org.commcare.views.dialogs.CustomProgressDialog;
import org.javarosa.core.services.Logger;
import org.javarosa.core.services.locale.Localization;
/**
* Activity that will diagnose various connection problems that a user may be facing.
*
* @author srengesh
*/
@ManagedUi(R.layout.connection_diagnostic)
public class ConnectionDiagnosticActivity extends CommCareActivity<ConnectionDiagnosticActivity> {
private static final String TAG = ConnectionDiagnosticActivity.class.getSimpleName();
public static final String logUnsetPostURLMessage = "CCHQ ping test: post URL not set.";
@UiElement(value = R.id.run_connection_test, locale = "connection.test.run")
Button btnRunTest;
@UiElement(value = R.id.output_message, locale = "connection.test.messages")
TextView txtInteractiveMessages;
@UiElement(value = R.id.settings_button, locale = "connection.test.access.settings")
Button settingsButton;
@UiElement(value = R.id.report_button, locale = "connection.test.report.button.message")
Button reportButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
btnRunTest.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ConnectionDiagnosticTask<ConnectionDiagnosticActivity> mConnectionDiagnosticTask =
new ConnectionDiagnosticTask<ConnectionDiagnosticActivity>(getApplicationContext()) {
@Override
//<R> receiver, <C> result.
//<C> is the return from DoTaskBackground, of type ArrayList<Boolean>
protected void deliverResult(ConnectionDiagnosticActivity receiver, ConnectionDiagnosticTask.Test failedTest) {
//user-caused connection issues
if (failedTest == ConnectionDiagnosticTask.Test.isOnline ||
failedTest == ConnectionDiagnosticTask.Test.googlePing) {
//get the appropriate display message based on what the problem is
String displayMessage = failedTest == ConnectionDiagnosticTask.Test.isOnline ?
Localization.get("connection.task.internet.fail")
: Localization.get("connection.task.remote.ping.fail");
receiver.txtInteractiveMessages.setText(displayMessage);
receiver.txtInteractiveMessages.setVisibility(View.VISIBLE);
receiver.settingsButton.setVisibility(View.VISIBLE);
} else if (failedTest == ConnectionDiagnosticTask.Test.commCarePing) {
//unable to ping commcare -- report this to cchq
receiver.txtInteractiveMessages.setText(
Localization.get("connection.task.commcare.html.fail"));
receiver.txtInteractiveMessages.setVisibility(View.VISIBLE);
receiver.reportButton.setVisibility(View.VISIBLE);
} else if (failedTest == null) {
receiver.txtInteractiveMessages.setText(Localization.get("connection.task.success"));
receiver.txtInteractiveMessages.setVisibility(View.VISIBLE);
receiver.settingsButton.setVisibility(View.INVISIBLE);
receiver.reportButton.setVisibility(View.INVISIBLE);
}
}
@Override
protected void deliverUpdate(ConnectionDiagnosticActivity receiver, String... update) {
receiver.txtInteractiveMessages.setText((Localization.get("connection.test.update.message")));
}
@Override
protected void deliverError(ConnectionDiagnosticActivity receiver, Exception e) {
receiver.txtInteractiveMessages.setText(Localization.get("connection.test.error.message"));
receiver.transplantStyle(txtInteractiveMessages, R.layout.template_text_notification_problem);
}
};
mConnectionDiagnosticTask.connect(ConnectionDiagnosticActivity.this);
mConnectionDiagnosticTask.executeParallel();
}
});
//Set a button that allows you to change your airplane mode settings
this.settingsButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));
}
});
this.reportButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String url = LogSubmissionTask.getSubmissionUrl(CommCareApplication.instance().getCurrentApp().getAppPreferences());
if (url != null) {
DataSubmissionListener dataListener;
dataListener =
CommCareApplication.instance().getSession().getListenerForSubmissionNotification(R.string.submission_logs_title);
LogSubmissionTask reportSubmitter =
new LogSubmissionTask(
true,
dataListener, url);
reportSubmitter.execute();
ConnectionDiagnosticActivity.this.finish();
Toast.makeText(
CommCareApplication.instance(),
Localization.get("connection.task.report.commcare.popup"),
Toast.LENGTH_LONG).show();
} else {
Logger.log(ConnectionDiagnosticTask.CONNECTION_DIAGNOSTIC_REPORT, logUnsetPostURLMessage);
ConnectionDiagnosticActivity.this.txtInteractiveMessages.setText(MarkupUtil.localizeStyleSpannable(ConnectionDiagnosticActivity.this, "connection.task.unset.posturl"));
ConnectionDiagnosticActivity.this.txtInteractiveMessages.setVisibility(View.VISIBLE);
}
}
});
}
/**
* Implementation of generateProgressDialog() for DialogController -- other methods
* handled entirely in CommCareActivity
*/
@Override
public CustomProgressDialog generateProgressDialog(int taskId) {
if (taskId == ConnectionDiagnosticTask.CONNECTION_ID) {
String title = Localization.get("connection.test.run.title");
String message = Localization.get("connection.test.now.running");
CustomProgressDialog dialog = CustomProgressDialog.newInstance(title, message, taskId);
dialog.setCancelable();
return dialog;
} else {
Log.w(TAG, "taskId passed to generateProgressDialog does not match "
+ "any valid possibilities in ConnectionDiagnosticActivity");
return null;
}
}
}