import android.app.Activity;
import android.os.Bundle;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.content.res.Resources;
+import android.text.format.Time;
+import android.util.Log;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.TextView;
public class WhereAmI extends Activity
{
+ private class UpdateTarget {
+ public TextView tv;
+ public Integer updater; // will be the function/object
+ public UpdateTarget(TextView tv, Integer updater) {
+ this.tv = tv;
+ this.updater = updater;
+ }
+ }
+ private UpdateTarget[] ut;
+
+ private TextView tvt, tvd, tvs;
+ private Resources res;
+ private String[] month;
+ private String[] wday;
+
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
setContentView(R.layout.main);
+ res = getResources();
+ month = res.getStringArray(R.array.month);
+ wday = res.getStringArray(R.array.wday);
+ tvt = (TextView)findViewById(R.id.time);
+ tvd = (TextView)findViewById(R.id.date);
+ tvs = (TextView)findViewById(R.id.timestamp);
+ ut = new UpdateTarget[] {
+ new UpdateTarget((TextView)findViewById(R.id.location), 1),
+ new UpdateTarget((TextView)findViewById(R.id.phonecall), 2)
+ };
+ Log.v("WhereAmI", "created UI, about to start update task");
+ updateClock.run();
+ updateCal.run();
+ updateInfo.run();
+ Log.v("WhereAmI", "created UI, update task created");
+ }
+
+ private Handler mHandler = new Handler();
+
+ private Runnable updateClock = new Runnable () {
+ public void run() {
+ long now = System.currentTimeMillis();
+ Time tm = new Time();
+ tm.set(now);
+ tvt.setText(tm.format("%H:%M"));
+ tm.set(now + 60000);
+ tm.second=0;
+ long next = tm.toMillis(false);
+ mHandler.postDelayed(this, next-now+1);
+ }
+ };
+
+ private Runnable updateCal = new Runnable () {
+ public void run() {
+ long now = System.currentTimeMillis();
+ Time tm = new Time();
+ tm.set(now);
+ tvd.setText(
+ wday[tm.weekDay] +
+ tm.format("\n%d ") +
+ month[tm.month] +
+ tm.format(" %Y"));
+ tm.set(now + 86400000);
+ tm.hour=0;
+ tm.minute=0;
+ tm.second=0;
+ long next = tm.toMillis(false);
+ mHandler.postDelayed(this, next-now+1);
+ }
+ };
+
+ private Runnable updateInfo = new Runnable () {
+ public void run() {
+ Log.v("updateInfo", "starting");
+ for (int i = 0; i < ut.length; i++) {
+ ut[i].tv.setText(R.string.updating);
+ new TimedUpdateTask().execute(ut[i]);
+ }
+ mHandler.postDelayed(this, 10000);
+ }
+ };
+
+ private class TimedUpdateTask extends AsyncTask<UpdateTarget, Void, String> {
+ private UpdateTarget ut;
+ @Override
+ protected String doInBackground(UpdateTarget... whereto) {
+ Log.v("TimedUpdateTask", "starting");
+ ut = whereto[0];
+ SystemClock.sleep(5000); // real job do be done here
+ Log.v("TimedUpdateTask", "about to return");
+ return "5 seconds passed";
+ }
+
+ @Override
+ protected void onPostExecute(String str) {
+ Log.v("TimedUpdateTask", "callback executing");
+ ut.tv.setText(str);
+ Time tm = new Time();
+ tm.setToNow();
+ tvs.setText(R.string.lasttry);
+ tvs.append(tm.format(" %d/%m/%Y %H:%M:%S"));
+ }
}
}