Set enabled state on service start/stop

This commit is contained in:
M66B 2015-11-04 20:20:30 +01:00
parent 9b0ec8aa17
commit a2f5d8f084
3 changed files with 72 additions and 68 deletions

View File

@ -156,6 +156,7 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
if (running) {
Log.i(TAG, "Start intent=" + prepare);
try {
prefs.edit().putBoolean("enabled", true).apply();
startActivityForResult(prepare, REQUEST_VPN);
} catch (Throwable ex) {
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
@ -176,7 +177,6 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
}
} else {
Log.i(TAG, "Switch off");
prefs.edit().putBoolean("enabled", false).apply();
SinkholeService.stop(ActivityMain.this);
}
}
@ -303,6 +303,63 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
super.onDestroy();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
Log.i(TAG, "onActivityResult request=" + requestCode + " result=" + requestCode + " ok=" + (resultCode == RESULT_OK));
Util.logExtras(TAG, data);
if (requestCode == REQUEST_VPN) {
// Handle VPN approval
if (resultCode == RESULT_OK)
SinkholeService.start(this);
else {
Log.i(TAG, "Dialog cancelled");
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.edit().putBoolean("enabled", false).apply();
}
} else if (requestCode == REQUEST_IAB) {
if (resultCode == RESULT_OK) {
// Handle donation
Intent intent = new Intent(ACTION_IAB);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
} else {
int response = (data == null ? -1 : data.getIntExtra("RESPONSE_CODE", -1));
Log.i(TAG, "IAB response=" + getIABResult(response));
}
} else if (requestCode == REQUEST_EXPORT) {
if (resultCode == RESULT_OK && data != null)
handleExport(data);
} else if (requestCode == REQUEST_IMPORT) {
if (resultCode == RESULT_OK && data != null)
handleImport(data);
} else {
Log.w(TAG, "Unknown activity result request=" + requestCode);
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String name) {
Log.i(TAG, "Preference " + name + "=" + prefs.getAll().get(name));
if ("enabled".equals(name)) {
// Get enabled
boolean enabled = prefs.getBoolean(name, false);
// Display disabled warning
TextView tvDisabled = (TextView) findViewById(R.id.tvDisabled);
tvDisabled.setVisibility(enabled ? View.GONE : View.VISIBLE);
// Check switch state
SwitchCompat swEnabled = (SwitchCompat) getSupportActionBar().getCustomView().findViewById(R.id.swEnabled);
if (swEnabled.isChecked() != enabled)
swEnabled.setChecked(enabled);
}
}
private BroadcastReceiver interactiveStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@ -396,24 +453,6 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
}.execute();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String name) {
Log.i(TAG, "Preference " + name + "=" + prefs.getAll().get(name));
if ("enabled".equals(name)) {
// Get enabled
boolean enabled = prefs.getBoolean(name, false);
// Display disabled warning
TextView tvDisabled = (TextView) findViewById(R.id.tvDisabled);
tvDisabled.setVisibility(enabled ? View.GONE : View.VISIBLE);
// Check switch state
SwitchCompat swEnabled = (SwitchCompat) getSupportActionBar().getCustomView().findViewById(R.id.swEnabled);
if (swEnabled.isChecked() != enabled)
swEnabled.setChecked(enabled);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
@ -668,44 +707,6 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
}.execute();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
Log.i(TAG, "onActivityResult request=" + requestCode + " result=" + requestCode + " ok=" + (resultCode == RESULT_OK));
Util.logExtras(TAG, data);
if (requestCode == REQUEST_VPN) {
// Update enabled state
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.edit().putBoolean("enabled", resultCode == RESULT_OK).apply();
// Start service
if (resultCode == RESULT_OK)
SinkholeService.start(this);
} else if (requestCode == REQUEST_IAB) {
if (resultCode == RESULT_OK) {
// Handle donation
Intent intent = new Intent(ACTION_IAB);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
} else {
int response = (data == null ? -1 : data.getIntExtra("RESPONSE_CODE", -1));
Log.i(TAG, "IAB response=" + getIABResult(response));
}
} else if (requestCode == REQUEST_EXPORT) {
if (resultCode == RESULT_OK && data != null)
handleExport(data);
} else if (requestCode == REQUEST_IMPORT) {
if (resultCode == RESULT_OK && data != null)
handleImport(data);
} else {
Log.w(TAG, "Unknown activity result request=" + requestCode);
super.onActivityResult(requestCode, resultCode, data);
}
}
private void handleExport(final Intent data) {
new AsyncTask<Object, Object, Throwable>() {
@Override

View File

@ -22,7 +22,9 @@ package eu.faircode.netguard;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.VpnService;
import android.preference.PreferenceManager;
import android.util.Log;
public class Receiver extends BroadcastReceiver {
@ -46,8 +48,10 @@ public class Receiver extends BroadcastReceiver {
} else {
// Start service
if (VpnService.prepare(context) == null)
SinkholeService.start(context);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (prefs.getBoolean("enabled", false))
if (VpnService.prepare(context) == null)
SinkholeService.start(context);
}
}
}

View File

@ -57,12 +57,11 @@ public class SinkholeService extends VpnService {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Get enabled
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
final boolean enabled = prefs.getBoolean("enabled", false);
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// Get command
final Command cmd = (intent == null ? Command.start : (Command) intent.getSerializableExtra(EXTRA_COMMAND));
Log.i(TAG, "Start intent=" + intent + " command=" + cmd + " enabled=" + enabled + " vpn=" + (vpn != null));
Log.i(TAG, "Start intent=" + intent + " command=" + cmd + " vpn=" + (vpn != null));
// Process command
new Thread(new Runnable() {
@ -71,22 +70,21 @@ public class SinkholeService extends VpnService {
synchronized (SinkholeService.this) {
switch (cmd) {
case start:
if (enabled && vpn == null) {
if (vpn == null) {
last_roaming = Util.isRoaming(SinkholeService.this);
vpn = startVPN();
startDebug(vpn);
removeDisabledNotification();
prefs.edit().putBoolean("enabled", true).apply();
}
break;
case reload:
// Seamless handover
ParcelFileDescriptor prev = vpn;
if (enabled) {
vpn = startVPN();
stopDebug();
startDebug(vpn);
}
vpn = startVPN();
stopDebug();
startDebug(vpn);
if (prev != null)
stopVPN(prev);
break;
@ -97,6 +95,7 @@ public class SinkholeService extends VpnService {
stopVPN(vpn);
vpn = null;
}
prefs.edit().putBoolean("enabled", false).apply();
stopSelf();
break;
}