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