]> www.average.org Git - WhereAmI.git/blobdiff - src/org/average/whereami/WhereAmI.java
guard against leaving or double-unregistering the broadcast receiver
[WhereAmI.git] / src / org / average / whereami / WhereAmI.java
index 9d012c35997d4f4b11d625b678b0879ca3ce1e1a..f3de41799e734b28e410bb6fa99bf8f39b91cd8b 100644 (file)
@@ -16,6 +16,9 @@ import android.content.res.Resources;
 import android.text.format.Time;
 import android.util.Log;
 import android.view.View;
 import android.text.format.Time;
 import android.util.Log;
 import android.view.View;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 import android.view.Window;
 import android.view.WindowManager;
 import android.widget.TextView;
 import android.view.Window;
 import android.view.WindowManager;
 import android.widget.TextView;
@@ -26,11 +29,54 @@ public class WhereAmI extends Activity
     private Integer runningtasks = 0;
 
     private class UpdateTarget {
     private Integer runningtasks = 0;
 
     private class UpdateTarget {
-        public TextView tv;
-        public Integer updater; // will be the function/object
+        private TextView tv;
+        private Integer updater; // will be the function/object
+        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;
+            }
+        
+            @Override
+            protected void onPostExecute(String str) {
+                Log.w("WhereAmI", "BgUpdate callback executing");
+                tv.setText(str);
+                runningtasks--;
+                if (runningtasks <= 0) {
+                    boolean wifion = wifiman.setWifiEnabled(false);
+                    Log.w("WhereAmI", "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"));
+                }
+            }
+
+            @Override
+            protected void onCancelled() {
+                Log.w("WhereAmI", "BgUpdate callback cancelled");
+                runningtasks--;
+            }
+        }
+
         public UpdateTarget(TextView tv, Integer updater) {
         public UpdateTarget(TextView tv, Integer updater) {
-           this.tv = tv;
-           this.updater = updater;
+            this.tv = tv;
+            this.updater = updater;
+        }
+
+        public void launch() {
+            tv.setText(R.string.updating);
+            task = new BgUpdate();
+            task.execute();
+        }
+
+        public void cancel() {
+            task.cancel(true);
         }
     }
     private UpdateTarget[] ut;
         }
     }
     private UpdateTarget[] ut;
@@ -80,6 +126,7 @@ public class WhereAmI extends Activity
             IntentFilter intentFilter =
                 new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
             registerReceiver(connChanged,intentFilter);
             IntentFilter intentFilter =
                 new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
             registerReceiver(connChanged,intentFilter);
+            connChangedRegistered = true;
             boolean wifion = wifiman.setWifiEnabled(true);
             Log.w("WhereAmI", "enabling wifi result " + wifion);
             mHandler.postDelayed(resetInfo, 30000);
             boolean wifion = wifiman.setWifiEnabled(true);
             Log.w("WhereAmI", "enabling wifi result " + wifion);
             mHandler.postDelayed(resetInfo, 30000);
@@ -90,18 +137,25 @@ public class WhereAmI extends Activity
     private Runnable resetInfo = new Runnable () {
         public void run() {
             Log.w("WhereAmI", "resetInfo starting");
     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);
+            if (connChangedRegistered) {
+                unregisterReceiver(connChanged);
+                connChangedRegistered = false;
+            }
             if (runningtasks > 0) {
             if (runningtasks > 0) {
+                for (int i = 0; i < ut.length; i++) {
+                    ut[i].cancel();
+                }
                 Time tm = new Time();
                 tm.setToNow();
                 tvs.setText(R.string.failtry);
                 tvs.append(tm.format(" %d/%m/%Y %H:%M:%S"));
             }
                 Time tm = new Time();
                 tm.setToNow();
                 tvs.setText(R.string.failtry);
                 tvs.append(tm.format(" %d/%m/%Y %H:%M:%S"));
             }
+            boolean wifion = wifiman.setWifiEnabled(false);
+            Log.w("WhereAmI", "disabling wifi result " + wifion);
         }
     };
 
         }
     };
 
+    private boolean connChangedRegistered = false;
     private final BroadcastReceiver connChanged = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
     private final BroadcastReceiver connChanged = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -114,40 +168,12 @@ public class WhereAmI extends Activity
             if (isConnected) {
                 for (int i = 0; i < ut.length; i++) {
                     runningtasks++;
             if (isConnected) {
                 for (int i = 0; i < ut.length; i++) {
                     runningtasks++;
-                    ut[i].tv.setText(R.string.updating);
-                    new BgUpdate().execute(ut[i]);
+                    ut[i].launch();
                 }
             }
         }
     };
 
                 }
             }
         }
     };
 
-    private class BgUpdate extends AsyncTask<UpdateTarget, Void, String> {
-        private UpdateTarget ut;
-       @Override
-        protected String doInBackground(UpdateTarget... whereto) {
-            Log.w("WhereAmI", "BgUpdate starting");
-            ut = whereto[0];
-            SystemClock.sleep(5000); // real job do be done here
-            Log.w("WhereAmI", "BgUpdate about to return");
-            return "5 seconds passed";
-        }
-    
-       @Override
-        protected void onPostExecute(String str) {
-            Log.w("WhereAmI", "BgUpdate callback executing");
-            ut.tv.setText(str);
-            runningtasks--;
-            if (runningtasks <= 0) {
-                boolean wifion = wifiman.setWifiEnabled(false);
-                Log.w("WhereAmI", "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"));
-            }
-        }
-    }
-
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState)
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState)
@@ -182,8 +208,7 @@ public class WhereAmI extends Activity
     public void onPause()
     {
         super.onPause();
     public void onPause()
     {
         super.onPause();
-        Log.w("WhereAmI", "calling finish");
-        this.finish();
+        Log.w("WhereAmI", "going background");
     }
 
     /** Called when the activity is destroyed. */
     }
 
     /** Called when the activity is destroyed. */
@@ -195,8 +220,34 @@ public class WhereAmI extends Activity
        mHandler.removeCallbacks(updateClock);
        mHandler.removeCallbacks(updateCal);
        mHandler.removeCallbacks(updateInfo);
        mHandler.removeCallbacks(updateClock);
        mHandler.removeCallbacks(updateCal);
        mHandler.removeCallbacks(updateInfo);
-        //unregisterReceiver(connChanged);
+        if (connChangedRegistered) {
+            unregisterReceiver(connChanged);
+            connChangedRegistered = false;
+        }
         boolean wifion = wifiman.setWifiEnabled(false);
         Log.w("WhereAmI", "disabling wifi result " + wifion);
     }
         boolean wifion = wifiman.setWifiEnabled(false);
         Log.w("WhereAmI", "disabling wifi result " + wifion);
     }
+
+    /** 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:
+            finish();
+            return true;
+        case R.id.settings:
+            Log.w("WhereAmI", "settings requested");
+            return true;
+        default:
+            return super.onOptionsItemSelected(item);
+        }
+    }
 }
 }