cancel background tasks on timeout
[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
58         public UpdateTarget(TextView tv, Integer updater) {
59             this.tv = tv;
60             this.updater = updater;
61         }
62
63         public void launch() {
64             tv.setText(R.string.updating);
65             task = new BgUpdate();
66             task.execute();
67         }
68
69         public void cancel() {
70             task.cancel(true);
71         }
72     }
73     private UpdateTarget[] ut;
74
75     private TextView tvt, tvd, tvs;
76     private Resources res;
77     private String[] month;
78     private String[] wday;
79
80     private Handler mHandler = new Handler();
81
82     private Runnable updateClock = new Runnable () {
83         public void run() {
84             long now = System.currentTimeMillis();
85             Time tm = new Time();
86             tm.set(now);
87             tvt.setText(tm.format("%H:%M"));
88             tm.set(now + 60000);
89             tm.second=0;
90             long next = tm.toMillis(false);
91             mHandler.postDelayed(this, next-now+1);
92         }
93     };
94
95     private Runnable updateCal = new Runnable () {
96         public void run() {
97             long now = System.currentTimeMillis();
98             Time tm = new Time();
99             tm.set(now);
100             tvd.setText(
101                        wday[tm.weekDay] +
102                        tm.format("\n%d ") +
103                        month[tm.month] +
104                        tm.format(" %Y"));
105             tm.set(now + 86400000);
106             tm.hour=0;
107             tm.minute=0;
108             tm.second=0;
109             long next = tm.toMillis(false);
110             mHandler.postDelayed(this, next-now+1);
111         }
112     };
113
114     private Runnable updateInfo = new Runnable () {
115         public void run() {
116             Log.w("WhereAmI", "updateInfo starting");
117             IntentFilter intentFilter =
118                 new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
119             registerReceiver(connChanged,intentFilter);
120             boolean wifion = wifiman.setWifiEnabled(true);
121             Log.w("WhereAmI", "enabling wifi result " + wifion);
122             mHandler.postDelayed(resetInfo, 30000);
123             mHandler.postDelayed(this, 60000);
124         }
125     };
126
127     private Runnable resetInfo = new Runnable () {
128         public void run() {
129             Log.w("WhereAmI", "resetInfo starting");
130             unregisterReceiver(connChanged);
131             if (runningtasks > 0) {
132                 for (int i = 0; i < ut.length; i++) {
133                     ut[i].cancel();
134                 }
135                 Time tm = new Time();
136                 tm.setToNow();
137                 tvs.setText(R.string.failtry);
138                 tvs.append(tm.format(" %d/%m/%Y %H:%M:%S"));
139             }
140             boolean wifion = wifiman.setWifiEnabled(false);
141             Log.w("WhereAmI", "disabling wifi result " + wifion);
142         }
143     };
144
145     private final BroadcastReceiver connChanged = new BroadcastReceiver() {
146         @Override
147         public void onReceive(Context context, Intent intent) {
148             ConnectivityManager cm = (ConnectivityManager)context.
149                            getSystemService(Context.CONNECTIVITY_SERVICE);
150             NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
151             boolean isConnected = activeNetwork != null &&
152                                   activeNetwork.isConnectedOrConnecting();
153             Log.w("WhereAmI", "Connectivity changed to " + isConnected);
154             if (isConnected) {
155                 for (int i = 0; i < ut.length; i++) {
156                     runningtasks++;
157                     ut[i].launch();
158                 }
159             }
160         }
161     };
162
163     /** Called when the activity is first created. */
164     @Override
165     public void onCreate(Bundle savedInstanceState)
166     {
167         super.onCreate(savedInstanceState);
168         wifiman = (WifiManager)getSystemService(Context.WIFI_SERVICE);
169         requestWindowFeature(Window.FEATURE_NO_TITLE);
170         getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
171         //getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
172         //getWindow().clearFlags(WindowManager.LayoutParams.
173         //                                      FLAG_FORCE_NOT_FULLSCREEN);
174         setContentView(R.layout.main);
175         res = getResources();
176         month = res.getStringArray(R.array.month);
177         wday = res.getStringArray(R.array.wday);
178         tvt = (TextView)findViewById(R.id.time);
179         tvd = (TextView)findViewById(R.id.date);
180         tvs = (TextView)findViewById(R.id.timestamp);
181         ut = new UpdateTarget[] {
182             new UpdateTarget((TextView)findViewById(R.id.location),  1),
183             new UpdateTarget((TextView)findViewById(R.id.phonecall), 2)
184         };
185         Log.w("WhereAmI", "created UI, about to start update task");
186         mHandler.post(updateClock);
187         mHandler.post(updateCal);
188         mHandler.post(updateInfo);
189         Log.w("WhereAmI", "created UI, update task created");
190     }
191
192     /** Called when put to background */
193     @Override
194     public void onPause()
195     {
196         super.onPause();
197         Log.w("WhereAmI", "calling finish");
198         finish();
199     }
200
201     /** Called when the activity is destroyed. */
202     @Override
203     public void onDestroy()
204     {
205         super.onDestroy();
206         Log.w("WhereAmI", "going down");
207         mHandler.removeCallbacks(updateClock);
208         mHandler.removeCallbacks(updateCal);
209         mHandler.removeCallbacks(updateInfo);
210         //unregisterReceiver(connChanged);
211         boolean wifion = wifiman.setWifiEnabled(false);
212         Log.w("WhereAmI", "disabling wifi result " + wifion);
213     }
214 }