Created
February 27, 2014 11:41
-
-
Save px-amaac/9248602 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.app; | |
import android.app.Activity; | |
import android.content.BroadcastReceiver; | |
import android.content.Context; | |
import android.content.Intent; | |
import android.content.IntentFilter; | |
import android.content.SharedPreferences; | |
import android.net.ConnectivityManager; | |
import android.net.NetworkInfo; | |
import android.os.AsyncTask; | |
import android.os.Bundle; | |
import android.preference.PreferenceManager; | |
import android.support.v4.app.ListFragment; | |
import android.view.LayoutInflater; | |
import android.view.View; | |
import android.widget.ArrayAdapter; | |
import android.widget.ListView; | |
import android.widget.SimpleAdapter; | |
import android.widget.Toast; | |
import com.example.app.dummy.DummyContent; | |
import org.xmlpull.v1.XmlPullParserException; | |
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.InputStreamReader; | |
import java.io.UnsupportedEncodingException; | |
import java.net.HttpURLConnection; | |
import java.net.URL; | |
import java.net.URLEncoder; | |
import java.util.HashMap; | |
import java.util.List; | |
/** | |
* A list fragment representing a list of Items. This fragment | |
* also supports tablet devices by allowing list items to be given an | |
* 'activated' state upon selection. This helps indicate which item is | |
* currently being viewed in a {@link ItemDetailFragment}. | |
* <p> | |
* Activities containing this fragment MUST implement the {@link Callbacks} | |
* interface. | |
*/ | |
public class ItemListFragment extends ListFragment { | |
public static final String WIFI = "Wi-Fi"; | |
public static final String ANY = "Any"; | |
private static final String URL = "validurlwithmyapikey"; | |
// Whether there is a Wi-Fi connection. | |
private static boolean wifiConnected = false; | |
// Whether there is a mobile connection. | |
private static boolean mobileConnected = false; | |
// Whether the display should be refreshed. | |
public static boolean refreshDisplay = true; | |
// The user's current network preference setting. | |
public static String sPref = null; | |
// The BroadcastReceiver that tracks network connectivity changes. | |
private NetworkReceiver receiver = new NetworkReceiver(); | |
/** | |
* The serialization (saved instance state) Bundle key representing the | |
* activated item position. Only used on tablets. | |
*/ | |
private static final String STATE_ACTIVATED_POSITION = "activated_position"; | |
/** | |
* The fragment's current callback object, which is notified of list item | |
* clicks. | |
*/ | |
private Callbacks mCallbacks; | |
/** | |
* The current activated item position. Only used on tablets. | |
*/ | |
private int mActivatedPosition = ListView.INVALID_POSITION; | |
private int currentPage = 0; | |
private List<Item> data = null; | |
/** | |
* A callback interface that all activities containing this fragment must | |
* implement. This mechanism allows activities to be notified of item | |
* selections. | |
*/ | |
public interface Callbacks { | |
/** | |
* Callback for when an item has been selected. | |
*/ | |
public void onItemSelected(Item aaItem); | |
public String getQuery(); | |
} | |
/** | |
* Mandatory empty constructor for the fragment manager to instantiate the | |
* fragment (e.g. upon screen orientation changes). | |
*/ | |
public ItemListFragment() { | |
} | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
// Register BroadcastReceiver to track connection changes. | |
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); | |
receiver = new NetworkReceiver(); | |
getActivity().registerReceiver(receiver, filter); | |
setHasOptionsMenu(true); | |
} | |
public boolean checkAdapter() { | |
SimpleAdapter adapter = (SimpleAdapter) getListAdapter(); | |
return adapter != null; | |
} | |
@Override | |
public void onViewCreated(View view, Bundle savedInstanceState) { | |
super.onViewCreated(view, savedInstanceState); | |
// Restore the previously serialized activated item position. | |
if (savedInstanceState != null | |
&& savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { | |
setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION)); | |
} | |
} | |
@Override | |
public void onStart() { | |
super.onStart(); | |
// Gets the user's network preference settings | |
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); | |
// Retrieves a string value for the preferences. The second parameter | |
// is the default value to use if a preference value is not found. | |
sPref = sharedPrefs.getString("listPref", "Wi-Fi"); | |
updateConnectedFlags(); | |
// Only loads the page if refreshDisplay is true. Otherwise, keeps previous | |
// display. For example, if the user has set "Wi-Fi only" in prefs and the | |
// device loses its Wi-Fi connection midway through the user using the app, | |
// you don't want to refresh the display--this would force the display of | |
// an error page. | |
try { | |
loadPage(); | |
} catch (UnsupportedEncodingException e) { | |
throw new AssertionError("UTF-8 is unknown"); | |
} | |
} | |
@Override | |
public void onDestroy() { | |
super.onDestroy(); | |
if (receiver != null) { | |
getActivity().unregisterReceiver(receiver); | |
} | |
} | |
// Checks the network connection and sets the wifiConnected and mobileConnected | |
// variables accordingly. | |
private void updateConnectedFlags() { | |
ConnectivityManager connMgr = | |
(ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); | |
NetworkInfo activeInfo = connMgr.getActiveNetworkInfo(); | |
if (activeInfo != null && activeInfo.isConnected()) { | |
wifiConnected = activeInfo.getType() == ConnectivityManager.TYPE_WIFI; | |
mobileConnected = activeInfo.getType() == ConnectivityManager.TYPE_MOBILE; | |
} else { | |
wifiConnected = false; | |
mobileConnected = false; | |
} | |
} | |
// Uses AsyncTask subclass to download the requested JSON | |
// This avoids UI lock up. | |
public void loadPage() throws UnsupportedEncodingException { | |
if (((sPref.equals(ANY)) && (wifiConnected || mobileConnected)) | |
|| ((sPref.equals(WIFI)) && (wifiConnected))) { | |
// AsyncTask subclass | |
String query = URLEncoder.encode(mCallbacks.getQuery(), "utf-8"); | |
String lUrl = URL + query + getResources().getString(R.string.api_key); | |
new DownloadResultTask().execute(lUrl); | |
} else { | |
//TODO: Modify layout to display an error | |
} | |
} | |
@Override | |
public void onAttach(Activity activity) { | |
super.onAttach(activity); | |
// Activities containing this fragment must implement its callbacks. | |
if (!(activity instanceof Callbacks)) { | |
throw new IllegalStateException("Activity must implement fragment's callbacks."); | |
} | |
mCallbacks = (Callbacks) activity; | |
} | |
@Override | |
public void onDetach() { | |
super.onDetach(); | |
} | |
@Override | |
public void onListItemClick(ListView listView, View view, int position, long id) { | |
super.onListItemClick(listView, view, position, id); | |
// Notify the active callbacks interface (the activity, if the | |
// fragment is attached to one) that an item has been selected. | |
mCallbacks.onItemSelected(data.get(position)); | |
} | |
@Override | |
public void onSaveInstanceState(Bundle outState) { | |
super.onSaveInstanceState(outState); | |
if (mActivatedPosition != ListView.INVALID_POSITION) { | |
// Serialize and persist the activated item position. | |
outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); | |
} | |
} | |
/** | |
* Turns on activate-on-click mode. When this mode is on, list items will be | |
* given the 'activated' state when touched. | |
*/ | |
public void setActivateOnItemClick(boolean activateOnItemClick) { | |
// When setting CHOICE_MODE_SINGLE, ListView will automatically | |
// give items the 'activated' state when touched. | |
getListView().setChoiceMode(activateOnItemClick | |
? ListView.CHOICE_MODE_SINGLE | |
: ListView.CHOICE_MODE_NONE); | |
} | |
private void setActivatedPosition(int position) { | |
if (position == ListView.INVALID_POSITION) { | |
getListView().setItemChecked(mActivatedPosition, false); | |
} else { | |
getListView().setItemChecked(position, true); | |
} | |
mActivatedPosition = position; | |
} | |
public class NetworkReceiver extends BroadcastReceiver { | |
@Override | |
public void onReceive(Context context, Intent intent) { | |
ConnectivityManager connMgr = | |
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); | |
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); | |
// Checks the user prefs and the network connection. Based on the result, decides | |
// whether | |
// to refresh the display or keep the current display. | |
// If the userpref is Wi-Fi only, checks to see if the device has a Wi-Fi connection. | |
if (WIFI.equals(sPref) && networkInfo != null | |
&& networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { | |
// If device has its Wi-Fi connection, sets refreshDisplay | |
// to true. This causes the display to be refreshed when the user | |
// returns to the app. | |
refreshDisplay = true; | |
Toast.makeText(context, R.string.wifi_connected, Toast.LENGTH_SHORT).show(); | |
// If the setting is ANY network and there is a network connection | |
// (which by process of elimination would be mobile), sets refreshDisplay to true. | |
} else if (ANY.equals(sPref) && networkInfo != null) { | |
refreshDisplay = true; | |
// Otherwise, the app can't download content--either because there is no network | |
// connection (mobile or Wi-Fi), or because the pref setting is WIFI, and there | |
// is no Wi-Fi connection. | |
// Sets refreshDisplay to false. | |
} else { | |
refreshDisplay = false; | |
Toast.makeText(context, R.string.lost_connection, Toast.LENGTH_SHORT).show(); | |
} | |
} | |
} | |
private class DownloadResultTask extends AsyncTask<String, Void, String> { | |
View footer; | |
List<Item> items = null; | |
ZJSONParser zjsonParse = new ZJSONParser(); | |
@Override | |
protected void onPreExecute() { | |
super.onPreExecute(); | |
View footer = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.list_footer, null, false); | |
getListView().addFooterView(footer); | |
} | |
@Override | |
protected String doInBackground(String... params) { | |
try{ | |
InputStream JSONStream = downloadUrl(params[0]); | |
return convertStreamToString(JSONStream); | |
/*items = zjsonParse.readStream(JSONStream); | |
if(items == null){ | |
return getResources().getString(R.string.data_not_there); | |
} | |
else | |
return getResources().getString(R.string.data_loaded); | |
*/} | |
catch (IOException e) { | |
e.printStackTrace(); | |
} | |
return ""; | |
} | |
@Override | |
protected void onPostExecute(String result) { | |
Toast.makeText(getActivity(), result, Toast.LENGTH_LONG).show(); | |
if(items != null) | |
Toast.makeText(getActivity(), "Success" + items.get(0).getPrice(), Toast.LENGTH_LONG).show(); | |
getListView().removeFooterView(footer); | |
} | |
} | |
private String convertStreamToString(InputStream is) { | |
BufferedReader reader = new BufferedReader(new InputStreamReader(is)); | |
StringBuilder sb = new StringBuilder(); | |
String line = null; | |
try { | |
while ((line = reader.readLine()) != null) sb.append(line + "\n"); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} finally { | |
try { | |
is.close(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
return sb.toString(); | |
} | |
// Given a string representation of a URL, sets up a connection and gets | |
// an input stream. | |
private InputStream downloadUrl(String urlString) throws IOException { | |
URL url = new URL(urlString); | |
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); | |
connection.setReadTimeout(100000 /* milliseconds */); | |
connection.setConnectTimeout(150000 /* milliseconds */); | |
connection.setRequestMethod("GET"); | |
connection.setDoInput(true); | |
// Starts the query | |
connection.connect(); | |
InputStream stream = connection.getInputStream(); | |
return stream; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment