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;
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;
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;
@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
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();
for (int i = 0; i < ut.length; i++) {
ut[i].cancel();
}
+ runningtasks = 0;
Time tm = new Time();
tm.setToNow();
tvs.setText(R.string.failtry);
@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);
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(base)),
+ new UpdateTarget((TextView)findViewById(R.id.location),
+ new LastLocation(base))
+ };
}
/** Called when reactivated */
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
- ut = new UpdateTarget[] {
- new UpdateTarget((TextView)findViewById(R.id.phonecall),
- new PhoneLog(res, store)),
- new UpdateTarget((TextView)findViewById(R.id.location),
- new LastLocation(res, store))
- };
- Log.v(TAG, "created UI, about to start update tasks");
+ revive = true;
mHandler.post(updateClock);
mHandler.post(updateCal);
mHandler.post(updateInfo);
- Log.v(TAG, "created UI, update tasks created");
+ Log.v(TAG, "update tasks scheduled");
}
/** Called when put to background */
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. */
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. */
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.quit:
+ revive = false;
finish();
return true;
case R.id.authorize:
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);
+ }
}