/*
Copyright (c) Microsoft Open Technologies, Inc.
All Rights Reserved
See License.txt in the project root for license information.
*/
package microsoft.aspnet.signalr.client.test.integration.android;
import java.net.URI;
import java.util.List;
import microsoft.aspnet.signalr.client.android.test.integration.R;
import microsoft.aspnet.signalr.client.test.integration.ApplicationContext;
import microsoft.aspnet.signalr.client.test.integration.framework.TestCase;
import microsoft.aspnet.signalr.client.test.integration.framework.TestExecutionCallback;
import microsoft.aspnet.signalr.client.test.integration.framework.TestGroup;
import microsoft.aspnet.signalr.client.test.integration.framework.TestResult;
import microsoft.aspnet.signalr.client.test.integration.tests.MiscTests;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.ClipboardManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;
@SuppressWarnings("deprecation")
public class MainActivity extends Activity {
private StringBuilder mLog;
private ListView mTestCaseList;
private Spinner mTestGroupSpinner;
@Override
public void onConfigurationChanged(Configuration newConfig) {
// don't restart the activity. Just process the configuration change
super.onConfigurationChanged(newConfig);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidTestPlatformContext testPlatformContext = new AndroidTestPlatformContext(this);
ApplicationContext.setTestPlatformContext(testPlatformContext);
setContentView(R.layout.activity_main);
mTestCaseList = (ListView) findViewById(R.id.testCaseList);
TestCaseAdapter testCaseAdapter = new TestCaseAdapter(this, R.layout.row_list_test_case);
mTestCaseList.setAdapter(testCaseAdapter);
mTestGroupSpinner = (Spinner) findViewById(R.id.testGroupSpinner);
ArrayAdapter<TestGroup> testGroupAdapter = new ArrayAdapter<TestGroup>(this, android.R.layout.simple_spinner_item);
mTestGroupSpinner.setAdapter(testGroupAdapter);
mTestGroupSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
selectTestGroup(pos);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// do nothing
}
});
refreshTestGroupsAndLog();
}
private void selectTestGroup(int pos) {
TestGroup tg = (TestGroup) mTestGroupSpinner.getItemAtPosition(pos);
List<TestCase> testCases = tg.getTestCases();
fillTestList(testCases);
}
@SuppressWarnings("unchecked")
private void refreshTestGroupsAndLog() {
mLog = new StringBuilder();
ArrayAdapter<TestGroup> adapter = (ArrayAdapter<TestGroup>) mTestGroupSpinner.getAdapter();
adapter.clear();
adapter.add(new MiscTests());
mTestGroupSpinner.setSelection(0);
selectTestGroup(0);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_settings:
startActivity(new Intent(this, SignalRPreferenceActivity.class));
return true;
case R.id.menu_run_tests:
if (ApplicationContext.getServerUrl().trim().equals("") ) {
startActivity(new Intent(this, SignalRPreferenceActivity.class));
} else {
runTests();
}
return true;
case R.id.menu_check_all:
changeCheckAllTests(true);
return true;
case R.id.menu_uncheck_all:
changeCheckAllTests(false);
return true;
case R.id.menu_reset:
refreshTestGroupsAndLog();
return true;
case R.id.menu_view_log:
AlertDialog.Builder logDialogBuilder = new AlertDialog.Builder(this);
logDialogBuilder.setTitle("Log");
final WebView webView = new WebView(this);
String logContent = TextUtils.htmlEncode(mLog.toString()).replace("\n", "<br />");
String logHtml = "<html><body><pre>" + logContent + "</pre></body></html>";
webView.loadData(logHtml, "text/html", "utf-8");
logDialogBuilder.setPositiveButton("Copy", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
clipboardManager.setText(mLog.toString());
}
});
final String postContent = mLog.toString();
logDialogBuilder.setNeutralButton("Post data", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
String url = ApplicationContext.getLogPostURL();
if (url != null && url.trim() != "") {
url = url + "?platform=android";
HttpPost post = new HttpPost();
post.setEntity(new StringEntity(postContent, "utf-8"));
post.setURI(new URI(url));
new DefaultHttpClient().execute(post);
}
} catch (Exception e) {
// Wasn't able to post the data. Do nothing
}
return null;
}
}.execute();
}
});
logDialogBuilder.setView(webView);
logDialogBuilder.create().show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void changeCheckAllTests(boolean check) {
TestGroup tg = (TestGroup) mTestGroupSpinner.getSelectedItem();
List<TestCase> testCases = tg.getTestCases();
for (TestCase testCase : testCases) {
testCase.setEnabled(check);
}
fillTestList(testCases);
}
private void fillTestList(List<TestCase> testCases) {
TestCaseAdapter testCaseAdapter = (TestCaseAdapter) mTestCaseList.getAdapter();
testCaseAdapter.clear();
for (TestCase testCase : testCases) {
testCaseAdapter.add(testCase);
}
}
private void runTests() {
TestGroup group = (TestGroup) mTestGroupSpinner.getSelectedItem();
group.runTests(new TestExecutionCallback() {
@Override
public void onTestStart(TestCase test) {
TestCaseAdapter adapter = (TestCaseAdapter) mTestCaseList.getAdapter();
adapter.notifyDataSetChanged();
log("TEST START", test.getName());
}
@Override
public void onTestGroupComplete(TestGroup group, List<TestResult> results) {
log("TEST GROUP COMPLETED", group.getName() + " - " + group.getStatus().toString());
logSeparator();
}
@Override
public void onTestComplete(TestCase test, TestResult result) {
Throwable e = result.getException();
String exMessage = "-";
if (e != null) {
StringBuilder sb = new StringBuilder();
while (e != null) {
sb.append(e.getClass().getSimpleName() + ": ");
sb.append(e.getMessage());
sb.append(" // ");
e = e.getCause();
}
exMessage = sb.toString();
}
final TestCaseAdapter adapter = (TestCaseAdapter) mTestCaseList.getAdapter();
runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.notifyDataSetChanged();
}
});
log("TEST LOG", test.getLog());
log("TEST COMPLETED", test.getName() + " - " + result.getStatus().toString() + " - Ex: " + exMessage);
logSeparator();
}
});
}
private void logSeparator() {
mLog.append("\n");
mLog.append("----\n");
mLog.append("\n");
}
@SuppressWarnings("unused")
private void log(String content) {
log("Info", content);
}
private void log(String title, String content) {
String message = title + " - " + content;
Log.d("SIGNALR-TEST-INTEGRATION", message);
mLog.append(message);
mLog.append('\n');
}
/**
* Creates a dialog and shows it
*
* @param exception
* The exception to show in the dialog
* @param title
* The dialog title
*/
@SuppressWarnings("unused")
private void createAndShowDialog(Exception exception, String title) {
createAndShowDialog(exception.toString(), title);
}
/**
* Creates a dialog and shows it
*
* @param message
* The dialog message
* @param title
* The dialog title
*/
private void createAndShowDialog(String message, String title) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(message);
builder.setTitle(title);
builder.create().show();
}
}