com.microsoft.windowsazure.messaging.e2etestapp.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.windowsazure.messaging.e2etestapp.MainActivity.java

Source

/*
Copyright (c) Microsoft Open Technologies, Inc.
All Rights Reserved
Apache 2.0 License
     
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at
     
 http://www.apache.org/licenses/LICENSE-2.0
     
   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
     
See the Apache Version 2.0 License for specific language governing permissions and limitations under the License.
 */
package com.microsoft.windowsazure.messaging.e2etestapp;

import java.net.URI;
import java.util.List;

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;

import com.microsoft.windowsazure.messaging.e2etestapp.framework.TestCase;
import com.microsoft.windowsazure.messaging.e2etestapp.framework.TestExecutionCallback;
import com.microsoft.windowsazure.messaging.e2etestapp.framework.TestGroup;
import com.microsoft.windowsazure.messaging.e2etestapp.framework.TestResult;
import com.microsoft.windowsazure.messaging.e2etestapp.tests.MiscTests;

@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);

        ApplicationContext.setContext(this);

        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, NotificationHubsPreferenceActivity.class));
            return true;

        case R.id.menu_run_tests:
            if (ApplicationContext.getNotificationHubEndpoint().trim().equals("")
                    || ApplicationContext.getNotificationHubKeyName().trim().equals("")
                    || ApplicationContext.getNotificationHubKeyValue().trim().equals("")
                    || ApplicationContext.getNotificationHubName().trim().equals("")) {
                startActivity(new Intent(this, NotificationHubsPreferenceActivity.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("NOTIFICATIONHUBS-E2ETESTAPP", 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();
    }

}