com.android.nobadgift.DashboardActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.android.nobadgift.DashboardActivity.java

Source

/*
 * Copyright (C) 2011 Wglxy.com
 *
 * 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.
 */

package com.android.nobadgift;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.DialogInterface.OnDismissListener;
import android.content.SharedPreferences.Editor;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

/**
 * This is the base class for activities in the dashboard application.
 * It implements methods that are useful to all top level activities.
 * That includes: (1) stub methods for all the activity lifecycle methods;
 * (2) onClick methods for clicks on home, search, feature 1, feature 2, etc.
 * (3) a method for displaying a message to the screen via the Toast class.
 *
 */

public abstract class DashboardActivity extends Activity {
    public static String urlContent = null;
    private static final int IO_BUFFER_SIZE = 4 * 1024;
    public static String itemURL;
    public static String imageURL;
    public static String vendorInfo;
    public static String priceInfo;
    public static String itemName;
    private final Handler uiHandler = new Handler();
    public Bitmap retrievedImage;
    public static ProgressDialog progDialog;
    public static String wishlist_id;
    public static boolean wishlistClick;
    public static String wishlist_name;

    /**
     * onCreate - called when the activity is first created.
     *
     * Called when the activity is first created. 
     * This is where you should do all of your normal static set up: create views, bind data to lists, etc. 
     * This method also provides you with a Bundle containing the activity's previously frozen state, if there was one.
     * 
     * Always followed by onStart().
     *
     */

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_default);
    }

    /**
     * onDestroy
     * The final call you receive before your activity is destroyed. 
     * This can happen either because the activity is finishing (someone called finish() on it, 
     * or because the system is temporarily destroying this instance of the activity to save space. 
     * You can distinguish between these two scenarios with the isFinishing() method.
     *
     */

    protected void onDestroy() {
        super.onDestroy();
    }

    /**
     * onPause
     * Called when the system is about to start resuming a previous activity. 
     * This is typically used to commit unsaved changes to persistent data, stop animations 
     * and other things that may be consuming CPU, etc. 
     * Implementations of this method must be very quick because the next activity will not be resumed 
     * until this method returns.
     * Followed by either onResume() if the activity returns back to the front, 
     * or onStop() if it becomes invisible to the user.
     *
     */

    protected void onPause() {
        super.onPause();
    }

    /**
     * onRestart
     * Called after your activity has been stopped, prior to it being started again.
     * Always followed by onStart().
     *
     */

    protected void onRestart() {
        super.onRestart();
    }

    /**
     * onResume
     * Called when the activity will start interacting with the user. 
     * At this point your activity is at the top of the activity stack, with user input going to it.
     * Always followed by onPause().
     *
     */

    protected void onResume() {
        super.onResume();
    }

    /**
     * onStart
     * Called when the activity is becoming visible to the user.
     * Followed by onResume() if the activity comes to the foreground, or onStop() if it becomes hidden.
     *
     */

    protected void onStart() {
        super.onStart();
    }

    /**
     * onStop
     * Called when the activity is no longer visible to the user
     * because another activity has been resumed and is covering this one. 
     * This may happen either because a new activity is being started, an existing one 
     * is being brought in front of this one, or this one is being destroyed.
     *
     * Followed by either onRestart() if this activity is coming back to interact with the user, 
     * or onDestroy() if this activity is going away.
     */

    protected void onStop() {
        super.onStop();
    }

    /**
     */
    // Click Methods

    /**
     * Handle the click on the home button.
     * 
     * @param v View
     * @return void
     */

    public void onClickHome(View v) {
        goHome(this);
    }

    /**
     * Handle the click on the search button.
     * 
     * @param v View
     * @return void
     */

    public void onClickSearch(View v) {
        urlContent = null;
        wishlistClick = false;
        Intent intent = new Intent("com.google.zxing.client.android.SCAN");
        //intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
        startActivityForResult(intent, 0);
        //startActivity (new Intent(getApplicationContext(), SearchActivity.class));
    }

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == 0) {
            if (resultCode == RESULT_OK) {
                final String scanResult = intent.getStringExtra("SCAN_RESULT");
                progDialog = ProgressDialog.show(this, "", "Fetching information...", true);
                new Thread(new Runnable() {
                    public void run() {
                        runOnUiThread(new Runnable() {
                            public void run() {
                                retrieveProductInfo(scanResult);
                                retrievedImage = doInBackground(imageURL);
                                if (urlContent != null) {
                                    displayConfirmationDialog();
                                } else {
                                    trace("Item not found.");
                                }
                            }
                        });
                        progDialog.dismiss();
                    }
                }).start();

            } else if (resultCode == RESULT_CANCELED) {
                trace("Scanning aborted...");
            }
        }
    }

    private void displayConfirmationDialog() {
        try {
            Dialog dialog = new Dialog(this);
            dialog.setContentView(R.layout.custom_dialog);
            dialog.setTitle("Successfully Scanned!");
            dialog.setCanceledOnTouchOutside(true);
            dialog.setCancelable(true);
            dialog.setOnDismissListener(new OnDismissListener() {
                public void onDismiss(DialogInterface dialog) {
                    displayInfoDialog();
                }
            });
            TextView text = (TextView) dialog.findViewById(R.id.dialogText);
            text.setText("\"" + itemName + "\"");
            ImageView image = (ImageView) dialog.findViewById(R.id.dialogImage);
            image.setImageBitmap(retrievedImage);
            dialog.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void addToWishlist(String wishlist_id) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("https://nobadgift.com/app/webroot/index.php?url=rests/add_gift/");

        try {
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("user_id", HomeActivity.userID));
            nameValuePairs.add(new BasicNameValuePair("wishlist_id", wishlist_id));
            nameValuePairs.add(new BasicNameValuePair("item_name", DashboardActivity.itemName));
            nameValuePairs.add(new BasicNameValuePair("item_url", DashboardActivity.itemURL));
            nameValuePairs.add(new BasicNameValuePair("image_url", DashboardActivity.imageURL));
            nameValuePairs.add(new BasicNameValuePair("vendor_name", DashboardActivity.vendorInfo));
            nameValuePairs.add(new BasicNameValuePair("price", DashboardActivity.priceInfo));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String responseBody = httpclient.execute(httppost, responseHandler);

            XPath xpath = XPathFactory.newInstance().newXPath();
            String status = xpath.evaluate("nobadgift/rests/@status",
                    new InputSource(new StringReader(responseBody)));
            if (status.compareTo("1") == 0) {
                toast("\"" + DashboardActivity.itemName + "\" was successfully added to the wishlist.");
                DashboardActivity.urlContent = null;
            } else {
                toast("The item failed to be added to the wishlist.");
            }
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        } catch (XPathExpressionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    protected void displayInfoDialog() {
        if (wishlistClick) {
            urlContent = null;
            new AlertDialog.Builder(this).setIcon(android.R.drawable.star_big_on)
                    .setMessage("Would you like to add \"" + itemName + "\" to this wishlist?")
                    .setTitle("Wishlist: " + wishlist_name)
                    .setNegativeButton("Add to this Wishlist", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            addToWishlist(wishlist_id);
                        }
                    }).setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            urlContent = null;
                        }
                    }).show();
        } else {
            SharedPreferences appSharedPrefs = PreferenceManager
                    .getDefaultSharedPreferences(this.getApplicationContext());
            Boolean forgetMenu = appSharedPrefs.getBoolean("forgetTipMenu", false);
            if (!forgetMenu) {
                new AlertDialog.Builder(this).setIcon(android.R.drawable.star_big_on).setMessage(
                        "To add this item to a wishlist, simply select one of your available wishlist and accept the confirmation.")
                        .setTitle("Tip: Add To Wishlist")
                        .setNegativeButton("Don't Show Again", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                forgetTipMenu();
                            }
                        }).setPositiveButton("Close", null).show();
            }
        }
    }

    protected void forgetTipMenu() {
        SharedPreferences appSharedPrefs = PreferenceManager
                .getDefaultSharedPreferences(this.getApplicationContext());
        Editor prefsEditor = appSharedPrefs.edit();
        prefsEditor.putBoolean("forgetTipMenu", true);
        prefsEditor.commit();
    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mIcon11 = null;
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mIcon11 = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return mIcon11;
    }

    public void retrieveProductInfo(String barcode) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet request = new HttpGet(
                "https://www.googleapis.com/shopping/search/v1/public/products?key=AIzaSyAy_I77Os63-PKfuxDc4eY_scgo-aylCq4&country=US&q="
                        + barcode);
        ResponseHandler<String> handler = new BasicResponseHandler();
        String result = "";
        try {
            result = httpclient.execute(request, handler);
            Log.d("Result", result);
            JSONObject object = (JSONObject) new JSONTokener(result).nextValue();
            JSONArray items = object.getJSONArray("items");
            JSONObject item = (JSONObject) new JSONTokener(items.getString(0)).nextValue();
            String productInfo = item.getString("product");

            JSONObject product = (JSONObject) new JSONTokener(productInfo).nextValue();
            itemName = product.getString("title");
            itemURL = product.getString("link");

            JSONArray images = product.getJSONArray("images");
            JSONObject image = (JSONObject) new JSONTokener(images.getString(0)).nextValue();
            imageURL = image.getString("link");

            JSONObject vendors = product.getJSONObject("author");
            vendorInfo = vendors.getString("name");

            JSONArray prices = product.getJSONArray("inventories");
            JSONObject price = (JSONObject) new JSONTokener(prices.getString(0)).nextValue();
            priceInfo = price.getString("price");

            Log.d("API - itemName", itemName);
            Log.d("API - itemURL", itemURL);
            Log.d("API - imageURL", imageURL);
            Log.d("API - author", vendorInfo);
            Log.d("API - price", priceInfo);

            urlContent = barcode;
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        httpclient.getConnectionManager().shutdown();
    }

    /**
     * Handle the click on the About button.
     * 
     * @param v View
     * @return void
     */

    public void onClickAbout(View v) {
        //startActivity (new Intent(getApplicationContext(), AboutActivity.class));
        Uri uriUrl = Uri.parse("https://www.nobadgift.com/");
        Intent launchBrowser = new Intent(Intent.ACTION_VIEW, uriUrl);
        startActivity(launchBrowser);
    }

    /**
     * Handle the click of a Feature button.
     * 
     * @param v View
     * @return void
     */

    public void onClickFeature(View v) {
        int id = v.getId();
        Log.d("ID!", "" + id);
        /*if (id == R.id.home_btn_feature1) {
          startActivity (new Intent(getApplicationContext(), F1Activity.class));
        } else if (id == R.id.home_btn_feature2) {
          startActivity (new Intent(getApplicationContext(), F2Activity.class));
        }  else {
        }*/
    }

    /**
     */
    // More Methods

    /**
     * Go back to the home activity.
     * 
     * @param context Context
     * @return void
     */

    public void goHome(Context context) {
        final Intent intent = new Intent(context, HomeActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(intent);
    }

    /**
     * Use the activity label to set the text in the activity's title text view.
     * The argument gives the name of the view.
     *
     * <p> This method is needed because we have a custom title bar rather than the default Android title bar.
     * See the theme definitons in styles.xml.
     * 
     * @param textViewId int
     * @return void
     */

    public void setTitleFromActivityLabel(int textViewId) {
        TextView tv = (TextView) findViewById(textViewId);
        if (tv != null)
            tv.setText(getTitle());
    } // end setTitleText

    /**
     * Show a string on the screen via Toast.
     * 
     * @param msg String
     * @return void
     */

    public void toast(String msg) {
        Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
    } // end toast

    /**
     * Send a message to the debug log and display it using Toast.
     */
    public void trace(String msg) {
        Log.d("Demo", msg);
        toast(msg);
    }

} // end class