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