com.nkahoang.screenstandby.settings.UpdateChecker.java Source code

Java tutorial

Introduction

Here is the source code for com.nkahoang.screenstandby.settings.UpdateChecker.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Hoang Nguyen.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * 
 * Contributors:
 *     Hoang Nguyen - initial API and implementation
 ******************************************************************************/
package com.nkahoang.screenstandby.settings;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import org.apache.http.params.BasicHttpParams;

import com.nkahoang.screenstandby.Logger;
import com.nkahoang.screenstandby.R;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.AsyncTask;
import android.text.Html;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Toast;

public class UpdateChecker {

    public static final String updateServiceURI = "http://www.screenstandby.com/update.php";
    public static final String channel = "Playstore";
    //public static final String channel = "XDA";
    public static ProgressDialog progressDialog;

    public static void CheckForUpdate(Context c) {
        progressDialog = new ProgressDialog(c);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER | ProgressDialog.THEME_HOLO_DARK);
        progressDialog.setTitle("Checking for update");
        progressDialog.setMessage("Please wait...\n");
        progressDialog.setCancelable(false);
        progressDialog.setIcon(android.R.drawable.ic_menu_upload);
        progressDialog.setIndeterminate(true);
        progressDialog.show();
        new LoadViewTask(c).execute();
    }

    private static class LoadViewTask extends AsyncTask<Void, Integer, Void> {
        private Context context;
        private boolean hasNew;
        private byte error;
        private String name, date, url, changes;
        private int code;

        public LoadViewTask(Context context) {
            this.context = context;
        }

        @Override
        protected Void doInBackground(Void... params) {
            error = 0;
            PackageInfo pInfo;
            try {
                pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
                HttpClient client = new DefaultHttpClient();
                HttpGet httpReq = new HttpGet(updateServiceURI + "?v=" + pInfo.versionCode + "&ch="
                        + (channel.equals("XDA") ? "xda" : "ps"));
                httpReq.setHeader("Content-type", "application/json");
                //BasicHttpParams p = new BasicHttpParams();
                //httpReq.setParams(p.setIntParameter("v", pInfo.versionCode).setParameter("ch", channel.equals("XDA")?"xda":"ps"));
                HttpResponse res = client.execute(httpReq);
                HttpEntity entity = res.getEntity();
                BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"), 8);
                StringBuilder sb = new StringBuilder();

                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                String result = sb.toString();
                JSONObject jObject = new JSONObject(result);
                hasNew = jObject.getBoolean("new");
                if (hasNew) {
                    name = jObject.getString("name");
                    code = jObject.getInt("code");
                    date = jObject.getString("date");
                    url = jObject.getString("url");
                    changes = jObject.getString("changes");
                }
            } catch (NameNotFoundException e) {
                Logger.Log(context, e);
                error = 1;
            } catch (ClientProtocolException e) {
                Logger.Log(context, e);
                error = 2;
            } catch (IOException e) {
                Logger.Log(context, e);
                error = 3;
            } catch (JSONException e) {
                Logger.Log(context, e);
                error = 4;
            }
            return null;
        }

        //after executing the code in the thread  
        @Override
        protected void onPostExecute(Void result) {
            progressDialog.dismiss();
            if (error == 0) {
                if (hasNew) {
                    AlertDialog.Builder b = new AlertDialog.Builder(context);
                    b.setTitle("New version: " + name);
                    b.setMessage(Html
                            .fromHtml("Changes version <b>" + name + "</b> <small><i>(" + date + ")</i></small>"));
                    TextView v = new TextView(context);
                    v.setText(Html.fromHtml(changes));
                    v.setPadding(10, 0, 10, 0);
                    b.setView(v);
                    b.setNegativeButton("Dismiss", updateDialogClickListener);
                    b.setPositiveButton("Take me to update", updateDialogClickListener);
                    b.create().show();
                    Toast.makeText(context,
                            Html.fromHtml("<b><font color='#8ebc00'>Update found: </font></b> version " + name),
                            Toast.LENGTH_SHORT).show();
                } else
                    Toast.makeText(context, Html.fromHtml(
                            "<b><font color='#3399ff'>No new update found</font></b><br/>You are running the latest version"),
                            Toast.LENGTH_SHORT).show();
            } else {
                String err = "";
                switch (error) {
                case 1:
                    err = "Invalid app signature (01)";
                    break;
                case 2:
                case 3:
                    err = "Cannot connect to update server.<br/>Please check your internet connection.(02)";
                    break;
                case 4:
                    err = "Server is having error (04).<br/>Please check again later";
                    break;
                }
                Toast.makeText(context,
                        Html.fromHtml("<b><font color='#ff2000'>Error while checking update</font></b><br/>" + err),
                        Toast.LENGTH_SHORT).show();
            }
        }

        private DialogInterface.OnClickListener updateDialogClickListener = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                case DialogInterface.BUTTON_NEGATIVE:
                    dialog.dismiss();
                    break;
                case DialogInterface.BUTTON_POSITIVE:
                    Intent i = new Intent(Intent.ACTION_VIEW);
                    i.setData(Uri.parse(url));
                    context.startActivity(i);
                    dialog.dismiss();
                    break;
                }
            }
        };
    }
}