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.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;
32 public class WhereAmI extends Activity
34 final String TAG = getClass().getName();
36 private WifiManager wifiman;
37 private Boolean managewifi = false;
38 private Long updatedelay = 60000L;
39 private Integer runningtasks = 0;
40 private SharedPreferences prefs;
41 private CredentialStore store;
43 private class UpdateTarget {
45 private Oracle updater;
46 private BgUpdate task;
48 private class BgUpdate extends AsyncTask<Void, Void, String> {
50 protected String doInBackground(Void... params) {
51 Log.w(TAG, "BgUpdate " + updater + " starting");
52 return updater.getResult();
56 protected void onPostExecute(String str) {
57 Log.w(TAG, "BgUpdate callback executing");
60 if (runningtasks <= 0) {
62 boolean wifion = wifiman.setWifiEnabled(false);
63 Log.w(TAG, "disabling wifi result " + wifion);
67 tvs.setText(R.string.lasttry);
68 tvs.append(tm.format(" %d/%m/%Y %H:%M:%S"));
73 protected void onCancelled() {
74 Log.w(TAG, "BgUpdate callback cancelled");
79 public UpdateTarget(TextView tv, Oracle updater) {
81 this.updater = updater;
84 public void launch() {
85 tv.setText(R.string.updating);
86 task = new BgUpdate();
90 public void cancel() {
94 private UpdateTarget[] ut;
96 private TextView tvt, tvd, tvs;
97 private Resources res;
98 private String[] month;
99 private String[] wday;
101 private Handler mHandler = new Handler();
103 private Runnable updateClock = new Runnable () {
105 long now = System.currentTimeMillis();
106 Time tm = new Time();
108 tvt.setText(tm.format("%H:%M"));
111 long next = tm.toMillis(false);
112 mHandler.postDelayed(this, next-now+1);
116 private Runnable updateCal = new Runnable () {
118 long now = System.currentTimeMillis();
119 Time tm = new Time();
126 tm.set(now + 86400000);
130 long next = tm.toMillis(false);
131 mHandler.postDelayed(this, next-now+1);
135 private Runnable updateInfo = new Runnable () {
137 Log.w(TAG, "updateInfo starting");
139 IntentFilter intentFilter =
140 new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
141 registerReceiver(connChanged,intentFilter);
142 connChangedRegistered = true;
143 boolean wifion = wifiman.setWifiEnabled(true);
144 Log.w(TAG, "enabling wifi result " + wifion);
146 for (int i = 0; i < ut.length; i++) {
151 mHandler.postDelayed(resetInfo, 50000);
152 mHandler.postDelayed(this, updatedelay);
156 private Runnable resetInfo = new Runnable () {
158 Log.w(TAG, "resetInfo starting");
159 if (connChangedRegistered) {
160 unregisterReceiver(connChanged);
161 connChangedRegistered = false;
163 if (runningtasks > 0) {
164 for (int i = 0; i < ut.length; i++) {
167 Time tm = new Time();
169 tvs.setText(R.string.failtry);
170 tvs.append(tm.format(" %d/%m/%Y %H:%M:%S"));
173 boolean wifion = wifiman.setWifiEnabled(false);
174 Log.w(TAG, "disabling wifi result " + wifion);
179 private boolean connChangedRegistered = false;
180 private final BroadcastReceiver connChanged = new BroadcastReceiver() {
182 public void onReceive(Context context, Intent intent) {
183 ConnectivityManager cm = (ConnectivityManager)context.
184 getSystemService(Context.CONNECTIVITY_SERVICE);
185 NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
186 boolean isConnected = activeNetwork != null &&
187 activeNetwork.isConnectedOrConnecting();
188 Log.w(TAG, "Connectivity changed to " + isConnected);
190 for (int i = 0; i < ut.length; i++) {
198 /** Called when the activity is first created. */
200 public void onCreate(Bundle savedInstanceState) {
201 super.onCreate(savedInstanceState);
202 prefs = PreferenceManager.getDefaultSharedPreferences(this);
203 store = new CredentialStore(prefs);
204 wifiman = (WifiManager)getSystemService(Context.WIFI_SERVICE);
205 requestWindowFeature(Window.FEATURE_NO_TITLE);
206 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
207 setContentView(R.layout.main);
208 res = getResources();
209 month = res.getStringArray(R.array.month);
210 wday = res.getStringArray(R.array.wday);
211 tvt = (TextView)findViewById(R.id.time);
212 tvd = (TextView)findViewById(R.id.date);
213 tvs = (TextView)findViewById(R.id.timestamp);
214 ut = new UpdateTarget[] {
215 new UpdateTarget((TextView)findViewById(R.id.location),
216 new PhoneLog(store)),
217 new UpdateTarget((TextView)findViewById(R.id.phonecall),
218 new LastLocation(store))
220 Log.w(TAG, "created UI, about to start update task");
221 mHandler.post(updateClock);
222 mHandler.post(updateCal);
223 mHandler.post(updateInfo);
224 Log.w(TAG, "created UI, update task created");
227 /** Called when reactivated */
229 public void onResume() {
231 boolean fullscreen = prefs.getBoolean("fullscreen", false);
232 managewifi = prefs.getBoolean("managewifi", false);
233 updatedelay = Long.parseLong(prefs.getString("updateperiod", "1200000"));
234 Log.w("WhereAmI", "fullscreen: " + fullscreen +
235 ", managewifi: " + managewifi +
236 ", updatedelay: " + updatedelay);
238 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
239 getWindow().clearFlags(WindowManager.LayoutParams.
240 FLAG_FORCE_NOT_FULLSCREEN);
242 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
246 /** Called when put to background */
248 public void onPause() {
250 Log.w(TAG, "going background");
253 /** Called when the activity is destroyed. */
255 public void onDestroy() {
257 Log.w(TAG, "going down");
258 mHandler.removeCallbacks(updateClock);
259 mHandler.removeCallbacks(updateCal);
260 mHandler.removeCallbacks(updateInfo);
261 if (connChangedRegistered) {
262 unregisterReceiver(connChanged);
263 connChangedRegistered = false;
266 boolean wifion = wifiman.setWifiEnabled(false);
267 Log.w(TAG, "disabling wifi result " + wifion);
271 /** Called when the menu is activated. */
273 public boolean onCreateOptionsMenu(Menu menu) {
274 MenuInflater inflater = getMenuInflater();
275 inflater.inflate(R.menu.main_menu, menu);
279 /** Called when the menu item is selected */
281 public boolean onOptionsItemSelected(MenuItem item) {
282 switch (item.getItemId()) {
287 Log.w(TAG, "authorize requested");
288 startActivity(new Intent(this, Authorize.class));
291 Log.w(TAG, "settings requested");
292 startActivity(new Intent(this, WhereAmIprefs.class));
295 return super.onOptionsItemSelected(item);