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