988f1fb53149b88be2f366ce151d50483db5e3e6
[WhereAmI.git] / src / org / average / whereami / WhereAmI.java
1 package org.average.whereami;
2
3 import android.app.Activity;
4 import android.net.wifi.WifiManager;
5 import android.os.Bundle;
6 import android.os.AsyncTask;
7 import android.os.Handler;
8 import android.os.SystemClock;
9 import android.net.ConnectivityManager;
10 import android.net.NetworkInfo;
11 import android.content.BroadcastReceiver;
12 import android.content.Intent;
13 import android.content.IntentFilter;
14 import android.content.Context;
15 import android.content.res.Resources;
16 import android.text.format.Time;
17 import android.util.Log;
18 import android.view.View;
19 import android.view.Window;
20 import android.view.WindowManager;
21 import android.widget.TextView;
22
23 public class WhereAmI extends Activity
24 {
25     private WifiManager wifiman;
26     private Integer runningtasks = 0;
27
28     private class UpdateTarget {
29         private TextView tv;
30         private Integer updater; // will be the function/object
31         private BgUpdate task;
32
33         private class BgUpdate extends AsyncTask<Void, Void, String> {
34             @Override
35             protected String doInBackground(Void... params) {
36                 Log.w("WhereAmI", "BgUpdate " + updater + " starting");
37                 SystemClock.sleep(5000); // real job do be done here
38                 Log.w("WhereAmI", "BgUpdate about to return");
39                 return "5 seconds passed in " + updater;
40             }
41         
42             @Override
43             protected void onPostExecute(String str) {
44                 Log.w("WhereAmI", "BgUpdate callback executing");
45                 tv.setText(str);
46                 runningtasks--;
47                 if (runningtasks <= 0) {
48                     boolean wifion = wifiman.setWifiEnabled(false);
49                     Log.w("WhereAmI", "disabling wifi result " + wifion);
50                     Time tm = new Time();
51                     tm.setToNow();
52                     tvs.setText(R.string.lasttry);
53                     tvs.append(tm.format(" %d/%m/%Y %H:%M:%S"));
54                 }
55             }
56
57             @Override
58             protected void onCancelled() {
59                 Log.w("WhereAmI", "BgUpdate callback cancelled");
60                 runningtasks--;
61             }
62         }
63
64         public UpdateTarget(TextView tv, Integer updater) {
65             this.tv = tv;
66             this.updater = updater;
67         }
68
69         public void launch() {
70             tv.setText(R.string.updating);
71             task = new BgUpdate();
72             task.execute();
73         }
74
75         public void cancel() {
76             task.cancel(true);
77         }
78     }
79     private UpdateTarget[] ut;
80
81     private TextView tvt, tvd, tvs;
82     private Resources res;
83     private String[] month;
84     private String[] wday;
85
86     private Handler mHandler = new Handler();
87
88     private Runnable updateClock = new Runnable () {
89         public void run() {
90             long now = System.currentTimeMillis();
91             Time tm = new Time();
92             tm.set(now);
93             tvt.setText(tm.format("%H:%M"));
94             tm.set(now + 60000);
95             tm.second=0;
96             long next = tm.toMillis(false);
97             mHandler.postDelayed(this, next-now+1);
98         }
99     };
100
101     private Runnable updateCal = new Runnable () {
102         public void run() {
103             long now = System.currentTimeMillis();
104             Time tm = new Time();
105             tm.set(now);
106             tvd.setText(
107                        wday[tm.weekDay] +
108                        tm.format("\n%d ") +
109                        month[tm.month] +
110                        tm.format(" %Y"));
111             tm.set(now + 86400000);
112             tm.hour=0;
113             tm.minute=0;
114             tm.second=0;
115             long next = tm.toMillis(false);
116             mHandler.postDelayed(this, next-now+1);
117         }
118     };
119
120     private Runnable updateInfo = new Runnable () {
121         public void run() {
122             Log.w("WhereAmI", "updateInfo starting");
123             IntentFilter intentFilter =
124                 new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
125             registerReceiver(connChanged,intentFilter);
126             boolean wifion = wifiman.setWifiEnabled(true);
127             Log.w("WhereAmI", "enabling wifi result " + wifion);
128             mHandler.postDelayed(resetInfo, 30000);
129             mHandler.postDelayed(this, 60000);
130         }
131     };
132
133     private Runnable resetInfo = new Runnable () {
134         public void run() {
135             Log.w("WhereAmI", "resetInfo starting");
136             unregisterReceiver(connChanged);
137             if (runningtasks > 0) {
138                 for (int i = 0; i < ut.length; i++) {
139                     ut[i].cancel();
140                 }
141                 Time tm = new Time();
142                 tm.setToNow();
143                 tvs.setText(R.string.failtry);
144                 tvs.append(tm.format(" %d/%m/%Y %H:%M:%S"));
145             }
146             boolean wifion = wifiman.setWifiEnabled(false);
147             Log.w("WhereAmI", "disabling wifi result " + wifion);
148         }
149     };
150
151     private final BroadcastReceiver connChanged = new BroadcastReceiver() {
152         @Override
153         public void onReceive(Context context, Intent intent) {
154             ConnectivityManager cm = (ConnectivityManager)context.
155                            getSystemService(Context.CONNECTIVITY_SERVICE);
156             NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
157             boolean isConnected = activeNetwork != null &&
158                                   activeNetwork.isConnectedOrConnecting();
159             Log.w("WhereAmI", "Connectivity changed to " + isConnected);
160             if (isConnected) {
161                 for (int i = 0; i < ut.length; i++) {
162                     runningtasks++;
163                     ut[i].launch();
164                 }
165             }
166         }
167     };
168
169     /** Called when the activity is first created. */
170     @Override
171     public void onCreate(Bundle savedInstanceState)
172     {
173         super.onCreate(savedInstanceState);
174         wifiman = (WifiManager)getSystemService(Context.WIFI_SERVICE);
175         requestWindowFeature(Window.FEATURE_NO_TITLE);
176         getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
177         //getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
178         //getWindow().clearFlags(WindowManager.LayoutParams.
179         //                                      FLAG_FORCE_NOT_FULLSCREEN);
180         setContentView(R.layout.main);
181         res = getResources();
182         month = res.getStringArray(R.array.month);
183         wday = res.getStringArray(R.array.wday);
184         tvt = (TextView)findViewById(R.id.time);
185         tvd = (TextView)findViewById(R.id.date);
186         tvs = (TextView)findViewById(R.id.timestamp);
187         ut = new UpdateTarget[] {
188             new UpdateTarget((TextView)findViewById(R.id.location),  1),
189             new UpdateTarget((TextView)findViewById(R.id.phonecall), 2)
190         };
191         Log.w("WhereAmI", "created UI, about to start update task");
192         mHandler.post(updateClock);
193         mHandler.post(updateCal);
194         mHandler.post(updateInfo);
195         Log.w("WhereAmI", "created UI, update task created");
196     }
197
198     /** Called when put to background */
199     @Override
200     public void onPause()
201     {
202         super.onPause();
203         Log.w("WhereAmI", "calling finish");
204         finish();
205     }
206
207     /** Called when the activity is destroyed. */
208     @Override
209     public void onDestroy()
210     {
211         super.onDestroy();
212         Log.w("WhereAmI", "going down");
213         mHandler.removeCallbacks(updateClock);
214         mHandler.removeCallbacks(updateCal);
215         mHandler.removeCallbacks(updateInfo);
216         //unregisterReceiver(connChanged);
217         boolean wifion = wifiman.setWifiEnabled(false);
218         Log.w("WhereAmI", "disabling wifi result " + wifion);
219     }
220 }