]> Pileus Git - ~andy/iBeaconNav/blob - src/edu/ucla/iBeaconNav/Main.java
Add connect/disconnect and iBeacon data
[~andy/iBeaconNav] / src / edu / ucla / iBeaconNav / Main.java
1 package edu.ucla.iBeaconNav;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.graphics.Color;
6 import android.graphics.Typeface;
7 import android.os.Bundle;
8 import android.os.Handler;
9 import android.os.Messenger;
10 import android.preference.PreferenceManager;
11 import android.text.Spannable;
12 import android.text.SpannableString;
13 import android.text.format.DateFormat;
14 import android.text.style.BackgroundColorSpan;
15 import android.text.style.ForegroundColorSpan;
16 import android.text.style.StrikethroughSpan;
17 import android.text.style.StyleSpan;
18 import android.text.style.UnderlineSpan;
19 import android.view.Menu;
20 import android.view.MenuInflater;
21 import android.view.MenuItem;
22 import android.view.View;
23 import android.widget.Button;
24 import android.widget.EditText;
25 import android.widget.LinearLayout;
26 import android.widget.ScrollView;
27 import android.widget.TabHost;
28 import android.widget.TabWidget;
29 import android.widget.TextView;
30 import android.widget.Toast;
31
32 import android.os.Bundle;
33
34 import com.google.android.gms.maps.*;
35 import com.google.android.gms.maps.model.*;
36
37 public class Main extends Activity
38 {
39         /* Private data */
40         private Handler      handler;
41         private Messenger    messenger;
42         private Task         task;
43         private Toast        toast;
44
45         /* Widgets */
46         private TabHost      window;
47         private TabWidget    tabs;
48         private LinearLayout map;
49         private LinearLayout state;
50         private TextView     debug;
51         private ScrollView   scroll;
52         private Button       rstHdBttn;
53         private Button       rstDstBttn;
54
55         /* Private helper methods */
56         private void notice(String text)
57         {
58                 String    msg  = "*** " + text + "\n";
59                 Spannable span = new SpannableString(msg);
60                 span.setSpan(new StyleSpan(Typeface.BOLD), 0, msg.length(), 0);
61                 this.debug.append(span);
62         }
63
64         /* Private handler methods */
65         private void onRegister(Task task)
66         {
67                 Util.debug("Main: onRegister_task");
68                 this.task    = task;
69         }
70
71         private void onPosition()
72         {
73                 Util.debug("Main: onPosition");
74         }
75
76         private void onNotify(String text)
77         {
78                 Util.debug("Main: onNotify - " + text);
79                 this.notice(text);
80                 this.toast.setText(text);
81                 this.toast.show();
82         }
83
84         private void onShowData(float[] data){
85                 TextView textView1 = null;
86                 TextView textView2 = null;
87                 TextView textView3 = null;
88                 int displayNum = 3;
89                 int dataId = (int)(data[0]+0.5);
90                 CMD.Data dataType = CMD.Data.values()[dataId];
91                 switch (dataType){
92                 case ACC:
93                         textView1 = (TextView)findViewById(R.id.accText1);
94                         textView2 = (TextView)findViewById(R.id.accText2);
95                         textView3 = (TextView)findViewById(R.id.accText3);
96                         break;
97                 case MAG:
98                         return;
99                         /*textView1 = (TextView)findViewById(R.id.magText1);
100                         textView2 = (TextView)findViewById(R.id.magText2);
101                         textView3 = (TextView)findViewById(R.id.magText3);
102                         break;*/
103                 case GYR:
104                         textView1 = (TextView)findViewById(R.id.gyrText1);
105                         textView2 = (TextView)findViewById(R.id.gyrText2);
106                         textView3 = (TextView)findViewById(R.id.gyrText3);
107                         break;
108                 case GYR1HZ:
109                         textView1 = (TextView)findViewById(R.id.gyr1hzx);
110                         textView2 = (TextView)findViewById(R.id.gyr1hzy);
111                         textView3 = (TextView)findViewById(R.id.gyr1hzz);
112                         break;
113                 case ORIENT:
114                         textView1 = (TextView)findViewById(R.id.orientText1);
115                         textView2 = (TextView)findViewById(R.id.orientText2);
116                         textView3 = (TextView)findViewById(R.id.orientText3);
117                         break;
118                 case WRDACC:
119                         textView1 = (TextView)findViewById(R.id.wrdAccText1);
120                         textView2 = (TextView)findViewById(R.id.wrdAccText2);
121                         textView3 = (TextView)findViewById(R.id.wrdAccText3);
122                         break;
123                 case STPCNT:
124                         textView1 = (TextView)findViewById(R.id.stepCntText);
125                         textView2 = (TextView)findViewById(R.id.calGrvText);
126                         displayNum = 2;
127                         break;
128                 case POSITION:
129                         textView1 = (TextView)findViewById(R.id.curPosXText);
130                         textView2 = (TextView)findViewById(R.id.curPosYText);
131                         displayNum = 2;
132                         break;
133                 case ROTATION:
134                         textView1 = (TextView)findViewById(R.id.roll);
135                         textView2 = (TextView)findViewById(R.id.pitch);
136                         textView3 = (TextView)findViewById(R.id.yaw);
137                         break;
138                 case HEADING:
139                         textView1 = (TextView)findViewById(R.id.headingText);
140                         displayNum = 1;
141                         break;
142                 case WRDGYR:
143                         textView1 = (TextView)findViewById(R.id.wrdGyrText1);
144                         displayNum = 1;
145                         break;
146                 case STABLE:
147                         textView1 = (TextView)findViewById(R.id.stableText);
148                         displayNum = 1;
149                         break;
150                 case BEACON:
151                         textView1 = (TextView)findViewById(R.id.ibLatText);
152                         textView2 = (TextView)findViewById(R.id.ibLonText);
153                         textView3 = (TextView)findViewById(R.id.ibDistText);
154                         displayNum = 3;
155                         break;
156                 default:
157                         Util.debug("Main: Nothing Matches");
158                 }
159
160                 switch (displayNum) {
161                         case 3: textView3.setText(Float.toString(data[3]));
162                         case 2: textView2.setText(Float.toString(data[2]));
163                         case 1: textView1.setText(Float.toString(data[1]));
164                 }
165         }
166
167         /* Private service methods */
168         private void register()
169         {
170                 Util.debug("Main: register");
171                 startService(new Intent(this, Task.class)
172                                 .putExtra("Command",   CMD.Command.REGISTER)
173                                 .putExtra("Messenger", this.messenger));
174         }
175
176         private void connect()
177         {
178                 Util.debug("Main: connect");
179                 startService(new Intent(this, Task.class)
180                                 .putExtra("Command", CMD.Command.CONNECT));
181         }
182
183         private void disconnect()
184         {
185                 Util.debug("Main: disconnect");
186                 startService(new Intent(this, Task.class)
187                                 .putExtra("Command", CMD.Command.DISCONNECT));
188         }
189
190         private void quit()
191         {
192                 this.debug.setText("");
193                 stopService(new Intent(this, Task.class));
194                 Intent intent = new Intent(Intent.ACTION_MAIN);
195                 intent.addCategory(Intent.CATEGORY_HOME);
196                 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
197                 startActivity(intent);
198         }
199
200         /* Activity Methods */
201         @Override
202         public void onCreate(Bundle savedInstanceState)
203         {
204                 try {
205                         super.onCreate(savedInstanceState);
206                         Util.debug("Main: onCreate");
207
208                         // Setup toast
209                         this.toast     = Toast.makeText(this, "", Toast.LENGTH_SHORT);
210
211                         // Setup communication
212                         this.handler   = new MainHandler();
213                         this.messenger = new Messenger(this.handler);
214
215                         // Setup main layout
216                         this.setContentView(R.layout.main);
217
218                         // Find widgets
219                         this.window    = (TabHost)      findViewById(android.R.id.tabhost);
220                         this.tabs      = (TabWidget)    findViewById(android.R.id.tabs);
221                         this.map       = (LinearLayout) findViewById(R.id.map);
222                         this.state     = (LinearLayout) findViewById(R.id.state);
223                         this.debug     = (TextView)     findViewById(R.id.debug);
224                         this.scroll    = (ScrollView)   findViewById(R.id.debug_scroll);
225                         this.rstHdBttn = (Button)       findViewById(R.id.rstHdBttn);
226                         this.rstDstBttn= (Button)       findViewById(R.id.rstDstBttn);
227
228                         // TODO - remove these
229                         rstHdBttn.setOnClickListener(new View.OnClickListener() {
230                                 @Override
231                                 public void onClick(View v) {
232                                         // TODO Auto-generated method stub
233                                         startService(new Intent(Main.this, Task.class)
234                                         .putExtra("Command",   CMD.Command.RSTHEAD));
235                                 }
236                         });
237
238                         rstDstBttn.setOnClickListener(new View.OnClickListener() {
239                                 @Override
240                                 public void onClick(View v) {
241                                         // TODO Auto-generated method stub
242                                         startService(new Intent(Main.this, Task.class)
243                                         .putExtra("Command",   CMD.Command.RSTDST));
244                                 }
245                         });
246
247                         // Get a handle to the Map Fragment
248                         GoogleMap map = ((MapFragment)getFragmentManager()
249                                 .findFragmentById(R.id.map_fragment)).getMap();
250                         Marker mark = map.addMarker(new MarkerOptions()
251                                         .position(new LatLng(34.0722, -118.4441))
252                                         .title("UCLA"));
253
254                         //LatLng sydney = new LatLng(-33.867, 151.206);
255
256                         //map.setMyLocationEnabled(true);
257                         //map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13));
258
259                         //map.addMarker(new MarkerOptions()
260                         //      .title("Sydney")
261                         //      .snippet("The most populous city in Australia.")
262                         //      .position(sydney));
263
264                         // Add window tabs
265                         this.window.setup();
266
267                         this.window.addTab(this.window
268                                         .newTabSpec("state")
269                                         .setIndicator("State")
270                                         .setContent(R.id.state));
271                         this.window.addTab(this.window
272                                         .newTabSpec("map")
273                                         .setIndicator("Map")
274                                         .setContent(R.id.map));
275                         this.window.addTab(this.window
276                                         .newTabSpec("debug")
277                                         .setIndicator("Debug")
278                                         .setContent(R.id.debug));
279
280                         // Attach to background service
281                         this.register();
282
283                 } catch (Exception e) {
284                         Util.debug("Error setting content view", e);
285                         return;
286                 }
287         }
288
289         @Override
290         public void onStart()
291         {
292                 super.onStart();
293                 this.register();
294                 Util.debug("Main: onStart");
295         }
296
297         @Override
298         public void onResume()
299         {
300                 super.onResume();
301                 Util.debug("Main: onResume");
302         }
303
304         @Override
305         public void onPause()
306         {
307                 super.onPause();
308                 Util.debug("Main: onPause");
309         }
310
311         @Override
312         public void onStop()
313         {
314                 super.onStop();
315                 Util.debug("Main: onStop");
316         }
317
318         @Override
319         public void onRestart()
320         {
321                 super.onRestart();
322                 Util.debug("Main: onRestart");
323         }
324
325         @Override
326         public void onDestroy()
327         {
328                 super.onDestroy();
329                 Util.debug("Main: onDestroy");
330         }
331
332         @Override
333         public boolean onCreateOptionsMenu(Menu menu)
334         {
335                 MenuInflater inflater = getMenuInflater();
336                 inflater.inflate(R.menu.main, menu);
337                 return true;
338         }
339
340         @Override
341         public boolean onPrepareOptionsMenu(Menu menu)
342         {
343                 boolean running = this.task != null && this.task.isRunning();
344                 menu.findItem(R.id.connect).setVisible(!running);
345                 menu.findItem(R.id.disconnect).setVisible(running);
346                 return true;
347         }
348
349         @Override
350         public boolean onOptionsItemSelected(MenuItem item)
351         {
352                 switch (item.getItemId()) {
353                         case R.id.connect:
354                                 this.connect();
355                                 return true;
356                         case R.id.disconnect:
357                                 this.disconnect();
358                                 return true;
359                         case R.id.quit:
360                                 this.quit();
361                                 return true;
362                         default:
363                                 return false;
364                 }
365         }
366
367         /* Handler class */
368         class MainHandler extends Handler
369         {
370                 @Override
371                 public void handleMessage(android.os.Message msg)
372                 {
373                         CMD.Response resp = CMD.Response.values()[msg.what];
374                         switch (resp) {
375                                 case REGISTER:
376                                         Main.this.onRegister((Task)msg.obj);
377                                         break;
378                                 case NOTIFY:
379                                         Main.this.onNotify((String)msg.obj);
380                                         break;
381                                 case SHOWDATA:
382                                         Main.this.onShowData((float[])msg.obj);
383                                         break;
384                                 default:
385                                         Util.debug("Main: unknown message - " + resp);
386                                         break;
387                         }
388                 }
389         }
390 }