X-Git-Url: http://www.average.org/gitweb/?p=WhereAmI.git;a=blobdiff_plain;f=src%2Forg%2Faverage%2Fwhereami%2FWhereAmI.java;h=2fed78cbbada79d093932cee1959f7943ea85fa0;hp=0f193cd71d3a13d8047f3ee6108c165ac034e45a;hb=c2cc66c629a5f00dc8b59a03be14cf346f075e52;hpb=0d7962e1af14f0264b93d733f0ffff93082c9eab diff --git a/src/org/average/whereami/WhereAmI.java b/src/org/average/whereami/WhereAmI.java index 0f193cd..2fed78c 100644 --- a/src/org/average/whereami/WhereAmI.java +++ b/src/org/average/whereami/WhereAmI.java @@ -1,26 +1,91 @@ package org.average.whereami; +import org.average.whereami.WhereAmIprefs; +import org.average.whereami.Oracle; +import org.average.whereami.PhoneLog; +import org.average.whereami.Location; + import android.app.Activity; +import android.net.wifi.WifiManager; 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; +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.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 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 TextView tv; + private Oracle updater; + private BgUpdate task; + + private class BgUpdate extends AsyncTask { + @Override + protected String doInBackground(Void... params) { + Log.w(TAG, "BgUpdate " + updater + " starting"); + return updater.getResult(); + } + + @Override + protected void onPostExecute(String str) { + Log.w(TAG, "BgUpdate callback executing"); + tv.setText(str); + runningtasks--; + if (runningtasks <= 0) { + boolean wifion = wifiman.setWifiEnabled(false); + Log.w(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")); + } + } + + @Override + protected void onCancelled() { + Log.w(TAG, "BgUpdate callback cancelled"); + runningtasks--; + } + } + + public UpdateTarget(TextView tv, Oracle 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; @@ -30,32 +95,6 @@ public class WhereAmI extends Activity 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 () { @@ -92,34 +131,162 @@ public class WhereAmI extends Activity 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]); + Log.w(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.w(TAG, "enabling wifi result " + wifion); + } else { + for (int i = 0; i < ut.length; i++) { + runningtasks++; + ut[i].launch(); + } } - mHandler.postDelayed(this, 10000); + mHandler.postDelayed(resetInfo, 50000); + mHandler.postDelayed(this, updatedelay); } }; - private class TimedUpdateTask extends AsyncTask { - 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"; + private Runnable resetInfo = new Runnable () { + public void run() { + Log.w(TAG, "resetInfo starting"); + if (connChangedRegistered) { + unregisterReceiver(connChanged); + connChangedRegistered = false; + } + 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")); + } + if (managewifi) { + boolean wifion = wifiman.setWifiEnabled(false); + Log.w(TAG, "disabling wifi result " + wifion); + } } - - @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")); + }; + + private boolean connChangedRegistered = false; + private final BroadcastReceiver connChanged = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + ConnectivityManager cm = (ConnectivityManager)context. + getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); + boolean isConnected = activeNetwork != null && + activeNetwork.isConnectedOrConnecting(); + Log.w(TAG, "Connectivity changed to " + isConnected); + if (isConnected) { + for (int i = 0; i < ut.length; i++) { + runningtasks++; + ut[i].launch(); + } + } + } + }; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + wifiman = (WifiManager)getSystemService(Context.WIFI_SERVICE); + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + 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), + new PhoneLog()), + new UpdateTarget((TextView)findViewById(R.id.phonecall), + new Location()) + }; + Log.w(TAG, "created UI, about to start update task"); + mHandler.post(updateClock); + mHandler.post(updateCal); + mHandler.post(updateInfo); + Log.w(TAG, "created UI, update task created"); + } + + /** Called when reactivated */ + @Override + public void onResume() { + super.onResume(); + prefs = PreferenceManager.getDefaultSharedPreferences(this); + boolean fullscreen = prefs.getBoolean("fullscreen", false); + managewifi = prefs.getBoolean("managewifi", false); + updatedelay = Long.parseLong(prefs.getString("updateperiod", "1200000")); + Log.w("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); + } + } + + /** Called when put to background */ + @Override + public void onPause() { + super.onPause(); + Log.w(TAG, "going background"); + } + + /** Called when the activity is destroyed. */ + @Override + public void onDestroy() { + super.onDestroy(); + Log.w(TAG, "going down"); + mHandler.removeCallbacks(updateClock); + mHandler.removeCallbacks(updateCal); + mHandler.removeCallbacks(updateInfo); + if (connChangedRegistered) { + unregisterReceiver(connChanged); + connChangedRegistered = false; + } + boolean wifion = wifiman.setWifiEnabled(false); + Log.w(TAG, "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.authorize: + Log.w(TAG, "authorize requested"); + startActivity(new Intent(this, Authorize.class)); + return true; + case R.id.settings: + Log.w(TAG, "settings requested"); + startActivity(new Intent(this, WhereAmIprefs.class)); + return true; + default: + return super.onOptionsItemSelected(item); } } }