]> www.average.org Git - WhereAmI.git/blobdiff - src/org/average/whereami/WhereAmI.java
Stay alive unless closed from menu
[WhereAmI.git] / src / org / average / whereami / WhereAmI.java
index 5fdbbedbab4edded45ade82b0620fb4bbc4a8d4a..94aba8fe98e6ed7be488b7a219f20b00d30c85b1 100644 (file)
@@ -1,16 +1,20 @@
 package org.average.whereami;
 
 import org.average.whereami.WhereAmIprefs;
+import org.average.whereami.APIBase;
 import org.average.whereami.Oracle;
 import org.average.whereami.PhoneLog;
 import org.average.whereami.LastLocation;
 
+import java.util.Random;
+
 import android.app.Activity;
 import android.net.wifi.WifiManager;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.AsyncTask;
 import android.os.Handler;
+import android.os.SystemClock;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.content.BroadcastReceiver;
@@ -23,6 +27,7 @@ import android.preference.PreferenceManager;
 import android.text.format.Time;
 import android.util.Log;
 import android.view.View;
+import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
@@ -40,6 +45,9 @@ public class WhereAmI extends Activity
     private Integer runningtasks = 0;
     private SharedPreferences prefs;
     private PersistentStore store;
+    private Random random = new Random();
+    private Boolean revive = false;
+    private Context context;
 
     private class UpdateTarget {
         private TextView tv;
@@ -50,7 +58,16 @@ public class WhereAmI extends Activity
             @Override
             protected String doInBackground(Void... params) {
                 Log.v(TAG, "BgUpdate " + updater + " starting");
-                return updater.getResult();
+               Utterance result = updater.getResult();
+                for (int i = 2; !result.success && i <= 3; i++) {
+                    SystemClock.sleep(1000 + random.nextInt(1000));
+                    result = updater.getResult();
+                }
+                if (!result.success) {
+                    Log.e(TAG, "After third attempt still " +
+                               result.message);
+                }
+                return result.message;
             }
         
             @Override
@@ -101,6 +118,20 @@ public class WhereAmI extends Activity
 
     private Handler mHandler = new Handler();
 
+    private Runnable reviveSelf = new Runnable() {
+        public void run() {
+            Log.v(TAG, "trying to revive self");
+            Intent intent = new Intent(Intent.ACTION_MAIN);
+            intent.addCategory(Intent.CATEGORY_LAUNCHER );
+            intent.setClass(context, WhereAmI.class);
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+            intent.addFlags(Intent.FLAG_FROM_BACKGROUND);
+            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+            startActivity(intent);
+        }
+    };
+
     private Runnable updateClock = new Runnable () {
         public void run() {
             long now = System.currentTimeMillis();
@@ -165,10 +196,11 @@ public class WhereAmI extends Activity
                 for (int i = 0; i < ut.length; i++) {
                     ut[i].cancel();
                 }
+                runningtasks = 0;
                 Time tm = new Time();
                 tm.setToNow();
                 tvs.setText(R.string.failtry);
-                tvs.append(tm.format(" %d/%m/%Y %H:%M:%S"));
+                tvs.append(tm.format(" %d/%m/%Y %H:%M"));
             }
             if (managewifi) {
                 boolean wifion = wifiman.setWifiEnabled(false);
@@ -200,6 +232,7 @@ public class WhereAmI extends Activity
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        context = this;
         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {
             Log.v(TAG, "Disabling keepalive for build version " +
                        Build.VERSION.SDK_INT);
@@ -220,17 +253,13 @@ public class WhereAmI extends Activity
         tvt = (TextView)findViewById(R.id.time);
         tvd = (TextView)findViewById(R.id.date);
         tvs = (TextView)findViewById(R.id.timestamp);
+       APIBase base = new APIBase(res, store);
        ut = new UpdateTarget[] {
             new UpdateTarget((TextView)findViewById(R.id.phonecall),
-                             new PhoneLog(res, store)),
+                             new PhoneLog(base)),
             new UpdateTarget((TextView)findViewById(R.id.location),
-                             new LastLocation(res, store))
+                             new LastLocation(base))
         };
-        Log.v(TAG, "created UI, about to start update task");
-       mHandler.post(updateClock);
-       mHandler.post(updateCal);
-       mHandler.post(updateInfo);
-        Log.v(TAG, "created UI, update task created");
     }
 
     /** Called when reactivated */
@@ -250,6 +279,11 @@ public class WhereAmI extends Activity
         } else {
             getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
         }
+        revive = true;
+       mHandler.post(updateClock);
+       mHandler.post(updateCal);
+       mHandler.post(updateInfo);
+        Log.v(TAG, "update tasks scheduled");
     }
 
     /** Called when put to background */
@@ -257,6 +291,14 @@ public class WhereAmI extends Activity
     public void onPause() {
         super.onPause();
         Log.v(TAG, "going background");
+        resetInfo.run();
+       mHandler.removeCallbacks(updateClock);
+       mHandler.removeCallbacks(updateCal);
+       mHandler.removeCallbacks(updateInfo);
+        if (revive) {
+            Log.v(TAG, "scheduling revival");
+           mHandler.postDelayed(reviveSelf, 6000); // 6 second delay
+        }
     }
 
     /** Called when the activity is destroyed. */
@@ -264,17 +306,6 @@ public class WhereAmI extends Activity
     public void onDestroy() {
         super.onDestroy();
         Log.v(TAG, "going down");
-       mHandler.removeCallbacks(updateClock);
-       mHandler.removeCallbacks(updateCal);
-       mHandler.removeCallbacks(updateInfo);
-        if (connChangedRegistered) {
-            unregisterReceiver(connChanged);
-            connChangedRegistered = false;
-        }
-        if (managewifi) {
-            boolean wifion = wifiman.setWifiEnabled(false);
-            Log.v(TAG, "disabling wifi result " + wifion);
-        }
     }
 
     /** Called when the menu is activated. */
@@ -290,6 +321,7 @@ public class WhereAmI extends Activity
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
         case R.id.quit:
+            revive = false;
             finish();
             return true;
         case R.id.authorize:
@@ -304,4 +336,13 @@ public class WhereAmI extends Activity
             return super.onOptionsItemSelected(item);
         }
     }
+
+    /** Override "back" button. Can still quit via menu. */
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
+            return true;
+        }
+       return super.onKeyDown(keyCode, event);
+    }
 }