when OrbotMainActivity starts, query TorService for current status

If OrbotMainActivity gets killed while TorService is running, then when
OrbotMainActivity starts again, it needs to get the current status from
TorService to correctly represent things to the user.
This commit is contained in:
Hans-Christoph Steiner 2015-06-17 11:00:48 -04:00
parent f16394b7db
commit e5c2e1a040
3 changed files with 28 additions and 7 deletions

View File

@ -589,7 +589,11 @@ public class OrbotMainActivity extends Activity
}
}
}
else if (action.equals(Intent.ACTION_MAIN))
{
// OrbotMainActivity was restarted after being killed
sendIntentToService(TorServiceConstants.CMD_STATUS);
}
updateStatus("");
setIntent(null);

View File

@ -16,6 +16,7 @@ import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
@ -346,6 +347,9 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
replyWithStatus(mIntent);
startTor();
// stopTor() is called when the Service is destroyed
} else if (action.equals(CMD_STATUS)) {
Intent intent = getActionStatusIntent(mCurrentStatus);
sendBroadcastOnlyToOrbot(intent);
} else if (action.equals(CMD_SIGNAL_HUP)) {
requestTorRereadConfig();
} else if (action.equals(CMD_NEWNYM)) {
@ -1901,20 +1905,32 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
private void sendCallbackStatus(String currentStatus) {
mCurrentStatus = currentStatus;
Intent intent = new Intent(ACTION_STATUS);
intent.putExtra(EXTRA_STATUS, currentStatus);
Intent intent = getActionStatusIntent(currentStatus);
// send for Orbot internals, using secure local broadcast
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
sendBroadcastOnlyToOrbot(intent);
// send for any apps that are interested
sendBroadcast(intent);
}
/**
* Send a secure broadcast only to Orbot itself
* @see {@link ContextWrapper#sendBroadcast(Intent)}
* @see {@link LocalBroadcastManager}
*/
private boolean sendBroadcastOnlyToOrbot(Intent intent) {
return LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
private Intent getActionStatusIntent(String currentStatus) {
Intent intent = new Intent(ACTION_STATUS);
intent.putExtra(EXTRA_STATUS, currentStatus);
return intent;
}
/*
* Another way to do this would be to use the Observer pattern by defining the
* BroadcastReciever in the Android manifest.
*/
private final BroadcastReceiver mNetworkStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {

View File

@ -119,6 +119,7 @@ public interface TorServiceConstants {
// actions for internal command Intents
public static final String CMD_SIGNAL_HUP = "signal_hup";
public static final String CMD_STATUS = "status";
public static final String CMD_FLUSH = "flush";
public static final String CMD_NEWNYM = "newnym";
public static final String CMD_VPN = "vpn";