]> 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 5a665d1ed02346e3eae46830b3ebf9558eef60dd..94aba8fe98e6ed7be488b7a219f20b00d30c85b1 100644 (file)
@@ -1,7 +1,16 @@
 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;
@@ -13,58 +22,92 @@ import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.Context;
 import android.content.res.Resources;
+import android.content.SharedPreferences;
+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;
 import android.view.Window;
 import android.view.WindowManager;
 import android.widget.TextView;
 
 public class WhereAmI extends Activity
 {
+    final String TAG = getClass().getName();
+
     private WifiManager wifiman;
+    private Boolean managewifi = false;
+    private Long updatedelay = 60000L;
     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;
-        private Integer updater; // will be the function/object
+        private Oracle updater;
         private BgUpdate task;
 
         private class BgUpdate extends AsyncTask<Void, Void, String> {
             @Override
             protected String doInBackground(Void... params) {
-                Log.w("WhereAmI", "BgUpdate " + updater + " starting");
-                SystemClock.sleep(5000); // real job do be done here
-                Log.w("WhereAmI", "BgUpdate about to return");
-                return "5 seconds passed in " + updater;
+                Log.v(TAG, "BgUpdate " + updater + " starting");
+               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
             protected void onPostExecute(String str) {
-                Log.w("WhereAmI", "BgUpdate callback executing");
+                Log.v(TAG, "BgUpdate callback executing");
                 tv.setText(str);
                 runningtasks--;
                 if (runningtasks <= 0) {
-                    boolean wifion = wifiman.setWifiEnabled(false);
-                    Log.w("WhereAmI", "disabling wifi result " + wifion);
+                    if (managewifi) {
+                        boolean wifion = wifiman.setWifiEnabled(false);
+                        Log.v(TAG, "disabling wifi result " + wifion);
+                    }
                     Time tm = new Time();
                     tm.setToNow();
                     tvs.setText(R.string.lasttry);
-                    tvs.append(tm.format(" %d/%m/%Y %H:%M:%S"));
+                    tvs.append(tm.format(" %d/%m/%Y %H:%M"));
                 }
             }
+
+            @Override
+            protected void onCancelled() {
+                Log.v(TAG, "BgUpdate callback cancelled");
+                runningtasks--;
+            }
         }
 
-        public UpdateTarget(TextView tv, Integer updater) {
+        public UpdateTarget(TextView tv, Oracle updater) {
             this.tv = tv;
             this.updater = updater;
-            this.task = new BgUpdate();
         }
 
         public void launch() {
             tv.setText(R.string.updating);
+            task = new BgUpdate();
             task.execute();
         }
+
+        public void cancel() {
+            task.cancel(true);
+        }
     }
     private UpdateTarget[] ut;
 
@@ -75,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();
@@ -109,32 +166,50 @@ public class WhereAmI extends Activity
 
     private Runnable updateInfo = new Runnable () {
         public void run() {
-            Log.w("WhereAmI", "updateInfo starting");
-            IntentFilter intentFilter =
-                new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
-            registerReceiver(connChanged,intentFilter);
-            boolean wifion = wifiman.setWifiEnabled(true);
-            Log.w("WhereAmI", "enabling wifi result " + wifion);
-            mHandler.postDelayed(resetInfo, 30000);
-            mHandler.postDelayed(this, 1200000);
+            Log.v(TAG, "updateInfo starting");
+            if (managewifi) {
+                IntentFilter intentFilter =
+                    new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
+                registerReceiver(connChanged,intentFilter);
+                connChangedRegistered = true;
+                boolean wifion = wifiman.setWifiEnabled(true);
+                Log.v(TAG, "enabling wifi result " + wifion);
+            } else {
+                for (int i = 0; i < ut.length; i++) {
+                    runningtasks++;
+                    ut[i].launch();
+                }
+            }
+            mHandler.postDelayed(resetInfo, 50000);
+            mHandler.postDelayed(this, updatedelay);
         }
     };
 
     private Runnable resetInfo = new Runnable () {
         public void run() {
-            Log.w("WhereAmI", "resetInfo starting");
-            unregisterReceiver(connChanged);
-            boolean wifion = wifiman.setWifiEnabled(false);
-            Log.w("WhereAmI", "disabling wifi result " + wifion);
+            Log.v(TAG, "resetInfo starting");
+            if (connChangedRegistered) {
+                unregisterReceiver(connChanged);
+                connChangedRegistered = false;
+            }
             if (runningtasks > 0) {
+                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);
+                Log.v(TAG, "disabling wifi result " + wifion);
             }
         }
     };
 
+    private boolean connChangedRegistered = false;
     private final BroadcastReceiver connChanged = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -143,7 +218,7 @@ public class WhereAmI extends Activity
             NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
             boolean isConnected = activeNetwork != null &&
                                   activeNetwork.isConnectedOrConnecting();
-            Log.w("WhereAmI", "Connectivity changed to " + isConnected);
+            Log.v(TAG, "Connectivity changed to " + isConnected);
             if (isConnected) {
                 for (int i = 0; i < ut.length; i++) {
                     runningtasks++;
@@ -155,15 +230,22 @@ public class WhereAmI extends Activity
 
     /** Called when the activity is first created. */
     @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
+    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);
+            System.setProperty("http.keepAlive", "false");
+        } else {
+            Log.v(TAG, "Post-Froyo version " +
+                        Build.VERSION.SDK_INT);
+       }
+        prefs = PreferenceManager.getDefaultSharedPreferences(this);
+        store = new PersistentStore(prefs);
         wifiman = (WifiManager)getSystemService(Context.WIFI_SERVICE);
         requestWindowFeature(Window.FEATURE_NO_TITLE);
         getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-        //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);
@@ -171,37 +253,96 @@ 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.location),  1),
-            new UpdateTarget((TextView)findViewById(R.id.phonecall), 2)
+            new UpdateTarget((TextView)findViewById(R.id.phonecall),
+                             new PhoneLog(base)),
+            new UpdateTarget((TextView)findViewById(R.id.location),
+                             new LastLocation(base))
         };
