microsoft.aspnet.signalr.client.test.integration.android.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for microsoft.aspnet.signalr.client.test.integration.android.MainActivity.java

Source

/*
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();
    }

}