Java tutorial
/* * 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