/v3.2/nimbits-android/src/com/nimbits/android/activity/ChartActivity.java

http://nimbits-server.googlecode.com/ · Java · 333 lines · 235 code · 88 blank · 10 comment · 12 complexity · 5904eb7edd0c6e9b63211e5a445f437d MD5 · raw file

  1. package com.nimbits.android.activity;
  2. import android.app.Activity;
  3. import android.app.Dialog;
  4. import android.app.ProgressDialog;
  5. import android.content.Intent;
  6. import android.graphics.Bitmap;
  7. import android.graphics.BitmapFactory;
  8. import android.os.Bundle;
  9. import android.os.Handler;
  10. import android.os.Message;
  11. import android.util.DisplayMetrics;
  12. import android.util.Log;
  13. import android.view.*;
  14. import android.view.GestureDetector.OnGestureListener;
  15. import android.widget.ImageView;
  16. import com.google.gson.Gson;
  17. import com.google.gson.GsonBuilder;
  18. import com.google.gson.reflect.TypeToken;
  19. import com.nimbits.android.R;
  20. import com.nimbits.android.account.OwnerAccountFactory;
  21. import com.nimbits.client.model.Const;
  22. import com.nimbits.client.model.point.Point;
  23. import com.nimbits.client.model.point.PointModel;
  24. import java.io.UnsupportedEncodingException;
  25. import java.lang.reflect.Type;
  26. import java.net.URLEncoder;
  27. import java.util.LinkedList;
  28. public class ChartActivity extends Activity implements OnGestureListener {
  29. private final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss Z").serializeNulls().create();
  30. private String pointlist ="";
  31. private String category = "";
  32. private String chartTitle = "";
  33. private GestureDetector gestureScanner;
  34. private String baseURL;
  35. private static final int timerInterval = 15000;
  36. private static final int LoadDialogID = 1;
  37. private LoadThread loadThread;
  38. private ProgressDialog loadDialog;
  39. private final Handler timerHandler = new Handler();
  40. private String type;
  41. private String json;
  42. private int count = 10;
  43. private final Runnable timerTask = new Runnable() {
  44. public void run() {
  45. Log.v("chart view timer", "tick");
  46. loadThread = new LoadThread(loadHandler);
  47. loadThread.start();
  48. }
  49. };
  50. protected Dialog onCreateDialog(int id) {
  51. Dialog dialog = null;
  52. switch(id) {
  53. case LoadDialogID:
  54. loadDialog = new ProgressDialog(ChartActivity.this);
  55. loadDialog.setMessage("Loading Chart");
  56. loadThread = new LoadThread(loadHandler);
  57. loadThread.start();
  58. return loadDialog;
  59. default:
  60. dialog = null;
  61. }
  62. return dialog;
  63. }
  64. private final Handler loadHandler = new Handler() {
  65. public void handleMessage(Message msg) {
  66. byte[] chartData = msg.getData().getByteArray(Const.PARAM_CHART_DATA);
  67. ImageView imgViewer = (ImageView) findViewById(R.id.chart_image);
  68. Bitmap bm = BitmapFactory.decodeByteArray(chartData, 0, chartData.length);
  69. DisplayMetrics dm = new DisplayMetrics();
  70. getWindowManager().getDefaultDisplay().getMetrics(dm);
  71. imgViewer.setMinimumHeight(dm.heightPixels);
  72. imgViewer.setMinimumWidth(dm.widthPixels);
  73. imgViewer.setImageBitmap(bm);
  74. try {
  75. dismissDialog(LoadDialogID);
  76. removeDialog(LoadDialogID);
  77. } catch (Exception e) {
  78. }
  79. timerHandler.removeCallbacks(timerTask);
  80. timerHandler.postDelayed(timerTask, timerInterval);
  81. }
  82. };
  83. private class LoadThread extends Thread {
  84. final Handler m;
  85. final static int STATE_DONE = 0;
  86. final static int STATE_RUNNING = 1;
  87. @SuppressWarnings("unused")
  88. int mState;
  89. @SuppressWarnings("unused")
  90. int total;
  91. LoadThread(Handler h) {
  92. m = h;
  93. }
  94. private void update(byte[] chartData)
  95. {
  96. Message msg = m.obtainMessage();
  97. Bundle b = new Bundle();
  98. b.putByteArray(Const.PARAM_CHART_DATA, chartData);
  99. msg.setData(b);
  100. m.sendMessage(msg);
  101. }
  102. public void run() {
  103. byte[] chartData = null;
  104. try {
  105. if (type.equals(Const.PARAM_POINT))
  106. {
  107. Point point;
  108. if (json != null)
  109. {
  110. point = gson.fromJson(json, PointModel.class);
  111. pointlist = URLEncoder.encode(point.getName().getValue(),Const.CONST_ENCODING);
  112. chartTitle = URLEncoder.encode(point.getName().getValue(),Const.CONST_ENCODING);
  113. }
  114. }
  115. else
  116. {
  117. Type pointListType = new TypeToken<LinkedList<Point>>() {}.getType();
  118. LinkedList<Point> points = gson.fromJson(json, pointListType);
  119. chartTitle =URLEncoder.encode(category,Const.CONST_ENCODING);
  120. if (points.size() > 0)
  121. {
  122. for (Point p : points)
  123. {
  124. pointlist += URLEncoder.encode(p.getName().getValue(),Const.CONST_ENCODING) +"%2C";
  125. }
  126. pointlist = pointlist.substring(0,pointlist.length()-1);
  127. }
  128. }
  129. } catch (UnsupportedEncodingException e) {
  130. // TODO Auto-generated catch block
  131. e.printStackTrace();
  132. }
  133. Log.v("chartact points", pointlist);
  134. String params;
  135. params = "points=" + pointlist +
  136. "&cht=lc&chs=400x200" +
  137. "&chxt=y&autoscale=true" +
  138. "&chco=000000,00FF00,0000FF,FF0000,FF0066,FFCC33,663333,003333" +
  139. "&chtt=" + chartTitle +
  140. "&chdl=" + pointlist.replace("%2C", "%7C") ;
  141. try {
  142. chartData= OwnerAccountFactory.getInstance().getNimbitsClient(ChartActivity.this, baseURL).getBinaryFile(baseURL + "/service/chartapi", params);
  143. } catch (Exception e) {
  144. e.printStackTrace();
  145. }
  146. update(chartData);
  147. }
  148. }
  149. public void onCreate(Bundle savedInstanceState) {
  150. super.onCreate(savedInstanceState);
  151. setContentView(R.layout.chart_layout);
  152. gestureScanner = new GestureDetector(this);
  153. Bundle b = getIntent().getExtras();
  154. json = b.getString(Const.PARAM_JSON);
  155. category = b.getString(Const.PARAM_CATEGORY);
  156. baseURL = b.getString(Const.PARAM_BASE_URL);
  157. type = b.getString(Const.PARAM_TYPE);
  158. showDialog(LoadDialogID);
  159. }
  160. @Override
  161. public boolean onKeyDown(int keyCode, KeyEvent event) {
  162. if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
  163. loadCategories();
  164. return true;
  165. }
  166. return super.onKeyDown(keyCode, event);
  167. }
  168. private void loadCategories() {
  169. final Bundle b = new Bundle();
  170. final Intent intent = new Intent();
  171. b.putBoolean(Const.PARAM_RELOAD, false);
  172. b.putString(Const.PARAM_CATEGORY,category);
  173. b.putString(Const.PARAM_BASE_URL,baseURL);
  174. intent.putExtras( b);
  175. intent.setClass( ChartActivity.this , StartActivity.class);
  176. startActivity(intent);
  177. finish();
  178. }
  179. @Override
  180. public boolean onOptionsItemSelected(final MenuItem item) {
  181. // Handle item selection
  182. switch (item.getItemId()) {
  183. case R.id.main_menu:
  184. loadCategories();
  185. return true;
  186. default:
  187. return super.onOptionsItemSelected(item);
  188. }
  189. }
  190. @Override
  191. public boolean onCreateOptionsMenu(Menu menu) {
  192. MenuInflater inflater = getMenuInflater();
  193. inflater.inflate(R.menu.map_menu, menu);
  194. return true;
  195. }
  196. @Override
  197. public void onDestroy(){
  198. super.onDestroy();
  199. this.finish();
  200. }
  201. @Override
  202. public void finish()
  203. {
  204. super.finish();
  205. if (timerHandler != null)
  206. {
  207. timerHandler.removeCallbacks(timerTask);
  208. }
  209. }
  210. public void onTerminate() {
  211. // clean up application global
  212. //super.onStop();
  213. super.onDestroy();
  214. this.finish(); // /// close the application
  215. }
  216. @Override
  217. public boolean onTouchEvent(MotionEvent event) {
  218. return gestureScanner.onTouchEvent(event);
  219. }
  220. public boolean onDown(MotionEvent e) {
  221. // TODO Auto-generated method stub
  222. return false;
  223. }
  224. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
  225. float velocityY) {
  226. // TODO Auto-generated method stub
  227. loadCategories();
  228. return false;
  229. }
  230. public void onLongPress(MotionEvent e) {
  231. // TODO Auto-generated method stub
  232. }
  233. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
  234. float distanceY) {
  235. // TODO Auto-generated method stub
  236. return false;
  237. }
  238. public void onShowPress(MotionEvent e) {
  239. // TODO Auto-generated method stub
  240. }
  241. public boolean onSingleTapUp(MotionEvent e) {
  242. // TODO Auto-generated method stub
  243. return false;
  244. }
  245. }