1 package org.average.whereami;
3 import org.average.whereami.WhereAmIprefs;
4 import org.average.whereami.Oracle;
5 import org.average.whereami.PhoneLog;
6 import org.average.whereami.LastLocation;
8 import android.app.Activity;
9 import android.net.wifi.WifiManager;
10 import android.os.Build;
11 import android.os.Bundle;
12 import android.os.AsyncTask;
13 import android.os.Handler;
14 import android.net.ConnectivityManager;
15 import android.net.NetworkInfo;
16 import android.content.BroadcastReceiver;
17 import android.content.Intent;
18 import android.content.IntentFilter;
19 import android.content.Context;
20 import android.content.res.Resources;
21 import android.content.SharedPreferences;
22 import android.preference.PreferenceManager;
23 import android.text.format.Time;
24 import android.util.Log;
25 import android.view.View;
26 import android.view.Menu;
27 import android.view.MenuInflater;
28 import android.view.MenuItem;
29 import android.view.Window;
30 import android.view.WindowManager;
31 import android.widget.TextView;
33 public class WhereAmI extends Activity
35 final String TAG = getClass().getName();
37 private WifiManager wifiman;
38 private Boolean managewifi = false;
39 private Long updatedelay = 60000L;
40 private Integer runningtasks = 0;
41 private SharedPreferences prefs;
42 private PersistentStore store;
44 private class UpdateTarget {
46 private Oracle updater;
47 private BgUpdate task;
49 private class BgUpdate extends AsyncTask<Void, Void, String> {
51 protected String doInBackground(Void... params) {
52 Log.v(TAG, "BgUpdate " + updater + " starting");
53 return updater.getResult();
57 protected void onPostExecute(String str) {
58 Log.v(TAG, "BgUpdate callback executing");
61 if (runningtasks <= 0) {
63 boolean wifion = wifiman.setWifiEnabled(false);
64 Log.v(TAG, "disabling wifi result " + wifion);
68 tvs.setText(R.string.lasttry);
69 tvs.append(tm.format(" %d/%m/%Y %H:%M"));
74 protected void onCancelled() {
75 Log.v(TAG, "BgUpdate callback cancelled");
80 public UpdateTarget(TextView tv, Oracle updater) {
82 this.updater = updater;
85 public void launch() {
86 tv.setText(R.string.updating);
87 task = new BgUpdate();
91 public void cancel() {
95 private UpdateTarget[] ut;
97 private TextView tvt, tvd, tvs;
98 private Resources res;
99 private String[] month;
100 private String[] wday;
102 private Handler mHandler = new Handler();
104 private Runnable updateClock = new Runnable () {
106 long now = System.currentTimeMillis();
107 Time tm = new Time();
109 tvt.setText(tm.format("%H:%M"));
112 long next = tm.toMillis(false);
113 mHandler.postDelayed(this, next-now+1);
117 private Runnable updateCal = new Runnable () {
119 long now = System.currentTimeMillis();
120 Time tm = new Time();
127 tm.set(now + 86400000);
131 long next = tm.toMillis(false);
132 mHandler.postDelayed(this, next-now+1);
136 private Runnable updateInfo = new Runnable () {
138 Log.v(TAG, "updateInfo starting");
140 IntentFilter intentFilter =
141 new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
142 registerReceiver(connChanged,intentFilter);
143 connChangedRegistered = true;
144 boolean wifion = wifiman.setWifiEnabled(true);
145 Log.v(TAG, "enabling wifi result " + wifion);
147 for (int i = 0; i < ut.length; i++) {
152 mHandler.postDelayed(resetInfo, 50000);
153 mHandler.postDelayed(this, updatedelay);
157 private Runnable resetInfo = new Runnable () {
159 Log.v(TAG, "resetInfo starting");
160 if (connChangedRegistered) {
161 unregisterReceiver(connChanged);
162 connChangedRegistered = false;
164 if (runningtasks > 0) {
165 for (int i = 0; i < ut.length; i++) {
168 Time tm = new Time();
170 tvs.setText(R.string.failtry);
171 tvs.append(tm.format(" %d/%m/%Y %H:%M"));
174 boolean wifion = wifiman.setWifiEnabled(false);
175 Log.v(TAG, "disabling wifi result " + wifion);
180 private boolean connChangedRegistered = false;
181 private final BroadcastReceiver connChanged = new BroadcastReceiver() {
183 public void onReceive(Context context, Intent intent) {
184 ConnectivityManager cm = (ConnectivityManager)context.
185 getSystemService(Context.CONNECTIVITY_SERVICE);
186 NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
187 boolean isConnected = activeNetwork != null &&
188 activeNetwork.isConnectedOrConnecting();
189 Log.v(TAG, "Connectivity changed to " + isConnected);
191 for (int i = 0; i < ut.length; i++) {
199 /** Called when the activity is first created. */
201 public void onCreate(Bundle savedInstanceState) {
202 super.onCreate(savedInstanceState);
203 if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {
204 Log.v(TAG, "Disabling keepalive for build version " +
205 Build.VERSION.SDK_INT);
206 System.setProperty("http.keepAlive", "false");
208 Log.v(TAG, "Post-Froyo version " +
209 Build.VERSION.SDK_INT);
211 prefs = PreferenceManager.getDefaultSharedPreferences(this);
212 store = new PersistentStore(prefs);
213 wifiman = (WifiManager)getSystemService(Context.WIFI_SERVICE);
214 requestWindowFeature(Window.FEATURE_NO_TITLE);
215 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
216 setContentView(R.layout.main);
217 res = getResources();
218 month = res.getStringArray(R.array.month);
219 wday = res.getStringArray(R.array.wday);
220 tvt = (TextView)findViewById(R.id.time);
221 tvd = (TextView)findViewById(R.id.date);
222 tvs = (TextView)findViewById(R.id.timestamp);
225 /** Called when reactivated */
227 public void onResume() {
229 boolean fullscreen = prefs.getBoolean("fullscreen", false);
230 managewifi = prefs.getBoolean("managewifi", false);
231 updatedelay = Long.parseLong(prefs.getString("updateperiod", "1200000"));
232 Log.v("WhereAmI", "fullscreen: " + fullscreen +
233 ", managewifi: " + managewifi +
234 ", updatedelay: " + updatedelay);
236 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
237 getWindow().clearFlags(WindowManager.LayoutParams.
238 FLAG_FORCE_NOT_FULLSCREEN);
240 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
242 ut = new UpdateTarget[] {
243 new UpdateTarget((TextView)findViewById(R.id.phonecall),
244 new PhoneLog(res, store)),
245 new UpdateTarget((TextView)findViewById(R.id.location),
246 new LastLocation(res, store))
248 Log.v(TAG, "created UI, about to start update tasks");
249 mHandler.post(updateClock);
250 mHandler.post(updateCal);
251 mHandler.post(updateInfo);
252 Log.v(TAG, "created UI, update tasks created");
255 /** Called when put to background */
257 public void onPause() {
259 Log.v(TAG, "going background");
263 /** Called when the activity is destroyed. */
265 public void onDestroy() {
267 Log.v(TAG, "going down");
268 mHandler.removeCallbacks(updateClock);
269 mHandler.removeCallbacks(updateCal);
270 mHandler.removeCallbacks(updateInfo);
271 if (connChangedRegistered) {
272 unregisterReceiver(connChanged);
273 connChangedRegistered = false;
276 boolean wifion = wifiman.setWifiEnabled(false);
277 Log.v(TAG, "disabling wifi result " + wifion);
281 /** Called when the menu is activated. */
283 public boolean onCreateOptionsMenu(Menu menu) {
284 MenuInflater inflater = getMenuInflater();
285 inflater.inflate(R.menu.main_menu, menu);
289 /** Called when the menu item is selected */
291 public boolean onOptionsItemSelected(MenuItem item) {
292 switch (item.getItemId()) {
297 Log.v(TAG, "authorize requested");
298 startActivity(new Intent(this, Authorize.class));
301 Log.v(TAG, "settings requested");
302 startActivity(new Intent(this, WhereAmIprefs.class));
305 return super.onOptionsItemSelected(item);