mirror of
https://github.com/M66B/NetGuard.git
synced 2025-02-22 14:21:01 +00:00
Serialize start intents
Kindly borrowed from IntentService: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/IntentService.java
This commit is contained in:
parent
c3514d69df
commit
5bbfd89f02
1 changed files with 78 additions and 54 deletions
|
@ -29,6 +29,10 @@ import android.content.SharedPreferences;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.net.VpnService;
|
import android.net.VpnService;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.HandlerThread;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.os.Message;
|
||||||
import android.os.ParcelFileDescriptor;
|
import android.os.ParcelFileDescriptor;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.support.v4.app.NotificationCompat;
|
import android.support.v4.app.NotificationCompat;
|
||||||
|
@ -52,6 +56,9 @@ public class SinkholeService extends VpnService {
|
||||||
private boolean debug = false;
|
private boolean debug = false;
|
||||||
private Thread thread = null;
|
private Thread thread = null;
|
||||||
|
|
||||||
|
private volatile Looper mServiceLooper;
|
||||||
|
private volatile ServiceHandler mServiceHandler;
|
||||||
|
|
||||||
private static final int NOTIFY_FOREGROUND = 1;
|
private static final int NOTIFY_FOREGROUND = 1;
|
||||||
private static final int NOTIFY_DISABLED = 2;
|
private static final int NOTIFY_DISABLED = 2;
|
||||||
|
|
||||||
|
@ -59,64 +66,58 @@ public class SinkholeService extends VpnService {
|
||||||
|
|
||||||
private enum Command {start, reload, stop}
|
private enum Command {start, reload, stop}
|
||||||
|
|
||||||
@Override
|
private final class ServiceHandler extends Handler {
|
||||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
public ServiceHandler(Looper looper) {
|
||||||
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
super(looper);
|
||||||
|
}
|
||||||
|
|
||||||
// Get command
|
@Override
|
||||||
final Command cmd = (intent == null ? Command.start : (Command) intent.getSerializableExtra(EXTRA_COMMAND));
|
public void handleMessage(Message msg) {
|
||||||
Log.i(TAG, "Start intent=" + intent + " command=" + cmd + " vpn=" + (vpn != null));
|
Intent intent = (Intent) msg.obj;
|
||||||
|
Command cmd = (intent == null ? Command.start : (Command) intent.getSerializableExtra(EXTRA_COMMAND));
|
||||||
|
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(SinkholeService.this);
|
||||||
|
|
||||||
// Process command
|
Log.i(TAG, "Executing command=" + cmd + " vpn=" + (vpn != null));
|
||||||
new Thread(new Runnable() {
|
switch (cmd) {
|
||||||
@Override
|
case start:
|
||||||
public void run() {
|
if (prefs.getBoolean("foreground", false)) {
|
||||||
synchronized (SinkholeService.this) {
|
foreground = true;
|
||||||
Log.i(TAG, "Executing command=" + cmd + " vpn=" + (vpn != null));
|
startForeground(NOTIFY_FOREGROUND, getForegroundNotification());
|
||||||
switch (cmd) {
|
|
||||||
case start:
|
|
||||||
if (prefs.getBoolean("foreground", false)) {
|
|
||||||
foreground = true;
|
|
||||||
startForeground(NOTIFY_FOREGROUND, getForegroundNotification());
|
|
||||||
}
|
|
||||||
if (vpn == null) {
|
|
||||||
last_roaming = Util.isRoaming(SinkholeService.this);
|
|
||||||
vpn = startVPN();
|
|
||||||
startDebug(vpn);
|
|
||||||
}
|
|
||||||
removeDisabledNotification();
|
|
||||||
Widget.updateWidgets(SinkholeService.this);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case reload:
|
|
||||||
// Seamless handover
|
|
||||||
ParcelFileDescriptor prev = vpn;
|
|
||||||
vpn = startVPN();
|
|
||||||
stopDebug();
|
|
||||||
startDebug(vpn);
|
|
||||||
if (prev != null)
|
|
||||||
stopVPN(prev);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case stop:
|
|
||||||
if (vpn != null) {
|
|
||||||
stopDebug();
|
|
||||||
stopVPN(vpn);
|
|
||||||
vpn = null;
|
|
||||||
}
|
|
||||||
if (foreground) {
|
|
||||||
foreground = false;
|
|
||||||
stopForeground(true);
|
|
||||||
}
|
|
||||||
Widget.updateWidgets(SinkholeService.this);
|
|
||||||
stopSelf();
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
if (vpn == null) {
|
||||||
}
|
last_roaming = Util.isRoaming(SinkholeService.this);
|
||||||
}).start();
|
vpn = startVPN();
|
||||||
|
startDebug(vpn);
|
||||||
|
}
|
||||||
|
removeDisabledNotification();
|
||||||
|
Widget.updateWidgets(SinkholeService.this);
|
||||||
|
break;
|
||||||
|
|
||||||
return START_STICKY;
|
case reload:
|
||||||
|
// Seamless handover
|
||||||
|
ParcelFileDescriptor prev = vpn;
|
||||||
|
vpn = startVPN();
|
||||||
|
stopDebug();
|
||||||
|
startDebug(vpn);
|
||||||
|
if (prev != null)
|
||||||
|
stopVPN(prev);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case stop:
|
||||||
|
if (vpn != null) {
|
||||||
|
stopDebug();
|
||||||
|
stopVPN(vpn);
|
||||||
|
vpn = null;
|
||||||
|
}
|
||||||
|
if (foreground) {
|
||||||
|
foreground = false;
|
||||||
|
stopForeground(true);
|
||||||
|
}
|
||||||
|
Widget.updateWidgets(SinkholeService.this);
|
||||||
|
stopSelf();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ParcelFileDescriptor startVPN() {
|
private ParcelFileDescriptor startVPN() {
|
||||||
|
@ -300,6 +301,12 @@ public class SinkholeService extends VpnService {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
Log.i(TAG, "Create");
|
Log.i(TAG, "Create");
|
||||||
|
|
||||||
|
HandlerThread thread = new HandlerThread(getString(R.string.app_name));
|
||||||
|
thread.start();
|
||||||
|
|
||||||
|
mServiceLooper = thread.getLooper();
|
||||||
|
mServiceHandler = new ServiceHandler(mServiceLooper);
|
||||||
|
|
||||||
// Listen for interactive state changes
|
// Listen for interactive state changes
|
||||||
IntentFilter ifInteractive = new IntentFilter();
|
IntentFilter ifInteractive = new IntentFilter();
|
||||||
ifInteractive.addAction(Intent.ACTION_SCREEN_ON);
|
ifInteractive.addAction(Intent.ACTION_SCREEN_ON);
|
||||||
|
@ -318,6 +325,21 @@ public class SinkholeService extends VpnService {
|
||||||
registerReceiver(packageAddedReceiver, ifPackage);
|
registerReceiver(packageAddedReceiver, ifPackage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
|
// Get command
|
||||||
|
final Command cmd = (intent == null ? Command.start : (Command) intent.getSerializableExtra(EXTRA_COMMAND));
|
||||||
|
Log.i(TAG, "Start intent=" + intent + " command=" + cmd + " vpn=" + (vpn != null));
|
||||||
|
|
||||||
|
// Queue command
|
||||||
|
Message msg = mServiceHandler.obtainMessage();
|
||||||
|
msg.arg1 = startId;
|
||||||
|
msg.obj = intent;
|
||||||
|
mServiceHandler.sendMessage(msg);
|
||||||
|
|
||||||
|
return START_STICKY;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
Log.i(TAG, "Destroy");
|
Log.i(TAG, "Destroy");
|
||||||
|
@ -332,6 +354,8 @@ public class SinkholeService extends VpnService {
|
||||||
unregisterReceiver(connectivityChangedReceiver);
|
unregisterReceiver(connectivityChangedReceiver);
|
||||||
unregisterReceiver(packageAddedReceiver);
|
unregisterReceiver(packageAddedReceiver);
|
||||||
|
|
||||||
|
mServiceLooper.quit();
|
||||||
|
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue