de.nico.asura.Main.java Source code

Java tutorial

Introduction

Here is the source code for de.nico.asura.Main.java

Source

package de.nico.asura;

/* 
 * Author: Nico Alt
 * See the file "LICENSE.txt" for the full license governing this code.
 */

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.app.ProgressDialog;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import de.nico.asura.activities.AuthWebView1;
import de.nico.asura.activities.Preferences;
import de.nico.asura.activities.WebView1;
import de.nico.asura.tools.JSONParser;
import de.nico.asura.tools.Utils;

public class Main extends Activity {

    // Data from JSON file
    private ArrayList<HashMap<String, String>> downloadList = new ArrayList<HashMap<String, String>>();

    // JSON Node Names
    private static final String TAG_TYPE = "plans";
    private static final String TAG_NAME = "name";
    private static final String TAG_FILENAME = "filename";
    private static final String TAG_URL = "url";

    private static String offline;
    private static String noPDF;
    private static String localLoc;
    private static String jsonURL;

    // For PDF Download
    private static DownloadManager downloadManager;
    private static long downloadID;
    private static File file;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        update();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle presses on the action bar items
        switch (item.getItemId()) {

        case R.id.action_prefs:
            startActivity(new Intent(this, Preferences.class));
            return true;

        case R.id.action_WebView1:
            if (!(Utils.isNetworkAvailable(this)))
                Utils.makeLongToast(this, offline);
            else
                startActivity(new Intent(this, WebView1.class));
            return true;

        case R.id.action_Link1:
            if (!(Utils.isNetworkAvailable(this)))
                Utils.makeLongToast(this, offline);
            else
                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.menu_Link_1_url))));
            return true;

        case R.id.action_AuthWebView1:
            if (!(Utils.isNetworkAvailable(this)))
                Utils.makeLongToast(this, offline);
            else
                startActivity(new Intent(this, AuthWebView1.class));
            return true;

        default:
            return super.onOptionsItemSelected(item);

        }

    }

    private static void checkDir() {
        File dir = new File(Environment.getExternalStorageDirectory() + "/" + localLoc + "/");
        if (!dir.exists())
            dir.mkdir();
    }

    private void update() {
        downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);

        offline = getString(R.string.status_offline);
        noPDF = getString(R.string.except_nopdf);
        localLoc = getString(R.string.gen_loc);
        jsonURL = getString(R.string.gen_json);

        checkDir();

        // Parse the JSON file of the plans from the URL
        if (!(Utils.isNetworkAvailable(this))) {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put(TAG_NAME, offline);
            downloadList.add(map);

            setList();

        } else
            new JSONParse().execute();
    }

    private void setList() {
        ListView list = (ListView) findViewById(R.id.listView_main);
        ListAdapter adapter = new SimpleAdapter(this, downloadList, android.R.layout.simple_list_item_1,
                new String[] { TAG_NAME }, new int[] { android.R.id.text1 });
        list.setAdapter(adapter);

        // Do nothing when there is no Internet
        if (!(Utils.isNetworkAvailable(this))) {
            return;
        }
        // React when user click on item in the list
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View v, int pos, long id) {

                Uri downloadUri = Uri.parse(downloadList.get(pos).get(TAG_URL));
                String title = downloadList.get(pos).get(TAG_NAME);
                file = new File(Environment.getExternalStorageDirectory() + "/" + localLoc + "/"
                        + downloadList.get(pos).get(TAG_FILENAME) + ".pdf");
                Uri dest = Uri.fromFile(file);

                if (file.exists()) {
                    Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
                    pdfIntent.setDataAndType(dest, "application/pdf");
                    pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                    try {
                        startActivity(pdfIntent);
                    } catch (ActivityNotFoundException e) {
                        Utils.makeLongToast(Main.this, noPDF);
                        Log.e("ActivityNotFoundException", e.toString());
                    }
                    return;
                }

                // Download PDF
                Request request = new Request(downloadUri);
                request.setTitle(title).setDestinationUri(dest);
                downloadID = downloadManager.enqueue(request);
            }

        });

    }

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
        registerReceiver(downloadReceiver, intentFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(downloadReceiver);
    }

    private BroadcastReceiver downloadReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context arg0, Intent arg1) {
            DownloadManager.Query query = new DownloadManager.Query();
            query.setFilterById(downloadID);
            Cursor cursor = downloadManager.query(query);

            if (cursor.moveToFirst()) {
                int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
                int status = cursor.getInt(columnIndex);

                // Success?
                if (status == DownloadManager.STATUS_SUCCESSFUL) {

                    Uri path = Uri.fromFile(file);
                    Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
                    pdfIntent.setDataAndType(path, "application/pdf");
                    pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                    try {
                        startActivity(pdfIntent);
                    } catch (ActivityNotFoundException e) {
                        Utils.makeLongToast(Main.this, noPDF);
                        Log.e("ActivityNotFoundException", e.toString());
                    }

                } else if (status == DownloadManager.STATUS_FAILED) {
                    Utils.makeLongToast(Main.this, getString(R.string.down_error));

                } else if (status == DownloadManager.STATUS_PAUSED) {
                    Utils.makeLongToast(Main.this, getString(R.string.down_paused));

                } else if (status == DownloadManager.STATUS_PENDING) {
                    Utils.makeLongToast(Main.this, getString(R.string.down_pending));

                } else if (status == DownloadManager.STATUS_RUNNING) {
                    Utils.makeLongToast(Main.this, getString(R.string.down_running));

                }

            }
        }

    };

    private class JSONParse extends AsyncTask<String, String, JSONObject> {

        private ProgressDialog pDialog;

        @Override
        protected void onPreExecute() {

            super.onPreExecute();

            // Show ProgressDialog while loading data from URL
            pDialog = new ProgressDialog(Main.this);
            pDialog.setMessage(getString(R.string.load_data));
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();

        }

        @Override
        protected JSONObject doInBackground(String... args) {

            JSONObject json = JSONParser.getJSONFromUrl(jsonURL);

            return json;

        }

        @Override
        protected void onPostExecute(JSONObject json) {

            // Close ProgressDialog
            pDialog.dismiss();

            try {

                // Get JSON Array from URL
                JSONArray j_plans = json.getJSONArray(TAG_TYPE);

                for (int i = 0; i < j_plans.length(); i++) {
                    JSONObject c = j_plans.getJSONObject(i);

                    // Storing JSON item in a Variable
                    String ver = c.getString(TAG_FILENAME);
                    String name = c.getString(TAG_NAME);
                    String api = c.getString(TAG_URL);

                    // Adding value HashMap key => value
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put(TAG_FILENAME, ver);
                    map.put(TAG_NAME, name);
                    map.put(TAG_URL, api);
                    downloadList.add(map);

                    setList();

                }

            }

            catch (JSONException e) {
                Log.e("JSONException", e.toString());

            }

        }

    }
}