-        Log.w("WhereAmI", "created UI, about to start update task");
+    }
+
+    /** Called when reactivated */
+    @Override
+    public void onResume() {
+        super.onResume();
+        boolean fullscreen = prefs.getBoolean("fullscreen", false);
+        managewifi = prefs.getBoolean("managewifi", false);
+        updatedelay = Long.parseLong(prefs.getString("updateperiod", "1200000"));
+        Log.v("WhereAmI", "fullscreen: " + fullscreen +
+                          ", managewifi: " + managewifi +
+                          ", updatedelay: " + updatedelay);
+        if (fullscreen) {
+            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
+            getWindow().clearFlags(WindowManager.LayoutParams.
+                                                  FLAG_FORCE_NOT_FULLSCREEN);
+        } else {
+            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
+        }
+        revive = true;
        mHandler.post(updateClock);
        mHandler.post(updateCal);
        mHandler.post(updateInfo);
-        Log.w("WhereAmI", "created UI, update task created");
+        Log.v(TAG, "update tasks scheduled");
     }
 
     /** Called when put to background */
     @Override
-    public void onPause()
-    {
+    public void onPause() {
         super.onPause();
-        Log.w("WhereAmI", "calling finish");
-        finish();
+        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. */
     @Override
-    public void onDestroy()
-    {
+    public void onDestroy() {
         super.onDestroy();
-        Log.w("WhereAmI", "going down");
-       mHandler.removeCallbacks(updateClock);
-       mHandler.removeCallbacks(updateCal);
-       mHandler.removeCallbacks(updateInfo);
-        //unregisterReceiver(connChanged);
-        boolean wifion = wifiman.setWifiEnabled(false);
-        Log.w("WhereAmI", "disabling wifi result " + wifion);
+        Log.v(TAG, "going down");
+    }
+
+    /** Called when the menu is activated. */
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.main_menu, menu);
+        return true;
+    }
+
+    /** Called when the menu item is selected */
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+        case R.id.quit:
+            revive = false;
+            finish();
+            return true;
+        case R.id.authorize:
+            Log.v(TAG, "authorize requested");
+            startActivity(new Intent(this, Authorize.class));
+            return true;
+        case R.id.settings:
+            Log.v(TAG, "settings requested");
+            startActivity(new Intent(this, WhereAmIprefs.class));
+            return true;
+        default:
+            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);
     }
 }