1 package org.average.whereami;
3 import org.average.whereami.WhereAmIprefs;
4 import org.average.whereami.APIBase;
5 import org.average.whereami.Oracle;
6 import org.average.whereami.PhoneLog;
7 import org.average.whereami.LastLocation;
9 import android.app.Activity;
10 import android.net.wifi.WifiManager;
11 import android.os.Build;
12 import android.os.Bundle;
13 import android.os.AsyncTask;
14 import android.os.Handler;
15 import android.net.ConnectivityManager;
16 import android.net.NetworkInfo;
17 import android.content.BroadcastReceiver;
18 import android.content.Intent;
19 import android.content.IntentFilter;
20 import android.content.Context;
21 import android.content.res.Resources;
22 import android.content.SharedPreferences;
23 import android.preference.PreferenceManager;
24 import android.text.format.Time;
25 import android.util.Log;
26 import android.view.View;
27 import android.view.Menu;
28 import android.view.MenuInflater;
29 import android.view.MenuItem;
30 import android.view.Window;
31 import android.view.WindowManager;
32 import android.widget.TextView;
34 public class WhereAmI extends Activity
36 final String TAG = getClass().getName();
38 private WifiManager wifiman;
39 private Boolean managewifi = false;
40 private Long updatedelay = 60000L;
41 private Integer runningtasks = 0;
42 private SharedPreferences prefs;
43 private PersistentStore store;
45 private class UpdateTarget {
47 private Oracle updater;
48 private BgUpdate task;
50 private class BgUpdate extends AsyncTask<Void, Void, String> {
52 protected String doInBackground(Void... params) {
53 Log.v(TAG, "BgUpdate " + updater + " starting");
54 return updater.getResult();
58 protected void onPostExecute(String str) {
59 Log.v(TAG, "BgUpdate callback executing");
62 if (runningtasks <= 0) {
64 boolean wifion = wifiman.setWifiEnabled(false);
65 Log.v(TAG, "disabling wifi result " + wifion);
69 tvs.setText(R.string.lasttry);
70 tvs.append(tm.format(" %d/%m/%Y %H:%M"));
75 protected void onCancelled() {
76 Log.v(TAG, "BgUpdate callback cancelled");
81 public UpdateTarget(TextView tv, Oracle updater) {
83 this.updater = updater;
86 public void launch() {
87 tv.setText(R.string.updating);
88 task = new BgUpdate();
92 public void cancel() {
96 private UpdateTarget[] ut;
98 private TextView tvt, tvd, tvs;
99 private Resources res;
100 private String[] month;
101 private String[] wday;
103 private Handler mHandler = new Handler();
105 private Runnable updateClock = new Runnable () {
107 long now = System.currentTimeMillis();
108 Time tm = new Time();
110 tvt.setText(tm.format("%H:%M"));
113 long next = tm.toMillis(false);
114 mHandler.postDelayed(this, next-now+1);
118 private Runnable updateCal = new Runnable () {
120 long now = System.currentTimeMillis();
121 Time tm = new Time();
128 tm.set(now + 86400000);
132 long next = tm.toMillis(false);
133 mHandler.postDelayed(this, next-now+1);
137 private Runnable updateInfo = new Runnable () {
139 Log.v(TAG, "updateInfo starting");
141 IntentFilter intentFilter =
142 new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
143 registerReceiver(connChanged,intentFilter);
144 connChangedRegistered = true;
145 boolean wifion = wifiman.setWifiEnabled(true);
146 Log.v(TAG, "enabling wifi result " + wifion);
148 for (int i = 0; i < ut.length; i++) {
153 mHandler.postDelayed(resetInfo, 50000);
154 mHandler.postDelayed(this, updatedelay);
158 private Runnable resetInfo = new Runnable () {
160 Log.v(TAG, "resetInfo starting");
161 if (connChangedRegistered) {
162 unregisterReceiver(connChanged);
163 connChangedRegistered = false;
165 if (runningtasks > 0) {
166 for (int i = 0; i < ut.length; i++) {
170 Time tm = new Time();
172 tvs.setText(R.string.failtry);
173 tvs.append(tm.format(" %d/%m/%Y %H:%M"));
176 boolean wifion = wifiman.setWifiEnabled(false);
177 Log.v(TAG, "disabling wifi result " + wifion);
182 private boolean connChangedRegistered = false;
183 private final BroadcastReceiver connChanged = new BroadcastReceiver() {
185 public void onReceive(Context context, Intent intent) {
186 ConnectivityManager cm = (ConnectivityManager)context.
187 getSystemService(Context.CONNECTIVITY_SERVICE);
188 NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
189 boolean isConnected = activeNetwork != null &&
190 activeNetwork.isConnectedOrConnecting();
191 Log.v(TAG, "Connectivity changed to " + isConnected);
193 for (int i = 0; i < ut.length; i++) {
201 /** Called when the activity is first created. */
203 public void onCreate(Bundle savedInstanceState) {
204 super.onCreate(savedInstanceState);
205 if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {
206 Log.v(TAG, "Disabling keepalive for build version " +
207 Build.VERSION.SDK_INT);
208 System.setProperty("http.keepAlive", "false");
210 Log.v(TAG, "Post-Froyo version " +
211 Build.VERSION.SDK_INT);
213 prefs = PreferenceManager.getDefaultSharedPreferences(this);
214 store = new PersistentStore(prefs);
215 wifiman = (WifiManager)getSystemService(Context.WIFI_SERVICE);
216 requestWindowFeature(Window.FEATURE_NO_TITLE);
217 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
218 setContentView(R.layout.main);
219 res = getResources();
220 month = res.getStringArray(R.array.month);
221 wday = res.getStringArray(R.array.wday);
222 tvt = (TextView)findViewById(R.id.time);
223 tvd = (TextView)findViewById(R.id.date);
224 tvs = (TextView)findViewById(R.id.timestamp);
225 APIBase base = new APIBase(res, store);
226 ut = new UpdateTarget[] {
227 new UpdateTarget((TextView)findViewById(R.id.phonecall),
229 new UpdateTarget((TextView)findViewById(R.id.location),
230 new LastLocation(base))
234 /** Called when reactivated */
236 public void onResume() {
238 boolean fullscreen = prefs.getBoolean("fullscreen", false);
239 managewifi = prefs.getBoolean("managewifi", false);
240 updatedelay = Long.parseLong(prefs.getString("updateperiod", "1200000"));
241 Log.v("WhereAmI", "fullscreen: " + fullscreen +
242 ", managewifi: " + managewifi +
243 ", updatedelay: " + updatedelay);
245 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
246 getWindow().clearFlags(WindowManager.LayoutParams.
247 FLAG_FORCE_NOT_FULLSCREEN);
249 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
251 mHandler.post(updateClock);
252 mHandler.post(updateCal);
253 mHandler.post(updateInfo);
254 Log.v(TAG, "update tasks scheduled");
257 /** Called when put to background */
259 public void onPause() {
261 Log.v(TAG, "going background");
263 mHandler.removeCallbacks(updateClock);
264 mHandler.removeCallbacks(updateCal);
265 mHandler.removeCallbacks(updateInfo);
268 /** Called when the activity is destroyed. */
270 public void onDestroy() {
272 Log.v(TAG, "going down");
275 /** Called when the menu is activated. */
277 public boolean onCreateOptionsMenu(Menu menu) {
278 MenuInflater inflater = getMenuInflater();
279 inflater.inflate(R.menu.main_menu, menu);
283 /** Called when the menu item is selected */
285 public boolean onOptionsItemSelected(MenuItem item) {
286 switch (item.getItemId()) {
291 Log.v(TAG, "authorize requested");
292 startActivity(new Intent(this, Authorize.class));
295 Log.v(TAG, "settings requested");
296 startActivity(new Intent(this, WhereAmIprefs.class));
299 return super.onOptionsItemSelected(item);