package com.arpith.dmucs;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import com.google.android.gms.maps.model.LatLng;
public class ReportList extends ListActivity {
ListAdapter adapter;
// Progress Dialog
private ProgressDialog pDialog;
// Creating JSON Parser object
JSONParser jParser = new JSONParser();
ArrayList<HashMap<String, String>> reportsList;
private static String url_all_reports;
// JSON Node names
private static final String TAG_SUCCESS = "success";
private static final String TAG_REPORTS = "reports";
JSONArray reports = null;
String within;
EditText et_within;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reportlist);
SharedPreferences getIP = PreferenceManager
.getDefaultSharedPreferences(getBaseContext());
String ip = getIP.getString("ip", "192.168.43.111");
//if duplicate values are alloud by the user
Boolean duplicate = getIP.getBoolean("duplicate", true);
if (duplicate)
url_all_reports = "http://" + ip + "/arpith/dmucs/DisasterList.php";
else
url_all_reports = "http://" + ip
+ "/arpith/dmucs/DisasterList_NoDup.php";
// Hashmap for ListView
reportsList = new ArrayList<HashMap<String, String>>();
new LoadAllReports().execute();
// Get listview
ListView lv = getListView();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
String uid = ((TextView) view.findViewById(R.id.uid)).getText()
.toString();
// Starting new intent
Intent in = new Intent(getApplicationContext(),
ReportInfo.class);
// sending uid to next activity
in.putExtra("uid", uid);
startActivity(in);
}
});
Bundle b = getIntent().getExtras();
et_within = (EditText) findViewById(R.id.et_within);
within = b.getString("within");
et_within.setText(within);
Button resubmit = (Button) findViewById(R.id.b_restart);
resubmit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
startActivity(getIntent().putExtra("within",
et_within.getText().toString()));
finish();
}
});
EditText search = (EditText) findViewById(R.id.et_search);
search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
((SimpleAdapter) ReportList.this.adapter).getFilter().filter(s);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
class LoadAllReports extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(ReportList.this);
pDialog.setMessage("Loading Reports. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
protected String doInBackground(String... args) {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
// getting JSON string from URL
JSONObject json = jParser.makeHttpRequest(url_all_reports, "GET",
params);
// Check your log cat for JSON reponse
Log.d("All Reports: ", json.toString());
try {
// Checking for SUCCESS TAG
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
reports = json.getJSONArray(TAG_REPORTS);
for (int i = 0; i < reports.length(); i++) {
JSONObject c = reports.getJSONObject(i);
// Storing each json item in variable
String uid = c.getString("uid");
String incident = c.getString("incident");
String lat = c.getString("lat");
String lng = c.getString("lng");
String report_time = c.getString("report_time");
String comments = c.getString("comments");
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(
criteria, true);
Location lastKnownLocation = locationManager
.getLastKnownLocation(provider);
LatLng currentLocation = new LatLng(
lastKnownLocation.getLatitude(),
lastKnownLocation.getLongitude());
String loc = distance(lat, lng,
currentLocation.latitude,
currentLocation.longitude, "K");
if (Integer.parseInt(loc) <= Integer.parseInt(within)) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put("uid", uid);
map.put("incident", incident);
map.put("loc", loc);
map.put("report_time", report_time);
map.put("comments", comments);
// adding HashList to ArrayList
reportsList.add(map);
}
}
} else {
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url) {
pDialog.dismiss();
// updating UI from Background Thread
runOnUiThread(new Runnable() {
public void run() {
/**
* Updating parsed JSON data into ListView
* */
adapter = new SimpleAdapter(ReportList.this, reportsList,
R.layout.report_view, new String[] { "uid",
"incident", "loc", "report_time",
"comments" }, new int[] { R.id.uid,
R.id.incident, R.id.location, R.id.time,
R.id.comments });
setListAdapter(adapter);
}
});
}
}
private String distance(String lat1s, String lon1s, double lat2,
double lon2, String unit) {
double lat1 = Double.parseDouble(lat1s);
double lon1 = Double.parseDouble(lon1s);
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2))
+ Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2))
* Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
if (unit == "K") {
dist = dist * 1.609344;
} else if (unit == "N") {
dist = dist * 0.8684;
}
return ((int) dist + "");
}
private double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
private double rad2deg(double rad) {
return (rad * 180.0 / Math.PI);
}
}