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