Java tutorial
/************************************************************************************** SaveDollars An open source Android application that helps users to compare prices of a product across different ecommerce sites and make a decision about purchase. Copyright (C) 2013 Smita Kundargi and Jeanne Betcy Victor This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. Following is the link for the repository: https://github.com/SmitaBetcy/SaveDollars Please, see the file license in this distribution for license terms. Link is https://github.com/SmitaBetcy/SaveDollars/blob/master/License References: https://developers.google.com/shopping-search/v1/reference-response-format https://developers.google.com/shopping-search/v1/getting_started https://code.google.com/p/zxing/wiki/ScanningViaIntent http://stackoverflow.com/questions/8632529/listview-with-multiple-strings http://sweetclipart.com/ Author - Smita Kundargi and Jeanne Betcy Victor email: ksmita@pdx.edu and jbv3@pdx.edu ******************************************************************************************/ package com.savedollars; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.ListActivity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.StrictMode; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.TextView; import com.adapter.ListViewAdapter; import com.example.savedollars.R; /******************************************************************************************************* ** ProductPriceDisplay is used to parse the JSON Data which is retrieved calling the google shopping API ** to sort and display the price of the product for different merchants and it allows the user to visit ** the home page of the merchant by one click. *********************************************************************************************************/ public class ProductPriceDisplay extends ListActivity { private String JSONData = ""; @SuppressWarnings("rawtypes") private Map merchantMap = new HashMap(); @SuppressWarnings("rawtypes") private Map merchantLinkMap = new HashMap(); private Map<Object, Object> sortedMap = new LinkedHashMap<Object, Object>(); private int totalCount = 0; private String[][] PDT_INFO; public String pdtName; public String merchantPage; private static final String LOG_TAG = "ProductPriceDisplay"; @SuppressWarnings({ "rawtypes", "unused" }) @Override protected void onCreate(Bundle savedInstanceState) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites() .detectNetwork().penaltyLog().build()); JSONData = (getIntent().getStringExtra("JsonData")); if (JSONData != null) { parseJsonData(JSONData); } super.onCreate(savedInstanceState); setContentView(R.layout.pdtpriceview); // Setting Product Name TextView productName = (TextView) findViewById(R.id.pdtNameTextView); productName.setText(pdtName); Iterator objMapIterator = sortedMap.entrySet().iterator(); int rowIndex = 0; PDT_INFO = new String[totalCount][2]; while (objMapIterator.hasNext()) { Map.Entry keyValuePairs = (Map.Entry) objMapIterator.next(); String key = ProductTotalPriceDisplay.merchantNames[rowIndex]; PDT_INFO[rowIndex][0] = key; PDT_INFO[rowIndex][1] = "$" + sortedMap.get(key); rowIndex++; } ListViewAdapter listv = new ListViewAdapter(this, PDT_INFO); setListAdapter(listv); final ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { lv.getItemAtPosition(position); String pdtKey = PDT_INFO[position][0]; String merchantLink = (String) merchantLinkMap.get(pdtKey); Uri uri = Uri.parse(merchantLink); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } }); } /* * Method : parseJsonData Argument : String Description: parses JSON data * for shipping price of product Returns : void */ @SuppressWarnings("unchecked") private void parseJsonData(String data) { // Convert to JSON object for parsing try { JSONObject jsonResponse = new JSONObject(data); // Get the names // JSONArray arr = jsonResponse.names(); if (jsonResponse.has("items")) { JSONArray parsedItems = jsonResponse.getJSONArray("items"); JSONObject inventory = null; for (int j = 0; j < parsedItems.length(); j++) { inventory = parsedItems.getJSONObject(j); JSONObject objPrice = inventory.getJSONObject("product"); JSONObject merchant = objPrice.getJSONObject("author"); String merchantName = merchant.getString("name"); JSONArray invObj = objPrice.getJSONArray("inventories"); for (int z = 0; z < invObj.length(); z++) { JSONObject price = invObj.getJSONObject(z); String productPrice = price.getString("price"); float finalPrice = Float.parseFloat(productPrice); merchantMap.put(merchantName, finalPrice); } pdtName = objPrice.getString("title"); // retrieve merchant page merchantPage = objPrice.getString("link"); merchantLinkMap.put(merchantName, merchantPage); } sortMerchantPrices(); } } catch (JSONException e) { Log.e(LOG_TAG, "Cannot process JSON results", e); } } /* * method : sortMerchantPrices arguments : none description: Sorts a hashmap * containing merchant names and prices by values ( prices ). The idea is to * convert map to list and then sort before converting back to map again. * returns : void */ @SuppressWarnings({ "unchecked", "rawtypes" }) private void sortMerchantPrices() { List objList = new LinkedList(merchantMap.entrySet()); Collections.sort(objList, new Comparator() { public int compare(Object obj1, Object obj2) { return ((Comparable) ((Map.Entry) (obj1)).getValue()).compareTo(((Map.Entry) (obj2)).getValue()); } }); for (Iterator it = objList.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); sortedMap.put(entry.getKey(), entry.getValue()); totalCount++; } } @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; } /* Code for the buttons */ public void pdttotalpriceview(View v) { Intent searchIntent = new Intent(ProductPriceDisplay.this, ProductTotalPriceDisplay.class); searchIntent.putExtra("JsonData", JSONData); startActivity(searchIntent); } public void pdtpriceview(View v) { Intent searchIntent = new Intent(ProductPriceDisplay.this, ProductPriceDisplay.class); searchIntent.putExtra("JsonData", JSONData); startActivity(searchIntent); } public void pdtshippingpriceview(View v) { Intent searchIntent = new Intent(ProductPriceDisplay.this, ProductShippingPriceDisplay.class); searchIntent.putExtra("JsonData", JSONData); startActivity(searchIntent); } public void pdtstockview(View v) { Intent searchIntent = new Intent(ProductPriceDisplay.this, ProductStockDisplay.class); searchIntent.putExtra("JsonData", JSONData); startActivity(searchIntent); } public void activity_main(View v) { Intent searchIntent = new Intent(ProductPriceDisplay.this, MainActivity.class); startActivity(searchIntent); } }