package org.commcare.dalvik.activities;
import org.commcare.android.framework.CommCareActivity;
import org.commcare.android.framework.ManagedUi;
import org.commcare.android.framework.UiElement;
import org.commcare.android.tasks.ConnectionDiagnosticTask;
import org.commcare.android.tasks.LogSubmissionTask;
import org.commcare.dalvik.R;
import org.commcare.dalvik.application.CommCareApplication;
import org.commcare.dalvik.dialogs.CustomProgressDialog;
import org.javarosa.core.services.Logger;
import org.javarosa.core.services.locale.Localization;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
/**
* 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> {
public static final String logUnsetPostURLMessage = "CCHQ ping test: post URL not set.";
@UiElement(R.id.screen_bulk_image1)
ImageView banner;
@UiElement(value = R.id.connection_test_prompt, locale="connection.test.prompt")
TextView connectionPrompt;
@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;
/*
* (non-Javadoc)
* @see org.commcare.android.framework.CommCareActivity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
btnRunTest.setOnClickListener(new OnClickListener()
{
/*
* (non-Javadoc)
* @see android.view.View.OnClickListener#onClick(android.view.View)
*/
@Override
public void onClick(View v)
{
ConnectionDiagnosticTask<ConnectionDiagnosticActivity> mConnectionDiagnosticTask =
new ConnectionDiagnosticTask<ConnectionDiagnosticActivity>(
getApplicationContext(),
CommCareApplication._().getCurrentApp().getCommCarePlatform())
{
/*
* (non-Javadoc)
* @see org.commcare.android.tasks.templates.CommCareTask#deliverResult(java.lang.Object, java.lang.Object)
*/
@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);
}
//unable to ping commcare -- report this to cchq
else if(failedTest == ConnectionDiagnosticTask.Test.commCarePing)
{
receiver.txtInteractiveMessages.setText(
Localization.get("connection.task.commcare.html.fail"));
receiver.txtInteractiveMessages.setVisibility(View.VISIBLE);
receiver.reportButton.setVisibility(View.VISIBLE);
}
//all is well
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);
}
return;
}
/*
* (non-Javadoc)
* @see org.commcare.android.tasks.templates.CommCareTask#deliverUpdate(java.lang.Object, java.lang.Object[])
*/
@Override
protected void deliverUpdate(ConnectionDiagnosticActivity receiver, String... update)
{
receiver.txtInteractiveMessages.setText((Localization.get("connection.test.update.message")));
}
/*
* (non-Javadoc)
* @see org.commcare.android.tasks.templates.CommCareTask#deliverError(java.lang.Object, java.lang.Exception)
*/
@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.execute();
}
});
//Set a button that allows you to change your airplane mode settings
this.settingsButton.setOnClickListener( new OnClickListener()
{
/*
* (non-Javadoc)
* @see android.view.View.OnClickListener#onClick(android.view.View)
*/
@Override
public void onClick(View v)
{
startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));
}
});
this.reportButton.setOnClickListener( new OnClickListener()
{
/*
* (non-Javadoc)
* @see android.view.View.OnClickListener#onClick(android.view.View)
*/
@Override
public void onClick(View v)
{
SharedPreferences settings =
CommCareApplication._().getCurrentApp().getAppPreferences();
String url = settings.getString("PostURL", null);
if(url != null)
{
LogSubmissionTask reportSubmitter =
new LogSubmissionTask(
CommCareApplication._(),
true,
CommCareApplication._().getSession().startDataSubmissionListener(
R.string.submission_logs_title), url);
reportSubmitter.execute();
ConnectionDiagnosticActivity.this.finish();
Toast.makeText(
CommCareApplication._(),
Localization.get("connection.task.report.commcare.popup"),
Toast.LENGTH_LONG).show();
}
else
{
Logger.log(ConnectionDiagnosticTask.CONNECTION_DIAGNOSTIC_REPORT, logUnsetPostURLMessage);
ConnectionDiagnosticActivity.this.txtInteractiveMessages.setText(Localization.get("connection.task.unset.posturl"));
ConnectionDiagnosticActivity.this.txtInteractiveMessages.setVisibility(View.VISIBLE);
}
}
});
}
/*
* (non-Javadoc)
* @see org.commcare.android.framework.CommCareActivity#generateProgressDialog(int)
*
* 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 {
System.out.println("WARNING: taskId passed to generateProgressDialog does not match "
+ "any valid possibilities in ConnectionDiagnosticActivity");
return null;
}
}
}