add options menu
[WhereAmI.git] / src / org / average / whereami / WhereAmI.java
1 package org.average.whereami;
2
3 import android.app.Activity;
4 import android.net.wifi.WifiManager;
5 import android.os.Bundle;
6 import android.os.AsyncTask;
7 import android.os.Handler;
8 import android.os.SystemClock;
9 import android.net.ConnectivityManager;
10 import android.net.NetworkInfo;
11 import android.content.BroadcastReceiver;
12 import android.content.Intent;
13 import android.content.IntentFilter;
14 import android.content.Context;
15 import android.content.res.Resources;
16 import android.text.format.Time;
17 import android.util.Log;
18 import android.view.View;
19 import android.view.Menu;
20 import android.view.MenuInflater;
21 import android.view.MenuItem;
22 import android.view.Window;
23 import android.view.WindowManager;
24 import android.widget.TextView;
25
26 public class WhereAmI extends Activity
27 {
28     private WifiManager wifiman;
29     private Integer runningtasks = 0;
30
31     private class UpdateTarget {
32         private TextView tv;
33         private Integer updater; // will be the function/object
34         private BgUpdate task;
35
36         private class BgUpdate extends AsyncTask<Void, Void, String> {
37             @Override
38             protected String doInBackground(Void... params) {
39                 Log.w("WhereAmI", "BgUpdate " + updater + " starting");
40                 SystemClock.sleep(5000); // real job do be done here
41                 Log.w("WhereAmI", "BgUpdate about to return");
42                 return "5 seconds passed in " + updater;
43             }
44         
45             @Override
46             protected void onPostExecute(String str) {
47                 Log.w("WhereAmI", "BgUpdate callback executing");
48                 tv.setText(str);
49                 runningtasks--;
50                 if (runningtasks <= 0) {
51                     boolean wifion = wifiman.setWifiEnabled(false);
52                     Log.w("WhereAmI", "disabling wifi result " + wifion);
53                     Time tm = new Time();
54                     tm.setToNow();
55                     tvs.setText(R.string.lasttry);
56                     tvs.append(tm.format(" %d/%m/%Y %H:%M:%S"));
57                 }
58             }
59
60             @Override
61             protected void onCancelled() {
62                 Log.w("WhereAmI", "BgUpdate callback cancelled");
63                 runningtasks--;
64             }
65         }
66
67         public UpdateTarget(TextView tv, Integer updater) {
68             this.tv = tv;
69             this.updater = updater;
70         }
71
72         public void launch() {
73             tv.setText(R.string.updating);
74             task = new BgUpdate();
75             task.execute();
76         }
77
78         public void cancel() {
79             task.cancel(true);
80         }
81     }
82     private UpdateTarget[] ut;
83
84     private TextView tvt, tvd, tvs;
85     private Resources res;
86     private String[] month;
87     private String[] wday;
88
89     private Handler mHandler = new Handler();
90
91     private Runnable updateClock = new Runnable () {
92         public void run() {
93             long now = System.currentTimeMillis();
94             Time tm = new Time();
95             tm.set(now);
96             tvt.setText(tm.format("%H:%M"));
97             tm.set(now + 60000);
98             tm.second=0;
99             long next = tm.toMillis(false);
100             mHandler.postDelayed(this, next-now+1);
101         }
102     };
103
104     private Runnable updateCal = new Runnable () {
105         public void run() {
106             long now = System.currentTimeMillis();
107             Time tm = new Time();
108             tm.set(now);
109             tvd.setText(
110                        wday[tm.weekDay] +
111                        tm.format("\n%d ") +
112                        month[tm.month] +
113                        tm.format(" %Y"));
114             tm.set(now + 86400000);
115             tm.hour=0;
116             tm.minute=0;
117             tm.second=0;
118             long next = tm.toMillis(false);
119             mHandler.postDelayed(this, next-now+1);
120         }
121     };
122
123     private Runnable updateInfo = new Runnable () {
124         public void run() {
125             Log.w("WhereAmI", "updateInfo starting");
126             IntentFilter intentFilter =
127                 new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
128             registerReceiver(connChanged,intentFilter);
129             boolean wifion = wifiman.setWifiEnabled(true);
130             Log.w("WhereAmI", "enabling wifi result " + wifion);
131             mHandler.postDelayed(resetInfo, 30000);
132             mHandler.postDelayed(this, 60000);
133         }
134     };
135
136     private Runnable resetInfo = new Runnable () {
137         public void run() {
138             Log.w("WhereAmI", "resetInfo starting");
139             unregisterReceiver(connChanged);
140             if (runningtasks > 0) {
141                 for (int i = 0; i < ut.length; i++) {
142                     ut[i].cancel();
143                 }
144                 Time tm = new Time();
145                 tm.setToNow();
146                 tvs.setText(R.string.failtry);
147                 tvs.append(tm.format(" %d/%m/%Y %H:%M:%S"));
148             }
149             boolean wifion = wifiman.setWifiEnabled(false);
150             Log.w("WhereAmI", "disabling wifi result " + wifion);
151         }
152     };
153
154     private final BroadcastReceiver connChanged = new BroadcastReceiver() {
155         @Override
156         public void onReceive(Context context, Intent intent) {
157             ConnectivityManager cm = (ConnectivityManager)context.
158                            getSystemService(Context.CONNECTIVITY_SERVICE);
159             NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
160             boolean isConnected = activeNetwork != null &&
161                                   activeNetwork.isConnectedOrConnecting();
162             Log.w("WhereAmI", "Connectivity changed to " + isConnected);
163             if (isConnected) {
164                 for (int i = 0; i < ut.length; i++) {
165                     runningtasks++;
166                     ut[i].launch();
167                 }
168             }
169         }
170     };
171
172     /** Called when the activity is first created. */
173     @Override
174     public void onCreate(Bundle savedInstanceState)
175     {
176         super.onCreate(savedInstanceState);
177         wifiman = (WifiManager)getSystemService(Context.WIFI_SERVICE);
178         requestWindowFeature(Window.FEATURE_NO_TITLE);
179         getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
180         //getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
181         //getWindow().clearFlags(WindowManager.LayoutParams.
182         //                                      FLAG_FORCE_NOT_FULLSCREEN);
183         setContentView(R.layout.main);
184         res = getResources();
185         month = res.getStringArray(R.array.month);
186         wday = res.getStringArray(R.array.wday);
187         tvt = (TextView)findViewById(R.id.time);
188         tvd = (TextView)findViewById(R.id.date);
189         tvs = (TextView)findViewById(R.id.timestamp);
190         ut = new UpdateTarget[] {
191             new UpdateTarget((TextView)findViewById(R.id.location),  1),
192             new UpdateTarget((TextView)findViewById(R.id.phonecall), 2)
193         };
194         Log.w("WhereAmI", "created UI, about to start update task");
195         mHandler.post(updateClock);
196         mHandler.post(updateCal);
197         mHandler.post(updateInfo);
198         Log.w("WhereAmI", "created UI, update task created");
199     }
200
201     /** Called when put to background */
202     @Override
203     public void onPause()
204     {
205         super.onPause();
206         Log.w("WhereAmI", "calling finish");
207         finish();
208     }
209
210     /** Called when the activity is destroyed. */
211     @Override
212     public void onDestroy()
213     {
214         super.onDestroy();
215         Log.w("WhereAmI", "going down");
216         mHandler.removeCallbacks(updateClock);
217         mHandler.removeCallbacks(updateCal);
218         mHandler.removeCallbacks(updateInfo);
219         //unregisterReceiver(connChanged);
220         boolean wifion = wifiman.setWifiEnabled(false);
221         Log.w("WhereAmI", "disabling wifi result " + wifion);
222     }
223
224     /** Called when the menu is activated. */
225     @Override
226     public boolean onCreateOptionsMenu(Menu menu) {
227         MenuInflater inflater = getMenuInflater();
228         inflater.inflate(R.menu.main_menu, menu);
229         return true;
230     }
231
232     /** Called when the menu item is selected */
233     @Override
234     public boolean onOptionsItemSelected(MenuItem item) {
235         switch (item.getItemId()) {
236         case R.id.quit:
237             finish();
238             return true;
239         case R.id.settings:
240             Log.w("WhereAmI", "settings requested");
241             return true;
242         default:
243             return super.onOptionsItemSelected(item);
244         }
245     }
246 }