PageRenderTime 65ms CodeModel.GetById 34ms RepoModel.GetById 1ms app.codeStats 0ms

/src/edu/ucla/cens/budburstmobile/weeklyplant/WeeklyPlant.java

https://github.com/SLGerrick/Project-BudBurst-Mobile
Java | 452 lines | 319 code | 80 blank | 53 comment | 12 complexity | c67a78246734adfeaeea63a26d509de6 MD5 | raw file
  1. package edu.ucla.cens.budburstmobile.weeklyplant;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.InetAddress;
  6. import java.net.UnknownHostException;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import org.apache.http.HttpResponse;
  11. import org.apache.http.HttpStatus;
  12. import org.apache.http.client.HttpClient;
  13. import org.apache.http.client.methods.HttpPost;
  14. import org.apache.http.impl.client.DefaultHttpClient;
  15. import org.json.JSONObject;
  16. import edu.ucla.cens.budburstmobile.R;
  17. import edu.ucla.cens.budburstmobile.database.OneTimeDBHelper;
  18. import edu.ucla.cens.budburstmobile.database.StaticDBHelper;
  19. import edu.ucla.cens.budburstmobile.helper.HelperDrawableManager;
  20. import edu.ucla.cens.budburstmobile.helper.HelperFunctionCalls;
  21. import edu.ucla.cens.budburstmobile.helper.HelperValues;
  22. import edu.ucla.cens.budburstmobile.lists.ListDetail;
  23. import edu.ucla.cens.budburstmobile.myplants.PBBAddSite;
  24. import edu.ucla.cens.budburstmobile.myplants.PBBPlantList;
  25. import edu.ucla.cens.budburstmobile.onetime.OneTimePhenophase;
  26. import edu.ucla.cens.budburstmobile.utils.PBBItems;
  27. import edu.ucla.cens.budburstmobile.utils.QuickCapture;
  28. import android.app.Activity;
  29. import android.app.AlertDialog;
  30. import android.app.ProgressDialog;
  31. import android.content.Context;
  32. import android.content.DialogInterface;
  33. import android.content.Intent;
  34. import android.database.Cursor;
  35. import android.database.sqlite.SQLiteDatabase;
  36. import android.net.ConnectivityManager;
  37. import android.net.NetworkInfo;
  38. import android.os.AsyncTask;
  39. import android.os.Bundle;
  40. import android.text.util.Linkify;
  41. import android.util.Log;
  42. import android.view.View;
  43. import android.view.ViewGroup;
  44. import android.view.Window;
  45. import android.widget.Button;
  46. import android.widget.ImageView;
  47. import android.widget.LinearLayout;
  48. import android.widget.ProgressBar;
  49. import android.widget.RelativeLayout;
  50. import android.widget.TextView;
  51. import android.widget.Toast;
  52. /**
  53. * Class for weekly plant
  54. * @author kyunghan
  55. *
  56. */
  57. public class WeeklyPlant extends Activity {
  58. private int mSpeciesID = HelperValues.UNKNOWN_SPECIES;
  59. private int mProtocolID = 2;
  60. private int mCategory = HelperValues.LOCAL_BUDBURST_LIST;
  61. private String mCommonName = "Unknown/Other";
  62. private String mScienceName = "Unknown/Other";
  63. private String mGetWeeklyPlant;
  64. private List<String> mList;
  65. private ImageView mUrl;
  66. private TextView mCredit;
  67. private TextView mLink;
  68. private TextView mSpecies;
  69. private TextView mHaiku;
  70. private ProgressBar mSpinner;
  71. private Button myplantBtn;
  72. private Button sharedplantBtn;
  73. private CharSequence[] mSeqUserSite;
  74. private HelperFunctionCalls mHelper;
  75. private HashMap<String, Integer> mMapUserSiteNameID;
  76. /** Called when the activity is first created. */
  77. @Override
  78. public void onCreate(Bundle savedInstanceState) {
  79. super.onCreate(savedInstanceState);
  80. // set title bar
  81. requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
  82. setContentView(R.layout.weeklyplant);
  83. getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.pbb_title);
  84. ViewGroup v = (ViewGroup) findViewById(R.id.title_bar).getParent().getParent();
  85. v = (ViewGroup)v.getChildAt(0);
  86. v.setPadding(0, 0, 0, 0);
  87. TextView myTitleText = (TextView) findViewById(R.id.my_title);
  88. myTitleText.setText(" " + getString(R.string.WeeklyPlant));
  89. mList = new ArrayList<String>();
  90. mMapUserSiteNameID = new HashMap<String, Integer>();
  91. // setup the layout
  92. mUrl = (ImageView) findViewById(R.id.species_image);
  93. mCredit = (TextView) findViewById(R.id.credit);
  94. mLink = (TextView) findViewById(R.id.link);
  95. mSpecies = (TextView) findViewById(R.id.species_name);
  96. mHaiku = (TextView) findViewById(R.id.haiku);
  97. mSpinner = (ProgressBar) findViewById(R.id.progressbar);
  98. myplantBtn = (Button) findViewById(R.id.to_myplant);
  99. sharedplantBtn = (Button) findViewById(R.id.to_shared_plant);
  100. /*
  101. * Call FunctionsHelper();
  102. */
  103. mHelper = new HelperFunctionCalls();
  104. mMapUserSiteNameID = mHelper.getUserSiteIDMap(WeeklyPlant.this);
  105. if(!isNetworkAvailable()) {
  106. Toast.makeText(this, "No connection. Make sure you are in the area with good connectivity.", Toast.LENGTH_SHORT).show();
  107. finish();
  108. }
  109. else {
  110. /*
  111. * Download weekly plant information from the server.
  112. */
  113. DownloadWeeklyPlant weeklyPlant = new DownloadWeeklyPlant(this);
  114. weeklyPlant.execute();
  115. }
  116. // TODO Auto-generated method stub
  117. }
  118. private boolean isNetworkAvailable() {
  119. ConnectivityManager cManager =
  120. (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
  121. NetworkInfo nInfo = cManager.getActiveNetworkInfo();
  122. if(nInfo == null) {
  123. return false;
  124. }
  125. Log.i("K", "info : " + nInfo.isConnectedOrConnecting());
  126. return nInfo.isConnectedOrConnecting();
  127. }
  128. @Override
  129. public void onResume() {
  130. super.onResume();
  131. /*
  132. * Retreive user sites from database.
  133. */
  134. mSeqUserSite = mHelper.getUserSite(WeeklyPlant.this);
  135. myplantBtn.setOnClickListener(new View.OnClickListener() {
  136. @Override
  137. public void onClick(View v) {
  138. // TODO Auto-generated method stub
  139. StaticDBHelper staticDBHelper = new StaticDBHelper(WeeklyPlant.this);
  140. SQLiteDatabase staticDB = staticDBHelper.getReadableDatabase();
  141. Cursor c = staticDB.rawQuery("SELECT protocol_id FROM species WHERE _id = " + mSpeciesID, null);
  142. while(c.moveToNext()) {
  143. mProtocolID = c.getInt(0);
  144. }
  145. c.close();
  146. staticDB.close();
  147. popupDialog();
  148. }
  149. });
  150. sharedplantBtn.setOnClickListener(new View.OnClickListener() {
  151. @Override
  152. public void onClick(View v) {
  153. // TODO Auto-generated method stub
  154. /*
  155. * We already know the Shared Plant category if we choose species from official budburst lists.
  156. * - hardcoded mProtocolID
  157. */
  158. int getProtocolID = 2; // temporary set to 2
  159. StaticDBHelper staticDBH = new StaticDBHelper(WeeklyPlant.this);
  160. SQLiteDatabase staticDB = staticDBH.getReadableDatabase();
  161. Cursor cursor = staticDB.rawQuery("SELECT protocol_id FROM species WHERE _id=" + mSpeciesID + ";", null);
  162. while(cursor.moveToNext()) {
  163. getProtocolID = cursor.getInt(0);
  164. }
  165. switch(getProtocolID) {
  166. case HelperValues.WILD_FLOWERS:
  167. mProtocolID = HelperValues.QUICK_WILD_FLOWERS;
  168. break;
  169. case HelperValues.DECIDUOUS_TREES:
  170. mProtocolID = HelperValues.QUICK_TREES_AND_SHRUBS;
  171. break;
  172. case HelperValues.EVERGREEN_TREES:
  173. mProtocolID = HelperValues.QUICK_TREES_AND_SHRUBS;
  174. break;
  175. case HelperValues.CONIFERS:
  176. mProtocolID = HelperValues.QUICK_TREES_AND_SHRUBS;
  177. break;
  178. case HelperValues.GRASSES:
  179. mProtocolID = HelperValues.QUICK_GRASSES;
  180. break;
  181. }
  182. cursor.close();
  183. staticDB.close();
  184. /*
  185. * Ask users if they are ready to take a photo.
  186. */
  187. new AlertDialog.Builder(WeeklyPlant.this)
  188. .setTitle(getString(R.string.Menu_addQCPlant))
  189. .setMessage(getString(R.string.Start_Shared_Plant))
  190. .setPositiveButton(getString(R.string.Button_Photo), new DialogInterface.OnClickListener() {
  191. @Override
  192. public void onClick(DialogInterface dialog, int which) {
  193. // TODO Auto-generated method stub
  194. /*
  195. * Move to QuickCapture
  196. */
  197. Intent intent = new Intent(WeeklyPlant.this, QuickCapture.class);
  198. PBBItems pbbItem = new PBBItems();
  199. pbbItem.setCommonName(mCommonName);
  200. pbbItem.setScienceName(mScienceName);
  201. pbbItem.setProtocolID(mProtocolID);
  202. pbbItem.setSpeciesID(mSpeciesID);
  203. pbbItem.setCategory(mCategory);
  204. intent.putExtra("pbbItem", pbbItem);
  205. intent.putExtra("from", HelperValues.FROM_LOCAL_PLANT_LISTS);
  206. startActivity(intent);
  207. }
  208. })
  209. .setNeutralButton(getString(R.string.Button_NoPhoto), new DialogInterface.OnClickListener() {
  210. @Override
  211. public void onClick(DialogInterface dialog, int which) {
  212. // TODO Auto-generated method stub
  213. /*
  214. * Move to Getphenophase without a photo.
  215. */
  216. Intent intent = new Intent(WeeklyPlant.this, OneTimePhenophase.class);
  217. PBBItems pbbItem = new PBBItems();
  218. pbbItem.setCommonName(mCommonName);
  219. pbbItem.setScienceName(mScienceName);
  220. pbbItem.setProtocolID(mProtocolID);
  221. pbbItem.setSpeciesID(mSpeciesID);
  222. pbbItem.setCategory(mCategory);
  223. pbbItem.setLocalImageName("");
  224. intent.putExtra("pbbItem", pbbItem);
  225. intent.putExtra("from", HelperValues.FROM_LOCAL_PLANT_LISTS);
  226. startActivity(intent);
  227. }
  228. })
  229. .setNegativeButton(getString(R.string.Button_Cancel), new DialogInterface.OnClickListener() {
  230. @Override
  231. public void onClick(DialogInterface dialog, int which) {
  232. // TODO Auto-generated method stub
  233. }
  234. })
  235. .show();
  236. }
  237. });
  238. }
  239. private void popupDialog() {
  240. /*
  241. * Pop up choose site dialog box
  242. */
  243. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  244. builder.setTitle(getString(R.string.AddPlant_chooseSite))
  245. .setCancelable(true)
  246. .setItems(mSeqUserSite, new DialogInterface.OnClickListener() {
  247. @Override
  248. public void onClick(DialogInterface dialog, int which) {
  249. // TODO Auto-generated method stub
  250. int new_plant_site_id = mMapUserSiteNameID.get(mSeqUserSite[which].toString());
  251. String new_plant_site_name = mSeqUserSite[which].toString();
  252. if(new_plant_site_name == "Add New Site") {
  253. Intent intent = new Intent(WeeklyPlant.this, PBBAddSite.class);
  254. PBBItems pbbItem = new PBBItems();
  255. pbbItem.setSpeciesID(mSpeciesID);
  256. pbbItem.setCommonName(mCommonName);
  257. pbbItem.setScienceName(mScienceName);
  258. pbbItem.setProtocolID(mProtocolID);
  259. pbbItem.setCategory(mCategory);
  260. intent.putExtra("pbbItem", pbbItem);
  261. intent.putExtra("from", HelperValues.FROM_PLANT_LIST);
  262. startActivity(intent);
  263. }
  264. else {
  265. if(mHelper.checkIfNewPlantAlreadyExists(mSpeciesID, new_plant_site_id, WeeklyPlant.this)){
  266. Toast.makeText(WeeklyPlant.this, getString(R.string.AddPlant_alreadyExists), Toast.LENGTH_LONG).show();
  267. }else{
  268. if(mHelper.insertNewMyPlantToDB(WeeklyPlant.this, mSpeciesID, mCommonName,
  269. new_plant_site_id, new_plant_site_name, mProtocolID, HelperValues.LOCAL_BUDBURST_LIST)){
  270. Intent intent = new Intent(WeeklyPlant.this, PBBPlantList.class);
  271. Toast.makeText(WeeklyPlant.this, getString(R.string.AddPlant_newAdded), Toast.LENGTH_SHORT).show();
  272. /*
  273. * Clear all stacked activities.
  274. */
  275. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  276. startActivity(intent);
  277. finish();
  278. }else{
  279. Toast.makeText(WeeklyPlant.this, getString(R.string.Alert_dbError), Toast.LENGTH_SHORT).show();
  280. }
  281. }
  282. }
  283. }
  284. })
  285. .setNegativeButton(getString(R.string.Button_cancel), null)
  286. .show();
  287. }
  288. /*
  289. * Receive the weekly plant from the server in json format
  290. */
  291. public class DownloadWeeklyPlant extends AsyncTask<Void, Void, Void>{
  292. private Context mContext;
  293. private ProgressDialog mDialog;
  294. private List<String> mList;
  295. private String getUrl;
  296. private String getCredit;
  297. private String getLink;
  298. private String getSpecies;
  299. private String getHaiku;
  300. // getSpeciesInfo[0] = Science Name
  301. // getSpeciesInfo[1] = Species Info
  302. private String []getSpeciesInfo;
  303. public DownloadWeeklyPlant(Context context) {
  304. mContext = context;
  305. mList = new ArrayList<String>();
  306. }
  307. @Override
  308. protected void onPreExecute() {
  309. mDialog = ProgressDialog.show(mContext, getString(R.string.Alert_pleaseWait),
  310. getString(R.string.Weekly_Plant_Text), true);
  311. mDialog.setCancelable(true);
  312. mGetWeeklyPlant = getString(R.string.plant_of_week);
  313. }
  314. @Override
  315. protected Void doInBackground(Void... unused) {
  316. // TODO Auto-generated method stub
  317. HttpClient httpClient = new DefaultHttpClient();
  318. HttpPost httpPost = new HttpPost(mGetWeeklyPlant);
  319. String result = "";
  320. try {
  321. HttpResponse response = httpClient.execute(httpPost);
  322. if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  323. BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
  324. StringBuilder result_str = new StringBuilder();
  325. String line = "";
  326. while((line = br.readLine()) != null){
  327. result_str.append(line);
  328. }
  329. result = result_str.toString();
  330. JSONObject jsonObj = new JSONObject(result);
  331. getUrl = jsonObj.getString("url");
  332. getCredit = jsonObj.getString("credit");
  333. getLink = jsonObj.getString("link");
  334. getSpecies = jsonObj.getString("species");
  335. getHaiku = jsonObj.getString("haiku");
  336. StaticDBHelper staticDBHelper = new StaticDBHelper(WeeklyPlant.this);
  337. OneTimeDBHelper onetimeDBHelper = new OneTimeDBHelper(WeeklyPlant.this);
  338. mSpeciesID = staticDBHelper.getSpeciesID(WeeklyPlant.this, getSpecies);
  339. getSpeciesInfo = staticDBHelper.getSpeciesName(WeeklyPlant.this, mSpeciesID);
  340. mScienceName = getSpeciesInfo[0];
  341. mCommonName = getSpecies;
  342. Log.i("K", "Week of plant, SpeciesID: " + mSpeciesID +
  343. " ScienceName: " + mScienceName);
  344. }
  345. } catch (IOException e) {
  346. // TODO Auto-generated catch block
  347. e.printStackTrace();
  348. finish();
  349. } catch (Exception e) {
  350. // TODO Auto-generated catch block
  351. e.printStackTrace();
  352. finish();
  353. }
  354. // TODO Auto-generated method stub
  355. return null;
  356. }
  357. @Override
  358. protected void onPostExecute(Void unused) {
  359. mDialog.dismiss();
  360. mCredit.setText(getCredit);
  361. mLink.setText(getSpeciesInfo[1]);
  362. mSpecies.setText(getSpecies);
  363. mHaiku.setText(getHaiku);
  364. //Linkify.addLinks(mLink, Linkify.WEB_URLS);
  365. HelperDrawableManager dm = new HelperDrawableManager(WeeklyPlant.this, mSpinner, mUrl);
  366. dm.fetchDrawableOnThread(getUrl);
  367. }
  368. public List<String> onGetResults() {
  369. return mList;
  370. }
  371. }
  372. }